上一篇博客,讲了怎么让匹配表情、链接、关键字等等。上篇博客
http://blog.csdn.net/u014620028/article/details/52277102
但是,也留下了一个问题。就是行间距的问题。例如:
给展示行间距的textview,加上属性:android:lineSpacingMultiplier="1.4"
,用之前的处理方法,当文字行数多的时候,会出现表情混乱的情况:
解决后的效果图:
1、表情和文字基本一样大
2、表情大于文字:
3、表情小于文字:
解决办法:
1、重新ImageSpan的draw方法,重新计算、摆放表情等图片
MyImageSpan:
package com.chen.customviewdemo.view;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.drawable.Drawable;
import android.text.style.ImageSpan;
public class MyImageSpan extends ImageSpan {
public MyImageSpan(Drawable drawable) {
super(drawable);
}
@Override
public void draw(Canvas canvas, CharSequence text, int start, int end,
float x, int top, int y, int bottom, Paint paint) {
Paint.FontMetricsInt fm = paint.getFontMetricsInt();
Drawable drawable = getDrawable();
int transY = (y + fm.descent + y + fm.ascent) / 2
- drawable.getBounds().bottom / 2;
canvas.save();
canvas.translate(x, transY);
drawable.draw(canvas);
canvas.restore();
}
}
2、在MyTextView中,设置Url前面回形针图片的时候使用:
将上篇博客中,对应的代码,改为:
try {
//“点击链接”前面的回形针图片。大小可自己调整
Drawable drawable = context.getResources().getDrawable(R.mipmap.web_link);
drawable.setBounds(0, 0, 33, 33);
// ImageSpan imgSpan = new ImageSpan(drawable);
spannableString.setSpan(new MyImageSpan(drawable), urlStartOld + urlTemp.indexOf(CHEN.REPLACEMENT_STRING), urlStartOld + urlTemp.indexOf(CHEN.REPLACEMENT_STRING) + 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
} catch (Exception e) {
//异常以后,就不加小图片了
}
替换了spannableString.setSpan的第一个参数。其他不变
3、把ExpressionUtil下,dealSpannableString()中,对应代码替换为:
if (id != 0) {
Drawable drawable = context.getResources().getDrawable(id);
drawable.setBounds(0, 0, Utils.sp2px(context, emojiSize), Utils.sp2px(context, emojiSize));
// ImageSpan imgSpan = new ImageSpan(drawable);
int end = matcher.start() + key.length();
spannableString.setSpan(new MyImageSpan(drawable), matcher.start(), end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
if (end < spannableString.length()) { //如果整个字符串还未验证完,则继续。。
dealSpannableString(context, spannableString, patten, end, emojiSize);
}
break;
}
注意spannableString.setSpan的第一个参数