Android事件分发机制

来源:互联网 发布:@淘宝网触屏版 编辑:程序博客网 时间:2024/05/16 04:00

一、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