Activity、Window和DecorView的关系及View绘制流程简介

一:,Activity、Window、DecorView三者的关系:

1,Activity是一个应用程序组件,它在屏幕上提供一个区域,可用于显示和交互
2,Window是一个窗口,所有的View都是附着在Window上的,它有一个实现类PhoneWindow
3,DecorView是Activity的根View,会被加载到Window中,它的内部分为垂直方向的两个部分:
Title Bar:屏幕顶部的状态栏
Content:下面的内容部分,我们用的setContentView()方法就是在这个位置加载绘制
在这里插入图片描述

setContentView()方法的调用过程:

public void setContentView(@LayoutRes int layoutResID) {
    getWindow().setContentView(layoutResID);
    initWindowDecorActionBar();
}

内部会首先判断Window对象是否存在,不存在则新创建一个,调用Window.setContentView(),然后再判断DecorView是否存在,不存在同样新创建一个,然后调用其setContentView()方法完成绘制

二:View的绘制流程:

View的绘制是从顶向下的:先绘制最顶层的View、接着绘制子View…一层层向下直至所有View绘制完成。
在这里插入图片描述

总体上绘制分为三个步骤:
1,Measure: 这一步测量所有View的大小,长宽,内部采用深度优先,首先测量根View、然后测量子View…,Measure内有参数MeasureSpac,这是一个32位int型数值,前两位SpacMode代表测量模式: 后30位SpacSize代表大小
UNSPECIFIED: 对于子View的大小,父容器不作限制
EXACTLY: 精确值,比如使用match_parent或者XXXdp,表示父容器已经决定子View的大小,通常情况下是SpacSize
AT_MOST:自适应,对应wrap_content,子容器可以根据内容自己设置尺寸,但是不能超过父容器
2,Layout:这一步确定每个View的位置,同样从最顶层开始,逐层遍历,根据左上右下四个参数确定位置
3,Draw:开始绘制,同样自顶向下,每个View都会调用子View的Draw()方法,

按照背景、内容、子View、装饰四个步骤逐层绘制。
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值