Android透明化状态栏效果浅析

背景

混了也有两年了,我要好好的自己整理一下子了。最近在开发自己的app,当然要做到用户体验棒棒的,才能无悔咯!今天跟大家讲的是透明化状态栏效果的简单实现,透明化状态栏是一个用户体验很棒的效果,会让app整体看起来非常的整齐干净,我本人是非常喜欢这样的效果。下面给出我项目的几张效果图示:
这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

我项目整体色调是黑白灰,所以看自己喜欢什么搭配了,不多bb,下面开始来了解一下子噻!


代码分析一波

首先不添加任何的代码和样式,打开看一下最原始的效果,代码和图示如下:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);
        handler.sendEmptyMessageDelayed(WHAT_DELAY, DELAY_TIME);
    }

这里写图片描述

什么都不做添加默认会显示ActionBar,这显然不是我们所想要的,所以我们需要隐藏ActionBar。修改代码后如下所示:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);

        // 隐藏ActionBar
        ActionBar actionBar = getActionBar();
        actionBar.hide();

        handler.sendEmptyMessageDelayed(WHAT_DELAY, DELAY_TIME);
    }

这里写图片描述

这里可以看到已经将ActionBar给隐藏了。下面看看能不能设置状态栏的颜色,因为我这里系统默认是黑色背景,白色的字体颜色。字体颜色设置代码先不急,把背景颜色搞了再说,下面添加改变状态栏背景颜色的代码:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);

        // 设置状态栏背景颜色只能在Android5.0以上,即API 21 以上
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            // 需要设置flag,才可以设置状态栏的颜色
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            getWindow().setStatusBarColor(Color.TRANSPARENT);// 设置透明色
        }

        // 隐藏ActionBar
        ActionBar actionBar = getActionBar();
        actionBar.hide();

        handler.sendEmptyMessageDelayed(WHAT_DELAY, DELAY_TIME);
    }

这里写图片描述

可以看到设置状态栏的背景颜色生效了。这里关键就来了,提供了一种思路:自定义标题栏,标题栏设置一种背景色,然后通过设置状态栏和标题栏相同的背景色就达到了状态栏透明化的效果。

下面设置成白色,修改代码如下:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);

        // 设置状态栏背景颜色只能在Android5.0以上,即API 21 以上
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            // 需要设置flag,才可以设置状态栏的颜色
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
//            getWindow().setStatusBarColor(Color.TRANSPARENT);// 设置透明色
            getWindow().setStatusBarColor(Color.WHITE);// 设置状态栏背景白色
        }

        // 隐藏ActionBar
        ActionBar actionBar = getActionBar();
        actionBar.hide();

        handler.sendEmptyMessageDelayed(WHAT_DELAY, DELAY_TIME);
    }

这里写图片描述

这里可以看到设置成白色后,状态栏的时间和电量显示都不见了,其实不是不见了,只是这些时间和电量显示的是白色的,他们重叠再一起了,所以才误以为不见了。这里有两种方法提供给大家:

  • 1、不设置状态栏为白色的背景,设置成其他的颜色的背景色(易与白色字体想区分开来的),这样就不用管状态栏字体颜色这一设置了。
  • 2、我就是头铁,觉得白色非常棒,我很喜欢,那么你可以这么做,就是设置他么的状态栏字体颜色,所以大家自己看情况而定吧!

下面第一种情况就不多说了,因为不需要设置状态栏字体的颜色,也就改变一下状态栏背景色,上面照常操作即可。

这里给出改变状态栏字体颜色的代码,如下所示:

@TargetApi(Build.VERSION_CODES.M)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);

        // 设置状态栏背景颜色只能在Android5.0以上,即API 21 以上
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            // 需要设置flag,才可以设置状态栏的颜色
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
//            getWindow().setStatusBarColor(Color.TRANSPARENT);// 设置透明色
            getWindow().setStatusBarColor(Color.WHITE);// 设置白色
        }

        // 这里需要API 23 以上,所以大家根据情况作出选择,看是否需要考虑舍弃设置状态栏背景色为白色
        // 不设置为白色,那么也就不用改变状态栏字体颜色了,也就不用考虑字体颜色的适配了。
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
        }

        // 隐藏ActionBar
        ActionBar actionBar = getActionBar();
        actionBar.hide();

        handler.sendEmptyMessageDelayed(WHAT_DELAY, DELAY_TIME);
    }

这里写图片描述

这里写图片描述

看到这里确实改变了状态栏字体的颜色,但是需要API 23 以上,所以需要考虑API 23以下的情况,作出相应的适配。这里我就不给出了,给大家分析一波情况即可。

那么怎么将字体颜色改回来呢?也很简单,也就是一行代码就搞定的事情:

getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);

这里不再测试了,我亲测通过,大家自己去写个demo验证即可。


总结一波

通过上面代码给大家分析了一波,相信大家基本都有了自己的思路来实现相应的效果了。大家可以自己设置自己喜欢的样式了。

因为我的手机是Android版本是很高的,所以上面的一些设置在我的手机上都可以生效,我并没有给出所有版本的适配方案,这里大家如果想适配所有的版本,就需要自己去查找资料了。作为弥补,给出一篇大神的文章,大家可以去好好的品读一下这篇好文章:Android状态栏微技巧,带你真正理解沉浸式模式


A little bit of progress every day!Come on!

猜你喜欢

转载自blog.csdn.net/csdnzouqi/article/details/80755948
今日推荐