沉浸式状态栏 设置状态栏颜色

Posted 白乾涛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了沉浸式状态栏 设置状态栏颜色相关的知识,希望对你有一定的参考价值。

方式一:使用系统API

这个特性是andorid4.4支持的,最少要api19才可以使用。

1、隐藏标题栏等

在代码中设置
        requestWindowFeature(Window.FEATURE_NO_TITLE);//隐藏标题栏
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);//窗口透明的状态栏
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);//窗口透明的导航栏
        setContentView(R.layout.activity_main);

或者在整个应用的样式中设置
<resources>
    <style name="AppBaseTheme" parent="android:Theme.Light"></style>
    <style name="AppTheme" parent="AppBaseTheme">
        <!-- 隐藏标题栏 -->
        <item name="android:windowNoTitle">true</item>
        <!-- 窗口透明的状态栏 -->
        <item name="android:windowTranslucentStatus">true</item>
        <!-- 窗口透明的导航栏 -->
        <item name="android:windowTranslucentNavigation">true</item>
    </style>
</resources>

此时效果为

2、在布局中第一个元素中添加如下属性

        android:clipToPadding="true"
        android:fitsSystemWindows="true"
属性的含义:
  • clipToPadding:控件的绘制区域是否在padding里面,值为true时绘制的区域就包括padding区域;
  • android:fitsSystemWindows:具体的作用就是你的contentview是否忽略actionbar、title、屏幕的底部虚拟按键,将整个屏幕当作可用的空间。正常情况,contentview可用的空间是去除了actionbar、title、底部按键的空间后剩余的可用区域,这个属性设置为true,则忽略,false则不忽略。简单来说,设置为true后,你的可用屏幕是整个屏幕,所以要注意,你的第一个控件是从状态栏那里开始布局的。

此时效果为
 

方式二:使用开源框架[废弃了]

[DEPRECATED] Apply background tinting to the Android system UI when using KitKat translucent modes

设置状态栏颜色

Activity

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //为使用 ImageView 作为头部的界面设置状态栏透明
        //StatusBarUtil.setTranslucentForImageView(Activity activity, int statusBarAlpha, View needOffsetView)
        //为包含 DrawerLayout 的界面设置状态栏颜色(也可以设置半透明和全透明)
        //StatusBarUtil.setColorForDrawerLayout(Activity activity, DrawerLayout drawerLayout, int color)
    }
    private int num = 0;
    public void click(View v) {
        switch (num % 3) {
        case 1:
            //设置状态栏半透明
            StatusBarUtil.setTranslucent(this, 50);//值需要在 0 ~ 255 之间
            break;
        case 2:
            //设置状态栏全透明
            StatusBarUtil.setTransparent(this);
            break;
        default:
            //设置状态栏颜色
            StatusBarUtil.setColor(this, 0xff0000);
            break;
        }
        num++;
    }
}

工具类

import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.os.Build;
import android.support.v4.widget.DrawerLayout;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.LinearLayout;
public class StatusBarUtil {
    public static final int DEFAULT_STATUS_BAR_ALPHA = 112;//透明度默认值,在 0 ~ 255 之间
    public static final int FAKE_STATUS_BAR_VIEW_ID = R.id.statusbarutil_fake_status_bar_view;
    public static final int FAKE_TRANSLUCENT_VIEW_ID = R.id.statusbarutil_translucent_view;
    /**
     * 设置状态栏颜色
     *
     * @param activity 需要设置的 activity
     * @param color    状态栏颜色值
     */
    public static void setColor(Activity activity, int color) {
        setColor(activity, color, DEFAULT_STATUS_BAR_ALPHA);
    }
    /**
     * 设置状态栏颜色
     *
     * @param activity       需要设置的activity
     * @param color          状态栏颜色值
     * @param statusBarAlpha 状态栏透明度
     */
    public static void setColor(Activity activity, int color, int statusBarAlpha) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {//API 21,Android 5.0
            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            activity.getWindow().setStatusBarColor(calculateStatusColor(color, statusBarAlpha));
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {//API 19,Android 4.4
            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();
            View fakeStatusBarView = decorView.findViewById(FAKE_STATUS_BAR_VIEW_ID);
            if (fakeStatusBarView != null) {
                if (fakeStatusBarView.getVisibility() == View.GONE) {
                    fakeStatusBarView.setVisibility(View.VISIBLE);
                }
                fakeStatusBarView.setBackgroundColor(calculateStatusColor(color, statusBarAlpha));
            } else {
                decorView.addView(createStatusBarView(activity, color, statusBarAlpha));
            }
            setRootView(activity);
        }
    }
    /**
     * 设置状态栏纯色 不加半透明效果
     *
     * @param activity 需要设置的 activity
     * @param color    状态栏颜色值
     */
    public static void setColorNoTranslucent(Activity activity, int color) {
        setColor(activity, color, 0);
    }

