带行间距的TextView,让文字和ImageSpan中的图片居中显示

上一篇博客,讲了怎么让匹配表情、链接、关键字等等。上篇博客

http://blog.csdn.net/u014620028/article/details/52277102

但是,也留下了一个问题。就是行间距的问题。例如:
给展示行间距的textview,加上属性:android:lineSpacingMultiplier="1.4",用之前的处理方法,当文字行数多的时候,会出现表情混乱的情况:
带行间距的TextView,让文字和ImageSpan中的图片居中显示_第1张图片


解决后的效果图:
1、表情和文字基本一样大
带行间距的TextView,让文字和ImageSpan中的图片居中显示_第2张图片
2、表情大于文字:
带行间距的TextView,让文字和ImageSpan中的图片居中显示_第3张图片
3、表情小于文字:
带行间距的TextView,让文字和ImageSpan中的图片居中显示_第4张图片


解决办法:
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的第一个参数

你可能感兴趣的:(Android笔记)