美文网首页
Android ConstraintLayout 约束布局

Android ConstraintLayout 约束布局

作者: 周末不加班 | 来源:发表于2018-08-17 13:15 被阅读0次

    1.构建

    Android Studio 2.3+
    Module build.gradle 引入

    dependencies {
      compile 'com.android.support.constraint:constraint-layout:1.1.0-beta3'
    }
    

    2.相对定位

    示例代码:

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <Button
            android:id="@+id/b1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="按钮1"/>
    
        <Button
            android:id="@+id/b2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="按钮2"
            app:layout_constraintLeft_toRightOf="@id/b1"/>
    
    </android.support.constraint.ConstraintLayout>
    
    含义
    layout_constraintLeft_toLeftOf 按钮1左边与按钮2左边对齐
    layout_constraintLeft_toRightOf 1左与2右对齐
    layout_constraintRight_toLeftOf 1右与2左对齐
    layout_constraintRight_toRightOf 1右与2右对齐
    layout_constraintTop_toTopOf 1顶与2顶对齐
    layout_constraintTop_toBottomOf 1顶与2底对齐
    layout_constraintBottom_toTopOf 1底与2顶对齐
    layout_constraintBottom_toBottomOf 1底与2底对齐
    layout_constraintBaseline_toBaselineOf 1基线对齐2基线
    layout_constraintStart_toEndOf 1起始与2结束对齐
    layout_constraintStart_toStartOf 1起始与2起始对齐
    layout_constraintEnd_toStartOf 1结束与2起始对齐
    layout_constraintEnd_toEndOf 1结束与2结束对齐

    layout_constraintXXX 里的 XXX 代表是这个子控件自身的哪条边( Left、Right、Top、Bottom、Baseline),
    而 toYYYOf 里的 YYY 代表的是和约束控件的哪条边 发生约束(Left、Right、Top、Bottom、Baseline)

    对齐与 ID ( @id/button1 被参照控件) 或 parent (父布局)


    android_constraintlayout_2.png

    3.外边距约束

    与其他布局外边距属性用法相同
    android:layout_marginStart
    android:layout_marginEnd
    android:layout_marginLeft
    android:layout_marginTop
    android:layout_marginRight
    android:layout_marginBottom

    !设置外边距时,控件外边距方向必须有app:layout_constraintXxx_约束

    被参考控件GONE时边距才生效
    CStart
    layout_goneMarginEnd
    layout_goneMarginLeft
    layout_goneMarginTop
    layout_goneMarginRight
    layout_goneMarginBottom

    区别:

    被参考控件visible 被参考控件gone
    layout_margin生效 layout_margin失效
    layout_goneMargin失效 layout_goneMargin生效

    4.居中定位

    居中方向 固定代码
    水平 app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent"
    垂直 app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="parent"
    完全 水平+垂直
    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            />
    </android.support.constraint.ConstraintLayout>
    
    捕获.PNG

    这是因为这两个约束作用类似于水平方向上,有相反的力 去拉控件,最终控件会居中显示

    android_constraintlayout_9.png

    5.偏向

    倾向 ( Bias ) 提供了两个属性用于设置偏向到的程度,类似LinnerLayout layout_weight

    属性 说明
    layout_constraintHorizontal_bias 水平(0最左边 1 最右边,默认是 0.5)
    layout_constraintVertical_bias 垂直(0最上边 1 最底边,默认是 0.5)

    6.尺寸约束

    ①最大最小宽高约束

    它会在 控件为 wrap_conent 时起作用

    属性 说明
    android:minWidth 设置布局的最小宽度
    android:minHeight 设置布局的最小高度
    android:maxWidth 设置布局的最大宽度
    android:maxHeight 设置布局的最大高度

    ② 其他尺寸约束

    属性 说明
    android:layout_width="200dp" 确定尺寸
    android:layout_width="wrap_content" 自适应
    android:layout_width="0dp" 等价于MATCH_PARENT

    !为什么不用 MATCH_PARENT 了?
    因为,MATCH_PARENT 在 ConstraintLayout 不再被推荐了

    7.比例 ( Ratio )

    属性 说明
    app:layout_constraintDimensionRatio 约束比例,用逗号分隔方向 (,) ,用冒号(:)分隔比例

    ①只有一个方向约束

    1.必须有至少一个相对定位(id/parent) layout_constraintXxx_toXxxOf
    2.需要将至少一个约束维度设置为 0dp
    3.app:layout_constraintDimensionRatio="2:1" (宽:高=2:1)

    示例
    width 0dp为变量,height 400dp为固定值,根据高度去改变宽度
    宽:高=1:2
    最终显示: 宽200dp(占比1),高400dp(占比2)

    <Button
            android:layout_width="0dp"
            android:layout_height="400dp"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintDimensionRatio="1:2"
    
    捕获.PNG

    ②指定要改变的维度

    如果两个维度均设置为 0dp ,也可以使用比例
    属性 layout_constraintDimensionRatio="H,2:1"
    则表示动态改变高度 高度调整为屏幕宽度的二分之一 比例始终都是 宽:高

    8.链条 ( Chains )

    链条在同一个方向上( 水平或者垂直 ) 提供一个类似群组的统一表现,另一个轴可以单独控制

    遇坑总结:
    1. 链条头、尾必须指定左右(上下)约束( 头:constraintLeft_toLeftOf="parent" ,尾:constraintRight_toRightOf="parent")
    2. 所有控件在链条约束中 Left和Start、Right和End不能混用,每个控件左统一用 Left或Start,右统一用 Right或End
    ①创建链条 ( Creating a chain )

    如果一组 UI 控件通过双向连接 (A:constraintRight_toLeftOf="@+id/buttonB",B:constraintLeft_toRightOf="@+id/buttonA"),则将其视为链条

    android_constraintlayout_21.png
    ②链条头 ( Chain heads )

    链条由在链的第一个元素 ( 链的 头) 上设置的属性控制
    1.水平链最左边的 View 是头
    2.垂直链最顶端的 View 是头

    ③链条样式 ( Chain Style )

    当在链条头设置属性
    layout_constraintHorizontal_chainStyle 或
    layout_constraintVertical_chainStyle 时,
    链的行为将根据指定的样式 ( 默认为 CHAIN_SPREAD) 而更改

    说明
    spread 素之间的空间将会均匀分布,这是系统默认的排列方式
    packed 首尾两条链将会分配空间,链内部将不会分配空间
    spread_inside 首尾的两条链将不会分配空间,其余内部的链将均匀分配空间
    ④加权链( Weighted chains )

    和 LinearLayout 的 weight 类似,链的默认行为是在可用空间中平均分配元素。
    如果一个或多个元素使用 0dp
    属性:
    layout_constraintHorizontal_weight 、
    layout_constraintVertical_weight
    将决定这些都设置了 0dp的 View 如何分配空间

    9.Guideline (辅助布局)

    ①布局方向

    不会被显示,仅仅用于辅助布局 所以,Guideline 只有一个作用,那就是 锚点
    它可以是 horizontal 或者 vertical 的,例如 android:orientation="vertical"

    • vertical 的 Guideline 宽度为零,高度为 ConstraintLayout 的高度
    • horizontal 的 Guideline 高度为零,宽度为 ConstraintLayout 的高度

    ②手机三种定位方式

    定位 说明
    layout_constraintGuide_begin="10dp" 指定距离左侧或顶部的固定距离
    layout_constraintGuide_end="20dp" 指定距离右侧或底部的固定距离
    layout_constraintGuide_percent="0.5" 指定在父控件中的宽度或高度的百分比(0左,1右,0.5中间)

    10.环形定位 (Circular positioning)

    捕获.PNG
    属性 说明
    layout_constraintCircle 引用另一个圆心 ID
    layout_constraintCircleRadius 到其它小部件中心的距离
    layout_constraintCircleAngle 小部件应处于的角度 ( 度数,从 0 到 360 )

    相关文章

      网友评论

          本文标题:Android ConstraintLayout 约束布局

          本文链接:https://www.haomeiwen.com/subject/eqynbftx.html