将 ImageSpan 与 Spanable 字符串对齐

ran*_*dam 5 android android-layout

我知道有很多相同类型的问题,我尝试了很多解决方案,但所有这些都不能满足我的要求。

我的问题是我必须在包含 Spanable 字符串和 Imagespan 的文本之间添加动态行距,但是当我添加行距时,文本和图像的对齐方式会失真。

我已经尝试了几乎所有可用在 Stackoverflow 上的解决方案,例如this , this & this但都是在静脉中。我附上了截图

  1. 添加动态行距前的截图

添加动态行距前的截图 2.添加动态行距后的截图

添加动态行距后的截图

任何帮助将不胜感激。提前致谢!

Awa*_*eed 6

在 onDraw 方法中使用“y”找到文本的基线,然后将 drawable 与文本视图的基线对齐

public class VerticalImageSpan extends ImageSpan {



 public VerticalImageSpan(Drawable drawable) {
        super(drawable);
    }

    /**
     * update the text line height
     */
    @Override
    public int getSize(Paint paint, CharSequence text, int start, int end,
                       Paint.FontMetricsInt fontMetricsInt) {
        Drawable drawable = getDrawable();
        Rect rect = drawable.getBounds();
        if (fontMetricsInt != null) {
            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 rect.right;
    }

    /**
     * see detail message in android.text.TextLine
     *
     * @param canvas the canvas, can be null if not rendering
     * @param text   the text to be draw
     * @param start  the text start position
     * @param end    the text end position
     * @param x      the edge of the replacement closest to the leading margin
     * @param top    the top of the line
     * @param y      the baseline
     * @param bottom the bottom of the line
     * @param paint  the work paint
     */
    @Override
    public void draw(Canvas canvas, CharSequence text, int start, int end,
                     float x, int top, int y, int bottom, Paint paint) {

        Drawable drawable = getDrawable();
        canvas.save();
        Paint.FontMetricsInt fmPaint = paint.getFontMetricsInt();
        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();
    }

}
Run Code Online (Sandbox Code Playgroud)