ConstraintLayout探秘

前言

Constraint Layout是Google在2016年的Google I/O大会上提出的一个可以灵活控制子控件的位置和大小的新布局。并且其号称可以实现布局最大程度的扁平化。

基本属性

View之间的约束关系建立的基本配置属性有一下13中:

  • layout_constraintLeft_toLeftOf
  • layout_constraintLeft_toRightOf
  • layout_constraintRight_toLeftOf
  • layout_constraintRight_toRightOf
  • layout_constraintTop_toTopOf
  • layout_constraintTop_toBottomOf
  • layout_constraintBottom_toTopOf
  • layout_constraintBottom_toBottomOf
  • layout_constraintBaseLine_toBaselineOf
  • layout_constraintStart_toStartOf
  • layout_constraintStart_toEndOf
  • layout_constraintEnd_toStartOf
  • layout_constraintEnd_toEndOf

总结:可以看出约束的对象就是 左右排列组合,上下排列组合,开始末尾排列组合,再加上一个文字底线对齐。
拿左右组合来说,button1设置app:layout_constraintLeft_toRightOf="@id/button2"属性,button1的左边就会button2的右边,以此类推。

ConstraintLayout探秘_第1张图片
相对定位约束

baseline对齐(文字底部)

可以设置文本View的文字底部基线对齐


ConstraintLayout探秘_第2张图片
baseline对齐

边距

除了设置普通边距android:layout_marginXxx(Start|End|Left|Right|Top|Bottom)上下左右开头末尾的边距,还可以使用layout_goneMarginXxx(Start|End|Left|Right|Top|Bottom)配置依赖对象状态为gone时的margin

拉伸居中

layout_contraintX1xx_toX1xxOf="parent"
layout_contraintX2xx_toX2xxOf="parent"

在使用约束属性时,当X1xx和X2xx相对(即X1xx=Left,X2xx=Right)就会造成拉升情况。

layout_contraintLeft_toLeftOf="parent"
layout_contraintRight_toRightOf="parent"
居中定位
偏压

在拉伸时可以设置拉伸的比例

layout_contraintHorizontal_bias="0.3"
layout_contraintVertical_bias="0.3"
偏心定位

圆形定位(在V1.1增加)

ConstraintLayout探秘_第3张图片
ConstraintLayout探秘_第4张图片

在ConstraintLayout中可以设置View以另外一个View为圆心定位

View的大小

在上面的拉伸居中其实隐藏一个前提条件,那就是子View的大小小于ConstraintLayout。
ConstraintLayout的子View设置android:layout_width或者android:layout_height时,match_parent是无效的,可以使用0dp来替代。

ConstraintLayout探秘_第5张图片
纬度约束

// (a)

强制约束(在1.1增加)

在子View使用wrap_content,内容可能会超出最大使用空间,导致约束失效。可以用强制约束来保证约束的正常。

app:layout_contrainedWidth="true|false"
app:layout_contrainedHeight="true|false"

宽高百分比设置

子View参照父类宽高百分比设置大小前提
1、宽度要设置百分比要设置layout_width="0dp",高也相同
2、要设置任意一个约束约束关系

参照父类宽高
ConstraintLayout探秘_第6张图片
参照父类百分比布局
参照自身
ConstraintLayout探秘_第7张图片
image.png

app:layout_contraintDimensionRatio的值是可以用比例或者float表示宽高比;也可以指定限制w和h来表示限制的高度或者宽度

chains(链)

  • 如果一组小部件通过双向连接,显示一个最小链,并带有两个小部件)连接在一起,则它们被视为链。
ConstraintLayout探秘_第8张图片
生成链
  • 链由链的第一个元素(链的“头”)上设置的属性控制
  • 头是水平链最左边的部件,也是垂直链最顶端的部件。
chains-head

设置属性layout_constraintHorizontal_chainStyle或layout_constraintVertical_chainStyle链条的第一个元素时,链条的行为将根据指定的样式(默认为CHAIN_SPREAD)更改。

  • CHAIN_SPREAD - 元素将被分散(默认样式)
  • 加权链式CHAIN_SPREAD模式下,如果某些小部件设置为MATCH_CONSTRAINT,它们将拆分可用空间
  • CHAIN_SPREAD_INSIDE - 类似,但链条的终点不会被分散
  • CHAIN_PACKED - 链条的元素将被打包在一起。小孩的水平或垂直偏向属性将影响打包元素的位置
ConstraintLayout探秘_第9张图片
chains-styles

Guideline

辅助对象,可以做为参数线设置空间对齐,本身不会显示。有竖直和水平两种,可以设置距离begin/enddp数值,可以按照高宽的百分设置。

ConstraintLayout探秘_第10张图片
Guideline

查看源码可以看出,在Guideline所有构造方法中,设置为隐藏(public static final int GONE = 0x00000008;),并重写了setVisibility(int visibility)为空实现。

public class Guideline extends View {
    public Guideline(Context context) {
        super(context);
        super.setVisibility(8);
    }
    // 空实现
    public void setVisibility(int visibility) {
    }
    // 设置宽高等于0
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        this.setMeasuredDimension(0, 0);
    }
    ······其他方法

使用Guideline来居中对齐两个按钮


ConstraintLayout探秘_第11张图片
guideline

优点:

  • 功能强大,合适使用基本可以改善嵌套层级过多问题。
  • 集成了LinearLayout、Relativelayout、percent-support-lib 特点

缺点:

  • 布局复杂,控件比较多时,使用拖拉不太方便,容易误伤,建议代码编写布局

你可能感兴趣的:(ConstraintLayout探秘)