ConstraintLayout 实现控件跟随效果

实现如下效果:
文字较少时右箭头跟随文字,文字较多时在最右侧。

图 1

图 2

<androidx.constraintlayout.widget.ConstraintLayout>

<TextView
android:id="@+id/tvTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constrainedWidth="true"
app:layout_constraintEnd_toStartOf="@+id/ivArrow"
app:layout_constraintHorizontal_bias="0"
app:layout_constraintHorizontal_chainStyle="packed"
...
/>

<ImageView
android:id="@+id/ivArrow"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintStart_toEndOf="@+id/tvTitle"
...
/>

</androidx.constraintlayout.widget.ConstraintLayout>

使用链 (chain) 控制线性组

链是指通过双向位置约束条件相互关联的一组视图。链中的视图可以垂直或水平分布。

图 1 包含两个视图的水平链。

链可以才用以下几种样式之一:

  1. Spread:在考虑外边距后,视图会均匀分布。这是默认值。

  2. Spread inside:第一个视图和最后一个视图固定在链两端的约束条件上,其余视图均匀分布。

  3. Weighted:当链设置为 spreadspread inside 时,您可以通过将一个或多个视图设置为 “match constraints” (0dp),来填充剩余空间。默认情况下,空间会在设置为 “match constraints” 的每个视图之间均匀分布,但您可以使用 layout_constraintHorizontal_weightlayout_constraintVertical_weight 属性为每个视图分配重要的权重。 其工作原理与线性布局中的 layout_weight 相同:权重值最高的视图获得的空间最多,权重相同的视图获得相同的空间量。

  4. Packed:在考虑外边距后,视图会打包在一起。您可以通过更改链的 “头” 视图偏差 (bias) 来调整整个链的偏差(向左或向右,或向上或向下)。
    图 4 每种链样式的示例。

链的 “头” 视图(水平链中最左边的视图(采用从左到右的布局)和垂直链中最顶部的视图)在 XML 中定义链的样式。

可以通过给链头 View 设置属性来调整链的样式,如本文中给 tvTitle 设置 layout_constraintHorizontal_chainStyle="packed" 让文字和右箭头靠在一起。

调整约束偏差 (bias)

当您向视图的两侧添加约束条件并且相同维度的视图大小为 “fixed” 或 “wrap content” 时,view 将在这两个约束条件之间居中,默认偏差为 50%。

本文中设置 layout_constraintHorizontal_bias="0" 来让 tvTitle 在最左侧。

layout_constraintWidth

将此属性设置为 true 可让水平维度更改以遵循约束条件。默认情况下,设置为 WRAP_CONTENT 的 widget 不受限制条件的限制。

该属性在 width 为 wrap_content 时生效,默认为 false,当文字过长时会超出视图并将右箭头顶出界面。

参考

Build a responsive UI with ConstraintLayout