WindowManagerの使用

5541 ワード

私たちのAndroidプラットフォームは1つまたは複数のActivityで構成されています.各Activityには1つまたは複数のViewで構成されています.だから、インタフェースを表示したいときは、まずActivityを確立し、すべての操作をActivityで実現するか、DialogまたはToastを考えます.この方式はもちろん簡単ですが、場合によっては簡単な表示だけを要求します.Activityでは明らかに余計ですが、この時、私たちはどのように処理しますか.
従来、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;