#はじめに
他アプリの起動中に、一枚薄いレイヤーを最前面に重ねて、
ニコニコ動画のコメントのようなものを延々とたれ流す...
という実装を試したかったので、WindowManagerについて調査してみました。
#Andoridの表示レイヤーについて
Androidでは、ロック画面やステータスバーを挟んで
情報の優先度として、表示レイヤーとして制御されています。
優先度[高]
↑ TYPE_SYSTEM_ERROR
↑ TYPE_SYSTEM_OVERLAY
↑ -----ロック画面------
↑ -----ステータスバー-----
↑ TYPE_SYSTEM_ALERT
↑ TYPE_PRIORITY_PHONE
↑ TYPE_TOAST
↑ TYPE_PHONE
↑ -----通常のアプリ-----
優先度[低]
上にある方が優先度が高いため、
例えばTYPE_SYSTEM_ERRORレイヤーに表示すると、
ロック画面よりも上に表示されることになります。
#表示レイヤーの指定
WindowManager.LayoutParamsクラスを使用すると
Viewの表示レイヤーを指定する事が可能です。
今回使用したのは下記のオプション。
TYPE_TOASTで表示位置は電話の上のレイヤーを指定。
FLAG_NOT_TOUCHABLEでタッチ操作は取得しない設定。
final WindowManager.LayoutParams params =
new WindowManager.LayoutParams(
width, height,
TYPE_TOAST,
FLAG_NOT_FOCUSABLE
| FLAG_NOT_TOUCHABLE
| FLAG_LAYOUT_NO_LIMITS //ステータスバーをActivityにかぶせるように表示
| FLAG_LAYOUT_INSET_DECOR //FLAG_LAYOUT_IN_SCREENで必要なoption
| FLAG_LAYOUT_IN_SCREEN //FLAG_FULLSCREEN(OverlapするViewを全画面表示)
| FLAG_HARDWARE_ACCELERATED, //GPUを使用して画面描画(ハードウェアアクセラレーションの使用)
TRANSLUCENT // viewを透明にする
);
オプションの細かい詳細についてはマニュアルに記載されています。
http://developer.android.com/reference/android/view/WindowManager.LayoutParams.html
ロック画面より上に表示してみた(TYPE_SYSTEM_ERRORを指定)
TYPE_TOASTに表示中に TOASTを送信(TOASTが上にくる)
#おしまい
TYPE_SYSTEM_ERROR(最前面)に表示したレイヤーに対して、FLAG_NOT_TOUCHABLE(タッチ操作を無効化)を設定し忘れるとロック解除など一切の操作が効かなくなってしまうので注意が必要です。
(推奨された使用方法ではない可能性がありますのであくまで実験サンプルとして記録しておきます。)
(sample)
Github:
https://github.com/oggata/AndroidOverviewDemo
(使用した素材)
ネコの無料イラスト
http://shigenori-terazawa.seesaa.net/article/407247100.html