ReplacementSpan没有绘制一些空格字符

时间:2018-06-18 18:21:39

标签: android textview spannablestring spannable

我正在扩展ReplacementSpan以在TextView中围绕文本绘制一个框。它在大多数情况下工作正常,但有一个问题我无法解决:有时在行末使用空格字符时不会绘制框。请参阅随附的屏幕截图。

这是我的Span类:

public class PlaceholderSpan extends ReplacementSpan implements 
LineHeightSpan.WithDensity {
    private final String TAG = PlaceholderSpan.class.getSimpleName();
    int padding = 25;
    int margin = 10;
    int backgroundColor;

public PlaceholderSpan(int backgroundColor) {
    super();
    this.backgroundColor = backgroundColor;
}

@Override
public int getSize(@NonNull Paint paint, CharSequence charSequence, int start, int end, @Nullable Paint.FontMetricsInt fm) {

    String textToDraw = charSequence.subSequence(start, end).toString();
    int size;
    if(textToDraw.equals(" ")) {
        size =  (int) paint.measureText("W", 0, 1) + padding + padding;
        Log.d(TAG, "getSize: " + size);
    } else {
        size =  (int) paint.measureText(charSequence, start, end) + padding + padding;
    }
    return size + margin + margin;
}

@Override
public void draw(@NonNull Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, @NonNull Paint p) {
    String textToDraw = text.subSequence(start, end).toString();
    int left= (int) x + margin;
    int right = left + padding + (int) p.measureText(text, start, end) + padding;

    p.setStyle(Paint.Style.STROKE);
    p.setColor(backgroundColor);

    Rect bounds = new Rect();
    p.getTextBounds("W".toCharArray(), 0, 1 , bounds);

    int height = top + bounds.height() + 35;

    RectF rect = new RectF(left, top, right, height);

    // draw the placeholder
    canvas.drawRect(rect, p);

    // draw the content
    canvas.drawText(textToDraw, x + padding + margin, y, p);

    if(textToDraw.equals(" ")) {
        Log.d(TAG, "draw: " + textToDraw
                + ", start " + start
                + ", end " + end
                + ", x " + x
                + ", y " + y
                + ", bottom " + bottom
                + ", left " + left
                + ", right " + right
        );
    }
}

@Override
public void chooseHeight(CharSequence charSequence, int i, int i1, int i2, int i3, Paint.FontMetricsInt fontMetricsInt, TextPaint textPaint) {
    Paint.FontMetricsInt fm = textPaint.getFontMetricsInt();

    fontMetricsInt.top = fm.top;
    fontMetricsInt.ascent = fm.ascent;
    fontMetricsInt.descent = fm.descent;

    // Our font now must accommodate the size of the drawable, so change the bottom of the
    // font to accommodate the drawable.
    fontMetricsInt.bottom = fm.bottom + 200 +  margin;
    fontMetricsInt.leading = fm.leading;
}

@Override
public void chooseHeight(CharSequence charSequence, int i, int i1, int i2, int i3, Paint.FontMetricsInt fm) {

}

}

以下是我如何使用它:

    String str = "Very1  very2  .very3  very4 very5 very6 very7 very8 very9 very0 very1 very2 very3 very4 very5 very6 very7 very8 very9 very0";
    Spannable spannable = new SpannableString(str);

    for (int i = 1; i < str.length(); i++) {
        if(str.substring(i-1, i).equals(" ")) {
            spannable.setSpan(new PlaceholderSpan(Color.RED), i - 1, i, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        } else {
            spannable.setSpan(new PlaceholderSpan(Color.BLUE), i - 1, i, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
    }
    textView.setText(spannable, TextView.BufferType.SPANNABLE);

结果如下: enter image description here

每个单词后面必须有一个空格,但如果它们位于该行的末尾,则某些空格不会显示在框中。

如果有人能给我一些关于如何解决这个问题的提示,我真的很感激

0 个答案:

没有答案