Android 4.4 KitKatの没入モード

2013年10月31日、GoogleはAndroid 4.4 KitKatの新しいバージョンを導入しました。これには、開発者にとって多くの興味深い機能があります。 これらの機能の1つが没入モードです。 ダイブモードとは、ナビゲーションパネル([戻る]ボタンのあるパネル)を含むシステムパネルが表示されていない状態で、プログラムをユーザーに全画面表示するモードです。 Android 4.4より前では、システムパネル( ナビゲーション バーステータスバー )を非表示にする機能もありました。 しかし、既存のバージョンには1つの欠点がありました。コンテンツをクリックするとシステムパネルが再び表示されるため、ユーザーはコンテンツに完全に没頭できませんでした。 新しいダイブモードは、システムパネルの表示と対話する別の方法を追加します。 このモードでは、システムパネルを表示するには、ユーザーが画面の上端または下端から画面の中央に向かってスワイプするだけで十分ですが、コンテンツをクリックしてパネルを表示することはオプションであり、ユーザーが完全にやり取りできるアプリケーションやゲームを作成できますジェスチャーを使用したアプリケーションまたはゲーム。 ユーザーが全画面モードからシステムパネルを呼び出す方法を理解するために、アプリケーションの初回起動時に、これらのパネルを画面に再度表示する方法に関するシステムメッセージが自動的に表示されます。



画像画像



また、このモードの使用には別の問題があると考えるかもしれません。 たとえば、ユーザーが描画プログラムを起動し、画面の端から線を引きたいと思っています。この場合、システムパネルが実際に表示されます。 はい、しかし同時に、アプリケーションは画面上のタップからメッセージを受信し、線を引きます。 ところで、2つの新しいテーマTheme.Holo.NoActionBar.TranslucentDecorTheme.Holo.Light.NoActionBar.TranslucentDecorを使用して、システムパネルを半透明にすることができます。 ただし、この場合、コンテンツは画面上の領域全体を占有し、半透明のシステムパネルの後ろでも表示されることに注意してください。 インターフェイスの一部がシステムパネルを超えないようにする必要がある場合(追加のパネルなど)、このコンテンツの親レイアウトのfitsSystemWindows属性をtrueに設定する必要があります。 これらのテーマで非常に楽しいことは、パネルに劣った半透明性を使用することですが、グラデーション(黒から半透明へ)を使用することです。 独自のカスタムテーマを作成する場合、これらの新しいテーマから継承するか、2つの新しいプロパティwindowTranslucentNavigation (システムナビゲーションバーが透明かどうか)とwindowTranslucentStatus (時計付きのシステムステータスバーが透明かどうか)を手動で追加できます。



しかし、パネルが既に表示されているときに、どのようにして再び全画面モードになりますか? ユーザーにはいくつかのオプションがあります-システムパネル外のコンテンツをクリックするか、パネルが自動的に消えるまでしばらく待つか、画面の中央から端までスワイプします。 プログラマーは、アプリケーションでこれらのオプションをすべて提供できます。 このため、Androidチームは、没入モードと対話するこれらの方法を非常に簡単に実装できるようにしました。 ダイブモードには、 レギュラーモードとスティッキーモードの2種類があります。 通常モードでは、プログラマはパネルを非表示にするタイミングを決定する必要があり、スティッキーモードではシステムパネルは自動的に非表示になります。 両方のタイプのダイブモードを設定するには、 setSystemUiVisibility()メソッドを使用し、異なるフラグのみをパラメーターに渡す必要があります。 このメソッドは、いわゆる装飾ビューで呼び出す必要があります。これは、すべてのデザインとコンテンツを含むアクティビティウィンドウの外観です。 このビューへのリンクは非常に簡単です。



mDecorView = getWindow().getDecorView();
      
      





両方のタイプのダイビングモードをさらに詳しく見てみましょう。



通常の没入モード



通常モードを設定するには、 SYSTEM_UI_FLAG_IMMERSIVEフラグをsetSystemUiVisibility()メソッドのパラメーターとして使用します。



