Android TextView查看更多

来源:互联网 发布:日本福岛核事故 知乎 编辑:程序博客网 时间:2024/05/22 05:17


转载请注明出处,多谢合作。


相信大家在项目中都有碰到过这么样的需求:在TextView中显示一部分文字,超过的部分用类似“点击查看更多”之类的文字代替,并且这个替代的文字可以进行点击。
这里分享的就是这么一个控件。
截图:

实际的文字是远远不止这四行的,在第四行末端,我用"...点击查看全部"的文字替换掉了第四行末端的文字,从而实现了替换的效果。
主要代码如下:
/**
* 文本宽度超出TextView的范围的具体项值

* @param 进行替换的提示文本的宽度
*            0表示不考虑提示文本
* @return -1 表示没有超过TextView的范围。
*/
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
private int starOverFlow(String text, float tipsWidth) {
if (TextUtils.isEmpty(text)) {
return -1;
}
text = text.trim();
TextPaint paint = getPaint();
// 文字总宽度
float width = paint.measureText(text);
float rangeWidth = 0;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
rangeWidth = getLayout().getWidth() * getMaxLines() - tipsWidth;
} else {
rangeWidth = getLayout().getWidth() * getLayout().getLineCount()
- tipsWidth;
}
if (width > rangeWidth) {
/*
* \u2026为文本超出时系统显示的省略号
*/
return paint.breakText(text, true,
rangeWidth - paint.measureText("\u2026"), null);
} else {
return -1;
}
}


/**
* 测量文字宽度

* @param text
* @return
*/
private float measureTextWidth(String text) {
if (TextUtils.isEmpty(text)) {
return 0;
}
TextPaint paint = getPaint();
return paint.measureText(text);
}


大致的实现思路:
首先获取控件实际能显示的宽度,然后再获取控件能显示的最大行数(因此,使用该控件得先设置MaxLines),然后再根据当前的控件的文本样式计算出文本的总宽度,再与控件能显示的文本宽度(控件宽度*显示行数)进行比较,显示文本超出控件能显示的文本宽度则进行替换,具体开始的替换位置通过TextPaint.breadText方法进行计算得出。

将替换后的文本标志为可点击的操作,借鉴了这里的代码:

http://download.csdn.net/download/jiwangkailai02/7041657


最后实现效果就是上边的截图啦~~~


代码在这里:

http://download.csdn.net/detail/frj463806056/9362351

0 0
原创粉丝点击