Android沉浸式状态栏顶部着色

来源:互联网 发布:药品中标数据库 编辑:程序博客网 时间:2024/04/25 19:46

    如今,各大app都将状态栏改变成适合自身app风格的颜色了,颠覆了传统黑白的lowB,状态栏着色,也就是常说的“沉浸式状态栏”。一直觉得这个功能很麻烦很坑爹,网上看资料也只是走马观花,今天闲了下来,准备啃下这块骨头,可是,认真看了几篇文章后,发现这根本不是个骨头,只是我没用心而已,太浮躁了,作为一个靠技术吃饭的,着实应该面壁试过。
“沉浸式状态栏”只有从Android4.4以后的版本,才支持此功能,且谷歌从5.0开始实现了在代码中配置就可以实现这个功能:

private void initToolBarConfig() {        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {//5.0及以上            View decorView = getWindow().getDecorView();            int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;            decorView.setSystemUiVisibility(option);            getWindow().setStatusBarColor(Color.TRANSPARENT);        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {//4.4到5.0            WindowManager.LayoutParams localLayoutParams = getWindow().getAttributes();            localLayoutParams.flags = (WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS | localLayoutParams.flags);        }    }


这段代码添加到基类Activity中执行段,或者相应Activity的setContentView之前(某些机子这段代码无效果,由于时间原因未做深究)。

但是,如今市场上绝大多数的Android机子都是5.0一下的,所以,必须考虑到4.4-5.0这之间的用户群。解决这个需求有各式各样的方法,为了兼容各个版本的机型和最少的代码量,我们使用最简单的主题配置模式。

思路很简单:1 状态栏透明化,2状态栏着色

第一步:状态栏透明化

需要在values、values-v19、values-v21目录下分别创建相应的主题:

<style name="TranslucentTheme" parent="AppTheme"></style>//values-v19<style name="TranslucentTheme" parent="Theme.AppCompat.Light.NoActionBar">        <item name="android:windowTranslucentStatus">true</item>        <item name="android:windowTranslucentNavigation">false</item></style>//values-v21<style name="TranslucentTheme" parent="Theme.AppCompat.Light.NoActionBar">        <item name="android:windowTranslucentStatus">true</item>        <item name="android:windowTranslucentNavigation">false</item>        <item name="android:statusBarColor">@android:color/transparent</item></style>

到AndroidManifest中去给application或者相应的Activity设置主题TranslucentTheme便是

第一步:状态栏上色

这里有个小问题,是否让组件延伸到状态栏

android:fitsSystemWindows="true"  

如果在根布局中添加这个配置,这布局中的第一个组件是不会延伸到状态栏的,如图:


如果不添加,则默认延伸到状态栏。

如果不让逐渐延伸到状态栏,可以个整个Activity设置背景颜色来给状态栏着色,但这可能影响到后期Activity的主题更改,况且,既然是“沉浸式”的,我们最好让第一个组件延伸到状态栏,因为个人觉得,觉得Activity的Style的,往往是第一个组件的,

假设我们的第一个组件是toolBar,直接在toolBar中配置一个paddingTop就好了,至于具体的距离,根据实际而定。

在values、values-v19目录添加如下尺寸:

//values<dimen name="padding_top">0dp</dimen>//values-v19<dimen name="padding_top">25dp</dimen>

然后配置toolBar
<android.support.v7.widget.Toolbar        android:id="@+id/toolbar"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:background="@color/colorPrimary"        android:navigationIcon="@mipmap/ic_launcher"        android:paddingLeft="10dp"        android:paddingTop="@dimen/padding_top"        app:navigationIcon="@mipmap/ic_launcher"        app:title="沉浸式状态栏"/>

至此,状态栏的颜色就和toobar的背景颜色一致。
 

PS:如果没有将状态栏事先透明化,当设置toolbar可以被延伸到状态栏的时候,toolBar反而会被状态栏给覆盖。很多同学有时候分不清是否需要在根部局中添加android:fitsSystemWidows="true",分不清的童鞋这样记:true的时候,就是把状态栏当成第一组件,不能被覆盖,false的时候,状态栏就不是第一组件,他可以被覆盖。


更多方法参考:http://www.jianshu.com/p/bae25b5eb867


0 0
原创粉丝点击