android 工具栏透明,Android 系统状态栏沉浸式/透明化完整解决方案
前言
网上已经有很多有关于系统状态栏的解决方案,这篇文章也不会有什么新奇的解决方案,都是本人经过自己试验,统计提炼出来的相对靠谱的一套解决方案.
如果是android大牛可以忽略本文,怕让您贱笑.只面向小白,帮助小白减少摸索的时间.
关于术语
网上有很多争论:
你这状态栏是变色龙状态栏,不是沉浸式的
这应该是沉浸式的状态栏吧,系统栏与actionbar颜色设为一致
我只想说去你妹的,老子只要自己的app的状态栏能和主题颜色一致就行了,定义那么多术语,让我等小白情以何堪?
吐槽归吐槽,但还是不得不去试着理解下这些术语怎么来的,引用这里的一段话:
沉浸式全屏模式
隐藏status bar(状态栏)使屏幕全屏,让Activity接收所有的(整个屏幕的)触摸事件。
透明化系统状态栏
透明化系统状态栏,使得布局侵入系统栏的后面,必须启用fitsSystemWindows属性来调整布局才不至于被系统栏覆盖。
因此,我就这样理解了:
沉浸式不就是隐藏状态栏嘛,状态栏不见了?这不就是app全屏模式嘛?wtf?
而透明式式状态栏就是让app的内容布局可以扩展到系统状态栏?这里有个问题就是为什么能在系统状态栏还显示的情况下,将内容布局扩展到系统状态栏?恩,这应该很好理解,就是Z坐标系的作用了,系统状态栏是覆盖在内容布局上面的,并且是透明的。
貌似这里所谓透明化系统状态栏才是本菜想要的,不管了,现在开始一一试验,至于这概念理解的对不对,管他呢?那到底应该叫什么,那我就叫自适应状态栏,行不行?
前提条件
让系统状态栏颜色随app主题颜色变化而变化这一设计,毫无疑问,也是向ios学习的:从android4.4开始引进的,并且在5.0进行了改进。因此,也只能将这一特性应用在android4.4以上的手机,无法做到全部适配。记得stormzhang(貌似是)曾说过:
作为一个android程序员,还能有什么比做出ios风格的app更感到悲哀的呢?哎...
两种情况下的解决方案:
使用toolbar
这种方案相对简单,个人喜欢这种方案,本菜虽菜,但喜欢紧跟潮流。toolbar太好用了,
不使用toolbar
1. 使用toolbar的解决方案
其基本原理就是:
theme里添加style: true 后,包含toolbar的内容布局就可以扩展至系统状态栏,状态栏会覆盖在toolbar上,如果此时使用android:fitsSystemWindows="true",就可以调整内容布局(估计也是在根布局上加padding)恢复到原来位置.但是,上面的解决方案确是给toolbar加上一个padding-top="25dp",这样就可以做到系统状态栏的颜色和toolbar的颜色保持一致.具体方案可以参照上面的薄荷app的方案链接.
简述下步骤(只是简述,有疑问请参照上面薄荷app的链接即可):
引入v7包,并在布局里添加toolbar
compile ‘com.android.support:appcompat-v7:22.2.1’
在代码中设置透明化:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
WindowManager.LayoutParams localLayoutParams = getWindow().getAttributes();
local LayoutParams.flags = (WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS | localLayoutParams.flags);
}
当然也可以在theme的样式文件里添加style:true,效果相同,但是大神们都说样式文件里设置在某些型号里不生效.ok,大家都在代码里设置就好了
给toolbar加上padding-top,toolbar代码如下
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="@dimen/toolbar_padding_top"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
android:background="#30469b">
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
android:text="@string/app_name"/>
4.其中android:paddingTop="@dimen/toolbar_padding_top"要在values中的styles文件里设为0dp,在values-v19的styles里设为25dp,原因不多说了
这样就可以达成了我们的目标,如果只是这样也就罢了,按照上面做就可以了,关键是本菜是喜欢紧跟潮流的,使用MD风格的DrawerLayout+NavigationView时,在android4.4的手机下,就会变这样了:
android4.4上的效果
很明显,drawerlayout并没用被扩展至系统状态栏,但在android5.0以上效果还是可以的,这让我很奇怪,只能归咎于5.0的优化了
android5.0上的效果
经过各种折腾终于想起来,可以把fitsSystemWindows的特性用在drawerlayout上试试,最后发现居然可以,最终将设置windowTranslucentStatus的代码调整如下:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
WindowManager.LayoutParams localLayoutParams = getWindow().getAttributes();
local LayoutParams.flags = (WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS | localLayoutParams.flags);
if(Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP){
//将侧边栏顶部延伸至status bar
mDrawerLayout.setFitsSystemWindows(true);
//将主页面顶部延伸至status bar;虽默认为false,但经测试,DrawerLayout需显示设置
mDrawerLayout.setClipToPadding(false);
}
}
最终android4.4上也可以显示正常:
android4.4上修正后的效果
2. 不使用toolbar的解决方案
不使用toolbar时,而是actionbar时,因为actionbar不好定制,所以无法采用上面那个方法,只能采用其它方法,这里的方案主要参考这里:Translucent System Bar 的最佳实践
这篇简书看的本菜晕乎乎的,仔细看下来,其实都是基于一个原理:
不管有没有actionbar,内容布局的背景颜色一律设为主题颜色,然后有actionbar的话,就将actionbar与内容布局的背景颜色同时设为主题颜色,然后,每个内容布局的根布局都要设上fitsSystemWindows="true"进行调整,感觉超麻烦有没有?
不说多少,简述步骤:
在代码中设置透明化,步骤同上
设置内容布局的根布局的背景颜色为主题颜色,同时设置fitsSystemWindows="true"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorPrimary"
android:fitsSystemWindows="true"
android:orientation="vertical">
在内容布局的下面再设置一层内容布局,设背景颜色为白色(或其它颜色):
android:layout_height="match_parent"
android:background="@color/c_light_white"
android:gravity="center"
android:orientation="vertical">
至此,这种方案也完成了,看下效果:
android4.4上的效果
可以看出,这种方案一般情况下,还是可行的,但是有三个问题:
如果用上drawerlayout+navigationview,actionbar就会覆盖在侧边栏上(如上图),暂时未找到解决方案,但是我想说你都用drawerlayout+navigationview了,为何不用toolbar,因此这个问题应该不是问题,况且还可以使用其它的侧边栏实现方式,各位道友可以试试
这种方案在每个根布局上都要设fitsSystemWindows="true"进行调整,当然上面也有优化方案,可仍然觉得很麻烦,
每个根布局里都要多加的一层布局来覆盖根布局的背景主题颜色
因此,这种方案的确不是上上之选.
总结
本文主要在考虑使用标题栏(actionbar/toolbar)的情况下,做出的方案,当然你也可以自定义标题栏,或者不使用标题栏;其实都可以基于上面一样的道理:
在状态栏透明化的前提下,调整顶部view的padding-top,来达到状态栏自适应一体化的目的
网上还有其它蛮多的解决方案,如:
使用开源库SystemBarTint,这个库也挺不错的,可以动态改变系统状态栏颜色,但是作者已经2年没有维护了,现在技术更新迭代这么快,鬼知道这个库会不会出现什么问题,因此可以放弃使用了
如果不怕麻烦,还可以new一个高度和状态栏一样高的view,插入到内容布局的上面,但是,想想都觉得麻烦,我也懒得试了
关于本文中的样例代码已上传至github,欢迎star,有问题也欢迎各位撸友,道友们来指正.
android 工具栏透明,Android 系统状态栏沉浸式/透明化完整解决方案相关推荐
- Android UI体验之全屏沉浸式透明状态栏效果
前言: Android 4.4之后谷歌提供了沉浸式全屏体验, 在沉浸式全屏模式下, 状态栏. 虚拟按键动态隐藏, 应用可以使用完整的屏幕空间, 按照 Google 的说法, 给用户一种 身临其境 的体 ...
- android朋友圈评论功能兼容沉浸式状态栏,九宫格图片显示
android朋友圈评论功能,沉浸式状态栏,九宫格图片显示器,上拉加载下拉刷新功能,可直接用到项目中 背景 在前两个项目开发过程中用到了朋友圈这个功能,包含了评论回复.九宫格图片及大图展示展示,上拉加 ...
- android 视频沉浸式,Android项目实战(四十一):游戏和视频类型应用 状态栏沉浸式效果...
原文: Android项目实战(四十一):游戏和视频类型应用 状态栏沉浸式效果 需求: 手机app ,当打游戏或者全屏看视频的时候会发现这时候手机顶部的状态栏是不显示的,当我们从手机顶端向下进行滑动或 ...
- Android App开发 教你分清“沉浸式”和“透明状态栏”
首先科普下,什么是"沉浸式"和"透明状态栏"? 1. 大家平时看到一些App运行后,状态栏会变成半透明,或者颜色跟随App的标题栏变色,这种特性叫"T ...
- Android状态栏沉浸式模式读卡器多种技巧
其实说到沉浸式状态栏这个名字我也是感到很无奈,真不知道这种叫法是谁先发起的.因为Android官方从来没有给出过沉浸式状态栏这样的命名,只有沉浸式模式(Immersive Mode)这种说法.而有些人 ...
- android华为隐藏底部虚拟按键,沉浸式状态栏/华为虚拟按键隐藏
19版本以上Android可以自己实现沉浸式状态栏的设置 1.创建values-v21文件夹(为了匹配低版本) 在style文件中设置: 设置了这两个属性状态栏就能设置为透明的.但是需要注意的是,这个 ...
- Android 状态栏沉浸式效果
我们在微信或者QQ 网易云上都有看到过状态栏上的颜色或者 背景是一致的.最近也用到这个需求,分享一下代码 代码很简单两步就足够了 第一步,在需要设置沉浸式效果的Activity中调用此方法,如果整个A ...
- Android 5.0新特性之沉浸式状态栏
参考资料: http://laobie.github.io/android/2016/03/27/statusbar-util.html http://laobie.github.io/android ...
- android studio 显示view树_Android 沉浸式解析和轮子使用
文 | 黑羽 on 移动电商 前言 我们先一起来回顾一下实现沉浸式状态栏的一般套路.在 Android 上,关于对 StatusBar(状态栏)的操作,一直都在不断改善,并且表现越来越好,在 Andr ...
最新文章
- 【PC工具】github项目辅助下载工具,github高速下载
- Cpp 对象模型探索 / 不能被继承的类
- ERP Configurable product不会被CRM中间件下载
- Visio工具 UML的建模
- React开发(171):处理删除与批量删除操作
- 关于纯HTML格式写入word
- ICCV 2021 | 带你了解微软亚洲研究院CV领域前沿进展
- MySQL无法启动 服务没有报告任何错误
- CentOS查看系统信息命令和方法
- C++实践參考——二进制文件浏览器
- 目前项目wordpress插件记录
- Loadrunner11破解完成添加License失败
- 第十四周助教工作总结——NWNU李泓毅
- js是什么、html、css
- java三角形代码_编写Java程序测试三角形
- 使用PS去水印的方法
- sql--sqlsever--时间相关SQL语句--查询当前时间至前N天的数据
- 以大数据重塑K12在线教育
- G -- HDU 4329 MAP
- 大数据——Java I/O输入输出处理(二)