    /**
     * 设置状态栏颜色(5.0以下无半透明效果,不建议使用)
     *
     * @param activity 需要设置的 activity
     * @param color    状态栏颜色值
     */
    @Deprecated
    public static void setColorDiff(Activity activity, int color) {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
            return;
        }
        transparentStatusBar(activity);
        ViewGroup contentView = (ViewGroup) activity.findViewById(android.R.id.content);
        // 移除半透明矩形,以免叠加
        View fakeStatusBarView = contentView.findViewById(FAKE_STATUS_BAR_VIEW_ID);
        if (fakeStatusBarView != null) {
            if (fakeStatusBarView.getVisibility() == View.GONE) {
                fakeStatusBarView.setVisibility(View.VISIBLE);
            }
            fakeStatusBarView.setBackgroundColor(color);
        } else {
            contentView.addView(createStatusBarView(activity, color));
        }
        setRootView(activity);
    }
    /**
     * 使状态栏半透明
     *
     * 适用于图片作为背景的界面,此时需要图片填充到状态栏
     *
     * @param activity 需要设置的activity
     */
    public static void setTranslucent(Activity activity) {
        setTranslucent(activity, DEFAULT_STATUS_BAR_ALPHA);
    }
    /**
     * 使状态栏半透明
     *
     * 适用于图片作为背景的界面,此时需要图片填充到状态栏
     *
     * @param activity       需要设置的activity
     * @param statusBarAlpha 状态栏透明度,默认值是112,该值需要在 0 ~ 255 之间
     */
    public static void setTranslucent(Activity activity, int statusBarAlpha) {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
            return;
        }
        setTransparent(activity);
        addTranslucentView(activity, statusBarAlpha);
    }

    /**
     * 针对根布局是 CoordinatorLayout, 使状态栏半透明
     *
     * 适用于图片作为背景的界面,此时需要图片填充到状态栏
     *
     * @param activity       需要设置的activity
     * @param statusBarAlpha 状态栏透明度
     */
    public static void setTranslucentForCoordinatorLayout(Activity activity, int statusBarAlpha) {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
            return;
        }
        transparentStatusBar(activity);
        addTranslucentView(activity, statusBarAlpha);
    }
    /**
     * 设置状态栏全透明
     *
     * @param activity 需要设置的activity
     */
    public static void setTransparent(Activity activity) {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
            return;
        }
        transparentStatusBar(activity);
        setRootView(activity);
    }
    /**
     * 使状态栏透明(5.0以上半透明效果,不建议使用)
     * 适用于图片作为背景的界面,此时需要图片

以上是关于沉浸式状态栏 设置状态栏颜色的主要内容,如果未能解决你的问题,请参考以下文章

安卓笔记——沉浸式状态栏

Android 沉浸式状态栏 一设置状态栏颜色

Android状态栏着色(非沉浸式状态栏)

Android 实现沉浸式状态栏

Android 沉浸式状态栏

Android 沉浸式状态栏