目录

  1. 何实现?
  2. 集成DEMO
  3. 简短的分析
  4. 一个额外的小栗子
  5. 我想让状态栏变色怎么办?
  6. 为什么这么做?
  7. 总结

效果预览:

screenshot.gif

7f56fa92b7eb108e7092bcb9d08de3a3.jpg

7f56fa92b7eb108e7092bcb9d08de3a3.jpg7f56fa92b7eb108e7092bcb9d08de3a3.jpg7f56fa92b7eb108e7092bcb9d08de3a3.jpg7f56fa92b7eb108e7092bcb9d08de3a3.jpg7f56fa92b7eb108e7092bcb9d08de3a3.jpg7f56fa92b7eb108e7092bcb9d08de3a3.jpg7f56fa92b7eb108e7092bcb9d08de3a3.jpg7f56fa92b7eb108e7092bcb9d08de3a3.jpg7f56fa92b7eb108e7092bcb9d08de3a3.jpg7f56fa92b7eb108e7092bcb9d08de3a3.jpg7f56fa92b7eb108e7092bcb9d08de3a3.jpg7f56fa92b7eb108e7092bcb9d08de3a3.jpg7f56fa92b7eb108e7092bcb9d08de3a3.jpg7f56fa92b7eb108e7092bcb9d08de3a3.jpg7f56fa92b7eb108e7092bcb9d08de3a3.jpg7f56fa92b7eb108e7092bcb9d08de3a3.jpg7f56fa92b7eb108e7092bcb9d08de3a3.jpg

如何实现?

第一步: 在platforms/android/src/../../MainActivity.java路径下MainActivity.java() 中的super.onCreate() 函数后添加如下代码:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
  getWindow().getDecorView().setSystemUiVisibility(
      View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |
      View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
}

不要忘了在MainActivity.java 中导入依赖包:

import android.os.Build;
import android.view.View;

第二步:在项目根目录的config.xml文件中添加下面配置,这里需要注意

颜色的设置至关重要,此处是八位hex color,前两位是透明度,后六位是RGB颜色值.可以根据自己的需要配置.

<preference name="StatusBarBackgroundColor" value="#551b1d23" />

第三步: 在app.scss中添加样式

.platform-android {
   ion-header {
     padding-top: $cordova-md-statusbar-padding;
     background-color: color($colors, primary);
   }
}

OK! 你现在有一个透明的状态栏了。详细内容或具体的实现细节请查看项目仓库 ,项目将会持续更新,同时你能获取到更多有用的bug修复。我们建议你这样做。


集成DEMO

项目地址:

[ionic2-super-bar] https://github.com/jeneser/ionic-super-bar


(2017/4/1更新)

还是有点麻烦,我按照你的方法怎么都实现不了,能不能来点刺激的.....嗯,你的要求我尽量满足。

文章发出来一段时间后,得到了很多小伙伴的支持,也积累了一些问题。于是就抽时间写了个DEMO,解决了小伙伴本疑问比较多的地方,呐,你想要的都在这里了。你可以狠狠的点击下面的链接去往仓库地址,一探究竟。可以直接clone下来,根据README里Transparent statusBar for android进行简单的配置,直接运行,便能看到效果了,之后你便可以自由发挥了......


(2017/4/17更新)

关于兼容性的说明:

文章发布之后,很多同学说按照你的说法,不能实现啊,很多同学的问题都在于没有关注android版本号。首先透明状态栏(国内大多称沉浸式状态栏)是在android5之后添加的新特性,android4经过hack只能实现半透明的状态,不是特别美观,实现起来有些复杂。所以这个文章以及下面的demo专注于android5+,在android5+下表现正常.在android4中状态栏默认黑色,不会因此影响你的页面布局,和整体的效果。

兼容性列表:

兼容性说明

(2017/7/7更新)

关于同一个项目中使用本项目的方法和原生状态栏插件冲突的问题?

你只需要调整一下以上方法的第二步:在src/app/app.component.ts中修改statusbarbackgroundcolor。这样,同一个项目中使用本项目的方法和原生状态栏插件。android和IOS之间将不会有任何冲突。我们建议你这样做。这些代码是无害的!

// #AARRGGBB where AA is an alpha value
if (this.platform.is('android')) {
   this.statusBar.backgroundColorByHexString("#33000000");
}

你可以查看这个issue来了解更多:Can we use your option for Android and native status bar plugin for iOS devices on the same project?


简短的分析

第一步,将视口设置全屏将状态栏固定在视图之上,第二步,配置状态栏颜色,这一步有一个概念需要清楚,hex color是能定义透明度的,我们平常所见的类似#ffffff是六位的RGB颜色,这里在前面再加两位便是能定义透明度的ARGB,也就是RGB色彩模式附加上Alpha(透明度)通道.所以可以根据自己的需要进行不同透明度的设置.第三步,由于我们将视口扩大至了整个屏幕,自然我们的页面会被覆盖在状态栏下面,我的做法是给ion-header加一个内边距,并且指定一个背景颜色,当作默认的状态栏底色。当然这里你可以自由发挥,你只要记着现在你写的页面已经在透明的状态栏下面了,你要做的就是让页面下移状态栏的高度,腾出位置避免覆盖.

此时,你可能已经意识到,这个方案是比较灵活的,你可以自由的控制你的页面和状态栏的位置.很多同学想要这样一种效果:图片深入到透明的状态栏下面.想一想是不是很容易实现呢?你只需要简单修改或添加第三步中的css样式即可完成你的设计,是不是很酷...


补充:很多小伙伴记不住hex color各透明度的值,或者不是太了解hex color,请各位小伙伴自行google吧。我这里给出一个hex color各透明度的值.。

参考链接:Hex Opacity Values


一个额外的小栗子

还是先贴效果图

screenshot.gif


透明状态栏效果

左侧有一个隐藏的滑动菜单,在Material Design中,上面的那张图片一般是延伸到透明的状态栏下面的,如果状态栏不透明,会很难看,对设计细节比较在意的同学肯定不能忍......

其实实现起来也很简单,还是上面的步骤,只是第三步有一些变化,在ion-header外面又套了一层.ion-page.如果你还有点迷糊,可以查看项目源码,一探究竟。

.platform-android {
 .ion-page {
   ion-header {
     padding-top: $cordova-md-statusbar-padding;
     background-color: color($colors, primary);
   }
 }
}

我想让状态栏变色怎么办?

在上面第三步,我设置header的padding并指定了background-color,很容易理解这里的背景颜色深入到状态栏下面,提供一种近似于沉浸式的效果,这样做简单,对不了解android的童鞋理解起来很轻松。

第一种方法是覆盖上文第三步中的cssbackground-color: color($colors, primary);,正确使用选择器可以实现不同页面拥有不同颜色的状态栏。

第二种通过编程的方式:可以使用cordova-plugin-statusbar插件,

在不同视图加载时调用StatusBar.backgroundColorByHexString("#55C0C0C0");(同样这里的颜色值也是能添加透明度的)来实现不同页面不同颜色的状态栏.




原文链接:https://www.jianshu.com/p/4c283e37294f

欢迎留言