Android TextView делает невидимый диапазон на Kindle Fire

Я хочу, чтобы часть моего 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);
}

но я не понимаю, как создать шейдер, который "ничего не производит".


person Nick    schedule 25.09.2012    source источник
comment
что произойдет с Kindle Fire, если вы сделаете весь TextViews TextColor прозрачным?   -  person Yalla T.    schedule 27.09.2012
comment
расширить ForegroundColorSpan и переопределить updateDrawState и не вызывать суперметод в этом   -  person Vishal Pawar    schedule 27.09.2012
comment
Что произойдет с Kindle Fire, если вы сделаете весь TextViews TextColor прозрачным, он отлично работает (невидим).   -  person Nick    schedule 27.09.2012
comment
2Satya: супер метод ds.setColor(mColor). Если я его не назову, цвет останется неизменным (=черный). Он не будет прозрачным.   -  person Nick    schedule 27.09.2012


Ответы (3)


Посмотрите, переопределяете ли вы updateDrawState() на своем ForegroundColorSpan и вызываете setXferMode() будет работать:

public class TransparentSpan extends ForegroundColorSpan {
    private final PorterDuffXfermode MODE = new PorterDuffXfermode(PorterDuff.Mode.DST);

    public TransparentSpan(int color) {
        super(color);
    }

    @Override
    public void updateDrawState(TextPaint ds) {
        super.updateDrawState(ds);
        ds.setXfermode(MODE);
    }
}

Извините, у меня не было Kindle Fire, чтобы протестировать :)

person Joe    schedule 27.09.2012

Почему бы не использовать видимость андроида (true или false). Он будет выполнять ту же работу, что вам нужна (или есть конкретная причина, по которой вы бы солгали, чтобы использовать Span)?

person Miloš    schedule 27.09.2012

Вы можете использовать AbsoluteSizeSpan, установите размер 0. Таким образом, он будет невидимым.

span = новый AbsoluteSizeSpan (0, правда); spannableString.setSpan(span, wordPosition.start, wordPosition.end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

Примечание. Следующее слово невидимого слова займет позицию невидимого слова.

person Snow Albert    schedule 20.05.2020