android 在TextView中对齐第一行

i2byvkas  于 2023-02-17  发布在  Android
关注(0)|答案(4)|浏览(326)

我有一个水平方向的LinearLayout,其中有ImageViewTextView(图像在左,文本在右)。我想将TextView的第一行(即使它有多行)与ImageView的中心对齐。我该如何实现呢?
我当前的代码将整个TextView居中,而不是仅将第一行居中:

<LinearLayout
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:orientation="horizontal"
    android:gravity="center_vertical">

        <ImageView
            android:id="@+id/icon_distance"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/icon_distance" />

        <TextView
            android:duplicateParentState="true"
            android:gravity="center_vertical"
            style="@style/taskAddressText"
            android:id="@+id/task_address"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
</LinearLayout>
1tu0hz3e

1tu0hz3e1#

您可以通过在运行时获取ImageView的高度将TextView的第一行设置为ImageView的中心,并将该高度除以2以获取ImageView的中心,然后将顶部边距或填充设置为TextView,如下所示:

<LinearLayout 
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <ImageView
        android:id="@+id/icon_distance"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:adjustViewBounds="true"
        android:background="@color/colorPrimary"
        android:src="@mipmap/ic_launcher" />

    <TextView
        android:id="@+id/task_address"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="sample address "/>

</LinearLayout>

初始化视图并在运行时从ImageView高度设置TextView顶部填充

iconDistance = (ImageView) findViewById(R.id.icon_distance);
 taskAddress = (TextView) findViewById(R.id.task_address);

 ViewTreeObserver vto = iconDistance.getViewTreeObserver();
 vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
     public boolean onPreDraw() {
        iconDistance.getViewTreeObserver().removeOnPreDrawListener(this);
        int finalHeight = iconDistance.getMeasuredHeight();
        taskAddress.setPadding(0,(convertPixelsToDp(finalHeight)/2),0,0);
        return true;
     }
 });

将像素转换为dp

public int convertPixelsToDp(int px){
   DisplayMetrics metrics = getResources().getDisplayMetrics();
   return (int) (px / ((float)metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT));
}
mnemlml8

mnemlml82#

<LinearLayout
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:orientation="horizontal"
    android:gravity="center_vertical">

        <ImageView
            android:id="@+id/icon_distance"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/icon_distance" />

        <TextView
            android:duplicateParentState="true"
            android:gravity="center_vertical"
            style="@style/taskAddressText"
            android:id="@+id/task_address"
            android:layout_gravity="center_vertical"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
</LinearLayout>
nqwrtyyt

nqwrtyyt3#

您可以将文本视图的上边距设置为图像视图大小的一半,这样它将始终从图像视图的中心开始。

Text View Top Margin = Image view Height /2
9fkzdhlc

9fkzdhlc4#

使用constraintLayout,创建一个不带文本的不可见文本视图,以保证它始终是一行,然后将不可见文本视图与实际文本视图的顶部和开始对齐。
然后将imageview约束到不可见的textview。

相关问题