Android-ConstraintLayout

ConstraintLayout属性整理

2020-08-19  本文已影响0人  kevinsEegets

当前控件的X侧在XX控件的X侧

app:layout_constraintBottom_toBottomOf="@+id/"
app:layout_constraintBottom_toTopOf="@+id/"

app:layout_constraintEnd_toEndOf="@android:"
app:layout_constraintEnd_toStartOf="@android:"

app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintLeft_toRightOf="@+id/"

app:layout_constraintRight_toLeftOf="@+id/"
app:layout_constraintRight_toRightOf="@+id/"

app:layout_constraintTop_toBottomOf="@+id/"
app:layout_constraintTop_toTopOf="parent"

 app:layout_constraintStart_toEndOf="@android:"
 app:layout_constraintStart_toStartOf="@android:"

app:layout_constraintBaseline_toBaselineOf="@+id/"

例如:

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/header_constrain_edit_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#cccccc">
        <!--布局间相互连接, aaa====bbb, bbb====ccc, 头布局声明连(chainStyle),必须要在头布局声明-->
        <TextView
            android:id="@+id/aaaaa"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_marginEnd="4dp"
            android:text="AAAAAAAA"
            android:background="#0000ff"
            app:layout_constraintHorizontal_chainStyle="packed"  //重点
            app:layout_constraintEnd_toStartOf="@+id/bbbbb"  //重点
            app:layout_constraintStart_toStartOf="parent"  //重点
            app:layout_constraintBottom_toBottomOf="parent"  //重点
            app:layout_constraintTop_toTopOf="parent" />

        <TextView
            android:id="@+id/bbbbb"
            android:layout_width="wrap_content"
            android:layout_height="@dimen/public_ui_25dp"
            android:layout_gravity="center"
            android:focusable="false"
            android:focusableInTouchMode="false"
            android:gravity="center"
            android:text="BBBBBBBBBB"
            android:background="#ff0000"
            app:layout_constraintStart_toEndOf="@+id/aaaaa"  //重点
            app:layout_constraintEnd_toStartOf="@+id/ccccc"  //重点
            android:textColor="@color/public_color_CCCCCC"  //重点
            android:textSize="@dimen/public_font_14sp"
            app:layout_constraintBottom_toBottomOf="parent"  //重点
            app:layout_constraintTop_toTopOf="parent" />

        <TextView
            android:id="@+id/ccccc"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="#00ff00"
            app:layout_constraintEnd_toEndOf="parent"  //重点
            app:layout_constraintStart_toEndOf="@+id/bbbbb"  //重点
            app:layout_constraintBottom_toBottomOf="parent"  //重点
            app:layout_constraintTop_toTopOf="parent"  //重点
            android:text="CCCCCCCCC"/>

    </androidx.constraintlayout.widget.ConstraintLayout>

控制当前 View 所参考的 View 状态为 GONE 的时候的 margin 值

          app:layout_goneMarginBottom="10dp"
          app:layout_goneMarginEnd="10dp"
          app:layout_goneMarginLeft="10dp"
          app:layout_goneMarginRight="10dp:"
          app:layout_goneMarginStart="10dp"
          app:layout_goneMarginTop="10dp"

demo

    <TextView
        android:id="@+id/AAA"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="#ff00ff"
        android:visibility="gone"
        android:text="AAAAAAAAAAAAAAAA" />

    <TextView
        android:id="@+id/BBB"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="#ff0000"
        app:layout_constraintStart_toEndOf="@+id/AAA"     //重点
        app:layout_goneMarginLeft="@dimen/public_ui_50dp"   //重点
        android:text="BBBBBB" />

设置当前控件宽高比例:(前提设置一个宽或者高为0,或者使用强制约束)

       app:layout_constraintDimensionRatio="16:9"// 数值支持两种形式:1.float值,代表宽度/高度的比率;2.比率值,宽:高(5:6),高:宽(H,5:6)

demo

<ImageView
        android:layout_width="match_parent"
        android:layout_height="0dp"
        app:layout_constraintDimensionRatio="W,169:690"
        android:background="@drawable/ic_launch_logo" />

设置当前控件的偏重:(前提:是当前控件有“不可能”实现的约束的时候:例如,水平约束:控件宽30dp,父控件宽100dp,设置即在父窗体的左边,又在父窗体的右边,这种"不可能"实现的最终会居中显示)

        app:layout_constraintHorizontal_bias="0.3"// 空余区域左边占0.3
        app:layout_constraintVertical_bias="0.3"// 空余区域左边占0.3

