浅谈Android中的事件分发机制 (2)

当事件从ViewGroup传递到了View的dispatchTouchEvent()之后,最先执行的是View的onTouch()方法。onTouch()方法是View的OnTouchListener接口中所定义的方法,如果用户为View注册了监听,那么当用户触摸屏幕时便会触发此方法。此方法默认返回false,需要用户重写。
只有onTouch()方法返回false, 才会执行View的onTouchEvent()方法。然后会根据情况调用performClick()方法,performClick()方法随之会调用onClick()方法。

/** * 源码分析:View.dispatchTouchEvent() */ public boolean dispatchTouchEvent(MotionEvent event) { if (mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED && mOnTouchListener.onTouch(this, event)) { return true; } return onTouchEvent(event); } // 说明:只有以下3个条件都为真,dispatchTouchEvent()才返回true;否则执行onTouchEvent() // 1. mOnTouchListener != null // 2. (mViewFlags & ENABLED_MASK) == ENABLED // 3. mOnTouchListener.onTouch(this, event) // 下面对这3个条件逐个分析 /** * 条件1:mOnTouchListener != null * 说明:mOnTouchListener变量在View.setOnTouchListener()方法里赋值 */ public void setOnTouchListener(OnTouchListener l) { mOnTouchListener = l; // 即只要我们给控件注册了Touch事件,mOnTouchListener就一定被赋值(不为空) } /** * 条件2:(mViewFlags & ENABLED_MASK) == ENABLED * 说明: * a. 该条件是判断当前点击的控件是否enable * b. 由于很多View默认enable,故该条件恒定为true */ /** * 条件3:mOnTouchListener.onTouch(this, event) * 说明:即 回调控件注册Touch事件时的onTouch();需手动复写设置,具体如下(以按钮Button为例) */ button.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { return false; } }); // 若在onTouch()返回true,就会让上述三个条件全部成立,从而使得View.dispatchTouchEvent()直接返回true,事件分发结束 // 若在onTouch()返回false,就会使得上述三个条件不全部成立,从而使得View.dispatchTouchEvent()中跳出If,执行onTouchEvent(event)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsxxzw.html