版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lixiaoshuai_91/article/details/82958988
今天给大家分析下,腾讯IM提供的Demo中表情和文本信息不管是在TextView还是EditText中不能对齐的问题
首先可以肯定腾讯IM中使用的是把assets下的一个文件夹中的图片循环遍历成一个BitMap;然后转换成一个ImageSpan,最后放到SpannableStringBuilder里面;
其实对齐方式的主要关键点在转换ImageSpan的步骤里;
如果从写ImageeSpan的draw和getSize方法就可以将对不齐的问题解决;
下面就直接贴代码吧
public class MyImageSpan extends ImageSpan { public MyImageSpan(Context context, Bitmap b, int verticalAlignment) { super(context, b, verticalAlignment); } public int getSize(Paint paint, CharSequence text, int start, int end, Paint.FontMetricsInt fm) { Drawable d = getDrawable(); Rect rect = d.getBounds(); if (fm != null) { Paint.FontMetricsInt fmPaint = paint.getFontMetricsInt(); int fontHeight = fmPaint.bottom - fmPaint.top; int drHeight = rect.bottom - rect.top; int top = drHeight / 2 - fontHeight / 4; int bottom = drHeight / 2 + fontHeight / 4; fm.ascent = -bottom; fm.top = -bottom; fm.bottom = top; fm.descent = top; } return rect.right; } @Override public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, Paint paint) { Drawable b = getDrawable(); canvas.save(); int transY = 0; transY = ((bottom - top) - b.getBounds().bottom) / 2 + top; canvas.translate(x, transY); b.draw(canvas); canvas.restore(); } }
从写构造方法是为了和腾讯提供的Demo保持一致,希望对需要的小伙伴有所帮助