布局优化

布局优化:

过度绘制:
通过开发者选项的 Debug GPU overdraw选项可以开启过度绘制调试模式布局优化_第1张图片例:
有如下布局:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#FFFFFF">						设置了背景色

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="500dp"
        android:background="#FFFFFF">					设置了背景色

        <TextView
            android:layout_width="match_parent"
            android:layout_height="100dp"
            android:gravity="center"
            android:text="test"
            android:background="#FFFFFF"/>				设置了背景色
    FrameLayout>

FrameLayout>

结果发现TextView区域绘制了三次;

去掉最外层FrameLayout的背景色,和TextView的背景色:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">				去掉背景色

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="500dp"
        android:background="#FFFFFF">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="100dp"
            android:gravity="center"
            android:text="test" />						去掉背景色
    FrameLayout>

FrameLayout>

这样可以看到整个视图只绘制了一次。另外,为View设置透明色不会触发一次绘制,因为View默认的就是透明色;
所以为了优化绘制性能,要尽量避免在外层Layout设置背景色和在TextView设置背景色

merge标签能够减少视图层级,但是不能减少过度绘制

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#FFFFFF">
    
    <include layout="@layout/test" />
    
FrameLayout>
<merge xmlns:android="http://schemas.android.com/apk/res/android">
    <FrameLayout
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:background="#FFFFFF">

        <TextView
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:background="#FFFFFF"
            android:text="hello" />
    FrameLayout>
merge>

运行结果表明,merge标签中有2层绘制,运行App整个页面有1+2层绘制;

Activity添加Fragment的绘制次数:
与merge标签类似的,总的绘制次数等于Activity的绘制次数+Fragment的绘制次数

减少布局文件层次:

除此之外,还应该通过使用尽可能少的层次描述布局文件,在满足功能的前提下尽量用简单的控件,通过merge标签可以减少布局文件的层次。

例如:
先写一个以merge为根标签的的布局文件,这里的merge并不是一个View,所以无需设置merge的属性

<merge xmlns:android="http://schemas.android.com/apk/res/android">
    <FrameLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
        <TextView
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:text="hello world"/>
    FrameLayout>
merge>

在某个页面的布局文件引用这个merge布局文件:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    
    <include layout="@layout/mergeTest"/>
    
FrameLayout>

开启Profiling GPU Rendering观察实时绘制帧率
开发者选项中还有一个Profiling GPU Rendering选项可以直观地看到APP当前绘制帧率;

你可能感兴趣的:(布局优化)