WebViewClient - 以后 OS 版本的透明背景
WebViewClient - transparent background for later OS versions
我的目标是 SDK 版本 27,目前正在 Oreo(物理设备)和 API19(模拟器)上进行测试,并希望将 WebView 的背景设置为透明。
早期 API/SDK 版本有很多答案,但这些版本似乎对我没有任何帮助。
具体来说,我正在将 URL returns 图像仅加载到我的 WebView 中。 WebView 比图像稍宽(因为图像大小可能会有所不同)。
我总是能看到图片周围有黑色背景(我已经确认这不是图片的一部分)
在附加到我的 WebView 的 WebViewClient
的 onPageFinished
方法中,我正在尝试以下所有操作:
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 中仍然有效——在其他版本中可能需要也可能不需要)
我的目标是 SDK 版本 27,目前正在 Oreo(物理设备)和 API19(模拟器)上进行测试,并希望将 WebView 的背景设置为透明。
早期 API/SDK 版本有很多答案,但这些版本似乎对我没有任何帮助。
具体来说,我正在将 URL returns 图像仅加载到我的 WebView 中。 WebView 比图像稍宽(因为图像大小可能会有所不同)。
我总是能看到图片周围有黑色背景(我已经确认这不是图片的一部分)
在附加到我的 WebView 的 WebViewClient
的 onPageFinished
方法中,我正在尝试以下所有操作:
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 中仍然有效——在其他版本中可能需要也可能不需要)