显示尺寸最大时 parentWidth 返回错误值?

Posted

技术标签:

【中文标题】显示尺寸最大时 parentWidth 返回错误值?【英文标题】:parentWidth returns the wrong value when display size is the largest? 【发布时间】: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); 总是返回大于您所需大小的文本。 【参考方案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

【讨论】:

以上是关于显示尺寸最大时 parentWidth 返回错误值?的主要内容,如果未能解决你的问题,请参考以下文章

窗体在 Windows 8 上显示错误的尺寸 - 如何获得真实尺寸?

如何知道向量的正确最大大小?最大尺寸()?但不是

新浪微博gif图片最大有效显示尺寸是多少

弹出框的最大尺寸

在ggplot的图例中设置最小/最大尺寸

qt界面显示内容相同