android上面的View是树形结构,View可能会重叠在一起,当点击的地方有多个View可以响应的时候,这个点击事件应该给谁呢?为了解决这个问题,就有了事件分发机制。 PhoneWindow:是抽象类Window的实现类,抽象类是所有视图最顶层的容器,包括View视图的外观和行为都归Window管。 DecorView:PhoneWindow的内部类,同过DecorView传递信息给下面的View,下面的View也通过DecorView返回消息给PhoneWindow.
## 布局加载过程 1、用户执行Activity的setContentView方法,内部是PhoneWindow的setContentView方法,在PhoneWindow中完成DecorView的创建,PhoneWindow是Window的实现类。 2、DecorView是Activity的根View,也是PhotoWindow的内部类,并且继承了Framlayout. 3、DecorView将屏幕分为两部分:titleView和contentView,平时我们加载就是contentView.
viewgroup拥有着三个方法activew和view没有拦截方法,可以简单理解下,view是最后一个组件,下面没有任何控件了,而activity是界面的起点,没必要拦截。 1、dispatchTouchEvent:(dispatch派遣发送)处在链首,用于分发事件,该方法决定是由当前view自己的onTouchEvent来处理,还是分发给View,让子View递归调用其子身dispatchTouchEvent来处理。 2、onInterceptTouchEvent:是用来拦截事件的,当父控件下发事件给子控件进行拦截处理时,如果子控件需要对事件进行处理,就要在onInterceptTouchEvent方法中进行拦截,然后找到控件的onTouchEvent方法中进行事件的监听以及逻辑的状态判断。 3、onTouchEvent:用于处理传递到View的手势事件。
Down、move、up、cancel
Activity->PhoneWindow->DecorView->ViewGroup->…->View 事件分发机制使用的是责任链设计模式,从Activity如果传递到最下层的View都没有组件处理该事件,该事件会依次回传到Activity. ## ViewGroup的事件传递方法 dispatchTouchEvent onInterceptTouchEvent onTouchEvent View的事件传递方法 View的dispatchTouchEvent View的onTouchEvent
当点击事件产生时,activity会调用dispatchTouchEvent()方法 当然具体的事物都是讲给PhotoWindow来完成; PhoneWindow再把事件交给DecorView完成。 (1):同一件事件序列是指手指接触到屏幕的那一刻起,到手指离开屏幕的结束那一刻,在这个过程中所产生的一系列事件,这个事件以down开始,中间含有数量不定的move事件,最终以up事件结束。 (2)、 https://www.jianshu.com/p/555ffeb64e68
