自定义ImageSpan
/** * span图片垂直居中 */ public class VerticalImageSpan extends ImageSpan { @SuppressWarnings("unused") public VerticalImageSpan(Context arg0, int arg1) { super(arg0, arg1); } public VerticalImageSpan(Context context, Bitmap b) { super(context, b, ALIGN_BASELINE); } 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; transY = ((bottom - top) - b.getBounds().bottom) / 2 + top; canvas.translate(x, transY); b.draw(canvas); canvas.restore(); } }