沉浸狀態欄的實現

關於沉浸狀態欄最佳實現實例
博主自己經過了多個demo的經驗,遇到許多坑,也踩過許多坑,用過了以前一個開源庫systembartint,可自行百度,此處就不講如何使用了。摸索到現在,現在終於可以總結一下了現在我開始着重講解安卓版本4.4以後可用兩種方法去設置沉浸狀態欄。

api版本4.4~5.0 之間的沉浸狀態欄是隻支持半透明的;博主之前因爲用的4.4的模擬器來測試的,也用博主自己的華爲手機試過(不是華爲手機自身的),一直想解決這個問題,無果;
api5.0(lolipop)之後的沉浸浸透狀態欄的實現就變簡單了,後面會講解到;

在看代碼之前,我們先了解一下谷歌公司給我們提供的各種默認屬性的樣式
這裏寫圖片描述

下面這個是窗口的大致視圖
這裏寫圖片描述
1.在代碼裏面添加實現

//通過設置全屏達到一體化效果,但是看不到狀態信息
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);//設置全屏
//設置導航欄透明
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
getWindow().requestFeature(Window.FEATURE_NO_TITLE);//設置爲無標題欄

2.更詳細的實現,其實就是先把原來已經有的flag清除掉,然後重新設置在DecorView上面就能夠實現沉浸狀態欄了

        //API LEVEL>5.0
        if(VERSION.SDK_INT >= 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);  
        }  

        //通過設置狀態欄透明實現一體化效果,但是會出現漸變效果,4.4
        if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.KITKAT){
        //設置沉浸狀態欄
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
           //設置導航欄透明
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
       }

        //設置狀態欄的字體模式 設置爲黑字
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
           getWindow().getDecorView().setSystemUiVisibility(
        View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN| View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
        }

以上代碼可以將他封裝成一個類裏面的方法隨便調用,如下;如果需要動態設置狀態欄的顏色可以先通過
getWindow()方法獲取window然後再通過setStatusBarColor(Color.RED)去實現,導航欄同樣實現

package com.yqq.touchtest;

import android.annotation.TargetApi;
import android.app.Activity;
import android.graphics.Color;
import android.os.Build;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;

/**
 * 設置沉浸狀態欄的工具類
 * @author yqq
 *
 */
public class TranslucentStatusSetting {


    public static void setTranslucentStatusSetting(Activity context){
        context.getWindow().requestFeature(Window.FEATURE_NO_TITLE);//設置爲無標題欄
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT&&Build.VERSION.SDK_INT<Build.VERSION_CODES.LOLLIPOP) {
            setTranslucentStatus(true,context);
            //設置沉浸狀態欄
            context.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
           //設置導航欄透明
            context.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
        }

                //API LEVEL>5.0
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            Window window = context.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);
        }

        //設置狀態欄的字體模式 設置爲黑字
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
           context.getWindow().getDecorView().setSystemUiVisibility(
        View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN| View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
        }

    }

    @TargetApi(19)
    private static void setTranslucentStatus(boolean on,Activity context) {
        Window win = context.getWindow();
        WindowManager.LayoutParams winParams = win.getAttributes();
        final int bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
        if (on) {
            winParams.flags |= bits;
        } else {
            winParams.flags &= ~bits;
        }
        win.setAttributes(winParams);
    }
}
這裏寫代碼片

在res-values-v21文件夾的styles.xml文件中添加相關的屬性,因爲我這裏用的material主題是5.0以後出現的,如果5.0以前需要用的話就需要添加support-v21支持庫;
我們在自定義樣式的時候大概就是根據上面的圖片完成我們基本的需求
爲了兼容api19 res-values文件夾下面也要有一個styles.xml文件

<resources>
    <!-- Base application theme. -->
    <style name="AppTheme" parent="android:Theme.Material.Light">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:statusBarColor">@color/skyblue</item>
        <item name="android:navigationBarColor">@color/transparent</item>
        <item name="android:navigationMode">listMode</item>
    </style>
</resources>

實例圖片

測試效果圖

開發中一些相關的小收穫希望能幫到大家
官方在Android6.0中提供了亮色狀態欄模式(就是改變字體的顏色從白字變成灰黑色字),配置很簡單:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    activity.getWindow().getDecorView().setSystemUiVisibility( 
    View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN|
    View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);  
}

或者在style屬性中加上

<item name="android:windowLightStatusBar">true</item>

values文件夾具有覆蓋性質,根據當前安裝次應用的手機的系統版本匹配不同的values配置文件夾。例如如果手機是andorid6.0(M),這樣的話就會自動匹配values-23,如果,無values-23則找res目錄下最大的一個進行匹配。基本的原則是匹配最新版本號

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章