布局优化是性能优化的一个方向点,包括了根据需求应该选用哪种布局容器、ViewStub懒加载,如何减少布局层级等,今天我们要探讨的就是如何使用ConstraintLayout来优化我们的布局层级。
概述.png
提出问题
为什么要用这个布局?
怎么用这个布局?
不足在哪里?
优势
ConstraintLayout就是为性能而生,目标就是减少布局嵌套,提高measure+layout性能,来看看官方给出的数据。
性能比较结果.jpeg
ConstraintLayout 在测量/布局阶段的性能比 RelativeLayout大约高40%!而它使用的性能检测工具是Android 7.0(API 级别 24)中引入的 OnFrameMetricsAvailableListener。通过该类,你可以收集有关应用界面渲染的逐帧时间信息,进而比较分析不同布局每次测量和布局操作所花费的时间。
另外使用AS的图形化界面可以非常方便的完成布局操作,这里不赘述了文末有参考文章。
配置
引入最新版本constraint layout库
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
旧界面转换为ConstraintLayout
首先,AS支持一键将已有的布局文件转成ConstraintLayout,是不是很贴心,要做就做全套的。
布局转换.png
用法
1. 属性layout_constraintXXX_toYYYOf
xxx表示该控件在哪个方向的约束,YYY表示该约束指向的控件的方向(我已经尝试说人话了...),它们的可以是 left/right/top/bottom/start/end的任意一种,包含了水平方向和垂直方向的约束,属性的值为目标控件的id,看个例子item1_constraint.xml。
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
android:id="@+id/titleTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World1!"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
android:id="@+id/subtitleTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World2!"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/titleTextView" />
效果图.png
可以看到两个控件水平方向的约束都指向parent也就是父控件ConstraintLayout,由于两边拉力作用就成了居中的样式,垂直方向上由于第二个textview使用了约束app:layout_constraintTop_toBottomOf="@id/titleTextView"