android沉浸式菜单栏,Android沉浸式全屏讲解(状态栏、导航栏处理)

android沉浸式菜单栏,Android沉浸式全屏讲解(状态栏导航
模结构栏处理)
Android应⽤中经常会有⼀些要求全屏显隐状态栏导航栏的需求。通过全屏沉浸式的处理可以让应⽤达到更好的显⽰效果。下⾯系统的讲解⼀下有关全屏,隐藏状态栏导航栏,沉浸式的知识。
在Android4.1之前只能隐藏状态栏,在Android4.1以及之后Android提供了⼀套控制SystemUI的⽅式,重点放在第⼆部分。
在Android4.1之前隐藏状态栏
在Android4.1之前你可以通过设置WindowManager来隐藏状态栏。你可以通过编码来实现,也可以通过在manifest⽂件中给activity设置theme来实现。
如果你要设置activity的状态栏⼀直处于隐藏状态,那么在manifest设置的⽅式是你的⾸选⽅式(尽管也可以使⽤编程⽅式。)。实现⽅式如下。
...
android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen" >
...
使⽤manifest设置的⽅式有以下优点:
⽐编程⽅式更加容易维护,更不容易出错。
会有⼀个更加平滑的过渡,因为在实例化activity之前系统就已经拥有了呈现UI所需的信息。
另外,也可以以编程⽅式设置WindowsManager标志。这种⽅法使⽤户在与应⽤程序交互时更容易隐藏和显⽰状态栏。
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// If the Android version is lower than Jellybean, use this call to hide
// the status bar.
if (Build.VERSION.SDK_INT < 16) {
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
}
setContentView(R.layout.activity_main);
}
...
}
当你设置WindowsManager标志时(⽆论是通过theme还是以编程⽅式),除⾮您的应⽤程序清除了这些标志,否则这些标志将保持有效。
可以使⽤FLAG_LAYOUT_IN_SCREEN将activity布局设置为使⽤相同的屏幕区域。当你启⽤FLAG_FILLSCREEN时,可以使⽤相同的屏幕区域。这将防⽌在状态栏隐藏和显⽰时调整内容的⼤⼩。
设置全屏
从这⾥开始才是本⽂的重点。
在Android4.1以及更⾼版本可以使⽤setSystemUiVisibility来控制SystemUI,为了更系统的讲解,不分别按照效果来讲,⽽是把⽤到的flag先列出来⼀起讲。以下flag经过互相组合能达到全屏隐藏状态栏,全屏隐藏导航栏,全屏显⽰状态栏导航栏等很多不同效果。
控制SystemBar相关:
SYSTEM_UI_FLAG_FULLSCREEN
SYSTEM_UI_FLAG_HIDE_NAVIGATION
SYSTEM_UI_FLAG_LOW_PROFILE
布局相关:
SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
SYSTEM_UI_FLAG_LAYOUT_STABLE
沉浸式相关 (4.4 引⼊):
SYSTEM_UI_IMMERSIVE
SYSTEM_UI_IMMERSIVE_STICKY
控制 SystemBar 相关
SYSTEM_UI_FLAG_FULLSCREEN
该属性是⽤来隐藏状态栏的。
View decorView = getWindow().getDecorView();
int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN;
decorView.setSystemUiVisibility(uiOptions);
getSupportActionBar().hide();
通过以上代码可以实现隐藏状态栏。为了显⽰出全屏效果,建议同时将ActionBar隐藏掉。仅设置这⼀条属性,显⽰效果存在以下特性。
当滑动system bar、点击home键menu键就会清除掉flag,状态栏会重新显⽰出来。
并且布局也会随着状态栏的显隐进⾏布局调整进⾏重绘。
氟塑料离心泵结构图
image
效果图
SYSTEM_UI_HIDE_NAVIGATION
该属性是⽤来隐藏导航栏的
View decorView2 = getWindow().getDecorView();
int uiOptions2 = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN;
decorView2.setSystemUiVisibility(uiOptions2);
getSupportActionBar().hide();
以上代码可以实现隐藏状态栏和导航栏。
尽管可以仅仅隐藏导航栏,但是建议隐藏导航栏的时候将状态栏⼀并隐藏,以达到更好的沉浸效果。
与隐藏状态栏不同的是点击任意布局中的任意位置都会导致导航栏导航栏重新显⽰出来。
并且布局也会随着状态栏导航栏的显隐进⾏布局调整进⾏重绘。
image
SYSTEM_UI_LOW_PROFILE
这个属性的能⼒是让SystemBar在视觉上变得模糊,重要性变得更低⼀点。具体表现是状态栏图标仅保留电量时间关键图标,并且变暗。导航栏图标变成三个点或者变暗。这个flag使⽤的很少。
View decorView7 = getWindow().getDecorView();
int uiOptions7 = View.SYSTEM_UI_FLAG_LOW_PROFILE;
decorView7.setSystemUiVisibility(uiOptions7);
image
布局相关
在新的Android4.1以及之后新的SystemUI设置⾥,仅单独设置隐藏状态栏和导航栏的flag会导致布局重绘,为了在显隐状态栏和导航栏的时候保持布局的稳定的显⽰效果,就需要以下属性了。
SYSTEM_UI_FLAG_LAYOUT_STABLE
该flag的作⽤是保持布局稳定,避免在显隐状态栏导航栏的时候发⽣布局的变化。可以辅助以下
SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN、SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION两个flag的使⽤,让应⽤保持全屏的情况下,布局不随状态栏导航栏显隐发⽣变化。也可以不配合这两个flag使⽤,也能达到保持布局稳定的效果,不过不能实现全屏,会留出状态栏和导航栏的位置。
View decorView8 = getWindow().getDecorView();
int uiOptions8 = View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
decorView8.setSystemUiVisibility(uiOptions8);
getSupportActionBar().hide();
以上代码设置了隐藏状态栏和SYSTEM_UI_FLAG_LAYOUT_STABLE两个flag,显⽰效果为隐藏状态栏,布局稳定。但是布局不延伸到全屏,效果看起来还是很奇葩的。
当滑动systembar、点击home键多任务键就会清除掉flag。状态栏会重新显⽰出来。
布局不会随着状态栏的显隐进⾏调整变化。
image
SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
可以让布局延伸到状态栏的位置。在状态栏在隐藏和显⽰之前切换的时候,布局稳定的显⽰在状态栏后⾯(如果显⽰状态栏则布局在状态栏后⾯,隐藏状态栏布局也不变)。
View decorView3 = getWindow().getDecorView();
int uiOptions3 = View.SYSTEM_UI_FLAG_FULLSCREENai1986网址导航
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
decorView3.setSystemUiVisibility(uiOptions3);
getSupportActionBar().hide();
以上代码显⽰出来的效果和上⼀段代码相⽐,布局延伸到了状态栏的位置。
当滑动systembar、点击home键menu键就会清除掉flag。状态栏会重新显⽰出来。
布局不会随着状态栏的显隐进⾏调整变化
image
SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
可以让布局延伸到导航栏的位置。可以让导航栏在隐藏和显⽰之前切换的时候,布局稳定的显⽰在导航栏后⾯(如果显⽰导航栏则在导航栏后⾯,隐藏导航栏也不变)。
View decorView4 = getWindow().getDecorView();
int uiOptions4 = View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
decorView4.setSystemUiVisibility(uiOptions4);
getSupportActionBar().hide();
以上代码的显⽰效果是状态栏和导航栏隐藏,布局延伸到了状态栏和导航栏的位置。
点击任意布局就会清除掉flag。状态栏导航栏会重新显⽰出来。
布局不会随着状态栏导航栏的显隐进⾏调整变化。
image
在设置了SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN、SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION flag的情况,如果把状态栏导航栏颜⾊设置为透明,则会有透明的状态栏导航栏覆盖在布局上的效果。这也证明了即便布局状态栏导航栏出来了,布局也确实延伸到了状态栏导航栏的位置。
沉浸式相关
以上flag的组合设置中⼀直存在⼀个问题(在点击Home键、menu键等操作会导致flag被清除,导航栏⼀点击界⾯就会导致flag被清除,效果消失的问题。)。其实我们⼤部分情况都希望效果能够稳定的显⽰,⽽不是在简单操作之后就会消失掉。下⾯两个属性就是为这个问题⼯作的。
SYSTEM_UI_IMMERSIVE
在以上flag设置的基础上设置该属性,可以保证在点击home键、menu键时不会失去状态。但是如果⼿动调出systembar的时候,设置的相关flag还是会被清除掉。
View decorView5 = getWindow().getDecorView();
滑动水口机构
int uiOptions5 = View.SYSTEM_UI_FLAG_FULLSCREEN
太阳能光伏密封胶| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_IMMERSIVE;
decorView5.setSystemUiVisibility(uiOptions5);
getSupportActionBar().hide();
以上代码的显⽰效果。
隐藏状态栏、导航栏。
布局延伸到了状态栏、导航栏的位置。
布局稳定显⽰,不会因为状态栏的显隐来调整布局。
当⼿动调出状态栏导航栏的时候,flag才会被清除。
image
SYSTEM_UI_IMMERSIVE_STICKY
设置这个属性后。当状态栏隐藏的时候,⼿动调出状态栏导航栏,显⽰⼀会⼉随后就会隐藏掉。设置该属性后不会清除flag,该属性是⽐较常⽤的⼀种。但是离开页⾯肯定是会导致flag被清除掉的,以上所有flag设置都会有这种情况。
View decorView6 = getWindow().getDecorView();
int uiOptions6 = View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
decorView6.setSystemUiVisibility(uiOptions6);
getSupportActionBar().hide();
家庭智能化控制系统以上代码的显⽰效果。
隐藏状态栏、导航栏
布局延伸到了状态栏、导航栏的位置。
布局稳定显⽰,不会因为状态栏的显隐来调整布局。
⼿动调出的状态栏导航栏会半透明显⽰覆盖在界⾯上,随后还会隐藏掉。
如果离开页⾯还是会导致flag被清除,效果消失。
image
对于flag被清除问题,重设的位置可以放在onWindowFocusChanged中。

本文发布于:2024-09-21 15:23:18,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/1/214904.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:状态栏   导航   隐藏
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议