Android View工作原理:测量、布局、绘制流程 & 自定义View

#.概述
##.PhoneWindow中的DecorView是根布局
     Android中Window是显示和管理View的载体,其实现类是PhoneWindow。
    所有View是按照树的逻辑结构来管理的,父View有多个子View节点,子View节点又可以有多个View节点。
    而这棵View树的根节点是PhoneWindow中的根布局,一个DecorView,DecorView由两部分构成:
            ActionBar(操作条区域,顶部用于显示标题和几个操作按钮的区域)
            contentParent(内容区域)。
    其中actionBar可根据需要来设置,不一定总是有。用户自己自己写的界面最终可通过PhoneWindow.setContentView()方法添加到内容区域。
##.显示流程概述
View的正常显示流程分三大步骤:(这里的View泛指ViewGrop和非ViewGrop的View)
1.测量阶段:计算View自身的长、宽大小,并触发各个子View的测量过程;
2.布局阶段: 计算View在父布局中的位置(即其在父布局中的上下左右坐标),并触发各个子View的布局过程;
3.绘制阶段:将 View绘制在屏幕上,并触发各个子View的绘制过程;
    其中,每个过程都是自顶向下递归进行的:父View处理完自己的本阶段流程,然后会循环遍历调用子View的本阶段流程;子View处理完自己的本阶段路程后,又会继续循环遍历调用它的子View本阶段流程;…….不断重复该流程…….直到View树中每个节点都被处理完。
ViewRoot,实现类为ViewRootImpl,是连接WindowManager和DecorView的纽带,以上三个过程在最初始都是由ViewRoot来发起的。
#.具体流程
三个流程的链条如上图所示,最初由ViewRoot的performTraversals()方法来依次触发顶层View(DecorView)的performMeasure()、performLayout()、performDraw()方法,然后沿着View树结构自顶向下,依次递归传递下去。
##.measure(测量)阶段的传递链条
ViewRoot根据PhoneWindow尺寸和DecorView的LayoutParams信息,计算出顶层作为顶层View的DecorView的宽高MeasureSpec信息,
通过performTraversals(【宽高的MeasureSpec测量信息】)来触发其 measure(【宽高的MeasureSpec测量信息】):
(位于View树顶层的DecorView)
触发顶层View(即DecorView)的 onMeasure(【宽高的MeasureSpec测量信息】) :
                                        ——> 设置自身的测量尺寸宽高:最终是通过setMeasuredDimension(【宽高】)等方法来设置; 
                                        ——>根据自身的宽高MeasureSpec信息 和 子View的LayoutParams,计算出子View的宽高MeasureSpec信息
                                        ——>遍历调用子View的 measure(【宽高的MeasureSpec测量信息】)
(位于View树中间层的ViewGroup)
触发下一层父ViewGroup的 onMeasure(【宽高的MeasureSpec信息】) :
                                        ——> 设置自身的测量尺寸宽高:最终是通过setMeasuredDimension(【宽高】)等方法来设置;
                                        ——>根据自身的宽高MeasureSpec信息 和 子View的LayoutParams,计算出子View的宽高MeasureSpec信息
                                        ——>遍历调用子View的 measure(【宽高的MeasureSpec测量信息】)
…………………………不断递归重复该过程
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值