我实施了新的SwipeRefreshLayout
我的应用程序中的组件,它适用于任何垂直视图,例如ListView
, GridView
and ScrollView
.
它在水平视图中表现非常糟糕,例如HorizontalScrollView
。
当向右或向左滚动时,SwipeRefreshLayout
视图缓存触摸,防止HorizontalScrollView
从接收到它并开始垂直滚动以执行刷新。
我尝试解决这个问题,就像我之前解决垂直问题一样ScrollView
with ViewPager
里面,使用requestDisallowInterceptTouchEvent
但没有成功。我还注意到这个方法在原始版本中被重写了SwipeRefreshLayout
类不返回超级。谷歌的开发者留下了评论“//Nope.
" :)
Because SwipeRefreshLayout
组件相对较新,我找不到解决水平滚动问题的解决方案,同时仍然允许滑动刷新视图来跟踪和处理垂直滚动,所以我想我会分享我的解决方案,希望它能为某人节省一个小时或二。
我通过扩展解决了这个问题SwipeRefreshLayout
并覆盖其onInterceptTouchEvent
。在内部,我计算用户移动的 X 距离是否大于触摸斜率。如果是这样,则意味着用户正在水平滑动,因此我返回false
这让孩子看到(HorizontalScrollView
在本例中)来获取触摸事件。
public class CustomSwipeToRefresh extends SwipeRefreshLayout {
private int mTouchSlop;
private float mPrevX;
public CustomSwipeToRefresh(Context context, AttributeSet attrs) {
super(context, attrs);
mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mPrevX = MotionEvent.obtain(event).getX();
break;
case MotionEvent.ACTION_MOVE:
final float eventX = event.getX();
float xDiff = Math.abs(eventX - mPrevX);
if (xDiff > mTouchSlop) {
return false;
}
}
return super.onInterceptTouchEvent(event);
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)