android 界面绘制

本文详细阐述了Android界面从启动Activity到绘制的过程,涉及到Activity、PhoneWindow、DecorView、ViewRoot和WindowManagerService的角色。在Activity创建并设置内容视图后,通过ViewRoot将DecoView加入WindowManager,SurfaceFlinger负责合成显示。核心函数performLaunchActivity和performTraversals在绘制流程中起关键作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先亮出几个类:

Activity:基本页面单元

PhoneWindow:每个Activity均会创建一个,内部包含一个DecorView对象,是一个把FrameLayout进行了一定的包装,并提供了一组通用的窗口操作接口。

DecorView:PhoneWindow的子类,包含Activity的所有UI部件,接收用户发起的event事件,如按键等.

ViewRoot:向DecorView分发用户event事件,与WindowManageService交互完成View的绘制.
WindowManageService:对系统中所有窗口进行管理.


上图简单描述了绘制界面时各个成员之间的相互关系。

ActivityManagerService创建Activity线程,激活一个activity
系统调用Instrumentation.newActivity创建一个activity
Activity创建后,attach到一个新创建的phonewindow中。这样Activity获取一个唯一的WindowManager服务的实例
Activity创建过程中使用setcontentView设置用用户UI,这些VIEW被加入到PhoneWindow的ContentParent中。
Activity线程继续执行,当执行到Activity.makeVisible是将根view DecoView加入到WindowManger中,WindowManger实全会为每个DecoView创建对应的ViewRoot
每个ViewRoot拥有一个Surface,每个Surface将会调用底层库创建图形绘制的内存空间。这个底层库就是SurfaceFlinger。SurfaceFlinger同时也负责将个View绘制的图形合到一块(按照Z轴)显示到用户屏幕



上图是从启动Activity到创建View的过程

在上图中,performLaunchActivity函数是关键函数,除了新建被调用的Activity实例外,还负责确保Activity所在的应用程序启动、读取manifest中关于此activity设置的主题信息以及上图中对“6.onCreate”调用也是通过对mInstrumentation.callActivityOnCreate来实现的。图中的“8. mContentParent.addView”其实就是架构图中phoneWindow内DecorView里面的ContentViews,该对象是一个ViewGroup类实例。在调用AddView之后,最终就会触发ViewRoot中的scheduleTraversals这个异步函数,从而进入ViewRoot的performTraversals函数,在performTraversals函数中就启动了View的绘制流程。

下面是performTraversal()函数中最重要的部分代码。

 
private void performTraversals () {
final View host = mView ;
...
host . measure ( childWidthMeasureSpec , childHeightMeasureSpec );
...
host . layout ( 0 , 0 , host . getMeasuredWidth (), host . getMeasuredHeight ());
...
draw ( fullRedrawNeeded );
}
主要包含三个步骤
1.measure 测量过程是先测量父视图,再测量子视图,父视图一定是充满屏幕的,子视图的位置由父视图和子视图本身共同决定 2.layout 确定视图位置,先设置父视图位置,在循环子视图,父视图位置一定程度上决定了子视图位置。 3.draw   dispatchDraw()内部for循环调用drawChild()分别绘制每一个子视图,而drawChild()内部又会调用draw()函数完成子视图的内部绘制工作
具体内容参照点击打开链接
补充下屏幕事件传递:首先WindowManageService接收到事件,然后传递给相应的ViewRoot,再传递给相应的DecoView,DecoView然后传递给他锁包含的View




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值