如何实现Android沉浸式状态栏

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何实现Android沉浸式状态栏相关的知识,希望对你有一定的参考价值。

沉浸式状态栏的来源就是很多手机用的是实体按键,没有虚拟键,于是开了沉浸模式就只有状态栏消失了。下面脚本之家小编给大家介绍android 实现沉浸式状态栏,需要的朋友可以参考下
http://www.jb51.net/article/72150.htm
参考技术A 沉浸式通知栏
以上才支持的新特性。4.3不支持。
具体实现方式如下:
1.新建个公共style,设置android:fitsSystemWindows=true
<!-- 设置应用布局时是否考虑系统窗口布局;true --> <style name="AppBaseTheme" parent="android:Theme.Light.NoTitleBar"> <item name="android:fitsSystemWindows">true</item> </style>

2. 修改AndroidManifest.xml,让所有的activity样式默认设置为AppBaseTheme(*不同项目要灵活处理,笔者项目的activity样式都是统一的所以这样设置没问题,但是实际情况下不同的activity可能调用的样式不一样,需要读者自行按自己的项目来设置)
<application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppBaseTheme" android:name="****">

3.新增沉浸式通知栏实现类,实现原理很简单。
1)判断当前系统版本是不是4.4以上,判断代码如下:
if (VERSION.SDK_INT >= VERSION_CODES.KITKAT)
2)如果大于4.4则设置状态栏透明化,代码如下:
window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
3)获取activity的根rootView(DecorView),然后创建一个新的view stateBarView并把它添加到rootView(这里手动给它设置个ID,下次进来时先判断rootView是否已创建stateBarView,如果已创建则直接获取该View这样可以防止重复创建,导致内存泄露)

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


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

1.什么是沉浸式

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

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

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

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

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

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

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

2.隐藏状态栏

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

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

可以看到,有状态栏、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透明状态栏和沉浸式的实现_透明状态栏_03

真正的沉浸式模式

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

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

当你确定要使用沉浸式模式,那么只需要重写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透明状态栏和沉浸式的实现_Android_04

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

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

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



以上是关于如何实现Android沉浸式状态栏的主要内容,如果未能解决你的问题,请参考以下文章

Android 沉浸式状态栏

ionic3 沉浸式状态栏

Android如何实现5.0以上图片沉浸式状态栏

android实现沉浸式状态栏

android沉浸式

android -------- 沉浸式状态栏和沉浸式导航栏(ImmersionBar)