4

我有几个完全相同TextView的 s 垂直对齐(左侧相同的边距,左侧相同的填充,左侧相同的位置)。它们可以有不同的文本大小,并且文本可以以不同的字母开头。问题是,尽管TextViews 向左对齐,但其中的文本却不是。有可能实现这一目标吗?删除/分解每个第一个字母之前的额外空间?或者我应该寻找一些特定的字体?

下面的图片显示了这种情况。三个TextViews 向左对齐,但每个字母都从不同的点开始。sm具有相同的大小,但未对齐。相当小,差距更大。

我所看到的:
实际的

我想要的是:
预期结果(手动对齐)

示例代码:

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="m"
        android:textColor="#88FF0000"
        android:textSize="250dp" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="s"
        android:textColor="#8800FF00"
        android:textSize="250dp" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="220dp"
        android:text="i"
        android:textColor="#880000FF"
        android:textSize="25dp" />
</RelativeLayout>
4

1 回答 1

0

虽然这个问题很老,但我只是遇到了同样的问题并找到了如下解决方案,也许它可以帮助其他人:

创建一个 TextView 子类并覆盖它的onDraw()方法,如下所示:

// bounds field to avoid allocations in onDraw()
Rect bounds = new Rect();

@Override
protected void onDraw(Canvas canvas) {
    getPaint().getTextBounds(getText().toString(), 0, getText().length(), bounds);
    canvas.translate(-bounds.left, 0);
    super.onDraw(canvas);
}

警告:虽然我观察到文本边界有一个左值,该值对应于第一个字母之前的空像素数量,并且与Paint#getTextBounds()它返回的文档一致

包含所有字符的最小矩形,隐含原点位于 (0,0),

因此左侧值是实际文本的开始位置,此修复可能不适用于所有字体或配置。

还需要注意的是,这是左对齐单行文本的简单解决方案;多行或滚动文本将需要进一步调整,否则可能根本无法使用。

于 2015-08-18T11:26:01.427 回答