TextView中的ImageSpan对齐方式

5

我有一个 TextView,使用 android:lineSpacingMultiplier 属性来增加行之间的间距,这个功能运行良好,但是当我在文本中添加一个 ImageSpan 时就不行了。

这会导致图像与行之间的空间底部对齐,而不是文本基线(在创建它时指定的位置)。

我尝试使用 android:lineSpacingExtra 属性,有一些成功,图像仍然比应该的位置低,但不那么多。有没有其他方法可以增加行间距而不会弄乱 ImageSpan 的垂直对齐?

2个回答

4
当您构建ImageSpan时,可以指定垂直对齐方式之一: ImageSpan.ALIGN_BOTTOMImageSpan.ALIGN_BASELINE。我相信ImageSpan默认使用ALIGN_BOTTOM,因此请尝试使用允许您指定ALIGN_BASELINE的构造函数。

这是对我有效的解决方案。ImageSpan span = new ImageSpan(getContext(), bitmap, DynamicDrawableSpan.ALIGN_BASELINE); - hellaandrew

2

我遇到了同样的问题,行间距改变了基线,所以当你输入文本时会把图片拉下来...你需要实现自定义的image span,通过更改其绘制方法:

public class CustomImageSpan extends ImageSpan{    
    public static final int ALIGN_TOP = 2;
    public static final int ALIGN_CUSTOM = 3;
    @Override
    public void draw(Canvas canvas, CharSequence text,
                     int start, int end, float x,
                     int top, int y, int bottom, Paint paint) {
        Drawable b = getCachedDrawable();
        canvas.save();

        int transY = bottom - b.getBounds().bottom;
        if (mVerticalAlignment == ALIGN_BASELINE) {
            transY -= paint.getFontMetricsInt().descent;
        } else if (mVerticalAlignment == ALIGN_TOP) {
            transY += paint.getFontMetricsInt().ascent;
        }

        canvas.translate(x, transY);
        b.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<Drawable>(d);
            }

            return d;
        }

        private WeakReference<Drawable> mDrawableRef;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接