剖析Android UI绘制之解析布局资源,完成布局
2023-11-10 02:42:35
当用户在Activity中调用setContentView方法,系统将Activity关联到我们指定的布局资源文件中,而Activity通过内部持有的window对象完成视图的绘制工作,实际上,window持有的具体实例是PhoneWindow。
首先,系统从主题获取布局文件的资源引用,它是一个ID,然后在应用程序的资源目录中找到相应的布局文件,将它解析成一个抽象语法树(AST),再基于AST创建出视图实例(View对象),包括ViewGroup和View,形成一个视图树,完成布局解析阶段。
在绘制阶段,系统根据视图树遍历所有视图,计算出每个视图的大小和位置,然后遍历所有视图,逐个绘制。对ViewGroup来说,绘制过程就是调用每个子视图的draw方法。
解析布局文件
布局文件以XML格式编写,包含一系列布局元素,每个元素代表一个View对象,比如LinearLayout、Button、TextView等。在解析布局文件的过程中,系统会创建一个AST,其中包含了每个View对象的类型及其属性。
生成View对象
基于AST,系统将每个View对象的类型及其属性映射到相应的View类,并创建View对象实例。这个过程称为View实例化。View实例化完成后,系统将它们组织成一个视图树,其中每个View对象都是其父视图的子视图。
测量和布局视图
在视图树创建完成后,系统将对每个View对象进行测量和布局,以确定其大小和位置。测量过程会计算出每个View对象的内容大小,布局过程则会根据View对象的测量结果和父视图的布局规则,计算出每个View对象在父视图中的位置和大小。
绘制视图
在完成测量和布局后,系统将遍历视图树,逐个绘制每个View对象。对ViewGroup来说,绘制过程就是调用每个子视图的draw方法。而对于View来说,绘制过程就是根据其内容和属性,在Canvas上绘制相应的图形。
影响布局性能的因素
- 布局层次过多:布局层次过多会导致视图树深度增加,从而增加布局和绘制的复杂度,降低性能。
- 布局嵌套过多:布局嵌套过多会导致视图树结构复杂,增加布局和绘制的难度,降低性能。
- 使用复杂布局:使用复杂的布局,如ConstraintLayout、GridLayout等,会增加布局和绘制的复杂度,降低性能。
- 使用过多的视图:使用过多的视图会增加布局和绘制的复杂度,降低性能。
- 使用过大的视图:使用过大的视图会增加布局和绘制的复杂度,降低性能。
- 使用不合适的属性:使用不合适的属性,如wrap_content和match_parent,会增加布局和绘制的复杂度,降低性能。
优化布局性能的策略
- 减少布局层次:尽量减少布局层次,以降低视图树的深度,从而提高布局和绘制的性能。
- 减少布局嵌套:尽量减少布局嵌套,以降低视图树的复杂度,从而提高布局和绘制的性能。
- 使用简单的布局:尽量使用简单的布局,如LinearLayout、FrameLayout等,以降低布局和绘制的复杂度,从而提高性能。
- 减少视图数量:尽量减少视图数量,以降低布局和绘制的复杂度,从而提高性能。
- 减少视图大小:尽量减少视图大小,以降低布局和绘制的复杂度,从而提高性能。
- 使用合适的属性:尽量使用合适的属性,如wrap_content和match_parent,以降低布局和绘制的复杂度,从而提高性能。