【发布时间】:2022-06-15 08:20:26
【问题描述】:
我正在尝试检测用户是否点击了ImageSpan。我使用Layout.getPrimaryHorizontal(offset) 来获取ImageSpan 在TextView 中的位置,但得到的值偏离了大约-28 个像素。
这里是简化的代码:
SpannableStringBuilder result = new SpannableStringBuilder();
// Insert Play icon
Drawable play = AppCompatResources.getDrawable(ctx, R.drawable.ic_play);
ImageSpan span = new ImageSpan(play, ImageSpan.ALIGN_BOTTOM);
final Rect bounds = span.getDrawable().getBounds();
result.append(" ", span, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
result.append(" x "); // The "x" is just for illustrative purposes.
// Insert waveform.
WaveDrawable dw = new WaveDrawable(new Rect(0, 0, (int) width, (int) (bounds.height() * 0.9f)));
ImageSpan wave = new ImageSpan(dw, ImageSpan.ALIGN_BASELINE);
result.append(new SpannableStringBuilder().append(" ", wave, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE), new ClickableSpan() {
@Override
public void onClick(@NonNull View widget) {
TextView tv = (TextView) widget;
Layout tvl = tv.getLayout();
Spanned fullText = (Spanned) tv.getText();
float startX = tvl.getPrimaryHorizontal(fullText.getSpanStart(wave));
float endX = tvl.getPrimaryHorizontal(fullText.getSpanEnd(wave));
Log.i(TAG, "Waveform clicked! start=" + startX +
"; end=" + endX +
"; width=" + (endX - startX) +
"; TextView width=" + widget.getWidth() +
"; drawable width=" + dw.getBounds().width());
}
}, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
logcat 的输出是
Waveform clicked! start=138.0; end=567.0; width=429.0; TextView width=601; drawable width=429
start=138.0; end=567.0 的值肯定是错误的,它们应该在 start=166.0; end=595.0; 附近
这是它的样子:
细红框是drawable的边界。白色背景是TextView。从图片中很明显,drawable 的右边缘和 TextView 之间的空间大约是 6 像素,而不是像 getPrimaryHorizontal 返回的 601-567 = 34 像素。对于比例:播放按钮的大小为 99 像素。
如果我使用相同的方法来获取 Play ImageSpan 的位置,我会得到正确的结果。
这是 Android 错误还是我的错误?
【问题讨论】: