我希望TextView的一部分不可见。详细地说,我向用户提出了一个数学问题:
9 * 9 = 81
我希望81
不可见。当用户键入正确答案时,我将数字设为“8”,然后显示“1”。
我尝试使用透明色的TextAppearanceSpan
和ForegroundColorSpan
(#00000000 和 Color.TRANSPARENT ),它们适合每一个人设备和仿真器,除了KindleFire设备和仿真器。
在Kindle Fire上,“81”显示为深灰色。似乎光栅化器试图使它对某些“深灰色”背景不可见,而不是我在LinearLayout
的{{1}}中设置的背景(看起来像网格纸图像) 1}}。
我的问题是:如何使用Activity
和TextView
使TextAppearanceSpan
中的部分文字不可见?是否存在另一个“span”来正确测量文本,但不绘制它?
更新
我发现存在一些神秘的ForegroundColorSpan
和RasterizerSpan
,可以(根据标题判断)帮助。
正如我所看到的,RasterizerSpan的唯一含义是将Rasterizer设置为TextPaint对象:
MetricAffectingSpan
我发现它很有希望:如果我能够设置一种“无效”光栅化器(它什么也不做),它会使这个文本不可见。不幸的是
public void updateDrawState(TextPaint ds) {
ds.setRasterizer(mRasterizer);
}
没有帮助。
我的另一个想法是实现一个自定义ShaderSpan,它将设置一个“void”着色器:
new RasterizerSpan(null); // (set mRasterizer to null)
但我不明白如何创建一个产生“无”的着色器。
答案 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);
注意: 隐形单词的下一个单词将出现在隐形单词的位置。