美文网首页
与文字对齐的ImageSpan

与文字对齐的ImageSpan

作者: 小相柳 | 来源:发表于2021-09-16 17:28 被阅读0次
    public class VerticalImageSpan extends ImageSpan {
        private WeakReference<Drawable> mDrawableRef;
        private final int marginLeft;
        private final int marginRight;
    
        public VerticalImageSpan(Drawable drawable) {
            this(drawable, 0, 0);
        }
    
        public VerticalImageSpan(@NonNull Drawable drawable, int marginLeft, int marginRight) {
            super(drawable);
            this.marginLeft = marginLeft;
            this.marginRight = marginRight;
        }
    
        @Override
        public int getSize(Paint paint, CharSequence text, int start, int end,
                           Paint.FontMetricsInt fontMetricsInt) {
            Drawable drawable = getCachedDrawable();
            Rect rect = drawable.getBounds();
            if (null != fontMetricsInt) {
                Paint.FontMetricsInt fmPaint = paint.getFontMetricsInt();
                int fontHeight = fmPaint.descent - fmPaint.ascent;
                int drHeight = rect.bottom - rect.top;
                int centerY = fmPaint.ascent + fontHeight / 2;
                fontMetricsInt.ascent = centerY - drHeight / 2;
                fontMetricsInt.top = fontMetricsInt.ascent;
                fontMetricsInt.bottom = centerY + drHeight / 2;
                fontMetricsInt.descent = fontMetricsInt.bottom;
            }
            return marginLeft + rect.right + marginRight;
        }
    
        @Override
        public void draw(Canvas canvas, CharSequence text, int start, int end,
                         float x, int top, int y, int bottom, Paint paint) {
            Drawable drawable = getCachedDrawable();
            canvas.save();
            Paint.FontMetricsInt fmPaint = paint.getFontMetricsInt();
            x = marginLeft + x;
            int fontHeight = fmPaint.descent - fmPaint.ascent;
            int centerY = y + fmPaint.descent - fontHeight / 2;
            int transY = centerY - (drawable.getBounds().bottom - drawable.getBounds().top) / 2;
            canvas.translate(x, transY);
            drawable.draw(canvas);
            canvas.restore();
        }
    
        private Drawable getCachedDrawable() {
            WeakReference<Drawable> wr = mDrawableRef;
            Drawable d = null;
            if (wr != null) {
                d = wr.get();
            }
    
            if (d == null) {
                d = getDrawable();
                mDrawableRef = new WeakReference<>(d);
            }
            return d;
        }
    }
    

    相关文章

      网友评论

          本文标题:与文字对齐的ImageSpan

          本文链接:https://www.haomeiwen.com/subject/abtdgltx.html