Android touch事件分发与总结

来源:互联网 发布:英国黑暗料理 知乎 编辑:程序博客网 时间:2024/05/21 08:46

逻辑如图

这里写图片描述

如果最外面的视图OntouchEvent返回flase 则上个视图的OntouchEvent接收到OnTouch事件除非有click方法默认拦截。
onInterceptTouchEvent返回true,则调用layout onTouchEvent方法
如ACTION_MOVE或者ACTION_UP发生的前提是一定曾经发生了ACTION_DOWN,如果你没有消费ACTION_DOWN,那么系统会认为ACTION_DOWN没有发生过,所以ACTION_MOVE或者ACTION_UP就不能被捕获。 比如ACTION_MOVE或者ACTION_UP发生的前提是一定曾经发生了ACTION_DOWN,如果你没有消费ACTION_DOWN,那么系统会认为ACTION_DOWN没有发生过,所以ACTION_MOVE或者ACTION_UP就不能被捕获。

时序如下

Activity的dispatchTouchEvent

Activity的onUserInteraction

Layout的dispatchTouchEvent

Layout的onInterceptTouchEvent

Button的onTouchEvent (ACTION_DOWN)

Layout的onTouchEvent (ACTION_DOWN)

紧跟着是一个ACTION_UP事件

Activity的dispatchTouchEvent(不触发Activity的onUserInteraction,它对ACTION_UP不起作用。)

Layout的dispatchTouchEvent

Layout的onInterceptTouchEvent

Button的onTouchEvent

onClick事件不再发生。

点击事件

在ACTION_UP时调用。如果继承button,在OntouchEvent里没有调用父类方法,则click方法不会被调用。

事件分发

dispatchTouchEvent事件派发是传递的,如果返回值为false将停止下次事件派发,如果返回true将继续下次派发。譬如,当前派发down事件,如果返回true则继续派发up,如果返回false派发完down就停止了

总结

触摸控件(View)首先执行dispatchTouchEvent方法。
在dispatchTouchEvent方法中先执行onTouch方法,后执行onClick方法(onClick方法在onTouchEvent中执行,下面会分析)。
如果控件(View)的onTouch返回false或者mOnTouchListener为null(控件没有设置setOnTouchListener方法)或者控件不是enable的情况下会调运onTouchEvent,dispatchTouchEvent返回值与onTouchEvent返回一样。
如果控件不是enable的设置了onTouch方法也不会执行,只能通过重写控件的onTouchEvent方法处理(上面已经处理分析了),dispatchTouchEvent返回值与onTouchEvent返回一样。
如果控件(View)是enable且onTouch返回true情况下,dispatchTouchEvent直接返回true,不会调用onTouchEvent方法。
当oninterceptTouchEvent返回true时 ,事件当然传递给当前view的onTouchEvent事件,然后 (move,up等)方法不会调用oninterceptTouchEvent方法,因为只会进行一次判断,详细机制请自行参见源码。

1 0
原创粉丝点击