InlineImageSpan.java

 1package com.cheogram.android;
 2
 3import android.graphics.Paint;
 4import android.graphics.drawable.AnimatedImageDrawable;
 5import android.graphics.drawable.Drawable;
 6import android.os.Build;
 7import android.text.style.ImageSpan;
 8
 9public class InlineImageSpan extends ImageSpan {
10	private final Paint.FontMetricsInt mTmpFontMetrics = new Paint.FontMetricsInt();
11	private final float dHeight;
12	private final float dWidth;
13
14	public InlineImageSpan(Drawable d, final String source) {
15		super(d.getConstantState() == null ? d : d.getConstantState().newDrawable(), source);
16		dHeight = d.getIntrinsicHeight();
17		dWidth = d.getIntrinsicWidth();
18		if (Build.VERSION.SDK_INT >= 28 && d instanceof AnimatedImageDrawable) {
19			((AnimatedImageDrawable) getDrawable()).start();
20		}
21	}
22
23	@Override
24	public int getSize(final Paint paint, final CharSequence text, final int start, final int end, final Paint.FontMetricsInt fm) {
25		paint.getFontMetricsInt(mTmpFontMetrics);
26		final int fontHeight = Math.abs(mTmpFontMetrics.descent - mTmpFontMetrics.ascent);
27		float mRatio = fontHeight * 1.0f / dHeight;
28		int mHeight = (short) (dHeight * mRatio);
29		int mWidth = (short) (dWidth * mRatio);
30		getDrawable().setBounds(0, 0, mWidth, mHeight);
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}