将视图底部与文本基线对齐

8
在ConstraintLayout中,是否有一种方法可以将一个视图(例如ImageView)的底部与TextView的基线对齐?我期望会有一个约束,如app:layout_constraintBottom_toBaselineOf,但实际上并没有。
注意:我尝试过使用app:layout_constraintBaseline_toBaselineOf,但看起来只适用于在TextView上定义时。
2个回答

15
这可能有点晚了,但我希望对那些阅读这篇文章的人仍然有所帮助。
在这个具体的例子中,如果你想将一个ImageViewTextView的基线对齐,ImageView的默认对齐设置是"top",不确定为什么会这样...最有可能你想要将其应用于ImageView的底部,可以通过设置android:baselineAlignBottom="true"属性来实现。更多信息请参见:https://developer.android.com/reference/android/widget/ImageView.html#attr_android:baselineAlignBottom 因此,ConstraintLayout的完整代码如下:
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">
  <TextView
      android:id="@+id/textView"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content" />
  <android.support.v7.widget.AppCompatImageView
      android:id="@+id/imageView"
      android:layout_width="96dp"
      android:layout_height="96dp"
      android:baselineAlignBottom="true"
      app:layout_constraintBaseline_toBaselineOf="@id/textView"
      app:layout_constraintStart_toEndOf="@id/textView"
      app:srcCompat="@drawable/drawable1"
      android:contentDescription="@null"/>
</android.support.constraint.ConstraintLayout>

我的项目中使用了一个 AppCompatImageView,但我相信普通的 ImageView 也可以同样工作。

通过在 ImageView 上添加 layout_alignBaseline="@id/textView",同样可以实现相同的行为,这也适用于 RelativeLayout

如果由于某些原因无法实现,例如您有自定义视图之类的情况,您也可以考虑在运行时完成它。

TextView 中有一个名为 getLastBaselineToBottomHeight 的方法。它返回最后一个文本基线和此 TextView 底部之间的距离。您可以将该值应用于您的 View 的底部边距,以获得相同的效果。尽管该方法仅在 Android P 中引入,但您可以根据源代码简单地实现它。以下是我使用的示例:

MarginLayoutParams params = (MarginLayoutParams) rootView.findViewById(R.id.imageView).getLayoutParams();
params.bottomMargin = textView.getPaddingBottom() + textView.getPaint().getFontMetricsInt().descent;

我希望那能有所帮助。祝你好运!


2
根据ConstraintLayout开发者指南,底线只能与其他底线相对约束。此外,可以使用基线对齐将一个视图的文本基线与另一个视图的文本基线对齐。从这个说明以及我的实验中,似乎无法将普通View的顶部或底部限制为TextView的基线。请注意保留HTML标签。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接