Android:するあらゆる側面を含んでいます文字インデックスのタッチイベントの位置TextView?
-
21-09-2019 - |
質問
してい TextView
と OnTouchListener
.だいたいの文字インデックスのユーザーが差した時を取得します。 MotionEvent
.、本当にありがとうに基本となるフォントメトリクスの TextView
?
解決
私はこれを行うための簡単な直接的な方法を知らないが、あなたは何かを一緒にすることができるはずだ ペイント 通話を介したTextViewのオブジェクト textView.getPaint()
ペイントオブジェクトを取得したら、paint.getFontmetrics()への呼び出しを介して基礎となるフォントメトリックにアクセスし、paint.measureText()paint.getTextBounds()、Paint.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;
}
編集:この新しいものを作り不自然なラインが長いの単語が合わないラインが分割のどこかにいます。
注意:にhyphenatedテキスト、クリック出版者(社)名を入力してくださは、行の末尾に戻る文字のインデックスがあります。またこの方法などのRTLとします。