两种常见的沉浸式状态栏(透明系统状态栏)全解析

在我们的日常开发中,会经常遇到应用首页的顶部是个Banner(轮播图),好多Banner还延伸到我们的状态栏里面去了,既显得风格一致又显得简洁美观。第二种是顶部系统状态栏和App的导航栏一体化,不给用户突兀的感觉,使用户把更多的视角留在我们的App上。两种风格如下:


上面两张图分别对应上文中提到的两种情况,第一个是简书,第二个是美团。因为我手头的安卓测试机里应用比较少,所以直接拿水果手机截图了,界面实际上是差不多的,各位道友见谅见谅。


对于这两种情况,仅适用于我们的手机版本>=4.4,而我所提供的做法,也木有做向下兼容。下面我们分别实现这两种情况。

第一种:类似简书实现顶部布局延伸至系统状态栏

方法一:通过styles设置

1.我们的做法是通过在values/styles中设置我们需要的theme,并在我们的Activity中添加这种theme,但是由于这种特性仅支持4.4以上版本,所以我们不能在values中直接设置,还需要在我们的res目录下添加values-v19和values-v21,为什么要加values-v21呢,因为在5.x开始,需要把statusbar的颜色设置为透明,否则会默认出现半透明的浅灰色。

2.在values,values-v19,values-v21的styles中都设置一个透明的theme

values/styles(无论我们在哪个SDK版本下设置了主题,都要在最基本的values中设置相同名称的主题,即使我们什么都不做,这样才能保证App能正常运行在各种版本的设备中不报错)

注意:

<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowTranslucentNavigation">true</item>
分别指明statusbar和naviagtionbar是否需要透明

<style name="ImageTranslucentTheme" parent="AppTheme">
        <!--在Android 4.4之前的版本上运行,直接跟随系统主题-->
    </style>
values-v19/styles

<!-- 顶部上移,以顶部布局为状态栏的底 -->
    <style name="ImageTranslucentTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="android:windowTranslucentStatus">true</item>
        <item name="android:windowTranslucentNavigation">true</item>
    </style>
values-v21/styles

<style name="ImageTranslucentTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="android:windowTranslucentStatus">false</item>
        <item name="android:windowTranslucentNavigation">true</item>
        <!--Android 5.x开始需要把颜色设置透明,否则导航栏会呈现系统默认的浅灰色-->
        <item name="android:statusBarColor">@android:color/transparent</item>
    </style>


3.在AndroidManifest.xml中对指定的Activity设置相应的theme
 <activity android:name=".ImageActivity"
           android:theme="@style/ImageTranslucentTheme">
</activity>


4.这时候我们运行下我们的App,会发现顶部有个突兀的ActionBar盖在我们的图片上面,下面我们把这个ActionBar去掉,去掉的方式有两种:

(1)、在我们的设置theme的时候选择NoActionBar选项。

(2)、通过代码设置无ActionBar。我贴上这种方式的代码。

<span style="white-space:pre">	</span>super.onCreate(savedInstanceState);
        supportRequestWindowFeature(Window.FEATURE_NO_TITLE);//继承AppCompatActivity使用
//        requestWindowFeature(Window.FEATURE_NO_TITLE);//继承Activity使用
        setContentView(R.layout.activity_image);
如果发现没有效果,仔细检查是不是写在setContentView之后了,要写在setContentView之前!要写在setContentView之前!要写在setContentView之前!

这样就达到我们的最终效果了。

其实我们也可以在代码中处理:4.4以上5.0以下版本

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                Window window = getWindow();
                window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
                        WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
5.0以上版本状态栏会有透明的灰色,处理方式:

if(VERSION.SDK_INT >= VERSION_CODES.LOLLIPOP) {  
            Window window = getWindow();  
            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS  
                    | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);  
            window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN  
                            | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION  //该参数指布局能延伸到navigationbar,我们场景中不应加这个参数
                            | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);  
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);  
            window.setStatusBarColor(Color.TRANSPARENT);  
            window.setNavigationBarColor(Color.TRANSPARENT); //设置navigationbar颜色为透明 
}  
这样就好了, 如果发现没有效果,仔细检查是不是写在setContentView之后了,要写在 setContentView之前!要写在setContentView之前!要写在setContentView之前!

有人说需要在跟布局加上fitsSystemWindows=“true”,但是,加上后,就是这种效果了。


所以还是不加了,fitsSystemWindows的作用,下面会说。

那么第一种应用场景我就介绍完了,下面说一说第二种场景。

第二种场景就简单很多了,只是把状态栏颜色和App的导航栏颜色一样就好了。
1.在values,values-v19,values-v21的styles中都设置一个与App顶部导航栏颜色相同的theme

values/styles

<style name="ColorTranslucentTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!--在Android 4.4之前的版本上运行,直接跟随系统主题-->
</style>

values-v19/styles

<!-- 状态栏和ToolBar颜色一致 -->
    <style name="ColorTranslucentTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="android:windowTranslucentStatus">false</item>
        <item name="android:windowTranslucentNavigation">true</item>
    </style>

values-v21/styles

<style name="ColorTranslucentTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="android:windowTranslucentStatus">false</item>
        <item name="android:windowTranslucentNavigation">true</item>
        <item name="android:statusBarColor">@color/colorAccent</item>
</style>
2.在AndroidManifest.xml中设置相应Activity的theme。

3.和上面一样去掉ActionBar。(NoTitleBar)

然后得到效果


4.卧槽,怎么跑上面去了,好丑!在跟布局设置android:fitsSystemWindows=“true”,就可以了;



行啦,现在就大功告成了。最后,我们再说一说fitSystemWindows的应用。

所谓System windows指的就是屏幕上status bar 、 navigation bar等系统控件所占据的部分。而android:fitsSystemWindows="true"就是通过设置View的padding,使得应用的content部分(Activity中setContentView()中传入的content)不会与system window重叠。

所以说,我们的第一种场景,需要content 和 status bar重叠,自然就不能传入true。而第二种场景,需要content与status bar不重叠,也就需要设置fitSystemwindows为true。

 


如果有疏忽的地方,希望大家指正。

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Unity沉浸状态栏是指在使用Unity引擎开发应用程序时,可以隐藏或者自定义应用程序的状态栏。在移动设备上,状态栏通常包含手机的信号、电池信息等系统图标。通过实现沉浸状态栏,开发者可以使应用程序在屏状态下运行,更好地提供用户体验。 在Unity中,实现沉浸状态栏可以通过以下步骤进行: 首先,开发者需要在Unity中创建一个屏的视图,包括一整块可以占满屏幕的画布。 然后,通过调用Unity的API函数,可以隐藏状态栏。在Android平台上,可以使用Application类的方法SetStatusBarHidden()将状态栏隐藏起来,并且设置为屏状态。在iOS平台上,可以使用Screen类的方法SetStatusBarHidden()来隐藏状态栏。 此外,也可以自定义状态栏的样,使其与应用程序的设计风格相符。例如,在Android平台上,可以使用Unity提供的插件设置状态栏的颜色、字体颜色等属性。 需要注意的是,沉浸状态栏功能在不同的平台上具有不同的实现方法和限制。为了确保应用程序的兼容性和稳定性,在使用沉浸状态栏的时候,开发者需要根据不同的平台和设备进行适配和测试。 综上所述,Unity沉浸状态栏是通过隐藏或自定义状态栏,在应用程序运行时提供更加屏的体验。开发者可以通过Unity的API函数实现沉浸状态栏,并根据需要进行定制,提升应用程序的用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值