Android圖文混排可以通過SpannableString來實現,但是imageSpan只提供了兩種對齊方式:ALIGN_BOTTOM,ALIGN_BASELINE兩種方式,並沒有居中對齊方式。
自定義ImageSpan
public class CenterImageSpan extends ImageSpan {
public CenterImageSpan(Drawable drawable) {
super(drawable);
}
public CenterImageSpan(Bitmap bitmap) {
super(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();
}
}
使用方式
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
//創建SpannableString對象
val sp = SpannableString("Test String")
//拿到所加圖片的drawable對象
val drawable =context.getDrawable(R.drawable.iv_to_add)
drawable.setBounds(0, 0, drawable.minimumWidth, drawable.minimumHeight)
//給SpannableString設置ImageSpan
val imageSpan = CenterImageSpan(drawable)
sp.setSpan(imageSpan, sp.length - 1, sp.length, ImageSpan.ALIGN_BASELINE)
textview.text=sp
}