2013-11-14 2 views
2

Я хотел бы иметь Spannable, который выглядит как ошибка в IDE - подчеркивание другого цвета.Как получить UnderlineSpan с другим цветом в Android?

Я пытался создать ColorUnderlineSpan класс, расширяющий андроид 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); 
    } 
} 

Я также нашел DynamicDrawableSpan класс, но Я не вижу границ холста для рисования.

Было бы здорово получить любой Spannable impl с абстрактным методом рисования с аргументом bounds.

ответ

5

Это не симпатичное решение, но в конечном итоге работаем для меня:

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); 
} 

Это странно, потому что вы должны указать индекс символа, чтобы начать и закончить ваше подчеркивание с, но он работал для меня ,

+0

Спасибо, что поделились своим решением, я дам ему попробовать – 4ntoine

+0

Отличное решение. Производительность может быть значительно улучшена путем кэширования offsetX и длины, так как drawBackground получает вызов каждого кадра. – Grahambo

+0

Есть ли какой-нибудь demoCode, чтобы проверить это? – Rakesh