Трудно настроить интервал между символами, когда вы используете TextView. Но если вы можете справиться с рисунком самостоятельно, должен быть какой-то способ сделать это.
Мой ответ на этот вопрос: используйте ваш пользовательский диапазон .
Мой код:
public class LetterSpacingSpan extends ReplacementSpan {
private int letterSpacing = 0;
public LetterSpacingSpan spacing(int space) {
letterSpacing = space;
return this;
}
@Override
public int getSize(@NonNull Paint paint, CharSequence text, int start, int end, @Nullable Paint.FontMetricsInt fm) {
return (int) paint.measureText(text, start, end) + (text.length() - 1) * letterSpacing;
}
@Override
public void draw(@NonNull Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, @NonNull Paint paint) {
int length = text.length();
float currentX = x;
for (int i = 1; i < length; i++) {
canvas.drawText(text, i, i + 1, currentX, y, paint);
currentX += paint.measureText(text, i, i + 1) + letterSpacing;
}
}
}
Объясните:
Создание собственного Span
может помочь вам достичь многих потрясающих эффектов, таких как создание размытия TextView, изменение фона или переднего плана для вашего TextView, даже создание анимации. Из этого поста я многому научился Включите мощную концепцию .
Поскольку вы добавляете интервал к каждому символу, поэтому мы должны использовать базовый диапазон на уровне символов, в этом случае ReplacementSpan - лучший выбор. Я добавляю метод spacing
, поэтому при его использовании вы можете просто передать нужное пространство для каждого символа в качестве параметра.
При создании пользовательского диапазона вам нужно переопределить как минимум два метода, getSize
и draw
. Метод getSize
должен возвращать окончательную ширину после того, как мы добавили интервал для всей последовательности символов, и внутри блока метода draw
вы можете управлять Canvas
, чтобы сделать желаемый рисунок.
Так, как мы используем этот LetterSpacingSpan? Это просто:
Использование:
TextView textView;
Spannable content = new SpannableString("This is the content");
textView.setSpan(new LetterSpacingSpan(), 0, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(content);
И это все.