InlineImageSpan.java

 1package com.cheogram.android;
 2
 3import android.graphics.Canvas;
 4import android.graphics.Paint;
 5import android.graphics.drawable.AnimatedImageDrawable;
 6import android.graphics.drawable.Drawable;
 7import android.os.Build;
 8import android.text.style.ImageSpan;
 9
10public class InlineImageSpan extends ImageSpan {
11	private final Paint.FontMetricsInt mTmpFontMetrics = new Paint.FontMetricsInt();
12	private final float dHeight;
13	private final float dWidth;
14
15	public InlineImageSpan(Drawable d, final String source) {
16		super(d.getConstantState() == null ? d : d.getConstantState().newDrawable(), source);
17		dHeight = d.getIntrinsicHeight();
18		dWidth = d.getIntrinsicWidth();
19		if (Build.VERSION.SDK_INT >= 28 && d instanceof AnimatedImageDrawable) {
20			((AnimatedImageDrawable) getDrawable()).start();
21		}
22	}
23
24	@Override
25	public int getSize(final Paint paint, final CharSequence text, final int start, final int end, final Paint.FontMetricsInt fm) {
26		paint.getFontMetricsInt(mTmpFontMetrics);
27		final int fontHeight = Math.abs(mTmpFontMetrics.descent - mTmpFontMetrics.ascent);
28		float mRatio = fontHeight * 1.0f / dHeight;
29		int mWidth = (int) (dWidth * mRatio);
30		getDrawable().setBounds(0, 0, (int) dWidth, (int) dHeight);
31		if (fm != null) {
32			fm.ascent = mTmpFontMetrics.ascent;
33			fm.descent = mTmpFontMetrics.descent;
34			fm.top = mTmpFontMetrics.top;
35			fm.bottom = mTmpFontMetrics.bottom;
36		}
37		return mWidth;
38	}
39
40	@Override
41	public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, Paint paint) {
42		paint.getFontMetricsInt(mTmpFontMetrics);
43		final int fontHeight = Math.abs(mTmpFontMetrics.descent - mTmpFontMetrics.ascent);
44		float mRatio = fontHeight * 1.0f / dHeight;
45
46		Drawable b = getDrawable();
47		canvas.save();
48
49		int transY = bottom - ((int) (dHeight * mRatio));
50		if (mVerticalAlignment == ALIGN_BASELINE) {
51			transY -= paint.getFontMetricsInt().descent;
52		}
53
54		canvas.translate(x, transY);
55		canvas.scale(mRatio, mRatio);
56		b.draw(canvas);
57		canvas.restore();
58	}
59}