demo

<ImageView
      android:layout_width="50dp"
      android:layout_height="80dp"
      app:layout_constraintStart_toStartOf="parent"
      app:layout_constraintEnd_toEndOf="parent"
      app:layout_constraintHorizontal_bias="51080"
      android:background="#ff0000" />

设置当前控件位置:(圆形定位:以另一个控件 layout_constraintCircle 为参照物画半径为 layout_constraintCircleRadius 的圆形,在角度 layout_constraintCircleAngle 的位置就是此控件的中心点,以此中心点布局此控件)

        app:layout_constraintCircle="@id/button1" // 引用另一个控件的id,以此控件为参照物
        app:layout_constraintCircleAngle="180" // 圆形的角度,值为:0-360
        app:layout_constraintCircleRadius="100dp" // 圆形的半径

demo

<ImageView
         android:id="@+id/AAA"
         android:layout_width="100dp"
         android:layout_height="50dp"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintTop_toTopOf="parent"
         app:layout_constraintBottom_toBottomOf="parent"
         android:background="#ff0000" />
     <ImageView
         android:id="@+id/BBB"
         android:layout_width="30dp"
         android:layout_height="30dp"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintCircle="@+id/AAA"
         app:layout_constraintCircleAngle="125"
         app:layout_constraintCircleRadius="42dp"
         android:background="#ff00ff" />

设置当前最大值、最小值:(当 ConstraintLayout 设置为 WRAP_CONTENT 时生效)

    android:maxHeight
    android:maxWidth
    android:minHeight
    android:minWidth

设置控件宽高:

    使用特定的值
    使用 WRAP_CONTENT,它会要求计算自己的大小
    使用 0dp,相当于 MATCH_CONSTRAINT ,用约束规则指定的大小

设置是否强制约束:(控件有时候想要WRAP_CONTENT,但是当设置为 WRAP_CONTENT 时被视为没有约束,设置强制约束可同时拥有包裹和约束)

        app:layout_constrainedWidth="true"
        app:layout_constrainedHeight="true"

demo

 <ImageView
        android:id="@+id/CCCC"
        android:layout_width="30dp"
        android:layout_height="130dp"
        android:layout_marginLeft="50dp"
        app:layout_constraintStart_toStartOf="parent"
        android:background="#f00" />

    <TextView
        android:id="@+id/DDDD"
        android:layout_width="30dp"
        android:layout_height="wrap_content"
        android:text="2000000000000000000000"
        app:layout_constrainedHeight="true"
        app:layout_constraintTop_toTopOf="@+id/CCCC"
        app:layout_constraintBottom_toBottomOf="@+id/CCCC"
        android:background="#ff00ff" />

设置 MATCH_CONSTRAINT(0dp)后约束宽高

    // 宽
        app:layout_constraintWidth_default="percent" // 设置计算方式:取值范围:spread(默认)占用所有符合约束的空间、wrap 占用内容的空间、percent 百分比占用
        app:layout_constraintWidth_max="100dp"// 设置最大值:取值范围:warp、固定dp
        app:layout_constraintWidth_min="wrap"// 设置最小值:取值范围:warp、固定dp
        app:layout_constraintWidth_percent="0.9" // 设置当前值:取值范围:[0-max],相对于父布局的(前提:需指定`app:layout_constraintWidth_default="percent"`)
    // 高:同上
        app:layout_constraintHeight_default="wrap"
        app:layout_constraintHeight_min="100dp"
        app:layout_constraintHeight_percent="0.5"

设置链的样式(在链条的第一个元素设置,剩余空间不包含边距。)

       app:layout_constraintVertical_chainStyle="spread" // 取值范围:
       spread(默认,元素将会分散开来,如果有控件设置 0dp,则权重分空余空间)、
       spread_inside(类似的,但是链的两个端点在两侧不会散开)、
       packed(这条链的元素将被打包在一起。layout_constraintHorizontal_bias、layout_constraintVertical_bias将会影响到元素的位置。)
       app:layout_constraintHorizontal_chainStyle="spread"

demo
https://www.jianshu.com/p/507846bd81c9

