0

我想让我的 TextView 的一部分不可见。详细地,我向用户提出一个数学问题:

9 * 9 = 81

我想81隐身。当用户输入正确答案时,我会显示数字“8”,然后显示“1”。

我尝试使用TextAppearanceSpan透明ForegroundColorSpan颜色(#00000000Color.TRANSPARENT),它们适用于除 KindleFire 设备和模拟器之外的所有设备和模拟器。

在 Kindle Fire 上,“81”显示为深灰色。似乎光栅化器试图使其在某些“深灰色”背景下不可见,而不是在我设置在LinearLayout我的Activity.

在此处输入图像描述

我的问题是:如何TextView使用既不TextAppearanceSpan也不使部分文本不可见ForegroundColorSpan?是否存在另一个正确测量文本但不绘制文本的“跨度”?

更新

我发现存在一些神秘的RasterizerSpanand MetricAffectingSpan,这可以(从标题判断)有所帮助。

如我所见, RasterizerSpan 的唯一含义是将 Rasterizer 设置为 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);
}

但我不明白如何创建一个产生“无”的着色器。

4

3 回答 3

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 来测试 :)

于 2012-09-27T15:48:25.453 回答
1

您可以使用AbsoluteSizeSpan,将大小设置为0。所以它会不可见

span = new AbsoluteSizeSpan(0, true); spannableString.setSpan(span, wordPosition.start, wordPosition.end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

注意:隐形单词的下一个单词将出现在隐形单词的位置。

于 2020-05-20T11:12:47.387 回答
0

为什么不使用 android 可见性(真或假)。它会做你需要的同样的工作(或者有一个特定的原因你会撒谎使用 Span)?

于 2012-09-27T15:53:03.203 回答