Ionic实现透明状态栏

作者: jeneser | 来源:发表于2017-03-11 20:15 被阅读7509次

    目录

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

    效果预览:


    兼容性说明

    (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

    一个额外的小栗子

    还是先贴效果图

    透明状态栏效果

    左侧有一个隐藏的滑动菜单,在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");(同样这里的颜色值也是能添加透明度的)来实现不同页面不同颜色的状态栏.

    为什么这么做?

    下面是我解决这个问题所走的弯路可掉的坑,如果你有兴趣也可以接着读下去。

    其实呢这一段套路够深的话,应该是放在前面调胃口用的....haha...嗯,闲话不扯,就说说我为什么要这么做呢?其实我和很多小伙伴一样不是专门做android开发的,我是一名小前端,灌水党,能力还是比较有限的。所以很多地方也是有问题的,也请小伙伴们多多指教。定当感激不尽!

    下面是我解决问题的思路和做法 供参考

    透明状态栏网上能google出一大堆的解决方案,但大多是针对原生代码的解决方案,都不错,但有关于ionic2的解决方案少之又少,并且说法不一,方法各异,不知道谁对谁错,满满的都是泪。并且在google ionic2 statusbar transparent时结果的第一条答案还是有偏差的,标题是How can I make a transparent toolbar? - ionic 2 - Ionic注意是toolbar而不是statusbar,很多同学把这两个东西混在了一起,导致很多童鞋云里雾里的傻傻分不清.....
    在那个帖子中,大家讨论的是toolbar的透明,其实在Ionic 2 Beta 10中已经解决这个问题了.可以参考里面的做法.我这里就不说了.
    好吧,接着google,接着从各种信息中筛选我想要的结果,未果.....大概是一天之后,偶然发现了这个帖子首先要感谢@peterbetos.
    我按照peterbetos提供的方法,但是遇到很多编译错误,尤其是下面这句,ContextCompat依赖android.support.v4.content.ContextCompat,各种尝试各种错误,是有点麻烦嘛!又试了试,搜了搜,还是有问题。

    getWindow().setStatusBarColor(
      ContextCompat.getColor(this, R.color.status_bar_transparet));
    

    既然上面一小段代码问题这么多,干脆不要,于是就有了上面那三步.我能通过第二步的hex color实现透明,就不用这么麻烦了,理解起来也更简单......于是简单起见,决定根据现有代码,按照自己的思路实现一下,说干就干......

    最后

    ionic正在快速迭代,前两天刚发布2.2.0.很多东西在开发和完善中,就透明状态栏来讲,ionic官方给出的方案是使用cordova-plugin-statusbar插件,但是目前这个插件透明状态栏在android下不支持,这就尴尬了不是,好消息是已经有人PR,坏消息是,一年了还没有合并.....从兼容性和技术上讲是有一定的难度的,需要考虑的东西也很多。
    目前ionic团队正在做重要的事,而cordova-plugin-statusbar插件也不知何时解决这个问题,也许是明天,也许是很久,谁知道呢?所以你若是觉得这个方案还可以接受,用以用也是极好的!!!

    (完结)

    原创文章转载请注明.
    作者:jeneser
    项目地址:·ionic实现透明状态栏
    作者github: https://github.com/jeneser

    版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证

    相关文章

      网友评论

      • 背光者:这样写之后,状态栏是透明了,但input框弹不起来啊。
      • 09b376c9a3ec:博主你好,按照你说的步骤,状态栏 已经透明,但是APP上面的标题栏 却往下压了10像素左右,当我把padding-top: ($cordova-md-statusbar-padding)-11; 的时候,标题往上缩了11个像素,遮到的部分显示出来了,但是整个标题栏 却上去了,请问有没有什么解决方案!
      • dml1874:试了几次怎么都没有效果(ionic3、Android7.1.1)
      • a4df2ca51023: ngOnInit() {
        if (this.platform.is('android')) {
        this.statusBar.backgroundColorByHexString("#55fb7981");
        }
        },不同页面不同状态栏实现不了,这样会把其他页面的也改了
        jeneser:@wendy2017 可以实现的,你可以看一下源码。如果的确有问题,你可以提交一个issue详细描述一下。
      • LLG1988:请问这种#551b1d23色值是怎样转换来了
        a4df2ca51023: ngOnInit() {
        if (this.platform.is('android')) {
        this.statusBar.backgroundColorByHexString("#55fb7981");
        }
        },这个在不同页面加载的时候怎么会把所有页面的透明状态栏颜色都改了?
        jeneser: @LLG_5b6f 你可以参考以下链接: https://stackoverflow.com/questions/15852122/hex-transparency-in-colors
      • 2017CBwithMe:楼主你好,我在Stack Overflow过来的,我用你的方法在高版本Android成功透明了status bar,我有一个安卓手机是4.4版本的,并不会工作。请问有解决方法吗?谢谢
        2017CBwithMe:@jeneser 我去看了很多IONIC2的案例,并且下载到我的安卓手机上,都没有透明的status bar。高版本上都有,我想可能大家都没有考虑去在低版本安卓上实现这个功能吧。所以,这应该不是什么大问题。谢谢你的回复。
        jeneser:透明状态栏是在android5之后加入的新特性,底版本的android需要hack,效果不佳,实现起来比较困难,仍需要更多的测试。我这边暂时没有太好的方法使之与ionic很好的结合在一起。如果你发现了更好的解决办法,请在github:https://github.com/jeneser/ionic-super-bar 提交issue给我。Thanks:smile:
      • 75babac31fb2:你好,能帮忙写一个电话骚扰拦截的插件么?有偿的。
        jeneser: @一个萝卜一个我 不好意思啊,没写过这方面的。😀
      • 9218fc6ddc78:我按步骤在安卓5.0+以上的机子上完美实现状态栏透明,可是在安卓4.0的机子上状态栏是黑色的,然后整体的界面向上挪了一点距离,所以在安卓4.0上影响了整体布局,我应该怎么处理?
        周打鱼汤:@jeneser 好的,谢谢!
        jeneser:安卓4.0的机子上状态栏的确是黑色的,不过以前测试时并没有发现影响布局,有段时间没跟进ionic了。如果产生了影响,可以通过调整第三步的css来解决,即是,调整模拟的状态栏的高度。:smiley:
      • jeneser:@hk_sky
        Hi, 你可以clone这个仓库,直接运行 https://github.com/jeneser/ionic2-super-bar 注意Android版本号,这篇文章是大致的思路,具体实现和多种用法看那个仓库吧,最近比较忙,这篇文章抽时间我会再更新的,有什么问题可以直接回我👻 谢谢你的关注😃
        jeneser:@hk_sky 直接克隆之后,按照readme的Transparent statusBar for android描述进行配置,应该不会有问题吧!:smile:
        如果有问题很可能是android的版本问题,透明状态栏和沉浸式状态栏是在android5之后添加的,所以这个这个文章的方法适用于android5+,(稍后我会更新文章)不过也有特殊情况,有同学反馈在部分高版本的华为手机不能实现,但我这的测试,没有这些情况,所以单凭你的描述我不能判断具体的原因,最好是提供一些信息,或者相关的异常截图,直接在这里回,或者简信回都行。Thx! :smiley:
        hk_sky:你的那个demo,我下载了,按你的操作打包装到android设备上,实现不了透明状态栏的啊
      • 99b1bc786a8b:启动图怎么让他的状态栏直接透明
        hk_sky:lz,我按照你的操作后实现不了啊,什么鬼
        jeneser:还真没注意到这个问题:smile:
        暂时没有解决思路,先挖个坑:joy: ...
        如果你解决了,也可以分享出来,共同进步,Thank you !

      本文标题:Ionic实现透明状态栏

      本文链接:https://www.haomeiwen.com/subject/oodzgttx.html