权重链里面分配剩余空间(前提:宽或高设置0dp)

        app:layout_constraintHorizontal_weight="1"
        app:layout_constraintVertical_weight="2"

demo


    <ImageView
        android:id="@+id/CCCC"
        android:layout_width="0dp"
        android:layout_height="130dp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintEnd_toStartOf="@+id/DDDD"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintHorizontal_weight="2"
        android:background="#f00" />

    <TextView
        android:id="@+id/DDDD"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="0"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintHorizontal_weight="0.1"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toEndOf="@+id/CCCC"
        android:background="#ff00ff" />

设置优化器:(可以设置多个,例如:direct|barrier|dimensions)

        app:layout_optimizationLevel="none" // 取值:none : 不优化
                        standard : 默认。仅优化直接和障碍约束
                        direct : 优化直接约束。
                        barrier : 优化屏障约束。
                        chain : 优化链约束(实验)
                        dimensions :优化尺寸测量(实验),减少匹配约束元素的数量。

指定控件的绝对位置(通过这个属性指定位置的控件可以不需要约束关系)

        app:layout_editor_absoluteX="100dp"
        app:layout_editor_absoluteY="100dp"

设置辅助线(辅助布局使用,Guideline,其他控件基于此线找到自己的位置)

        android:orientation="vertical"
        app:layout_constraintGuide_begin="100dp"
        app:layout_constraintGuide_end="50dp"
        app:layout_constraintGuide_percent="0.8"

demo

<View
        android:id="@+id/guide"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintGuide_percent="0.5"
        android:orientation="vertical"/>

    <ImageView
        android:id="@+id/CCCC"
        android:layout_width="100dp"
        android:layout_height="130dp"
        app:layout_constraintTop_toTopOf="@+id/DDDD"
        app:layout_constraintBottom_toBottomOf="@+id/DDDD"
        app:layout_constraintStart_toEndOf="@+id/DDDD"
        android:background="#f00" />

    <TextView
        android:id="@+id/DDDD"
        android:layout_width="100dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="250dp"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="@+id/guide"
        android:text="0"
        android:background="#ff00ff" />

设置引用的控件(常用于 Barrier Group Placeholder)

    app:constraint_referenced_ids="@string/app_name" // 设置 Barrier 引用的控件。可设置多个,设置的方式是:id, id。(无需加 @id/)

设置屏障(辅助布局使用,Barrier)

    app:barrierAllowsGoneWidgets="true"// 默认为 true,即当 Barrier 引用的控件被 GONE 掉时,则 Barrier 默认的创建行为是在已 GONE 掉控件的已解析位置上进行创建。如果设置为 false,则不会将 GONE 掉的控件考虑在内
    app:barrierDirection="bottom"// 设置 Barrier 方向。可设置的有:bottom、end、left、right、start、top。

demo

<TextView
        android:id="@+id/AAAA"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        android:text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
        android:background="#f00" />
    <TextView
        android:id="@+id/BBBB"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toBottomOf="@+id/AAAA"
        android:text="BBBBBBBBBBBBBBBBBBBBBBB"
        app:layout_constraintStart_toStartOf="parent"
        android:background="#ff00ff" />

    <androidx.constraintlayout.widget.Barrier
        android:id="@+id/barr"
        app:constraint_referenced_ids="AAAA,BBBB"
        app:barrierDirection="right"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

设置组(辅助布局使用,Group,控制一组控件的可见性)

    android:visibility="gone"
    app:constraint_referenced_ids=""

设置组(辅助布局使用,Placeholder,占位)
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2017/1019/8618.html

    app:content="@id/button3" // 将占位符变为有效的视图
    app:emptyVisibility="gone/invisible" // 设置当视图不存在时占位符的可见性。

设置动态约束(主要代码设置)

    app:constraintSet="@string/app_name"

以下属性查看原码发现目前没有用,可能后续版本中添加

        app:layout_constraintBaseline_creator="1"
        app:layout_constraintBottom_creator="2"
        app:layout_constraintLeft_creator="3"
        app:layout_constraintRight_creator="4"
        app:layout_constraintTop_creator="5"
        app:chainUseRtl="true"//

更多 ConstraintLayout动画移步:
ConstraintLayout 动画 |动态 Constraint |用 Java 实现的 UI
https://www.jianshu.com/p/575829baa39d

上一篇下一篇

猜你喜欢

热点阅读