博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 自定义ScrollView(具有反弹效果的ScrollView,能够兼容横向的滑动)
阅读量:6348 次
发布时间:2019-06-22

本文共 4024 字,大约阅读时间需要 13 分钟。

package com.itau.jingdong.widgets;import android.content.Context;import android.graphics.Rect;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;import android.view.animation.TranslateAnimation;import android.widget.ScrollView;/**  @description 具有反弹效果的ScrollView,能够兼容横向的滑动*/public class AbScrollView extends ScrollView {    private View inner; // 孩子View    private static final int DEFAULT_POSITION = -1;    private float y = DEFAULT_POSITION;// 点击时y的坐标    private Rect normal = new Rect();    // 滑动距离及坐标    private float xDistance, yDistance, xLast, yLast;    public AbScrollView(Context context, AttributeSet attrs) {        super(context, attrs);    }    /**     * 根据XML生成视图工作完成,该函数在生成视图的最后调用,在所有子视图添加完成之后, 即使子类覆盖了onFinishInflate     * 方法,也应该调用父类的方法, 使得该方法得以执行     */    @Override    protected void onFinishInflate() {        if (getChildCount() > 0) {            inner = getChildAt(0);        }    }    @Override    public boolean onTouchEvent(MotionEvent ev) {        if (inner == null) {            return super.onTouchEvent(ev);        } else {            commOnTouchEvent(ev);        }        return super.onTouchEvent(ev);    }    public void commOnTouchEvent(MotionEvent ev) {        int action = ev.getAction();        switch (action) {        case MotionEvent.ACTION_DOWN:            y = ev.getY();            break;        case MotionEvent.ACTION_UP:            if (isNeedAnimation()) {                animation();            }            y = DEFAULT_POSITION;            break;        /**         * 排除第一次移动计算,因为第一次无法得知y左边,在MotionEvent.ACTION_DOWN中获取不到,         * 因为此时是MyScrollView的Tocuh时间传递到了ListView的孩子item上面。所以从第二次开始计算         * 然而我们也要进行初始化,就是第一次移动的时候让滑动距离归零,之后记录准确了就正常执行         */        case MotionEvent.ACTION_MOVE:            float preY = y;            float nowY = ev.getY();            if (isDefaultPosition(y)) {                preY = nowY;            }            int deltaY = (int) (preY - nowY);            scrollBy(0, deltaY);            y = nowY;            // 当滚动到最上或者最下时就不会再滚动,这时移动布局            if (isNeedMove()) {                if (normal.isEmpty()) {                    // 保存正常的布局位置                    normal.set(inner.getLeft(), inner.getTop(),                            inner.getRight(), inner.getBottom());                }                // 移动布局                inner.layout(inner.getLeft(), inner.getTop() - deltaY,                        inner.getRight(), inner.getBottom() - deltaY);            }            break;        default:            break;        }    }    // 开启动画移动    public void animation() {        // 开启移动动画        TranslateAnimation ta = new TranslateAnimation(0, 0, inner.getTop(),                normal.top);        ta.setDuration(200);        inner.startAnimation(ta);        // 设置回到正常的布局位置        inner.layout(normal.left, normal.top, normal.right, normal.bottom);        normal.setEmpty();    }    // 是否需要开启动画    public boolean isNeedAnimation() {        return !normal.isEmpty();    }    // 是否需要移动布局    public boolean isNeedMove() {        int offset = inner.getMeasuredHeight() - getHeight();        int scrollY = getScrollY();        if (scrollY == 0 || scrollY == offset) {            return true;        }        return false;    }    // 检查是否处于默认位置    private boolean isDefaultPosition(float position) {        return position == DEFAULT_POSITION;    }    @Override    public boolean onInterceptTouchEvent(MotionEvent ev) {        switch (ev.getAction()) {        case MotionEvent.ACTION_DOWN:            xDistance = yDistance = 0f;            xLast = ev.getX();            yLast = ev.getY();            break;        case MotionEvent.ACTION_MOVE:            final float curX = ev.getX();            final float curY = ev.getY();            xDistance += Math.abs(curX - xLast);            yDistance += Math.abs(curY - yLast);            xLast = curX;            yLast = curY;            if (xDistance > yDistance) {                return false;            }        }        return super.onInterceptTouchEvent(ev);    }}

 

转载地址:http://trpla.baihongyu.com/

你可能感兴趣的文章
TX Text Control文字处理教程(3)打印操作
查看>>
CENTOS 7 如何修改IP地址为静态!
查看>>
MyCat分片算法学习(纯转)
查看>>
IO Foundation 3 -文件解析器 FileParser
查看>>
linux学习经验之谈
查看>>
mysqld_multi实现多主一从复制
查看>>
中介模式
查看>>
JS中将变量转为字符串
查看>>
servlet笔记
查看>>
JVM(五)垃圾回收器的前世今生
查看>>
CentOS 7 下安装 Nginx
查看>>
Spring Boot 自动配置之@EnableAutoConfiguration
查看>>
web前端笔记
查看>>
import 路径
查看>>
使用optimizely做A/B测试
查看>>
finally知识讲解
查看>>
Matplotlib绘图与可视化
查看>>
openstack ocata版(脚本)控制节点安装
查看>>
【微信公众号开发】获取并保存access_token、jsapi_ticket票据(可用于微信分享、语音识别等等)...
查看>>
datatable 获取最大值
查看>>