2012年7月4日水曜日

WindowManagerに登録されたViewをタッチ中に画面回転した時の動作

なんともニッチなのですが

WindowManagerに「TYPE_SYSTEM_ALERT」を使用して画面前面に配置されたViewのタッチイベント

についてのメモです。


先日、Galaxy SIIIを手に入れたので、手元に以下バージョンの端末が揃いました。

  • Android 2.3.6 (Galaxy S)
  • Android 3.1 (Optimus Pad)
  • Android 4.0.3 (Galaxy SIII)
試しに、これらの端末で手元の作成中のソフトウェアを動作させたところ、Android 4.0.3でのみ動作が異なる点があったので参考のためにメモをしておきます。


動作の具体的な内容は・・・
WindowManager.LayoutParams params = 
new WindowManager.LayoutParams(
    WindowManager.LayoutParams.FILL_PARENT,
    WindowManager.LayoutParams.FILL_PARENT,
    WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
    WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
    WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
    WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH |
    WindowManager.LayoutParams.FLAG_FULLSCREEN,
    PixelFormat.TRANSLUCENT
);

WindowManager windowManager =
    (WindowManager)getSystemService(Context.WINDOW_SERVICE);

// viewはあらかじめ作成済みとして
windowManager.addView(view, params);



として、画面前面に配置された「view」をタッチ中(画面から手を離さないまま)に画面を回転後、さらに継続してタッチイベント(MOVE, UP等)を発生させようとすると
  • Android 2.3.6  (Galaxy S) ・・・onTouchEventが呼び出される
  • Android 3.1 (Optimus Pad) ・・・ onTouchEventが呼び出される
  • Android 4.0.3 (Galaxy SIII) ・・・ onTouchEventが呼び出されない
  • Android 4.0.3 (エミュレータ) ・・・ onTouchEventが呼び出されない
といった結果になりました。

これが仕様変更によるものなのか、バグなのかはソースコードやリリースノートを追っていないので分かりません。

上記のような方法で登録したViewを、画面回転を考慮してタッチイベントを処理する場合には少し注意が必要かもしれないです。

何か他に分かったら追記予定。

0 件のコメント:

コメントを投稿