2019独角兽企业重金招聘Python工程师标准>>>

项目中我们有时候都要用的透明状态栏(这里也成沉浸式状态栏),今天介绍一个gyf-dev写的一个封装状态栏开源框架

效果图如下:

正文

从Android4.4开始,才可以实现状态栏着色,并且从5.0开始系统更加完善了这一功能。之前写过关于一篇 关于activity状态栏的一些总结 有关Activity样式 、状态栏透明、屏幕亮度问题应用场景及其总结

说明

  • 这是状态栏

  • 这是导航栏(有些手机没有导航栏)

动态图

  • 第一种方案: 可直接在主题中设置
 getWindow().setBackgroundDrawable(null);//设置透明状态栏ViewGroup contentFrameLayout = (ViewGroup) findViewById(Window.ID_ANDROID_CONTENT);View parentView = contentFrameLayout.getChildAt(0);if (parentView != null && Build.VERSION.SDK_INT >= 14) {parentView.setFitsSystemWindows(true);}

或者也可以这样 :

  • 第二种方案:

将布局延伸到状态栏来处理,这次我们使用android:fitsSystemWindows=”true”属性,不让布局延伸到状态栏,这时状态栏就是透明的,然后添加一个和状态栏高、宽相同的指定颜色View来覆盖被透明化的状态栏。我们一步步来实现。

  • 1、第一步还是先将状态栏透明化,方法同上。
  • 2、在布局文件中添加android:fitsSystemWindows=”true”属性:

封装:

 ImmersionBar.with(this).transparentStatusBar()  //透明状态栏,不写默认透明色.transparentNavigationBar()  //透明导航栏,不写默认黑色(设置此方法,fullScreen()方法自动为true).transparentBar()             //透明状态栏和导航栏,不写默认状态栏为透明色,导航栏为黑色(设置此方法,fullScreen()方法自动为true).statusBarColor(R.color.colorPrimary)     //状态栏颜色,不写默认透明色.navigationBarColor(R.color.colorPrimary) //导航栏颜色,不写默认黑色.barColor(R.color.colorPrimary)  //同时自定义状态栏和导航栏颜色,不写默认状态栏为透明色,导航栏为黑色.statusBarAlpha(0.3f)  //状态栏透明度,不写默认0.0f.navigationBarAlpha(0.4f)  //导航栏透明度,不写默认0.0F.barAlpha(0.3f)  //状态栏和导航栏透明度,不写默认0.0f.statusBarDarkFont(true)   //状态栏字体是深色,不写默认为亮色.flymeOSStatusBarFontColor(R.color.btn3)  //修改flyme OS状态栏字体颜色.fullScreen(true)      //有导航栏的情况下,activity全屏显示,也就是activity最下面被导航栏覆盖,不写默认非全屏.hideBar(BarHide.FLAG_HIDE_BAR)  //隐藏状态栏或导航栏或两者,不写默认不隐藏.addViewSupportTransformColor(toolbar)  //设置支持view变色,可以添加多个view,不指定颜色,默认和状态栏同色,还有两个重载方法.titleBar(view)    //解决状态栏和布局重叠问题,任选其一.statusBarView(view)  //解决状态栏和布局重叠问题,任选其一.fitsSystemWindows(true)    //解决状态栏和布局重叠问题,任选其一,默认为false,当为true时一定要指定statusBarColor(),不然状态栏为透明色.supportActionBar(true) //支持ActionBar使用.statusBarColorTransform(R.color.orange)  //状态栏变色后的颜色.navigationBarColorTransform(R.color.orange) //导航栏变色后的颜色.barColorTransform(R.color.orange)  //状态栏和导航栏变色后的颜色.removeSupportView(toolbar)  //移除指定view支持.removeSupportAllView() //移除全部view支持.navigationBarEnable(true)   //是否可以修改导航栏颜色,默认为true.navigationBarWithKitkatEnable(true)  //是否可以修改安卓4.4和emui3.1手机导航栏颜色,默认为true.fixMarginAtBottom(true)   //当xml里使用android:fitsSystemWindows="true"属性时,解决4.4和emui3.1手机底部有时会出现多余空白的问题,默认为false,非必须.addTag("tag")  //给以上设置的参数打标记.getTag("tag")  //根据tag获得沉浸式参数.reset()  //重置所以沉浸式参数.keyboardEnable(true)  //解决软键盘与底部输入框冲突问题,默认为false,还有一个重载方法,可以指定软键盘mode.init();  //必须调用方可沉浸式

