TextView中的ImageSpan对齐方式

时间:2014-01-28 13:14:48

标签: android textview

我有TextView使用android:lineSpacingMultiplier属性来增加行之间的间距,除了向文本添加ImageSpan之外,其工作正常。

这会导致图像与行之间的空格底部对齐,而不是文本的基线(如我创建时所指定的那样)。

我尝试使用android:lineSpacingExtra属性,取得了一些成功,图像的位置仍然低于应有的值,但不是那么多。是否有另一种方法可以增加线之间的间距而不会弄乱ImageSpan的垂直对齐?

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

我遇到了同样的问题,行间距改变了基线,因此在输入文字时会删除图像... 您必须通过更改其绘制方法来实现自定义图像范围:

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;
}