Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有layer_type_软件的Android WebView不显示HTML5画布内容_Android_Android Webview - Fatal编程技术网

带有layer_type_软件的Android WebView不显示HTML5画布内容

带有layer_type_软件的Android WebView不显示HTML5画布内容,android,android-webview,Android,Android Webview,自从上次更新Android WebView以来,当通过将WebView的layer type设置为View.layer_type_SOFTWARE禁用硬件加速时,带有HTML5画布的网页无法正确显示。这个问题有解决办法吗 当我省略以下Java代码行时: webView.setLayerType(View.LAYER\u TYPE\u软件,空); 然后正确显示内容 Java代码: Html文件test.Html: 您的浏览器不支持HTML5画布标记。 var c=document.getElem

自从上次更新Android WebView以来,当通过将WebView的layer type设置为View.layer_type_SOFTWARE禁用硬件加速时,带有HTML5画布的网页无法正确显示。这个问题有解决办法吗

当我省略以下Java代码行时: webView.setLayerType(View.LAYER\u TYPE\u软件,空); 然后正确显示内容

Java代码: Html文件test.Html:

您的浏览器不支持HTML5画布标记。
var c=document.getElementById(“myCanvas”);
var ctx=c.getContext(“2d”);
//创建渐变
var grd=ctx.createLinearGradient(0,0200,0);
grd.ADDCORSTOP(0,“红色”);
grd.addColorStop(1,“白色”);
//用梯度填充
ctx.fillStyle=grd;
ctx.fillRect(10,10150,80);
预期结果: 黑色边框中的红色线性渐变

实际结果: 空黑边

我发现在Android webview中解决HTML5画布问题的关键在于AndroidManifest.xml。我该怎么办?我保留了使用混合(定制)webview的策略,因为在我为iOS和Android开发Xamarin表单时,我需要在两个平台上使用相同的解决方案。在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);

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

在向Google提交错误报告后,我收到的答复是,由于
LAYER_TYPE_软件
已过时,错误将不会被修复。因为我需要
LAYER\u TYPE\u SOFTWAR
E使用
WebView.getDrawingCache()
获得完整的屏幕截图(包括HTML5画布内容),所以我要求提供另一种方法

按照WebView开发团队成员Bo Liu的建议,我成功地获得了WebView的完整屏幕截图,而无需使用
LAYER\u TYPE\u软件
: 创建一个ImageReader,使用
ImageReader.getSurface()
获取一个曲面,在曲面上创建一个VirtualDisplay,使用
VirtualDisplay.getDisplay()
获取一个显示,使用显示器布局中的WebView创建一个演示,使用
Presentation.show()
,使用
ImageReader.acquireLatestImage()
读取WebView内容的渲染图像

<!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>
// 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;