【Android】Activity进入沉浸模式

沉浸模式-ImmersiveMode:观影时,看图时常见常用。即全屏模式。

在4.4里面,底部虚拟键出现,代表手机为Nexus5.我的应用被底部虚拟键挤压变形,遮挡关键操作按钮。

比如在我的欢迎页,有张圆形的图片,被压扁了,这时,我选择将底部虚拟键隐藏。

1,打开沉浸模式。

 1 /**
 2      * Detects and toggles immersive mode (also known as "hidey bar" mode).
 3      */
 4     public void toggleHideyBar() {
 5 
 6         // BEGIN_INCLUDE (get_current_ui_flags)
 7         // The UI options currently enabled are represented by a bitfield.
 8         // getSystemUiVisibility() gives us that bitfield.
 9         int uiOptions = getActivity().getWindow().getDecorView().getSystemUiVisibility();
10         int newUiOptions = uiOptions;
11         // END_INCLUDE (get_current_ui_flags)
12         // BEGIN_INCLUDE (toggle_ui_flags)
13         boolean isImmersiveModeEnabled =
14                 ((uiOptions | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY) == uiOptions);
15         if (isImmersiveModeEnabled) {
16             Log.i(TAG, "Turning immersive mode mode off. ");
17         } else {
18             Log.i(TAG, "Turning immersive mode mode on.");
19         }
20 
21         // Navigation bar hiding:  Backwards compatible to ICS.
22         if (Build.VERSION.SDK_INT >= 14) {
23             newUiOptions ^= View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
24         }
25 
26         // Status bar hiding: Backwards compatible to Jellybean
27         if (Build.VERSION.SDK_INT >= 16) {
28             newUiOptions ^= View.SYSTEM_UI_FLAG_FULLSCREEN;
29         }
30 
31         // Immersive mode: Backward compatible to KitKat.
32         // Note that this flag doesn't do anything by itself, it only augments the behavior
33         // of HIDE_NAVIGATION and FLAG_FULLSCREEN.  For the purposes of this sample
34         // all three flags are being toggled together.
35         // Note that there are two immersive mode UI flags, one of which is referred to as "sticky".
36         // Sticky immersive mode differs in that it makes the navigation and status bars
37         // semi-transparent, and the UI flag does not get cleared when the user interacts with
38         // the screen.
39         if (Build.VERSION.SDK_INT >= 18) {
40             newUiOptions ^= View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
41         }
42 
43         getActivity().getWindow().getDecorView().setSystemUiVisibility(newUiOptions);
44         //END_INCLUDE (set_ui_flags)
45     }

2,状态变化监听器

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);
                    }
                });

3,五种状态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)

原文地址:http://www.cnblogs.com/bvin/p/3485174.html

 

 

posted @ 2014-04-18 10:17  风景线外  阅读(2394)  评论(0编辑  收藏  举报