类图
ViewRootImpl与DecorView的关系
DecorView是ViewRootImpl 的一个成员 变量 在viewRootImpl.setView时赋值
先有DecorView再有viewRootImpl DecorView是在onCreate创建的 ViewRootImpl是在onResume创建的 windowManagerGlobal.addView()
过会看下colin老师的图
事件源头
事件接受的地方是
事件是在ViewRootImpl 注册的WindowInputEventReceiver 收到事件后先给DecorView
事件到DecorView后 去找Window.Callback Window.Callback的实现在Activity Activity:Window.CallBack
是ActivityThread handleResumeActivity() wm.addView(decorl,l) (WindowManagerImpl.java) 委托到WindowManagerGlobal实现 View decor = r.window.getDecorView(); --> wm.addView(decor, l); WindowManagerGlobal.addView --> root = new ViewRootImpl(view.getContext(), display); --> mViews.add(view); // decor mViews是WindowManagerGlobal成员变量集合 mRoots.add(root); // ViewRootImpl mRoots是WindowManagerGlobal成员变量集合 mParams.add(wparams); // WindowManager.LayoutParams mParams是WindowManagerGlobal成员变量集合 --> root.setView(view, wparams, panelParentView, userId); 第一个参数的view是DecorView setView@ViewRootImpl.java ViewRootImpl注册了WindowInputEventReceiver // 接收事件 --> mInputEventReceiver = new WindowInputEventReceiver(inputChannel, Looper.myLooper()); onInputEvent@ViewRootImpl.java#WindowInputEventReceiver.java --> enqueueInputEvent --> doProcessInputEvents(); --> deliverInputEvent(q); --> stage.deliver(q); (InputStage stage;) deliver@ViewPostImeInputStage.java --> onProcess(q); --> processPointerEvent // mView --> DecorView --> boolean handled = mView.dispatchPointerEvent(event); mView是DecorView --> dispatchTouchEvent(event);
// 执行到 cb == Activity public boolean dispatchTouchEvent(MotionEvent ev) { @DecorVIew final Window.Callback cb = mWindow.getCallback(); return cb != null && !mWindow.isDestroyed() && mFeatureId < 0 ? cb.dispatchTouchEvent(ev) : super.dispatchTouchEvent(ev); } dispatchTouchEvent@Activity.java --> getWindow().superDispatchTouchEvent(ev) --> mDecor.superDispatchTouchEvent(event); --> super.dispatchTouchEvent(event); --> ViewGroup.dispatchTouchEvent() // 事件分发机制 --> onTouchEvent() View.dispatchTouchEvent() // 事件处理方法