显示尺寸最大时 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 有一些内部结构,我认为代码没有考虑到这些结构。 (Chip 是 ChipDrawable 的包装器。)我将在此处重现图表:
可能是内部填充全部为零,所以没关系。尽管如此,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 返回错误值?的主要内容,如果未能解决你的问题,请参考以下文章