viewpager和SwipeRefreshLayout下拉刷新冲突解决

来源:互联网 发布:游戏键盘 知乎 编辑:程序博客网 时间:2024/04/23 18:54

重写SwipeRefreshLayout的onIntercept方法就可以很简单的解决了。
思路:
1. 因为下拉刷新,只有纵向滑动的时候才有效,那么我们就判断此时是纵向滑动还是横向滑动就可以了。
2. 纵向滑动就拦截事件,横向滑动不拦截。
3. 怎么判断是纵向滑动还是横向滑动,只要判断Y轴的移动距离大于X轴的移动距离那么就判定为纵向滑动就行了。

以下就是重写后的SwipeRefreshLayout,直接复制到项目就可以使用了。

/**
* Created by AItsuki on 2016/1/20.
*/
public class VpSwipeRefreshLayout extends SwipeRefreshLayout {

private float startY;private float startX;// 记录viewPager是否拖拽的标记private boolean mIsVpDragger;private final int mTouchSlop;public VpSwipeRefreshLayout(Context context, AttributeSet attrs) {    super(context, attrs);    mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();}@Overridepublic boolean onInterceptTouchEvent(MotionEvent ev) {    int action = ev.getAction();    switch (action) {        case MotionEvent.ACTION_DOWN:            // 记录手指按下的位置            startY = ev.getY();            startX = ev.getX();            // 初始化标记            mIsVpDragger = false;            break;        case MotionEvent.ACTION_MOVE:            // 如果viewpager正在拖拽中,那么不拦截它的事件,直接return false;            if(mIsVpDragger) {                return false;            }            // 获取当前手指位置            float endY = ev.getY();            float endX = ev.getX();            float distanceX = Math.abs(endX - startX);            float distanceY = Math.abs(endY - startY);            // 如果X轴位移大于Y轴位移,那么将事件交给viewPager处理。            if(distanceX > mTouchSlop && distanceX > distanceY) {                mIsVpDragger = true;                return false;            }            break;        case MotionEvent.ACTION_UP:        case MotionEvent.ACTION_CANCEL:            // 初始化标记            mIsVpDragger = false;            break;    }    // 如果是Y轴位移大于X轴,事件交给swipeRefreshLayout处理。    return super.onInterceptTouchEvent(ev);}

}

我这里只是贴出来解决方法,原文博主为我们分析了很多源码,大家可以去学习一下,我们一起进步!链接地址如下:
http://blog.csdn.net/u010386612/article/details/50548977#bottom

0 0
原创粉丝点击