【问题标题】:parentWidth returns the wrong value when display size is the largest?显示尺寸最大时 parentWidth 返回错误值?
【发布时间】:2020-05-21 13:56:54
【问题描述】:

我扩展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);
  }

【问题讨论】:

  • return Iterables.getLast(chipTexts); 总是返回大于您所需大小的文本。

标签: android text font-size display measure


【解决方案1】:

我认为没有正确计算文本长度。从ChipDrawable 的文档来看,Chip 有一些内部结构,我认为代码没有考虑到这些结构。 (ChipChipDrawable 的包装器。)我将在此处重现图表:

可能是内部填充全部为零,所以没关系。尽管如此,ChipDrawable 中的calculateTextBounds() 方法可能是一个很好的起点。


以下代码应正确计算Chip 内可用的文本空间,并选择最适合的字符串。 candidates 数组必须按字符串长度升序排序。在某些情况下,另一个字符可能看起来合适,但不合适的是字符间距(它是字符的一部分)。如果这是个问题,可以使用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
}

【讨论】:

    猜你喜欢
    • 2015-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-16
    • 1970-01-01
    • 1970-01-01
    • 2023-02-17
    • 1970-01-01
    相关资源
    最近更新 更多