Android SpannableString 画边框

在Android开发中,我们经常需要对文字进行格式化,例如设置字体颜色、字体大小等。除了基本的格式化功能外,我们有时候还需要为文字添加特殊的效果,比如为文字添加边框。在本文中,我们将介绍如何使用SpannableString类来为文字添加边框效果,并提供相应的代码示例。

SpannableString简介

在Android中,SpannableString是一个可变的字符串类,它允许我们在字符串的不同部分应用不同的格式。通过使用SpannableString,我们可以实现对文字的各种格式化操作,包括添加边框。

SpannableString类提供了一系列的方法来设置不同的属性,比如设置文字的颜色、大小、背景等。我们可以通过设置不同的Span来为文字的不同部分应用不同的属性。

画边框实现

为了实现文字的边框效果,我们可以使用ReplacementSpan类。ReplacementSpan是一个抽象类,它允许我们自定义文字的替换效果。我们可以继承ReplacementSpan类来实现自定义的文字替换效果,包括边框效果。

下面是一个示例代码,演示如何使用SpannableString和ReplacementSpan类来为文字添加边框效果:

// 创建一个自定义的ReplacementSpan类
public class BorderSpan extends ReplacementSpan {
    private int mBackgroundColor;
    private int mBorderColor;
    private int mBorderWidth;
    private int mPadding;

    public BorderSpan(int backgroundColor, int borderColor, int borderWidth, int padding) {
        mBackgroundColor = backgroundColor;
        mBorderColor = borderColor;
        mBorderWidth = borderWidth;
        mPadding = padding;
    }

    @Override
    public int getSize(Paint paint, CharSequence text, int start, int end, Paint.FontMetricsInt fm) {
        return (int) (paint.measureText(text, start, end) + mBorderWidth + 2 * mPadding);
    }

    @Override
    public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, Paint paint) {
        // 绘制背景
        paint.setColor(mBackgroundColor);
        canvas.drawRect(x, top, x + paint.measureText(text, start, end) + 2 * mPadding, bottom, paint);

        // 绘制边框
        paint.setColor(mBorderColor);
        canvas.drawRect(x + mPadding, top, x + paint.measureText(text, start, end) + mPadding, bottom, paint);

        // 绘制文字
        paint.setColor(Color.WHITE);
        canvas.drawText(text, start, end, x + mPadding, y, paint);
    }
}

// 使用SpannableString和BorderSpan类来为文字添加边框效果
SpannableString spannableString = new SpannableString("Hello World");
BorderSpan borderSpan = new BorderSpan(Color.YELLOW, Color.RED, 2, 10);
spannableString.setSpan(borderSpan, 0, spannableString.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

// 使用SpannableTextView来显示SpannableString
SpannableTextView textView = findViewById(R.id.textView);
textView.setText(spannableString);

在上面的代码中,我们首先创建了一个自定义的BorderSpan类,该类继承自ReplacementSpan。在BorderSpan类的getSize方法中,我们计算出文字加上边框和padding后的宽度。在draw方法中,我们首先绘制背景,然后绘制边框,最后绘制文字。

接下来,我们创建一个SpannableString对象,并将BorderSpan应用到该对象中。最后,我们将SpannableString显示在一个SpannableTextView中。

示例应用

下面是一个示例应用,演示了如何使用SpannableString和ReplacementSpan类来为文字添加边框效果。

<com.example.myapplication.SpannableTextView
    android:id="@+id/textView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textSize="24sp"
    android:textColor="@android:color/black" />
public class SpannableTextView extends androidx.appcompat.widget.AppCompatTextView {
    public SpannableTextView(Context context) {
        super(context);
    }

    public SpannableTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public SpannableTextView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);