13

目前,我paintObject.measureText(textCopy.substring(0,i))在迭代 TextView 文本的副本时使用。例如,measureText("abc".substring(0,1))会给我 'b' 的相对 x 坐标。我从中得到的ylayout.getLineTop()坐标。这对非等宽字体的x坐标有效,但不准确。我可以稍微校准一下,但在每台设备上它的工作方式都不同。

我能想到的最佳解决方案是覆盖负责在屏幕上绘制 TextView 的类,并希望获得绘制到屏幕上的每个字符的坐标。

有谁知道我需要覆盖什么类来完成这个?或者也许是其他一些创造性的解决方案?

4

2 回答 2

13

好吧,这似乎是某种错误Paint.measureText()或其他更深层次的错误。但我终于找到了解决方法:

layout.getPrimaryHorizontal(int offset)

这很容易。您只需使用它使用的文本长度来遍历布局。

它将返回字符不考虑行位置的 x。所以我仍然从layout.getLineTop(). 顺便说一句,如果您使用的是layout.getLineTop(),请注意有一些奇怪的行为,可能是一个错误。我在这里提交了一个错误报告。

于 2013-08-15T19:54:16.467 回答
2

Java 解决方案

这是有关如何获取特定字符的x和坐标的完整代码。是's 文本中所需字符的索引。这些坐标是相对于父容器的yoffsettextView

Layout layout = textView.getLayout();
if (layout == null) { // Layout may be null right after change to the text view
    // Do nothing
}

int lineOfText = layout.getLineForOffset(offset);
int xCoordinate = (int) layout.getPrimaryHorizontal(offset);
int yCoordinate = layout.getLineTop(lineOfText);

Kotlin 扩展函数

如果您希望多次使用它:

fun TextView.charLocation(offset: Int): Point? {
    layout ?: return null // Layout may be null right after change to the text view

    val lineOfText = layout.getLineForOffset(offset)
    val xCoordinate = layout.getPrimaryHorizontal(offset).toInt()
    val yCoordinate = layout.getLineTop(lineOfText)
    return Point(xCoordinate, yCoordinate) 
}

注意:为确保布局不为空,您可以textview.post(() -> { /* get coordinates */ })在 Java 或textview.post { /* get coordinates */ }Kotlin中调用

于 2019-06-24T16:12:14.367 回答