RefreshScrollviewLayout下嵌套ViewPager横向滑动冲突解决

来源:互联网 发布:软件注册赚钱靠谱吗 编辑:程序博客网 时间:2024/05/22 13:14

最近做的有个项目,主要是轮播图这部分,RefreshScrollviewLayout下嵌套viewpager ,在滑动轮播图的时候,发现如果横向滑动稍微有点斜的话,就会触动RefreshScrollviewLayout的下拉刷新。这肯定是事件传递的问题,
http://blog.csdn.net/gdutxiaoxu/article/details/52939127
http://www.2cto.com/kf/201705/637673.html


通过这两篇文章解决的问题:
重写SwipeRefreshLayout(出于google):

import android.content.Context;
import android.support.v4.widget.SwipeRefreshLayout;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.ViewConfiguration;
 
/**
 * Created by admin on 2017/5/5.
 */
 
public class MySwipeRefreshLayout extendsSwipeRefreshLayout {
    privatefloat startY;
    privatefloat startX;
    // 记录viewPager是否拖拽的标记
    privateboolean mIsVpDragger;
    privatefinal int mTouchSlop;
 
    publicMySwipeRefreshLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
    }
 
    @Override
    publicboolean onInterceptTouchEvent(MotionEvent ev) {
        intaction = ev.getAction();
        switch(action) {
            caseMotionEvent.ACTION_DOWN:
                // 记录手指按下的位置
                startY = ev.getY();
                startX = ev.getX();
                // 初始化标记
                mIsVpDragger =false;
                break;
            caseMotionEvent.ACTION_MOVE:
                // 如果viewpager正在拖拽中,那么不拦截它的事件,直接return false;
                if(mIsVpDragger) {
                    returnfalse;
                }
 
                // 获取当前手指位置
                floatendY = ev.getY();
                floatendX = ev.getX();
                floatdistanceX = Math.abs(endX - startX);
                floatdistanceY = Math.abs(endY - startY);
                // 如果X轴位移大于Y轴位移,那么将事件交给viewPager处理。
                if(distanceX > mTouchSlop && distanceX > distanceY) {
                    mIsVpDragger =true;
                    returnfalse;
                }
                break;
            caseMotionEvent.ACTION_UP:
            caseMotionEvent.ACTION_CANCEL:
                // 初始化标记
                mIsVpDragger =false;
                break;
        }
        // 如果是Y轴位移大于X轴,事件交给swipeRefreshLayout处理。
        returnsuper.onInterceptTouchEvent(ev);
    }
}
重写ScrollView(出于google):
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.ScrollView;
 
/**
 * Created by admin on 2017/5/5.
 */
 
public class VerticalScrollView extendsScrollView {
    privatefloat xDistance, yDistance, lastX, lastY;
 
    publicVerticalScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
 
    @Override
    publicboolean onInterceptTouchEvent(MotionEvent ev) {
        switch(ev.getAction()) {
            caseMotionEvent.ACTION_DOWN:
                xDistance = yDistance = 0f;
                lastX = ev.getX();
                lastY = ev.getY();
                break;
            caseMotionEvent.ACTION_MOVE:
                finalfloat curX = ev.getX();
                finalfloat curY = ev.getY();
                xDistance += Math.abs(curX - lastX);
                yDistance += Math.abs(curY - lastY);
                lastX = curX;
                lastY = curY;
                if(xDistance > yDistance)
                    returnfalse;
        }
 
        returnsuper.onInterceptTouchEvent(ev);
    }
}

阅读全文
1 0
原创粉丝点击