带有layer_type_software的Android WebView不显示HTML5画布内容

时间:2019-08-12 16:59:36

标签: android android-webview

自上次更新Android WebView以来,通过将WebView的图层类型设置为View.LAYER_TYPE_SOFTWARE禁用硬件加速时,无法正确显示带有HTML5画布的网页。是否有解决此问题的方法?

当我省略以下Java代码行时: webView.setLayerType(View.LAYER_TYPE_SOFTWARE,null); 然后内容将正确显示。

Java代码:

WebView webView = findViewById(R.id.webView);
webView.getSettings().setJavaScriptEnabled(true);
webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
webView.loadUrl("file:///android_asset/Gradient.html");

HTML文件test.html:

<!DOCTYPE html>
<html>
<body>
<canvas id="myCanvas" width="200" height="100" style="border:1px solid #d3d3d3;">
Your browser does not support the HTML5 canvas tag.</canvas>
<script>
var c = document.getElementById("myCanvas");
var ctx = c.getContext("2d");
// Create gradient
var grd = ctx.createLinearGradient(0,0,200,0);
grd.addColorStop(0,"red");
grd.addColorStop(1,"white");
// Fill with gradient
ctx.fillStyle = grd;
ctx.fillRect(10,10,150,80);
</script>
</body>
</html>

预期结果: 黑色边框中的红色线性渐变 https://heiri-web.ch/Gradient.png

实际结果: 空的黑色边框 https://heiri-web.ch/Empty.png

2 个答案:

答案 0 :(得分:0)

在向Google提交错误报告https://issuetracker.google.com/issues/139276381后,我收到答复,称该错误将不被修复,因为LAYER_TYPE_SOFTWARE已过时。因为我需要LAYER_TYPE_SOFTWAR E才能使用WebView.getDrawingCache()获得完整的屏幕截图(包括HTML5画布内容),所以我要求一种替代方法。

遵循WebView开发人员团队成员Bo Liu的建议,我设法在不使用LAYER_TYPE_SOFTWARE的情况下获得了WebView的完整屏幕截图: 创建一个ImageReader,使用ImageReader.getSurface()获取一个Surface,在Surface上创建一个VirtualDisplay,使用VirtualDisplay.getDisplay()获取一个Display,使用在其在Display上的布局的WebView创建一个Presentation,使用{{1 }},使用Presentation.show()读取WebView内容的渲染图像。

答案 1 :(得分:-1)

我发现解决Android webview中HTML5画布问题的关键是在AndroidManifest.xml中。我该怎么办?我保留使用混合(自定义)Webview的策略,因为当我在Xamarin Forms中为iOS和Android开发时,在两个平台上都需要相同的解决方案。在Android上,我做到了:

// Java (or similar [laughs])
// Enable hardware acceleration using code (>= level 19)
if (Build.VERSION.SDK_INT >= 19) {
    yourWebviewObj.setLayerType(View.LAYER_TYPE_HARDWARE, null);
} else {
    yourWebviewObj.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}

yourSettingsObj.setRenderPriority(WebSettings.RenderPriority.HIGH);
yourSettingsObj.setCacheMode(WebSettings.LOAD_NO_CACHE);
// Xamarin for Android
// Enable hardware acceleration using code (>= level 19)
if (Build.VERSION.SdkInt >= 19)
{
    yourWebviewObj.SetLayerType (LayerType.Hardware, null);
}
else
{
    yourWebviewObj.SetLayerType (LayerType.Software, null);
}

yourWebviewObj.Settings.SetRenderPriority(WebSettings.RenderPriority.High);
yourWebviewObj.Settings.CacheMode = CacheModes.NoCache;

最后,在 AndroidManifest.xml 中找到android:handwareAccelerated="false",您可以将值从false更改为true。此技巧(另外)适用于Java Universe和Xamarin。