ScrollView嵌套导致onTouch中的ACTION_UP丢失的问题解决

本文介绍了如何解决在嵌套ScrollView和HorizontalScrollView时ACTION_UP事件丢失的问题。通过监听ACTION_CANCEL事件,实现了在HorizontalScrollView的onTouch事件被取消时触发相应操作。

首先感谢@浅秋这篇文章(http://blog.youkuaiyun.com/hyp712/article/details/8777835#comments)让我简单的理解了onTouch事件的分发机制。

即使没有直接解决我的问题,但是也受到了一点启发。好,下面转入正题:

onTouch 中的ACTION_UP丢失的问题解决

问题出现:为了满足需求,在代码中使用了Scrollview,里面嵌套了一个HorizontalScrollView,需要对屏幕边缘来一个侧滑,所以必须要监听HorizontalScrollView的一个onTouch事件,后来发现,可以监听,但是与外层的ScrollView有冲突,出现了一个问题:

如果水平滑动的时候稍微有点倾斜,那么就直接调用了ScrollView的onTouch,不调用HorizontalScrollView的onTouch方法了,看了上面的文章,如果不希望把事件传到父控件,那么就在onTouch中返回true。但是对于我这种情况却是“然并卵”。

解决方案:

从上面的文章可以看出,其实onTouch事件并不只是ACTION_DOWN,ACTION_MOVE,ACTION_UP三种情况,还有其他的,上面文章还提到一个ACTION_CANCEL,最后尝试一下在在ACTION_CANCEL中执行打开菜单的代码!结果成功了!由此可得,这是当HorizontalScrollView的onTouch被取消的时候,失去监听的时候,就触发了这个ACTION_CANCEL事件!

结论:当HorizontalScrollView的onTouch被取消的时候,失去监听的时候,就触发了这个ACTION_CANCEL事件!

在Android中,当ScrollView嵌套RecyclerView时,由于两者都是滑动容器,可能会导致滑动冲突,即用户试图向上滚动ScrollView时,误触到了RecyclerView的滑动,反之亦然。解决这个问题有几种常见方法: 1. **禁止RecyclerView的滑动**:在ScrollView内部设置RecyclerView时,可以在RecyclerView上添加`setOnTouchListener`,并在触摸事件发生时检查是否在ScrollView的区域内,如果是,则阻止RecyclerView的滑动。例如: ```java recyclerView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_UP) { int y = (int) event.getY(); if (!scrollView.canScrollVertically(1) && y > scrollView.getBottom()) { // 防止RecyclerView的滑动 return true; } } return false; } }); ``` 2. **使用NestedScrollView替换ScrollView**:在Android API Level 14及以上版本,可以使用NestedScrollView替换ScrollView,它内置了解决滑动冲突的逻辑。 3. **重写RecyclerView的onInterceptTouchEvent**:重写RecyclerView的`onInterceptTouchEvent`方法,在滑动开始时判断当前手指的位置是否在ScrollView内,如果不是则让RecyclerView正常滑动。 4. **使用SwipeRefreshLayout**:如果你希望在顶部有一个下拉刷新区域,可以考虑使用SwipeRefreshLayout包裹RecyclerView,这样就可以避免滑动冲突了。 5. **禁用头部或尾部Item的滑动**:针对可能导致冲突的头部或尾部固定布局,可以设置它们不响应触摸事件。 总之,关键在于理解用户意图,并在合适的时机切换滑动目标。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值