目录
1、功能
(1)支持全文展开/收起(按钮紧跟着文本后面显示,非另起一行),见下图。
(2)可设置收起时最大显示行数;
(3) 可设置“展开/收起”的具体文字显示、字体颜色,是否带省略点等;
(4) 支持 “展开/收起”点击事件(即,后缀点击事件)、剩余区间点击事件(TextView点击事件)、父容器点击事件。
ps:实际开发中,TextView自身点击事件和 父容器点击事件基本不会同时存在。
效果图如下:设置代码见3.3
图1. 默认实现方式(带省略点)
图2. 设置后缀文字等(不带省略点)
2、思路 / 方法
以后缀名“收起 / 展开”为例。
(1)点击“收起 / 展开”时,文字收起/展开
点击事件,使用ClickableSpan实现---需要设置setMovementMethod();
颜色设置,使用ForegroundColorSpan
(2)父容器点击事件 ,即点击该后缀文字以外的其他区域(非clickablespan设置区域),会响应ViewGroup的事件
>> 点击时,判断当前点击的区域是否有ClickableSpan,如果有,则拦截TextView的onTouchEvent方法,交由viewgroup处
理(通过自定义LinkMovementMethod实现)
(3)TextView点击事件(注意事件冲突问题)
方法,同(1)。
注意:直接设置setOnClickListener,会导致clickableSpan响应的同时,响应onClick,所以需要避免。应该在局部点击之
外的文字区域响应onclick事件,但是判断点击区域是否有clickspan,已经用于父容器的点击事件之中,所以这里我们可采
用(1)中方案,同样用clickspan实现。
ps:实际开发中,(2)和(3)两种事件基本不会同时存在。
3、设计实现
3.1 变量说明:
/**
* 最大显示行数,其余折叠
*/
private int collapsedLines;
/**
* 折叠时后缀文字
*/
private String collapsedText;
/**
* 展开时,后缀名字
*/
private String expandedText;
/**
* 后缀字体颜色
*/
private int suffixColor;
final int defaultLines = 5;//默认显示5行
final int defaultColor = Color.BLUE;//默认后缀颜色
final String defaultExpandedText = "收起";//默认展开时的后缀文字
final String defaultCollapsedText = "展开";//默认收起时的后缀文字
final String tag = "...";
/**
* 文本内容
*/
String mText;
/**
* 是否展开。默认收起
*/
boolean mIsneedExpanded;
/**
* 局部点击事件: 展开 or 收起
*/
ClickableSpan mClickSpanListener = new ClickableSpan() {
@Override
public void onClick(View widget) {
mIsneedExpanded = !mIsneedExpanded;
updateUI(mIsneedExpanded);
Toast.makeText(mContext, "点击了展开/收起", Toast.LENGTH_SHORT).show();
}
@Override
public void updateDrawState(TextPaint ds) {
// super.updateDrawState(ds);
ds.setUnderlineText(false);//点击区域下方是否有下划线。默认true,会像超链接一样显示下划线
setHighlightColor(Color.TRANSPARENT);//取消选中文字背景色高亮显示
}
};
/**
* TextView自身点击事件(除后缀外的部分)
*/
ClickableSpan selfClickSpan=new ClickableSpan() {
@Override
public void onClick(View widget) {
if (onTextClickListener!=null)
onTextClickListener.onTextClick(null);
}
@Override
public void updateDrawState(TextPaint ds) {
ds.setUnderlineText(false);
}
} ;
/**
* TextView自身点击事件,代替onClickListener
*/
OnTextClickListener onTextClickListener;
private CustomLinkMovementMethod customLinkMovementMethod;
private boolean isNeedEllipsis=true;//是否需要默认的省略点“...”