WebViewClient - 以后 OS 版本的透明背景

WebViewClient - transparent background for later OS versions

我的目标是 SDK 版本 27,目前正在 Oreo(物理设备)和 API19(模拟器)上进行测试,并希望将 WebView 的背景设置为透明。

早期 API/SDK 版本有很多答案,但这些版本似乎对我没有任何帮助。

具体来说,我正在将 URL returns 图像仅加载到我的 WebView 中。 WebView 比图像稍宽(因为图像大小可能会有所不同)。

我总是能看到图片周围有黑色背景(我已经确认这不是图片的一部分)

在附加到我的 WebView 的 WebViewClientonPageFinished 方法中,我正在尝试以下所有操作:

wv.setBackgroundColor(Color.TRANSPARENT)
wv.setLayerType(WebView.LAYER_TYPE_SOFTWARE, null)
wv.setBackgroundResource(android.R.color.transparent)

我也将图层类型设置为LAYER_TYPE_HARDWARE

这将使 webview activity 透明。

<style name="AppTheme.Transparent" parent="AppTheme">
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowIsFloating">true</item>
    <item name="android:backgroundDimEnabled">false</item>
</style>

在您的清单中将其添加为 webview activity 的主题

<activity android:name=".WebViewActivity" android:theme="@style/Theme.Transparent">

事实证明,上面的代码实际上使 WebView 透明,而我看到的黑色环绕实际上是呈现页面的伪 body 的默认背景当页面仅包含图像时。 (This answer 给了我线索!)

因此,诀窍是使用透明 body 动态创建一个 HTML 页面,并将图像包含在该页面中,而不是仅仅将图像加载到 WebView直接。

因此,使用:

wv.setBackgroundColor(Color.TRANSPARENT)
wv.setLayerType(WebView.LAYER_TYPE_SOFTWARE, null)

onPageFinished 方法中并使用

String myHTML = "<html><body style=\"background: transparent; margin:0; padding:0;\"><img src=\"" +
                myImgURL + "\"></body></html>";
wv.loadData(myHTML, "text/html", "UTF-8");

已经达到了在 WebView 中显示图像的预期效果,就好像它直接在 canvas 上一样。

(请注意,我尝试过使用和不使用 setLayerType 行,它在 Oreo 中仍然有效——在其他版本中可能需要也可能不需要)