Android状态栏变色/沉浸式状态栏 4.4及其以上兼容实现

最近研究项目的状态栏变色问题,该特性国内也称为沉浸式状态栏(其实这是有误的,但是国内都这么叫了,一般就都这么认为了。)

该特性在5.0上是很好实现的,直接设置主题中的colorPrimaryDark属性就可以了,但是由于4.4上就可以实现状态栏的透明,也就导致也可以在4.4的设备上实现状态栏变色,之前看过相关的处理方法,但是多少有点瑕疵,后来自己研究了一个方法,在此分享下。

主要思路就是设置状态栏为透明,然后绘制一个和状态栏同样高度的矩形,添加到窗口的顶层View上面,再设置根布局的fitsSystemWindows参数为true

具体代码如下:

/**
 * 状态栏变色处理 4.4以上
 *
 * @param color 状态栏颜色
 *              4.4状态栏显示为改颜色
 *              5.0自动会加上半透明效果
 */
public void translucentBar(int color) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        // 获取状态栏高度
        int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
        int statusBarHeight = getResources().getDimensionPixelSize(resourceId);
        // 绘制一个和状态栏一样高的矩形,并添加到视图中
        View rectView = new View(this);
        LinearLayout.LayoutParams params
                = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, statusBarHeight);
        rectView.setLayoutParams(params);
        rectView.setBackgroundColor(getResources().getColor(color));
        // 添加矩形View到布局中
        ViewGroup decorView = (ViewGroup) getWindow().getDecorView();
        decorView.addView(rectView);
        // 设置根布局的参数
        ViewGroup rootView = (ViewGroup) ((ViewGroup) this.findViewById(android.R.id.content)).getChildAt(0);
        rootView.setFitsSystemWindows(true);
        rootView.setClipToPadding(true);
    }
}

具体的参数注释中已经说明了。
该方法需要在setContentView()方法之后调用。
重写BaseActivity中的setContentView(int layoutResID )方法,就可以实现全局地设置所有的Activity界面的状态栏颜色,如果项目中某个Activity需要设置不同的状态栏颜色,显式地调用该方法,并传入颜色值即可。

当给参数为green时,运行的效果如下(左边为4.4,右边为5.0):
这里写图片描述

由于是模拟器的原因,实际上4.4上就是你设置的颜色值,5.0上会自动加上半透明的效果。

至此,4.4及其以上的状态栏变色问题就得到了解决,并保证了系统上的风格统一。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值