您的位置:首页 > 移动开发 > Android开发

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

2016-02-16 17:55 736 查看

下拉刷新是我们软件中必不可少的一个功能,这也可以给用户带来非常好的用户体验,所以谷歌官方也出了下拉刷新控件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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: