10.1.1 Android UI渲染机制
1000/60=16ms,UI运行非常流畅,此时我们看到的UI界面将是非常流畅的,如果UI不能在16ms内完成绘制,将会出现丢帧现象,造成画面卡顿。
Android系统提供了检测UI渲染时间的工具,”开发者选项“中的”Profile GPU Rending“,并选中”On screen as bars“,(无图)
10.1.2避免Overdraw
过度绘制,Android系统在开发者选项中提供了”Enable GPU Overdraw“,激活后,可显示Overdraw次数。
10.1.3优化布局层级
因为在Android中,系统对View的测量、布局和绘制都是要通过对View树的遍历来进行操作的,所以我们尽可能的降低这棵树的高度,Google在API文档中建议VIew的高度不超过10层,RelativeLayout布局属于扁平型,有利于降低布局树的高度,从而提高UI渲染的效率。
10.1.4避免嵌套过多无用布局‘
10.1.4.1 使用<include>标签重用Layout
目的就是可以让通用的UI在不同的Layout组件中都可以被调用,简单的代码如下:
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="0dp"
android:layout_height="0dp"
android:textSize="30sp"
android:gravity="center"
android:text="Call_me_Mr_Qian">
</TextView>
代码中只有一个TextView,宽和高都给了我0dp,这样我们才能迫使开发者对宽高进行赋值,否则不可见。
下面是如何使用include标签的代码,非常简单,
<include layout="@layout/textdemo"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
显示的效果如下
10.1.4.2 使用<ViewStub>实现View的延迟加载
ViewStub是一个非常轻量级的组件,不仅不可视而而且大小为零。主要作用是延迟加载,初始化时不加载,点击某个按钮时才会显示出来,举个栗子:
private View.OnClickListener monClicklistener=new View.OnClickListener() {
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btn_visible:
//Visible方法
vs_show.setVisibility(View.VISIBLE);
break;
case R.id.btn_inflate:
//inflate方法,该方法可以返回引用的布局,从而可以找到布局文件
View inflateView=vs_show.inflate();
TextView tv_call= (TextView) inflateView.findViewById(R.id.tv_call);
tv_call.setText("callMeMrQian");
break;
}
}
};
点击的效果分别是:
注意无论是哪种方式,一旦ViewStub被设置为可见或者被inflate了,viewStub就不存在了,取而代之的是被Inflater的Layout,并将这个Layout的ID重新设置为ViewStub中通过android:inflateId属性所指向的ID,所以调用两次inflate会报错;
10.1.5 Hierarchy Viewer
检测布局是否冗长,很实用的优化工具。