MVCHelper icon indicating copy to clipboard operation
MVCHelper copied to clipboard

发现一个小bug

Open changshuai7 opened this issue 7 years ago • 4 comments

首先感谢作者的辛苦和优秀的架构。 在使用过程中发现一个小问题。利用MVCHelper实现下拉刷新的时候,处理下拉的这个触摸事件不是根据手指触摸的x轴距离和y轴距离来处理的(即:手指触摸x轴移动的距离>y轴移动的距离,不执行下拉。x轴移动的距离<y轴移动的距离,那么就执行下拉。)。而您的项目里,是只要在y轴方向有触摸距离,则整体页面下拉。 那么这样导致的问题是,如果当前页面有轮播图,我在轮播图上滑动,滑动的时候,只要在y轴方向上有触摸移动距离,那么事件会被外层的下拉拦截。导致轮播图和外层下拉刷新事件冲突。体验不是很好。 烦请楼主检验一下是否有这样的问题!多谢!

changshuai7 avatar Jul 07 '17 09:07 changshuai7

你用的是哪个下拉刷新类库?CoolRefreshView是我写的,其它的是第三方的下拉刷新,如果是其它的这个问题你反馈到对应链接的项目上

LuckyJayce avatar Jul 07 '17 10:07 LuckyJayce

在MVCHelper项目里,所有的刷新类库都有这样的问题。 验证其实很简单,您可以打开您的MVCHelper的Demo,在任意一个可以下拉刷新界面,手指偏横向滑动(即手指在x轴移动的距离>y轴移动的距离),那么仍然可以看到即将刷新的趋势。 所以,我更希望您可以实现的是当手指触摸x轴移动的距离<y轴移动的距离,才执行下拉。 但是奇怪的是,在刷新类库外层嵌套你的ViewPagerIndicator,则此问题则消失。

请验证。多谢!

changshuai7 avatar Jul 07 '17 11:07 changshuai7

你是指横向没有其他横向滑动控件,然后横向x>y会显示下拉刷新的header. 而当有viewpager嵌套那是因为viewpager拦截横向的啊,你如果要y>x才会显示出刷新的你如果用coolrefreshview那么可以在header的配置x和y导致的滑动y值 这不是bug

LuckyJayce avatar Jul 07 '17 12:07 LuckyJayce

你好,我的意思是CoolRefreshView内嵌套ViewPager会有滑动冲突。不是外部嵌套ViewPager。 CoolRefreshView内嵌套ViewPager,当往左下或右下滑动的时候,事件就会被CoolRefreshView吃掉。 您的CoolRefreshView和SwipeRefreshLayout处理其实是相似的,所以两者都有同样的问题。 我目前处理的方法是重写CoolRereshView:

方式如下:

public class MyCoolRefreshView extends CoolRefreshView {

private float startY;
private float startX;
// 记录viewPager是否拖拽的标记
private boolean mIsVpDragger;
private final int mTouchSlop;

public MyCoolRefreshView(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:
            // 记录手指按下的位置
            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轴,事件交给CoolRefreshView处理。
    return super.onInterceptTouchEvent(ev);
}

}

用CoolRefreshView的话,你刚才说可以通过设置Header来配置x和y导致的滑动y值。能给一下具体设置方法吗? 感谢!

changshuai7 avatar Jul 08 '17 08:07 changshuai7