讓側(cè)邊欄被拉出的時候出現(xiàn)在狀態(tài)欄下面


title: 讓側(cè)邊欄被拉出的時候出現(xiàn)在狀態(tài)欄下面
date: 2016-11-09 10:33:27
tags: problems


  • 沉浸式狀態(tài)欄這個東西很多人都說過,4.4開始可以設(shè)置透明狀態(tài)欄了,5.0開始可以直接設(shè)置狀態(tài)欄顏色了,所以基本思路就是:5.0直接改就好了,4.4就是設(shè)置成透明的,然后在填充一個view放在狀態(tài)欄下面,基本代碼就是下面這樣了(摘自hongyang的博客)

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

/**
 * @author xzj
 * @date 2016/11/4
 */
public class StatusBarCompat {
    private static final int INVALID_VAL = -1;
    private static final int COLOR_DEFAULT = Color.parseColor("#20000000");

    /**
     * 狀態(tài)欄變色,那么5.0直接設(shè)置,4.4設(shè)置狀態(tài)欄透明后,給decorView設(shè)置一個有顏色的view填充進(jìn)去
     * @param activity ...控制的activity
     * @param statusColor 狀態(tài)欄的顏色
     */
    public static void compat(Activity activity, int statusColor) {
        //5.0以上可以直接設(shè)置狀態(tài)欄顏色
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ) {
            if (statusColor != INVALID_VAL) {
                activity.getWindow().setStatusBarColor(statusColor);
            }
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
            //4.4以上要設(shè)置狀態(tài)欄透明
            setTranslucentStatus(activity);
            int color = COLOR_DEFAULT;
            if (statusColor != INVALID_VAL) {
                color = statusColor;
            }
            //在給整個頁面頂端設(shè)置一個有顏色的色塊
            View statusBarView = new View(activity);
            ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                    getStatusBarHeight(activity));
            statusBarView.setBackgroundColor(color);
            ViewGroup contentView = (ViewGroup) activity.findViewById(android.R.id.content);
            contentView.addView(statusBarView, lp);
            // 設(shè)置Activity layout的fitsSystemWindows
            View contentChild = contentView.getChildAt(0);
            contentChild.setFitsSystemWindows(true);
        }
    }

    /**
     * 設(shè)置一個透明的黑色狀態(tài)欄
     * */
    public static void compat(Activity activity) {
        compat(activity, INVALID_VAL);
    }

    public static void setTranslucentStatus(Activity activity) {
        Window win = activity.getWindow();
        WindowManager.LayoutParams winParams = win.getAttributes();
        final int bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
        if ((winParams.flags & bits) == 0) {
            winParams.flags |= bits;
            win.setAttributes(winParams);
        }
        win.setAttributes(winParams);
    }

    public static int getStatusBarHeight(Activity activity) {
        int result = 0;
        int resourceId = activity.getResources().getIdentifier("status_bar_height", "dimen", "android");
        if (resourceId > 0) {
            result = activity.getResources().getDimensionPixelSize(resourceId);
        }
        return result;
    }
}

但是我現(xiàn)在的需求是這樣,

平時狀態(tài)欄是一種顏色,側(cè)邊欄拉出來的時候,狀態(tài)欄也要變色。

這里先說一個tips,如果設(shè)置了狀態(tài)欄透明的話,要給布局加上fitSystemWindows=true,預(yù)留一個狀態(tài)欄的位置,否則布局頂端就會出現(xiàn)在狀態(tài)欄下面,這本來是一個麻煩的東西,但是!為了實現(xiàn)我的需求,可以利用這一點。

  1. 只要4.4之上就調(diào)用上面的setTranslucentStatus()方法,這樣布局就會從狀態(tài)欄下面開始繪制,那么我們的drawerLayout的側(cè)邊欄頂端也自然會顯示在狀態(tài)欄下面啦

  2. 在布局頂端放一個view,寬度就match_parent就好,高度通過getStatusBarHeight(this)獲取然后設(shè)置給這個view

  3. 代碼大致就是下面這樣,placeHolder就是布局頂端的那個view了

    StatusBarCompat.setTranslucentStatus(this);
    ViewGroup.LayoutParams params = placeHolder.getLayoutParams();
    params.height = StatusBarCompat.getStatusBarHeight(this);
    placeHolder.setLayoutParams(params);
    

    ?

而只有主頁有側(cè)邊欄,需要這么做,其他的activity都可以繼承自baseActivity,在baseActivity里設(shè)置一句

StatusBarCompat.compat(this,getResources().getColor(R.color.status_bar_color));就好了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容