您的位置:首页 > 移动开发 > Android开发

Android touch事件分发与总结

2016-02-16 23:24 549 查看

逻辑如图



如果最外面的视图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方法,因为只会进行一次判断,详细机制请自行参见源码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 布局