需求是textview最多显示两行,末尾显示一个icon。
当文字过长被截断时,要显示「文字...{图片}」的效果;
文字长度可以显示完全时,图片位置在文本最后一个字的后面。
不要手动拼接字符串「...」,因为不同手机上可能显示的大小不一样。
可以用sdk方法TextUtils.ellipsize自动截取,或者拼接new String({'\u2025' })
代码中的textviewWidthView是一个透明的高度为1dp的view,宽度是match_parent的。
作用是获取textview的最大宽度。因为textview的宽度是wrap_content的。
做法是,用textview宽度计算能显示多少文字,如果实际文字长度大于能显示的文字长度,末尾截断,然后富文本拼接icon。
如果末尾要显示的是其他形式的,例如显示全文,思路是一样的。
StringBuilder resultContent = new StringBuilder("");
String content = "xxx";
int textWidth = textviewWidthView.getMeasuredWidth();
int textSecondLineWidth = textWidth - LayoutUtils.dpToPx(getContext(), 18);
float[] measuredWidth = new float[1];
int firstLine = textview.getPaint().breakText(content, true, textWidth, measuredWidth);
resultContent.append(content.substring(0, firstLine));
if (content.length() > firstLine) {
String secondLineContent = content.substring(firstLine);
int secondLine = textview.getPaint().breakText(secondLineContent, true, textSecondLineWidth, measuredWidth);
if (secondLineContent.length() > secondLine) {
String elipText = (String) TextUtils.ellipsize(secondLineContent, textview.getPaint(), textSecondLineWidth, TextUtils.TruncateAt.END);
resultContent = resultContent.append(elipText);
} else {
resultContent.append(secondLineContent.substring(0, secondLine));
}
}
resultContent.append(" ");
SpannableString res = new SpannableString(resultContent);
Drawable drawable = getResources().getDrawable(R.drawable.icn_external_link);
drawable.setBounds(0, 0, LayoutUtils.dpToPx(getContext(), 18), LayoutUtils.dpToPx(getContext(), 14));
ImageSpan imageSpan = new ImageSpan(drawable, ImageSpan.ALIGN_BASELINE);
res.setSpan(imageSpan, resultContent.length() - 1, resultContent.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
textview.setText(res);
网友评论