16c2a016fb00482339dc66b93822042f9f9e2424fJin Caopackage com.android.ex.chips.recipientchip;
26c2a016fb00482339dc66b93822042f9f9e2424fJin Cao
36c2a016fb00482339dc66b93822042f9f9e2424fJin Caoimport android.graphics.Canvas;
46c2a016fb00482339dc66b93822042f9f9e2424fJin Caoimport android.graphics.Paint;
56c2a016fb00482339dc66b93822042f9f9e2424fJin Caoimport android.graphics.Rect;
66c2a016fb00482339dc66b93822042f9f9e2424fJin Caoimport android.graphics.drawable.Drawable;
76c2a016fb00482339dc66b93822042f9f9e2424fJin Caoimport android.text.style.ReplacementSpan;
86c2a016fb00482339dc66b93822042f9f9e2424fJin Cao
96c2a016fb00482339dc66b93822042f9f9e2424fJin Cao/**
106c2a016fb00482339dc66b93822042f9f9e2424fJin Cao * ReplacementSpan that properly draws the drawable that is centered around the text
116c2a016fb00482339dc66b93822042f9f9e2424fJin Cao * without changing the default text size or layout.
126c2a016fb00482339dc66b93822042f9f9e2424fJin Cao */
136c2a016fb00482339dc66b93822042f9f9e2424fJin Caopublic class ReplacementDrawableSpan extends ReplacementSpan {
146c2a016fb00482339dc66b93822042f9f9e2424fJin Cao    protected Drawable mDrawable;
156c2a016fb00482339dc66b93822042f9f9e2424fJin Cao    private final Paint mWorkPaint = new Paint();
166c2a016fb00482339dc66b93822042f9f9e2424fJin Cao    private float mExtraMargin;
176c2a016fb00482339dc66b93822042f9f9e2424fJin Cao
186c2a016fb00482339dc66b93822042f9f9e2424fJin Cao    public ReplacementDrawableSpan(Drawable drawable) {
196c2a016fb00482339dc66b93822042f9f9e2424fJin Cao        super();
206c2a016fb00482339dc66b93822042f9f9e2424fJin Cao        mDrawable = drawable;
216c2a016fb00482339dc66b93822042f9f9e2424fJin Cao    }
226c2a016fb00482339dc66b93822042f9f9e2424fJin Cao
236c2a016fb00482339dc66b93822042f9f9e2424fJin Cao    public void setExtraMargin(float margin) {
246c2a016fb00482339dc66b93822042f9f9e2424fJin Cao        mExtraMargin = margin;
256c2a016fb00482339dc66b93822042f9f9e2424fJin Cao    }
266c2a016fb00482339dc66b93822042f9f9e2424fJin Cao
276c2a016fb00482339dc66b93822042f9f9e2424fJin Cao    private void setupFontMetrics(Paint.FontMetricsInt fm, Paint paint) {
286c2a016fb00482339dc66b93822042f9f9e2424fJin Cao        mWorkPaint.set(paint);
296c2a016fb00482339dc66b93822042f9f9e2424fJin Cao        if (fm != null) {
306c2a016fb00482339dc66b93822042f9f9e2424fJin Cao            mWorkPaint.getFontMetricsInt(fm);
316c2a016fb00482339dc66b93822042f9f9e2424fJin Cao
326c2a016fb00482339dc66b93822042f9f9e2424fJin Cao            final Rect bounds = getBounds();
336c2a016fb00482339dc66b93822042f9f9e2424fJin Cao            final int textHeight = fm.descent - fm.ascent;
346c2a016fb00482339dc66b93822042f9f9e2424fJin Cao            final int halfMargin = (int) mExtraMargin / 2;
356c2a016fb00482339dc66b93822042f9f9e2424fJin Cao            fm.ascent = Math.min(fm.top, fm.top + (textHeight - bounds.bottom) / 2) - halfMargin;
366c2a016fb00482339dc66b93822042f9f9e2424fJin Cao            fm.descent = Math.max(fm.bottom, fm.bottom + (bounds.bottom - textHeight) / 2)
376c2a016fb00482339dc66b93822042f9f9e2424fJin Cao                    + halfMargin;
386c2a016fb00482339dc66b93822042f9f9e2424fJin Cao            fm.top = fm.ascent;
396c2a016fb00482339dc66b93822042f9f9e2424fJin Cao            fm.bottom = fm.descent;
406c2a016fb00482339dc66b93822042f9f9e2424fJin Cao        }
416c2a016fb00482339dc66b93822042f9f9e2424fJin Cao    }
426c2a016fb00482339dc66b93822042f9f9e2424fJin Cao
436c2a016fb00482339dc66b93822042f9f9e2424fJin Cao    @Override
446c2a016fb00482339dc66b93822042f9f9e2424fJin Cao    public int getSize(Paint paint, CharSequence text, int i, int i2, Paint.FontMetricsInt fm) {
456c2a016fb00482339dc66b93822042f9f9e2424fJin Cao        setupFontMetrics(fm, paint);
466c2a016fb00482339dc66b93822042f9f9e2424fJin Cao        return getBounds().right;
476c2a016fb00482339dc66b93822042f9f9e2424fJin Cao    }
486c2a016fb00482339dc66b93822042f9f9e2424fJin Cao
496c2a016fb00482339dc66b93822042f9f9e2424fJin Cao    @Override
506c2a016fb00482339dc66b93822042f9f9e2424fJin Cao    public void draw(Canvas canvas, CharSequence charSequence, int start, int end, float x, int top,
516c2a016fb00482339dc66b93822042f9f9e2424fJin Cao                     int y, int bottom, Paint paint) {
526c2a016fb00482339dc66b93822042f9f9e2424fJin Cao        canvas.save();
536c2a016fb00482339dc66b93822042f9f9e2424fJin Cao        int transY = (bottom - mDrawable.getBounds().bottom + top) / 2;
546c2a016fb00482339dc66b93822042f9f9e2424fJin Cao        canvas.translate(x, transY);
556c2a016fb00482339dc66b93822042f9f9e2424fJin Cao        mDrawable.draw(canvas);
566c2a016fb00482339dc66b93822042f9f9e2424fJin Cao        canvas.restore();
576c2a016fb00482339dc66b93822042f9f9e2424fJin Cao    }
586c2a016fb00482339dc66b93822042f9f9e2424fJin Cao
596c2a016fb00482339dc66b93822042f9f9e2424fJin Cao    protected Rect getBounds() {
606c2a016fb00482339dc66b93822042f9f9e2424fJin Cao        return mDrawable.getBounds();
616c2a016fb00482339dc66b93822042f9f9e2424fJin Cao    }
626c2a016fb00482339dc66b93822042f9f9e2424fJin Cao}
63