Android 布局优化处理(含 include、Viewstub、merge)

下面是一位才疏学浅的博主对布局优化的理解和认识(更多好内容戳下面:https://blog.csdn.net/wuqingsen1):

1.下面先讲解  include、Viewstub、merge 的基本用法,如果了解,可以直接看下面的布局优化。

1.1 include 用法(一般用于复用的布局,比如每个界面的标题等,从而实现布局模块化)。

   代码下载:https://download.csdn.net/download/wuqingsen1/10636652

   首先定义一个 xml 文件名字为 item_include ,里面内容为:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="41dp"
    android:orientation="vertical">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:text="这是标题使用的include"
        android:gravity="center"
        android:textSize="15dp" />
    <View
        android:layout_width="match_parent"
        android:layout_height="0.5dp"
        android:background="@color/colorAccent"/>
</LinearLayout>

然后在需要用的地方直接用:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <include layout="@layout/item_include" />

</LinearLayout>

1.2.ViewStub 的用法(一般用于布局在特定条件下显示或外部引入布局)。

   代码下载:https://download.csdn.net/download/wuqingsen1/10636652

   首先定义一个 xml 文件名字为 item_view_stub,里面内容为:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:gravity="center"
    android:background="@color/colorPrimary">
    <View
        android:layout_width="match_parent"
        android:layout_height="20dp"/>
    <ImageView
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:src="@mipmap/ic_launcher"/>
    <TextView
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:text="这是内容使用的ViewStub"
        android:gravity="center"/>
</LinearLayout>

然后在需要用的地方直接用:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    
    <ViewStub
        android:id="@+id/viewStub"
        android:inflatedId="@+id/panel_import"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout="@layout/item_view_stub"/>

</LinearLayout>

初始化完 ViewStub 后;直接调用 viewStub.inflate(); 即可显示出布局。

1.3.merge 的用法(多用于替换 FrameLayout 或者当一个布局包含另一个,从而减少布局的层级)。

   代码下载:https://download.csdn.net/download/wuqingsen1/10636652 ;直接在 xml 中加入:

<merge xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:gravity="center"
        android:text="这是Merge"
        android:layout_gravity="bottom"/>

    <ImageView
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:src="@mipmap/ic_launcher"
        android:layout_gravity="center"/>
</merge>

1.4.使用 include、Viewstub、merge 需要了解的一些知识。

   1. ViewStub 中的 layout 布局不能使用 merge 标签,否则会报错

   2. ViewStub 的 inflate 只能执行一次,显示了之后,就不能再使用ViewStub控制它了

   3. 与 View.setVisible(View.Gone) 的区别:View 的可见性设置为 gone 后,在inflate 时,该 View 及其子 View 依然会被解析;而使用ViewStub就能避免解析其中指定的布局文件,从而节省布局文件的解析时间 、内存的占用

2.了解完 include、Viewstub、merge 基本用法,下面开始讨论如何优化布局;

   影响性能的表现,如何影响的性能,以及优化布局思路。

   影响性能的表现:最直观的表现是 Android 应用中的页面显示速度。

   如何影响的性能:页面测量以及绘制时间过长,从而导致应用中的页面显示速度过慢。

   优化思路:针对页面布局的性能、层级、测量绘制时间进行优化,从而提高 Android页面显示速度。

   优化思路具体如下:1.选择耗费性能少的布局;2.减少布局的嵌套;3.提高布局复用性;4.减少绘制、测量时间。

   2.1.选择耗费性能少的布局;

   耗费性能少的布局 = 功能简单 = FrameLayout 、LinearLayout

   耗费性能高的布局 = 功能复杂 = RelativeLayout

   嵌套布局耗费的性能 > 单个布局耗费的性能,所有选一个耗费性能高的布局,也不用嵌套两个耗费的性能低的布局。

   具体优化方式:在 LinearLayout 和 RelativeLayout 都可以完成相同效果时,应选择 LinearLayout (参考LinearLayout 与 RelativeLayout 性能分析)。

   2.2.减少布局的嵌套;

   布局层次少,绘制工作量少,绘制速度快,从而挺高性能;

   优化具体方式:如果布局复杂,尽量使用RelativeLayout ,从而避免多个简单布局嵌套;可以使用 merge ,减少布局层级。

   2.3.提高布局复用性​​​​​​​;

   提取布局中公共部分,以供其他布局使用,从而实现布局模块化,减少测量、绘制时间。

   优化具体方式:布局中很多标题栏类似,从而可以将标题栏提取出来,用 include 标签实现布局模块化。

   2.4.减少绘制、测量时间​​​​​​​;

   尽量少使用布局属性 wrap_content ,它会增加布局测量时计算成本。

   优化具体方式:布局在特定条件下显示或外部引入布局使用 ViewStub 标签;在已知宽高为固定值时,不使用 wrap_content 属性;

3.对布局优化的总结:

优化策略 优化原因 具体优化方案
选择耗费性能少的布局 耗费性能少的布局,效率越高

1.尽量选择耗费性能少的布局

耗费性能少的布局 = 功能简单 = FrameLayout 、LinearLayout

2.耗费性能高的布局 = 功能复杂 = RelativeLayout

减少布局的嵌套 布局层次少,绘制工作量少,绘制速度快,从而挺高性能

1.如果布局复杂,尽量使用RelativeLayout ,从而避免多个简单布局嵌套

2.可以使用 merge ,减少布局层级

提高布局复用性 提高布局复用性可以减少布局测量、绘制时间 提取布局中公共部分,用 include 标签实现布局模块化
减少绘制、测量时间 减少布局测量、绘制时间,直接提高布局性能

1.布局在特定条件下显示或外部引入布局使用 ViewStub 标签

2.在已知宽高为固定值时,尽量不使用 wrap_content 属性

更多好内容下面~如果有更好的见解或补充点也点下面喔:

https://blog.csdn.net/wuqingsen1

猜你喜欢

转载自blog.csdn.net/wuqingsen1/article/details/82224358