ViewRoot和DecorView相关分析 ViewRoot对应于 ViewRootImpl 类,它是连接 WindowManager和 DecorView 的纽带,View 的三大流程均是通过ViewRoot...ViewRootImpl(view.getContext(), display); root.setView(view, wparams, panelParentView); View的绘制流程是从 ViewRoot
今天,本文将全面解析关于自定义View中基础:ViewRoot、DecorView & Window,希望你们会喜欢。 目录 1....ViewRoot 1.1 简介 1.2 特别注意 // 在主线程中,Activity对象被创建后: // 1....之间关系 ViewRoot、DecorView、Window和Activity的关系非常重要。 5.1 总结 5.2 之间的关系 6....总结 本文全面解析关于自定义View中基础:ViewRoot、DecorView & Window, 接下来我将继续对自定义View的应用进行讲解
今天,本文将全面解析关于自定义View中基础:ViewRoot、DecorView & Window,希望你们会喜欢。 ---- 目录 ? ---- 1. ViewRoot 1.1 简介 ?...之间关系 ViewRoot、DecorView、Window和Activity的关系非常重要。 5.1 总结 ? 5.2 之间的关系 ? ---- 6....总结 本文全面解析关于自定义View中基础:ViewRoot、DecorView & Window
private Paint mSPaint;//三角的画笔 private Path mPath;//路径 private int x, y;//点击的位置 private ViewGroup viewRoot..., List<TextItem items) { super(context); this.viewRoot = viewRoot; this.context = context...();//设置Token int[] location = new int[2]; viewRoot.getLocationInWindow(location);//获取在当前窗口内的绝对坐标...viewRoot.getLocationOnScreen(location);//获取在整个屏幕内的绝对坐标 mToolbarBottom = location[1];//[0]是x轴坐标...) { this.context = context; this.viewRoot = viewRoot; } public Builder addItem(TextItem
并通过ViewRoot.setView方法把该View传给ViewRoot。...并关联View WindowManagerImpl保存DecorView到mViews,创建对应的ViewRoot; ViewRoot用于管理窗口的根View,并和global window manger...ViewRoot中有一个nested class: W,W是一个Binder子类,用于接收global window manager的各种消息, 如按键消息, 触摸消息等。...ViewRoot有一个W类型的成员mWindow,ViewRoot在Constructor中创建一个W的instance并赋值给mWindow。...ViewRoot是Handler的子类, W会通过Looper把消息传递给ViewRoot。 ViewRoot在setView方法中把mWindow传给sWindowSession。
>3.View的三大流程均是通过ViewRoot来完成的,ViewRootImpl是ViewRoot的具体实现类,具体的View管理任务由PhoneWindow(PhoneWindow是Window的实体类...View的绘制流程是从ViewRoot的performTraversals方法开始的,它经过measure、layout和draw三个过程才能最终将一个View绘制出来。...>4.Activity->Window(PhoneWindow实体类)->ViewRoot(ViewRootImpl实现DecorView与Window之间的联系)->DecorView->ViewGroup
ViewRoot类的成员函数requestLayout首先调用另外一个成员函数checkThread来检查当前线程是否就是创建当前正在处理的ViewRoot对象的线程。...如果不是的话,那么ViewRoot类的成员函数checkThread就会抛出一个异常出来。ViewRoot类是从Handler类继承下来的,用来处理应用程序窗口的UI布局和渲染等消息。...ViewRoot.scheduleTraversals public final class ViewRoot extends Handler implements ViewParent, ...这个类型为DO_TRAVERSAL的消息是由ViewRoot类的成员函数performTraversals来处理的,因此,接下来我们就继续分析ViewRoot类的成员函数performTraversals...ViewRoot.performTraversals public final class ViewRoot extends Handler implements ViewParent,
ViewRoot.performTraversals public final class ViewRoot extends Handler implements ViewParent, ...mParent指向的是一个ViewRoot对象,因此,接下来我们就继续分析ViewRoot类的成员函数requestTransparentRegion的实现,以便可以继续了解SurfaceView的挖洞过程...ViewRoot.requestTransparentRegion public final class ViewRoot extends Handler implements ViewParent,...通过了上面的检查之后,ViewRoot类的成员函数requestTransparentRegion再检查参数child所描述的视图是否就是当前正在处理的ViewRoot对象所关联的窗口的顶层视图,即检查它与...ViewRoot类的成员变量mView是否是指向同一个View对象。
Window通过WindowManager加载一个DecorView到Window中,并将DecorView交给ViewRoot。...ViewRoot ViewRoot对应ViewRootImp类,它是连接WindowManager和DecorView的纽带,在ActivityThread中,当Activity对象创建完毕后,会将DecorView...View的三大流程measure layout draw都是通过ViewRoot完成。...ViewRoot并不属于View树的一部分,从源码上看它既非View的子类,也非View的父类,但是它实现了ViewParent接口,所以可以算作名义上的View的父视图。...ViewRoot继承了Handler类,Android所有的触屏事件、按键事件、界面刷新等事件都是通过ViewRoot进行分发的.
在ViewRootImpl中(WMS端收到NativeInputQuene消息回调InputChannel调用到APP端进行ViewRoot分发处理)会调用postFrameCallback方法,这个方法会传入一个...在ViewRoot.setView中进行初始化InputChannel和WMS端的InputChannel 流程 ViewRoot的setView方法构造APP端InputChannel对象–> WindowSession...InputChannel通知APP端的InputChannel【利用初始化时保存的fdpipe通信唤醒】)–>APP端 APP端–>InputChannel从共享内存中拿到事件,InputChannel将事件传递到ViewRoot...中,ViewRoot拿着 DecoeView.之后按照Java‘中的事件分发进行处理’ type:这个的用处是下一个Vsync信号来临时,首先会按照TYPE来取出对应的链表,然后进行调用run方法【具体调用哪个方法根据
当然就是在View树的源头了——ViewRoot!...,ViewRoot中包含了窗口的总容器DecorView,ViewRoot中的performTraversal()方法会依次调用decorView的measure、layout、draw方法,从而完成view...当视图调用invalidate()方法时,首先会将当前视图的DRAWN标志置位,之后有一个循环调用parent.invalidateChildinParent(),这样会导致从当前视图依次向上遍历直到根视图ViewRoot...,这个过程会将需要重绘的视图标记DRAWN置位,之后ViewRoot调用performTraversals()方法,完成视图的绘制过程。
这里就涉及到几个重要的部分:Window,WMS,ViewRoot和DecorView。 如果要理解事件分发的源头,就需要搞明白他们之间的关系,所以我们先来看看它们到底有什么关系?...它很容易与ViewRoot搞混,ViewRoot其实不是View,后面再来说它。...所以这个层级应该是: DecorView -> mContentParent -> 实际布局 ViewRoot 通过上面可以看出,Window的创建是在attach环节,而DecorView则是在create...目前虽然创建了DecorView,但是还没有真正添加到Window中,而且ViewRoot还没有创建出来,这两步实际上是一起的,下面来看一下。...然后将DecorView也传入了,这样ViewRoot就持有了DecorView。 那么ViewRoot到底是什么?
ViewRoot:小管家。继承于Handler,主要作用是把WMS的IPC调用转换为本地的一个异步调用。 W类:ViewRoot小助手,继承于binder,是ViewRoot内部类。...主要帮助ViewRoot实现把WMS的IPC调用转换为本地的一个异步调用。...创建完成后就可以让大家欣赏了,调用WindowManager把界面显示到屏幕上,然后创建ViewRoot,然后调用Wms提供的远程接口添加一个窗口并显示到屏幕上。...客户端小伙伴至少包含三个线程小弟,Activity启动后会创建一个ViewRoot.W对象,同时ActivityThread会创建一个ApplicationThread对象,这两个对象继承消息总管Binder
&& mAttachInfo.mViewRequestingLayout == null) { ViewRootImpl viewRoot...= getViewRootImpl(); if (viewRoot !...= null && viewRoot.isInLayout()) { if (!...viewRoot.requestLayoutDuringLayout(this)) { return; }
储备知识 1.1 ViewRoot 定义 连接器,对应于ViewRootImpl类 作用 连接WindowManager 和 DecorView 完成View的三大流程: measure、...得到设置的View ViewGroup rootView = (ViewGroup) content.getChildAt(0); 1.3 Window、Activity、DecorView 与 ViewRoot...的关系 简介 之间的关系 更加详细 & 具体的介绍,请看文章:Android自定义View基础:ViewRoot、DecorView & Window的简介 1.4 自定义View基础
所提到的概念:View,ViewGroup,DecorView,ViewRoot都是存在于窗口系统的Client端。 Android中的Window是表示Top Level等顶级窗口的概念。...ViewRoot建立了主View(DecorView)与窗口系统Server端的通讯桥梁, ViewRoot是 Handler的子类,即它其实是个Handler,它接受窗口系统服务器端的消息并将消息投递到窗口系统的客户端...ViewRoot建立了主View(DecorView)与窗口系统Server端的通讯桥梁, ViewRoot是 Handler的子类,即它其实是个Handler,它接受窗口系统服务器端的消息并将消息投递到窗口系统的客户端
wms端的inputchannel初始化是在app端activity调用resume方法里面viewroot调用setView方法进行的。...wms端收到add方法(viewroot的setview),申请共享内存,接着在两个inputchannel中保存各自的文件描述符,也就是进行了app端的初始化。...所以他需要管理不同applicantion的事件传递单独创建了一个connection类每个connection对应一个viewroot。...:这里解释上一个总结说到wms没有用looper是因为wms是系统的而viewroot每个activity都有一个。...app端从共享内存读取事件,也就是viewroot也能知道。decoreview也能找知道,最后就是app的事件分发流程了。 ps 个人笔记,后续整理。有误地方辛苦指出一起交流~
开发艺术探索》读书笔记 (4) 第4章 View的工作原理 本节和《Android群英传》中的第3章Android控件架构与自定义控件详解有关系,建议先阅读该章的总结 第4章 View的工作原理 4.1 初始ViewRoot...和DecorView (1)ViewRoot对应ViewRootImpl类,它是连接WindowManager和DecorView的纽带,View的三大流程均通过ViewRoot来完成。...(3)View的绘制流程从ViewRoot的performTraversals方法开始,经过measure、layout和draw三大流程。
the view requesting it, // not the views in its parent hierarchy ViewRootImpl viewRoot...= getViewRootImpl(); if (viewRoot !...= null && viewRoot.isInLayout()) { if (!...viewRoot.requestLayoutDuringLayout(this)) { return; }
val viewRoot = LayoutInflater.from(this).inflate(layoutId, parent, attachToParent) val binding: ViewDataBinding...= DataBindingUtil.bind(viewRoot) 如何查找布局 以往传统布局通过findViewById传入R.id.具体名称查找,但是现在布局文件中的id字段被扩展为了布局绑定类中的变量
领取专属 10元无门槛券
手把手带您无忧上云