返回
1. **测量 (measure)** - ViewRootImpl.measureHierarchy() 函数从根节点开始,依次调用每个视图的 measure() 方法,计算出每个视图的大小。 - measure() 方法会调用 onMeasure() 方法,该方法由开发者实现,用于计算视图的大小。 - onMeasure() 方法可以指定视图的宽高,也可以根据父视图的大小来计算自己的大小。 2. **布局 (layout)** - ViewRootImpl.performLayout() 函数从根节点开始,依次调用每个视图的 layout() 方法,确定每个视图的位置。 - layout() 方法会调用 onLayout() 方法,该方法由开发者实现,用于确定视图的位置。 - onLayout() 方法可以指定视图的位置,也可以根据父视图的位置来计算自己的位置。 3. **绘制 (draw)** - ViewRootImpl.performDraw() 函数从根节点开始,依次调用每个视图的 draw() 方法,将每个视图绘制到屏幕上。 - draw() 方法会调用 onDraw() 方法,该方法由开发者实现,用于绘制视图的内容。 - onDraw() 方法可以使用 Canvas 对象来绘制图形、文本等内容。
### 优化绘制
为了提高绘制性能,可以采用以下优化措施:
- 避免使用过多的嵌套布局,因为这会增加布局的复杂性,导致绘制速度变慢。 - 避免使用过大的视图,因为这会增加绘制的内存消耗,导致绘制速度变慢。 - 使用硬件加速,可以通过在布局中添加 android:hardwareAccelerated="true" 属性来启用硬件加速。 - 使用 ViewStub,ViewStub 是一个占位符视图,它只在需要时才被加载和绘制。 - 使用 RecyclerView,RecyclerView 是一个高效的列表视图,它可以回收利用视图,从而减少绘制次数。
Android View 绘制流程全解析
见解分享
2023-12-04 05:07:58
Android View 绘制流程详解
当 Android 系统启动一个 Activity 时,会创建一个 ViewRoot 对象,该对象负责管理 Activity 的整个视图层次结构,包含该 Activity 的根布局和它下面的所有子视图。当 Activity 接收到焦点的时候,它会被请求绘制布局,该请求由 Android framework 处理。绘制是从根节点开始,对布局树进行测量 (measure) 和绘制 (draw)。整个 View 树的绘图流程在 ViewRoot.java 类的 performTraversals() 函数中。
绘制流程
1. **测量 (measure)** - ViewRootImpl.measureHierarchy() 函数从根节点开始,依次调用每个视图的 measure() 方法,计算出每个视图的大小。 - measure() 方法会调用 onMeasure() 方法,该方法由开发者实现,用于计算视图的大小。 - onMeasure() 方法可以指定视图的宽高,也可以根据父视图的大小来计算自己的大小。 2. **布局 (layout)** - ViewRootImpl.performLayout() 函数从根节点开始,依次调用每个视图的 layout() 方法,确定每个视图的位置。 - layout() 方法会调用 onLayout() 方法,该方法由开发者实现,用于确定视图的位置。 - onLayout() 方法可以指定视图的位置,也可以根据父视图的位置来计算自己的位置。 3. **绘制 (draw)** - ViewRootImpl.performDraw() 函数从根节点开始,依次调用每个视图的 draw() 方法,将每个视图绘制到屏幕上。 - draw() 方法会调用 onDraw() 方法,该方法由开发者实现,用于绘制视图的内容。 - onDraw() 方法可以使用 Canvas 对象来绘制图形、文本等内容。
### 优化绘制
为了提高绘制性能,可以采用以下优化措施:
- 避免使用过多的嵌套布局,因为这会增加布局的复杂性,导致绘制速度变慢。 - 避免使用过大的视图,因为这会增加绘制的内存消耗,导致绘制速度变慢。 - 使用硬件加速,可以通过在布局中添加 android:hardwareAccelerated="true" 属性来启用硬件加速。 - 使用 ViewStub,ViewStub 是一个占位符视图,它只在需要时才被加载和绘制。 - 使用 RecyclerView,RecyclerView 是一个高效的列表视图,它可以回收利用视图,从而减少绘制次数。