透明WebView在Android v4.0上无法正常工作。

14
这个问题的背景在此处。它涉及解决 Android 中已知的 WebView 透明背景 bug 的方法。 Android WebView style background-color:transparent ignored on android 2.2 它涉及一个 WebView,托管一个具有透明背景的 HTML 文档,因此 WebView 是透明的,HTML 文档可以覆盖到其他视图上。
将以下方法添加到 WebView 子类中,并从构造函数中调用,对于我在 Android v2、v3 和 v4 上有效,除非 WebView 的像素高度大于屏幕像素高度(例如,WebView 在 ScrollView 中,所以比屏幕更长)。
protected void setBackgroundToTransparent() {
    this.setBackgroundColor(Color.TRANSPARENT);
    this.setBackgroundDrawable(null);
    if (Build.VERSION.SDK_INT >= 11) // Android v3.0+
        try {
         Method method = View.class.getMethod("setLayerType", int.class,  Paint.class);
         method.invoke(this, 1, new Paint());  // 1 = LAYER_TYPE_SOFTWARE (API11)
        } catch (Exception e) {}
}

这里有一个问题吗?或者你在问题本身中已经回答了它? - Arne Evertsson
我认为问题很明确,即如何解决问题以正确地使用透明的WebView。 - Ollie C
那么问题是如何使它也适用于异常?无论如何,在模拟器中尝试时,即使在4.0上,它似乎也可以工作。 - Arne Evertsson
是的,这就是问题。它在Galaxy Nexus上无法稳定工作。 - Ollie C
好的,感谢您解决了我的WebView透明度问题。 ;) 在我看来,这似乎是一个Android的bug(参见http://code.google.com/p/android/issues/detail?id=28410)。此外,在ScrollView中放置一个WebView并不好。因为WebView有自己的滚动,两个视图会争夺触摸事件。 - Markus Junginger
this.setBackgroundDrawable(null)会导致文本也变成透明的。我认为这并不必要,所以应该将其删除。 - inder
3个回答

12

我遇到了同样的问题,发现这是一些版本的Android关于硬件加速的一个bug。Spiri上面的答案有效,但是由于我的WebView需要播放视频,我需要它启用硬件加速。我发现下面的方法很有效:

不要使用

mWebView.setBackgroundColor(Color.TRANSPARENT);

我使用的是:

mWebView.setBackgroundColor(Color.argb(1, 255, 255, 255));

这在我之前遇到此问题的所有Android设备上都有效。


1
这更像是一个错误修复,你不应该将 alpha 设置为 0 而是设置为 1(从 255),这几乎是看不见的,但硬件仍然会渲染它。 - paulgavrikov
现在似乎在Android 11和12上失败了 - 我使用了一个Cordova插件,该插件遵循了这个技巧(1, 0, 0, 0)来实现透明度,在旧设备上可以正常工作,但在Android 11上只显示黑屏。将颜色更改为透明解决了问题(在Android 10上也是如此,因此我认为现在使用它没有问题)。 - hazelnutek

9

我曾遇到过与Android API level 16相似的问题,这个解决方案可以解决:

view.setLayerType(View.LAYER_TYPE_SOFTWARE, null); // 'view' is a WebView

此操作禁用视图上的硬件加速,根据文档:http://developer.android.com/guide/topics/graphics/hardware-accel.html。虽然我知道这不是正确的方法,但由于这是一个已知问题,直到他们提出适当的解决方案,此方法对我来说最有效。

1

前几天我花了几个小时,尝试了所有可能的答案,并自己调查了一些东西。我遇到了与你相同的问题,即如果WebView可以滚动,则不会透明。唯一能使它透明的方法是在“设置”>“开发人员选项”中禁用GPU渲染。最终,我只是检查了GPU渲染是否启用,然后将背景设置为最匹配的颜色。如果你有解决方案,我很惊讶地听到它。


请参见上文。您不能强制所有用户激活GPU渲染。 - paulgavrikov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接