首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Android开发之漫漫长途 Ⅴ——Activity的显示之ViewRootImpl的PreMeasure、WindowLayout、EndMeasure、Layout、Draw

这个方法实现对控件树进行测量、布局、向WMS申请修改窗口属性以及重绘的所有工作。...控件树本可以按照这两个参数完成测量,但是measureHierarchy有自己的考量,即如何将窗口布局的尽可能优雅。measureHierarchy如何做到这一步呢,通过跟控件树的协商。...当控件内容发生变化从而需要调整其尺寸时,会调用自身的requestLayout(),并且此方法会沿着控件树向根部回溯,最终调用到ViewRootImpl的requestLayout,从而引发一次performTraversals...根据预测量的结果,通过IWindowSession.relayout()方法向WMS请求调整窗口的尺寸等属性,这将引发WMS对窗口重新布局,并将布局结果返回给ViewRootImpl....Canvas是一个绘图工具类,其API提供了一系列绘图指定供开发者使用。这些指令可以分为两个部分: 绘制指令。这些最常用的指令由一系列名为drawXXX()的方法提供。

57130
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    ViewRootImpl 源码解析(三大主要功能实现解析)

    完成View的绘制过程,包括measure、layout、draw过程。 向DecorView分发收到的用户发起的event事件,如按键,触屏等事件。...那么View与WindowManager之间是怎么建立联系的呢,WindowManager所提供的功能很简单,常用的只有三个方法,即添加View,更新View和删除View,当然还有其它功能哈,比如改变...这点从WindowManager的定义也可以看出,它提供的三个接口方法addView,updateView,removeView都是针对View的,这说明View才是Window的实体,在实际使用中无法直接访问...源码注释如下:意思就是在添加Window之前先完成第一次layout布局过程,以确保在收到任何系统事件后面重新布局。...WindowManager又是如何与DecorView相连的呢,最终DecorView肯定是要添加到Window上的,而Window的具体实现类是PhoneWindow,因为DecorView嵌入在Window

    2.8K11

    Android自定义View绘制前的准备:DecorView创建 & 显示

    设置回调,向Activity分发点击或状态改变等事件 mWindow.setWindowControllerCallback(this); mWindow.setCallback(this);...实例化一个ViewRootImpl对象 ViewRootImpl root; root = new ViewRootImpl(view.getContext...将 DecorView对象交给ViewRootImpl对象 ViewRootImpl对象通过Handler向主线程发送了一条触发遍历操作的消息:performTraversals();该方法用于执行View...的绘制流程(measure、layout、draw) ViewRootImpl对象中接收的各种变化(如来自WmS的窗口属性变化、来自控件树的尺寸变化 & 重绘请求等都引发performTraversals...类对象的核心 而View的绘制则是在performTraversals()中执行,故下面从performTraversals()开始,讲解View绘制的三大流程(measure、layout、draw

    89420

    Android View 深度分析requestLayout、invalidate与postInvalidate「建议收藏」

    mParent.isLayoutRequested()) { //向父容器请求布局 mParent.requestLayout(); } if...View树是否正在布局流程,接着为当前子View设置标记位,该标记位的作用就是标记了当前的View是需要进行重新布局的,接着调用mParent.requestLayout方法,这个十分重要,因为这里是向父容器请求布局...,直到DecorView,即根View,而根View又会传递给ViewRootImpl,也即是说子View的requestLayout事件,最终会被ViewRootImpl接收并得到处理。...在ViewRootImpl中,重写了requestLayout方法,我们看看这个方法,ViewRootImpl#requestLayout: @Override public void requestLayout...好了,现在总结一下invalidate方法,当子View调用了invalidate方法后,会为该View添加一个标记位,同时不断向父容器请求刷新,父容器通过计算得出自身需要重绘的区域,直到传递到ViewRootImpl

    2.3K11

    Android经典面试题之View的三大流程

    ViewGroup是一个抽象类,为了测量子类,它提供了一个measureChildren方法: //ViewGroup.class protected void measureChildren(int...(布局) layout的作用就是ViewGroup用来确定子元素的位置,ViewGroup的位置被确定后,就会调用onLayout方法,遍历所有的子元素并调用其layout方法,在layout方法中又会调用...layout方法确定View本身的位置,而onLayout方法用来确定子元素的位置。...只不过一个获取的是measure过程后得到的宽高,一个是layout过程后的宽高。所以如果measure过程需要进行多次或是认为改变了layout方法,就有可能2者不相等。不过绝大多数都是一样的。...方法开启View的三大流程;通过WindowSession的addToDisplay方法向WindowManagerService发起远程IPC调用,完成Window的添加。

    10810

    这可能是2020大小厂问的最经典的Android面试题了——事件分发机制、View渲染过程

    ViewGroup类提供了measureChild,measureChild和measureChildWithMargins方法,简化了父子View的尺寸计算。...是否重新分配视图的位置(layout) image.png 原理: layout也是从顶层父View向子View的递归调用View.layout方法的过程,父View根据上一步measure子View得到的布局大小和布局参数...是否重新绘制(draw) image.png 原理: draw过程也是在ViewRootImpl的performTraversals()内部调运的,其调用顺序在measure()和layout()之后,...后者可以通过xml布局的layoutAnimation属性添加 在获取画布剪切区(每个View的draw中传入的Canvas)时会自动处理掉padding,子View获取Canvas不用关注这些逻辑,只关心如何绘制即可...5.requestLayout() 原理: View的requestLayout时其实质就是层层向上传递,直到ViewRootImpl为止,然后触发ViewRootImpl的requestLayout方法

    1.1K20

    ViewRootImpl的独白,我不是一个View(布局篇)

    绘制&加载View-----onMeasure() MeasureSpec.EXACTLY是精确尺寸, 当我们将控件的layout_width或layout_height指定为具体数值时如andorid...ViewTree.jpg View的解析与生成 View的解析和生成之前在下边的这两篇文章中已经讲述 View如何在页面进行展示的,View树是如何生成的。...遇见LayoutInflater&Factory 在这两篇文章中用到了一些Android中相关的类: Activity:一个Activity是一个应用程序组件,提供一个屏幕,用户可以用来交互为了完成某项任务...ViewRootImpl的performLayout; DecorView(FrameLayout)的layout方法; DecorView(FrameLayout)的onLayout方法; DecorView...: running second layout pass"); //请求对该View布局,最终回调到ViewRootImpl的requestLayout进行重新测量

    78410

    用两张图告诉你,为什么你的App会卡顿?

    知道Android究竟是如何在屏幕上显示我们期望的画面的? 对Android的视图架构有整体把握。 学会从根源处分析画面卡顿的原因。 掌握如何编写一个流畅的App的技巧。...前面说过,ViewRootImpl控制着一个Window中的整个视图树的绘制。那它是如何进行控制的呢?一次绘制究竟是如何开始的呢?...但是前面提到过,我们Window中的视图树都是被绘制到一个由Surface提供的Canvas上。忘了的童鞋面壁思过?。 Canvas实际代表了一块内存,用于储存绘制出来的数据。...就好比你在PC上用画板画图,此时画板就相当于Android中的图形库,它提供了一系列标准化的工具供我们画图使用。比如我们drawRect()实际就是操作图形库在内存上写入了一个矩形的数据。...而requestLayout()操作,会向ViewRootImpl中一个名为mLayoutRequesters的List集合里添加需要重新Layout的View,这些View将在下一帧中全部重新layout

    91930

    Android组件View绘制流程原理分析

    ,PhoneWindow是一块手机电子屏,DecorView就是电子屏要显示的内容,Activity就是手机电子屏安装位置 setContentView流程 setContentView整个过程主要是如何把...android的View绘制 view绘制主要包括三个方面: measure 测量组件本身的大小 layout 确定组件在视图中的位置 draw 根据位置和大小,将组件画出来 视图绘制的起点在ViewRootImpl...child确定尺寸 layout原理总结 整个layout过程比较容易理解,从上面分析可以看出layout也是从顶层父View向子View的递归调用view.layout方法的过程,即父View根据上一步...draw绘制 完成measure和Layout后,ViewRootImpl中的代码会创建一个Canvas对象,然后调用View的draw()方法来执行具体的绘制工。...在获取画布剪切区(每个View的draw中传入的Canvas)时会自动处理掉padding,子View获取Canvas不用关注这些逻辑,只用关心如何绘制即可。

    1.2K40

    面试?看完这篇就够了-深入分析从点击应用图标到应用界面展示

    为什么 Android 系统要通过 socket 的方式让 AMS 向 zygote 发送 fork 应用进程的请求?...AMS 只需向 Zygote 发送一个创建新进程的请求,而无需进行复杂的数据传输和共享。...Zygote 进程在系统启动时创建,它预加载了许多常用的类和资源,为应用程序进程提供了一个初始化好的运行环境。当需要创建新的应用程序进程时,系统会通过 Zygote 进程来 fork 出新的进程。...Zygote 进程为应用程序提供了一个统一的、经过良好测试的运行环境,有助于提高应用程序的稳定性和兼容性。...(即二者不相等)答:人为设置:通过重写View的 layout()强行设置@Overridepublic void layout( int l , int t, int r , int b) {// 改变传入的顶点位置参数

    31530

    源代码分析:LayoutParams的wrap_content, match_parent, 而详细的价值观

    发现view 要么layout初始化,建或者生产活动是很清楚。被添加到父控制,然后开始了相应的生命周期。但父控件的整个界面。还是第一个系统view。 怎么来的,如何初始化和绘制?...) == FORCE_LAYOUT || widthMeasureSpec !...这里的mMinWidth 是layout 属性中的minWidth 或者minHeight。 假设没有写,默认值为零。...由此可见在layout过程中写的最小值在默认情况下的确能够保证view的最小大小。 思考一下,为什么没有提供最大值这个參数呢?...能做就是提供to provide better measurements of their content. 由于内容是自己自己定义的,所以就应该依照自己的需求来计算宽高喽。 并遵循系统的要求。

    57820

    史上最全Android渲染机制讲解(长文源码深度剖析)

    ViewRootImpl是应用进程运转的发动机,可以看到ViewRootImpl内部包含mView、mSurface、Choregrapher,mView代表整个控件树,mSurfacce代表画布,应用的...ActivityThread对象 ActivityThread main执行的第一件事是调用AMS的attacApplicationLock(P0 :6)向大管家汇报:“进程已经启动好了,继续往下启动吧...“房间”存放,PhoneWindow:mDecor就是这个“房间”,attach首先将布局的“房间”建好,等到后续15 onCreate调用到就会调用setContentView使用应用程序开发者提供的布局...(layout)“装饰、填充”这个“房间”。...,接收vsync信号也依赖于Choreographer,我们以一个View控件调用invalidate函数来分析应用如何接收vsync、以及如何更新UI的。

    3.5K11

    高级 UI 成长之路 (三) 理解 View 工作原理并带你入自定义 View 门

    初识 ViewRootImpl 和 DecorView 在介绍 View 绘制的三大流程之前我们有必要先了解下 ViewRootImpl 和 DecorView 基本概念,ViewRootImpl 它是连接...View 的绘制流程是从 ViewRootImpl 的 performTraversals 方法开始的,它经过了 measure 、layout、draw 三个过程才能最终将一个 View 绘制出来,其中...尽量不要在 View 中使用 Handler 这是因为 View 内部本身就提供了 post 系列的方法,完全可以替代 Handler 的作用,当然除非你很明确需要使用 handler 来发送消息。...总结 到这里,自定义 View 相关的知识都已经介绍完了,在阅读该篇文章之前首先要对 View 有一个整体的认识,比如如果在 View 、ViewGroup 中进行 measure ,如何解决 xml...绘制流程是如何进行的。我相信看完该篇文章你对 View 的认识会更加深刻。 本文转自 https://juejin.cn/post/6844904007010517006,如有侵权,请联系删除。

    83440
    领券