一篇文章看懂安卓狀態列各種樣式

ciscopuke發表於2021-09-09

安卓狀態列大家都不陌生了,但是冷不丁一尋思還真是挺亂的,各種效果各種實現方式,不同版本實現方式不同巴拉巴拉...

這裡做個總結,致力於實用性,也許是很良心的安卓狀態列總結了...

我不想說什麼沉浸式還是什麼有爭議的東西,以下效果均配備了高畫質無碼大圖為證

透過本文,我想你可以明白

  1. 全屏(隱藏狀態列)

  2. 狀態列透明

  3. 狀態列變色

這麼幾種效果的實現方式

那寶寶要開始啦~

以下實現均建立在4.4版本之上,4.4以下如果老闆非讓你相容,你就給他一大嘴巴子

全屏

全屏的實現方式很多,這裡給出一個

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);

你把它放在setContentView之前之後都行,4.4 ~ 7.0 測試通用

正常狀態

在狀態列透明和著色之前,給大家看一下 4.4 版本和 5.0+ 版本的狀態列在什麼程式碼都不加的正常情況下分別是什麼樣子的

注意 標題欄統一用的 ToolBar,如果你老闆非讓你用 ActionBar,你就給他一大嘴巴子

4.4 版本如下,狀態列顏色預設是 寡婦黑

圖片描述

4.4 版本正常情況

5.0+ 版本如下,狀態列顏色預設是 colorprimarydark二逼藍

圖片描述

5.0+ 版本正常情況

好了,正常的見到了,該見點不正常的了,人齊開車

狀態列透明

5.0+ 版本

提到透明,第一印象就是這個 true
你在 style 中把它加上去,效果這樣的:

圖片描述

啊啊啊,頭上的狀態列掉下來了

true
按我的理解就是透明,而且不佔空間,那麼到這裡就可以了,所以你需要
android:fitsSystemWindows="true"
來幫忙,這句話的意思是,設定該屬性的 view 會調整 padding 來給 狀態列留出空間,說的,我也不知道真假

那麼注意啦,如果你把android:fitsSystemWindows="true"加到根佈局上去,就會變成這樣:

圖片描述

我變灰了?!

嘿嘿,雖然狀態列看上去灰灰的,其實他是透明的~

你應該把android:fitsSystemWindows="true"放在 ToolBar 的佈局上,看:

圖片描述

完美的MD風格啊

4.4 版本

書接上文,如果你只設定 true 效果是這樣的:

圖片描述

我有陰影耶

這個漸變的陰影...我反倒覺得挺吃藕的

跟之前的原理一樣,我們在根佈局加上android:fitsSystemWindows="true"

圖片描述

噯這個人,明知道錯還...

看看效果,變成了如此巨醜的顏色!!!

我們把android:fitsSystemWindows="true"加到 ToolBar 上去:

圖片描述

哼,終於到我上場了

這回狀態列不是像 5.0+ 中比 ToolBar 顏色稍微深一點的 MD 風格了,而是完全的和 ToolBar 一個顏色外加漸變。谷歌這幫鬼佬是有多喜歡漸變...

當透明狀態列碰到 DrawerLayout

這個官方的抽屜控制元件碰到了透明導航欄,一樣的設定:

  1. style 設定 true

  2. ToolBar 新增android:fitsSystemWindows="true"

4.4 版本效果如下

圖片描述

4.4的導航抽屜

5.0+ 版本效果如下

圖片描述

5.0+的導航抽屜

狀態列著色

這裡的著色就是指狀態列用純色填充

5.0+ 版本

5.0 以上,利用現成的方法 getWindow().setStatusBarColor(Color.GREEN);來設定就可以啦,上圖

圖片描述

變變變

4.4 版本

4.4 版本並沒有直接操控狀態列方法,因此,這裡直接照搬  的方法

package com.zhy.colorfulstatusbar;import android.annotation.TargetApi;import android.app.Activity;import android.content.Context;import android.graphics.Color;import android.os.Build;import android.view.View;import android.view.ViewGroup;/**
 * Created by zhy on 15/9/21.
 */public class StatusBarCompat{    private static final int INVALID_VAL = -1;    private static final int COLOR_DEFAULT = Color.parseColor("#20000000");    @TargetApi(Build.VERSION_CODES.LOLLIPOP)    public static void compat(Activity activity, int statusColor)
    {        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
        {            if (statusColor != INVALID_VAL)
            {
                activity.getWindow().setStatusBarColor(statusColor);
            }            return;
        }        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && Build.VERSION.SDK_INT  0)
        {
            result = context.getResources().getDimensionPixelSize(resourceId);
        }        return result;
    }
}

這個檔案說白了就是用一個高度和狀態列高度一樣的 view 去覆蓋住狀態列,該 view 的背景色就是我們設定的顏色

activity 中呼叫如下:
StatusBarCompat.compat(this, getResources().getColor(R.color.status_bar_color));

注意啦,使用該方法的前提是

  1. style 設定 true

  2. ToolBar 新增android:fitsSystemWindows="true"

別忘了呀

總結

除了上述這幾種,肯定還有別的效果(鬼知道客戶腦洞有多大),希望大家有別的效果可以分享下,擁抱開源,改變世界!本文也會再有新的方案或技巧時持續更新~麼麼


2017/05/07  更新

如果你在安卓 5.0 以上也想實現 4.4 那種效果 ( 類似網易雲音樂 ) ,新增如下程式碼

getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
getWindow().setStatusBarColor(Color.TRANSPARENT);```

Demo 效果如下(狀態列完全透明):

![網易雲音樂 5.0+ DrawerLayout 效果](http://upload-images.jianshu.io/upload_images/4957926-a504d10c057fe2bb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

         

作者:一杯劉

連結:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4369/viewspace-2802913/,如需轉載,請註明出處,否則將追究法律責任。

相關文章