删除文本第一个字母之前的多余空格,以便它可以正确对齐到左侧

Posted

技术标签:

【中文标题】删除文本第一个字母之前的多余空格,以便它可以正确对齐到左侧【英文标题】:Remove extra space before first letter of text so it can be properly aligned to the left 【发布时间】:2012-10-19 00:34:10 【问题描述】:

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

下面的图片显示了这种情况。有三个TextViews 与左边对齐,但每个字母的开始点不同。 sm 大小相同,但未对齐。 i 比较小,差距要大很多。

我所看到的:

我想要什么:

示例代码:

<RelativeLayout
    android:layout_
    android:layout_ >

    <TextView
        android:layout_
        android:layout_
        android:text="m"
        android:textColor="#88FF0000"
        android:textSize="250dp" />

    <TextView
        android:layout_
        android:layout_
        android:text="s"
        android:textColor="#8800FF00"
        android:textSize="250dp" />

    <TextView
        android:layout_
        android:layout_
        android:layout_marginTop="220dp"
        android:text="i"
        android:textColor="#880000FF"
        android:textSize="25dp" />
</RelativeLayout>

【问题讨论】:

我认为这对于 TextView 是不可能的。您可能可以使用来自Paint.getTextWidths() 的信息自己使用画布并绘制文本,但我不知道从中返回的宽度是否包括周围的空白(我猜它赢了'没有帮助)。 我相信 TextView 是可能的,它只需要一个 MonoSpaced 字体。 我试过 android:typeface="monospace" 并没有帮助。 【参考方案1】:

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

创建一个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),

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

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

【讨论】:

感谢提交。将在第一时间检查您的解决方案并更新答案的状态。

以上是关于删除文本第一个字母之前的多余空格,以便它可以正确对齐到左侧的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式删除一行中第一个空格出现之前的所有内容?

识别文本中的空格

Eclipse 保存时自动删除空格 自动去掉语句后面多余的空格?

请教一个批量删除文本文件中多余回车或提取文本中前两行数据的shell脚本,请高手指点,万分感谢

华为OD机试真题 JS 实现去除多余空格2023 Q1 | 200分

华为OD机试真题 Java 实现去除多余空格2022.11 Q4 新题