深入解析Andoird应用开发中View的事件传递

2019-12-10 19:11:30于丽
易采站长站为您分析深入解析Andoird应用开发中View的事件传递,其中重点讲解了ViewGroup的事件传递流程,需要的朋友可以参考下  

深入解析Andoird应用开发中View的事件传递

下面以点击某个view之后的事件传递为例子。
首先分析view里的dispatchTouchEvent()方法,它是点击view执行的第一个方法。

public boolean dispatchTouchEvent(MotionEvent event) {
 if (mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED &&
   mOnTouchListener.onTouch(this, event)) {
   return true;
 }
 return onTouchEvent(event);
}

注意:里面包含两个回调函数 onTouch(),onTouchEvent();如果控件绑定了OnTouchListener,且该控件是enabled,那么就执行onTouch()方法,如果该方法返回true,则说明该触摸事件已经被OnTouchListener监听器消费掉了,不会再往下分发了;但是如果返回false,则说明未被消费,继续往下分发到该控件的onTouchEvent()去处理。

然后分析onTouchEvent()方法,进行进一步的触摸事件处理。

if (((viewFlags & CLICKABLE) == CLICKABLE || 
   (viewFlags & LONG_CLICKABLE) == LONG_CLICKABLE)) { 
  switch (event.getAction()) { 
   case MotionEvent.ACTION_UP:
    ..... 
      performClick(); //响应点击事件 
    break; 
   case MotionEvent.ACTION_DOWN: 
   ..... break; 
   case MotionEvent.ACTION_CANCEL: 
   ..... break; 
   case MotionEvent.ACTION_MOVE: 
   ..... break; 
  } 
  return true; 
} 
return false;

如果该控件是clickable 、long_clickable的,那么就可以响应对应事件,响应完后返回true继续响应。比如点击事件,先响应ACTION_DOWN,然后break并返回true,然后手抬起,又从dispatchTouchEvent()分发下来,再响应ACTION_UP,里面会去performClick()响应点击事件。