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}