(Android)安卓渲染机制相关知识点

1、View的绘制过程

Activity关联原理图

(1)创建和设置

Window是独占一个Surface实例的显示区域,Window为抽象类,PhoneWindow为唯一实现类。setContentView时会调用该是实现类的setContentView()方法,该方法再调用LayoutInflater.inflate(),并传入了decorView作为LayoutInflater.inflate()root参数,开始遍历XML文件进行ActivityContentView的创建与设置工作。

(2)绘制

View的绘制由ViewRoot负责,ViewRootActivity启动时ActivityThread调用WindowManager.addView()DecorView关联(onCreate() - onResume生命周期走完之后),关联后ViewRootImpl类的requestLayout()方法会被调用

requestLayout -> scheduledTraversals() -> mChoreographer.postCallBack() -> 参数中传入TraversalRunnable(为一个Runnable) -> doTraversal() -> performTraversals() -> 开始绘制流程

整个绘制流程分为三个阶段:

  • measure: 判断是否需要重新计算View的大小,需要的话则计算;
  • layout: 判断是否需要重新计算View的位置,需要的话则计算;
  • draw: 判断是否需要重新绘制View,需要的话则重绘制。

每个Activity的根布局都是DecoView,DecoView的parent是ViewRootImpl
在这里插入图片描述

2、屏幕刷新过程

(1)步骤

屏幕刷新三个步骤:CPU处理显示逻辑 -> GPU进一步处理和缓存 -> display将buffer中的数据显示出来(16.6ms)
刷新周期

(2)必须UI线程更新UI

更新UI,实际上是将View的变化,通知到ViewRootImpl,由ViewRootImpl实现后续操作,并且这些操作所在的线程必须和UI线程在同一个线程。否则就会出现,UI线程正在绘制页面,而另外能操作UI的线程对View进行了操作,当UI线程绘制完上方的View后,这个被其他线程操作后的View的很有可能会覆盖到其他View之上,无法保证同一帧数据的完整性。即控制View绘制的线程和通知View更新的线程必须是同一线程。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值