Я хочу, чтобы часть моего TextView была невидимой. Подробно представляю пользователю математическую задачу:
9 * 9 = 81
и я хочу, чтобы 81
был невидимым. Когда пользователь вводит правильный ответ, я делаю видимой цифру «8», а затем «1».
Я пытался использовать TextAppearanceSpan
и ForegroundColorSpan
с прозрачным цветом (как #00000000, так и Color.TRANSPARENT), и они отлично работают для всех устройств и эмуляторов, кроме устройства и эмулятора KindleFire.
На Kindle Fire цифра «81» окрашена в темно-серый цвет. Кажется, что растеризатор пытается сделать его невидимым на каком-то «темно-сером» фоне, а не на фоне (который выглядит как изображение сетки бумаги), который я установил в корне LinearLayout
моего Activity
.
Мой вопрос: как я могу сделать часть текста в TextView
невидимой, не используя ни TextAppearanceSpan
, ни ForegroundColorSpan
? Существует ли другой «промежуток», который правильно измеряет текст, но не рисует его?
Обновить
Я обнаружил, что существуют некие загадочные RasterizerSpan
и MetricAffectingSpan
, которые могут (судя по названию) помочь.
Как я вижу, единственным значением RasterizerSpan является установка растеризатора на объект TextPaint:
public void updateDrawState(TextPaint ds) {
ds.setRasterizer(mRasterizer);
}
Я нашел это многообещающим: если бы я мог установить своего рода «пустой» растеризатор (который просто ничего не делает), он сделал бы этот текст невидимым. К сожалению
new RasterizerSpan(null); // (set mRasterizer to null)
не помогло.
Моя другая идея - реализовать собственный ShaderSpan, который установит шейдер "void":
public void updateDrawState(TextPaint ds) {
ds.setShader(myCustomVoidShader);
}
но я не понимаю, как создать шейдер, который "ничего не производит".