文档章节

(2017)Android技能状态栏(StatusBar)解析

HzhiBo
 HzhiBo
发布于 2017/05/07 15:10
字数 1801
阅读 212
收藏 3
点赞 0
评论 0

这里先说明下

  • android 4.4版本以上才支持开发者对StatusBar全透明
  • android 5.0版本以上支持 可以修改 StatusBar 的颜色

都知道大家都是<图片党加项目党>,所以我就用文字和工程项目给大家讲解我的理解,有误还请不吝赐教啊。

工程中的Stytes.xml文件:

  <!-- Base application theme.(APP的基本主题设置 白色底无导航栏主题) -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item> 
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

item的中三个参数都是啥呢? 看下面(图片党的看来)

colorPrimary:顶部导航栏颜色(一般自定义布局,忽略)

colorPrimaryDark:状态栏背景颜色

colorAccent是光标,编辑框底下横线的颜色

对于属性还有很多妙用,这里在贴出一张图,大家可以去查阅下(深究的去看源码这里推荐一个网站http://androidxref.com/)或者(在你所装的SDK的这个目录android-sdk-windows\platforms\android-3\data\res\values 有个themes.xml的文件!)

 <style name="Theme.Light">
        <item name="windowBackground">@android:drawable/screen_background_selector_light</item>
        <item name="colorBackground">@android:color/background_light</item>
        <item name="colorForeground">@color/bright_foreground_light</item>
        <item name="colorForegroundInverse">@android:color/bright_foreground_light_inverse</item>
        
        <item name="textColorPrimary">@android:color/primary_text_light</item>
        <item name="textColorSecondary">@android:color/secondary_text_light</item>
        <item name="textColorTertiary">@android:color/tertiary_text_light</item>
        <item name="textColorPrimaryInverse">@android:color/primary_text_dark</item>
        <item name="textColorSecondaryInverse">@android:color/secondary_text_dark</item>
        <item name="textColorTertiaryInverse">@android:color/tertiary_text_dark</item>
        <item name="textColorPrimaryDisableOnly">@android:color/primary_text_light_disable_only</item>
        <item name="textColorPrimaryInverseDisableOnly">@android:color/primary_text_dark_disable_only</item>
        <item name="textColorPrimaryNoDisable">@android:color/primary_text_light_nodisable</item>
        <item name="textColorSecondaryNoDisable">@android:color/secondary_text_light_nodisable</item>
        <item name="textColorPrimaryInverseNoDisable">@android:color/primary_text_dark_nodisable</item>
        <item name="textColorSecondaryInverseNoDisable">@android:color/secondary_text_dark_nodisable</item>
        <item name="textColorHint">@android:color/hint_foreground_light</item>
        <item name="textColorHintInverse">@android:color/hint_foreground_dark</item>        
        <item name="textColorHighlight">@android:color/highlighted_text_light</item>
        <item name="textColorHighlightInverse">@android:color/highlighted_text_dark</item>
        <item name="textColorLink">@android:color/link_text_light</item>
        <item name="textColorLinkInverse">@android:color/link_text_dark</item>
        
        <item name="editTextColor">@android:color/primary_text_light</item>
        <item name="listChoiceBackgroundIndicator">@android:drawable/list_selector_background</item>

        <item name="activatedBackgroundIndicator">@android:drawable/activated_background_light</item>
        <item name="quickContactBadgeOverlay">@android:drawable/quickcontact_badge_overlay_light</item>

        <item name="popupWindowStyle">@android:style/Widget.PopupWindow</item>
        
        <item name="textCheckMark">@android:drawable/indicator_check_mark_light</item>
        <item name="textCheckMarkInverse">@android:drawable/indicator_check_mark_dark</item>

        <item name="gestureOverlayViewStyle">@android:style/Widget.GestureOverlayView.White</item>
        <item name="expandableListViewStyle">@android:style/Widget.ExpandableListView.White</item>
        <item name="listViewStyle">@android:style/Widget.ListView.White</item>
        <item name="listDivider">@drawable/divider_horizontal_bright</item>
        <item name="listSeparatorTextViewStyle">@android:style/Widget.TextView.ListSeparator.White</item>

        <item name="progressBarStyle">@android:style/Widget.ProgressBar.Inverse</item>
        <item name="progressBarStyleSmall">@android:style/Widget.ProgressBar.Small.Inverse</item>
        <item name="progressBarStyleLarge">@android:style/Widget.ProgressBar.Large.Inverse</item>
        <item name="progressBarStyleInverse">@android:style/Widget.ProgressBar</item>
        <item name="progressBarStyleSmallInverse">@android:style/Widget.ProgressBar.Small</item>
        <item name="progressBarStyleLargeInverse">@android:style/Widget.ProgressBar.Large</item>
        <item name="actionModeCutDrawable">@android:drawable/ic_menu_cut_holo_light</item>
        <item name="actionModeCopyDrawable">@android:drawable/ic_menu_copy_holo_light</item>
        <item name="actionModePasteDrawable">@android:drawable/ic_menu_paste_holo_light</item>
        <item name="actionModeSelectAllDrawable">@android:drawable/ic_menu_selectall_holo_light</item>
        <item name="actionModeShareDrawable">@android:drawable/ic_menu_share_holo_light</item>
        <item name="actionModeFindDrawable">@android:drawable/ic_menu_find_holo_light</item>
        <item name="actionModeWebSearchDrawable">@android:drawable/ic_menu_search_holo_light</item>
        <item name="actionModeBackground">@android:drawable/cab_background_top_holo_light</item>
        <item name="actionModeSplitBackground">@android:drawable/cab_background_bottom_holo_light</item>

        <!-- SearchView attributes -->
        <item name="searchDropdownBackground">@android:drawable/search_dropdown_light</item>
        <item name="searchViewTextField">@drawable/textfield_searchview_holo_light</item>
        <item name="searchViewTextFieldRight">@drawable/textfield_searchview_right_holo_light</item>
        <item name="searchViewCloseIcon">@android:drawable/ic_clear_holo_light</item>
        <item name="searchViewSearchIcon">@android:drawable/ic_search_api_holo_light</item>
        <item name="searchViewGoIcon">@android:drawable/ic_go_search_api_holo_light</item>
        <item name="searchViewVoiceIcon">@android:drawable/ic_voice_search_api_holo_light</item>
        <item name="searchViewEditQuery">@android:drawable/ic_commit_search_api_holo_light</item>

        <item name="detailsElementBackground">@android:drawable/panel_bg_holo_light</item>

        <item name="mediaRouteButtonStyle">@android:style/Widget.DeviceDefault.Light.MediaRouteButton</item>
        <item name="findOnPageNextDrawable">@android:drawable/ic_find_next_holo_light</item>
        <item name="findOnPagePreviousDrawable">@android:drawable/ic_find_previous_holo_light</item>
    </style>

项目实践:->https://git.oschina.net/huagnzhibo123/mystatusbar.git

  • 状态栏为白色:
    在styles.xml的指定app的主题下修改colorPrimaryDark的颜色

  •   <style name="AppTheme" parent="Theme.AppCompat.Light">
            <!-- Customize your theme here. -->
            <item name="colorPrimary">@color/colorPrimary</item>
            <item name="colorPrimaryDark">@android:color/white</item><!--单单设置状态栏bg颜色-->
            <item name="colorAccent">@color/colorAccent</item>
        </style>

     

        效果图

        

这里底色是白色了,但是状态栏字体却不见了(字体颜色默认白色),这怎么能容忍呢?查了下文档,android系统中只有6.0以上支持状态栏高亮,也就是字体为黑色.

 <style name="AppTheme" parent="Theme.AppCompat.Light">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@android:color/white</item><!--单单设置状态栏bg颜色 发现字体颜色也为白色(难看)-->
       <item name="android:windowLightStatusBar">true</item><!--6.0以上(黑色字体)-->
        <item name="colorAccent">@color/colorAccent</item>
    </style>

对于低于6.0的系统只能用系统的默认字体颜色为白色了,想小米,魅族有各自提供的接口实现(http://www.jianshu.com/p/7f5a9969be53)

  • 状态栏为透明(布局占用状态栏)
    在很多场景中,都会使用到布局占用状态栏的高度,整个页面统一化,好看啊,比如这张:
    实现步骤:
    1.使得布局占用状态栏高度
    2.状态透明化

         重新建立一个TranActivity 这里重新指定主题为:

 <style name="TranActivityTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- Customize your theme here. -->
    </style>


在manifest清单中为这个TranActiivty指定无导航栏主题

          布局文件(使得布局占用状态栏高度):

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="false"
    tools:context="lixiaoqian.com.mystatusbar.TranActivity">
    <!--注意  fitsSystemWindows 属性:false是不考虑系统的布局,直接占用状态栏高度-->
    <ImageView
        android:id="@+id/imageView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/colorAccent"
         />
</RelativeLayout>

        状态栏透明化:
        这里想通过xml中的状态栏颜色改变为透明,实践是失败的,目前的方案是通过代码设置状态栏为全透明:


public class TranActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        tranStatusBar();
        setContentView(R.layout.activity_tran);
    }

    /**
     * 状态栏透明化
     */
    private void tranStatusBar() {
        getWindow().requestFeature(Window.FEATURE_NO_TITLE);
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            Window window = getWindow();
            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
                    | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
            window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            /*window.setStatusBarColor(Color.TRANSPARENT);
            window.setNavigationBarColor(Color.TRANSPARENT);*/ //可以不用了
        }
    }
}

    代码中主要的是tranStatusBar的实现逻辑,其中有几个需要解释下:

    clearFlags,setFlags,addFlags 都是对window窗体进行修改:

    FLAG_TRANSLUCENT_STATUS: 透明状态栏

    FLAG_TRANSLUCENT_NAVIGATION:透明底部导航栏

    SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN:全屏模式

    SYSTEM_UI_FLAG_LAYOUT_STABLE:显示顶部状态栏

