#Android 状态栏全透明策略

@(Android)

展示效果:

Android4.4以下: 状态栏黑乎乎一片

Android4.4以后, 可以将状态栏设置为透明, 或者任意颜色
1. 全屏模式

2. 着色模式

Demo

Github Demo 链接: StatusBarCompat

参考文章

Android开发:Translucent System Bar 的最佳实践
Android状态栏一体化

内容介绍

这篇文章主要是对实现状态栏一体化的一些总结, 参考上面两篇文章, 写得很棒, 推荐大家都看一看!
实现状态栏一体化, 主要分为两种方式. 一种是通过xml配置文件设置, 一种是通过在activity中设置属性. 下面将介绍两种实现方法:

1. 通过配置文件实现

在Android4.4之后提供了可以修改状态栏的属性接口后,我们可以直接通过style文件来配置状态栏, 但是需要注意的是, 为了兼容4.4以下的版本, 所以必须在配置多个API级别的values文件. 这里直接借参考文章中的图:

最基本的在4.4版本之下会加载默认的values/styles.xml, 如果在4.4版本会加载 values-v19/styles.xml, 5.0以上加载 values-v21/styles.xml文件. 具体配置如下:

values/styles.xml

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

values-v19/styles.xml

<style name="ImageTranslucentTheme" parent="Theme.AppCompat.Light.DarkActionBar"><item name="android:windowTranslucentStatus">true</item><item name="android:windowTranslucentNavigation">true</item>
</style>

values-v21/styles.xml

<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>

2. 通过代码中设置

通过代码控制, 需要根据不同的版本sdk做不同的设置. 下面的代码将详细说明:

2. 1全屏模式

全屏模式的意思就是: 状态栏显示, 状态栏背景透明, 所以会呈现根Layout的背景.如下图:

Android5.0版本以上

    // 5.0版本以上private void setStatusBarUpperAPI21() {Window window = getWindow();//设置透明状态栏,这样才能让 ContentView 向上window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);//需要设置这个 flag 才能调用 setStatusBarColor 来设置状态栏颜色window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);ViewGroup mContentView = (ViewGroup) findViewById(Window.ID_ANDROID_CONTENT);View mChildView = mContentView.getChildAt(0);if (mChildView != null) {//注意不是设置 ContentView 的 FitsSystemWindows, 而是设置 ContentView 的第一个子 View . 使其不为系统 View 预留空间.ViewCompat.setFitsSystemWindows(mChildView, false);}}

Android4.4版本-Adnroid5.0版本

    // 4.4 - 5.0版本private void setStatusBarUpperAPI19() {Window window = getWindow();window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);ViewGroup mContentView = (ViewGroup) findViewById(Window.ID_ANDROID_CONTENT);View statusBarView = mContentView.getChildAt(0);//移除假的 Viewif (statusBarView != null && statusBarView.getLayoutParams() != null &&statusBarView.getLayoutParams().height == getStatusBarHeight()) {mContentView.removeView(statusBarView);}//不预留空间if (mContentView.getChildAt(0) != null) {ViewCompat.setFitsSystemWindows(mContentView.getChildAt(0), false);}}

2. 2着色模式

着色模式的意思是:状态栏显示,状态栏的背景颜色需要设置.如下图:

Android5.0版本以上

    private void setStatusBarUpperAPI21(){Window window = getWindow();//取消设置透明状态栏,使 ContentView 内容不再覆盖状态栏window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);//需要设置这个 flag 才能调用 setStatusBarColor 来设置状态栏颜色window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);//设置状态栏颜色//由于setStatusBarColor()这个API最低版本支持21, 本人的是15,所以如果要设置颜色,自行到style中通过配置文件设置
//        window.setStatusBarColor(getResources().getColor(R.color.colorPrimary));ViewGroup mContentView = (ViewGroup) findViewById(Window.ID_ANDROID_CONTENT);View mChildView = mContentView.getChildAt(0);if (mChildView != null) {//注意不是设置 ContentView 的 FitsSystemWindows, 而是设置 ContentView 的第一个子 View . 预留出系统 View 的空间.ViewCompat.setFitsSystemWindows(mChildView, true);}}

Android4.4版本-Adnroid5.0版本

    private void setStatusBarUpperAPI19() {Window window = getWindow();window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);ViewGroup mContentView = (ViewGroup) findViewById(Window.ID_ANDROID_CONTENT);int statusBarHeight = getStatusBarHeight();int statusColor = getResources().getColor(R.color.colorPrimary);View mTopView = mContentView.getChildAt(0);if (mTopView != null && mTopView.getLayoutParams() != null &&mTopView.getLayoutParams().height == statusBarHeight) {//避免重复添加 ViewmTopView.setBackgroundColor(statusColor);return;}//使 ChildView 预留空间if (mTopView != null) {ViewCompat.setFitsSystemWindows(mTopView, true);}//添加假 ViewmTopView = new View(this);ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, statusBarHeight);mTopView.setBackgroundColor(statusColor);mContentView.addView(mTopView, 0, lp);}

2.3 公共函数

在onCreate()中初始化StatusBar

        @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_drawcolor_mode);if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {setStatusBarUpperAPI21();} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {setStatusBarUpperAPI19();}}

