我正在扩展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);
每个单词后面必须有一个空格,但如果它们位于该行的末尾,则某些空格不会显示在框中。
如果有人能给我一些关于如何解决这个问题的提示,我真的很感激