android ConstraintLayout 约束布局笔记这一篇就够了

1、基本属性

  • 文字基线对齐属性

    • app: layout_constraintBaseline_toBaselineOf=“@id/username”
    • 文字对齐文字的基线,视觉上看起来好一些
  • 偏移

    • 约束横向偏移量 0 - 1.0之间的小数
      • app:layout_constraintVertical_bias=“0” 垂直时候的偏移
      • app:layout_constraintHorizontal_bias=“1” 横向时候的偏移
    • 当一个控件两边给了约束之后,就居中了,但是可以用这个属性进行偏移
    • 情况1:都经过了两边AB的约束
    • 情况2:AB控件1:1大小的时候
    • 情况3:都经过了两边AB的约束,但是bias的控件非常长的时候
    • 情况4:当bias控件左边约束到底下更大的父控件的右边,bias控件右边约束到底下更大的父控件的左边时候,默认是居中的
    • 当bias控件左右或者上下都引用了同一个约束锚点的时候,bias是无效的
    • 截屏2022-03-11 下午9.24.17
  • 约束布局的margin要设置到有约束的那条边上,如果设置到没约束的那条边上是没有效果的

    • 截屏2022-03-11 下午10.01.33
  • 约束的控件不可见时,还想要margin

    • app: layout_goneMarginLeft=“30dp”
    • 当左边这个控件设置为gone不可见的时候起作用
  • 只设置一边的宽或者高,让控件按照比例缩放

    • app:layout_constraintDimensionRatio=“1:1”

123

2、把一个控件浮动在另一个控件上

把悬浮控件的Top和Button全部附着在父控件的下边上

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    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">

    <TextView
        android:id="@+id/tv_Banner"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:background="#00FF00"
        android:gravity="center"
        android:text="Banner"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintWidth_min="100dp" />

    <TextView
        android:layout_width="0dp"
        android:layout_height="50dp"
        android:background="@color/cardview_shadow_start_color"
        android:gravity="center"

        android:text="按钮"
        app:layout_constraintBottom_toBottomOf="@id/tv_Banner"
        app:layout_constraintDimensionRatio="1:1"
        app:layout_constraintEnd_toEndOf="@id/tv_Banner"
        app:layout_constraintStart_toStartOf="@id/tv_Banner"
        app:layout_constraintTop_toBottomOf="@id/tv_Banner" />


</androidx.constraintlayout.widget.ConstraintLayout>

123

app:layout_constraintDimensionRatio=“1:1”

只设置一边的宽或者高,让控件按照比例缩放

截屏2022-03-11 18.37.56

3、辅助控件

3.1 Guideline 分割线

一种方便屏幕区域划分、辅助控件约束定位的看不见的线,当控件文字过长的时候,会把文字挤出去

  1. Guideline作用
    • 控件可以定位到Guideline上面,用来辅助定位;
    • 可以把屏幕分成很多个区域,方便控件进行约束;
    • Guideline是不可见的(draw方法中没有写任何内容),方便给整体布局进行分区定位约束;
    • 把屏幕分成几份可以实现百分比效果
  2. Guideline宽高设置是没有用的
  3. Guideline最重要的四个属性,后三个只可以使用一个
    • 朝向orientation;
    • app:layout_constraintGuide_begin 从开始位置往后多少dp;
    • app:layout_constraintGuide_end 从结束为止往前多少dp;
    • app:layout_constraintGuide_percent 百分比;
    • 截屏2022-03-11 下午9.49.35
  4. Guideline应用场景
    • 登陆页面的快速登录图标布局
    • 登录页面的划分多少份后可以实现百分比效果
  5. Guideline使用app:layout_constraintGuide_percent 百分比属性完全可以作为百分比布局使用

截屏2022-03-11 下午8.57.27

3.2 Barrier 可变长分割线

一种方便屏幕区域划分、辅助控件约束定位的看不见的线,相对于Guideline优点是当控件文字过长的时候,使用Barrier的会自动变大,不会把文字挤出去

适用于多语言版本的app

  1. Barrier的作用
    • 辅助控件定位
    • 不会把控件文字顶出去
    • 会随着控件的变大而变大
  2. 宽和高属性设置是没有用的
  3. 三个重要属性
    • 朝向orientation;
    • app: barrierDirection=“start 或者 end” 选择推着哪一部分的控件
    • app:constraint_referenced_ids=“控件1的id, 控件2的id” 引用的控件id们;
    • 截屏2022-03-11 下午9.50.07
  4. 应用场景
    • 多语言版本的app

截屏2022-03-11 下午9.09.53

截屏2022-03-11 下午9.10.11

3.3 Placeholder 占位符(不常用)

给未来预留的控件占位置的

  • Placeholder重要属性
    • app: content=“@+id/控件id”
    • 这个控件id为引入incloud的布局中同样的控件id
    • 当Placeholder的content里面的控件id和incloud之后的布局的id一致时候,默认就把incloud里面的id的控件替换到placeholder里面去
    • 不太好用

截屏2022-03-11 下午9.41.06

截屏2022-03-11 下午9.41.18

3.4 Group 分组

  1. 作用
    • 将控件分组,统一控制一些visibility之类的属性变化
  2. 重要属性
    • app: constraint_referenced_ids=“控件1的id,控件2的id,控件3的id”
    • 截屏2022-03-11 下午9.45.11

4、chainStyle 链:模拟线性布局