补充 :

对于华为机型中底部有虚拟导航栏,在设置全屏时,会导致导航栏遮住布局,我么的目的是 占据顶部,不占底部

所以这里提供另一种思路(5.0以上)

if (Build.VERSION.SDK_INT >= 21) {
View decorView = getWindow().getDecorView();
int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
decorView.setSystemUiVisibility(option);
getWindow().setStatusBarColor(Color.TRANSPARENT);
}
ActionBar actionBar = getSupportActionBar();
actionBar.hide();

View.setSystemUiVisibility(int visibility)中,visibility是Mode与Layout任意取值的组合,可传入的实参为:

Mode

  1. View.SYSTEM_UI_FLAG_LOW_PROFILE:状态栏显示处于低能显示状态(low profile模式),状态栏上一些图标显示会被隐藏。
  2. View.SYSTEM_UI_FLAG_FULLSCREEN:Activity全屏显示,且状态栏被隐藏覆盖掉。等同于(WindowManager.LayoutParams.FLAG_FULLSCREEN)
  3. View.SYSTEM_UI_FLAG_HIDE_NAVIGATION:隐藏虚拟按键(导航栏)。有些手机会用虚拟按键来代替物理按键。
  4. View.SYSTEM_UI_FLAG_IMMERSIVE:这个flag只有当设置了SYSTEM_UI_FLAG_HIDE_NAVIGATION才起作用。如果没有设置这个flag,任意的View相互动作都退出SYSTEM_UI_FLAG_HIDE_NAVIGATION模式。如果设置就不会退出。
  5. View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY:这个flag只有当设置了SYSTEM_UI_FLAG_FULLSCREEN | SYSTEM_UI_FLAG_HIDE_NAVIGATION 时才起作用。如果没有设置这个flag,任意的View相互动作都坏退出SYSTEM_UI_FLAG_FULLSCREEN | SYSTEM_UI_FLAG_HIDE_NAVIGATION模式。如果设置就不受影响。

