要想知道各式各样的状态栏怎么实现的,我们先要了解一下下面几个方法的作用!
setSystemUiVisibility
这个方法可以改变系统UI的可见性。使用如下:
int flag = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
getWindow().getDecorView().setSystemUiVisibility(flag);
系统为这个方法的参数提供了许多不同的类型,举几个例子:
①SYSTEM_UI_FLAG_FULLSCREEN:启动APP时,会默认隐藏状态栏(Activity将占满整个屏幕),手指在屏幕顶部往下拖动,状态栏会出现,并且之后不会消失,可以看到,在状态栏出现时,Activity高度变小,为状态栏留出空间。
②SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN:该标识的效果是让我们的布局充满屏幕,不隐藏状态栏,状态栏悬浮在我们的布局之上。效果如下,可以看到我们的图片上面一部分被状态栏遮挡了。
当我们结合SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN和SYSTEM_UI_FLAG_FULLSCREEN使用时,你们猜会发生什么?我想你们都猜到了。SYSTEM_UI_FLAG_FULLSCREEN隐藏状态栏,当我们拉出状态栏时,由于SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN使我们的布局充满整个屏幕,Activity不再变小,状态栏悬浮在activity之上,效果变得丝滑 = =
③SYSTEM_UI_FLAG_LAYOUT_STABLE:保持整个View稳定, 常和控制System UI悬浮, 隐藏的Flags共用, 使View不会因为System UI的变化而重新layout。
还有许多类似的flag,比如导航栏隐藏等,和状态栏大同小异;通过在style中添加下面这条语句可以使状态栏消失
<item name="android:windowFullscreen">true</item>
这里不说了!
经过上面flag的学习,接下来看一下实现透明状态栏的操作应该很容易懂了,直接上代码:
if(Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) {
var mDecorView = window.decorView
var systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_LAYOUT_STABLE
//SDK大于等于23支持翻转状态栏颜色
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
//设置状态栏文字&图标暗色
systemUiVisibility = systemUiVisibility or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
}
//去除状态栏背景
mDecorView.systemUiVisibility = systemUiVisibility
//设置状态栏透明
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
window.statusBarColor = Color.TRANSPARENT
}
喜欢的点个赞,是对我最大的支持~
参考文章:
https://www.jianshu.com/p/38c2239dd0d4
https://www.jianshu.com/p/11a2b780fd9b