我有一个带有OnTouchListener
的TextView
。我的目标是在获取MotionEvent
时,获得用户所指向的字符索引。有没有办法获取TextView
的底层字体度量?
我有一个带有OnTouchListener
的TextView
。我的目标是在获取MotionEvent
时,获得用户所指向的字符索引。有没有办法获取TextView
的底层字体度量?
你尝试过像这样的方法吗:
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
}
希望这可以帮助到你...
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;
}
编辑:这个更新版本在处理不自然的换行时表现更佳,当一个长单词无法符合一行并被拆分时。
注意事项:在连字号的文本中,点击行尾的连字号将返回其旁边字符的索引。此方法也不适用于RTL文本。