ширина представления Android не больше, когда a11y изменен на большой шрифт - PullRequest
0 голосов
/ 29 августа 2018

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

Я вижу в интерфейсе текст обрезан (эллипс)

enter image description here

но мои измерения показывают, что ширина текста (503 пикселя) меньше ширины просмотра текста (587 пикселей).

как это может быть?

как мне измерить их по-другому, чтобы мой код также указывал, что ширина текста больше ширины текстового представления?

Edit:

Я пытался добавить отступы, но это не изменилось. изменение на 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);

  }

Edit:

Я пытался вычислить chipWidth, учитывая его отступы, но все же textSize заставляет текст обрезаться, в то время как его размер в коде становится короче, чем размер представления

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

Ответы [ 2 ]

0 голосов
/ 03 сентября 2018

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

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.

Я бы также порекомендовал вам увидеть Авторазмер TextViews .

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

0 голосов
/ 03 сентября 2018

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

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

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