ConstraintLayout详解与使用方法

作者: mengming | 来源:发表于2018-03-20 18:28 被阅读50次

ConstrainLayout 是 AndroidStudio2.2 的新特性,能够很方便的用于可视化开发,有点类似于 ios 的 storyboard,解决了 xml 过于复杂的问题。


约束

相对定位(Relative positioning)

也就是我们之前常用的relativelayout,属性也与其一致,使用方法如:layout_constraintLeft_toLeftOf,位置用一张图片解释。


边距(Margins)

同之前的margin使用方法。

  • goneMargin

    简单的解释,就是当位置约束的目标可见性为View.Gone时,可以调整它的边距值变为与父布局的margin值。下文将有示例解释。


居中定位(Centering positioning)
通过定义上下左右的相邻控件或父容器来设置居中。可以形象的理解为两个大小相同,方向相反的力作用在控件上。

如下,通过定义top, bottom, start, end就可以使textview在parent居中显示。

<TextView
 android:id="@+id/textView"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:text="TextView"
 app:layout_constraintBottom_toBottomOf="parent"
 app:layout_constraintEnd_toEndOf="parent"
 app:layout_constraintStart_toStartOf="parent"
 app:layout_constraintTop_toTopOf="parent" />

倾向(bias)
搭配bias,就像两个力大小不相等,使其往一个方向靠拢。 bias = 0.3
  • layout_constraintHorizontal_bias:水平偏向

  • layout_constraintVertical_bias:垂直偏向

  • 0为最左上,1为最右下,默认为0.5。


圆定位(Circular positioning)(1.1新特性)
可以理解为以一个控件为圆心,设定半径和角度,决定另一个控件的位置。如图
  • layout_constraintCircle : 参照的控件id(圆心)

  • layout_constraintCircleRadius : 距离参照物的距离(两控件中心点间距离)

  • layout_constraintCircleAngle : 偏移角度(0为正上方,0~360)


可见性行为(Visibility behavior)

这是针对View.GONE的特定处理。Gone隐藏的控件,会被当成一个点,同时忽略margin。如图。

  • 当A消失时,B的边距将为原来与A的约束边距。

  • 另一种方法,用goneMargin生成新的边距,而原来与A的约束边距将不起作用。

  • 这种特定的行为可以做到特殊的布局,比如上图A消失时B位置不变,设A宽度为100,边距为10,B对A约束为20,那么goneMargin=100+10+20=130,则可以实现A隐藏后B位置不变。


尺寸约束(Dimensions constraints)
  • 可以定义ConstraintLayout布局的尺寸

  • 可以定义控件的尺寸,有三种方式:

    1. 确定尺寸:123dp
    1. WRAP_CONTENT

    2. 0dp

  • 0dp,相当于match_constraint,意思就是填满约束的空间。如果设置了margin值,也需要去掉margin的空间。


比例(Ratio)
  • 可以按比例设置控件的宽高,定义其中一个维度为0dp,并设置属性layout_constraintDimensionRatio,值可以为0~1的浮点数或比例x:x。

  • 可以设置两个维度均为0dp,同时在ratio值前加W或H分别约束宽度或高度。

     <Button android:layout_width="0dp"
     android:layout_height="0dp"
     app:layout_constraintDimensionRatio="H,16:9"
     app:layout_constraintBottom_toBottomOf="parent"
     app:layout_constraintTop_toTopOf="parent"/>
  • 如上,将以button的最大约束宽度,16:9的比例定义button的高度

链条(Chains)
  • 将一个维度的一组控件组成一个链条,另一个维度可以单独控制,相当于绑成一个组件。

  • 一组部件通过双向连接就形成一个链条。
  • 水平链的最左边和竖直链的最上边成为链头。
  • 如果连接中设置了margin,要考虑在内。

  • 链条样式(Chain Style)

    给链条第一个元素设置属性layout_constraintHorizontal_chainStylelayout_constraintVertical_chainStyle,则链条会根据样式更改。(默认CHAIN_SPREAD

    • spread:元素间分散开

    • spread_inside:端点除外,元素间分散开,如上图区别

    • packed:元素间打包,即贴在一起

  • 权重链(Weighted chains)

    类似LinearLayout里的WEIGHT属性,若元素使用MATCH_CONSTRAINT,就是这些元素使用约束后的空间。

    • layout_constraintHorizontal_weight

    • layout_constraintVertical_weight


虚拟辅助元素(Virtual Helper objects)

可以使用辅助对象来创建相对约束,可以通过水平或垂直的Guideline来定位控件。

  • Guideline

    • 不会被显示,只会辅助布局

    • 定位Guideline有三种方式:

      layout_constraintGuide_begin:距离左侧或顶部的固定距离

      layout_constraintGuide_end:距离右侧或底部的固定距离

      layout_constraintGuide_percent:父控件的高度或宽度的百分比


可视化操作

约束控键类型
  • 调整尺寸大小:正方形四角

  • 侧边约束:四边圆形,约束四边的位置

  • 基线约束:文字下方条状,用于对齐文字

添加约束
  • 点击控键,选中圆点拖动到要约束的位置。如图,要将控件放于左上角,将左边和上边分别拉到屏幕边缘即可。
  • 两个控件间添加约束,要将第二个textview放于第一个的下方,只需要将左边约束对齐,上边约束到第一个textview的下方即可。要注意的是,添加完约束后,会有一个默认margin值,导致左边没对齐,此时在右侧的Attributes中将margin调为0即可。
删除约束
  • 删除单个约束:点击具体的约束发起点即可删除。

  • 删除单个控件的所有约束:点击控件,在左下方有删除所有约束的按钮,点击即可。

  • 删除整个界面的所有约束:在上方工具栏找到

    按钮即可删除。

Inspector的使用

这个界面就是控件的属性。我们除了可以修改一些基本属性,还有一些新的功能。

  • 修改尺寸

    这里有三种尺寸描述方式:


    • :wrap_content


    • :固定数值(100dp)


    • :match_constraint

    关于这三个属性的区别上面已经解释过,大家看动图可以观察出区别。

  • 调整bias

    滑动那个滑块调节即可。

  • 使用guideline

    可以使用guideline进行百分比布局,再不用担心适配问题了。

  • 自动添加约束

    在上方的工具栏找到

    ,就可以开启AutoConnect,虽然有时候可能不能达到你想要的布局,但大部分时候可以减轻你的工作量。


总结

参考官方文档
用constraintLayout可以完全替换掉之前的linearLayout和relativeLayout,使用也很方便,希望能帮大家快速上手。

相关文章

网友评论

    本文标题:ConstraintLayout详解与使用方法

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