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(); } }