android 自己定义状态栏和导航栏分析与实现
效果
android 4.4之后,系统是支持自己定义状态栏和导航栏的。举个最典型的样例就是bilibiliclient了(iOS版本号和android版本号能用两套全然不一样符合各自系统的设计ui,良心啊~),顶部状态栏为粉色,底部导航栏为半透明色:
接着QQ最新的版本号6.2也使用了状态栏透明风格,可是出来的效果在不同版本号。不同手机上,显示的效果真是差异非常大(4.3版本号是无法使用状态栏透明风格的,仅仅是放出来做个对照):
更新,QQ的6.2.1版本号已经又一次换成蓝色的bar了。
————————————————————————————————————
————————————————————————————————————
————————————————————————————————————
————————————————————————————————————
这个我也不知道究竟是怎么适配的,希望有人给解答一下。
实现与分析
API 19~20
接下来分析一下怎么自己定义状态栏和导航栏,这个在21版本号之前和之后能够使用不同的方式来实现,先看看19~20版本号的适配,状态栏和导航栏透明:
<?xml version="1.0" encoding="utf-8"?
>
<resources>
<style name="Activity_translucent_status_bar" parent="@style/Theme.AppCompat.Light.NoActionBar">
<item name="android:windowTranslucentStatus">true</item>
</style>
<style name="Activity_translucent_navigation_bar" parent="@style/Theme.AppCompat.Light.NoActionBar">
<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowTranslucentNavigation">true</item>
</style>
</resources>
从代码看到,状态栏透明主要是使用android:windowTranslucentStatus属性,导航栏透明主要是使用android:windowTranslucentNavigation属性。当这个属性设置为true之后,系统栏会变成半透明,而且应用的内容区域也会扩充到系统栏中:
这样目的是达到了,可是效果肯定是不行的,怎么解决呢?来学习一下bilibili和QQ的布局就了解了:
从图片中能够非常清楚的看到bilibili和QQ都是在顶部放置了一个和status bar一样高度,自己定义颜色的view。status bar高度的获取方式:
int id = getResources().getIdentifier("status_bar_height", "dimen", "android");
int height = getResources().getDimensionPixelOffset(id);
这样思路就非常清楚了。全部的activity继承自一个基类activity,基类activity的布局文件进行相似的处理,最后也是能够达到和bilibiliclient一样的效果(吐槽一下华为p6的状态栏黑色阴影真心难看):
github上也有相关库能够实现一样的效果。可是原理都差点儿相同。
API 21~++
21版本号和21版本号之后,系统添加了很多其它的选项用来提供用户改动颜色:
所以能够通过android:colorPrimaryDark属性来使状态栏变成所需的颜色,android:navigationBarColor属性来改变导航栏所须要的颜色:
<item name="android:colorPrimaryDark">@color/bar_color</item>
<item name="android:navigationBarColor">@color/half_black_transparent</item>
最后效果:
貌似这个导航栏是无法使用透明颜色的,那么导航栏透明的方案这么做是行不通的。仅仅能继续使用19版本号的方案了:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="Activity_translucent_status_bar" parent="@style/Theme.AppCompat.Light.NoActionBar">
<item name="android:colorPrimaryDark">@color/bar_color</item>
</style>
<style name="Activity_translucent_navigation_bar" parent="@style/Theme.AppCompat.Light.NoActionBar">
<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowTranslucentNavigation">true</item>
</style>
</resources>
最后也当然须要在顶部加入一个status bar高度的自己定义view了,最后不同版本号,不同机型适配效果:
适配效果还算能够。假设有其它更好解决方法的。指点一下。谢谢~
源代码
android 自己定义状态栏和导航栏分析与实现的更多相关文章
- Android 5.0状态栏和导航栏
Material Design推出之后,app中也開始沿用这样的风格 今天来说一下状态栏颜色设置,在4.4的时候推出了透明状态栏和导航栏.在不使用第三方库的情况下,4.4还是没有全然解决存在actio ...
- Android隐藏状态栏、导航栏
Android隐藏状态栏.导航栏 private void hideStatusNavigationBar(){ if(Build.VERSION.SDK_INT<16){ this.getWi ...
- Android 4.4 沉浸式透明状态栏与导航栏
Android 系统自4.2 開始 UI 上就没多大改变,4.4 也仅仅是添加了透明状态栏与导航栏的功能,如图 那么如今我就来给大家解说下怎样使用这个新特性,让你的 app 尾随潮流,当然假设你不在乎 ...
- 兼容 Android 4.4 透明状态栏与导航栏
http://www.apkbus.com/Android-163388-1-1.html?_dsign=73d41229 android 系统自4.2 开始 UI 上就没多大改变,4.4 也只是增加 ...
- Android状态栏和导航栏
1.隐藏状态栏或导航栏 View decordView = getWindow().getDecorView(); /*SYSTEM_UI_FLAG_HIDE_NAVIGATION和SYSTEM_UI ...
- App开发流程之状态栏和导航栏
记录状态栏和导航栏的设置和控制,统一在基类视图控制器中完成. 状态栏. 状态栏高度为20,iOS7以后背景完全透明. 样式枚举如下: typedef NS_ENUM(NSInteger, UIStat ...
- iphone状态栏,导航栏,标签栏高度一览表
iphone状态栏,导航栏,标签栏高度一览表 设备分辨率 状态栏高度 导航栏高度 标签栏高度 iPhone6 plus 1242×2208 px 60px 132px 147px iPhon ...
- iOS获取状态栏和导航栏尺寸(宽度和高度)
iPhone开发当中,有时需要获取状态栏和导航栏高度.宽度信息,方便布局其他控件.下面介绍一下如何获取这些信息: // 状态栏(statusbar) CGRect rectStatus = [[UIA ...
- iOS 状态栏、导航栏、工具栏、选项卡大小
1.状态栏状态栏一般高度为20像素,在打手机或者显示消息时会放大到40像素高,注意,两倍高度的状态栏在好像只能在纵向的模式下使用.如下图用户可以隐藏状态栏,也可以将状态栏设置为灰色,黑色或者半透明的黑 ...
随机推荐
- C语言调试小技巧
经常看到有人介绍一些IDE或者像gdb这样的调试器的很高级的调试功能,也听人说过有些牛人做工程的时候就用printf来调试,不用特殊的调试器.特别是在代码经过编译器一些比较复杂的优化后,会变得“难以辨 ...
- [Python] ndArray of numpy
NumPy Reference: Mathematical functions numpy.sum: Sum of elements - along rows, columns or all nump ...
- CKEditor高级编辑器
是否感觉后台分类描写叙述信息.商品描写叙述信息以及文章描写叙述信息 编写时很的不方便?有时候会将word的格式也复制过来了?那这个插件就比較适合了. 本插件使用CKEditor最新版本号,复制过来的内 ...
- 23.IDEA 运行junit单元测试方法
转自:https://blog.csdn.net/weixin_42231507/article/details/80714716 配置Run,增加Junit 最终配置如下:
- django 笔记4 数据库操作
django操作数据库 orm操作 对应关系 models.tb.objects.filter(id__gt=) models.tb.objects.filter(id=) models.tb.obj ...
- Codeforces 344D Alternating Current 简单使用栈
Description Mad scientist Mike has just finished constructing a new device to search for extraterres ...
- comm---两个文件之间的比较
comm命令可以用于两个文件之间的比较,它有一些选项可以用来调整输出,以便执行交集.求差.以及差集操作. 交集:打印出两个文件所共有的行. 求差:打印出指定文件所包含的且不相同的行. 差集:打印出包含 ...
- Linux下yum安装ffmpeg和使用
本文属于转载文章:转载地址是http://www.cnblogs.com/dennisit/archive/2012/12/27/2835089.html 使用Yum安装ffmpeg 打开 vi /e ...
- 正确地在QML应用中使用fontsize
我们知道我们有时须要显示text文本.可是,在QML应用中.我们应该怎样选择font的大小呢?在今天的这篇文章中,我们将展示在Ubuntu平台中的不同文字的大小.我们能够通过FontUtils来帮我们 ...
- jquery06 jQuery.extend 给jQuery函数添加、继承 静态方法
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...