textview多行文本后加上图片

来源:互联网 发布:php培训机构达内教育 编辑:程序博客网 时间:2024/04/16 13:41

一、需求描述

textview文本设置maxline,如果内容超过maxline就需要截取内容,并且后面加上“...”省略号,再加上图片。效果如下图:

二、需求实现
具体看代码,代码注释很详细。看了我师傅写的,才发现果然是有很大差距。自己仍需不断努力。我对师父写的做下整理。

/** * Textview追加图片方法 *  * @param textView *            文本控件 * @param content *            内容 * @param res *            图片id * @param maxLines *            最大行数 */private void addImage(TextView textView, String content, int res,int maxLines) {textView.setMaxLines(maxLines);// 设置最大行数final Drawable drawable = getResources().getDrawable(res);// 获取图片TextPaint paint = textView.getPaint();// 获取文本控件字体样式FontMetrics fm = paint.getFontMetrics();int textFontHeight = (int) Math.ceil(fm.descent - fm.top) + 2;// 计算字体高度座位图片高度int imageWidth = drawable.getIntrinsicWidth() * textFontHeight/ drawable.getIntrinsicHeight();// 计算图片根据字体大小等比例缩放后的宽度drawable.setBounds(0, ConvertUtils.dip2px(this, 1), imageWidth,textFontHeight);// 缩放图片int maxWidth = textView.getLayoutParams().width;// 获取文本控件最大宽度if (paint.measureText(content) > maxWidth) {// 如果文本大于一行才进入复杂的计算逻辑String s = "";// 临时存储截取的字符串int start = 0;// 截取的起始位置int end = 1;// 截取的结束位置int lines = 1;// 计算的行数boolean flag = false;// 已经计算到了最大行但是该行文本加图片的宽度超出文本框的宽度时,设置该标记将进行文本递减拼接测量do {s = content.substring(start, end);// 截取制定位置的字符串float width = paint.measureText(s);// 测量截取的字符串宽度if (width < maxWidth) {// 截取的文字长度小于控件宽度if (lines == maxWidth) {// 如果已经是最大行if (width + imageWidth < maxWidth) {// 文本宽度+图片宽度小于控件宽度if (width + imageWidth + paint.measureText("...") < maxWidth) {// 文本宽度+图片宽度+省略号宽度大于控件宽度if (flag) {// 递减测量的第一次进入并且满足上一个if则停止循环content = content.substring(0, end);// 文案切割content += "...";// 文案拼接省略号break;} else {// 还在进行递增测量,结束位置+1end++;}} else {// 文本宽度+图片宽度+省略号宽度大于控件宽度,因为已经是最大行(lines ==// maxWidth)需要对文字做递减测量,结束位置-1end--;}} else {// 文本宽度+图片宽度大于控件宽度,因为已经是最大行(lines == maxWidth)// 需要对文字做递减测量,结束位置-1,flag置为trueend--;flag = true;}} else {// 截取文字的上限位置+1end++;}} else {// 截取的文字长度大于控件宽度,一行的位置已经确定,下一行的起始位置为当前结束位置-1,行数+1start = end - 1;lines++;}} while (end <= content.length() && lines <= maxLines);}// 文本后面拼接图片ImageSpan span = new ImageSpan(drawable, ImageSpan.ALIGN_BASELINE);content += "*";SpannableString spanString = new SpannableString(content);spanString.setSpan(span, content.length() - 1, content.length(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);textView.setText(spanString);}


0 0
原创粉丝点击