前言:

Android 4.4之后谷歌提供了沉浸式全屏体验, 在沉浸式全屏模式下, 状态栏、 虚拟按键动态隐藏, 应用可以使用完整的屏幕空间, 按照 Google 的说法, 给用户一种 身临其境 的体验。而Android 5.0之后谷歌又提出了 ColorPalette 的概念,让开发者可以自己设定系统区域的颜色,使整个 App 的颜色风格和系统的颜色风格保持统一。今天学习总结一下如何实现Android 4.4以上全屏沉浸式透明状态栏效果。先看下预期效果:

首先现分清楚哪部分是状态栏,哪部分是导航栏

状态栏StatusBar如下

导航栏NavigationBar如下

如何实现?

1.)首先实现全屏

第一种:继承主题特定主题

在Android API 19以上可以使用****.TranslucentDecor***有关的主题,自带相应半透明效果,Theme.Holo.NoActionBar.TranslucentDecor和Theme.Holo.Light.NoActionBar.TranslucentDecor两种主题为新增加的,所以要新建values-v19文件夹并创建styles文件添加如下代码

   <style name="AppBaseTheme" parent="android:Theme.Holo.Light.NoActionBar.TranslucentDecor"><!-- Customize your theme here. --></style>

第二种:在activity中采用代码的方式

Android 4.4以上可以添加如下代码

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
//透明状态栏
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
//透明导航栏
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
}

Android 5.0 以上也可以使用下面的代码实现全屏

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
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| View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
}

全屏效果

不难发现此时状态栏占有的位置消失,和app的布局叠在一起了,接下来解决这个问题

2.)解决状态栏占位问题

第一种:主题添加如下设置

<item name="android:fitsSystemWindows">true</item>

第二种:activity layout根目录添加下面代码

android:fitsSystemWindows="true"

第三种:通过Java代码设置

rootview.setFitsSystemWindows(true);

fitsSystemWindows只作用在sdk>=19的系统上就是高于4.4的系统,这个属性可以给任何view设置,只要设置了这个属性此view的所有padding属性失效.只有在设置了透明状态栏(StatusBar)或者导航栏(NavigationBar)此属性才会生效,

如果上述设置了状态栏和导航栏为透明的话,相当于对该View自动添加一个值等于状态栏高度的paddingTop,和等于导航栏高度的paddingBottom,效果如下

3.)状态栏导航栏设置背景色

4.4以上的可以采用修改contentView的背景色,或者动态添加一个view到contentView上

      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {//透明状态栏window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);//透明导航栏window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);//设置contentview为fitsSystemWindowsViewGroup contentView = (ViewGroup) findViewById(android.R.id.content);View childAt = contentView.getChildAt(0);if (childAt != null) {childAt.setFitsSystemWindows(true);}//给statusbar着色View view = new View(this);view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(this)));view.setBackgroundColor(color);contentView.addView(view);}

动态获取StatusBarHeight函数如下

    /*** 获取状态栏高度** @param context context* @return 状态栏高度*/private static int getStatusBarHeight(Context context) {// 获得状态栏高度int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");return context.getResources().getDimensionPixelSize(resourceId);}

动态获取NavigationBarHeight函数如下

    /*** 获取导航栏高度** @param context context* @return 导航栏高度*/public static int getNavigationBarHeight(Context context) {int resourceId = context.getResources().getIdentifier("navigation_bar_height", "dimen", "android");return context.getResources().getDimensionPixelSize(resourceId);}

然后Android5.0以上谷歌提供了新的api可以更新状态栏和导航栏的背景色

   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {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| View.SYSTEM_UI_FLAG_LAYOUT_STABLE);window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);//设置状态栏颜色window.setStatusBarColor(color);//设置导航栏颜色window.setNavigationBarColor(color);ViewGroup contentView = ((ViewGroup) findViewById(android.R.id.content));View childAt = contentView.getChildAt(0);if (childAt != null) {childAt.setFitsSystemWindows(true);}
//            contentView.setPadding(0, getStatusBarHeight(this), 0, 0);}

这样总体效果就实现了

4.)贴出整体java代码实现方式

    private void initWindows() {Window window = getWindow();int color = getResources().getColor(android.R.color.holo_blue_light);if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {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| View.SYSTEM_UI_FLAG_LAYOUT_STABLE);window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);//设置状态栏颜色window.setStatusBarColor(color);//设置导航栏颜色window.setNavigationBarColor(color);ViewGroup contentView = ((ViewGroup) findViewById(android.R.id.content));View childAt = contentView.getChildAt(0);if (childAt != null) {childAt.setFitsSystemWindows(true);}} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {//透明状态栏window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);//透明导航栏window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);//设置contentview为fitsSystemWindowsViewGroup contentView = (ViewGroup) findViewById(android.R.id.content);View childAt = contentView.getChildAt(0);if (childAt != null) {childAt.setFitsSystemWindows(true);}//给statusbar着色View view = new View(this);view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(this)));view.setBackgroundColor(color);contentView.addView(view);}}

总结:

我这里为了更加明显的显示效果所以状态栏背景色和标题栏颜色不一致,在实际的开发中一般情况下我们都会设置成统一的颜色,在视觉上感觉整个页面更加统一,让用户真正沉浸在app中。

