本文所提到的透明状态栏其实指的是将顶部的导航栏延伸到状态栏,使之浑然一体(谷歌官方建议状态栏颜色比导航栏的颜色略深一点),并不代表一定不设置背景色,比如导航栏是白色,则可设置状态栏为白色,视情况而定。
相比于iOS系统,安卓系统对于状态栏的设置就显得稍微复杂了一点.Android系统提供了API以19日上对状态栏的设置接口,而直到API以23日上才提供对于图标颜色的设置,还有就是各家厂商(如魅族,小米等)对于状态栏的有自己的定制,对于需要使用浅色背景状态栏的应用,没处理好的话往往导致浅色背景,白色图标,状态栏不分你我的悲剧. .
(内心os:嗯?右上角那一个绿色的电池,用户一定知道他是状态栏对吧。)
我随即对比了一些主流应用,发现在我的魅蓝2 (Android 5.1 Flyme 4.5)上竟然都不支持透明状态栏,这对于我这种追求审美的人(其实是视觉提的需求)来说简直不能忍。在我折腾了几天之后,终于解决了这些问题,希望对大家思路有一些帮助。
言归正传,本文主要针对以下几点进行分析:1。是否隐藏状态栏(全屏模式)2。状态栏的背景色的设置3。状态栏图标的颜色的设置,而对于透明状态栏设置过程中,可能造成的图标颜色设置成功,而背景颜色设置失败,等等原因造成的浅色底,浅色字或深色底,深色字等错误情况的处理及兜底方案4。源码实现。
下面我们就以上几点来讨论一下安卓中透明状态栏的实现。
<强> 1。全屏模式(沉浸式状态栏)强>
这种情况其实用得并不多,基本上使用场景在闪屏页展示广告或标志,以及一些阅读类应用需要尽可能的利用到屏幕大小,展示更多的内容。
设置方法很简单,分两种,在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透明化和沉浸式状态栏实践及源码分析