BackgroundColorSpan отрегулируйте высоту или добавьте к ней отступ.

У меня есть приложение, в котором я отображаю несколько строк и несколько абзацев форматированного текста в TextView, я использую SpannableStringBuilder для этого.

Здесь я хочу выделить текст. Теперь я попытался с помощью BackgroundColorSpan, но в этом случае фон текста покрывает всю высоту строки. Я хочу, чтобы он охватывал только текст. Кажется, нет никакого очевидного способа установить вертикальный отступ или высоту на этом промежутке. Просто цвет.

Во-вторых, я также попытался создать подкласс ReplacementSpan и реализации backgroundSpan моего собственного рисования в методе рисования этого класса. Но это не поддерживает многострочное выделение.

Может кто-нибудь сказать мне, как я могу добиться этой функциональности выделения? По сути, я хочу, чтобы он работал как читатель электронных книг, предпочтительно Kindle или по умолчанию для чтения книг на Android,

2 ответа

Я попробовал решение koopuluri, но LineBackgroundSpan для всего параграфа, когда я просто хотел выделить несколько слов. Итак, я нашел ReplacementSpan, где мы можем переопределить функцию draw и нарисуйте прямоугольник позади нашего текста. Вы должны дать ему высоту текста.

/**
 * It's like a {@link android.text.style.BackgroundColorSpan} but we don't paint the extra line height.
 * <p/>
 */
public class BackgroundColorWithoutLineHeightSpan extends ReplacementSpan
{
    private final int mColor;
    private final int mTextHeight;

    public BackgroundColorWithoutLineHeightSpan(int color, int textHeight)
    {
        mColor = color;
        mTextHeight = textHeight;
    }

    @Override
    public int getSize(Paint paint, CharSequence text, int start, int end, Paint.FontMetricsInt fm)
    {
        return Math.round(measureText(paint, 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 paintColor = paint.getColor();
        RectF rect = new RectF(x, top, x + measureText(paint, text, start, end), top + mTextHeight);
        paint.setColor(mColor);
        canvas.drawRect(rect, paint);
        paint.setColor(paintColor);
        canvas.drawText(text, start, end, x, y, paint);
    }

    private float measureText(Paint paint, CharSequence text, int start, int end)
    {
        return paint.measureText(text, start, end);
    }
}

Вы можете реализовать LineBackgroundSpan и переопределить:

drawBackground (Canvas c, Paint p, int слева, int справа, int top, int baseline, int bottom, текст CharSequence, int start, int end, int lnum)

Вы можете изменить аргументы "top" и "bottom", чтобы указать высоту фона, который вы рисуете для данной линии. Аргумент "baseline" - это y-координата линии, на которой сидят все символы (обратите внимание, что буквы g, p, j и т. Д. Имеют некоторые части, которые падают ниже базовой линии).

Этот метод применяется для каждой строки на дисплее для данного текста. Например, если текст

"this is an example , blah, blah .." 

занимает 3 строки на вашем дисплее, затем drawBackground(...) применяется трижды, и вы можете использовать аргумент "lnum", чтобы изменить поведение определенных строк, если вы хотите изменить только высоту определенных строк в промежутке.

Другие вопросы по тегам