文化袁探索专栏——Activity、Window和View三者间关系 文化袁探索专栏——View三大流程#Measure 文化袁探索专栏——View三大流程#Layout 文化袁探索专栏——消息分发机制 文化袁探索专栏——事件分发机制 文化袁探索专栏——Launcher进程启动流程’VS’APP进程启动流程 文化袁探索专栏——Activity启动流程 文化袁探索专栏——自定义View实现细节 文化袁探索专栏——线程安全 文化袁探索专栏——React Native启动流程
用户点击屏幕,点击事件会在ViewRootImpl.java类中被接收和处理。然后进行事件的传递。通过view.dispatchPointEvent()将该点击事件传递给DecorView【View视图容器】,之后通过cb.dispatchTouchEvent()【cb是Window】将事件回调传递给了Activity。接下来的事件传递流程就是
Activity–>>Window(PhoneWindow)–>>DecorView(FrameLayout)–>ViewGroup–>View
从Activity开始,进行事件分发。事件在Activity中有ViewGroup接受点击事件,则事件将向ViewGroup执行分发。反之,Activity则调用onTouchEvent处理事件。
public boolean dispatchTouchEvent(MotionEvent ev) {
...
if (getWindow().superDispatchTouchEvent(ev)) {
return true;
}
return onTouchEvent(ev);
}
事件分发到ViewGroup时,会先通过onInterceptTouchEvent判断是否进行事件的拦截,若拦截ViewGroup则会自己处理该事件。若不拦截,则ViewGroup会遍历所有子View,若有子View接收了点击事件,则会把该事件分发到该View。
事件分发到View时,先通过onTouch判断是否进行消费,若被消费则不再进行事件的分发。若未消费,则执行onTouchEvent进行处理。
public boolean dispatchTouchEvent(MotionEvent event) {
...
if (onFilterTouchEventForSecurity(event)) {
if ((mViewFlags & ENABLED_MASK) == ENABLED && handleScrollBarDragging(event)) {
result = true;
}
ListenerInfo li = mListenerInfo;
if (li != null && li.mOnTouchListener != null
&& (mViewFlags & ENABLED_MASK) == ENABLED
&& li.mOnTouchListener.onTouch(this, event)) {
result = true;
}
if (!result && onTouchEvent(event)) {
result = true;
}
}
...
return result;
}
未完待续…
|