【问题标题】:Android browser stops rendering canvas after "double swipe" scrollAndroid 浏览器在“双击”滚动后停止渲染画布
【发布时间】:2012-08-13 04:42:46
【问题描述】:

我在装有 Android v2.3.6 的 Nexus One 上运行了一个全屏网络应用。我已尽我所能防止滚动。我在以下事件中致电preventDefault()stopPropagation()

document.addEventListener('touchmove', eventCanceller, false );
document.addEventListener('touchstart',eventCanceller, false );
document.addEventListener('touchend',eventCanceller, false );
document.addEventListener('wheel',eventCanceller, false );
document.addEventListener('mousewheel',eventCanceller, false );
document.addEventListener('DOMMouseScroll',eventCanceller, false );

window.addEventListener('touchmove',eventCanceller, false );
window.addEventListener('touchstart',eventCanceller, false );
window.addEventListener('touchend',eventCanceller, false );
window.addEventListener('wheel',eventCanceller, false );
window.addEventListener('mousewheel',eventCanceller, false );
window.addEventListener('DOMMouseScroll',eventCanceller, false );

canvas.addEventListener('click',eventCanceller, false);
canvas.addEventListener('dblclick',eventCanceller, false);

在处理完这些事件后,我还将停止传播并防止这些事件发生默认值。

canvas.addEventListener('touchstart',handleEvent, false);
canvas.addEventListener('touchmove',handleEvent, false);
canvas.addEventListener('touchend',handleEvent, false);

应用程序正常工作,并且所有意外滚动都被抑制。除此之外,如果我快速进行两次或多次小滑动,URL 栏会向下滚动并且画布上的所有渲染都会停止。没有javascript错误,调试显示应用程序继续运行,我的draw函数继续被调用,它认为它仍然有一个有效的2DContext,但是屏幕被冻结了。如果我使用轨迹球滚动屏幕,渲染会重新开始。我在 Kindle Fire 上看到的完全一样。在该设备上,如果我切换到/退出全屏模式,渲染会重新开始。

有什么方法可以抑制我在“双击”上看到的这种冻结/滚动效果?

【问题讨论】:

  • 经过更多挖掘,我意识到这个问题可以与不需要的滚动分离。即使没有滚动,渲染也会在一个简单的示例应用程序上冻结。 code.google.com/p/android/issues/detail?id=36475 我要么缺少有关 Android 浏览器上 JS 事件处理的基本知识,要么 HTML5 游戏在 Android 上遇到了麻烦,因为同样的问题在旧手机和新(畅销)平板电脑上都存在。没有一家游戏公司愿意发布一款在消费者看来就像死机一样的产品。

标签: javascript android html canvas scroll


【解决方案1】:

我有这个。

它可能在 Android 4.1 上已修复(显然很多与触摸事件有关)。

在我现在正在开发的 android 2.3 上,我有一个令人作呕的解决方法,那就是我这样做。

    // force a reflow of the canvas in case it has hung (on android)
    canvas.width = canvas.width-1;
    canvas.width=canvas.width+1;

我目前每帧都这样做(无论如何我只以 20fps 的速度运行),而且它似乎工作正常。

毛。

【讨论】:

  • 谢谢,乔。我会研究这个修复。
猜你喜欢
  • 2011-03-02
  • 2015-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-28
相关资源
最近更新 更多