效果

  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了,最后不同版本号,不同机型适配效果:





  适配效果还算能够。假设有其它更好解决方法的。指点一下。谢谢~

源代码

  https://github.com/zhaozepeng/Android_framework

android 自己定义状态栏和导航栏分析与实现的更多相关文章

  1. Android 5.0状态栏和导航栏

    Material Design推出之后,app中也開始沿用这样的风格 今天来说一下状态栏颜色设置,在4.4的时候推出了透明状态栏和导航栏.在不使用第三方库的情况下,4.4还是没有全然解决存在actio ...

  2. Android隐藏状态栏、导航栏

    Android隐藏状态栏.导航栏 private void hideStatusNavigationBar(){ if(Build.VERSION.SDK_INT<16){ this.getWi ...

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

    Android 系统自4.2 開始 UI 上就没多大改变,4.4 也仅仅是添加了透明状态栏与导航栏的功能,如图 那么如今我就来给大家解说下怎样使用这个新特性,让你的 app 尾随潮流,当然假设你不在乎 ...

  4. 兼容 Android 4.4 透明状态栏与导航栏

    http://www.apkbus.com/Android-163388-1-1.html?_dsign=73d41229 android 系统自4.2 开始 UI 上就没多大改变,4.4 也只是增加 ...

  5. Android状态栏和导航栏

    1.隐藏状态栏或导航栏 View decordView = getWindow().getDecorView(); /*SYSTEM_UI_FLAG_HIDE_NAVIGATION和SYSTEM_UI ...

  6. App开发流程之状态栏和导航栏

    记录状态栏和导航栏的设置和控制,统一在基类视图控制器中完成. 状态栏. 状态栏高度为20,iOS7以后背景完全透明. 样式枚举如下: typedef NS_ENUM(NSInteger, UIStat ...

  7. iphone状态栏,导航栏,标签栏高度一览表

    iphone状态栏,导航栏,标签栏高度一览表   设备分辨率 状态栏高度 导航栏高度 标签栏高度 iPhone6 plus  1242×2208 px 60px  132px  147px iPhon ...

  8. iOS获取状态栏和导航栏尺寸(宽度和高度)

    iPhone开发当中,有时需要获取状态栏和导航栏高度.宽度信息,方便布局其他控件.下面介绍一下如何获取这些信息: // 状态栏(statusbar) CGRect rectStatus = [[UIA ...

  9. iOS 状态栏、导航栏、工具栏、选项卡大小

    1.状态栏状态栏一般高度为20像素,在打手机或者显示消息时会放大到40像素高,注意,两倍高度的状态栏在好像只能在纵向的模式下使用.如下图用户可以隐藏状态栏,也可以将状态栏设置为灰色,黑色或者半透明的黑 ...

随机推荐

  1. CentOS7.3 下开放防火墙的端口

    CentOS 7.3默认使用的是firewall作为防火墙,这里改为iptables防火墙. 1:关闭firewall: systemctl stop firewalld.service system ...

  2. python中的装饰器decorator

    python中的装饰器 装饰器是为了解决以下描述的问题而产生的方法 我们在已有的函数代码的基础上,想要动态的为这个函数增加功能而又不改变原函数的代码 例如有三个函数: def f1(x): retur ...

  3. 无比强大!Python抓取cssmoban网站的模版并下载

    Python实现抓取http://www.cssmoban.com/cssthemes网站的模版并下载 实现代码 # -*- coding: utf-8 -*- import urlparse imp ...

  4. python的开发工具UliPad安装篇

    之前文章里写过一个搭建windows下搭建Selenium+Eclipse+Python环境,如今认为这个Eclipse太大了,太笨重了,重新启动又慢,像Python脚本轻级语言,不是必需用那么大的工 ...

  5. cigarette

    #include<iostream> using namespace std; int main() { int N; cin>>N; while(N--) { int Who ...

  6. LicManager系统对各license类型终端客户机器的监控

    与catia软件相似.以下这些软件都是汽车project设计软件.对汽车工业的的研发设计有着不可替代的作用.但它们都有着不同于各自的优势与不足之处. 可是在LicManager许可监控系统下,它们都是 ...

  7. iOS使用Instrument的Leaks查找代码内存泄露

    Here are some tips for finding leaks in our project: 1. 打开Instruments调试工具控制栏, Xcode -> Open Dev T ...

  8. Visual Code的调试

    Run 'Debug: Download .NET Core Debugger' in the Command Palette or open a .NET project directory to ...

  9. php实现简单算法2

    php实现简单算法2 去弄php手册,里面有数据结构,有数据结构就好办了,我的算法基础那么好. 而且的话有数据结构的话再配合我脑中的那些算法了,我就都ok啦. 在手册里面搜索php数据结构就好 路径如 ...

  10. 2.AngularJS-验证

    转自:https://www.cnblogs.com/best/p/6225621.html 一.验证 angularJS中提供了许多的验证指令,可以轻松的实现验证,只需要在表单元素上添加相应的ng属 ...