[英]Android onAccessibilityEvent get X and Y position of TextView
[英]How to get x,y position of clicked span in android TextView?
我有一個可跨越的 Textview。 我想在TextView
內的選定跨度頂部顯示彈出窗口。 像這樣:
我的代碼是:
String definition = textView.getText().toString().trim();
textView.setMovementMethod(LinkMovementMethod.getInstance());
textView.setText(definition, TextView.BufferType.SPANNABLE);
Spannable spans = (Spannable) textView.getText();
Integer[] indices = getIndices(
textView.getText().toString(), ' ');
int start = 0;
int end = 0;
for (int i = 0; i <= indices.length; i++) {
ClickableSpan clickSpan = getClickableSpan();
end = (i < indices.length ? indices[i] : spans.length());
spans.setSpan(clickSpan, start, end,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
start = end + 1;
}
private Integer[] getIndices(String s, char c) {
int pos = s.indexOf(c, 0);
List<Integer> indices = new ArrayList<Integer>();
while (pos != -1) {
indices.add(pos);
pos = s.indexOf(c, pos + 1);
}
return (Integer[]) indices.toArray(new Integer[0]);
}
private ClickableSpan getClickableSpan() {
return new ClickableSpan() {
@SuppressLint("ClickableViewAccessibility")
@Override
public void onClick(View widget) {
TextView tv = (TextView) widget;
final String word = tv
.getText()
.subSequence(tv.getSelectionStart(),
tv.getSelectionEnd()).toString();
tv.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
popup(word, (int) event.getRawX(), (int) event.getRawY());
return false;
}
});
}
};
}
正如您在圖像代碼中看到的那樣,但由於在 android 中的onClick
之前調用了onTouch
,彈出窗口顯示了在上一步中單擊的單詞。 抱歉可能英語不好。
val parentTextViewRect = Rect()
val textViewLayout = parentTextView.layout
val startXCoordinatesOfClickedText = textViewLayout.getPrimaryHorizontal(spanStart).toDouble()
val endXCoordinatesOfClickedText = textViewLayout.getPrimaryHorizontal(spanEnd).toDouble()
val currentLineStartOffset = textViewLayout.getLineForOffset(spanStart)
val currentLineEndOffset = textViewLayout.getLineForOffset(spanEnd)
// 文本是否跨行
val keywordIsInMultiLine = currentLineStartOffset != currentLineEndOffset
textViewLayout.getLineBounds(currentLineStartOffset, parentTextViewRect)
// 屏幕中的真實位置
val parentTopAndBottomOffset = parentTextView.top + parentTextView.paddingTop
parentTextViewRect.top += parentTopAndBottomOffset
parentTextViewRect.bottom += parentTopAndBottomOffset
val parentLeftOffset = parentTextView.left + parentTextView.paddingLeft
parentTextViewRect.left += (parentLeftOffset + startXCoordinatesOfClickedText).toInt()
parentTextViewRect.right = (parentTextViewRect.left + endXCoordinatesOfClickedText - startXCoordinatesOfClickedText).toInt()
var spanTextLeft = if (keywordIsInMultiLine) {
parentTextViewRect.left
} else {
(parentTextViewRect.left + parentTextViewRect.right) / 2
}
val spanTextTop = parentTextViewRect.top
Log.d("MainActivity", "spanTextLeft = $spanTextLeft")
Log.d("MainActivity", "spanTextTop = $spanTextTop")
要獲得x
和y
您可以設置OnTouchListener
來注冊點擊事件
private void setOnTouchListener() {
textView.setOnTouchListener((view, event) -> {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
float clickedX = event.getX();
float clickedY = event.getY();
}
return false;
});
}
private fun setOnTouchListener() {
text_view.setOnTouchListener { view, event ->
if (event?.action == MotionEvent.ACTION_DOWN) {
val clickedX = event.x
val clickedY = event.y
}
false
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.