下面是一位才疏学浅的博主对布局优化的理解和认识(更多好内容戳下面: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 属性 |
更多好内容下面~如果有更好的见解或补充点也点下面喔: