布局优化--减少布局嵌套层级
当布局嵌套深入比较深的时候,往往会伴随着一些性能问题。所以很多时候我们建议使用RelativeLayout或者GridLayout来简化掉布局的深度。
而对于简化布局深度,ConstraintLayout几乎可以做到极致,接下来我们通过实例来尽可能将所有常见的属性一步步的介绍清楚。
constriantLayout布局引入
首先需要引入我们的ConstraintLayout,在build.gradle中加入:
compile'com.android.support.constraint:constraint-layout:1.0.2'
1,app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintLeft_toLeftOf="@id/viewB"
layout_constraintLeft_toLeftOf表示和什么左边对齐
2,app:layout_constraintLeft_toRightOf="@id/viewB"
layout_constraintLeft_toRightOf表示当前控件的左侧在那个控件的右侧
3,与之类似的还有几个属性:
layout_constraintRight_toLeftOf
layout_constraintRight_toRightOf
layout_constraintTop_toTopOfth
layout_constraintTop_toBottomOf
layout_constraintBottom_toTopOf
layout_constraintBottom_toBottomOf
layout_constraintBaseline_toBaselineOf
4,与RelativeLayout的区别:
当一个控件的两端都加入的约束的时候,需要设置layout_width = 0;
在COnstraintLayout布局中是不存在match_parent属性的,
5,设置宽高比
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintDimensionRatio="16:6"
这个宽高比属性,还支持这样的写法:
app:layout_constraintDimensionRatio="W,16:6"
app:layout_constraintDimensionRatio="H,16:6"
6,增加几个Tab
现在我们希望在底部增加3个tab,均分。是不是想到了LinearLayout和weight。
使用ConstraintLayout实现如下
<TextView
android:id="@+id/tab1"
android:layout_width="0dp"
android:layout_height="30dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@+id/tab2"/>
<TextView
android:id="@+id/tab2"
android:layout_width="0dp"
android:layout_height="30dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toRightOf="@id/tab1"
app:layout_constraintRight_toLeftOf="@+id/tab3"/>
<TextView
android:id="@+id/tab3"
android:layout_width="0dp"
android:layout_height="30dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toRightOf="@id/tab2"
app:layout_constraintRight_toRightOf="parent"/>
我们看横向的依赖,3个tab两两设置了约束(即你在我们的左边,我在你的右边),最外层的设置了parent约束;再加上我们把宽度都设置为
了match_constraint,so
app:layout_constraintHorizontal_weight比重属性设置:
假设我们分别设置值为2,1,1。
layout_constraintHorizontal_chainStyle设置展示效果:
chainStyle=”spread”+ 宽度为0:
chainStyle=”spread” + 宽度非0:
chainStyle=”spread_inside” + 宽度非0
chainStyle=”packed”+ 宽度非0
7,一个很常见的功能,我们现在希望在右下角增加一个浮动按钮。
<TextView
android:layout_width="60dp"
android:layout_height="60dp"
android:background="#612"
app:layout_constraintVertical_bias="0.9"
app:layout_constraintHorizontal_bias="0.9"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
layout_constraintHorizontal_bias
即设置上下两侧间隙比例分别为90%与10%,设置左右两侧间隙比例分别为90%与10%。
android.support.constraint.Guideline 该类比较简单,主要用于辅助布局,即类似为辅助线,横向的、纵向的。该布局是不会显示到界面上的。
android:orientation取值为”vertical”和”horizontal”.
除此以外,还差个属性,决定该辅助线的位置:
layout_constraintGuide_begin
layout_constraintGuide_end
layout_constraintGuide_percent
可以通过上面3个属性其中之一来确定属性值位置。
begin=30dp,即可认为距离顶部30dp的地方有个辅助线,根据orientation来决定是横向还是纵向。
end=30dp,即为距离底部。
percent=0.8即为距离顶部80%。
<android.support.constraint.ConstraintLayout
...
tools:context="com.zhy.constrantlayout_learn.MainActivity">
<android.support.constraint.Guideline
android:id="@+id/guideline_h"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_percent="0.8" />
<android.support.constraint.Guideline
android:id="@+id/guideline_w"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.8" />
<TextView
android:layout_width="60dp"
android:layout_height="60dp"
android:background="#612"
app:layout_constraintLeft_toRightOf="@id/guideline_w"
app:layout_constraintTop_toBottomOf="@id/guideline_h" />
</....>