android 事件分发机制 简要

事件分发机制异常复杂 不是一次就可彻底理解 在不知前提和条件的情况 更不要谈理解 否则都是片面的。

因此 理解复杂事务的第一步就是 理清楚、 前提条件、 前提环境

事件分发包括
三个方向  向上传    、 当前处理、 向下传
三种处理  (分发  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事件)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章