通常の没入型モードを使用して、システムパネルをそれぞれ表示および非表示にする2つの簡単な方法を作成することをお勧めします。



  private void hideSystemUI() { mDecorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LOW_PROFILE | View.SYSTEM_UI_FLAG_IMMERSIVE); } private void showSystemUI() { mDecorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); }
      
      





コンテンツ( contentView )をクリックしてシステムパネルを表示および非表示にする必要がある場合は、次のコードを使用する必要があります。 これは、たとえば、YouTubeのように、ビデオを見ているときに、コンテンツを見ながらコンテンツを操作する必要がない場合に便利です。



  contentView.setClickable(true); final GestureDetector clickDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() { @Override public boolean onSingleTapUp(MotionEvent e) { boolean visible = (mDecorView.getSystemUiVisibility() & View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0; if (visible) { hideSystemUI(); } else { showSystemUI(); } return true; } }); contentView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { return clickDetector.onTouchEvent(motionEvent); } });
      
      





アプリケーションで同時にいくつかの独自のパネル( controlsView )があり、それらもシステムパネルと一緒に非表示にする必要がある場合は、次のコードを記述することでこれを行うこともできます。 ここで、非表示と表示は、アルファチャネルアニメーションとパネルのY位置を使用して行われます。



  mDecorView.setOnSystemUiVisibilityChangeListener( new View.OnSystemUiVisibilityChangeListener() { @Override public void onSystemUiVisibilityChange(int flags) { boolean visible = (flags & View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0; controlsView.animate() .alpha(visible ? 1 : 0) .translationY(visible ? 0 : controlsView.getHeight()); } });
      
      





アプリケーションを起動するときに、アプリケーションにパネルがあることをユーザーに示し、しばらくしてからそれらを非表示にする場合も、これは非常に簡単です。



  private static final int INITIAL_HIDE_DELAY = 300; @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); delayedHide(INITIAL_HIDE_DELAY); } private final Handler mHideHandler = new Handler() { @Override public void handleMessage(Message msg) { hideSystemUI(); } }; private void delayedHide(int delayMillis) { mHideHandler.removeMessages(0); mHideHandler.sendEmptyMessageDelayed(0, delayMillis); }
      
      





また、たとえば、呼び出されたダイアログから戻った後など、ウィンドウがフォーカスを受け取ったときにパネルを表示する必要がある場合があります。 このオプションは、次のコードで処理できます。



  @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); if (hasFocus) { delayedHide(INITIAL_HIDE_DELAY); } else { mHideHandler.removeMessages(0); } }
      
      





この場合、パネルは表示され、設定した時間が経過すると表示されなくなります。



没入型モードのスティッキー



スティッキーモードを設定するには、 SYSTEM_UI_FLAG_IMMERSIVE_STICKYフラグをsetSystemUiVisibility()メソッドのパラメーターとして使用します。



このモードは非常にシンプルです。 ウィンドウがフォーカスを受け取るか、パネルが表示されてからしばらく経つとシステムパネルが非表示になる状況が必要な場合、このモードが最適です。 このモードを有効にするには、ウィンドウがフォーカスされているときにSYSTEM_UI_FLAG_IMMERSIVE_STICKYフラグを設定する必要があります。 このモードでは、ウィンドウがフォーカスを失うと、ウィンドウはSYSTEM_UI_FLAG_IMMERSIVE_STICKYフラグが設定される前の状態、つまりすべてのパネルに自動的にリセットされます。 ウィンドウがフォーカスを受け取るとすぐに、パネルはしばらくすると再び消えます。この状況を手動でプログラムする必要はありません。 システムパネルを表示するには、通常モードと同様に、画面の端からスワイプする必要もあります。 スティックモードの有効化は、簡単なコードで行います。



  @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); if (hasFocus) { mDecorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); } }
      
      







PSこの記事では、Roman Nurikのビデオ素材使用しました 。 このモードの使用に関するローマの完全な例のコードは、 ここからダウンロードできます



PPS 11月20日、このレジメンに関するトレーニングキットに新しい記事掲載されました。 彼女を考慮に入れて、近い将来記事を補足しようと思います。



All Articles