我有一个 TextView 有一个 OnTouchListener.我要的是性格指数的用户是指当我得到的 MotionEvent.是否有任何方式获得的潜在的字体指标 TextView?

有帮助吗?

解决方案

我不知道还有一个简单直接的方式这样做,但你应该能够把东西放在一起使用 油漆 目的在控通过一个呼叫 控.getPaint()

一旦你有油漆的对象,你将有机会获得基本FontMetrices通过调用油漆。getFontMetrics()和访问的其他功能,如油漆。measureText()油漆。getTextBounds(),和油漆。getTextWidths()访问的实际尺寸显示的案文。

其他提示

您是否尝试过这样的事情:

Layout layout = this.getLayout();
if (layout != null)
{
    int line = layout.getLineForVertical(y);
    int offset = layout.getOffsetForHorizontal(line, x);

    // At this point, "offset" should be what you want - the character index
}

希望这有助于...

同时,它通常的工作我有几个问题的答案托尼*布鲁斯。

首先 getOffsetForHorizontal 返回的一个偏即使x坐标是超越过去的性行。

其次返回的性格有时候偏属于下角,不符面的指针。显然的方法返回的偏移的最近的标位置。这可能是左或右边的字取决于什么是更接近。

我的解决方案使用 getPrimaryHorizontal 而不是确定标位置有一定的偏移和使用的二进行搜索,以查找抵消下的指针的x坐标。

public static int getCharacterOffset(TextView textView, int x, int y) {
    x += textView.getScrollX() - textView.getTotalPaddingLeft();
    y += textView.getScrollY() - textView.getTotalPaddingTop();

    final Layout layout = textView.getLayout();

    final int lineCount = layout.getLineCount();
    if (lineCount == 0 || y < layout.getLineTop(0) || y >= layout.getLineBottom(lineCount - 1))
        return -1;

    final int line = layout.getLineForVertical(y);
    if (x < layout.getLineLeft(line) || x >= layout.getLineRight(line))
        return -1;

    int start = layout.getLineStart(line);
    int end = layout.getLineEnd(line);

    while (end > start + 1) {
        int middle = start + (end - start) / 2;

        if (x >= layout.getPrimaryHorizontal(middle)) {
            start = middle;
        }
        else {
            end = middle;
        }
    }

    return start;
}

编辑:该更新版本工作更好地与自然线的中断,当一个长长的单词不适合在一线和获取的分裂在中间的某个地方。

注意事项:在断字文本,点击连在结束的一线返回的索引字的旁边。也是这个方法不会的工作以及与劳动教养的案文。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top