blockWebkitDraw是什么意思以及如何解决它?

时间:2013-08-03 11:56:55

标签: android webkit html5-canvas

我正在使用WebView包装Android应用程序,它需要呈现HTML5画布。它可以在我的所有设备上完美运行,除了一个。我的Galaxy S4(4.2.2)正在闪烁画布,然后很快变成灰色。这是它产生的logcat消息:

  

D / GestureDetector(20071):[Surface Touch事件] mSweepDown False,   mLRSDCnt:-1 mTouchCnt:7 mFalseSizeCnt:0

     

V / WebViewInputDispatcher(20071):blockWebkitDraw

     

V / WebViewInputDispatcher(20071):blockWebkitDraw lockedfalse

     

D / webview(20071):blockWebkitViewMessage = false

我点击一个按钮,然后画布应该渲染。这就是第一个日志项用于表面触摸事件的原因。当我直接使用webkit浏览器ping我的应用程序时,它适用于我的S4,但是当我自己包装或使用Cordova时,它会给我这个错误。我添加了两个屏幕截图以进一步显示问题。第一个是正确渲染,第二个是问题。

Android 2.3.6:

enter image description here

Android:4.2.2:

enter image description here

回到我的问题。这条消息怎么了?有没有人对如何正确渲染画布有任何建议?

4 个答案:

答案 0 :(得分:2)

我能够通过将android清单文件中的最小sdk版本设置为14来解决问题:

<uses-sdk android:minSdkVersion="14" />

在版本14中,消息仍会显示在日志中,但会处理触摸事件。当我重新设置minSdkVersion时,不会处理触摸事件。关闭清单中的硬件加速以及各种CSS webkit样式并没有帮助。只有minSdkVersion设置为我修复了它。

不知何故,在Galaxy Tab上,旧版本的SDK支持会导致javascript touch事件处理出现问题,并且在触摸移动发生时blockWebkitDraw会保持为true。这可以防止我的画布代码接收touchmove事件并执行绘制。当我将SDK版本设置为14时,当触摸事件触发时,blockWebkitDraw设置为true,但是在处理触摸后它将被取消设置,并且将调用要绘制的画布代码。

答案 1 :(得分:1)

我粗略地浏览了WebView和WebViewInputDispatcher类,但没有提出任何建议。也许你可以看看那里。

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.2.2_r1/android/webkit/WebView.java http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.2.2_r1/android/webkit/WebViewInputDispatcher.java

我的想法是,也许你可以确定阻塞发生的位置,并扩展这些类或创建自己的副本并修改它们。

答案 2 :(得分:1)

我在Galaxy Tab 2上测试时遇到了一个非常类似的问题。在我的情况下,我有一个简单的超链接,而不是一个按钮,但问题是一样的。这是我发现的:

我的控制台中带有标记WebViewInputDispatcher和值blockWebkitDraw lockedfalse的错误消息似乎每次触摸屏幕时都会发生,无论我是否单击按钮或链接。因此,此错误消息与onTouch事件有关,而不是您可能预期的按钮单击。

当最初通过点击我的某个链接进行测试时,我原本以为Galaxy Tab阻止了我的链接。事实证明,Galaxy Tab 2对点击行为非常不敏感所以当我以为我点击链接时,我实际上是在丢失。通过点击略高于我认为必要的,我能够激活我的链接。

为了验证我的怀疑,我大大增加了链接的字体大小。通过更大的链接,我可以在第一次尝试时成功点击链接,我的应用程序现在可以按预期执行。我强烈怀疑,如果你只是让你的按钮更大,你就可以成功点击它。

答案 3 :(得分:1)

我在Galaxy S3上遇到过类似的问题。我在这个答案中找到了解决方案:https://stackoverflow.com/a/20433029/3531606。 通过将以下css添加到所有有问题的DOM元素来解决该问题:

-webkit-transform: translate3d(0,0,0);
transform: translate3d(0, 0, 0);

将translate3d应用于元素可以在某些设备上启用硬件加速(请参阅此答案:https://stackoverflow.com/a/18529444/3531606),因此它也可能有助于渲染。