Android 事件源头

类图

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() // 事件处理方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值