干我们这行,啥时候懈怠,就意味着长进的停止,长进的停止就意味着被淘汰,只能往前冲,直到凤凰涅槃的一天!

转载于:https://www.cnblogs.com/xieqing/p/6515888.html

Android UI体验之全屏沉浸式透明状态栏效果相关推荐

  1. android滑动背景变透明,Android右滑退出+沉浸式(透明)状态栏

    背景 上篇文章一个千万量级的APP使用的一些第三方库中,在说到一个使用很广泛的滑动退出库SwipeBackLayout时有提过有时间会分享自己在项目中引入这个库的时候填过的一些坑.前段时间项目加入沉浸 ...

  2. Android 沉浸式(透明)状态栏细研-超级细还附 Demo

    前言 在 Android 4.4 中引入了沉浸模式的功能,但这个版本非真正的沉浸模式,应该说是透明模式.Android 5.0 以后才可以在系统层面实现真正的沉浸式状态栏. 沉浸式状态栏是为了与当前使 ...

  3. Android全屏沉浸式应用

    原文出处:http://bbs.itheima.com/thread-298355-1-1.html?zztj3?rss 一.概念 首先让我们看一下默认状态栏的显示效果 以下以微信与qq为例: 由于A ...

  4. Android实现沉浸式(透明)状态栏适配

    第一种讲解: 在Android系统4.4以前,状态栏的背景色和字体颜色都是不能改变的.但是4.4以后Google增加了改变状态栏背景透明的方法,可以通过两种方式来设置. 直接在Activity中设置W ...

  5. Android 沉浸式透明状态栏与导航栏

    Android 系统自4.2 开始 UI 上就没多大改变,4.4 也只是增加了透明状态栏与导航栏的功能 这个特性是andorid4.4支持的,最少要api19才可以使用.下面介绍一下使用的方法,非常得 ...

  6. 响应式的无限滚动全屏dribbble作品集布局展示效果

    来源:GBin1.com 在线演示/下载 大家还记得前面分享过的两个魔术布局效果吧: 响应式的dribbble作品集魔术布局展示效果 宽度自适应缩进的响应式dribbble作品集魔术布局展示效果 今天 ...

  7. php 轮播图插件下载,jquery全屏响应式轮播图插件jquery.flexslider.js

    在zblogPHP主题 yunduan 上使用这个轮播幻灯片插件jquery.flexslider.js,分享下使用方法: 这是一款jquery全屏响应式淡入淡出效果轮播图插件.该轮播图插件简单实用, ...

  8. (AS笔记)Android全透明沉浸式主题样式——全屏沉浸隐藏底部导航栏

           上一章介绍了,Android全透明沉浸式主题样式--顶部状态栏+底部导航栏,教程传送门链接:         (AS笔记)Android全透明沉浸式主题样式--顶部状态栏+底部导航栏   ...

  9. [Android] 关于系统工具栏和全屏沉浸模式

    随着应用程序的一些深入设计,大家总想要更好的界面和体验,所以有些东西并不能只是知道方法就结束了,是得要去深入研究研究的.通过这个过程我觉得,从应用层面来讲,想实现一个功能很简单,但若想实现的好,就要去 ...

最新文章

  1. Centos7上yum安装mongodb4-2
  2. “智源 — INSPEC 工业大数据质量预测赛” 上线,为硬核工业制造炼就 AI 之心...
  3. 算法系列8《Base64》
  4. Linux系统自动备份脚本,供参考的Linux系统中自动执行分段备份脚本
  5. 51单片机学习笔记之定时器程序设计
  6. C++学习之路 | PTA乙级—— 1091 N-自守数 (15 分)(精简)
  7. python模块导入视频教程_63-知识点回顾-函数和导入模块
  8. 插画在UI的应用体验,太美好了!这样的模板让你的用户更加喜欢!
  9. 二次开发-如何在PHPEMS-发送短信验证码(以easy-sms为例)
  10. c语言马拉松试题,C语言马拉松_04.2_函数与指针
  11. excel文件修复工具_七款免费的PDF处理工具
  12. 【esp8266】【Node.js】【Websocket】esp8266和Node.js通过websocket进行通信,实验记录及踩坑记录
  13. Echarts——自定义仪表盘图表
  14. kiv8测量方法_云市场-404
  15. 6-1 单链表逆转 (20 分)
  16. linux下为php添加GD库(重新编译php)
  17. windows 多用户使用谷歌浏览器
  18. 如何做字幕?用语音识别生成字幕?
  19. LoRaWAN介绍15 终端设计
  20. RK3288-ANDROID8.1-电源指示灯

热门文章

  1. php include include_once 区别,「PHP」include()、include_once()、require()、require_once()的用法及区别...
  2. 小程序前端性能测试_如何提高前端应用程序的性能
  3. facebook 直播_什么时候是在Facebook Live上直播的最佳时间? 我分析了5,000个Facebook帖子以找出答案。...
  4. 小兵别嚣张,签名算法分析
  5. 1090 Highest Price in Supply Chain 需再做
  6. UI设计师培训入门都需要学习什么技术?
  7. 如何扩大以太坊的规模:分片简介(How to Scale Ethereum: Sharding Explained)
  8. 围绕云计算 虚拟化技术又呈现新面貌
  9. mac系统添加VSCode到右键菜单(转)
  10. 初级Java程序员所面临的4大挑战