blob: 5ef445d28b065f7cf7d76b0c357460d535efc0f1 [file] [log] [blame]
package com.android.ex.chips.recipientchip;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.text.style.ReplacementSpan;
/**
* ReplacementSpan that properly draws the drawable that is centered around the text
* without changing the default text size or layout.
*/
public class ReplacementDrawableSpan extends ReplacementSpan {
protected static final Paint sWorkPaint = new Paint();
protected Drawable mDrawable;
private float mExtraMargin;
public ReplacementDrawableSpan(Drawable drawable) {
super();
mDrawable = drawable;
}
public void setExtraMargin(float margin) {
mExtraMargin = margin;
}
private void setupFontMetrics(Paint.FontMetricsInt fm, Paint paint) {
sWorkPaint.set(paint);
if (fm != null) {
sWorkPaint.getFontMetricsInt(fm);
final Rect bounds = getBounds();
final int textHeight = fm.descent - fm.ascent;
final int halfMargin = (int) mExtraMargin / 2;
fm.ascent = Math.min(fm.top, fm.top + (textHeight - bounds.bottom) / 2) - halfMargin;
fm.descent = Math.max(fm.bottom, fm.bottom + (bounds.bottom - textHeight) / 2)
+ halfMargin;
fm.top = fm.ascent;
fm.bottom = fm.descent;
}
}
@Override
public int getSize(Paint paint, CharSequence text, int i, int i2, Paint.FontMetricsInt fm) {
setupFontMetrics(fm, paint);
return getBounds().right;
}
@Override
public void draw(Canvas canvas, CharSequence charSequence, int start, int end, float x, int top,
int y, int bottom, Paint paint) {
canvas.save();
int transY = (bottom - mDrawable.getBounds().bottom + top) / 2;
canvas.translate(x, transY);
mDrawable.draw(canvas);
canvas.restore();
}
protected Rect getBounds() {
return mDrawable.getBounds();
}
}