DrawableMarginSpan用法示例?

时间:2011-07-27 18:57:18

标签: android textview

我正在使用spannable文本,基本上用drawables替换这样的标记。 这似乎工作得很好,除了我在安置时遇到困难。 我实际上希望drawable具有超级脚本文本的外观,但我不能让它工作。我想也许我可以使用DrawableMarginSpan类设置我的drawable的底部边距,但这似乎不起作用。

文档没有给我什么,我已经运行了很多谷歌搜索无济于事。 http://developer.android.com/reference/android/text/style/DrawableMarginSpan.html

有关如何实现这一目标的任何信息或建议,我将非常感激。 :)

1 个答案:

答案 0 :(得分:0)

据我所知, DrawableMarginSpan 用于向段落的前导添加一个drawable,同时设置相应的段落的magrin,所以这个Span不能用来完成什么你要。

您可以尝试使用 ReplacementSpan ,它可以绘制您想要的内容。

/**
 * Make drawable as the superscript
 */
public class SuperscriptDrawableSpan extends ReplacementSpan {
    private Drawable mDrawable;
    private int mWidth;
    private int mHeight;

    public SuperscriptDrawableSpan(Drawable drawable, int width, int height) {
        this.mDrawable = drawable;
        this.mWidth = width;
        this.mHeight = height;
    }

    @Override
    public int getSize(Paint paint, CharSequence text, int start, int end, Paint.FontMetricsInt fm) {
        return mWidth;
    }

    @Override
    public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, Paint paint) {
        mDrawable.setBounds((int) x, top, ((int) x) + mWidth, top + mHeight);
        mDrawable.draw(canvas);
    }
}

然后,您可以将其用作其他xxxSpan:

mSpannableBuilder = new SpannableStringBuilder();
mSpannableBuilder.append("SuperScriptDrawable^");
SuperscriptDrawableSpan spanSuperscriptDeawable = new SuperscriptDrawableSpan(getActivity().getResources().getDrawable(R.mipmap.ic_launcher), 24, 24);
mSpannableBuilder.setSpan(span, mSpannableBuilder.length() - 1,
            mSpannableBuilder.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);

仅用于演示,使用时需要优化。