• AndroidのUI体验之ImmersiveMode沉浸模式


    4.4带来了新的api——ImmersiveMode,可以使用户进入沉浸模式,享受更好的用户体验。

    打开沉浸模式:

    /**
         * 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() + ",  " + decorView.getWidth());
            // END_INCLUDE (set_ui_flags)

    附件貌似传不了啊

  • 相关阅读:
    ADV-拍卖
    poj1190生日蛋糕--DFS
    poj1562-DFS
    二叉树--先序中序遍历求后序遍历
    poj1753-Flip Game DFS解法
    Baby-gin
    OX Pattern
    C
    qi qiu

  • 原文地址:https://www.cnblogs.com/bvin/p/3485174.html
Copyright © 2020-2023  润新知