您的位置:首页 > 移动开发 > Android开发

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

2017-11-14 08:36 211 查看
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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: