Android沉浸式狀態欄適配

沉浸式狀態欄效果圖
沉浸式狀態欄效果圖

1.自定義Toolbar

Toolbar雖然也提供了setTitle()等一些相應的方法,但都不是自己想要的樣式。這裏先創建一個layout用作Toolbar內容視圖。

  • Toolbar內容視圖layout_common_toolbar.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:toolbar="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <android.support.v7.widget.Toolbar
        android:id="@+id/common_toolbar"
        android:layout_width="match_parent"
        android:layout_height="45dp"
        android:background="?attr/colorPrimary"
        android:fitsSystemWindows="true"
        android:minHeight="?attr/actionBarSize"
        toolbar:contentInsetLeft="0dp"
        toolbar:contentInsetStart="0dp">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <RelativeLayout
                android:id="@+id/common_toolbar_center_container"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_centerInParent="true">

                <TextView
                    android:id="@+id/common_toolbar_center_text"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_centerInParent="true"
                    android:text="標題"
                    android:textColor="#000000"
                    android:textSize="14sp" />
            </RelativeLayout>

            <RelativeLayout
                android:id="@+id/common_toolbar_left_container"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_alignParentLeft="true"
                android:paddingLeft="15dp"
                android:paddingRight="15dp">

                <ImageView
                    android:id="@+id/common_toolbar_left_image"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_centerVertical="true"
                    android:src="@mipmap/icon_toolbar_back" />

                <TextView
                    android:id="@+id/common_toolbar_left_text"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_centerVertical="true"
                    android:layout_toRightOf="@id/common_toolbar_left_image"
                    android:includeFontPadding="false"
                    android:text="返回"
                    android:textColor="#000000"
                    android:textSize="14sp" />
            </RelativeLayout>

            <RelativeLayout
                android:id="@+id/common_toolbar_right_container"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_alignParentRight="true"
                android:paddingLeft="15dp"
                android:paddingRight="15dp">

                <TextView
                    android:id="@+id/common_toolbar_right_text"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_centerVertical="true"
                    android:includeFontPadding="false"
                    android:text="完成"
                    android:textColor="#000000"
                    android:textSize="14sp" />

                <ImageView
                    android:id="@+id/common_toolbar_right_image"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_centerVertical="true" />
            </RelativeLayout>
        </RelativeLayout>
    </android.support.v7.widget.Toolbar>

    <View
        android:id="@+id/common_toolbar_split_line"
        android:layout_width="match_parent"
        android:layout_height="@dimen/line_size"
        android:background="@color/line_color" />
</LinearLayout>
  • 自定義Toolbar,代碼如下:
package com.common.basis.widget;

import android.app.Activity;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.support.annotation.Nullable;
import android.support.v7.widget.Toolbar;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.common.basis.R;

/**
 * 作者:蒙景博
 * 時間:2017/4/23
 * 描述:公共狀態欄
 */
public class CommonToolbar extends LinearLayout {

    protected Context mContext;
    protected Toolbar mToolbar;
    // 左側按鈕文本相關配置
    protected String leftText;
    protected float leftTextSize;
    protected int leftTextColor;
    protected int leftIconResource;
    protected int leftIconBackgroundResource;
    protected RelativeLayout mRightContainer;
    protected TextView mLeftText;
    protected ImageView mLeftIcon;
    protected boolean leftIconState; // true顯示,false隱藏
    // 中間標題相關配置
    protected String titleText;
    protected float titleTextSize;
    protected int titleTextColor;
    protected RelativeLayout mCenterContainer;
    protected TextView mTitleText;
    // 右側按鈕文本相關配置
    protected String rightText;
    protected float rightTextSize;
    protected int rightTextColor;
    protected int rightIconResource;
    protected int rightIconBackgroundResource;
    protected RelativeLayout mLeftContainer;
    protected TextView mRightText;
    protected ImageView mRightImage;
    //分割線
    protected View mSplitLine;

    public CommonToolbar(Context context) {
        this(context, null);
    }

    public CommonToolbar(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public CommonToolbar(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initViewAttribute(context, attrs);
    }

    /**
     * 初始化Toolbar屬性
     *
     * @param context
     * @param attrs
     */
    private void initViewAttribute(Context context, AttributeSet attrs) {
        this.mContext = context;
        inflate(context, R.layout.layout_common_toolbar, this);
        mToolbar = (Toolbar) findViewById(R.id.common_toolbar);
        mLeftContainer = (RelativeLayout) findViewById(R.id.common_toolbar_left_container);
        mCenterContainer = (RelativeLayout) findViewById(R.id.common_toolbar_center_container);
        mRightContainer = (RelativeLayout) findViewById(R.id.common_toolbar_right_container);
        mLeftText = (TextView) findViewById(R.id.common_toolbar_left_text);
        mTitleText = (TextView) findViewById(R.id.common_toolbar_center_text);
        mRightText = (TextView) findViewById(R.id.common_toolbar_right_text);
        mLeftIcon = (ImageView) findViewById(R.id.common_toolbar_left_image);
        mRightImage = (ImageView) findViewById(R.id.common_toolbar_right_image);
        mSplitLine = findViewById(R.id.common_toolbar_split_line);

        TypedArray mArray = context.obtainStyledAttributes(attrs, R.styleable.CommonToolbar);
        try {
            leftIconState = mArray.getBoolean(R.styleable.CommonToolbar_leftIconState, true);
            leftText = mArray.getString(R.styleable.CommonToolbar_leftText);
            leftTextSize = mArray.getDimension(R.styleable.CommonToolbar_leftTextSize, getTypedValue(context, 14, false));
            leftTextColor = mArray.getColor(R.styleable.CommonToolbar_leftTextColor, Color.parseColor("#000000"));
            leftIconResource = mArray.getResourceId(R.styleable.CommonToolbar_leftIconResource, 0);
            leftIconBackgroundResource = mArray.getResourceId(R.styleable.CommonToolbar_leftIconBackgroundResource, 0);

            titleText = mArray.getString(R.styleable.CommonToolbar_titleText);
            titleTextSize = mArray.getDimension(R.styleable.CommonToolbar_titleTextSize, getTypedValue(context, 14, false));
            titleTextColor = mArray.getColor(R.styleable.CommonToolbar_titleTextColor, Color.parseColor("#000000"));

            rightText = mArray.getString(R.styleable.CommonToolbar_rightText);
            rightTextSize = mArray.getDimension(R.styleable.CommonToolbar_rightTextSize, getTypedValue(context, 14, false));
            rightTextColor = mArray.getColor(R.styleable.CommonToolbar_rightTextColor, Color.parseColor("#000000"));
            rightIconResource = mArray.getResourceId(R.styleable.CommonToolbar_rightIconResource, 0);
            rightIconBackgroundResource = mArray.getResourceId(R.styleable.CommonToolbar_rightIconBackgroundResource, 0);
        } finally {
            mArray.recycle();
        }

        // left text
        if (!TextUtils.isEmpty(leftText)) {
            mLeftText.setText(leftText);
        } else {
            mLeftText.setVisibility(View.INVISIBLE);
        }
        mLeftText.setTextSize(getTypedValue(context, leftTextSize, true));
        if (leftTextColor != 0) {
            mLeftText.setTextColor(leftTextColor);
        }
        if (leftIconState) {
            mLeftIcon.setVisibility(View.VISIBLE);
            if (leftIconResource != 0) {
                mLeftIcon.setImageResource(leftIconResource);
            }
            if (leftIconBackgroundResource != 0) {
                mLeftIcon.setBackgroundResource(leftIconBackgroundResource);
            }
        } else {
            mLeftIcon.setVisibility(View.GONE);
        }

        // title text
        if (!TextUtils.isEmpty(titleText)) {
            mTitleText.setText(titleText);
        } else {
            mTitleText.setVisibility(View.INVISIBLE);
        }
        mTitleText.setTextSize(getTypedValue(context, titleTextSize, true));
        if (titleTextColor != 0) {
            mTitleText.setTextColor(titleTextColor);
        }

        // right text
        if (!TextUtils.isEmpty(rightText)) {
            mRightText.setText(rightText);
        } else {
            mRightText.setVisibility(View.GONE);
        }
        mRightText.setTextSize(getTypedValue(context, rightTextSize, true));
        if (rightTextColor != 0) {
            mRightText.setTextColor(rightTextColor);
        }
        if (rightIconResource != 0) {
            mRightImage.setImageResource(rightIconResource);
        }
        if (rightIconBackgroundResource != 0) {
            mRightImage.setBackgroundResource(rightIconBackgroundResource);
        }
    }

    public boolean isLeftIconState() {
        return leftIconState;
    }

    public void setLeftIconState(boolean leftIconState) {
        if (leftIconState) {
            mLeftIcon.setVisibility(View.VISIBLE);
        } else {
            mLeftIcon.setVisibility(View.GONE);
        }
    }

    public Toolbar getToolbar() {
        return mToolbar;
    }

    public TextView getLeftText() {
        return mLeftText;
    }

    /**
     * 設置標題左側字體Text
     *
     * @param leftText
     */
    public void setLeftText(String leftText) {
        if (mLeftText.getVisibility() == View.INVISIBLE) {
            mLeftText.setVisibility(View.VISIBLE);
        }
        mLeftText.setText(leftText);
    }

    public ImageView getLeftImage() {
        return mLeftIcon;
    }

    public TextView getTitleText() {
        return mTitleText;
    }

    /**
     * 設置標題中間字體Text
     *
     * @param titleText
     */
    public void setTitleText(String titleText) {
        if (mTitleText.getVisibility() == View.INVISIBLE) {
            mTitleText.setVisibility(View.VISIBLE);
        }
        mTitleText.setText(titleText);
    }

    public TextView getRightText() {
        return mRightText;
    }

    /**
     * 設置標題右側字體Text
     *
     * @param rightText
     */
    public void setRightText(String rightText) {
        if (mRightText.getVisibility() == View.GONE) {
            mRightText.setVisibility(View.VISIBLE);
        }
        mRightText.setText(rightText);
    }

    public ImageView getRightImage() {
        return mRightImage;
    }

    public RelativeLayout getLeftContainer() {
        return mLeftContainer;
    }

    public RelativeLayout getCenterContainer() {
        return mCenterContainer;
    }

    public RelativeLayout getRightContainer() {
        return mRightContainer;
    }

    /**
     * 爲標題欄背景設置一個Drawable
     *
     * @param background
     */
    public void setTitleBackground(Drawable background) {
        mToolbar.setBackgroundDrawable(background);
    }

    /**
     * 爲標題欄背景設置一個Color
     *
     * @param color
     */
    public void setTitleBackgroundColor(int color) {
        mToolbar.setBackgroundColor(getResources().getColor(color));
    }

    /**
     * 爲標題欄背景設置一個Resource
     *
     * @param resid
     */
    public void setTitleBackgroundResource(int resid) {
        mToolbar.setBackgroundResource(resid);
    }

    /**
     * 設置標題左側字體Size
     *
     * @param leftTextSize
     */
    public void setLeftTextSize(int leftTextSize) {
        mLeftText.setTextSize(leftTextSize);
    }

    /**
     * 設置標題左側字體Color
     *
     * @param leftTextColor
     */
    public void setLeftTextColor(int leftTextColor) {
        mLeftText.setTextColor(leftTextColor);
    }

    /**
     * 爲標題左側圖片設置一個Resource
     *
     * @param resId
     */
    public void setLeftIcon(int resId) {
        mLeftIcon.setImageResource(resId);
    }

    /**
     * 設置左側圖片背景設置一個Resource
     *
     * @param resId
     */
    public void setLeftIconBackgroundResource(int resId) {
        mLeftIcon.setBackgroundResource(resId);
    }

    /**
     * 設置標題中間字體Size
     *
     * @param titleTextSize
     */
    public void setTitleTextSize(int titleTextSize) {
        mTitleText.setTextSize(titleTextSize);
    }

    /**
     * 設置標題中間字體Color
     *
     * @param titleTextColor
     */
    public void setTitleTextColor(int titleTextColor) {
        mTitleText.setTextColor(titleTextColor);
    }

    /**
     * 設置標題右側字體Size
     *
     * @param rightTextSize
     */
    public void setRightTextSize(int rightTextSize) {
        mRightText.setTextSize(rightTextSize);
    }

    /**
     * 設置標題右側字體Color
     *
     * @param rightTextColor
     */
    public void setRightTextColor(int rightTextColor) {
        mRightText.setTextColor(rightTextColor);
    }

    /**
     * 爲標題左側圖片設置一個Resource
     *
     * @param resId
     */
    public void setRightIcon(int resId) {
        mRightImage.setImageResource(resId);
    }

    /**
     * 設置左側圖片背景設置一個Resource
     *
     * @param resId
     */
    public void setRightIconBackgroundResource(int resId) {
        mRightImage.setBackgroundResource(resId);
    }

    /**
     * 設置左側按鈕點擊事件
     *
     * @param listener
     */
    public void setLeftOnClickListener(OnClickListener listener) {
        mLeftContainer.setOnClickListener(listener);
    }

    /**
     * 設置點擊左側按鈕時結束當前Activity或者Fragment
     *
     * @param activity
     */
    public void setLeftFinishActivity(final Activity activity) {
        if (activity == null)
            return;
        mLeftContainer.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                activity.finish();
            }
        });
    }

    /**
     * 設置右側按鈕點擊事件
     *
     * @param listener
     */
    public void setRightOnClickListener(OnClickListener listener) {
        mRightContainer.setOnClickListener(listener);
    }

    /**
     * 添加一個layout在左側標題的layout上
     *
     * @param layoutId
     */
    public void addLeftView(int layoutId) {
        if (layoutId == 0 && mLeftContainer == null)
            return;
        mLeftContainer.removeAllViews();
        mLeftContainer.addView(LayoutInflater.from(mContext).inflate(layoutId, null));
    }

    /**
     * 添加一個View在左側標題的layout上
     *
     * @param view
     */
    public void addLeftView(View view) {
        if (view == null && mLeftContainer == null)
            return;
        mLeftContainer.removeAllViews();
        mLeftContainer.addView(view);
    }

    public void setLeftViewGravity(int gravity) {
        mLeftContainer.setGravity(gravity);
    }

    /**
     * 添加一個layout在中間標題的layout上
     *
     * @param layoutId
     */
    public void addTitleView(int layoutId) {
        if (layoutId == 0 && mCenterContainer == null)
            return;
        mCenterContainer.removeAllViews();
        mCenterContainer.addView(LayoutInflater.from(mContext).inflate(layoutId, null));
    }

    /**
     * 添加一個View在中間標題的layout上
     *
     * @param view
     */
    public void addTitleView(View view) {
        if (view == null && mCenterContainer == null)
            return;
        mCenterContainer.removeAllViews();
        mCenterContainer.addView(view);
    }

    public void setTitleViewGravity(int gravity) {
        mCenterContainer.setGravity(gravity);
    }

    /**
     * 添加一個layout在右側標題的layout上
     *
     * @param layoutId
     */
    public void addRightView(int layoutId) {
        if (layoutId == 0 && mRightContainer == null)
            return;
        mRightContainer.removeAllViews();
        mRightContainer.addView(LayoutInflater.from(mContext).inflate(layoutId, null));
    }

    /**
     * 添加一個View在右側標題的layout上
     *
     * @param view
     */
    public void addRightView(View view) {
        if (view == null && mRightContainer == null)
            return;
        mRightContainer.removeAllViews();
        mRightContainer.addView(view);
    }

    public void setRightViewGravity(int gravity) {
        mRightContainer.setGravity(gravity);
    }

    public void setSplitLineVisibile(boolean visibile) {
        if (visibile) {
            mSplitLine.setVisibility(View.VISIBLE);
        } else {
            mSplitLine.setVisibility(View.GONE);
        }
    }

    private int getTypedValue(Context context, float value, boolean convertType) {
        final float scale = context.getResources().getDisplayMetrics().density;
        if (convertType) {
            return (int) (value / scale + 0.5f);
        } else {
            return (int) (value * scale + 0.5f);
        }
    }
}
  • 自定義相關屬性:
    <!--自定義Toolbar相關屬性-->
    <declare-styleable name="CommonToolbar">
        <!--left-->
        <!--左側Icon true顯示,false隱藏-->
        <attr name="leftIconState" format="boolean" />
        <attr name="leftText" format="string|reference" />
        <attr name="leftTextColor" format="color" />
        <attr name="leftTextSize" format="dimension|integer|reference" />
        <attr name="leftIconResource" format="reference" />
        <attr name="leftIconBackgroundResource" format="reference" />
        <!--center-->
        <attr name="titleText" format="string|reference" />
        <attr name="titleTextColor" format="color" />
        <attr name="titleTextSize" format="dimension|integer|reference" />
        <!--right-->
        <attr name="rightText" format="string|reference" />
        <attr name="rightTextColor" format="color" />
        <attr name="rightTextSize" format="dimension|integer|reference" />
        <attr name="rightIconResource" format="reference" />
        <attr name="rightIconBackgroundResource" format="reference" />
    </declare-styleable>
  • 自定義Activity主題,根據需求可自行擴展:
    <!--application default base theme-->
    <style name="AppTheme.Base" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="windowNoTitle">true</item>
        <item name="windowActionBar">false</item>
        <!--android:windowDisablePreview Activity啓動性能優化-->
        <item name="android:windowDisablePreview">true</item>
    </style>

    <!--默認主題主題-->
    <style name="AppTheme.Default" parent="AppTheme.Base">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    </style>

    <!--擴展純白色背景主題-->
    <style name="AppTheme.White" parent="AppTheme.Base">
        <item name="colorPrimary">@android:color/white</item>
        <item name="colorPrimaryDark">@android:color/white</item>
    </style>

    <!--擴展純黃色背景主題-->
    <style name="AppTheme.Yellow" parent="AppTheme.Base">
        <item name="colorPrimary">@color/yellow</item>
        <item name="colorPrimaryDark">@color/yellow</item>
    </style>

