MVCHelper
MVCHelper copied to clipboard
发现一个小bug
首先感谢作者的辛苦和优秀的架构。 在使用过程中发现一个小问题。利用MVCHelper实现下拉刷新的时候,处理下拉的这个触摸事件不是根据手指触摸的x轴距离和y轴距离来处理的(即:手指触摸x轴移动的距离>y轴移动的距离,不执行下拉。x轴移动的距离<y轴移动的距离,那么就执行下拉。)。而您的项目里,是只要在y轴方向有触摸距离,则整体页面下拉。 那么这样导致的问题是,如果当前页面有轮播图,我在轮播图上滑动,滑动的时候,只要在y轴方向上有触摸移动距离,那么事件会被外层的下拉拦截。导致轮播图和外层下拉刷新事件冲突。体验不是很好。 烦请楼主检验一下是否有这样的问题!多谢!
你用的是哪个下拉刷新类库?CoolRefreshView是我写的,其它的是第三方的下拉刷新,如果是其它的这个问题你反馈到对应链接的项目上
在MVCHelper项目里,所有的刷新类库都有这样的问题。 验证其实很简单,您可以打开您的MVCHelper的Demo,在任意一个可以下拉刷新界面,手指偏横向滑动(即手指在x轴移动的距离>y轴移动的距离),那么仍然可以看到即将刷新的趋势。 所以,我更希望您可以实现的是当手指触摸x轴移动的距离<y轴移动的距离,才执行下拉。 但是奇怪的是,在刷新类库外层嵌套你的ViewPagerIndicator,则此问题则消失。
请验证。多谢!
你是指横向没有其他横向滑动控件,然后横向x>y会显示下拉刷新的header. 而当有viewpager嵌套那是因为viewpager拦截横向的啊,你如果要y>x才会显示出刷新的你如果用coolrefreshview那么可以在header的配置x和y导致的滑动y值 这不是bug
你好,我的意思是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值。能给一下具体设置方法吗? 感谢!