简介:
折叠TextView不是特别难实现,并且Github已经有好多已经实现好的。
这个控件很常用,所以特别写篇博客。
问题:
- 怎么判断是否需要折叠?
- 怎么获取折叠后的文本?
- 如何把展开的提示文本拼接上去?
- 如何设置点击事件?
思路
怎么判断是否需要折叠?
-
通过
layout.getLineCount()获取要显示的文本的行数和最大行数想比较。判断是否需要折叠。 -
通过
StaticLayout判断。
特别注意:
需要在onLayout之后调取layout.getLineCount()方法才能获取到。
代码实现:
getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
getViewTreeObserver().removeOnGlobalLayoutListener(this);
translateText(getLayout(), type);
}
});
怎么获取折叠后的文本?
int start=layout.getLineStart(i);
int end=layout.getLineEnd(i);
text.subSequence();
-
通过
layout.getLineEnd()获取最后一个字符的下标。 -
通过
String.subSequence(0, end)进行截取。
如何把展开的提示文本拼接上去?
- 通过
paint.measureText(builder.toString())要拼接的文本的宽度。 - 通过
paint.breakText(mOriginalText, start, end, false, paint.measureText(builder.toString())获取要截取的字符个数。 - 字符串拼接。
如何设置点击事件?
通过ClickableSpan。
final SpannableStringBuilder style = new SpannableStringBuilder();
//设置文字
style.append("关于本活动更多规则,请点我查看");
//设置部分文字点击事件
ClickableSpan clickableSpan = new ClickableSpan() {
@Override
public void onClick(View widget) {
Toast.makeText(MainActivity.this, "触发点击事件!", Toast.LENGTH_SHORT).show();
}
};
style.setSpan(clickableSpan, 11, 15, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
tv.setText(style);
//设置部分文字颜色
ForegroundColorSpan foregroundColorSpan = new ForegroundColorSpan(Color.parseColor("#0000FF"));
style.setSpan(foregroundColorSpan, 11, 15, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
//配置给TextView
tv.setMovementMethod(LinkMovementMethod.getInstance());
tv.setText(style);