Android TextView 显示富文本的解决方案
step:1
public class CenteredImageSpan extends ImageSpan {
public CenteredImageSpan(Context context, final int drawableRes) {
super(context, drawableRes);
}
public CenteredImageSpan(Context context, final Bitmap bitmap) {
super(context, bitmap);
}
@Override
public void draw(@NonNull Canvas canvas, CharSequence text,
int start, int end, float x,
int top, int y, int bottom, @NonNull Paint paint) {
Drawable b = getDrawable();
Paint.FontMetricsInt fm = paint.getFontMetricsInt();
int transY = (y + fm.descent + y + fm.ascent) / 2 - b.getBounds().bottom / 2;//计算y方向的位移
canvas.save();
canvas.translate(x, transY);//绘制图片位移一段距离
b.draw(canvas);
canvas.restore();
}
}
step:2 显示
// 在android中要显示图片信息,必须使用Bitmap位图的对象来装载.
val bitmap = BitmapFactory.decodeResource(context.resources, R.drawable.ic_referrer_seat_1v1_photo_portrait_anonymous_detail);
bitmap?.let {
val height = 30 //这个高度根据需求自定义
val bitmap1 =imageScaleMin(bitmap,height,height)
//要让图片替代指定的文字就要用ImageSpan
val imageSpan = bitmap1?.let {
CenteredImageSpan(context, bitmap1)
};
val spannableString = SpannableString(msgContent) //face就是图片的前缀名
spannableString.setSpan(imageSpan, 0, 3, ImageSpan.ALIGN_BASELINE)
tvContent.setText(spannableString)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
tvContent.isFallbackLineSpacing = false
}
}