zoukankan      html  css  js  c++  java
  • 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)

    附件貌似传不了啊

  • 相关阅读:
    深入Android 【一】 —— 序及开篇
    Android中ContentProvider和ContentResolver使用入门
    深入Android 【六】 —— 界面构造
    The service cannot be activated because it does not support ASP.NET compatibility. ASP.NET compatibility is enabled for this application. Turn off ASP.NET compatibility mode in the web.config or add the AspNetCompatibilityRequirements attribute to the ser
    Dynamic Business代码片段总结
    对文件的BuildAction以content,resource两种方式的读取
    paraview 3.12.0 windows下编译成功 小记
    百度网盘PanDownload使用Aria2满速下载
    netdata的安装与使用
    用PS给证件照排版教程
  • 原文地址:https://www.cnblogs.com/bvin/p/3485174.html
Copyright © 2011-2022 走看看