zoukankan      html  css  js  c++  java
  • 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
      QQQQ
    从图片中能够非常清楚的看到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

  • 相关阅读:
    如何很“礼貌”的避免抛出空指针异常
    如何优雅的使用第三方插件写实体类
    IntelliJ IDEA(2019.03)破解教程(亲测实用)
    vue.js 中使用(...)运算符报错的解决方法
    44个Java性能优化
    Spring MVC原理及配置
    Intellij IDEA 从入门到上瘾 图文教程
    JVM系列二 GC策略&内存申请、对象衰老
    Spring MVC国际化配置
    Java性能优化的50个细节(珍藏版)
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/6999372.html
Copyright © 2011-2022 走看看