17

WebView を使用して Android アプリをラップしていますが、HTML5 キャンバスをレンダリングする必要があります。1 つを除いて、すべてのデバイスで完全に動作します。Galaxy S4 (4.2.2) がキャンバスを点滅させ、すぐに灰色に変わります。これが生成しているlogcatメッセージです:

D/GestureDetector(20071): [Surface Touch Event] 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 を使用すると、そのエラーが発生します。問題をさらに表示するために、2 つのスクリーンショットを追加しました。1 つ目は正しくレンダリングされ、2 つ目は問題です。

アンドロイド 2.3.6:

ここに画像の説明を入力

アンドロイド: 4.2.2:

ここに画像の説明を入力

それでは私の質問に戻ります。このメッセージはどうなっていますか?キャンバスを適切にレンダリングする方法について何か提案はありますか?

4

4 に答える 4

2

Android マニフェスト ファイルの最小 SDK バージョンを 14 に設定することで、問題を解決できました。

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

バージョン 14 では、メッセージは引き続きログに表示されますが、タッチ イベントは処理されます。minSdkVersion を元に戻すと、タッチ イベントが処理されません。マニフェストでハードウェア アクセラレーションをオフにしたり、さまざまな CSS Webkit スタイルを使用したりしても効果はありませんでした。minSdkVersion 設定だけで修正されました。

どういうわけか、Galaxy Tab で古いバージョンの SDK サポートが原因で、javascript タッチ イベント処理に問題が発生し、タッチ移動が発生している間、blockWebkitDraw が true のままになります。これにより、キャンバス コードが 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 に答える