天天看点

android事件分发机制一

  一   当button被点击时 会调用 dispatchTouchEvent方法:

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

     1.当 mOnTouchListener = null时:

                      也就是用户并没有给button注册 OnTouchListener 的时候 dispatchTouchEvent  

                               return onTouchEvent(event);

     2.当  mOnTouchListener != bull , 但是  (mViewFlags & ENABLED_MASK) != ENABLED (此控件是否enable)

                              return onTouchEvent(event);

     3.当  mOnTouchListener != bull ,  但是  (mViewFlags & ENABLED_MASK) == ENABLED (此控件是否enable)                       mOnTouchListener.onTouch(this, event) 

             1.如果mOnTouchListener实现接口中返回false:

                             return onTouchEvent(event);(把事件分发给touchevent)

             2,如果mOnTouchListener实现接口中返回true:

                             return  true;   dispatchTouchEvent  一次结束 不再把event分发给ontouchevent 返回true 表示对用户一次动作的监听 结束  直至dispatchTouchEvent 返回false 跳出 dispatchTouchEvent 的 循环监听.

  解读: 从这里可以知道,  当我们给控件注册了OnTouchListener 并且 控件是enable的状态 这时 代码便会执行我们在接口中实现的事件注意  boolean onTouch 返回的是bool类型 并且是开放给程序员  当我们手动返回时true的时候   dispatchTouchEvent 监听事件一次结束;但是当我们手动返回false时,return onTouchEvent(event);

   表现:  1.当我们没有注册OnTouchListener监听 或者 控件不是enable的状态,控件点击直接  return onTouchEvent(event);直接将事件分发给onTouchEvent(单击事件,长按事件等) 2.当我们注册了OnTouchListener监听 并且控件是enable状态 控件先会去执行OnTouchListener 中我们在接口中实现的具体处理方法  然后 当  我们onTouch 返回 false 时   dispatchTouchEvent 又把事件分发给onTouchEvent(这时如果我们设置了onclicklistener事件就会去执行);但是当我们 onTouch返回 true时, 即时 用户设置了onclicklistener 也不会去执行 因为dispatchTouchEvent直接返回了true(一次dispatchTouchEvent事件结束);