Androidでoverlay表示させたViewにタッチイベントを消費させないようにする
Androidで常に最前面に表示させるようなOverlay表示をするために、ServiceのonStartCommandに次のような実装をしています。
// Viewからインフレータを作成する
LayoutInflater layoutInflater = LayoutInflater.from(this);
// 重ね合わせするViewの設定を行う
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
PixelFormat.TRANSLUCENT);
// WindowManagerを取得する
mWm = (WindowManager) getSystemService( Context.WINDOW_SERVICE );
// レイアウトファイルから重ね合わせするViewを作成する
mView = layoutInflater.inflate( R.layout.service_overlay, null);
// Viewを画面上に重ね合わせする
mWm.addView(mView, params);
この時、service_overlay.xml
に
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/button"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true" />
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="stack overflow" />
</RelativeLayout>
のように全画面を覆い尽くすTextView
を配置すると、TextView
の下にあるButton
にはタッチイベントは渡りますが、Button
の範囲外をタッチしても通常のレイヤーにあるアプリにタッチイベントが渡りません。
TextView
を削除して、Button
の範囲外をタッチすれば、通常のレイヤーにあるアプリにタッチイベントは渡ります。
このことから、ルート要素であるRelativeLayout
自体はタッチイベントを消費していないと予想しています。
そうだとすると、TextView
がタッチイベントを消費していることになるのですが、その下のButton
にはイベントが渡っているので、TextView
もタッチイベントを消費していないということになります。
ですが実際はタッチイベントは渡っていません。
オーバーレイ表示のViewがタッチイベントを消費せず、通常レイヤーのアプリにタッチイベントを渡すにはどのようにすれば良いでしょうか?