腾讯IM中表情和文本不对齐的问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 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保持一致,希望对需要的小伙伴有所帮助

猜你喜欢

转载自blog.csdn.net/lixiaoshuai_91/article/details/82958988
今日推荐