WindowManagerの使用
5541 ワード
私たちのAndroidプラットフォームは1つまたは複数のActivityで構成されています.各Activityには1つまたは複数のViewで構成されています.だから、インタフェースを表示したいときは、まずActivityを確立し、すべての操作をActivityで実現するか、DialogまたはToastを考えます.この方式はもちろん簡単ですが、場合によっては簡単な表示だけを要求します.Activityでは明らかに余計ですが、この時、私たちはどのように処理しますか.
従来、Android全体のウィンドウメカニズムはWindowManagerと呼ばれており、このインタフェースはviewを画面に追加したり、画面からviewを削除したりすることができます.向いているオブジェクトの一端はスクリーンで、もう一端はViewで、私たちの以前のActivityやDialogなどを直接無視しています.実は私达のActivityあるいはDiologの底层の実现もWindowManagerを通じて(通って)、このWindowManagerは全局的で、全体のシステムはこの唯一のものです.ビューを表示する最下位です.
簡単なコードを書きます.
私たちのこのbuttonの表示は現在の実行環境とは基本的に関係ありません.現在はactivityやデスクトップです.この下位層の結果を使用すると、プログラミングに大きな柔軟性をもたらしますが、表示するには破壊しなければなりません.これは必要です.破壊は実はremoveです.
しかし、このように書くだけで問題があります.viewは最上位に表示されますが、後ろのviewは焦点を得ることができません.touchの座標が前回のviewの範囲を超えた場合
後のviewでフォーカスが必要な場合:
次にflagsの値を定義します.
ウィンドウの後の内容が暗くなります.
public static final int FLAG_DIM_BEHIND = 0x00000002;
ウィンドウの後の内容がぼやけています.
public static final int FLAG_BLUR_BEHIND = 0x00000004;
焦点を当ててはいけない.
キー入力フォーカスを取得できないため、キーまたはボタンイベントを送信できません.それらの時間は、フォーカスが得られるウィンドウの後ろに送信されます.FLAG_も設定されます.NOT_TOUCH_MODALオプション.このオプションを設定すると、ウィンドウはソフト入力方式とインタラクティブではないため、Zシーケンスはアクティブな入力方式とは独立しています(換言すれば、フルスクリーンで表示でき、必要に応じて入力方式ウィンドウを上書きできます).この動作を修正するには、FLAG_を参照してください.ALT_FOCUSALBE_IMオプション.
public static final int FLAG_NOT_FOCUSABLE = 0x00000008;
タッチパネルイベントは受け付けません.
public static final int FLAG_NOT_TOUCHABLE = 0x00000010;
ウィンドウにフォーカス(FLAG_NOT_FOCUSALBEオプションが設定されていない)が得られる場合、ウィンドウ範囲外のポイントデバイスイベント(マウス、タッチスクリーン)は、後続のウィンドウ処理に送信される.そうでなければ、ウィンドウの範囲内で発生するかどうかにかかわらず、すべてのポイントデバイスイベントを独占します.
public static final int FLAG_NOT_TOUCH_MODAL = 0x00000020;
このフラグが設定されている場合、デバイスがスリープしている間にタッチスクリーンをクリックすると、デバイスはこの第1のタッチイベントを受信します.
通常、第1のタッチイベントはシステムによって消費され、ユーザは画面をクリックして何の反応があるかを見ることができない.
public static final int FLAG_TOUCHABLE_WHEN_WAKING = 0x00000040;
このウィンドウがユーザーに表示されている場合、デバイスは常に開いており、輝度は変わらない.
public static final int FLAG_KEEP_SCREEN_ON = 0x00000080;
ウィンドウは画面全体にわたって表示され、周囲の装飾枠(ステータスバーなど)は無視されます.このウィンドウでは、装飾枠の内容を考慮する必要があります.
public static final int FLAG_LAYOUT_IN_SCREEN =0x00000100;
ウィンドウを画面の外に拡張できます.
public static final int FLAG_LAYOUT_NO_LIMITS =0x00000200;
ウィンドウが表示されると、すべてのスクリーン装飾(ステータスバーなど)が非表示になります.ウィンドウ全体を表示領域で使用します.
public static final int FLAG_FULLSCREEN = 0x00000400;
このオプションはFLAG_を上書きします.FULLSCREENオプションで、ステータスバーなどのスクリーン装飾を強制的にイジェクトします.
public static final int FLAG_FORCE_NOT_FULLSCREEN =0x00000800;
ジッタ.半透明の表示方法を指します.「点透」とも呼ばれる.グラフィック処理の悪いデバイスは、Alphaブレンドの代わりに「点透」を使用することが多い.
public static final int FLAG_DITHER = 0x00001000;
スクリーンショットは許可されていません.
public static final int FLAG_SECURE = 0x00002000;
表示スケールを示すレイアウトパラメータを使用する特殊なモードです.
public static final int FLAG_SCALED = 0x00004000;
このオプションは、画面が顔に貼られている可能性がある場合に、頬が画面に誤動作することを防止します.
public static final int FLAG_IGNORE_CHEEK_PRESSES = 0x00008000;
レイアウトを要求すると、ウィンドウがステータスバーの上または下に表示され、遮蔽される可能性があります.このオプションを設定すると、ウィンドウマネージャは、ウィンドウの内容が装飾バー(ステータスバー)に覆われないことを確認します.
public static final int FLAG_LAYOUT_INSET_DECOR = 0x00010000;
反転FLAG_NOT_FOCUSABLEオプション.
FLAG_が同時に設定されている場合NOT_FOCUSABLEオプションと本オプションでは、ウィンドウは入力方式とインタラクティブになり、入力方式ウィンドウの上書きを許可します.
FLAG_NOT_FOCUSABLEは設定されておらず、このオプションが設定されており、ウィンドウは入力方式と対話できず、入力方式ウィンドウを上書きすることができます.
public static final int FLAG_ALT_FOCUSABLE_IM = 0x00020000;
FLAGを設定したらNOT_TOUCH_MODALは、タッチパネルイベントがウィンドウの外で発生すると、このフラグを設定ことによってMotionEventを受信することができる.ACTION_OUTSIDEイベント.注意、あなたは完全なdown/move/upイベントを受け取ることはできません.最初のdownイベントの時だけACTIONを受け取ることができます.OUTSIDE.
public static final int FLAG_WATCH_OUTSIDE_TOUCH = 0x00040000;
画面がロックされると、ウィンドウが表示されます.これにより、アプリケーションウィンドウがスクリーンロックインタフェースよりも優先されます.配合可能FLAG_KEEP_SCREEN_ONオプションで画面が点灯し、画面ロック画面の前に直接表示されます.FLAGを使用可能DISMISS_KEYGUARDオプションは、ロックされていないロック画面の状態を直接解除します.このオプションは、最上位レベルのフルスクリーンウィンドウでのみ使用できます.
public static final int FLAG_SHOW_WHEN_LOCKED = 0x00080000;
リクエストシステムの壁紙がウィンドウの後ろに表示されます.ウィンドウは半透明でなければなりません.
public static final int FLAG_SHOW_WALLPAPER = 0x00100000;
ウィンドウが表示されると、ユーザがデバイスを起動したように、システムは画面を点灯させる.
public static final int FLAG_TURN_SCREEN_ON = 0x00200000;
ロック画面を解除します.ロック画面インタフェースが暗号化されていない場合にのみロックを解除できます.ロック画面インタフェースが暗号化されている場合、FLAG_が設定されていない限り、ユーザーはロックを解除してからこのウィンドウを見ることができます.SHOW_WHEN_LOCKEDオプション.
public static final int FLAG_DISMISS_KEYGUARD = 0x00400000;
スクリーンロックインタフェースがフェードアウトされた場合、アニメーションを続行します.
public static final int FLAG_KEEP_SURFACE_WHILE_ANIMATING =0x10000000;
ウィンドウを元のサイズで表示します.互換モードでプログラムを実行するために使用します.
public static final int FLAG_COMPATIBLE_WINDOW = 0x20000000;
システムダイアログに使用します.このオプションを設定したウィンドウは、無条件にフォーカスされます.
public static final int FLAG_SYSTEM_ERROR = 0x40000000;
従来、Android全体のウィンドウメカニズムはWindowManagerと呼ばれており、このインタフェースはviewを画面に追加したり、画面からviewを削除したりすることができます.向いているオブジェクトの一端はスクリーンで、もう一端はViewで、私たちの以前のActivityやDialogなどを直接無視しています.実は私达のActivityあるいはDiologの底层の実现もWindowManagerを通じて(通って)、このWindowManagerは全局的で、全体のシステムはこの唯一のものです.ビューを表示する最下位です.
簡単なコードを書きます.
WindowManager mWm = (WindowManager)getSystemService(Context.WINDOW_SERVICE);
Button view = new Button(this);
view.setText("window manager test!");
WindowManager.LayoutParams mParams = new WindowManager.LayoutParams();
mWm.addView(view, mParams);
私たちのこのbuttonの表示は現在の実行環境とは基本的に関係ありません.現在はactivityやデスクトップです.この下位層の結果を使用すると、プログラミングに大きな柔軟性をもたらしますが、表示するには破壊しなければなりません.これは必要です.破壊は実はremoveです.
しかし、このように書くだけで問題があります.viewは最上位に表示されますが、後ろのviewは焦点を得ることができません.touchの座標が前回のviewの範囲を超えた場合
mParams = new WindowManager.LayoutParams();
mWm.updateViewLayout(view, mParams);
後のviewでフォーカスが必要な場合:
mParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE|
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
mWm.updateViewLayout(view, mParams);
次にflagsの値を定義します.
ウィンドウの後の内容が暗くなります.
public static final int FLAG_DIM_BEHIND = 0x00000002;
ウィンドウの後の内容がぼやけています.
public static final int FLAG_BLUR_BEHIND = 0x00000004;
焦点を当ててはいけない.
キー入力フォーカスを取得できないため、キーまたはボタンイベントを送信できません.それらの時間は、フォーカスが得られるウィンドウの後ろに送信されます.FLAG_も設定されます.NOT_TOUCH_MODALオプション.このオプションを設定すると、ウィンドウはソフト入力方式とインタラクティブではないため、Zシーケンスはアクティブな入力方式とは独立しています(換言すれば、フルスクリーンで表示でき、必要に応じて入力方式ウィンドウを上書きできます).この動作を修正するには、FLAG_を参照してください.ALT_FOCUSALBE_IMオプション.
public static final int FLAG_NOT_FOCUSABLE = 0x00000008;
タッチパネルイベントは受け付けません.
public static final int FLAG_NOT_TOUCHABLE = 0x00000010;
ウィンドウにフォーカス(FLAG_NOT_FOCUSALBEオプションが設定されていない)が得られる場合、ウィンドウ範囲外のポイントデバイスイベント(マウス、タッチスクリーン)は、後続のウィンドウ処理に送信される.そうでなければ、ウィンドウの範囲内で発生するかどうかにかかわらず、すべてのポイントデバイスイベントを独占します.
public static final int FLAG_NOT_TOUCH_MODAL = 0x00000020;
このフラグが設定されている場合、デバイスがスリープしている間にタッチスクリーンをクリックすると、デバイスはこの第1のタッチイベントを受信します.
通常、第1のタッチイベントはシステムによって消費され、ユーザは画面をクリックして何の反応があるかを見ることができない.
public static final int FLAG_TOUCHABLE_WHEN_WAKING = 0x00000040;
このウィンドウがユーザーに表示されている場合、デバイスは常に開いており、輝度は変わらない.
public static final int FLAG_KEEP_SCREEN_ON = 0x00000080;
ウィンドウは画面全体にわたって表示され、周囲の装飾枠(ステータスバーなど)は無視されます.このウィンドウでは、装飾枠の内容を考慮する必要があります.
public static final int FLAG_LAYOUT_IN_SCREEN =0x00000100;
ウィンドウを画面の外に拡張できます.
public static final int FLAG_LAYOUT_NO_LIMITS =0x00000200;
ウィンドウが表示されると、すべてのスクリーン装飾(ステータスバーなど)が非表示になります.ウィンドウ全体を表示領域で使用します.
public static final int FLAG_FULLSCREEN = 0x00000400;
このオプションはFLAG_を上書きします.FULLSCREENオプションで、ステータスバーなどのスクリーン装飾を強制的にイジェクトします.
public static final int FLAG_FORCE_NOT_FULLSCREEN =0x00000800;
ジッタ.半透明の表示方法を指します.「点透」とも呼ばれる.グラフィック処理の悪いデバイスは、Alphaブレンドの代わりに「点透」を使用することが多い.
public static final int FLAG_DITHER = 0x00001000;
スクリーンショットは許可されていません.
public static final int FLAG_SECURE = 0x00002000;
表示スケールを示すレイアウトパラメータを使用する特殊なモードです.
public static final int FLAG_SCALED = 0x00004000;
このオプションは、画面が顔に貼られている可能性がある場合に、頬が画面に誤動作することを防止します.
public static final int FLAG_IGNORE_CHEEK_PRESSES = 0x00008000;
レイアウトを要求すると、ウィンドウがステータスバーの上または下に表示され、遮蔽される可能性があります.このオプションを設定すると、ウィンドウマネージャは、ウィンドウの内容が装飾バー(ステータスバー)に覆われないことを確認します.
public static final int FLAG_LAYOUT_INSET_DECOR = 0x00010000;
反転FLAG_NOT_FOCUSABLEオプション.
FLAG_が同時に設定されている場合NOT_FOCUSABLEオプションと本オプションでは、ウィンドウは入力方式とインタラクティブになり、入力方式ウィンドウの上書きを許可します.
FLAG_NOT_FOCUSABLEは設定されておらず、このオプションが設定されており、ウィンドウは入力方式と対話できず、入力方式ウィンドウを上書きすることができます.
public static final int FLAG_ALT_FOCUSABLE_IM = 0x00020000;
FLAGを設定したらNOT_TOUCH_MODALは、タッチパネルイベントがウィンドウの外で発生すると、このフラグを設定ことによってMotionEventを受信することができる.ACTION_OUTSIDEイベント.注意、あなたは完全なdown/move/upイベントを受け取ることはできません.最初のdownイベントの時だけACTIONを受け取ることができます.OUTSIDE.
public static final int FLAG_WATCH_OUTSIDE_TOUCH = 0x00040000;
画面がロックされると、ウィンドウが表示されます.これにより、アプリケーションウィンドウがスクリーンロックインタフェースよりも優先されます.配合可能FLAG_KEEP_SCREEN_ONオプションで画面が点灯し、画面ロック画面の前に直接表示されます.FLAGを使用可能DISMISS_KEYGUARDオプションは、ロックされていないロック画面の状態を直接解除します.このオプションは、最上位レベルのフルスクリーンウィンドウでのみ使用できます.
public static final int FLAG_SHOW_WHEN_LOCKED = 0x00080000;
リクエストシステムの壁紙がウィンドウの後ろに表示されます.ウィンドウは半透明でなければなりません.
public static final int FLAG_SHOW_WALLPAPER = 0x00100000;
ウィンドウが表示されると、ユーザがデバイスを起動したように、システムは画面を点灯させる.
public static final int FLAG_TURN_SCREEN_ON = 0x00200000;
ロック画面を解除します.ロック画面インタフェースが暗号化されていない場合にのみロックを解除できます.ロック画面インタフェースが暗号化されている場合、FLAG_が設定されていない限り、ユーザーはロックを解除してからこのウィンドウを見ることができます.SHOW_WHEN_LOCKEDオプション.
public static final int FLAG_DISMISS_KEYGUARD = 0x00400000;
スクリーンロックインタフェースがフェードアウトされた場合、アニメーションを続行します.
public static final int FLAG_KEEP_SURFACE_WHILE_ANIMATING =0x10000000;
ウィンドウを元のサイズで表示します.互換モードでプログラムを実行するために使用します.
public static final int FLAG_COMPATIBLE_WINDOW = 0x20000000;
システムダイアログに使用します.このオプションを設定したウィンドウは、無条件にフォーカスされます.
public static final int FLAG_SYSTEM_ERROR = 0x40000000;