使用方式

  • 第一步:基础用法(已经可以满足日常沉浸式)
ImmersionBar.with(this).init();
  • 第二步

在activity的onDestroy方法中执行

ImmersionBar.with(this).destroy(); //不调用该方法,如果界面bar发生改变,在不关闭app的情况下,退出此界面再进入将记忆最后一次bar改变的状态
  • 建议 建议在BaseActivity中初始化和销毁,可以参看demo中 BaseActivity
public class BaseActivity extends AppCompatActivity {private ImmersionBar mImmersionBar;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);mImmersionBar = ImmersionBar.with(this);mImmersionBar.init();   //所有子类都将继承这些相同的属性}@Overrideprotected void onDestroy() {super.onDestroy();mImmersionBar.destroy();  //不调用该方法,如果界面bar发生改变,在不关闭app的情况下,退出此界面再进入将记忆最后一次bar改变的状态}}

  • 如何 隐藏导航栏或状态栏
 /*** 隐藏导航栏或状态栏** @param barHide the bar hide* @return the immersion bar*/public ImmersionBar hideBar(BarHide barHide) {mBarParams.barHide = barHide;if (Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT || OSUtils.isEMUI3_1()) {if ((mBarParams.barHide == BarHide.FLAG_HIDE_NAVIGATION_BAR) ||(mBarParams.barHide == BarHide.FLAG_HIDE_BAR)) {mBarParams.navigationBarColor = Color.TRANSPARENT;mBarParams.fullScreenTemp = true;} else {mBarParams.navigationBarColor = mBarParams.navigationBarColorTemp;mBarParams.fullScreenTemp = false;}}return this;}

部分问题

解决华为emui3.0或者3.1手机手动隐藏导航栏按钮时,导航栏背景未被隐藏的问题

什么叫做手动隐藏,就是下图中标红的向下隐藏按钮

第一种解决方案,监听华为虚拟按钮,建议在baseActivity里使用

 @Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);immersionBar = ImmersionBar.with(this);immersionBar.init();if (OSUtils.isEMUI3_1())  //解决华为emui3.0与3.1手机手动隐藏底部导航栏时,导航栏背景色未被隐藏的问题getContentResolver().registerContentObserver(Settings.System.getUriFor("navigationbar_is_min"), true, mNavigationStatusObserver);}private ContentObserver mNavigationStatusObserver = new ContentObserver(new Handler()) {@Overridepublic void onChange(boolean selfChange) {int navigationBarIsMin = Settings.System.getInt(getContentResolver(),"navigationbar_is_min", 0);if (navigationBarIsMin == 1) {//导航键隐藏了immersionBar.transparentNavigationBar().init();} else {//导航键显示了immersionBar.navigationBarColor(android.R.color.black).fullScreen(false).init();}}};
  • 第二种解决方案,禁止对导航栏相关设置
 ImmersionBar.with(this).navigationBarEnable(false)   //禁止对导航栏相关设置//或者// .navigationBarWithKitkatEnable(false)  //禁止对4.4设备导航栏相关设置.init();

android 6.0 有导航栏效果

项目地址:

https://github.com/androidstarjack/MyStausBarFacoryTest

gyf-dev的博客地址:

https://github.com/gyf-dev/ImmersionBar

博客地址:

http://blog.csdn.net/androidstarjack/article/details/76401105

如果你觉得此文对您有所帮助,欢迎关注 微信技术号:终端研发部

转载于:https://my.oschina.net/u/3877260/blog/2990302

