【问题标题】:Transparent WebView not working on Android v4.0透明 WebView 在 Android v4.0 上不起作用
【发布时间】:2013-07-24 00:16:45
【问题描述】:

这个问题的一些背景是here。它涉及解决 Android 中 WebView 背景需要透明的已知错误。 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) {}
}

【问题讨论】:

  • 这里有问题吗,或者您是否在问题本身中回答了它?
  • 我认为很明显问题是我如何解决该问题以使透明的 WebView 正常工作。
  • 所以问题是如何使它也适用于异常?无论如何,即使在 4.0 上,当我在模拟器中尝试时,它似乎也能正常工作。
  • 是的,这就是问题所在。它不能在 Galaxy Nexus 上始终如一地工作。
  • 嗯,感谢您使用 WebView 解决了我的透明度问题。 ;) 对我来说看起来像是一个 Android 错误(比较 code.google.com/p/android/issues/detail?id=28410)。此外,在 ScrollView 中放置一个 WebView 感觉不太好。因为 WebView 有自己的滚动,两个视图竞争触摸事件。

标签: android android-webview


【解决方案1】:

我也遇到过同样的问题,我发现这是某些 Android 版本中有关硬件加速的错误。 Spiri 上面的回答有效,但我需要我的 WebView 进行硬件加速,因为它需要播放视频。我发现效果很好,如下:

而不是使用

mWebView.setBackgroundColor(Color.TRANSPARENT);

我用的是:

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

这适用于我之前遇到此问题的所有 Android 设备。

【讨论】:

  • 这更像是一个错误修复,您没有将 alpha 设置为 0,而是设置为 1(从 255 开始),这几乎是不可见的,但硬件仍会渲染它。
  • 这似乎在 Android 11 和 12 上失败了——我使用了一个 Cordova 插件,它遵循这个技巧 (1, 0, 0, 0) 以获得透明度,虽然它适用于旧设备,但它开始只是显示黑屏Android 11。将颜色更改为透明解决了问题(也在 android 10 上,所以我现在使用它没有问题)
【解决方案2】:

我在 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

我知道这不是要走的路,但由于这是一个已知问题,只要他们提出了适当的解决方案,这个就可以完成工作(至少对我而言)。

【讨论】:

    【解决方案3】:

    前几天我花了几个小时在这个问题上,尝试了所有可能与该主题相关的答案,并亲自调查了一些东西。我遇到了同样的问题,如果 webview 是可滚动的,那么它就不会是透明的。我可以让它透明的唯一方法是如果我在设置 > 开发人员选项中禁用 GPU 渲染。我最终只是检查了是否启用了 gpu 渲染,然后将背景设置为最匹配的某种颜色。如果你想出一个解决方案,我会很高兴听到它。

    【讨论】:

    • 见上文。此外,您不能强制所有用户激活 GPU 渲染。
    猜你喜欢
    • 1970-01-01
    • 2017-08-04
    • 2016-04-06
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 2014-10-25
    • 1970-01-01
    • 2015-10-27
    相关资源
    最近更新 更多