获取状态栏高度函数

    private int getStatusBarHeight(){int result = 0;int resId = getResources().getIdentifier("status_bar_height","dimen","android");if(resId>0){result = getResources().getDimensionPixelSize(resId);}return result;}

关于NavigationBar的隐藏

如果你用的是Neux手机, 就会发现手机下面还有NavigationBar, 就是退出,Home,程序 3个按键的软键盘. 在全屏模式中, 是无法隐藏掉NavigationBar的. 下面的代码提供隐藏的方法, 可讲代码加入到全屏模式的Activity中:

    /*** 用于控制NavigationBar的隐藏和显示*/@Overridepublic void onWindowFocusChanged(boolean hasFocus) {super.onWindowFocusChanged(hasFocus);if (hasFocus) {hideSystemUI();}}private void showSystemUI() {mDecorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);}private void hideSystemUI() {mDecorView.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);}

Demo地址

Android 状态栏全透明策略相关推荐

  1. Codova Android 状态栏全透明 启动页全面屏总结

    使用到的Codova插件 状态栏插件:cordova-plugin-statusbar 启动页插件:cordova-plugin-splashscreen 1.设置状态栏全透明 修改 StatusBa ...

  2. Android状态栏--实现状态栏全透明

    一.概述 最近项目中要求实现一个状态栏全透明的效果,先来两张效果图. 首页效果图: 其它界面效果图: 如上面两图所示,一个Activity中的两个Fragment的状态栏分别显示不同的效果. 主要思路 ...

  3. 简单易懂的沉浸式状态栏使用详解(1)——状态栏全透明(含虚拟按键适配)

    说明:我尽量不打错别字,用词准确,不造成阅读障碍. 沉浸式状态栏就是指那种状态栏透明或半透明或与ToolBar颜色配合的颜色.这个"沉浸式"的名称已不可考究,错误的叫法叫多了,大家 ...

  4. android 设置状态栏全透明,背景延伸到状态栏

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { //5.0 全透明实现//getWindow.setStatusBarC ...

  5. android 透明变成白色,android – 状态栏不透明但是白色

    为了用anko DSL测试kotlin我决定在最后一个 android studio ide(2.1.3)中使用kotlin插件(1.0.3)和最新的anko库(0.9)开始一个新的proyect 我 ...

  6. android 背景透明模糊效果怎么做的,Android 状态栏背景模糊透明效果实现

    1.整体思路: 更换壁纸时,获取当前桌面壁纸(已适应屏幕后的壁纸),裁剪当前壁纸适应statusbar, 将其设置为statusbar背景,再采用高斯模糊处理算法,实现模糊效果.关于透明度,可以通过设 ...

  7. (AS笔记)Android全透明沉浸式主题样式——顶部状态栏+底部导航栏

    目录 1.前言 2.自定义主题theme 3.全透明沉浸式主题theme 4.设置状态栏颜色(Android 5.0+) 5.设置状态栏半透明 6.设置状态栏全透明 7.设置底部导航栏半透明 8.全透 ...

  8. 2022-10-13 Android APP 全屏幕显示全透明沉浸式主题android:theme样式 Theme.TranslucentTheme

    一.android8真机上运行默认的app主题是这样的,有titile,状态栏不透明. 二.我想改成全透明沉浸式主题样式. 1.res/values/themes.xml 文件添加Translucen ...

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

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

最新文章

  1. 使用postMan测试erp系统登录接口
  2. 不要假装很努力,因为结果不会陪你演戏
  3. 【深度学习】深入浅出transformer解决并行计算问题
  4. 【iOS开发每日小笔记(一)】UIPickerView 自动选择某个component的某个row
  5. c语言布尔类型赋值给整型,C语言的布尔类型(_Bool)【转】
  6. 案例精解:insert逻辑读暴增至20万,只因Oracle Recyclebin过大
  7. 2014/08/11 – Backbonejs
  8. react router官方文档_利用 React 高阶组件实现一个面包屑导航
  9. 你的目的是什么是谁指使你_魔家四将的师傅是谁?隐藏的高人,只配合太上老君的布局...
  10. 使用npm-check-updates模块升级插件
  11. Sequelize 大于_间接效应值大于1是正常的吗?Q群答疑20200405
  12. 使用pn532将全加密卡复制到手环上 NFC校园门禁卡模拟教程
  13. HDU 3533 Escape(BFS)
  14. MUI在iPhone6P上闪退
  15. 【图像检测-缺陷检测】基于灰度共生矩阵实现痕迹检测matlab代码
  16. 正襟危坐说--操作系统(伍):进程间通信
  17. python实现屏幕截图
  18. cesium 模型实体平移
  19. 智能交通系统(ITS)
  20. Domino的SMTP设置【外出】

热门文章

  1. 深信服防火墙web界面卡顿,提示加载页面出错,处理过程。
  2. Elk搭建古诗搜索实战
  3. c语言:青蛙出井问题程序
  4. 做SEO和SEM有什么区别?哪个推广效果会更好?
  5. win7映射网络驱动器消失了_win7系统无法映射网络驱动器的解决方法
  6. 【数据分析与数据挖掘】第一章:概述
  7. PHPCMS v9 文件后缀提取错误代码上传漏洞
  8. 用python的OCR实现自动拍照搜题--源码
  9. 《浪潮之巅》十一章笔记
  10. golang解决下载私有仓库问题