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"/>
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.
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.