关于android触摸事件传递机制的一点理解

触摸事件是在写自定义控件时很经常碰到的,经常我们用别人的控件也会碰到这样那样的触摸失效问题,这里稍微记录下我对触摸事件的理解

触摸事件分成两块来说 view  和  viewgroup

对于view :触摸事件比较简单只有onTouchEvent,和dispatchTouchEvent因为不会再有子布局所有事件就交给自己处理就好了,没什么难度.

对于viewgroup 由于会有子view所以要控制到底触摸的事件要让viewgroup自己处理呢还是要让子view去处理。那么它是怎么控制的呢?

很简单:两个方法在控制,onInterceptTouchEvent()和dispatchTouchEvent(),这两个方法相当于两阀门,控制了事件最终能不能到达viewgroup自己的onTouchEvent()方法.

只有onInterceptTouchEvent()和dispatchTouchEvent()都返回了false 那么就说明这两个方法都不拦截事件,让事件被viewgroup自己的onTouchEvent()执行,只要有一个返回了true,那么viewgroup自己的onTouchEvent()将不会执行,是的不会执行!而是直接去执行子view的onTouchEvent(),也就是说不是执行玩viewgroup的onTouchEvent()后再去执行子view的onTouchevent(),而是跳过了.这样viewgroup onTouchEvent()里面写的就都无效了.


onInterceptTouchEvent和dispatchTouchEvent都有几种状态,down up move 等只要其中的一个状态返回false就说明事件可以留在viewgroup这里,比如viewpager中如果要求横向滑动时事件留在vieapager竖向滑动时事件 不留在viewpager就可以在自己写的viewpager类中重写onInterceptTouchEvent(),在move状态下判断滑动的方向(怎么判断我就不写了,简单的计算横向和竖向的距离差就好)横向返回false,竖向返回true这样就达到目的了


当然了,有时候我们用了别人的控件还是个jar包,这个控件不管不顾的onInterceptTouchEvent()都返回了true让自己的onTouchEvent执行(流氓啊),那我们的子view某些情况下要执行自己的事件比如我要能点击到我自己啊(点击其实属于OntouchEvent中的一种),可是被父控件拦截了,自己的OntouchEvent都没机会执行了,怎么办?

一个字:抢!怎么抢?

在dispatchTouchEvent()中抢,用什么抢呢?

getParent().requestDisallowInterceptTouchEvent(true);这个就是抢的方法,在自己的dispatchTouchEvent的down状态下先通知下父控件别急着抢,我也要这个事件。至于传true或者false,也很好理解就是true我要false我不要就好~,然后再move或者up中根据情况比如是点击就是move的距离很短小于某个值得时候就getParent().requestDisallowInterceptTouchEvent(true);这样就把事件抢到了否则就getParent().requestDisallowInterceptTouchEvent(false);不抢还给父控件了就这么简单。











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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值