parentWidth возвращает неправильное значение, когда размер дисплея самый большой? - PullRequest
3 голосов
/ 05 февраля 2020

Я расширяю com.google.android.material.chip.Chip

У меня есть текст, который я измеряю в onMeasure.

Мой расчет говорит, что текст может поместиться в пространстве чипа, но на самом деле я вижу текст обрезан.

Я не ожидал бы усечения, так как я измеряю перед передачей макета.

* Я использую самый большой размер дисплея, самый большой размер шрифта, шрифты Украины.

Должен ли я как-то изменить свой измерительный код?

  private String getLongestPossibleChipText(int textMaxWidth) {

final MarginLayoutParams layoutParams = (MarginLayoutParams) getLayoutParams();
final View parent = (View) getParent();
final int parentPaddingLeft = parent.getPaddingLeft();
final int parentPaddingRight = parent.getPaddingRight();
final int paddingLeft = getPaddingLeft();
final int paddingRight = getPaddingRight();
final int leftMargin = layoutParams.leftMargin;
final int rightMargin = layoutParams.rightMargin;

final int currentTextMaxWidth =
    parentWidth
        - (parentPaddingLeft
            + parentPaddingRight
            + paddingLeft
            + paddingRight
            + leftMargin
            + rightMargin);


    final TextPaint paint = getPaint();
    for (String chipText : chipTexts) {
      if (paint.measureText(chipText) <= currentTextMaxWidth) {
        return chipText;
      }
    }
    return Iterables.getLast(chipTexts);
  }

1 Ответ

2 голосов
/ 12 февраля 2020

Не думаю, что длина текста вычисляется правильно. Из документации для ChipDrawable есть некоторая внутренняя структура для Chip, которую я не думаю, что код учитывает. ( Chip - это оболочка для ChipDrawable .) Я воспроизведу диаграмму здесь:

enter image description here

It может быть, что все внутренние отступы равны нулю, так что это не имеет значения. Тем не менее,


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

*1019* *1020*. Следующий код должен вычислять текстовое пространство, доступное в пределах * 1021. * Чип правильно и выбрать строку с наилучшим соответствием. Массив кандидатов должен быть отсортирован в порядке возрастания по длине строки. При определенных обстоятельствах другой персонаж может выглядеть так, как будто он подходит, но это не является подходящим интервалом между символами (который является частью символа). Если это проблема, можно улучшить внешний вид, используя Paint # getTextBounds () .

private fun findBestFitForChip(chip: Chip, candidates: Array<String>): String {
    val parent = chip.parent as ViewGroup
    val maxChipWidth =
        if (chip.layoutParams.width == ViewGroup.LayoutParams.WRAP_CONTENT) {
            parent.width - parent.paddingStart - parent.paddingEnd - chip.marginStart - chip.marginEnd
        } else {
            chip.width
        }
    val chipSizeLessText =
        with(chip) {
            // Keep the parentheses
            (chipStartPadding
                    + iconStartPadding
                    + chipIconSize
                    + iconEndPadding
                    + textStartPadding
                    + textEndPadding
                    + closeIconStartPadding
                    + closeIconSize
                    + closeIconEndPadding
                    + chipEndPadding)
        }
    val currentTextMaxWidth = maxChipWidth - chipSizeLessText

    val paint: TextPaint = chip.paint
    var result = ""
    for (i in (candidates.size - 1) downTo 0) {
        if (paint.measureText(candidates[i]) <= currentTextMaxWidth) {
            result = candidates[i]
            break
        }
    }
    return result
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...