升华你的状态栏

来源:互联网 发布:龙腾世纪起源 知乎 编辑:程序博客网 时间:2024/04/28 02:34

一、任务:

今天我们来玩玩现今app挺漂亮的三种状态栏(名字可能不是这样叫,我随便叫叫,不要纠结这点小细节):

  1. 颜色状态栏
  2. 图片状态栏
  3. 全屏背景状态栏

颜色状态栏
图片状态栏
全屏背景

二、实操

long time ago,状态栏都是有黑暗来统治,but经过了漫长的斗争,在4.4(KITKAT)时代光明终于迎来了胜利。状态栏天神不再独裁专制,允许我们来订制自己的专属。

说人话,就是4.4之前我们无法订制状态栏,只有4.4之后才可以。

windowTranslucentStatus:这个属性是指是否允许app的View插入(有点污)到状态栏。

设置这属性有两种方式,可以在styles或者代码设置,个人觉得还是在代码设置比较稳妥点。

Window window = getWindow();window.setFlags(                        WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,                        WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

就是这么的easy,设置之后的效果就是这样滴,可以看到View已经插入(好污的人啊)到状态栏了,so,只要把xml设置background,第三个任务全屏背景就OK啦。

这里写图片描述

效果是可以,but,你的View已经插入状态栏了,要解决这个问题其实很简单,只要在根布局设置android:fitsSystemWindows=”true”就可以了,这个属性是指是否需要空出状态栏的高度,其实就是相当于paddingTop。修正效果是:

这里写图片描述

接下来用最简单的办法实现颜色状态栏。

  1. 设置window flags插入状态栏
  2. 设置根布局背景为状态栏颜色,内容区为其他颜色
  3. 空出状态栏
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:background="@color/colorPrimary"    android:fitsSystemWindows="true"    android:orientation="vertical">    <!-- 标题栏布局 -->    <RelativeLayout        android:id="@+id/title_lay"        android:layout_width="match_parent"        android:layout_height="?attr/actionBarSize">    </RelativeLayout>    <!-- 内容区布局 -->    <RelativeLayout        android:id="@+id/content_lay"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:background="#ffffff">    </RelativeLayout></LinearLayout>

效果就出来了

颜色状态栏

是不是感觉so easy呢? 下面我们来介绍终极boss【图片状态栏】,在网上应该也找不到资料。其实也不难,博主相信大家思考一下捣鼓捣鼓也能弄出来的。

分析:
假如UI给你的是一张大图,那么你也可以设置为根布局颜色,然后和上面的颜色状态栏操作相同。but假如UI给的只有头部的小图呢,当然不能通过这种方式设置了,所以这里博主只按小图来设计。

我们需要状态栏和标题栏背景连着,那么他们肯定是在一个layout里面,设置layout的背景即可;我们需要用到状态栏,肯定得插入状态栏;状态栏需要空出来,又得有背景,所以就不能采用fitsSystemWindows来空出,那么我们可为layout设置一个paddingTop或者add一个空的View占据状态栏即可。

  1. 设置window flags插入状态栏
  2. 设置titleLayout paddingTop
  3. 设置titleLayout 背景
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context="com.fv_mo.appbar.DrawableBarActivity">    <!-- 标题栏layout 必须设置android:gravity="center_vertical" -->    <RelativeLayout        android:id="@+id/title_layout"        android:layout_width="match_parent"        android:layout_height="?attr/actionBarSize"        android:gravity="center_vertical">        <TextView            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_centerInParent="true"            android:text="24小时热闻"            android:textSize="16sp" />    </RelativeLayout></RelativeLayout>
/** * 获取状态栏高度 * * @return */private int getStatusBarHeight() {    int resourceId = activity.getResources().getIdentifier("status_bar_height", "dimen", "android");    int result = 0;    if (resourceId > 0) {        result = activity.getResources().getDimensionPixelSize(resourceId);    }    return result;}
// 获取状态栏高度final int statusHeight = getStatusBarHeight();final ViewGroup group = (ViewGroup) parentView.getChildAt(0);final ViewGroup.LayoutParams layoutParams = group.getLayoutParams();// 4.4以后才进行处理if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {    // 重新计算ViewGroup高度    group.post(new Runnable() {        @Override        public void run() {            layoutParams.height = statusHeight + group.getHeight();        }    });    // 设置paddingTop占据状态栏    group.setPadding(0, statusHeight, 0, 0);}

至此,效果已经达到了预期想要的。

but,bug总是陪伴你左右,我们来看一下5.0的效果图

这里写图片描述

哟,状态栏咋不管用了呢,4.4和5.0以上设置windowTranslucentStatus效果是不一样的,那可不行啊,老大说必须得给我弄成一样的。从效果图来看titleLayout已经是插入状态栏了,只是状态栏有个半透明的背景盖住了。那简单啊,我们只要把状态栏的背景设为透明不就好吗

window.setStatusBarColor(Color.parseColor("#00000000"));

然并卵,还是一样的效果,查找资料呗,可以百度到windowTranslucentStatus通常是和windowTranslucentNavigation一起使用的,看一下通俗的解释

Android 从 4.4(KitKat) 开始提供了一个视觉上的提升,让最上方的状态栏 (Status Bar) 以及最下方的导航栏 (Navigation Bar) 可以被透明化,并让 APP 的内容可以往上下延伸,使整个画面的可被利用度大幅提升

就是说statusBar 代表头部,navigationBar代表尾部(好lou的理解啊)。
实验总是能告诉人们真理,经过几次调试,我发现只设置navigationBar在5.0以上的手机居然也可以插入状态栏(看来我对navigationBar的理解不是很合理,有知道的朋友告诉麻烦也我一下n(≧▽≦)n),更棒的是只设置navigationBar配合透明的状态栏居然哦了,兴奋ing,这个适配问题就解决咯。贴下完整设置状态栏的代码:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {    Window window = appBarUtil.activity.getWindow();    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {        window.setStatusBarColor(Color.parseColor("#00000000"));    } else {        // Translucent status bar        window.setFlags(                WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,                WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);    }    // Translucent navigation bar    window.setFlags(            WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION,            WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);}

能坚持看到这里的朋友给自己点个赞呗(博主语文经常不及格),是不是感觉已经要收工啦,哈哈,NO,这里博主还告诉你们个小秘密,设置了图片状态栏之后假如页面有EditText,是不是发现windowSoftInputMode无效啦,然后上网百度他们就会告诉你设置fitsSystemWindows为true就可以了,but,在这里你不能这样做,设置了fitsSystemWindows就表示要空出状态栏,不能啊,我就是需要把titleLayout插入状态栏实现图片状态栏的啊,是不是很郁闷呢,难道就不能使用图片状态栏了?NO,博主在这里也为你们找到了解决方案,贴一下这位仁兄的博客,特别感谢

http://blog.163.com/ittfxin@126/blog/static/11067486320162210549679/

需要自定义Layout重写fitSystemWindows方法就哦了,这里博主的基础不够,也没能看懂是怎么做到的,只是问题确实解决了。有朋友知道的也麻烦告诉我一下,谢谢!

以上就博主所知道的问题,如有发现其他问题,欢迎留言。

最后贴上代码地址

0 0