如何使用 Android SpannableString 和 MaskFilterSpan 按预期模糊 TextView 中的某些文本?

How to Using Android SpannableString and MaskFilterSpan to blur some text from TextView as expected?

我所期望的是这样的。 这是一篇影评,当某些文字可能剧透时,会被这些标签包裹[剧透][/剧透]。 所以我写了方法找出每个剧透词的开始索引和结束索引,然后使用 MaskFilterSpan 模糊它。

但是结果并不好

如果我只是将 MaskFilterSpan 替换为 StrikethroughSpan 或 BackgroundColorSpan,它就完美了。

我的代码:

private void testBlurText() {
    String text = "Alec Baldwin nailed his job; \n" +
            "The animators nailed their job (seriously, the art style and changes were amazing);\n" +
            "The ideas guy nailed his job ([spoiler]It's all the imagination of the kid[/spoiler]);\n" +
            "The writers just let the story down :( ([spoiler]Although at the beginning it's clear that the whole shebang is the older kid's imagination, the writers probably realised that the script was too short and so the end got changed to something that makes no sense. Why would Tim receive the kid for a second time? - unless it was all a dream...[/spoiler] ).\n" +
            "\n" +
            "All in all, a good movie, amazing acting and animating, partly let down by a badly written ending to the story. 8/10.";
    SpannableString spanText = new SpannableString(text);
    List<Pair<Integer, Integer>> spoilersContainer = new ArrayList<>();
    getSpoilerIndex(text, 0, spoilersContainer);
    for (Pair<Integer, Integer> pair : spoilersContainer) {
        spanText.setSpan(new MaskFilterSpan(new BlurMaskFilter(20, BlurMaskFilter.Blur.NORMAL)), pair.first, pair.second, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
        Logger.d("SpoilerIndex:" + pair.toString());
    }
    tvTestBlurText.setText(spanText);
}

private void getSpoilerIndex(String rawComment, int beginIndex, List<Pair<Integer, Integer>> spoilersContainer) {
    int startIndex = rawComment.indexOf("[spoiler]", beginIndex);
    int endIndex = rawComment.indexOf("[/spoiler]", beginIndex);
    if (startIndex != -1 && endIndex != -1) {
        spoilersContainer.add(new Pair<>(startIndex, endIndex + "[/spoiler]".length()));
        getSpoilerIndex(rawComment, endIndex + "[/spoiler]".length(), spoilersContainer);
    }
}

有没有错误,或者只是 MaskFilterSpan 的错误?

如果您在 AndroidManifest.xml.

中的 Activity 上设置 android:hardwareAccelerated="false",它会正确呈现

硬件加速不支持 BlurMaskFilter。

您可以在此处查看不支持的绘图操作:

http://developer.android.com/guide/topics/graphics/hardware-accel.html