Android 事件分发机制( 二 )


注意:
在View把事件消费后,如果View的onTouch方法返回true,View的dispatchTouchEvent方法会直接返回true,不会再调用View的onClick方法;只有当onTouch方法返回false时,才会有onClick事件处理 。
思考点

  • onTouch()和onTouchEvent()的区别?
这两个方法都是在View的dispatchTouchEvent中调用,但onTouch优先于onTouchEvent执行 。如果在onTouch方法中返回true将事件消费掉,onTouchEvent()将不会再执行 。
特别注意:请看下面代码
//1. mOnTouchListener的值不能为空 //2. 当前点击的控件必须是enable的mOnTouchListener !=null && (mViewFlags & ENABLED_MASK) == ENABLED &&mOnTouchListener.onTouch(this, event)因此如果你有一个控件是非enable的,那么给它注册onTouch事件将永远得不到执行 。对于这一类控件,如果我们想要监听它的touch事件,就必须通过在该控件中重写onTouchEvent方法来实现 。
  • Touch事件的后续事件(MOVE、UP)层级传递
接收了ACTION_DOWN事件的函数不一定能收到后续事件(ACTION_MOVE、ACTION_UP);如果在某个对象(Activity、ViewGroup、View)的dispatchTouchEvent()消费事件(返回true),那么收到ACTION_DOWN的函数也能收到ACTION_MOVE和ACTION_UP 。




推荐阅读