事件分发机制异常复杂 不是一次就可彻底理解 在不知前提和条件的情况 更不要谈理解 否则都是片面的。
因此 理解复杂事务的第一步就是 理清楚、 前提条件、 前提环境
事件分发包括
三个方向 向上传 、 当前处理、 向下传
三种处理 (分发 dispatchTouchEvent)、(拦截 onInterceptTouchEvent)、(处理onTouchEvent)
三种 事件 dwon、 move 、up、
还有两种视图 view、viewgroup(区别不大)
=======================3*3*3共产生27种逻辑组合=============
View里,有两个回调函数 :dispatchTouchEvent\onTouchEvent
ViewGroup里,有三个回调函数 :dispatchTouchEvent \onInterceptTouchEvent\onTouchEvent
ViewGroup的dispatchTouchEvent方法 才是真正的发分发 ViewdispatchTouchEvent方法直接调用了onTouchEvent
public boolean dispatchTouchEvent(MotionEvent ev) 开始处理流程
1 true======当前处理====
执行 View group调用自己的onTouchEvent()方法处理
返回 并且返回true,分发结束 <先写处理方式再写返回类型>
2
false=====向上走==============
执行 如果当前 View 获取的事件直接来自 Activity,则会将事件返回给 Activity 的 onTouchEvent 进行消费;
如果当前 View 获取的事件来自外层父控件,则会将事件返回给父 View 的 onTouchEvent 进行消费。
返回 return false
3
===========向下走
执行父类代码 super.dispatchTouchEvent(ev),事件会自动的分发给当前 View 的 onInterceptTouchEvent 方法。
1 如果 onInterceptTouchEvent 返回 true
或者返回 super.onInterceptTouchEvent(ev),则表示将事件进行拦截,并将拦截到的事件交由当前 View 的 onTouchEvent 进行处理;;
2 如果 onInterceptTouchEvent 返回 false,则表示将事件放行,当前 View 上的事件会被传递到子 View 上,
再由子 View 的 dispatchTouchEvent 来开始这个事件的分发
/****
ViewGroup所有的子View都返回false时,onTouchEvent事件便会执行
目标View的onTouchEvent返回false,则系统将该事件传递至上一层View的onTouchEvent处理。
目标View的onTouchEvent返回true,则后续事件可以继续传递给该View的onTouchEvent处理。
---------关于onInterceptTouchEvent拦截方法的 逻辑
拦截了便自己处理 不往下传
不拦截就一直往下传 知道目标 view 《被点击的那个》
不拦截down 只拦截move的话 目标view会收到cancel事件 且仅仅是一次。
只要拦截了dwon后续全部交由拦截者。
目标view 返回false 再一层层往上推 onTouchEvent处理
ViewGroup中的onInterceptTouchEvent处理完ACTION_DOWN事件返回true
后续的ACTION_MOVE、ACTION_UP事件将不再调用该ViewGroup中的onInterceptTouchEvent方法,
直接将这些事件传递给该ViewGroup中的onTouchEvent处理。
ViewGroup中的onInterceptTouchEvent处理完ACTION_DOWN事件返回false,
后续的ACTION_MOVE事件同样先传递到onInterceptTouchEvent中
如果onInterceptTouchEvent处理完ACTION_MOVE返回false,则系统还会将ACTION_MOVE事件传递到目标View中的onTouchEvent方法中。
如果onInterceptTouchEvent处理完ACTION_MOVE返回true,则系统不会将ACTION_MOVE事件传递到目标View中的onTouchEvent方法中,
而是传递ACTION_CANCEL事件到目标View的onTouchEvent方法中,只传递一次,此后与目标View没有任何关系(包括最后的ACTION_UP事件)