ReplacementSpan обрезает строку в TextView - PullRequest
0 голосов
/ 16 мая 2018

Мне нужно использовать пользовательское подчеркивание для текста в моем TextView.Я использую ReplacementSpan, чтобы сделать это.Но он обрезает текст в конце первой строки.

Вот мой CustomUnderlineSpan класс:

public class CustomUnderlineSpan extends ReplacementSpan {
    private int underlineColor;
    private int textColor;


    public CustomUnderlineSpan(int underlineColor, int textColor) {
        super();
        this.underlineColor = underlineColor;
        this.textColor = textColor;
    }

    @Override
    public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, Paint paint) {
        paint.setStrokeWidth(3F);

        paint.setColor(textColor);
        canvas.drawText(text, start, end, x, y, paint);

        paint.setColor(underlineColor);
        int length = (int) paint.measureText(text.subSequence(start, end).toString());
        canvas.drawLine(x, bottom, length + x, bottom, paint);
    }

    @Override
    public int getSize(Paint paint, CharSequence text, int start, int end, Paint.FontMetricsInt fm) {
        return Math.round(paint.measureText(text, start, end));
    }
}

Это метод для реализации CustomUnderlineSpan для всей длины текста:

public static Spannable getCustomUnderlineSpan(String string, int underlineColor, int textColor) {
    Spannable spannable = new SpannableString(string);
    CustomUnderlineSpan customUnderlineSpan = new CustomUnderlineSpan(underlineColor, textColor);
    spannable.setSpan(customUnderlineSpan, 0, spannable.length(), 0);

    return spannable;
}

А вот настройка текста для TextView:

String text = "Just text to underline Just text to underline Just text" + 
"to underline Just text to underline Just text to underline Just text" + 
"to underline Just text to underline Just text to underline";

textView.setText(getCustomUnderlineSpan(text,
Color.parseColor("#0080ff"), Color.parseColor("#000000")), TextView.BufferType.SPANNABLE);

Результат: enter image description here

Есть ли у вас какие-либо предложения, почему текст обрезается наконец строки?Спасибо!

1 Ответ

0 голосов
/ 17 мая 2018

Решено

Использование DynamicDrawableSpan вместо ReplacementSpan решило проблему.Кажется, ReplacementSpan просто не может выполнять переносы строк.

Вот мой код:

    public class CustomUnderlineSpan extends DynamicDrawableSpan {

    private int underlineColor;
    private int textColor;
    private final float STROKE_WIDTH = 3F;

    public CustomUnderlineSpan(int underlineColor, int textColor) {
        super(DynamicDrawableSpan.ALIGN_BASELINE);
        this.underlineColor = underlineColor;
        this.textColor = textColor;
    }

    @Override
    public Drawable getDrawable() {
        return null;
    }

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

        return (int) paint.measureText(text, start, end);
    }

    @Override
    public void draw(Canvas canvas, CharSequence text,
                     int start, int end, float x,
                     int top, int y, int bottom, Paint paint) {

        int length = (int) paint.measureText(text.subSequence(start, end).toString());

        paint.setColor(underlineColor);
        paint.setStrokeWidth(STROKE_WIDTH);
        canvas.drawLine(x, bottom - STROKE_WIDTH / 2, length + x, bottom - STROKE_WIDTH / 2, paint);

        paint.setColor(textColor);
        canvas.drawText(text.subSequence(start, end).toString(), x, y, paint);
    }

}
...