ForegroundColorSpan 不适用于 ReplacementSpan
ForegroundColorSpan is not applied to ReplacementSpan
我正在尝试利用 ReplacementSpans 格式化 EditText 字段中的输入(不修改内容):
public class SpacerSpan extends ReplacementSpan {
@Override
public int getSize(Paint paint, CharSequence text, int start, int end, Paint.FontMetricsInt fm) {
return (int) paint.measureText(text.subSequence(start,end)+" ");
}
@Override
public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, Paint paint) {
canvas.drawText(text.subSequence(start,end)+" ", 0, 2, x, y, paint);
}
}
这按预期工作并在跨接部分之后添加了间距。
但是,如果我还应用 ForegroundColorSpan,则不会为跨区设置颜色:
EditText edit = (EditText) findViewById(R.id.edit_text);
SpannableString content = new SpannableString("1234567890");
ForegroundColorSpan fontColor = new ForegroundColorSpan(Color.GREEN);
SpacerSpan spacer = new SpacerSpan();
content.setSpan(fontColor, 0, content.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
content.setSpan(spacer, 4, 5, Spanned.SPAN_MARK_MARK);
edit.setText(content);
结果看起来像 http://i.cubeupload.com/4Us5Zj.png
如果我应用 AbsoluteSizeSpan,指定的字体大小也会应用到 Replacement Span 部分。这是预期的行为吗,我是否遗漏了什么,或者 android 中的错误?
CommonWare 为我指明了正确的方向。
似乎 ReplacementSpans
在咨询任何 CharacterStyleSpan
之前呈现 [1]
一个可能的(但丑陋的)修复是实现一个扩展 MetricAffectingSpan
的自定义 ForegroundColorSpan
(在绘制 ReplacementSpans 之前咨询 MetricAffectingSpans [1])。
public class FontColorSpan extends MetricAffectingSpan {
private int mColor;
public FontColorSpan(int color) {
mColor = color;
}
@Override
public void updateMeasureState(TextPaint textPaint) {
textPaint.setColor(mColor);
}
@Override
public void updateDrawState(TextPaint textPaint) {
textPaint.setColor(mColor);
}
}
我想这是一个应该报告的错误?
我正在尝试利用 ReplacementSpans 格式化 EditText 字段中的输入(不修改内容):
public class SpacerSpan extends ReplacementSpan {
@Override
public int getSize(Paint paint, CharSequence text, int start, int end, Paint.FontMetricsInt fm) {
return (int) paint.measureText(text.subSequence(start,end)+" ");
}
@Override
public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, Paint paint) {
canvas.drawText(text.subSequence(start,end)+" ", 0, 2, x, y, paint);
}
}
这按预期工作并在跨接部分之后添加了间距。 但是,如果我还应用 ForegroundColorSpan,则不会为跨区设置颜色:
EditText edit = (EditText) findViewById(R.id.edit_text);
SpannableString content = new SpannableString("1234567890");
ForegroundColorSpan fontColor = new ForegroundColorSpan(Color.GREEN);
SpacerSpan spacer = new SpacerSpan();
content.setSpan(fontColor, 0, content.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
content.setSpan(spacer, 4, 5, Spanned.SPAN_MARK_MARK);
edit.setText(content);
结果看起来像 http://i.cubeupload.com/4Us5Zj.png
如果我应用 AbsoluteSizeSpan,指定的字体大小也会应用到 Replacement Span 部分。这是预期的行为吗,我是否遗漏了什么,或者 android 中的错误?
CommonWare 为我指明了正确的方向。
似乎 ReplacementSpans
在咨询任何 CharacterStyleSpan
之前呈现 [1]
一个可能的(但丑陋的)修复是实现一个扩展 MetricAffectingSpan
的自定义 ForegroundColorSpan
(在绘制 ReplacementSpans 之前咨询 MetricAffectingSpans [1])。
public class FontColorSpan extends MetricAffectingSpan {
private int mColor;
public FontColorSpan(int color) {
mColor = color;
}
@Override
public void updateMeasureState(TextPaint textPaint) {
textPaint.setColor(mColor);
}
@Override
public void updateDrawState(TextPaint textPaint) {
textPaint.setColor(mColor);
}
}
我想这是一个应该报告的错误?