Android透明状态栏和沉浸式的实现

时间:2022-03-23 00:53:17


Android透明状态栏和沉浸式的实现

1.什么是沉浸式

根据百度百科上的定义,沉浸式就是要给用户提供完全沉浸的体验,使用户有一种置身于虚拟世界之中的感觉。

其真正含义并不是大家所想的那样,对屏幕状态栏进行一些操作,甚至有人把透明状态栏叫做沉浸式

然后我们再来看一下爱奇艺的沉浸式实现:

Android透明状态栏和沉浸式的实现

爱奇艺将整个屏幕作为影视的展示区,用户在看电影的时候眼中就只会有电影的内容,这样就不会被其他一些无关的东西所分心。

这才是沉浸式模式的真正含义,而所谓的什么沉浸式状态栏纯粹就是在瞎叫,完全都没搞懂“沉浸式” 这三个字是什么意思。

不过虽然听上去好像是很高大上的沉浸式效果,实际看上去貌似就是将内容全屏化了而已嘛。没错,Android沉浸式模式的本质就是全屏化,不过我们今天的内容并不仅限于此,因为还要实现饿了么那样的状态栏效果。那么下面我们就开始来一步步学习吧。

2.隐藏状态栏

一个Android应用程序的界面上其实是有很多系统元素的,观察下图:

Android透明状态栏和沉浸式的实现

可以看到,有状态栏、ActionBar、导航栏等。而打造沉浸式模式的用户体验,就是要将这些系统元素全部隐藏,只留下主体内容部分。

接下来说一下透明状态栏的实现,也就是一般被人叫错的沉浸式状态栏

// 透明化状态栏
if (Build.VERSION.SDK_INT >= 21) {
View decorView = getWindow().getDecorView();
int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
decorView.setSystemUiVisibility(option);
getWindow().setStatusBarColor(Color.TRANSPARENT);
}
// 去掉标题栏
getSupportActionBar().hide();

直接把这些代码复制到setContentView(R.layout.activity_main)方法之后就可以实现.

效果如下:

Android透明状态栏和沉浸式的实现

真正的沉浸式模式

虽说沉浸式导航栏这个东西是被很多人误叫的一种称呼,但沉浸式模式的确是存在的。那么我们如何才能实现像爱奇艺那样的沉浸式模式呢?

首先你应该确定自己是否真的需要这个功能,因为除了像游戏或者视频软件这类特殊的应用,大多数的应用程序都是用不到沉浸式模式的。

当你确定要使用沉浸式模式,那么只需要重写Activity的onWindowFocusChanged()方法,然后加入如下逻辑即可:

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus && Build.VERSION.SDK_INT >= 19) {
View decorView = getWindow().getDecorView();
decorView.setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
}
}

}
如果你需要实现沉浸式模式,直接将上面的代码复制过去就行了。

需要注意的是,只有在Android 4.4及以上系统才支持沉浸式模式,因此这里也是加入了if判断。

为了让我们的界面看上去更像是爱奇艺,这里我将MainActivity设置成了横屏模式:

<activity android:name=".MainActivity" 
android:screenOrientation="landscape">
...
</activity>

这样我们就实现类似于爱奇艺的沉浸式模式效果了,如下图所示:

Android透明状态栏和沉浸式的实现

可以看到,界面默认情况下是全屏的,状态栏和导航栏都不会显示。而当我们需要用到状态栏或导航栏时,只需要在屏幕顶部向下拉,或者在屏幕右侧向左拉,状态栏和导航栏就会显示出来,此时界面上任何元素的显示或大小都不会受影响。过一段时间后如果没有任何操作,状态栏和导航栏又会自动隐藏起来,重新回到全屏状态。

这就是最标准的沉浸式模式。

以上总结呢,是我读了郭霖大神的一篇博客后的心得,其中用来好多大神的话和图片,如果你要看郭神的原文的