一 当button被点击时 会调用 dispatchTouchEvent方法:
- public boolean dispatchTouchEvent(MotionEvent event) {
- if (mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED &&
- mOnTouchListener.onTouch(this, event)) {
- return true;
- }
- 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事件结束);