Android透明化和沉浸式状态栏实践及源码分析

  

本文所提到的透明状态栏其实指的是将顶部的导航栏延伸到状态栏,使之浑然一体(谷歌官方建议状态栏颜色比导航栏的颜色略深一点),并不代表一定不设置背景色,比如导航栏是白色,则可设置状态栏为白色,视情况而定。

  

相比于iOS系统,安卓系统对于状态栏的设置就显得稍微复杂了一点.Android系统提供了API以19日上对状态栏的设置接口,而直到API以23日上才提供对于图标颜色的设置,还有就是各家厂商(如魅族,小米等)对于状态栏的有自己的定制,对于需要使用浅色背景状态栏的应用,没处理好的话往往导致浅色背景,白色图标,状态栏不分你我的悲剧. .

  

 Android透明化和沉浸式状态栏实践及源码分析

  

(内心os:嗯?右上角那一个绿色的电池,用户一定知道他是状态栏对吧。)

  

我随即对比了一些主流应用,发现在我的魅蓝2 (Android 5.1 Flyme 4.5)上竟然都不支持透明状态栏,这对于我这种追求审美的人(其实是视觉提的需求)来说简直不能忍。在我折腾了几天之后,终于解决了这些问题,希望对大家思路有一些帮助。

  

言归正传,本文主要针对以下几点进行分析:1。是否隐藏状态栏(全屏模式)2。状态栏的背景色的设置3。状态栏图标的颜色的设置,而对于透明状态栏设置过程中,可能造成的图标颜色设置成功,而背景颜色设置失败,等等原因造成的浅色底,浅色字或深色底,深色字等错误情况的处理及兜底方案4。源码实现。

  

下面我们就以上几点来讨论一下安卓中透明状态栏的实现。

  

<强> 1。全屏模式(沉浸式状态栏)
  

  

这种情况其实用得并不多,基本上使用场景在闪屏页展示广告或标志,以及一些阅读类应用需要尽可能的利用到屏幕大小,展示更多的内容。

  

 Android透明化和沉浸式状态栏实践及源码分析

  

设置方法很简单,分两种,在API比;16时:

  

主题中定义:将自定义该Activtiy的主题,并在其中添加
  

        & lt;项目名称=" android: windowFullscreen "祝辞true      

代码中定义:
  

  

代码如下:
  window.getDecorView () .setSystemUiVisibility (View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN)
  

  

<强> 2。状态栏的背景色
  

  

我们都知道,在Android5.0(即API比;21)时,谷歌官方提供接口设置对应的状态栏背景色

        窗口。setStatusBarColor (@ColorInt int颜色);      

那我们要想在Android5.0以下设置背景色就真的没有办法了吗?并不是,我们发现在Android4.4以后,出现了windowTranslucentStatus这一特性,所以思路如下:

  
      <李>先设置状态栏的透明属性李   <李>给根布局顶部加上一个和状态栏一样大小的矩形来看,充当假的状态栏   <李>设置FitsSystemWindows属性为真,此时跟布局会延伸到状态栏,处在顶部位置就是之前设置的观点,这样就可以以假乱真了只李   
        如果(Build.VERSION。SDK_INT祝辞=Build.VERSION_CODES.KITKAT) {//设置状态栏透明   activity.getWindow () .addFlags (WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);//生成一个状态栏大小的矩形视图   视图statusView=createStatusView(活动、颜色);   .getDecorView ViewGroup decorView=(ViewGroup) activity.getWindow () ();   decorView.addView (statusView);//设置根布局的参数   ViewGroup rootView=(ViewGroup) ((ViewGroup) activity.findViewById (android.R.id.content)) .getChildAt (0);   rootView.setFitsSystemWindows(真正的);   rootView.setClipToPadding(真正的);   }   之前      

设置矩形色块的代码如下:

        私有静态视图createStatusView(活动活动,int颜色){//获得状态栏高度   int resourceId=activity.getResources ()。getIdentifier (“status_bar_height”、“dimen”,“android”);   int statusBarHeight=activity.getResources () .getDimensionPixelSize (resourceId);//绘制一个和状态栏一样高的矩形   视图statusView=新视图(活动);   LinearLayout。LayoutParams params=new LinearLayout.LayoutParams (ViewGroup.LayoutParams.MATCH_PARENT   statusBarHeight);   statusView.setLayoutParams (params);   statusView.setBackgroundColor(颜色);   返回statusView;   }      

Android透明化和沉浸式状态栏实践及源码分析