MaterialDesign-沉浸式设计

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

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


       <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
    "colorPrimary">@color/colorPrimary_pink
    "colorPrimaryDark">@color/colorPrimary_pinkDark
    
    
        style>

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

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

(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">trueitem>

(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”
②.需要知道状态栏的高度是多少?去源码里面找找

  
                <dimen name="status_bar_height">24dpdimen>
        
        <dimen name="navigation_bar_height">48dpdimen>

反射手机运行的类: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

你可能感兴趣的:(Android,高级UI)