沉浸式状态栏解决方案(studio直接依赖一个库就可以)
2016-08-23 14:19
232 查看
原文出处:http://laobie.github.io/android/2016/02/15/status-bar-demo.html
伴随着 Android 5.0 发布的 Material Design,让 Android 应用告别了以前的工程师审美,迎来了全新的界面,灵动的交互,也让越来越多的 App 开始遵从 material design 设计原则,不再是以前拿着iOS设计稿,做着Android开发。本文就其中的沉浸式状态栏这一特性,描述其兼容到4.4的实现,以及一些使用中的小细节。
** 建议直接看最新的解决方案 Android 状态栏工具类(实现沉浸式状态栏/变色状态栏)**
### 前言 在4.4之前状态栏一直是黑色的,在4.4中带来了windowTranslucentStatus 这一特性,因此可以实现给状态栏设置颜色,如下图所示,状态栏颜色不再是黑色,而是可以定制的颜色。
国内将状态栏变色叫做沉浸式状态栏,时间久了,叫的人多了,大家就不再深究,默认了这种叫法。
可以在知乎上看到关于这个问题的讨论:为什么在国内会有很多用户把「透明栏」(Translucent Bars)称作
「沉浸式顶栏」?
4.4及其以上都是可以实现沉浸式状态栏效果的,5.0及其以上可以直接在主题中设置颜色,或者调用 Window 类中的 setStatusBarColor(int color) 来实现,这两种方式在5.0上都比较简单,但是如何兼容到4.4呢?
图片背景的页面,怎样让状态栏透明或者半透明(效果如下)?
使用 DrawerLayout 时,主界面实现沉浸状态栏同时,怎样保证抽屉视图也能延伸到状态栏(如下图所示),且兼容到4.4?
以上就是本文要解决的问题,下面给出解决方案。
思路是:
先设置状态栏透明属性;
给根布局加上一个和状态栏一样大小的矩形View(色块),添加到顶上;
然后设置根布局的 FitsSystemWindows 属性为 true,此时根布局会延伸到状态栏,处在状态栏位置的就是之前添加的色块,这样就给状态栏设置上颜色了。
代码如下:
其中生成状态栏一样大小的矩形色块的代码如下:
在 setContentView() 之后调用 setColor(Activity activity, int color) 方法即可。
这个实现比较简单,根布局背景设置为图片,然后添加状态栏透明 Flag, 然后设置根布局的 FitsSystemWindows 属性为 true 即可。代码如下:
同样的,在 setContentView() 之后调用 setTranslucent(Activity activity) 方法即可。
注意点:
使用 DrawerLayout 时,此时不能再对根布局,即 DrawerLayout 进行设置,而要针对 DrawerLayout 的内容布局进行设置,即抽屉之外的另一个布局。
如下是一个典型的 DrawerLayout 的布局,其内容布局即 FrameLayout,我们需要对 FrameLayout 进行仿状态栏色块的添加、FitsSystemWindows 属性的设置。
还有一个需要注意的设置抽屉布局(Drawer)的 FitsSystemWindows 属性为 false,即上面布局中的 NavigationView。
解决方案
DrawerLayout 状态栏变色
代码如下:
需要注意的是,DrawerLayout 的布局只能包含两个直接子布局,一个是内容布局,一个是抽屉布局,结构如前面的示例布局所示,如果内容布局的根布局如果不是LinearLayout 需要对其子布局设置padding top值,否则仿状态栏色块会被遮挡在最下面,布局内容延伸到状态栏,如下图所示:
(ps:就上图中的问题,目前的解决方案感觉并不是很好,如果你有更好的解决方案,请告诉我~)
DrawerLayout 状态栏透明
同样的,在 setContentView() 之后调用上述解决方案中的方法即可。
以上代码我整理成了一个工具类,放在 github 上:StatusBarUtils.java
文件
在项目中推荐这样使用,在 BaseActivity 中重写 setContentView(int layoutResID) 方法,新建一个 setStatusBar()方法,全局设置状态栏颜色,因为一般 App 大部分界面状态栏都是主题色。
当子类 Activity 的状态栏需要特殊处理时,比如设置不同的颜色,或者设置图片为背景时,重写父类的 setStatusBar() 方法即可,例如:
对 DrawerLayout 布局使用时,需要注意一点,因为方法是在 setContentView() 之后立即调用的,所以传进来的 DrawerLayout 要通过 findViewById() 传进来。如果传入在 setContentView() 之后通过 findViewById() 得到的 DrawerLayout, 则会造成空指针异常。
StatusBarDemo Github 地址
Demo apk 下载
伴随着 Android 5.0 发布的 Material Design,让 Android 应用告别了以前的工程师审美,迎来了全新的界面,灵动的交互,也让越来越多的 App 开始遵从 material design 设计原则,不再是以前拿着iOS设计稿,做着Android开发。本文就其中的沉浸式状态栏这一特性,描述其兼容到4.4的实现,以及一些使用中的小细节。
** 建议直接看最新的解决方案 Android 状态栏工具类(实现沉浸式状态栏/变色状态栏)**
### 前言 在4.4之前状态栏一直是黑色的,在4.4中带来了windowTranslucentStatus 这一特性,因此可以实现给状态栏设置颜色,如下图所示,状态栏颜色不再是黑色,而是可以定制的颜色。
国内将状态栏变色叫做沉浸式状态栏,时间久了,叫的人多了,大家就不再深究,默认了这种叫法。
可以在知乎上看到关于这个问题的讨论:为什么在国内会有很多用户把「透明栏」(Translucent Bars)称作
「沉浸式顶栏」?
需要解决的问题
4.4及其以上都是可以实现沉浸式状态栏效果的,5.0及其以上可以直接在主题中设置颜色,或者调用 Window 类中的 setStatusBarColor(int color) 来实现,这两种方式在5.0上都比较简单,但是如何兼容到4.4呢?图片背景的页面,怎样让状态栏透明或者半透明(效果如下)?
使用 DrawerLayout 时,主界面实现沉浸状态栏同时,怎样保证抽屉视图也能延伸到状态栏(如下图所示),且兼容到4.4?
以上就是本文要解决的问题,下面给出解决方案。
解决方案
1. 给状态栏设置颜色
思路是:先设置状态栏透明属性;
给根布局加上一个和状态栏一样大小的矩形View(色块),添加到顶上;
然后设置根布局的 FitsSystemWindows 属性为 true,此时根布局会延伸到状态栏,处在状态栏位置的就是之前添加的色块,这样就给状态栏设置上颜色了。
代码如下:
2. 图片作背景时,状态栏透明
这个实现比较简单,根布局背景设置为图片,然后添加状态栏透明 Flag, 然后设置根布局的 FitsSystemWindows 属性为 true 即可。代码如下:
3. 使用 DrawerLayout 时的特殊处理
注意点:使用 DrawerLayout 时,此时不能再对根布局,即 DrawerLayout 进行设置,而要针对 DrawerLayout 的内容布局进行设置,即抽屉之外的另一个布局。
如下是一个典型的 DrawerLayout 的布局,其内容布局即 FrameLayout,我们需要对 FrameLayout 进行仿状态栏色块的添加、FitsSystemWindows 属性的设置。
解决方案
DrawerLayout 状态栏变色
代码如下:
(ps:就上图中的问题,目前的解决方案感觉并不是很好,如果你有更好的解决方案,请告诉我~)
DrawerLayout 状态栏透明
在项目中使用
以上代码我整理成了一个工具类,放在 github 上:StatusBarUtils.java文件
在项目中推荐这样使用,在 BaseActivity 中重写 setContentView(int layoutResID) 方法,新建一个 setStatusBar()方法,全局设置状态栏颜色,因为一般 App 大部分界面状态栏都是主题色。
源码和Demo下载
StatusBarDemo Github 地址Demo apk 下载
相关文章推荐
- Android Studio2.3版本可以直接用一个按钮来查找城市
- 自己写的一个TableModel,不可直接更改内容,但可以自由添加行
- appendNode? 可以直接一个节点树
- 一个多服务器的缓存依赖的解决方案
- 一个可以将flex应用运行于手机上的开发工具ELIPS_STUDIO
- E: 有未能满足的依赖关系。请尝试不指明软件包的名字来运行“apt-get -f install”(也可以指定一个解决办法)。
- [总结]C#判断一个string是否可以为数字,五种解决方案!
- 在vs2010中可以很方便的打包桌面程序和同一解决方案中一个项目引用另外一个项目的问题
- .NET入门(一)如何在studio 2008的一个解决方案里切换项目执行
- [总结]C#判断一个string是否可以为数字,五种解决方案!
- c# sqlite 数据库加密2010-05-29 10:55用了ADO.NET 2.0 SQLite Data Provider 这样可以直接利用它来创建一个加密的sqlite数据库。
- 昨天发现System.Diagnostics.Process 一样的可以打开一个网页的,直接的输入网页的地址就好了
- C#判断一个string是否可以为数字的五种解决方案
- C#判断一个string是否可以为数字,五种解决方案
- 一个可以直接拖拽文件到Eclipse中使用Eclipse打开的插件
- MyPage从Page派生,MyPage总有一个Label控件。以便以后从MyPage派生的页都可以直接使用Label?给个代码例子看看?
- C#判断一个string是否可以为数字,五种解决方案!
- 一个统计当前在线用户的解决方案,可以在聊天室、论坛、网站中使用
- C# Winform 一个可以用鼠标改变控件位置和大小的类,直接调用即可.....(代码收藏)
- c# sqlite 数据库加密2010-05-29 10:55用了ADO.NET 2.0 SQLite Data Provider 这样可以直接利用它来创建一个加密的sqlite数据库。