使用基本布局结构导致最有效的布局是一种常见的误解。
但是,添加到应用程序的每个窗口小部件和布局都需要初始化,布局和绘图。
例如,使用LinearLayout
的嵌套实例可能会导致视图层次结构过深。
此外,嵌套使用layout_weight
参数的多个LinearLayout
实例可能特别昂贵,因为每个子项需要测量两次。 当布局重复膨胀时(例如在ListView
或GridView
中使用时),这一点尤其重要。
在本课程中,您将学习如何使用Hierarchy Viewer
和Lint
来检查和优化布局。
一、检查您的布局
Android SDK
工具包含一个名为Hierarchy Viewer
的工具,允许您在应用程序运行时分析布局。 使用此工具可帮助您发现布局性能的瓶颈。
层次结构查看器的工作原理是允许您在连接的设备或模拟器上选择正在运行的进程,然后显示布局树。 每个街区的交通灯代表其测量,布局和绘图性能,帮助您识别潜在问题。
例如,图1显示了用作ListView
中项目的布局。 此布局在左侧显示一个小位图图像,在右侧显示两个堆叠的文本项。 特别重要的是,将多次膨胀的布局(例如此布局)进行优化,因为性能优势将成倍增加。
层次结构查看器显示可用设备及其运行组件的列表。 从Windows选项卡中选择组件,然后单击“层次结构视图”以查看所选组件的布局层次结构。 例如,图2显示了图1所示的列表项的布局。
二、修改你的布局
由于嵌套的LinearLayout
导致上面的布局性能变慢,因此通过展平布局可以提高性能 - 使布局浅而宽,而不是窄而深。 作为根节点的RelativeLayout
允许这样的布局。 因此,当将此设计转换为使用RelativeLayout
时,您可以看到布局变为2级层次结构。 检查新布局如下所示:
由于这种布局用于列表中的每个项目,因此它们的好处尽可能小。
大部分差异是由于在LinearLayout
设计中使用layout_weight
,这会降低测量速度。 这只是每个布局如何具有适当用途的一个示例,您应该仔细考虑是否需要使用布局权重。
在一些复杂的布局中,系统可能浪费多于一次测量相同UI
元素的工作量。 这种现象称为双重征税。 有关双重征税以及如何防止双重征税的详细信息,请参阅“绩效”和“查看层次结构”。
三、使用Lint
在布局文件上运行lint工具以搜索可能的视图层次结构优化始终是一种好习惯。 Lint
取代了Layoutopt
工具并具有更多功能。 一些例子:
使用复合
drawable
- 包含ImageView
和TextView
的LinearLayout
可以作为复合drawable
更有效地处理。合并根框架 - 如果
FrameLayout
是布局的根,并且不提供背景或填充等,则可以使用稍微更高效的合并标记替换它。无用的叶子 - 对于更平坦和更有效的布局层次结构,通常可以删除没有子项或没有背景的布局(因为它是不可见的)。
无用的父级 - 具有没有兄弟姐妹的子级的布局,不是ScrollView或根布局,并且没有背景,可以删除并将其子项直接移动到父级以获得更平坦和更高效的布局层次结构。
深度布局 - 嵌套太多的布局对性能不利。 考虑使用更平坦的布局(如RelativeLayout或GridLayout)来提高性能。 默认最大深度为10。
Lint
的另一个好处是它已集成到Android Studio
中。 无论何时编译程序,Lint
都会自动运行。 使用Android Studio
,您还可以针对特定构建变体或所有构建变体运行lint
检查。
您还可以使用“文件”>“设置”>“项目设置”选项管理检查配置文件并在Android Studio
中配置检查。 将显示“检查配置”页面,其中包含支持的检查。
Lint
能够自动修复某些问题,为其他人提供建议并直接跳转到违规代码以供审核。