CoordinatorLayout+沉浸式状态栏

直接新建一个项目,选择Scrolling Activity,可以看到默认的

CoordinatorLayout布局

结果:视频传不上来

即展开:
收起:

默认改布局功能展开和收起是不包括statusbar的,该布局实现效果可以看下记事本app。

这里说下当布局需要CoordinatorLayout+沉浸式状态栏实现的过程中的一些问题

首先需求:1.展开状态,actionbar及statusBar背景为一张图片

                  2.RecyclerView向上滑动,actionbar及statusBar背景变为白色; 向下滑动,恢复为图片背景

                  3. 标题固定,不需要有缩放收起的动作

结果:

展开:

收起:

 

要实现statusBar背景同actionBar一致,故而用沉浸式布局:

style中:

<item name="android:windowTranslucentNavigation">false</item>

<item name="android:windowTranslucentStatus">true</item>

<!-- statusbar 不设置透明会导致展开状态的statusbar是系统默认的浅灰色 -->
<item name="android:statusBarColor">@android:color/transparent</item> 

此时布局中statusbar为半透明状态,看上去还是有一层淡灰色盖在背景图片上面:

一顿查找加修修改改后发现去掉<item name="android:windowTranslucentStatus">true</item> 该属性,没有盖在上面了,改实际站位在那里了

关于这个属性实际代码在PhoneWindow.java的generateLayout那里,一堆的flag设置,可以自行找代码看下

前:

后:

惆怅,转了半天状态看还在那, 怎么去掉状态栏,应用的同事,恩 找一下,完美,代码加一下,ok 状态栏没有了,布局全屏了

View decorView = getWindow().getDecorView();
int option = View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;
decorView.setSystemUiVisibility(option);

展开 :

感觉可以了,结果滑动:

 咦,这状态栏还得自己去计算下把高度给加上去?? 而且,这展开的状态栏内容咋还变白色了

 

恩,先把这个白色显示搞掉,看着怪怪得,这时候,用啥别的都没改,主题改了没用,light,dark都是这样,那就是想到反色了,来反色一下:

int option = View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
恩 暂时展开是没问题了,滑动后这个,眼看着是缺个状态栏,纠结了半天怎么判断滑动,给actionBar设置个marginTop状态栏的高度。 头疼,好嘛,再看下CoordinatorLayout这个布局,发现,之前默认这个布局下以及子布局AppBarLayout都是有设置

android:fitsSystemWindows="true" 这个属性的,但是一开始为了去掉statusBar的效果,把它去掉了

     注:fitsSystemWindows:可以让view根据系统窗口来调整自己的布局;简单点说就是我们在设置应用布局时是否考虑系统窗口布局,这里系统窗口包括系统状态栏、导航栏、输入法等,包括一些手机系统带有的底部虚拟按键。android:fitsSystemWindows=”true” (触发View的padding属性来给系统窗口留出空间)

    看下解释,恩 匹配, 加上试下,因为这里是需要滑动后,AppBarLayout 需要适配statusBar,添加至AppBarLayout,运行,滑动,ok,效果完成

展开:

 收起:

    到这里,可以发现,上面这部分的滑动基本就完成了, AppBarLayout默认的title不见了,没关系,刚好我们的标题不需要移动缩放的动作,自己在这个布局Toolbar里加个textView就ok了

   刚关注点都放上面了,因为用了SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 这个全屏的显示,会发现底部的导航栏被底部虚拟导航栏给盖住了,没找到别的方式了,那就计算下底部导航栏高度 给个margin了:

   1)判断底部有没有虚拟导航栏:config_showNavigationBar 反射读这个资源值

Resources res = context.getResources();
int resourceId = res.getIdentifier("config_showNavigationBar", "bool", "android");
if (resourceId != 0) {
return res.getBoolean(resourceId);
}

2) 默认高度为0,若有虚拟导航栏,则反射读取navigation_bar_height 导航栏高度,如果是实体按键这里就返回0,不需要margin,也就不会出现margin出一块空白的现象

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值