Android中SwipeRefreshLayout和ViewPager左右滑动冲突的原因以及正确的解决方法

来源:互联网 发布:linux与网银 编辑:程序博客网 时间:2024/05/13 15:42

下拉刷新是我们软件中必不可少的一个功能,这也可以给用户带来非常好的用户体验,所以谷歌官方也出了下拉刷新控件SwipeRefreshLayout,但是我们使用谷歌官方的SwipeRefreshLayout的时候会发现,SwipeRefreshLayout会和ViewPager滑动有冲突,查阅了一些资料,发现SwipeRefreshLayout对X轴容差值特别小,所以左右滑动其他控件的时候SwipeRefreshLayout就会与其他控件的事件产生冲突,说了那么多,我就来教教大家怎么来解决这个问题;

重写SwipeRefreshLayout的onIntercept方法,判断用户是横向滑动还是纵向滑动,如果是横向滑动自己不处理事件,交给其他控件,如果是纵向滑动就拦截事件,自己处理;

public class SwipeRefreshLayoutCompat extends SwipeRefreshLayout {    // 是否存在左右滑动事件    private boolean mDragger;    // 记录手指按下的位置    private float mStartY, mStartX;    // 出发事件的最短距离    private int mTouchSlop;    public SwipeRefreshLayoutCompat(Context context, AttributeSet attrs) {        super(context, attrs);        mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();    }    @Override    public boolean onInterceptTouchEvent(MotionEvent ev) {        int action = ev.getAction();        switch (action) {        case MotionEvent.ACTION_DOWN:            // 记录手指按下的位置            mStartY = ev.getY();            mStartX = ev.getX();            //初始化左右滑动事件为false            mDragger = false;            break;        case MotionEvent.ACTION_MOVE:            //如果左右滑动事件为true  直接返回false 不拦截事件            if (mDragger) {                return false;            }            // 获取当前手指位置            float endY = ev.getY();            float endX = ev.getX();            //获取X,Y滑动距离的绝对值            float distanceX = Math.abs(endX - mStartX);            float distanceY = Math.abs(endY - mStartY);            // 如果X轴位移大于Y轴距离,那么将事件交给其他控件            if (distanceX > mTouchSlop && distanceX > distanceY) {                mDragger = true;                return false;            }            break;        case MotionEvent.ACTION_UP:        case MotionEvent.ACTION_CANCEL:            //初始化左右滑动事件为false            mDragger = false;            break;        }        return super.onInterceptTouchEvent(ev);    }}
1 0
原创粉丝点击