1.关于约束布局居中如何实现
(1)
app:layout_constraintStart_toStartOf=“parent”
app:layout_constraintEnd_toEndOf=“parent”
(2)
app:layout_constraintLeft_toLeftOf=“parent”
app:layout_constraintRight_toRightOf=“parent”
一般通过Start和End(left和right)指定同一个控件就可以实现居中,相信聪明的你举一反三也知道通过设置top和bottom也可以实现居中了吧。
下面说一下这2种方式虽然实现的效果相同,但也有区别,往下面看
首先我们读一段文字,都是从左到右,于是对于我们来说start和left是一个概念。但是还有些文化,像阿拉伯等是从右到左的,这两者就截然相反了。所以为了你的程序更广泛适用,还是用start和end吧。
2.goneMargin属性:当约束控件不可见时,可以设置与父布局的距离
这里是居中textview的顶部在text1的底部,当text1布局显示的时候,居中textview相距text1的顶部是20dp,这时候goneMarginTop属性并不会生效(顾名思义gon eMargin),效果如下图所示:
但有些情况text1会被设置为gone(不占位置且不可见),那此时居中textview就会相聚它的父布局20dp,如果想要不改变位置,就使用
app:layout_goneMarginTop="自己计算,看需求"属性即可
3.GROUP
若你想要某一些控件同步控制其visibility(可见性),用Group,只需要设置下面一句app:constraint_referenced_ids=“text1,text2”/>,在设置Group的visibility就可以同步控制。但是点击事件是不可以的。
4.圆弧定位
可以用来放小图标
它的作用就是你可以相对于锚点View的中心位置,声明一个角度和距离(半径)来确定View的位置
layout_constraintCircle 是关联的锚点View的id
layout_constraintCircleRadius View的中心点与关联的锚点View的中心点的距离(圆弧半径)
layout_constraintCircleAngle View的中心点与关联的锚点View的中心点的角度关系(0到360度)
官方示意图:
代码效果如下图所示:
3.layout_constraintWidth_default
layout_constraintWidth_default的三种取值
1.默认是spread,意思是占用所有的符合约束的空间
2.percent, 顾名思义就是按照百分比来表示宽度
3.wrap:匹配内容大小但不会超过约束的限制。(和指定宽度为wrap_content的区别是不会超过约束限制)
4.odp
ConstraintLayout相对于其他布局提供给了一个0dp的属性(MATCH_CONSTRAINT ),这不是说让宽或高位0dp,而是一种标记。
它标记的含义会随着不同的constrain设置而有不同的体现。
5.layout_constraintDimensionRatio
ConstraintLayout不仅支持宽高比例的配置,还能配置宽高比例根据其中的一个计算出另外一个的
当宽度高度有一个为0dp时,另外一个可以根据指定的ratio来确认自己的大小。
可通过 app:layout_constraintHorizontal_weight="0.5"设置水平的比例
app:layout_constraintDimensionRatio=“w,2:1”
第一个参数是以什么为标准,有宽或高,后面表示宽高比
app:layout_constraintDimensionRatio="w,2:1"这行代码可以理解为以控件高度为基准,宽度的数值:高度的数值=2:1。
layout_constraintDimensionRatio的值换成h,2:1,那么这行代码就理解为以控件高度为基准,高度的数值:宽度的数值=2:1
6.Barrier 屏障约束(栅栏,屏障)的使用
Barrier 是用多个 View 作为限制源来决定自身位置的一种辅助线
将多个view 放入barrier中,barrier的边界随着view的改变而改变
<androidx.constraintlayout.widget.Barrier
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:ignore="MissingConstraints"
app:barrierDirection="right"
app:constraint_referenced_ids="text2,text1"/>
app:barrierDirection="left"指定Barrier的位置就是控件不会超过的方向
app:constraint_referenced_ids="text2,text1"指定要包括的控件
7.Layer
Layer 可以看作是它引用的 view 的边界(可以理解为包含这些 view 的一个 ViewGroup,但是Layer并不是ViewGroup,Layer并不会增加 view 的层级)。另外Layer支持对里面的 view 一起做变换。
Layer不提供位置约束,也就是其他布局约束到layer是不起作用的
Layer 相当于把引用的视图圈一起,可以进行设置背景色,padding等
给Layer添加动画,就是给里面的每一个视图添加动画,对于一些复杂的动画的场景还是比较有用的
<androidx.constraintlayout.helper.widget.Layer
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/ic_launcher_background"
android:padding="10dp"
app:constraint_referenced_ids="text1,text2"/>
- Flow 的使用
Flow 是 VirtualLayout,Flow 可以像 Chain 那样帮助快速横向/纵向布局constraint_referenced_ids里面的元素。 通过flow_wrapMode可以指定具体的排列方式,有三种模式
wrap none : 简单地把constraint_referenced_ids里面的元素组成chain,即使空间不够
wrap chain : 根据空间的大小和元素的大小组成一条或者多条 chain
wrap aligned : wrap chain类似,但是会对齐
9.Chains 链
如果两个或以上控件通过相互约束在一起,就可以认为是他们是一条链(分为为横向的链和纵向)。
3个TextView相互约束,两端两个TextView分别与parent约束,成为一条链,
<TextView
android:id="@+id/text2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:ignore="MissingConstraints"
android:text="居中"
app:layout_constraintDimensionRatio="w,2:1"
app:layout_constraintHorizontal_chainStyle="packed"
app:layout_constraintStart_toEndOf="@id/barrier"
/>
一条链的第一个控件是这条链的链头,我们可以在链头中设置 layout_constraintHorizontal_chainStyle来改变整条链的样式。
提供了3种样式
spread —— 展开元素 (默认);
spread_inside —— 展开元素,但链的两端贴近parent;
packed—— 链的元素将被打包在一起。
权重链:这时需要将宽度设置为0,然后使用layout_constraintHorizontal_weight(横向)设置权重。
10.guideLine定位
orientation 方向 horizontal/vertical
layout_constraintGuide_percent 百分比 0~1
当控件不依赖其他同级控件时 ,为了能够指定位置可以通过添加辅助线的方式来帮助定位