android TextView在Kindle Fire上制作隐形跨度

时间:2012-09-25 10:35:02

标签: android android-emulator invisible kindle-fire spannablestring

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

9 * 9 = 81

我希望81不可见。当用户键入正确答案时,我将数字设为“8”,然后显示“1”。

我尝试使用透明色的TextAppearanceSpanForegroundColorSpan#00000000 Color.TRANSPARENT ),它们适合每一个人设备和仿真器,除了KindleFire设备和仿真器。

在Kindle Fire上,“81”显示为深灰色。似乎光栅化器试图使它对某些“深灰色”背景不可见,而不是我在LinearLayout的{​​{1}}中设置的背景(看起来像网格纸图像) 1}}。

enter image description here

我的问题是:如何使用ActivityTextView使TextAppearanceSpan中的部分文字不可见?是否存在另一个“span”来正确测量文本,但不绘制它?

更新

我发现存在一些神秘的ForegroundColorSpanRasterizerSpan,可以(根据标题判断)帮助。

正如我所看到的,RasterizerSpan的唯一含义是将Rasterizer设置为TextPaint对象:

MetricAffectingSpan

我发现它很有希望:如果我能够设置一种“无效”光栅化器(它什么也不做),它会使这个文本不可见。不幸的是

    public void updateDrawState(TextPaint ds) {
    ds.setRasterizer(mRasterizer);
}

没有帮助。

我的另一个想法是实现一个自定义ShaderSpan,它将设置一个“void”着色器:

new RasterizerSpan(null); // (set mRasterizer to null)

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

3 个答案:

答案 0 :(得分: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进行测试:)

答案 1 :(得分:0)

为什么不使用android可见性(true或false)。它会做你需要的同样的工作(或者你会使用Span的具体理由)?

答案 2 :(得分:0)

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

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

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