2.ImmersiveStatusBar類,給Windonw添加不同的Flag展現出不同的樣式。

package com.common.utils;

import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.os.Build;
import android.support.annotation.ColorInt;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.FrameLayout;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * 作者:秦川小將
 * 描述:沉浸式狀態欄
 */
public class ImmersiveStatusBar{

    private Activity mActivity;

    public ImmersiveStatusBar(Activity activity) {
        this.mActivity = activity;
    }

    /**
     * @param color 顏色
     */
    @TargetApi(Build.VERSION_CODES.KITKAT)
    public void setColorBar(@ColorInt int color) {
        setColorBar(color, 0);
    }

    /**
     * @param color 顏色
     * @param alpha 透明度
     */
    @TargetApi(Build.VERSION_CODES.KITKAT)
    public void setColorBar(@ColorInt int color, int alpha) {
        setColorBar(color, alpha, false);
    }

    /**
     * @param color                    顏色
     * @param isTransformNavigationBar 是否改變導航欄顏色
     */
    @TargetApi(Build.VERSION_CODES.KITKAT)
    public void setColorBar(@ColorInt int color, boolean isTransformNavigationBar) {
        setColorBar(color, 0, isTransformNavigationBar);
    }

    /**
     * @param color                    顏色
     * @param alpha                    透明度
     * @param isTransformNavigationBar 是否改變導航欄顏色
     */
    @TargetApi(Build.VERSION_CODES.KITKAT)
    public void setColorBar(@ColorInt int color, int alpha, boolean isTransformNavigationBar) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            Window window = mActivity.getWindow();
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
            int alphaColor = alpha == 0 ? color : calculateColor(color, alpha);
            window.setStatusBarColor(alphaColor);
            if (isTransformNavigationBar) {
                window.setNavigationBarColor(alphaColor);
            }
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            Window window = mActivity.getWindow();
            window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            int alphaColor = alpha == 0 ? color : calculateColor(color, alpha);
            ViewGroup decorView = (ViewGroup) window.getDecorView();
            decorView.addView(createStatusBarView(mActivity, alphaColor));
            if (navigationBarExist(mActivity) && isTransformNavigationBar) {
                decorView.addView(createNavigationBarView(mActivity, alphaColor));
                window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
            }
            setRootView(mActivity, true);
        }
    }

    /**
     * @param color 顏色
     */
    @TargetApi(Build.VERSION_CODES.KITKAT)
    public void setColorBarForDrawer(@ColorInt int color) {
        setColorBarForDrawer(color, 0);
    }

    /**
     * @param color 顏色
     * @param alpha 透明度
     */
    @TargetApi(Build.VERSION_CODES.KITKAT)
    public void setColorBarForDrawer(@ColorInt int color, int alpha) {
        setColorBarForDrawer(color, alpha, false);
    }

    /**
     * @param color                    顏色
     * @param isTransformNavigationBar 是否改變導航欄顏色
     */
    @TargetApi(Build.VERSION_CODES.KITKAT)
    public void setColorBarForDrawer(@ColorInt int color, boolean isTransformNavigationBar) {
        setColorBarForDrawer(color, 0, isTransformNavigationBar);
    }

    /**
     * @param color                    顏色
     * @param alpha                    透明度
     * @param isTransformNavigationBar 是否改變導航欄顏色
     */
    @TargetApi(Build.VERSION_CODES.KITKAT)
    public void setColorBarForDrawer(@ColorInt int color, int alpha, boolean isTransformNavigationBar) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            Window window = mActivity.getWindow();
            ViewGroup decorView = (ViewGroup) window.getDecorView();
            int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
            if (navigationBarExist(mActivity)) {
                option = option | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;
            }
            decorView.setSystemUiVisibility(option);
            window.setStatusBarColor(Color.TRANSPARENT);
            if (isTransformNavigationBar) {
                window.setNavigationBarColor(Color.TRANSPARENT);
            }
            int alphaColor = alpha == 0 ? color : calculateColor(color, alpha);
            decorView.addView(createStatusBarView(mActivity, alphaColor), 0);
            if (navigationBarExist(mActivity) && isTransformNavigationBar) {
                decorView.addView(createNavigationBarView(mActivity, alphaColor), 1);
            }
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            Window window = mActivity.getWindow();
            window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            ViewGroup decorView = (ViewGroup) window.getDecorView();
            int alphaColor = alpha == 0 ? color : calculateColor(color, alpha);
            decorView.addView(createStatusBarView(mActivity, alphaColor), 0);
            if (navigationBarExist(mActivity) && isTransformNavigationBar) {
                window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
                decorView.addView(createNavigationBarView(mActivity, alphaColor), 1);
            }
        }
    }

    /**
     * 設置狀態欄文本和圖標顏色(黑,白)
     *
     * @param isChangeColor 是否改變顏色 true:黑色 false:白色
     */
    @TargetApi(Build.VERSION_CODES.KITKAT)
    public void setStatusTextAndIconColor(boolean isChangeColor) {
        // 6.0以及6.0以上狀態欄字體變色
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && isChangeColor) {
            if (isMIUI()) {
                setMiuiStatusBarDarkMode(mActivity, isChangeColor);
            } else {
                Window window = mActivity.getWindow();
                window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
            }
        }
    }

    @TargetApi(Build.VERSION_CODES.KITKAT)
    public void setImmersionBar() {
        setTransparentBar(Color.TRANSPARENT);
    }

    /**
     * @param color 顏色
     */
    @TargetApi(Build.VERSION_CODES.KITKAT)
    public void setTransparentBar(@ColorInt int color) {
        setTransparentBar(color, 0);
    }

    /**
     * @param color 顏色
     * @param alpha 透明度
     */
    @TargetApi(Build.VERSION_CODES.KITKAT)
    public void setTransparentBar(@ColorInt int color, int alpha) {
        setTransparentBar(color, alpha, false);
    }

    /**
     * @param color                    顏色
     * @param isTransformNavigationBar 是否改變導航欄顏色
     */
    @TargetApi(Build.VERSION_CODES.KITKAT)
    public void setTransparentBar(@ColorInt int color, boolean isTransformNavigationBar) {
        setTransparentBar(color, 0, isTransformNavigationBar);
    }

    /**
     * @param color                    顏色
     * @param alpha                    透明度
     * @param isTransformNavigationBar 是否改變導航欄顏色
     */
    @TargetApi(Build.VERSION_CODES.KITKAT)
    public void setTransparentBar(@ColorInt int color, int alpha, boolean isTransformNavigationBar) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            Window window = mActivity.getWindow();
            View decorView = window.getDecorView();
            int option = View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
            decorView.setSystemUiVisibility(option);
            int finalColor = alpha == 0 ? Color.TRANSPARENT :
                    Color.argb(alpha, Color.red(color), Color.green(color), Color.blue(color));
            window.setStatusBarColor(finalColor);
            if (isTransformNavigationBar) {
                window.setNavigationBarColor(finalColor);
            }
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            Window window = mActivity.getWindow();
            window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            ViewGroup decorView = (ViewGroup) window.getDecorView();
            int finalColor = alpha == 0 ? Color.TRANSPARENT :
                    Color.argb(alpha, Color.red(color), Color.green(color), Color.blue(color));
            decorView.addView(createStatusBarView(mActivity, finalColor));
            if (navigationBarExist(mActivity) && isTransformNavigationBar) {
                window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
                decorView.addView(createNavigationBarView(mActivity, finalColor));
            }
        }

    }

    @TargetApi(Build.VERSION_CODES.KITKAT)
    public void setHintBar() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            View decorView = mActivity.getWindow().getDecorView();
            decorView.setSystemUiVisibility(
                    View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                            | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                            | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                            | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                            | View.SYSTEM_UI_FLAG_FULLSCREEN
                            | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
        }
    }

    /**
     * 創建狀態欄視圖
     *
     * @param context
     * @param color
     * @return
     */
    private View createStatusBarView(Context context, @ColorInt int color) {
        View mStatusBarTintView = new View(context);
        FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, getStatusBarHeight(context));
        params.gravity = Gravity.TOP;
        mStatusBarTintView.setLayoutParams(params);
        mStatusBarTintView.setBackgroundColor(color);
        return mStatusBarTintView;
    }

    /**
     * 創建導航欄視圖
     *
     * @param context
     * @param color
     * @return
     */
    private View createNavigationBarView(Context context, @ColorInt int color) {
        View mNavBarTintView = new View(context);
        FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, getNavigationHeight(context));
        params.gravity = Gravity.BOTTOM;
        mNavBarTintView.setLayoutParams(params);
        mNavBarTintView.setBackgroundColor(color);
        return mNavBarTintView;
    }

    /**
     * 導航欄是否存在
     *
     * @param activity
     * @return
     */
    private boolean navigationBarExist(Activity activity) {
        WindowManager windowManager = activity.getWindowManager();
        Display d = windowManager.getDefaultDisplay();
        DisplayMetrics realDisplayMetrics = new DisplayMetrics();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            d.getRealMetrics(realDisplayMetrics);
        }
        int realHeight = realDisplayMetrics.heightPixels;
        int realWidth = realDisplayMetrics.widthPixels;
        DisplayMetrics displayMetrics = new DisplayMetrics();
        d.getMetrics(displayMetrics);
        int displayHeight = displayMetrics.heightPixels;
        int displayWidth = displayMetrics.widthPixels;
        return (realWidth - displayWidth) > 0 || (realHeight - displayHeight) > 0;
    }

    @ColorInt
    private int calculateColor(@ColorInt int color, int alpha) {
        float a = 1 - alpha / 255f;
        int red = color >> 16 & 0xff;
        int green = color >> 8 & 0xff;
        int blue = color & 0xff;
        red = (int) (red * a + 0.5);
        green = (int) (green * a + 0.5);
        blue = (int) (blue * a + 0.5);
        return 0xff << 24 | red << 16 | green << 8 | blue;
    }

    /**
     * 設置根視圖
     *
     * @param activity
     * @param fit
     */
    private void setRootView(Activity activity, boolean fit) {
        ViewGroup parent = (ViewGroup) activity.findViewById(android.R.id.content);
        for (int i = 0, count = parent.getChildCount(); i < count; i++) {
            View childView = parent.getChildAt(i);
            if (childView instanceof ViewGroup) {
                childView.setFitsSystemWindows(fit);
                ((ViewGroup) childView).setClipToPadding(fit);
            }
        }
    }

    /**
     * 獲取狀態欄的高度
     *
     * @param context
     * @return
     */
    private int getStatusBarHeight(Context context) {
        int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
        return context.getResources().getDimensionPixelSize(resourceId);
    }

    /**
     * 獲取到導航高度
     *
     * @param context
     * @return
     */
    public int getNavigationHeight(Context context) {
        int resourceId = context.getResources().getIdentifier("navigation_bar_height", "dimen", "android");
        return context.getResources().getDimensionPixelSize(resourceId);
    }

    /**
     * miui 更改字體
     *
     * @param activity
     * @param darkmode
     * @return
     */
    public boolean setMiuiStatusBarDarkMode(Activity activity, boolean darkmode) {
        activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
        Class<? extends Window> clazz = activity.getWindow().getClass();
        try {
            int darkModeFlag = 0;
            Class<?> layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams");
            Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE");
            darkModeFlag = field.getInt(layoutParams);
            Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class);
            extraFlagField.invoke(activity.getWindow(), darkmode ? darkModeFlag : 0, darkModeFlag);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    /**
     * 判斷是否爲miui
     *
     * @return
     */
    public boolean isMIUI() {
        String manufacturer = Build.MANUFACTURER;
        if ("xiaomi".equalsIgnoreCase(manufacturer)) {
            return true;
        }
        return false;
    }
}

3.適配使用

  • 在activity的根視圖中添加
android:fitsSystemWindows="true"
  • 示例xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:toolbar="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#E2E2E2"
    android:fitsSystemWindows="true">

    <com.common.basis.widget.CommonToolbar
        android:layout_width="match_parent"
        android:layout_height="45dp"
        toolbar:leftText="返回"
        toolbar:rightText="設置"
        toolbar:titleText="標題" />

</LinearLayout>
  • 在AndroidManifest爲當前Activity設置主題,如:
android:theme="@style/AppTheme.Yellow"
  • 在onCreate()方法中創建ImmersiveStatusBar對象,調用其屬性,ImmersiveStatusBar提供了多種方案,可根據需求設置。案例實例如下:
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ImmersiveStatusBar mImmersiveStatusBar = new ImmersiveStatusBar(this);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            mImmersiveStatusBar.setStatusTextAndIconColor(true);
            mImmersiveStatusBar.setColorBar(ContextCompat.getColor(this, R.color.white));
        } else {
            mImmersiveStatusBar.setColorBar(ContextCompat.getColor(this, R.color.black));
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章