【无标题】

前言
  • 关于沉浸式标准的定义:App默认是全屏的,用户可以从顶部或者底部“滑出”状态栏和导航栏,一段时间后状态栏和导航栏会自动消失。

setSystemUiVisibility
4.0之后,官方提供了这个方法,可以改变系统的UI可见性,使用方式如下:

int flag = View.SYSTEM_UI_FLAG_FULLSCREEN;
getWindow().getDecorView().setSystemUiVisibility(flag);

多个值可以使用"|"操作符,比如:

int flag = View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
getWindow().getDecorView().setSystemUiVisibility(flag);
常见flag展示效果如下:
  • SYSTEM_UI_FLAG_FULLSCREEN(4.1+):隐藏状态栏,手指在屏幕顶部往下拖动,状态栏会再次出现且不会消失,另外activity界面会重新调整大小,直观感觉就是activity高度有个变小的过程。
  • SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN(4.1+):配合SYSTEM_UI_FLAG_FULLSCREEN一起使用,效果使得状态栏出现的时候不会挤压activity高度,状态栏会覆盖在activity之上
  • SYSTEM_UI_FLAG_HIDE_NAVIGATION(4.0+):会使得虚拟导航栏隐藏,但同样用户可以从屏幕下边缘“拖出”且不会再次消失,同时activity界面会被挤压 。
  • SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION(4.1+):配合 SYSTEM_UI_FLAG_HIDE_NAVIGATION 一起使用,效果使得导航栏出现的时候不会挤压activity高度,导航栏会覆盖在activity之上。

SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION

  • 使用以上四个属性,可以达到activity占据屏幕所有空间,同时状态栏和导航栏可以悬浮在activity之上的效果。但是此时activity的内容也会(比如顶部和底部各有一个TextView)状态栏和导航栏之下,当状态栏和导航栏出现的时候,看起来会这样:

显然,文字被遮盖了我们是不能接受的,此时我们需要另外一个属性,android:fitsSystemWindows=“true”,这个属性表示系统UI(状态栏、导航栏)可见的时候,会给我们的布局加上padding(paddingTop、paddingBottom)属性,这样内容就不会被盖住了。我们在activity的根布局加上这个属性

以上都是4.1(除了SYSTEM_UI_FLAG_HIDE_NAVIGATION)的属性,观察之后我们发现,不管是那种属性,状态栏和导航栏总是会“遮挡”activity,为了解决这个问题,4.4引入了“全屏沉浸模式”这个概念。

  • SYSTEM_UI_FLAG_IMMERSIVE(4.4+):这个属性是用来实现“沉浸式”效果的,官方称作“Immersive full-screen mode”

To provide your app with a layout that fills the entire screen, the new SYSTEM_UI_FLAG_IMMERSIVEflag for setSystemUiVisibility()(when combined with SYSTEM_UI_FLAG_HIDE_NAVIGATION) enables a new immersive full-screen mode.

SYSTEM_UI_FLAG_HIDE_NAVIGATION+SYSTEM_UI_FLAG_IMMERSIVE

  • SYSTEM_UI_FLAG_IMMERSIVE_STICKY :和SYSTEM_UI_FLAG_IMMERSIVE相似,它被称作“粘性”的沉浸模式,这个模式会在状态栏和导航栏显示一段时间后,自动隐藏(你可以点击一下屏幕,立即隐藏)。同时需要重点说明的是,这种模式下,状态栏和导航栏出现的时候是“半透明”状态
关于Translucent Bar
  • 4.4以上实现方式,大概需要用到以下两个属性:
  • windowTranslucentNavigation:application的主题加上这个属性,表示状态栏半透明,另外,会使得状态栏会悬浮在activity之上(此时,activity布局会扩展到状态栏底部(Z轴方向)):
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowTranslucentStatus">true</item>
    </style>
    为了不遮挡activity内容,需要配合另外一个属性
  • android:fitsSystemWindows:使用这个属性的View,系统会在View顶部添加padding(大小为状态栏高度):
  • 如果希望顶部是图片,在z轴方向上和statusbar统一维度,则不用使用fitsSystemWindows 
  • activity布局会扩展到状态栏
    <item name="android:windowTranslucentStatus">true</item>
  • 如果你希望扩展的区域,不被状态栏盖住内容,那就加上
    android:fitsSystemWindows="true"
  • 状态栏在4.4-5.0之间的效果是全透明,5.0+是半透明
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值