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", чтобы изменить поведение определенных строк, если вы хотите изменить только высоту определенных строк в промежутке.