【问题标题】:Weird behavior of Layout.getPrimaryHorizontal: values are off by ~28 pixelsLayout.getPrimaryHorizo​​ntal 的奇怪行为:值偏离了约 28 个像素
【发布时间】:2022-06-15 08:20:26
【问题描述】:

我正在尝试检测用户是否点击了ImageSpan。我使用Layout.getPrimaryHorizontal(offset) 来获取ImageSpanTextView 中的位置,但得到的值偏离了大约-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 错误还是我的错误?

【问题讨论】:

    标签: android android-layout


    【解决方案1】:

    我最终想通了:TextView 有填充。布局坐标不考虑填充,而 TextView 坐标可以。

    【讨论】:

      猜你喜欢
      • 2018-09-08
      • 1970-01-01
      • 2014-09-11
      • 1970-01-01
      • 2017-08-02
      • 1970-01-01
      • 2021-02-12
      • 1970-01-01
      • 2020-02-13
      相关资源
      最近更新 更多