前言
Android的activity界面有很多不同显示样式,比如现在当你打开App时是的沉浸状态栏界面,观看小视频时的透明状态栏界面,玩游戏时的沉浸状态栏界面,下面我们将依次探讨上述三种模式,当然还有更多,还可以举一反三,欢迎评论区留言讨论。
预备知识
相关API
Window#setFlags
View#setSystemUiVisibility (Android 3.0开始提供)
相关Flag
WindowManager.LayoutParams.FLAG_FULLSCREEN
隐藏状态栏
View.SYSTEM_UI_FLAG_VISIBLE API 14
默认标记
View.SYSTEM_UI_FLAG_LOW_PROFILE API 14
低调模式, 会隐藏不重要的状态栏图标
View.SYSTEM_UI_FLAG_LAYOUT_STABLE API 16
保持整个View稳定, 常和控制System UI悬浮, 隐藏的Flags共用, 使View不会因为System UI的变化而重新layout
View.SYSTEM_UI_FLAG_FULLSCREEN API 16
状态栏隐藏,效果同设置WindowManager.LayoutParams.FLAG_FULLSCREEN
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN API 16
视图延伸至状态栏区域,状态栏上浮于视图之上
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION API 14
隐藏导航栏
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION API 16
视图延伸至导航栏区域,导航栏上浮于视图之上
View.SYSTEM_UI_FLAG_IMMERSIVE API 19
沉浸模式, 隐藏状态栏和导航栏, 并且在第一次会弹泡提醒, 并且在状态栏区域滑动可以呼出状态栏(这样会系统会清楚之前设置的View.SYSTEM_UI_FLAG_FULLSCREEN或View.SYSTEM_UI_FLAG_HIDE_NAVIGATION标志)。使之生效,需要和View.SYSTEM_UI_FLAG_FULLSCREEN,View.SYSTEM_UI_FLAG_HIDE_NAVIGATION中的一个或两个同时设置。
View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY API 19
与上面唯一的区别是, 呼出隐藏的状态栏后不会清除之前设置的View.SYSTEM_UI_FLAG_FULLSCREEN或View.SYSTEM_UI_FLAG_HIDE_NAVIGATION标志,在一段时间后将再次隐藏系统栏)
以上内容,以及本文灵感来自于
作者:Lollo链接:https://www.jianshu.com/p/11a2b780fd9b来源:简书著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
具体实现
布局文件(XML)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@color/colorPrimary"
tools:context=".MainActivity">
<ImageView
android:layout_width="match_parent"
android:layout_height="200dp"
android:src="@color/colorAccent"
/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:orientation="horizontal">
<Button
android:id="@+id/welcome"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="欢迎界面样式"
></Button>
<Button
android:id="@+id/video"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="小视频界面样式"
></Button>
<Button
android:id="@+id/game"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="游戏界面样式"
></Button>
</LinearLayout>
</LinearLayout>
初始化布局和点击按钮监听
private void init() {
mActionBar = getSupportActionBar();
mActionBar.hide();
mWelcome=findViewById(R.id.welcome);
mVideo=findViewById(R.id.video);
mGame=findViewById(R.id.game);
decorView= getWindow().getDecorView();
mWelcome.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
setmWelcomeStatusBar();//欢迎界面
}
});
mVideo.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
setmVideoStatusBar();
}
});
mGame.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
setmGameStatusBar();
}
});
}
————————欢迎界面
void setmWelcomeStatusBar() {
if (Build.VERSION.SDK_INT >= 21) {
int option = WindowManager.LayoutParams.FLAG_FULLSCREEN
|View.SYSTEM_UI_FLAG_FULLSCREEN
|View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
decorView.setSystemUiVisibility(option);
}
}
————————视频界面
private void setmVideoStatusBar() {
if (Build.VERSION.SDK_INT >= 21) {
int option = WindowManager.LayoutParams.FLAG_FULLSCREEN
|View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
|View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
|View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
decorView.setSystemUiVisibility(option);
getWindow().setStatusBarColor(Color.TRANSPARENT);
}
}
————————游戏界面
private void setmGameStatusBar() {
if (Build.VERSION.SDK_INT >= 21) {
int option = WindowManager.LayoutParams.FLAG_FULLSCREEN
|View.SYSTEM_UI_FLAG_FULLSCREEN
|View.SYSTEM_UI_FLAG_LAYOUT_STABLE
|View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
decorView.setSystemUiVisibility(option);
}
}
方法拓展
我们可以通过添加OnSystemUiVisibilityChangeListener()监听事件来监听状态栏的变化情况。
decorView.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() {
@Override
public void onSystemUiVisibilityChange(int visibility) {
if(visibility==View.VISIBLE){
Toast.makeText(getApplicationContext(),"当前状态栏已显示",Toast.LENGTH_LONG).show();
}else {
Toast.makeText(getApplicationContext(),"当前状态栏已隐藏",Toast.LENGTH_LONG).show();
}
}
});
注意:如果你是使用了View.SYSTEM_UI_FLAG_IMMERSIVE | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY 的Flag的话gai'该监听无效
源代码:https://github.com/Landingt/MyStatusBar
若代码不能运行请及时联系我修改,谢谢!