android事件分发机制

      所有的点击事件必然是以MotionEvent.ACTION_DOWN事件开始,以MotionEvent.ACTION_UP结束,中间可能会伴随着MotionEvent.ACTION_MOVE或者其他事件,当用户点击屏幕的时候,会首先触发MotionEvent.ACTION_DOWN事件,

     点解事件率先被Activity内部的dispatchTouchEvent()方法捕获到,如果我们在复写某个Activity的dispatchTouchEvent()方法的时候如果直接返回true或者false,而没有调用super.dispatchTouchEvent()方法,就不会促使事件向位于Activity布局中的顶层视图传递,也就是说步骤①以及之后的ViewGroup和ViewGroup内部的View均不会执行方法,也不会调用Activity中的onTouchEvent()方法.

     在某个Activity的dispatchTouchEvent()方法中调用super.dispatchTouchEvent()方法的前提下,如果我们在activity的布局ViewGroup的dispatchTouchEvent()直接返回true,就表示该事件被当前的ViewGroup的dispatchTouchEvent()方法中消费掉了,而不会将该事件继续传给该ViewGroup的onInterceptTouchEvent()和onTouchEvent(),因为事件在该ViewGroup中被消费,那么就不会将同类事件继续想上也就是ViewGroup的父ViewGroup以及Activity的onTouchEvent()方法。假如消费了MotionEvent.ACTION_DOWN,如果所有的上层ViewGroup都没有拦截,则后续的MotionEvent.ACTION_UP也会传递到该ViewGroup的dispatchTouchEvent()中。如果直接返回false,则表示没有消费,事件会沿着上一级,上上级ViewGroup的onTouchEvent()传递,如果始终没有消费,最终会回到Activity的onTouchEvent()方法中, 则之后的MotionEvent.ACTION_DOWN直接由Activity的dispatchTouchEvent()传递给onTouchEvent(),而不会布局ViewGroup及所有的子视图传递。如果当前的ViewGroup的调用 super.dispatchTouchEvent();胡巴该事件传递给该ViewGroup的onInterceptTouchEvent()

   onInterceptTouchEvent()表示是否拦截当前事件是否想下一级的子View或者ViewGroup传递,如果如果直接返回true,表示事件直接向ViewGroup的onTouchEvent()传递,返回false则传递给下一级View或者ViewGroup的dispatchTouchEvent().如果直接传递给了当前View的onTouchEvent(),如果onTouchEvent()消费了该事件即返回值为true,后续的MotionEvent.ACTION_UP如果未被拦截也会传递到该ViewGroup的onTouchEvent()中。如果调用的是super.onInterceptTouchEvent(),则取决于继承的父类该方法的处理逻辑。

   最底层的View如果是继承自View或者不带有子View的直接或者间接子类,没有onInterceptTouchEvent()方法,但dispatchTouchEvent()和onTouchEvent()的处理逻辑与中间的ViewGroup类似。

posted @ 2016-01-17 16:21  iwillow  阅读(141)  评论(0编辑  收藏  举报