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