いつもお世話になっております,ZIENOCと申します。
開発中のアプリの実装で詰まってしまい,どうにも解決できないので投稿致しました。
現在,画面に常にOverlayとして半透明なViewを表示するServiceを実装しています。そのViewはClick,LongClickのリスナを登録し,タップイベントを取るようにしています。
Overlayの表示は,具体的にはService内で
private View view;
private WindowManager wm;
と宣言した後で,ServiceのonCreate()内で以下のように記述しています。
LayoutInflater layoutInflater = LayoutInflater.from(this);
WindowManager.LayoutParams params = new WindowManager.LayoutParams(WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
| WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, PixelFormat.TRANSLUCENT);
wm = (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
view = layoutInflater.inflate(R.layout.layout_service, null);
view.setFocusableInTouchMode(false);
wm.addView(view, params);
するとOverlayの表示は問題なくできるのですが,Overlay以下の画面(例えばホーム画面のタップなど)はキャッチできなくなってしまいます。
上記WindowManager.LayoutParams paramsの1,2番目の引数をMATCH_PARENT→WRAP_CONTENTとすればOverlay自体が小さく表示されるため下層のタップは取れるようになるのですが,このViewはロングタップ等で移動できることを考えているため,Overlay自体は画面一杯に広がっていて欲しいのです。
また,第3引数のTYPE_SYSTEM_ALERT→TYPE_SYSTEM_OVERLAYとすると,今度は下層のイベントだけを取得し,"view"のタップを認識してくれません。
まだAndroid開発を始めて日が浅く,このようなServiceがAndroidの仕組み上できるのかどうかもわかりませんでしたのでここに投稿させていただきました。
このような実装に関しまして,何かご存じの方がいらっしゃればご教示ください。
よろしくお願いいたします。