沉寂模式 android,AndroidのUI体验之ImmersiveMode沉浸模式

本文介绍了一个用于切换Android应用沉浸模式的方法,包括如何隐藏导航栏、状态栏及启用沉浸模式,并提供了不同版本Android系统的兼容实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

打开沉浸模式:

/**

* 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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值