1

我有一些代码可以测量 android textView 的宽度和要在其中显示的文本。

final ViewTreeObserver[] viewTreeObserver = {myAccountView.getViewTreeObserver()};
    viewTreeObserver[0].addOnPreDrawListener(
        new OnPreDrawListener() {
          @Override
          public boolean onPreDraw() {
            myAccountView.setText(R.string.og_my_account_desc_long_length);
            int chipWidth = myAccountView.getMeasuredWidth();
            if (chipWidth > 0) {
              setChipTextWithCorrectLength(chipWidth);
              viewTreeObserver[0] = myAccountView.getViewTreeObserver();
              if (viewTreeObserver[0].isAlive()) {
                viewTreeObserver[0].removeOnPreDrawListener(this);
              }
            }
            return true;
          }
        });
  }

  private void setChipTextWithCorrectLength(int chipWidth) {
    String desc =
        setChipTextWithCorrectLength(
            getContext().getString(R.string.og_my_account_desc_long_length),
            getContext().getString(R.string.og_my_account_desc_meduim_length),
            getContext().getString(R.string.og_my_account_desc_short_length),
            chipWidth);
    myAccountView.setText(desc);
  }

  @VisibleForTesting
  String setChipTextWithCorrectLength(
      String longDesc, String mediumDesc, String shortDesc, int clipWidth) {
    if (textWidthPixels(longDesc) > clipWidth) {
      if (textWidthPixels(mediumDesc) > clipWidth) {
        return shortDesc;
      } else {
        return mediumDesc;
      }
    }
    return longDesc;
  }

  public float textWidthPixels(String text) {
    TextPaint textPaint = myAccountView.getPaint();
    return textPaint.measureText(text);
  }

我将我的设备 a11y 更改为最大的字体和最大的显示。

我在 UI 中看到文本被截断(椭圆形)

在此处输入图像描述

但我的测量结果显示文本宽度(503 像素)小于文本视图宽度(587 像素)。

怎么可能?

我应该如何以不同的方式测量它们,这样我的代码也会指示文本宽度大于文本视图宽度?

编辑:

我试图添加填充,但它没有改变。更改为 a11y 会截断长文本,而不是选择较短的文本。

  public float textWidthPixels(String text) {
    TextPaint textPaint = myAccountView.getPaint();
    View parent = (View) myAccountView.getParent();
    float width = textPaint.measureText(text);

    int paddingLeft = parent.getPaddingLeft();
    int paddingRight = parent.getPaddingRight();
    return width - (paddingLeft + paddingRight);

  }

编辑:

我已经尝试考虑它的填充来计算chipWidth,但是textSize仍然会使文本截断,而它在代码中绘制的大小比视图大小短

int chipWidth = myAccountView.getMeasuredWidth() - myAccountView.getPaddingLeft() - myAccountView.getPaddingRight();
4

2 回答 2

1

似乎已经找到了解决方案,但我想根据我的研究提出几点。

int textViewWidth = textView.getMeasuredWidth();

返回 textView 的宽度,包括任何填充。

对于附文:

  1. 可以使用 measureText() :

    TextPaint paint = textView.getPaint(); int textWidth = (int)paint.measureText(textView.getText().toString());

  2. 使用getTextBounds()

    TextPaint paint = textView.getPaint(); Rect bounds = new Rect(); paint.getTextBounds(textView.getText().toString(),0,textView.getText().toString().length(),bounds); int textWidth = bounds.width();

通过将填充值添加到 textWidth 或从 textViewWidth 中减去来比较这些值是您的比较基础。

对于以上两种方式的区别

您也可以尝试textView.getLayout().getEllipsisStart(0) 在比较 base(而不是计算宽度)时直接使用 textView 的情况。它返回文本被截断的索引,否则返回 0。

我还建议您查看 Autosizing TextViews

支持库 26.0 完全支持 Android 4.0(API 级别 14)及更高版本的自动调整 TextView 功能。

于 2018-09-03T12:28:37.890 回答
0

从图像中我看到 myAccountView 扩展到圆角边缘。它的宽度跨越到圆形边缘。但是文本在左半圆结束之后和右半圆开始之前开始和结束。所以应该考虑 myAccountView 的填充。在您的编辑中,您考虑了 myAccountView 的父级的填充,它没有相关性。

在测量芯片宽度时,应考虑填充。

int chipWidth = myAccountView.getMeasuredWidth() - myAccountView.getPaddingLeft() - myAccountView.getPaddingRight();
于 2018-09-03T11:34:15.897 回答