
(1)PhoneWindow:AndroID系统中最基本的窗口系统,继承自Window类,负责管理界面显示以及事件响应,是Activity和VIEw系统交互的接口。
(2)DecorVIEw:PhoneWindow中的起始点VIEw,继承于VIEw类,作为整个视图容器使用,用于设置窗口属性,本质上是一个FrameLayout。
(3)VIEwRoot:在Activity启动时创建,负责管理布局,渲染窗口UI
VIEwRoot对应于VIEwRootImpl类,它是连接WindowManager和DecorVIEw的纽带,VIEw的三大流程均通过VIEwRoot来完成,在ActivityThread中,Activity被创建以后,会将DecorVIEw添加到Window中,同时创建VIEwRootImpl对象,并将VIEwRootImpl对象和DecorVIEw建立关联(通过VIEwRoot的setVIEw方法)。
1.3.VIEw的绘制流程VIEw的绘制流程是从VIEwRoot的PerformTraversals方法开始的,经过measure,layout,draw三个过程最终将一个VIEw绘制出来。
measure(测量):测量VIEw的宽高。 layout(布局):确定VIEw在父布局中的放置位置。 draw(绘制):负责将VIEw绘制在屏幕上measure过程分为两类,普通的VIEw通过measure方法后就完成了它的测量过程,而VIEwGroup除了自己的测量过程外,还会遍历所有子元素的measure方法,子元素再递归执行。
VIEw的measure过程:是一个final方法,不可重写,在该方法中会调用onMeasure方法。onMeasure方法中会调用getDefaultSize方法返回测量后的VIEw的大小,getDefault方法中会调用getSuggesteDWIDth和getSuggestedHeight方法(这两个方法在没有指定背景的情况下,返回的是minSize这一属性对应的值,在指定了背景的情况下,返回的是背景的getMinimumWIDth/getMiniumHeight方法对应的值)。VIEw的宽高由specsize决定,因此直接继承自VIEw的控件需要重写onMeasure方法并设置wrap_content时自身的大小否则在布局文件中使用wrap_content就相当于使用match_parent。
VIEwGroup的measure过程:VIEwGroup除了完成自己的measure过程,还会遍历调用子元素的measure方法,然后子元素再递归执行。VIEwGroup是一个抽象类,因此没有重写VIEw的onMeasure方法,但他提供了measureChildren方法,他会取出子元素的LayoutParams,通过getChildMeasureSpec方法创建子元素MeasureSpec,然后传递给VIEw的measure方法进行测量,VIEwGroup没有定义具体的测量过程具体测量过程的onMeasure需要子类来实现,由于子类特性可能很大不同,无法统一处理。(一般获取VIEw宽高可以在onWindowFocusChanged中获取,此时VIEw已经测量完毕了)
Layout的作用是VIEwGroup用来确定子元素的位置,当VIEwGroup的位置被确定后,他在onLayout中会遍历所有子元素并调用其layout方法,在layout方法中onLayout方法又会被调用,layout方法确定vIEw的位置,onLayout方法确定所有子元素位置。
layout方法的流程:首先通过setFrame方法来设定VIEw的四个顶点的位置即初始化mleft,mRight,mtop,mBottom这四个值,VIEw的四个顶点确定,在父容器中的位置也就确定了,接着会调用onLayout方法,父容器来确定子元素的位置,onLayout方法的实现和具体布局有关。
vIEw的绘制过程主要分为四步
绘制背景background.draw(canvas) 绘制自己onDraw 绘制children(dispatchDraw) 绘制装饰(onDrawScollbars)vIEw绘制过程的传递是通过diapatchDraw实现,该方法会遍历调用所有子元素的draw方法这样draw方法就能一层层传递下去了。
setwillNotDraw:如果一个vIEw不需要绘制任何内容,在我们设定这个标记为true时,系统会做相应的优化,vIEw一般不启用,vIEwgroup默认启用自定义控件继承自vIEwGroup并且不具备绘制功能时,可以开启这个标记方便系统进行优化1.4.MeasureSpec
MeasureSpec代表一个32位的int值,高两位代表SpecMode(测量模式),低30位代表Specsize(在某种测量模式下的规格大小)
SpecMode有三类:
以上是内存溢出为你收集整理的Android View(View的工作原理)全部内容,希望文章能够帮你解决Android View(View的工作原理)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)