AndroidのUI体験のImmersiveMode浸透モード

7361 ワード

浸透モードをオンにします.
/**
    * Detects and toggles immersive mode (also known as "hidey bar"mode).     */
   public void toggleHideyBar() {        //BEGIN_INCLUDE (get_current_ui_flags)
       //The UI options currently enabled are represented by a bitfield.
       //getSystemUiVisibility() gives us that bitfield.
       int uiOptions = getActivity().getWindow().getDecorView().getSystemUiVisibility();        int newUiOptions = uiOptions;        //END_INCLUDE (get_current_ui_flags)
       //BEGIN_INCLUDE (toggle_ui_flags)
       boolean isImmersiveModeEnabled =
               ((uiOptions | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY) == uiOptions);        if (isImmersiveModeEnabled) {
           Log.i(TAG, "Turning immersive mode mode off. ");
       } else {
           Log.i(TAG, "Turning immersive mode mode on.");
       }        //Navigation bar hiding:  Backwards compatible to ICS.
       if (Build.VERSION.SDK_INT >= 14) {
           newUiOptions ^= View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
       }        //Status bar hiding: Backwards compatible to Jellybean
       if (Build.VERSION.SDK_INT >= 16) {
           newUiOptions ^= View.SYSTEM_UI_FLAG_FULLSCREEN;
       }        //Immersive mode: Backward compatible to KitKat.
       //Note that this flag doesn't do anything by itself, it only augments the behavior
       //of HIDE_NAVIGATION and FLAG_FULLSCREEN.  For the purposes of this sample
       //all three flags are being toggled together.
       //Note that there are two immersive mode UI flags, one of which is referred to as "sticky".
       //Sticky immersive mode differs in that it makes the navigation and status bars
       //semi-transparent, and the UI flag does not get cleared when the user interacts with
       //the screen.
       if (Build.VERSION.SDK_INT >= 18) {
           newUiOptions ^= View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
       }
       getActivity().getWindow().getDecorView().setSystemUiVisibility(newUiOptions);        //END_INCLUDE (set_ui_flags)
   }
この状態が変化すると、このリスナーが表示されます.
final View decorView = getActivity().getWindow().getDecorView();
       decorView.setOnSystemUiVisibilityChangeListener(                new View.OnSystemUiVisibilityChangeListener() {                    @Override
                   public void onSystemUiVisibilityChange(int i) {                        int height = decorView.getHeight();
                       Log.i(TAG, "Current height: "+ height);
                   }
               });
全部で5つの中でFlagの作用はすべて異なっています
//BEGIN_INCLUDE (get_current_ui_flags)
       //The "Decor View"is the parent view of the Activity.  It's also conveniently the easiest
       //one to find from within a fragment, since there's a handy helper method to pull it, and
       //we don't have to bother with picking a view somewhere deeper in the hierarchy and calling
       //"findViewById"on it.
       View decorView = getActivity().getWindow().getDecorView();        int uiOptions = decorView.getSystemUiVisibility();        int newUiOptions = uiOptions;        //END_INCLUDE (get_current_ui_flags)
       //BEGIN_INCLUDE (toggle_lowprofile_mode)
       //Low profile mode doesn't resize the screen at all, but it covers the nav & status bar
       //icons with black so they're less distracting.  Unlike "full screen"and "hide nav bar,"
       //this mode doesn't interact with immersive mode at all, but it's instructive when running
       //this sample to observe the differences in behavior.
       if (mLowProfileCheckBox.isChecked()) {
           newUiOptions |= View.SYSTEM_UI_FLAG_LOW_PROFILE;//低調モード:通知バーと仮想キーが暗くなります
       } else {
           newUiOptions &= ~View.SYSTEM_UI_FLAG_LOW_PROFILE;
       }        //END_INCLUDE (toggle_lowprofile_mode)
       //BEGIN_INCLUDE (toggle_fullscreen_mode)
       //When enabled, this flag hides non-critical UI, such as the status bar,
       //which usually shows notification icons, battery life, etc
       //on phone-sized devices.  The bar reappears when the user swipes it down.  When immersive
       //mode is also enabled, the app-drawable area expands, and when the status bar is swiped
       //down, it appears semi-transparently and slides in over the app, instead of pushing it
       //down.
if(mHideStatusBarCheckBox.isChecked(){//フルスクリーンモード:ステータスバーは非表示ですが、仮想キーは非表示です
           newUiOptions |= View.SYSTEM_UI_FLAG_FULLSCREEN;
       } else {
           newUiOptions &= ~View.SYSTEM_UI_FLAG_FULLSCREEN;
       }        //END_INCLUDE (toggle_fullscreen_mode)
       //BEGIN_INCLUDE (toggle_hidenav_mode)
       //When enabled, this flag hides the black nav bar along the bottom,
       //where the home/back buttons are.  The nav bar normally instantly reappears
       //when the user touches the screen.  When immersive mode is also enabled, the nav bar
       //stays hidden until the user swipes it back.
if(mHideNavCheckbox.isChecked(){//仮想キーを非表示にし、クリックすると表示されます
           newUiOptions |= View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
       } else {
           newUiOptions &= ~View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
       }        //END_INCLUDE (toggle_hidenav_mode)
       //BEGIN_INCLUDE (toggle_immersive_mode)
       //Immersive mode doesn't do anything without at least one of the previous flags
       //enabled.  When enabled, it allows the user to swipe the status and/or nav bars
       //off-screen.  When the user swipes the bars back onto the screen, the flags are cleared
       //and immersive mode is automatically disabled.
       if (mImmersiveModeCheckBox.isChecked()) {
           newUiOptions |= View.SYSTEM_UI_FLAG_IMMERSIVE;
       } else {
           newUiOptions &= ~View.SYSTEM_UI_FLAG_IMMERSIVE;
       }        //END_INCLUDE (toggle_immersive_mode)
       //BEGIN_INCLUDE (toggle_immersive_mode_sticky)
       //There's actually two forms of immersive mode, normal and "sticky".  Sticky immersive mode
       //is different in 2 key ways:
       //
       //* Uses semi-transparent bars for the nav and status bars
       //* This UI flag will *not* be cleared when the user interacts with the UI.
       //  When the user swipes, the bars will temporarily appear for a few seconds and then
       //  disappear again.
       if (mImmersiveModeStickyCheckBox.isChecked()) {
           newUiOptions |= View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
       } else {
           newUiOptions &= ~View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
       }        //END_INCLUDE (toggle_immersive_mode_sticky)
       //BEGIN_INCLUDE (set_ui_flags)
       //Set the new UI flags.        decorView.setSystemUiVisibility(newUiOptions);
       Log.i(TAG, "Current height: "+ decorView.getHeight() + ", width: "+ decorView.getWidth());        //END_INCLUDE (set_ui_flags)