【问题标题】:What does blockWebkitDraw mean and how to fix it? [duplicate]blockWebkitDraw 是什么意思以及如何解决它? [复制]
【发布时间】:2013-08-04 15:39:09
【问题描述】:

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

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

V/WebViewInputDispatcher(20071): 块WebkitDraw

V/WebViewInputDispatcher(20071): blockWebkitDraw 锁定假

D/webview(20071): blockWebkitViewMessage= false

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

Android 2.3.6:

安卓:4.2.2:

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

【问题讨论】:

  • 您有没有尝试过几个不同的网页,看看是什么网页导致了这种情况,还是每个网页都如此?
  • 表示webkit阻塞绘图线程unitl dispatch事件完成。
  • 只有在 Android 4.2+ 设备上启用硬件加速时才会发生这种情况。有没有办法让它在不禁用加速的情况下不阻止它?阻止事物会导致动画和实时触摸事件出现问题,但如果没有加速,事物往往会运行得不太顺畅。
  • @Josh:有什么解决方案或解决方法吗?
  • 仍然没有弄清楚 blockWebkitDraw 正在做什么或意味着什么,但我们的问题似乎来自 webviews 处理 html 溢出的糟糕(或者说不是)处理。特别是任何类型的溢出-x 都会导致事情变得混乱。它在 Android 4.4 中处理得更好。

标签: android webkit html5-canvas


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    我粗略地浏览了 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

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        【解决方案4】:

        我在 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),因此它也可能有助于渲染。

        【讨论】:

        • 允许 javascript 到 webview 为我工作,css 不工作 WebSettings webSettings = myWebView.getSettings(); webSettings.setJavaScriptEnabled(true);
        猜你喜欢
        • 2010-11-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-22
        • 1970-01-01
        • 2016-02-26
        • 2010-10-08
        • 2021-06-25
        相关资源
        最近更新 更多