4nt*_*ine 4 html user-interface android spannable
我希望在IDE中看起来像错误的Spannable - 用另一种颜色加下划线.
我试图创建ColorUnderlineSpan扩展android的类UnderlineSpan,但它使所有文本成为另一种颜色(我只需要添加彩色下划线):
/**
* Underline Span with color
*/
public class ColorUnderlineSpan extends android.text.style.UnderlineSpan {
private int underlineColor;
public ColorUnderlineSpan(int underlineColor) {
super();
this.underlineColor = underlineColor;
}
@Override
public void updateDrawState(TextPaint ds) {
super.updateDrawState(ds);
ds.setColor(underlineColor);
}
}
Run Code Online (Sandbox Code Playgroud)
我也找到了DynamicDrawableSpan课程,但我看不到画布边界要画.
使用带有bounds参数的抽象绘制方法获得任何Spannable impl会很棒.
小智 7
这不是最漂亮的解决方案,但它最终为我工作:
public class CustomUnderlineSpan implements LineBackgroundSpan {
int color;
Paint p;
int start, end;
public CustomUnderlineSpan(int underlineColor, int underlineStart, int underlineEnd) {
super();
color = underlineColor;
this.start = underlineStart;
this.end = underlineEnd;
p = new Paint();
p.setColor(color);
p.setStrokeWidth(3F);
p.setStyle(Paint.Style.FILL_AND_STROKE);
}
@Override
public void drawBackground(Canvas c, Paint p, int left, int right, int top, int baseline, int bottom, CharSequence text, int start, int end, int lnum) {
if (this.end < start) return;
if (this.start > end) return;
int offsetX = 0;
if (this.start > start) {
offsetX = (int)p.measureText(text.subSequence(start, this.start).toString());
}
int length = (int)p.measureText(text.subSequence(Math.max(start, this.start), Math.min(end, this.end)).toString());
c.drawLine(offsetX, baseline + 3F, length + offsetX, baseline + 3F, this.p);
}
Run Code Online (Sandbox Code Playgroud)
这很奇怪,因为你必须指定字符索引来开始和结束你的下划线,但它对我有用.