view事件分发机制

来源:互联网 发布:网络病毒营销的前提 编辑:程序博客网 时间:2024/04/29 12:30

参考:(http://blog.csdn.net/lmj623565791/article/details/38960443)
【总结】以button为例,
1、点击button(略微滑动一下)的过程中依次执行:
View.dispatchEven()——>View.onTouchListener()—->View.onTouchEven();
在dispatchEven()源码中进行判断onTouchListener是否为空且为true,如果在button.setOnTouchListener()方法中设置的return 值为true 则不再执行*view的onTouchEven方法。设为false则执行。重点内容*

相关源码:

/**      * Pass the touch screen motion event down to the target view, or this      * view if it is the target.      *      * @param event The motion event to be dispatched.      * @return True if the event was handled by the view, false otherwise.      */      public boolean dispatchTouchEvent(MotionEvent event) {          if (!onFilterTouchEventForSecurity(event)) {              return false;          }          if (mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED &&                  mOnTouchListener.onTouch(this, event)) {              return true;          }          return onTouchEvent(event);      }  

2、在even从DOWN到MOVE到UP的过程中,通过两个标识判断是点击还是长按操作——PREPRESEED、PRESSEED。如果点击时间小于115毫秒或处于 115ms到 500ms之间会执行onClick方法;如果大于500ms 则有两种情况:
如果有OnLongClick方法,则执行长按方法,如果该方法内返回true则不再执行onCLick方法
如果没有OnLongClick方法或return 的是false则 会触发onClick方法。

Touch事件的ACTION_DOWN -> ACTION_UP -> OnClick/OnLongClick。

      **该View是怎么响应这个点击动作的呢?**      首先,该View会先响应ACTION_DOWN事件,并返回一个boolean值,这里有两种判断:            a:返回True,表示该View接受此按下动作,就是说这个点击动作的按下操作被中止,然后就是响应ACTION_UP事件。点击动作的按下操作被ACTION_DOWN接受之后就结束了,所以之后的OnClick/OnLongClick事件就不会响应了。            b:返回false,表示该View不接受此按下动作,响应完之后,按下操作继续往下发,之后是响应ACTION_UP事件,这里又有一个判断:

如果ACTION_UP事件返回True,表示ACTION_UP接受松开操作,松开操作中止;View会一直处于按下状态,之后View便会响应OnLongClick事件。

如果ACTION_UP事件返回false,表示ACTION_UP不接收松开操作,松开操作继续下发;因为按下与松开操作都没有被中止,所以之后View就会响应OnClick事件。

1 0
原创粉丝点击