Ширина представления Android не больше, когда a11y изменяется на большой шрифт

У меня есть код, который измеряет ширину andView 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 на самый большой шрифт и самый большой дисплей.

Я вижу в пользовательском интерфейсе текст обрезается (многоточие)

введите описание изображения здесь

но мои измерения показывают, что ширина текста (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();

2 ответа

Кажется, что решение найдено, но я хотел бы высказать несколько соображений, основанных на моих исследованиях.

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) в случае, если ваш textView является однострочным непосредственно как база сравнения (а не вычисляет ширину) . Он возвращает индекс, из которого текст усекается, иначе возвращает 0.

Я также рекомендовал бы вам видеть Autosizing TextViews.

Библиотека поддержки 26.0 обеспечивает полную поддержку функции автоматического изменения размера TextView для Android 4.0 (уровень API 14) и выше.

Из изображения я вижу, что myAccountView расширяется до закругленных краев. Его ширина простирается до закругленных краев. Но текст начинается и заканчивается после конца левого полукруга и до начала правого полукруга. Поэтому следует учитывать заполнение myAccountView. При редактировании вы рассматривали заполнение родительского элемента myAccountView, который не имеет отношения к делу.

При измерении ширины чипа следует учитывать заполнение.

int chipWidth = myAccountView.getMeasuredWidth() - myAccountView.getPaddingLeft() - myAccountView.getPaddingRight();
Другие вопросы по тегам