Android 如何在文本视图中获取可点击范围的坐标?

Android 如何在文本视图中获取可点击范围的坐标?,android,textview,position,clickable,Android,Textview,Position,Clickable,我有一个文本视图,其中有许多可点击span 单击ClickableSpan,我必须获得屏幕上的坐标(在其位置显示自定义视图) 问题是我不知道如何才能做到这一点。ClickableSpan的onClick()方法在参数aView中为我提供了TextView,其中包含ClickableSpan 我使用了以下方法来获取文本视图中的字符位置,但我不知道如何将其转换为文本屏幕上的x/y位置 @Override public void onClick(View v){ SpannableStrin

我有一个
文本视图
,其中有许多
可点击span

单击
ClickableSpan
,我必须获得屏幕上的坐标(在其位置显示自定义
视图

问题是我不知道如何才能做到这一点。
ClickableSpan
onClick()
方法在参数a
View
中为我提供了
TextView
,其中包含
ClickableSpan

我使用了以下方法来获取
文本视图中的字符位置,但我不知道如何将其转换为文本屏幕上的x/y位置

@Override
public void onClick(View v){

    SpannableString completeText = (SpannableString)((TextView) v).getText();
    Log.v("characters position", completeText.getSpanStart(this) + " / " + completeText.getSpanEnd(this));

}
提前感谢您的帮助

编辑:我想获得ClickableSpan的整个坐标及其大小,目的是在文本的底部中心显示我的自定义视图。onTouch方法将为我提供手指位置,而不是整个文本坐标。因此,使用此方法,我将不会占据文本的中间部分。

我找到了一个解决方案:-)
@Override
public void onClick(View v){

    SpannableString completeText = (SpannableString)((TextView) v).getText();
    Log.v("characters position", completeText.getSpanStart(this) + " / " + completeText.getSpanEnd(this));

}
在这里,也许这会帮助像我一样有同样问题的人

// Initialize global value
this.parentTextViewRect = new Rect();
        
        
// Initialize values for the computing of clickedText position
SpannableString completeText = (SpannableString)(parentTextView).getText();
Layout textViewLayout = parentTextView.getLayout();
        
double startOffsetOfClickedText = completeText.getSpanStart(clickedText);
double endOffsetOfClickedText = completeText.getSpanEnd(clickedText);
double startXCoordinatesOfClickedText = textViewLayout.getPrimaryHorizontal((int)startOffsetOfClickedText);
double endXCoordinatesOfClickedText = textViewLayout.getPrimaryHorizontal((int)endOffsetOfClickedText);
        
        
// Get the rectangle of the clicked text
int currentLineStartOffset = textViewLayout.getLineForOffset((int)startOffsetOfClickedText);
int currentLineEndOffset = textViewLayout.getLineForOffset((int)endOffsetOfClickedText);
boolean keywordIsInMultiLine = currentLineStartOffset != currentLineEndOffset;
textViewLayout.getLineBounds(currentLineStartOffset, this.parentTextViewRect);
        
        
// Update the rectangle position to his real position on screen
int[] parentTextViewLocation = {0,0};
parentTextView.getLocationOnScreen(parentTextViewLocation);
        
double parentTextViewTopAndBottomOffset = (
    parentTextViewLocation[1] - 
    parentTextView.getScrollY() + 
    this.parentTextView.getCompoundPaddingTop()
);
this.parentTextViewRect.top += parentTextViewTopAndBottomOffset;
this.parentTextViewRect.bottom += parentTextViewTopAndBottomOffset;
        
// In the case of multi line text, we have to choose what rectangle take
if (keywordIsInMultiLine){
            
    int screenHeight = this.mWindowManager.getDefaultDisplay().getHeight();
    int dyTop = this.parentTextViewRect.top;
    int dyBottom = screenHeight - this.parentTextViewRect.bottom;
    boolean onTop = dyTop > dyBottom;
            
    if (onTop){
        endXCoordinatesOfClickedText = textViewLayout.getLineRight(currentLineStartOffset);
    }
    else{
        this.parentTextViewRect = new Rect();
        textViewLayout.getLineBounds(currentLineEndOffset, this.parentTextViewRect);
        this.parentTextViewRect.top += parentTextViewTopAndBottomOffset;
        this.parentTextViewRect.bottom += parentTextViewTopAndBottomOffset;
        startXCoordinatesOfClickedText = textViewLayout.getLineLeft(currentLineEndOffset);
    }
            
}
        
this.parentTextViewRect.left += (
    parentTextViewLocation[0] +
    startXCoordinatesOfClickedText + 
    this.parentTextView.getCompoundPaddingLeft() - 
    parentTextView.getScrollX()
);
this.parentTextViewRect.right = (int) (
    this.parentTextViewRect.left + 
    endXCoordinatesOfClickedText - 
    startXCoordinatesOfClickedText
);

重写onTouch()并使用event.getX(),event.getY()?感谢您的回答!不幸的是,我发现这个方法非常。。。丑!我希望有更好的解决办法。此外,我忘了给出另一个精度:我想得到ClickableSpan的整个坐标及其大小,目的是在文本的底部中心显示我的自定义视图。onTouch方法将为我提供手指位置,而不是整个文本坐标。因此,使用这种方法,我将不会有文本的中间部分。还有别的想法吗?