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