MaterialDesign-沉浸式设计

一、什么是沉浸式?
官方的沉浸式Translucent:就是让整个APP沉浸(充斥了整个屏幕)在屏幕里面,没有显示状态栏,甚至没有显示底部导航栏。
平时大家所讨论的沉浸式:比如QQ的顶部Toolbar和状态栏程一体的颜色。

二、StatusBar兼容开发(状态栏)
1、 5.0以上的 API
5.0+自动实现了沉浸式效果,状态栏的颜色跟随你的主题里面的colorPrimaryDark属性。
(1)通过设置主题实现

<!-- Application theme. -->
       <style name="AppTheme" parent="AppBaseTheme">
    <!-- All customizations that are NOT specific to a particular API-level can go here. -->
    <item name="android:textColor">@color/mytextcolor</item>
    <item name="colorPrimary">@color/colorPrimary_pink</item>
    <item name="colorPrimaryDark">@color/colorPrimary_pinkDark</item>
    <!--     <item name="android:windowBackground">@color/background</item> -->
    <!--     <item name="colorAccent">#906292</item> -->
        </style>

(2)通过设置样式属性解决

<item name="android:statusBarColor">@color/system_bottom_nav_color</item>

(3)通过代码设置

//5.0+可以直接用API来修改状态栏的颜色。
getWindow().setStatusBarColor(getResources().getColor(R.color.material_blue_grey_800));

(注意:要在setContentView方法之前设置)

2、4.4 API
(低于4.4API,不可以做到)
用到一些特殊手段!—-4.4(KitKat)新出的API,可以设置状态栏为透明的。
(1).在属性样式里面解决(不推荐使用,因为兼容不好)

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

(2).在代码里面解决

    getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    setContentView(R.layout.activity_main);

出现副作用:
APP的内容顶到最上面去了,即状态栏会遮挡一部分界面。
解决办法:
1)给Toolbar设置:

android:fitsSystemWindows="true"

该属性的作用:设置布局时,是否考虑当前系统窗口的布局,如果为true就会调整整个系统窗口布局(包括状态栏的view)以适应你的布局。
但是:又出现了一个bug,当里面有ScrollView并且ScrollView里面有Edittext的时候,就会出现软键盘一弹起就会把toolbar拉下来,很难看这种办法有什么价值呢?如果里面没有ScrollView就可以用。

2)推荐方式:
发现给布局最外层容器设置:

android:fitsSystemWindows="true" 

可以达到状态栏透明,并且露出底色—android:windowBackground颜色。不会出现toolbar被状态栏遮挡的情况。巧妙地解决:步骤:
①.在最外层容器设置android:fitsSystemWindows=”true”
不要给Toolbar设置android:fitsSystemWindows=”true”
②.直接将最外层容器(也可以修改-android:windowBackground颜色)设置成状态栏想要的颜色
③.下面剩下的布局再包裹一层正常的背景颜色。

3)通过修改Toolbar的高度实现:
①.不要给Toolbar设置android:fitsSystemWindows=”true”
②.需要知道状态栏的高度是多少?去源码里面找找

  <!-- Height of the status bar -->
                <dimen name="status_bar_height">24dp</dimen>
        <!-- Height of the bottom navigation / system bar. -->
        <dimen name="navigation_bar_height">48dp</dimen>

反射手机运行的类:android.R.dimen.status_bar_height.

③.修改Toolbar的PaddingTop(因为纯粹增加toolbar的高度会遮挡toobar里面的一些内容)

toolbar.setPadding(toolbar.getPaddingLeft(),                toolbar.getPaddingTop()+getStatusBarHeight(this), 
toolbar.getPaddingRight(),
toolbar.getPaddingBottom());

④.或者可以设置toolbar的高度(不推荐)

备注:
第三方的沉浸式解决方案:SystemTint。

三、NavigationBar沉浸式效果

1、5.x 底部虚拟导航沉浸效果

(1)属性解决
navigationBarColor
(2)代码
getWindow().setNavigationBarColor()

2、4.4
用到一些特殊手段!—-4.4(KitKat)新出的API,可以设置虚拟导航栏为透明的。步骤:
(1)在布局底部添加一个高度为0.1dp的view
(2)动态设置底部View的高度为虚拟导航栏的高度

View nav = findViewById(R.id.nav);
LayoutParams p = nav.getLayoutParams();
p.height += getNavigationBarHeight(this);
nav.setLayoutParams(p);

3、做兼容性判断
1.SDK版本不一样
两个区间:①. 大于5.0;②.=<4.4sdk<5.0

2.有的没有虚拟导航栏,判断是否有虚拟导航栏(源码里面有方法可以得到是否有虚拟导航,反射得到)

3.有的有虚拟导航,但是还可以开关,判断是否虚拟导航栏打开了

可以一步解决2、3两个问题:

NavigationBarHeight=整个屏幕的高度 - 内容部分view的高度 判断是否>0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值