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

白乾涛 白乾涛     2022-08-20     323

关键词:

方式一:使用系统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沉浸式状态栏一设置状态栏颜色

第一步://需要setContentView之前调用privatevoidsetTranslucentStatus()if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.KITKAT)//透明状态栏getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);//透明导航栏getWindow().addFlags(WindowManager.LayoutParams.F... 查看详情

android实现沉浸式全屏(代码片段)

前言本文总结Android实现沉浸式全屏的实现方式。实现沉浸式全屏在一些需要全屏显示的场景下,比如玩游戏、看横屏视频的时候,内容全屏,占满窗口的体验会让用户更加沉浸到对内容的消费中,带来好的用户体验。沉浸式显... 查看详情

android沉浸式状态栏(代码片段)

文章目录前言一、沉浸式状态栏二、改变标题和状态栏颜色总结前言4-20分享提示:以下是本篇文章正文内容,下面案例可供参考先来看下效果图(夜神模拟器和真机有点差别,我不会搞gif动图,就勉强看下吧):一、沉浸式状... 查看详情

android沉浸式状态栏(代码片段)

在使用沉浸式状态栏时需要注意设置的沉浸颜色为白色还是其他深色的区别1.状态栏字体图标黑色(深色)//5.0以上系统状态栏透明if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.LOLLIPOP)Windowwindow=getWindow();window.clearFlags(WindowMan... 查看详情

android沉浸式状态栏变色状态栏透明状态栏修改状态栏颜色及透明(代码片段)

首先我要区分清楚沉浸式状态栏与变色状态栏。沉浸式状态栏指的是,状态栏隐藏,在手指做了相关操作后,状态栏显示出来,例如视频播放器,在播放视频时是隐藏状态栏的,但是点击屏幕的时候,... 查看详情

沉浸式导航栏及状态栏系统图标颜色的改变

最近研究沉浸式导航栏,上网看了好多,差不多实现都是一样的。。。。代码如下: //透明状态栏getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);//透明导航栏getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIG 查看详情

沉浸式状态栏的三种实现方式

沉浸式算是目前Android行业比较流行的一种App设计风格,将菜单栏北京设置为导航栏的颜色,感觉顶部状态栏像是被入侵了一样,因此称为沉浸式菜单栏。本文将介绍三种方式去实现沉浸式状态栏。  Google从androidkitkat(Androi... 查看详情

android---沉浸式状态栏(代码片段)

Android—沉浸式状态栏我们的征程是星辰大海,而非人间烟尘文章目录Android---沉浸式状态栏去掉标题栏效果引入依赖沉浸状态栏颜色沉浸状态栏图片去掉标题栏首先去掉对应主题下面的Android自带的ActionBar,只需要在对应... 查看详情

沉浸式状态栏

  我们知道IOS上的应用。状态栏的颜色总能与应用标题栏颜色保持一致,用户体验非常不错。那安卓能否够呢?若是在安卓4.4之前,答案是否定的,但在4.4之后,谷歌同意开发人员自己定义状态栏背景颜色啦,这是个不错... 查看详情

android沉浸式状态栏(代码片段)

文章目录前言一、沉浸式状态栏二、改变标题和状态栏颜色总结前言4-20分享提示:以下是本篇文章正文内容,下面案例可供参考先来看下效果图(夜神模拟器和真机有点差别,我不会搞gif动图,就勉强看下吧):一、沉浸式状... 查看详情

android--------沉浸式状态栏immersionbar3.0(代码片段)

沉浸式状态栏我一直在使用的一个库ImmersionBar,非常不错,现在都3.0了android4.4以上沉浸式状态栏和沉浸式导航栏管理,适配横竖屏切换、刘海屏、软键盘弹出等问题,可以修改状态栏字体颜色和导航栏图标颜色&#x... 查看详情

android--------沉浸式状态栏immersionbar3.0(代码片段)

沉浸式状态栏我一直在使用的一个库ImmersionBar,非常不错,现在都3.0了android4.4以上沉浸式状态栏和沉浸式导航栏管理,适配横竖屏切换、刘海屏、软键盘弹出等问题,可以修改状态栏字体颜色和导航栏图标颜色&#x... 查看详情

mui沉浸模式以及状态栏颜色改变(代码片段)

...电量那条,有4种状态,分别是正常、变色、透明(也称沉浸式状态栏)、消失(也就是全屏)。后3种特殊用法,具体见下: 状态栏变色  常见的就是把状态栏设置为tilte的颜色,这样看着大气;写法:使用5+API plu... 查看详情

react-native沉浸式状态栏(代码片段)

使用StatusBar即可实现沉浸式,但是必须把背景色设置为透明。否则如果有不同页面的头部颜色不一样的话,导航栏的颜色动画会很怪异,不会是跟着页面一起动画。<StatusBarbarStyle='light-content'backgroundColor='rgba(0,0,0,0)'... 查看详情

android沉浸式(透明)状态栏细研-超级细还附demo(代码片段)

前言在Android4.4中引入了沉浸模式的功能,但这个版本非真正的沉浸模式,应该说是透明模式。Android5.0以后才可以在系统层面实现真正的沉浸式状态栏。沉浸式状态栏是为了与当前使用的App页面风格统一,不会显的那... 查看详情

小米手机手势提示线怎么改沉浸

...整体的背景颜色保持一致;主要有两种适配方式:”使用沉浸式虚拟键”和“给虚拟键设置合适的颜色”。图例为开启“手势提示线”效果图例为关闭“手势提示线”效果2.使用沉浸式虚拟键2.1如何设置沉浸式虚拟键,即app的conten... 查看详情

关于如何彻底搞定androidkitkat+沉浸式状态栏效果(代码片段)

所谓“沉浸式”状态栏这里所说的沉浸式状态栏,就是指上面的效果,状态栏和Toolbar的颜色保持一致,融为一体的效果。版本差异及解决方法本文所用的示例使用的style风格是NoActionBar的,标题栏使用的是Toolbar控... 查看详情