优化Layout布局层级

一个常见误区是认为使用基本布局(layout)结构更能构建高效的布局。然而,添加到应用中的每个控件和布局都需要初始化、布局和绘制。例如,使用嵌入式的LinearLayout会导致过深的视图(view)层级结构(即view树的深度值会很大)。而且,嵌入一些使用了权重的LinearLayout代价可能是非常昂贵的,因为每个子视图(child view)都需要被测量(measure)两次。当布局被多次重复加载(比如在ListView和GridView中使用的项布局)时,就更值得注意了。
从本文中,将学会使用Hierarchy Viewer和Layoutopt来测试和优化布局。

1 审查布局

Android SDK tools文件夹中包含一个Hierarchy Viewer工具,开发人员可以使用该工具来分析程序运行时的布局状态。使用该工具可以帮助开发人员发现布局中的性能瓶颈。
Hierarchy Viewer会让你在已连接的真机或模拟器上选择一个正在运行的进程,然后显示它的布局树型结构(即view树)。每个view块上的状态灯代表了它在测量、布局和绘制时的性能,以帮助开发人员识别出潜在的问题。

例如,图1显示了一个ListView中的一个项布局。该项布局里,左边显示一张小的bitmap图片,右边显示两个层叠的文本项。值得注意的是,该布局会被多次加载。因此,一次优化,多次受益,在性能上会达到事半功倍的效果。
图 1 ListView中项的逻辑布局
将目录切换到/tools/ 下就可以找到 hierarchyviewer工具了。当打开hierarchyviewer后,首先会显示一个可用设备列表和它们的组件。点击“Load View Hierarchy ”来查看选中组件的布局层级结构。例如,图2显示了图1中指出的列表项的布局。
图1中的布局层级结构,使用的是嵌入式的LinearLayout
点击一个层级节点会显示它的执行时间
图2中有一个三层的布局结构,且表明展开的文本项有问题。点击每项会显示view绘制过程中每个阶段耗费的时间(如图3)。这样,哪个view在测量、布局和渲染阶段花费的时间最长就清晰可见了,开发人员也知道优化哪儿了。
在该布局中整个列表项渲染完成的时间花费是:
Measure:0.977 ms
Layout:0.167 ms
Draw:2.717 ms

2 修正布局

上面的布局由于使用嵌入式的LinearLayout而降低了性能,该性能可以通过使布局层级扁平化来获得提升,即使布局层级浅而宽,而不是窄而深。考虑使用RelativeLayout就能实现这样的布局。所以,转换为RelativeLayout布局后,就能看到变成了两层的布局结构,可以像下面这样审查新的布局:
图1使用RelativeLayout后的布局层级结构
现在列表项渲染的时间花费是:

Measure:0.598 ms
Layout:0.110 ms
Draw:2.146 ms

可能看起来是一个很小的提升,但由于布局会在列表项中重复使用,该时间会被累加,从整体来说,性能提升效果就明显了。
这个时间差主要是由LinearLayout的layout_weight属性所引起的,权重会放缓测量的速度。上面仅是一个怎样合理使用布局的例子,并且是否使用权重来布局开发人员应该仔细考虑。

3 使用Lint

运行Lint工具来寻找布局层级中可能的优化方法,是一个很好的实践。Lint已经取代了Layoutopt工具并且拥有更强大的功能。Lint一些原则如下:
- 使用合成图片(compound drawables)-处理包含一个ImageView和TextView的LinearLayout的复合布局可能更加高效。
- 合并根帧(Frame)-如果FrameLayout是一个布局的根元素,并且没有提供背景或填充间隔(padding)等,那么可以使用更高效的标签代替。
- 无用的叶子节点(即view树的叶子)-为了使布局层级更加漂亮、高效,应该将那些没有子节点或没有背景的布局元素给移除(因为它们是不可见的)。
- 无用的父节点-具有子节点但没有兄弟节点,不是一个ScrollView或根布局元素,并且没有背景的布局应该被移除,让子节点直接移到父节点的位置。这样可以使布局层级更加漂亮、高效。
- 深度布局-具有很多嵌套的布局在性能表现上是很糟糕的。可以考虑使用更加漂亮的布局,比如RelativeLayout和GridLayout,来提升性能。View树的默认深度值是10。
Lint的另一个好处是它集成在Android Studio 中。无论开发人员何时编译程序,Lint都会自动运行。
在Android Studio中,开发人员也可以单独运行Lint来审查特定的构建体或所有的构建体。
开发人员也可以管理审查选项,在Android Studio中打开File->Settings->Project Settings选项来配置审查。审查配置页会显示所有支持的审查项目。
审查配置
Lint也有自动修复,提供建议,直接跳转到预览视图中对应代码处的能力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值