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}