ConstraintLayout带你深入了解约束布局的使用

在这里插入图片描述

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是一个概念。但是还有些文化,像阿拉伯等是从右到左的,这两者就截然相反了。所以为了你的程序更广泛适用,还是用startend吧。

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"/>
  1. 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
当控件不依赖其他同级控件时 ,为了能够指定位置可以通过添加辅助线的方式来帮助定位

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

橘子先生z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值