Android事件分发机制

一、view
android点击事件可分为:onclick和ontouch。区别在于,在onclick中,单纯的设置单次点击事件,注重结果,而在ontouch中,可分为action down,action move,action up等多种事件过程。
view的事件分发为:dispatchTouchEvent–>setOnTouchListener(onTouch)–>false—>onTouchEvent–>action up –> performclick–>onclick,
如果onTouch返回true,则表示该事件被onTouch消费了,将不会进行onTouchEvent等方法,
需要注意的是:针对像imageview,textview等,clickable为false的控件,在ontouch方法中有多种action,如果一个action的返回false的话,该action的下一个action将不会进行调用,即action down必须返回true,才会调用action move,或action up,
原因:可能你觉得和dispatchTouchEvent–>setOnTouchListener(onTouch)–>false—>onTouchEvent–>action up –> performclick–>onclick相矛盾,在查看view的ontouchEvent方法中发现会进行if判断,其中就有clickable的判断,返回值为true,其他的返回false,及view默认帮你返回true啦,所以有其他action的调用,如果你对imageview进行setOnClickListener设置,在view中会对该空间的clickable设置为true,及在ontouch返回false,在设置click事件后,多个action才会调用,如果不设置click事件,对于clickable为false的控件,将只会调用action down。

二、viewgroup点击事件分发:
需要了解几点:
1、viewgroup继承view
2、事件分发—首先会调用点击控件的所在布局,及向上找,最后可能找到viewgroup的dispatchTouchEvent,然后在进行向下事件分发
3、分发到目标控件后,就是view的事件分发
4、需要了解函数:dispatchTouchEvent—事件分发
requestDisallowInterceptTouchEvent—请求是否进行事件拦截–>默认false
onInterceptTouchEvent—事件拦截–>默认false
流程:
首先向上找dispatchTouchEvent实现,可能是父类,也有可能是ViewGroup,进行if (disallowIntercept || !onInterceptTouchEvent(ev)) 判断,disallowIntercept可以通过requestDisallowInterceptTouchEvent修改,默认false,onInterceptTouchEvent默认为false,所以进入if,在for循环找到target view,如果找到对应的view,就进行view的dispatchTouchEvent分发,然后进入target view的点击事件分发,如果没有找到,如点击的空白处,调用super.dispatchTouchEvent(ev);也是view的事件分发,viewgroup是view的子类,即dispatchTouchEvent–>setOnTouchListener(onTouch)–>false—>onTouchEvent–>action up –> performclick–>onclick,
流程图如下:
这里写图片描述

参考链接:
http://blog.csdn.net/guolin_blog/article/details/9153747

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值