ViewGroup触摸事件的分发,拦截,消耗(dispatchTouchEvent , onInterceptTouchEvent , onTouchEvent)

在家写个代码需要抵制的诱惑实在太大,看微博上的兄弟们都在咖啡馆写东西,看来是有原因的,不然等会就叫你来打游戏。这种人T_t

写了个小demo来演示这三个方法。

注:big代表最外层的红色部分,middle是中间蓝色部分,small则是最里面的部分。

现在分别记录下三个事件的意思。

dispatchTouchEvent:负责分发事件如果直接返回true,或者false,那么将不会再去调用onInterceptTouchEvent,如要想走正常的流程就返回 return super.dispatchTouchEvent(ev);

onInterceptTouchEvent :就是拦截事件,比如你想将这个事件自己要就直接返回true,那么将不会向下发送。

onTouchEvent:就是消耗事件,比如你想移动view等

这里写图片描述

用多选框来控制每个ViewGroup的每个事件,大拦截就是(最外层红色的 onInterceptTouchEvent ),大分发就是(最外层红色dispatchTouchEvent ),大消耗就是(最外层红色的 onTouchEvent),选中就是返回true,否则false 。

中拦截,小拦截等同上

当手指在屏幕上点击后一般是有down , move , up三种,然后最先收到的是activity ,然后一级级的往下传递,直到传递给想要处理的view,然后就不再往下传递了。

触摸事件来的时候默认是先调用dispatchTouchEvent,然后 onInterceptTouchEvent , 最后onTouchEvent

这里写图片描述

上面只是一个点击(down , up) ,但是却没有up,因为三个view都没人想处理,所以这个事件序列就丢掉了,没人处理。

这里写图片描述

比如最外层拦截了事件

这里写图片描述

连down事件都没向下传送了。

可是up事件呢?因为我们没消耗这个序列的事件,就是onTouchEvent也是返回的false,所以这个序列事件也是拦截了,但是我不用,占着茅坑不拉屎。

现在我们来消耗一下:

这里写图片描述

事件如下:

这里写图片描述

现在就可以在 onTouchEvent中做你想做的事,比如移动。

现在试试分发一下:

这里写图片描述

这里写图片描述

进入bigview的 dispatchTouchEvent 方法中直接将事件分发到子view中,如果子view中有人要消耗,那么就让他消耗。没有的话就给就给下一级(这里是middleView)的消耗。
看效果图:

这里写图片描述

下面来看看一个和listView的事件冲突:

外层如果截获了事件。那么listview自然获取不到。

这里写图片描述

1.大拦截:外层把事件拦截了自然里面就获取不了了。
2.打分法:如果分发下去了,listview就可以像正常的使用
3.大消耗:如果滑动区域有listview,如果listview能获取到事件那么就滑动,如果没有就是bigview移动。

源码地址

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值