package com.netease.nim.uikit.session.emoji;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.text.style.ImageSpan;
import java.lang.ref.WeakReference;
/**
*
*/
public class ImageSpanAlignCenter extends ImageSpan {
private static final char[] ELLIPSIS_NORMAL = {'\u2026'};
private static final char[] ELLIPSIS_TWO_DOTS = {'\u2025'};
public ImageSpanAlignCenter(Context context, int resourceId) {
super(context, resourceId);
}
public ImageSpanAlignCenter(Drawable d) {
super(d);
}
@Override
public int getSize(Paint paint, CharSequence text,
int start, int end,
Paint.FontMetricsInt fm) {
Drawable d = getCachedDrawable(paint);
Rect rect = d.getBounds();
if (fm != null) {
Paint.FontMetricsInt fontMetrics = new Paint.FontMetricsInt();
paint.getFontMetricsInt(fontMetrics);
fm.ascent = fontMetrics.ascent;
fm.descent = fontMetrics.descent;
fm.top = fontMetrics.top;
fm.bottom = fontMetrics.bottom;
}
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) {
final String s = text.toString();
String subS = s.substring(start, end);
if (ELLIPSIS_NORMAL[0] == subS.charAt(0)
|| ELLIPSIS_TWO_DOTS[0] == subS.charAt(0)) {
canvas.save();
canvas.drawText(subS, x, y, paint);
canvas.restore();
} else {
Drawable d = getCachedDrawable(paint);
canvas.save();
int transY;
Paint.FontMetricsInt fontMetrics = new Paint.FontMetricsInt();
paint.getFontMetricsInt(fontMetrics);
transY = y + fontMetrics.ascent;
canvas.translate(x, transY);
d.draw(canvas);
canvas.restore();
}
}
private Drawable getCachedDrawable(Paint paint) {
WeakReference<Drawable> wr = mDrawableRef;
Drawable d = null;
if (wr != null)
d = wr.get();
if (d == null) {
d = getDrawable();
d.setBounds(new Rect(0, 0, paint.getFontMetricsInt(null), paint.getFontMetricsInt(null)));
mDrawableRef = new WeakReference<Drawable>(d);
}
return d;
}
private WeakReference<Drawable> mDrawableRef;
}