Layout

  1. View.SYSTEM_UI_FLAG_LAYOUT_STABLE: 保持View Layout不变,隐藏状态栏或者导航栏后,View不会拉伸。
  2. View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN:让View全屏显示,Layout会被拉伸到StatusBar下面,不包含NavigationBar。
  3. View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION:让View全屏显示,Layout会被拉伸到StatusBar和NavigationBar下面。

总结:

在第一种方案状态栏透明这个功能上,要注意布局系统对底层的窗体都要设置全屏模式(缺一不可),然后在设置状态栏的背景颜色,上面所说的用xml使得状态栏透明失败是因为系统对底层的窗体没有设置全屏,大家可以自己去试试

© 著作权归作者所有

共有 人打赏支持
HzhiBo
粉丝 8
博文 27
码字总数 21222
作品 0
泉州
Android工程师
android沉浸状态栏实现、地图多线路规划、Retrofit+RxJava+Jsoup+Mvp模式资讯类App等源码

Android精选源码 Android各种沉浸式状态栏实现源码(http://www.apkbus.com/thread-598927-1-1.html) Android自定义View实现炫酷的星期日期选择控件源码(http://www.apkbus.com/thread-59893...

逆鳞龙 ⋅ 05/08 ⋅ 0

如何通过命令行查看Android手机的Activtiy堆栈信息和手机分辨率

查看 activity 栈的状态: adb shell dumpsys activity Android has an interesting command called dumpsys to dump some system information. Even described on adb manual I think that ......

beijing_zbs ⋅ 2015/02/27 ⋅ 0

Android解析WindowManager(三)Window的添加过程

相关文章 Android系统启动系列 Android深入四大组件系列 Android应用进程启动过程系列 Android解析WindowManager系列 前言 在此前的系列文章中我们学习了WindowManager体系和Window的属性,这...

刘望舒 ⋅ 2017/09/21 ⋅ 0

Android解析WindowManager(三)Window的添加过程

前言 在此前的系列文章中我们学习了WindowManager体系和Window的属性,这一篇我们接着来讲Window的添加过程。建议阅读此篇文章前先阅读本系列的前两篇文章。 1.概述 WindowManager对Window进...

刘望舒 ⋅ 2017/11/18 ⋅ 0

android状态栏关于开发的几件事

最近手头做了一个新的项目,开发中对状态栏的要求比较多,也作了一些总结,分享给大家。 简答题 全屏、不保留状态栏文字(Splash页面,欢迎页面) 全屏保留状态栏文字(页面上部有Banner图) 标题...

冯剑Wolfman ⋅ 01/07 ⋅ 0

android应用开发-从设计到实现 3-4 静态原型的状态栏

静态原型的状态栏 状态栏Symbol 状态栏似乎很复杂,有wifi信号、手机信号、时间、电量等信息,幸好原生就自带的现成组件,你可以直接拿过来就用了。当然,你也可以自己一个一个去画,不过既然...

anddlecn ⋅ 2017/03/23 ⋅ 0

Android Shell命令dumpsys

Android Shell命令dumpsys 2013-01-24 dumpsys命令可以显示手机中所有应用程序的信息,并且也会给出现在手机的状态。 直接执行adb shell dumpsys会显示以下所有信息。 dumpsys的参数可以跟以...

wangjian19 ⋅ 2013/11/26 ⋅ 0

Android系统更改状态栏字体颜色

Android系统更改状态栏字体颜色 码农明明桑2016-01-08579 阅读 android 随着时代的发展,Android的状态栏都不是乌黑一片了,在Android4.4之后我们可以修改状态栏的颜色或者让我们自己的View延...

码农明明桑 ⋅ 2016/01/08 ⋅ 0

使用FT添加Fragment时,replace能正确实现布局的透明状态栏,而add则会向上偏移直接顶掉状态栏

使用FT添加Fragment时,replace能实现布局的透明状态栏,而add则会直接顶掉状态栏 备注:我是在Fragment的布局中实现透明状态栏和Toolbar 实现透明状态栏(沉浸式?)的方案: Fragment的布局...

一剑围城 ⋅ 2017/03/22 ⋅ 0

使用FT添加Fragment时,replace能实现布局的透明状态栏,而add则会直接向上偏移顶掉状态栏

使用FT添加Fragment时,replace能实现布局的透明状态栏,而add则会直接向上偏移顶掉状态栏 备注:我是在Fragment的布局中实现透明状态栏和Toolbar 实现透明状态栏(沉浸式?)的方案: Frag...

一剑围城 ⋅ 2017/03/22 ⋅ 1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Docker Swarm的前世今生

概述 在我的《Docker Swarm集群初探》一文中,我们实际体验了Docker Swarm容器集群技术的魅力,与《Kubernetes实践录》一文中提到的Kubernetes集群技术相比,Docker Swarm没有Kubernetes显得...

CodeSheep ⋅ 今天 ⋅ 0

骰子游戏代码开源地址

因为阿里云现在服务器已经停用了,所以上面的配置已经失效。 服务端开源地址:https://gitee.com/goalya/chat4.git 客户端开源地址:https://gitee.com/goalya/client4.git 具体运行界面请参考...

算法之名 ⋅ 今天 ⋅ 0

设计模式--装饰者模式

装饰者模式 定义 动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。 通用类图 意图 动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比...

gaob2001 ⋅ 今天 ⋅ 0

JavaScript零基础入门——(八)JavaScript的数组

JavaScript零基础入门——(八)JavaScript的数组 欢迎大家回到我们的JavaScript零基础入门,上一节课我们讲了有关JavaScript正则表达式的相关知识点,便于大家更好的对字符串进行处理。这一...

JandenMa ⋅ 今天 ⋅ 0

sbt网络问题解决方案

转自:http://dblab.xmu.edu.cn/blog/maven-network-problem/ cd ~/.sbt/launchers/0.13.9unzip -q ./sbt-launch.jar 修改 vi sbt/sbt.boot.properties 增加一个oschina库地址: [reposit......

狐狸老侠 ⋅ 今天 ⋅ 0

大数据,必须掌握的10项顶级安全技术

我们看到越来越多的数据泄漏事故、勒索软件和其他类型的网络攻击,这使得安全成为一个热门话题。 去年,企业IT面临的威胁仍然处于非常高的水平,每天都会看到媒体报道大量数据泄漏事故和攻击...

p柯西 ⋅ 今天 ⋅ 0

Linux下安装配置Hadoop2.7.6

前提 安装jdk 下载 wget http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-2.7.6/hadoop-2.7.6.tar.gz 解压 配置 vim /etc/profile # 配置java环境变量 export JAVA_HOME=/opt/jdk1......

晨猫 ⋅ 今天 ⋅ 0

crontab工具介绍

crontab crontab 是一个用于设置周期性被执行的任务工具。 周期性执行的任务列表称为Cron Table crontab(选项)(参数) -e:编辑该用户的计时器设置; -l:列出该用户的计时器设置; -r:删除该...

Linux学习笔记 ⋅ 今天 ⋅ 0

深入Java多线程——Java内存模型深入(2)

5. final域的内存语义 5.1 final域的重排序规则 1.对于final域,编译器和处理器要遵守两个重排序规则: (1)在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用...

江左煤郎 ⋅ 今天 ⋅ 0

面试-正向代理和反向代理

面试-正向代理和反向代理 Nginx 是一个高性能的反向代理服务器,但同时也支持正向代理方式的配置。

秋日芒草 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部