android沉浸式状态栏封装—教你玩出新花样相关推荐

  1. Android沉浸式状态栏,看完这篇就够了!

    背景 之前做过Android沉浸式状态栏的相关需求,但是一直忙于工作,没时间系统的整理下沉浸式相关的知识,所以今天抽出时间,写一篇 Android沉浸式状态栏的文章. 何为沉浸式 沉浸式就是要给用户提 ...

  2. 高大上的Android沉浸式状态栏?

    背景 之前做过Android沉浸式状态栏的相关需求,但是一直忙于工作,没时间系统的整理下沉浸式相关的知识,所以今天抽出时间,写一篇 Android沉浸式状态栏的文章. 何为沉浸式 沉浸式就是要给用户提 ...

  3. Android 沉浸式状态栏 实现方式二 ( 更简单 )

    以前写过一个沉浸式状态栏 的实现方式 Android 沉浸式状态栏 实现方式一 现在有个更为简单的实现方式 . 相关链接 http://www.apkbus.com/forum.php?mod=vie ...

  4. android 5.0状态栏下载地址,Android沉浸式状态栏(5.0以上系统)

    Android沉浸式状态栏(5.0以上系统) 沉浸式状态栏可以分为两种: 1.直接给状态栏设置颜色 (如下图:) 这里写图片描述 java代码形式: if (Build.VERSION.SDK_INT ...

  5. Android 沉浸式状态栏完美解决方案

    Android 沉浸式状态栏完美解决方案 参考文章: (1)Android 沉浸式状态栏完美解决方案 (2)https://www.cnblogs.com/dingxiansen/p/9929828. ...

  6. android 沉浸式开源库,Android沉浸式状态栏

    关于Android沉浸式状态栏, 网上已经有很多开源库, 虽然开源库可以解决某些特定布局下的沉浸式状态栏问题, 但是遇到比较特殊的布局就无法解决了, 所以了解一下沉浸式状态栏如何实现是有必要的. 无论 ...

  7. Android沉浸式状态栏工具类,一句代码轻松搞定

    Android沉浸式状态栏工具类,一句代码轻松搞定 博客原文及源码地址:http://jaeger.itscoder.com/android/2016/03/27/statusbar-util.htm ...

  8. Android底部菜单栏、Android沉浸式状态栏(顶部状态栏修改颜色)、自定义标题栏

    0.简介: 没有使用TabHost切换,而是变成FragmentActivity替换Fragment:沉浸式引用的git上面的jar包. 先看图片 1.底部导航栏 核心代码 <span styl ...

  9. android沉浸式 字体,Android沉浸式状态栏背景色以及字体颜色的修改

    在activity中设置透明状态栏 的思路: 1.让activity的布局全屏 此时布局会和状态栏重叠 2.让布局最上方预留出和状态栏高度一样的高度,将状态栏的背景色设置为透明 效果如下: 一般是在s ...

  10. android 沉浸式状态栏 19,Android 沉浸式状态栏 以及 伪沉浸式状态栏

    小菜最近在调整页面状态栏的效果,主要包括沉浸式状态栏和伪沉浸状态栏(同事唠嗑给定义的玩的). 前段时间整理过一篇 Android 沉浸式状态栏的多种样式,现在小菜在稍微的补充一下,都是在日常应用中测试 ...

最新文章

  1. linux gz bz,linux把文件压缩命令 tar gz bz bz2
  2. Boost:boost::bimaps::multiset_of的测试程序
  3. mysql 排序后 下一条记录_Mysql如何使用order by工作
  4. 读书笔记 数据化营销
  5. java smali_如何把java代码转换成smali代码
  6. 软件项目管理随谈(2)——项目合同问题
  7. ubuntu安装mysql失败了,为啥嘞
  8. wps如何在html中在线浏览器,wps如何设置表格内链接用电脑默认浏览器打开
  9. 计算机桌面无法解锁,电脑win10系统锁屏后解锁却无法进入桌面的解决方法
  10. STM32的0.96寸OLED显示屏显示数据
  11. 防止首网页篡改 html,网站web前端的加密方式 防止数据被篡改
  12. DeepMind已将AlphaGo引入多领域 Al泡沫严重
  13. 【文件上传漏洞-02】利用PUT方法上传文件—以Apache为例
  14. 科技型中小企业评价入库好处有哪些
  15. 计算机视觉:人工智能领域当下火热的计算机视觉技术综述
  16. 授人以鱼,不如授人以渔
  17. Sql增删改查(包含Sql Server基础知识)
  18. mysql 商品库存表设计_mysql – 数据库设计:库存和销售系统?
  19. 关于getchar输入事项
  20. 关于安装Anaconda/Python下OpenCV出错指引

热门文章

  1. 读msdn文档----五种提高SQL性能的方法
  2. 全球计算机科学与技术排名,最新全球高校“计算机科学与信息系统”排名,哪些985表现出色?...
  3. python鼠标键盘事件代码_Python+selenium鼠标、键盘事件
  4. CSDN博文分类全部删除了?
  5. 华为微博抽奖头目两次中奖:大哥咱玩不起,不玩行不行?
  6. 坐高铁只能用身份证了?
  7. 使用之后,谈谈国产芯片的体验
  8. 预言梦可能破坏质能守恒定律
  9. VC下__func__未定义,改用__FUNCTION__
  10. 人工智能不是替代人,而是辅助人