1.使用带有layout_weight属性的LinearLayout,它能减缓测量过程的速度。即每个布局都应该合适地被使用以及你应该认真考虑是否有必要采用“layout_weight" 属性。
2、无用的叶子节点 --- 通常来说如果一个布局控件没有子视图或者背景图片,那么该布局控件时可以被移除 (由于它处于 invisible状态)。
3、无用的父节点 --- 如果一个父视图即有子视图,但没有兄弟视图节点,该视图不是ScrollView控件或者根节点,并且它没有背景图片,也是可以被移除的,移除之后,该父视图的所有子视图都直接迁移至之前父视图的布局层次。同样能够使解析布局以及布局层次更有效。
4、过深的布局层次 --- 内嵌过多的布局总是低效率地。通过扁平化布局文件----让布局变得更浅更宽,而不是变得更窄更深层次 ,这样就能提升效率了。考虑使用一些扁平的布局控件,例如RelativeLayout、GridLayout,来改善布局过程。默认最大的布局深度为10。
5.使用include 标签复用布局文件
为了更有效率复用的布局文件,你可以使用以及标签将其他的布局文件加入到当前的布局文件中。
1、创建一个可复用性的布局文件
如果你已经知道复用布局的”面貌”,那么创建、定义布局文件( 命名以”.xml”为后缀)。自定义标题(titlebar.xml):
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/titlebar_bg" >
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/gafricalogo" />
</FrameLayout>
2、使用标签
在需要添加这些布局的地方,使用标签。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/app_bg"
android:gravity="center_horizontal"
android:orientation="vertical" >
<include layout="@layout/titlebar" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp
android:text="@string/hello" />
</LinearLayout>
你也可以在节点中为被添加的布局文件的root View定义特别标识,重写所有layout参数即可(任何以“android:layout_”为前缀的属性)。例如:
<include android:id="@+id/news_title"
android:layout_width="match_parent"
android:layout_height="match_parent"
layout="@layout/title"/>
3、使用标签
当在布局文件中复用另外的布局时, 标签能够在布局层次消除多余的视图元素。内嵌地LinearLayout只能减缓UI效率
6. 为了避免迟缓的UI效果或者运行的停顿,必须确保你的动画一直运行在每秒60帧。越少越好
另一方面需要减少onDraw()方法中的开销,只在需要时才调onDraw()方法。通常invalidate()方法会调用调用它的重载版本即带有参数的invalidate()方法而不是无参的invalidate()方法。该带参数的方法invalidate()能使draw过程更有效,以及减少对落在该矩形区域(参数指定的区域)外视图的不必要重绘。
7.如果你有的UI设计是复杂地,你应该考虑设计一个自定义ViewGroup来实现layout过程。不同于内置View控件,自定义View能够假定它的每个子View的大小以及形状,同时能够避免为每个子View进行measure过程。 PieChart展示了如何继承ViewGroup类。 PieChart带有子View,但它从来没有measure它们。相反,它根据自己的布局算法去直接设置每个子View的大小。
PieChart 示例中,例如,相对来说绘制一个圆形是比较耗费资源的。每次旋转引起的重绘导致UI的迟缓。解决办法就是让View来呈现该圆形,并且设置该View的layer type属性为 LAYER_TYPE_HARDWARE,因此GPU能够缓存静态图片。示例中该View作为 PieChart类的内部类存在,减少了为了实现这个方法的代码开销。