17

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

D/GestureDetector(20071):[表面触摸事件] mSweepDown False,mLRSDCnt:-1 mTouchCnt:7 mFalseSizeCnt:0

V/WebViewInputDispatcher(20071):blockWebkitDraw

V/WebViewInputDispatcher(20071): blockWebkitDraw 锁定假

D/webview(20071):blockWebkitViewMessage=false

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

安卓 2.3.6:

在此处输入图像描述

安卓:4.2.2:

在此处输入图像描述

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

4

4 回答 4

2

我可以通过将 android manifest 文件中的最低 sdk 版本设置为 14 来解决问题:

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

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

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

于 2014-03-14T18:45:48.987 回答
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

我的想法是,也许您可​​以查明阻塞发生的位置,然后扩展这些类或创建自己的副本并修改它们。

于 2013-10-11T15:04:10.203 回答
1

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

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

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

于 2014-09-11T10:10:14.963 回答
1

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

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

最初通过单击我的一个链接进行测试时,我最初认为 Galaxy Tab 阻止了我的链接。事实证明,Galaxy Tab 2 对点击行为非常不敏感,所以当我以为我在点击链接时,我实际上错过了。通过点击比我认为必要的稍高的点,我能够激活我的链接。

为了验证我的怀疑,我大大增加了链接的字体大小。有了更大的链接,我可以在第一次尝试时成功单击链接,我的应用程序现在按预期运行。我强烈怀疑,如果您只是将按钮放大很多,您将能够成功单击它。

于 2013-11-06T00:12:51.873 回答