美文网首页
ConstraintLayout

ConstraintLayout

作者: 卡路fly | 来源:发表于2020-06-07 14:29 被阅读0次

    来源:约束布局ConstraintLayout看这一篇就够了

    优点

    复杂的UI,可能会出现布局嵌套过多的问题,嵌套得越多,设备绘制视图所需的时间和计算功耗也就越多。

    • ConstraintLayout使用起来比RelativeLayout更灵活,性能更出色。- - ---- - ConstraintLayout可以按照比例约束控件位置和尺寸,能够更好地适配屏幕大小不同的机型。

    文本基线 layout_constraintBaseline_toBaselineOf

        <TextView
            android:id="@+id/TextView1"
            .../>
    
        <TextView
            android:id="@+id/TextView2"
            ...
            app:layout_constraintLeft_toRightOf="@+id/TextView1" 
            app:layout_constraintBaseline_toBaselineOf="@+id/TextView1"/>
    
    效果

    角度定位

    app:layout_constraintCircle="@+id/TextView1"
    app:layout_constraintCircleAngle="120"(角度)
    app:layout_constraintCircleRadius="150dp"(距离)
    

    goneMargin

    用于约束的控件可见性被设置为gone的时候使用的margin值

    <android.support.constraint.ConstraintLayout 
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <TextView
            android:id="@+id/TextView1"
            .../>
    
        <TextView
            android:id="@+id/TextView2"
            ...
            app:layout_constraintLeft_toRightOf="@+id/TextView1"
            app:layout_goneMarginLeft="10dp"
            />
    
    </android.support.constraint.ConstraintLayout>
    
    TextView1的可见性设为gone

    偏移

    layout_constraintHorizontal_bias 水平偏移
    layout_constraintVertical_bias 垂直偏移
    

    要实现水平偏移,给TextView1的layout_constraintHorizontal_bias赋一个范围为 0-1 的值,假如赋值为0,则TextView1在布局的最左侧,假如赋值为1,则TextView1在布局的最右侧,假如假如赋值为0.5,则水平居中,假如假如赋值为0.3,则更倾向于左侧。

    尺寸约束

    • layout_constraintDimensionRatio 宽高比
      在设置宽高比的值的时候,还可以在前面加W或H,分别指定宽度或高度限制。 例如:
      app:layout_constraintDimensionRatio="H,2:3"指的是 高:宽=2:3
      app:layout_constraintDimensionRatio="W,2:3"指的是 宽:高=2:3

    • 使用 0dp (MATCH_CONSTRAINT)
      官方不推荐在ConstraintLayout中使用match_parent,可以设置 0dp

    ayout_constraintHorizontal_chainStyle来改变整条链的样式。chains提供了3种样式,分别是:
    CHAIN_SPREAD —— 展开元素 (默认);
    CHAIN_SPREAD_INSIDE —— 展开元素,但链的两端贴近parent;
    CHAIN_PACKED —— 链的元素将被打包在一起。

     <TextView
            android:id="@+id/TextView1"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toLeftOf="@+id/TextView2"
            app:layout_constraintHorizontal_weight="2" />
    
        <TextView
            android:id="@+id/TextView2"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            app:layout_constraintLeft_toRightOf="@+id/TextView1"
            app:layout_constraintRight_toLeftOf="@+id/TextView3"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintHorizontal_weight="3" />
    
        <TextView
            android:id="@+id/TextView3"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            app:layout_constraintLeft_toRightOf="@+id/TextView2"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintHorizontal_weight="4" />
    

    辅助工具

    • Optimizer
      我们使用 MATCH_CONSTRAINT 时,ConstraintLayout 将对控件进行 2 次测量,ConstraintLayout在1.1中可以通过设置 layout_optimizationLevel 进行优化,可设置的值有:
      none:无优化
      standard:仅优化直接约束和屏障约束(默认)
      direct:优化直接约束
      barrier:优化屏障约束
      chain:优化链约束
      dimensions:优化尺寸测量

    • Barrier


    假设有3个控件ABC,C在AB的右边,但是AB的宽是不固定的,这个时候C无论约束在A的右边或者B的右边都不对。当出现这种情况可以用Barrier来解决。Barrier可以在多个控件的一侧建立一个屏障,如下所示:

    这个时候C只要约束在Barrier的右边就可以了,代码如下:

    <TextView
            android:id="@+id/TextView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    
        <TextView
            android:id="@+id/TextView2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintTop_toBottomOf="@+id/TextView1" />
    
        <android.support.constraint.Barrier
            android:id="@+id/barrier"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:barrierDirection="right"
            app:constraint_referenced_ids="TextView1,TextView2" />
    
        <TextView
            android:id="@+id/TextView3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintLeft_toRightOf="@+id/barrier" />
    

    app:barrierDirection为屏障所在的位置,可设置的值有:bottom、end、left、right、start、top
    app:constraint_referenced_ids为屏障引用的控件,可设置多个(用“,”隔开)

    • Group
      Group可以把多个控件归为一组,方便隐藏或显示一组控件,举个例子:
        <TextView
            android:id="@+id/TextView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    
        <TextView
            android:id="@+id/TextView2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintLeft_toRightOf="@+id/TextView1" />
    
        <TextView
            android:id="@+id/TextView3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintLeft_toRightOf="@id/TextView2" />
    

    现在有3个并排的TextView,用Group把TextView1和TextView3归为一组,再设置这组控件的可见性,如下所示:

       <android.support.constraint.Group
            android:id="@+id/group"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:visibility="invisible"
            app:constraint_referenced_ids="TextView1,TextView3" />
    
    • Placeholder
      Placeholder指的是占位符。在Placeholder中可使用setContent()设置另一个控件的id,使这个控件移动到占位符的位置。举个例子:
    <android.support.constraint.Placeholder
            android:id="@+id/placeholder"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:content="@+id/textview"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    
        <TextView
            android:id="@+id/textview"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="#cccccc"
            android:padding="16dp"
            android:text="TextView"
            android:textColor="#000000"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    

    新建一个Placeholder约束在屏幕的左上角,新建一个TextView约束在屏幕的右上角,在Placeholder中设置 app:content="@+id/textview",这时TextView会跑到屏幕的左上角。效果如下:


    • Guideline
      Guildline像辅助线一样,在预览的时候帮助你完成布局(不会显示在界面上)。
      Guildline的主要属性:
      android:orientation 垂直vertical,水平horizontal
      layout_constraintGuide_begin 开始位置
      layout_constraintGuide_end 结束位置
      layout_constraintGuide_percent 距离顶部的百分比(orientation = horizontal时则为距离左边)
        <android.support.constraint.Guideline
            android:id="@+id/guideline1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            app:layout_constraintGuide_begin="50dp" />
    
        <android.support.constraint.Guideline
            android:id="@+id/guideline2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            app:layout_constraintGuide_percent="0.5" />
    

    guideline1为水平辅助线,开始位置是距离顶部50dp,guideline2位垂直辅助线,开始位置为屏幕宽的0.5(中点位置),效果如下:

    相关文章

      网友评论

          本文标题:ConstraintLayout

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