4.1 四种属性的链模式

  • spread 居中分布
    • 截屏2022-03-11 下午10.08.57
    • 截屏2022-03-11 下午10.11.28
  • spread_inside 两边对齐
    • 截屏2022-03-11 下午10.09.06
    • 截屏2022-03-11 下午10.11.47
  • packed 挤在一起
    • 截屏2022-03-11 下午10.09.17
    • 截屏2022-03-11 下午10.12.00
  • spread+weight=“1” 占满分布
    • 截屏2022-03-11 下午10.09.43
    • 截屏2022-03-11 下午10.12.28
    • app: layout_constraintHorizontal_weight=“1” 给每一个链的view都设置
    • app: layout_constraintHorizontal_chainStyle=“spread” 给链的头部view设置

4.2 链的前提

ABC三个TextView控件横向排列,A的左边约束到parent的左边,A的右边约束到B的左边,B的左边约束的A的右边,以此类推连接成一个链。

5、Circle 圆:圆形定位

5.1 圆形定位的三个必要属性

  • app:layout_constraintCircle=“@id/圆心控件的id”
    • 设置圆心控件
  • app:layout_constraintCircleAngle=“30” 旋转角度
    • 设置旋转角度
  • app:layout_constraintCircleRadius=“50dp” 半径
    • 设置距离圆心的半径

5.2 使用方式

截屏2022-03-11 下午10.27.34

<TextView 
  style="@style/constraint_text"
	android:text="1" 
	app:layout_constraintCircle="@id/text0"
	app:layout_constraintCircleAngle="30" 
	app:layout_constraintCircleRadius="50dp"
	app:layout_constraintDimensionRatio="1:1" 
	app:layout_constraintStart_tostartof="parent"
	app:layout_constraintTop_toTopof="parent" />

截屏2022-03-11 下午10.29.11

6、Flow 流:模拟表格布局

  • 要流动的控件们的ids
    • app:constraint_referenced_ids=“控件1的id, 控件2的id” 引用的控件id们;
  • 最大元素个数
    • app:flow_maxElementsWrap=“3”
    • 如果控件宽度放不下就达不到每行设置的最大元素
  • 对齐的模式
    • app:flow_wrapMode=“aligned”
      • aligned 一条线,不够了就换行
        • 截屏2022-03-11 下午10.36.28
      • chain 适应对齐
        • 设置最大4个的时候
        • 截屏2022-03-11 下午10.35.59
        • 设置最大5个的时候
        • 截屏2022-03-11 下午10.37.40
      • none 不设置,默认一条线不换行
        • 截屏2022-03-11 下午10.36.58
  • 2
    • app: flow_verticalGap=“5dp”
  • 3
    • app:flow_horizontalGap=“5dp”
  • 4
    • app:flow_verticalStyle=“packed”

截屏2022-03-11 下午10.31.07

7、约束布局大小尺寸的控制

7.1 约束布局中的包裹内容的特性

当TextView控件左右约束了后,TextView宽度设置为wrap_content 的时候如果内容没超出便会居中,如果超出了,会往两边挤出去,如果不需要挤出去就需要添加**app: layout_constrainedwidth=“true”**属性

截屏2022-03-11 下午10.47.49

截屏2022-03-11 下午10.47.54

7.2 约束0dp的三个属性

截屏2022-03-11 下午10.50.58

  • 当TextView的layout_width设置为0dp后,内容不超出控件,默认的是app:layout_constraintwidth_default="spread”的效果 上图第二种spread效果
    • 截屏2022-03-11 下午10.58.27
  • 当TextView的layout_width设置为0dp后,内容超出了控件,使用了app:layout_constraintwidth_default="wrap"属性后,就会把内容包裹住,不会挤压出去,就是上图第三种效果
    • 截屏2022-03-11 下午10.58.46
  • 如果想要TextView包裹就要设置为app: layout_constraintwidth_default="wrap"设置为warp就会出现上图第一种效果
    • 截屏2022-03-11 下午10.59.11
  • 还可以使用百分比app:layout_constraintwidth_percent=“0.9”,就是上图第四种效果
    • 截屏2022-03-11 下午10.57.38

8、按照比例进行布局

给一个控件添加app:layout_constraintDimensionRatio="1:1"他就是个正方形

app:layout_constraintDimensionRatio="16:9"就是一个16比9的长方形

截屏2022-03-11 下午11.09.09

9、最大最小宽高的两种设置属性

分为两种 一种是 android下面的,另一种是app下面的

android下面的对普通控件生效,不对自定义view生效

app下面的对自定义view生效

  • andrdid: minWidth=“100dp”

    • 设置最小宽度
    • 自定义控件不管用
  • android: maxWidth="200dp

    • 设置最大宽度
  • app:layout_constraintWidth_min=“300dp” 并且 layout_width=“0dp”

    • 自定义控件适用 最小宽度为 300
    • 前提是layout_width为0dp
    • 也要设置app:layout_constraintwidth_default=“wrap”
  • app:layout_constraintwidth_default="spread"的时候 或者 设置app:layout_constraintwidth_percent百分比的时候

    • 设置android: maxWidth 是无效的
    • 只有使用app下面的app:layout_constraintWidth_min 才有效果

10、约束布局2.0新效果

开放了ConstraintHelper约束帮助,可以自己编辑了,类似于Guideline同类

可以自己继承这个类实现动画然后引入到xml约束布局中

截屏2022-03-11 下午11.19.37

截屏2022-03-11 下午11.20.43

layer的讲解

http://www.zyiz.net/tech/detail-141054.html

https://juejin.cn/post/6844904199004618765

MotionLayout

https://www.jianshu.com/p/f5514bf4b410

https://www.bilibili.com/video/BV1nV411k7B5?spm_id_from=333.337.search-card.all.click

矢量绘图教程

https://www.bilibili.com/video/BV1Mz4y1X7XU?spm_id_from=333.999.0.0

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

朱良浩

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

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

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

打赏作者

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

抵扣说明:

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

余额充值