1

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);

アプリは機能し、意図しないスクロールはすべて抑制されます。ただし、小さなスワイプを 2 回以上すばやく行うと、URL バーが下にスクロールし、キャンバスでのすべてのレンダリングが停止します。JavaScript エラーはありません。デバッグでは、アプリが引き続き実行され、描画関数が引き続き呼び出され、有効な 2DContext があると見なされますが、画面がフリーズします。トラック ボールを使用して画面をスクロールすると、レンダリングが再開されます。Kindle Fireでもまったく同じことが見られます。そのデバイスでは、フルスクリーン モードに切り替えると、レンダリングが再開されます。

「ダブルスワイプ」で見られるこのフリーズ/スクロール効果を抑制する方法はありますか?

4

1 に答える 1

2

私はこれを持っていました。

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;

現在、すべてのフレームで実行しています (とにかく 20 fps でしか実行していません)。問題なく動作しているようです。

全体。

于 2012-10-24T14:33:12.110 に答える