TextUtils 类有一个名为 ellipsize 的方法
public static CharSequence ellipsize (CharSequence text, TextPaint p, floatavail, TextUtils.TruncateAt where)
在 API 级别 1 中添加
如果在给定指定 Paint 的属性的情况下适合指定宽度,则返回原始文本,或者,如果不适合,则返回在指定边缘或中心添加省略号字符的截断副本。
这是我们如何使用它。让我们假设“项目标题 - (5 项目)”是全文,(5 项目) 是后缀,textView 是包含文本的文本视图。
String ellipsizedText = TextUtils.ellipsize(fullText, textView.getPaint(), fullTexViewtWidth ,TextUtils.TruncateAt.END);
现在文本要么被椭圆化,要么不会。我们可以通过检查 ellipsizedText 中是否存在后缀来检查这一点。
如果它是椭圆的(删除了后缀),我们应该再次调用 ellipsize 函数,但这次要减小宽度,因为我们想为后缀字符串保留空间并删除后缀,因为我们是单独添加它的。所以,新的调用将是
ellipsizedText = TextUtils.ellipsize(removedSuffixText, textView.getPaint(), reducedWidth ,TextUtils.TruncateAt.END);
最后我们将textView的文本设置为ellipsizedText+suffix;
我们需要找出几个值
- fullTexViewtWidth - 这可能很棘手,因为我们没有为文本视图指定特定的宽度。假设我们将宽度设置为匹配父级,那么我们可以通过视图树观察器来实现它。关注答案here
-
reducedWidth - 这更加棘手。为了计算这个,我们需要找到后缀占用的宽度,然后从 fullTexViewtWidth 中减去它。 This answer 解释如何查找后缀占用的宽度
final float densityMultiplier = getContext().getResources().getDisplayMetrics().density;
final float scaledPx = 20 * densityMultiplier;
paint.setTextSize(scaledPx);
final float size = paint.measureText("sample text");
恐怕这只有在 maxLines 为 1 且宽度设置为 textView 的 matchparent 时才有效。