Android WebView使用layer_type_software无法显示HTML5画布内容

3
自从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个回答

2
提交了一个错误报告https://issuetracker.google.com/issues/139276381给Google之后,我收到了回复说由于LAYER_TYPE_SOFTWARE已经过时,该错误将不会被修复。因为我需要使用LAYER_TYPE_SOFTWARE来获取完整的屏幕截图(包括HTML5画布内容),使用WebView.getDrawingCache(),我请求一种替代方法。

在WebView开发团队成员Bo Liu的建议下,我成功地获得了WebView的完整截图,而不使用LAYER_TYPE_SOFTWARE: 创建一个ImageReader,使用ImageReader.getSurface()获取一个Surface,创建一个VirtualDisplay在Surface上,使用VirtualDisplay.getDisplay()获取一个Display,在Display上创建一个包含WebView的Presentation,使用Presentation.show(),使用ImageReader.acquireLatestImage()读取WebView内容的渲染图像。

-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和Xamarin的两个宇宙。

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