问题:如何确定的性格指数的一个触的事件的立场在控?
-
21-09-2019 - |
题
我有一个 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;
}
编辑:该更新版本工作更好地与自然线的中断,当一个长长的单词不适合在一线和获取的分裂在中间的某个地方。
注意事项:在断字文本,点击连在结束的一线返回的索引字的旁边。也是这个方法不会的工作以及与劳动教养的案文。
不隶属于 StackOverflow