第十六篇:Android 性能优化之布局优化

来源:互联网 发布:东华软件面试题 编辑:程序博客网 时间:2024/06/07 10:26
1.使用<include>复用布局资源文件layout.
2.使用<merge>防止嵌套时候产生多余的嵌套层级。
使用merge的前提条件就是merge标签必须是当前xml布局的根标签.
3.使用viewStub来延迟加载布局或组件,替代组件的GONE或INVISIABLE.
4.尽可能的减少层级、减少控件数量,并达到同样的ui效果(使用Hierarchy View检测布局嵌套层次).
在 AS 工具栏中点击 Tools–>Android–>Android Device Monitor–>DDMS左边按钮open -->>Hierarchy 


View。


1)用TextView同时显示图片和文字.
2)使用TextView的行间距.(android:lineSpacingExtra="8dp"设置行间距为8dp ,加上文字的\n 换行符,实


现多行text).
lineSpacingExtra属性代表的是行间距,他默认是0,是一个绝对高度值。


一般,只用于详情页面 显示Text,如果里面的某个Text是有点击事件的,则不适合使用该种方法。
3)使用Spannable、ClickableSpan或Html.fromHtml 来减少TextView的数目.
4)用LinearLayout自带的分割线.android:divider="@drawable/divider"


其中divider.xml是分隔线样式。
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape="rectangle">


    <size android:width="1dp"
          android:height="1dp"/>


    <solid android:color="#e1e1e1"/>


</shape>
5)使用Space控件替代View来设置行与行的间隔。


如果要给条目中间添加间距,怎么实现呢?当然也很简单,比如添加一个高10dp的View,或者使用


android:layout_marginTop="10dp"等方法。但是增加View违背了我们的初衷,并且影响性能。使用过多的margin其实会影响代


码的可读性。这时你就可以使用Space,他是一个轻量级的。


<Space
           android:layout_width="match_parent"
           android:layout_height="15dp"/>


Space:空间的意思,表示该控件占据一定的空间,但是却不显示任何东西。

注意:Space控件不能设置背景色,原因是Space控件再它的构造方法中使得他不可见但占用位置,固设置背景颜色无效。



5.调试GPU过度绘制,来避免overdraw.
overdraw产生的原因无外乎:复杂的Layout层级,重叠的View,重叠的背景这几种.
你可以在手机打开 设置—->开发者选项—->调试GPU过度绘制.
Overdraw 的处理方案一:移除不必要的background.
6.Android最新的布局方式ConstaintLayout来创建复杂布局。代替RelativeLayout.(好像暂时还没有正式版的jar,所以这种方法可能还不能用)
7.其他小技巧:


1).RelativeLayout会让子View调用2次onMeasure,LinearLayout 在有weight时,也会调用子View2次onMeasure,否则


一次测量。
2).在不影响层级深度的情况下,使用LinearLayout和FrameLayout而不是RelativeLayout。
3).需要用两层LinearLayout嵌套时,尽量用一个RelativeLayout,此时RelativeLayout耗时更小。另外,


LinearLayout慎用layout_weight,会增加一倍耗时操作。




4).使用 layer-list 画线来代替图片。


<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape>
            <solid android:color="#DADADA" />
        </shape>
    </item>
    <item android:bottom="1px">
        <shape>
            <solid android:color="@color/white" />
        </shape>
    </item>
</layer-list>




总结:


两种检测手段:调试GPU过度绘制或使用Hierarchy View查看布局层级结构。
其他都是解决问题的办法。


参考文章:
1.http://blog.csdn.net/guolin_blog/article/details/43376527
2.http://www.jianshu.com/p/145fc61011cd
3.http://blog.csdn.net/feiduclear_up/article/details/46670433
4.http://blog.csdn.net/lmj623565791/article/details/45556391
5.http://blog.csdn.net/zhaizu/article/details/49591379
6.http://blog.csdn.net/a_long_/article/details/52123792


补充:开启了ddms,无法run app,这是为什么?


注意开启了Instant Run,需要同时在AS-->>Tools-->>Android-->>Enable ADB integration 将这个勾选, 然


后重启下模拟器就可以了。


如果没有开启Instant Run,则不需要开启ADB整合(Enable ADB integration).




注意:如果还不显示Hierarchy Viewer的视图,请右键Hierarchy Viewer图标,选择Reset.
原创粉丝点击