(推荐)沉浸式状态栏实现,完美适配Android刘海屏,终极兼容

2018-12-14 17:16:51

刘海屏出来有一段时间了,为了适配刘海屏找了不少方案,感觉都比较费劲。 

因为我们项目需求,状态栏是渐变色,所以我采用了全面屏的模式来对标题栏状态栏进行开发; 


总体思路:刘海屏状态栏的高度其实和普通的都是一样,所以只要给全面屏的页面设置一个paddingtop就可以实现,我是写一个公共的头部布局在基类里用,给头布局设置一个paddingtop,paddingtop的值就是状态栏的高度。具体代码如下: 




第一步:设置全屏,设置状态栏透明 



    /*

     * @param activity

     */

    public static void fullScreen(Activity activity) {

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {

                //5.x开始需要把颜色设置透明,否则导航栏会呈现系统默认的浅灰色

                Window window = activity.getWindow();

                View decorView = window.getDecorView();

                //两个 flag 要结合使用,表示让应用的主体内容占用系统状态栏的空间

                int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN

                        | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;

                decorView.setSystemUiVisibility(option);

                window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);

                window.setStatusBarColor(Color.TRANSPARENT));

            } else {

                Window window = activity.getWindow();

                WindowManager.LayoutParams attributes = window.getAttributes();

                int flagTranslucentStatus = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;

                int flagTranslucentNavigation = WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION;

                attributes.flags |= flagTranslucentStatus;

                window.setAttributes(attributes);

            }

        }

    }

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25




第二步:添加头布局 


也可以使用跟布局,具体情况看自己的项目


<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    tools:context=".base.MVPBaseActivity">

    <!-- 顶部导航 -->

    <include

        android:id="@+id/includ_title"

        layout="@layout/header_title_layout" />

    <!-- 中间填充部分 -->

    <FrameLayout

        android:id="@+id/fl_body"

        android:layout_width="fill_parent"

        android:layout_height="fill_parent"

        android:layout_below="@+id/includ_title"

        android:orientation="vertical" />

</RelativeLayout>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18




第三步:给头布局设置布局的paddingtop 


根据SDK号去判断是否设置paddingtop,不支持沉浸式状态栏的机型,直接不进行设置即可。这样既实现了沉浸式状态栏,同时又适配了刘海屏,不需要考虑手机品牌等问题。


/*

 * @param view 需要设置的view,我这里用到的是布局文件中的include_title

 */

public void setBarPadding(View view) {

        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {

            view.setPadding(view.getPaddingLeft(),UIUtils.dip2px(8),view.getPaddingRight(), view.getPaddingBottom());

        } else {

            view.setPadding(view.getPaddingLeft(), getStatuBarHeight(), view.getPaddingRight(), view.getPaddingBottom());

        }

    }


  • 2019-08-22 13:35:27

    Generator函数的语法

    执行Generator函数会返回一个遍历器对象,也就是说,Generator函数除了是状态机还是一个遍历器对象生成函数。 返回遍历器对象,可以依次遍历Generator函数内部的每一个状态。

  • 2019-08-22 16:38:15

    理解JS原型对象与原型链(重要清晰)

    JavaScript 常被描述为一种基于原型的语言 (prototype-based language)——每个对象对应拥有一个原型,对象以其原型为模板、从原型继承方法和属性。而同时原型也是对象,它也拥有原型,并从中继承方法和属性,一层一层、以此类推。这种关系常被称为原型链 (prototype chain),它解释了为何一个对象会拥有定义在其他对象中的属性和方法。

  • 2019-08-22 17:26:21

    详解javaScript的深拷贝

    最开始意识到深拷贝的重要性是在我使用redux的时候(react + redux), redux的机制要求在reducer中必须返回一个新的对象,而不能对原来的对象做改动,事实上,当时我当然不会主动犯这个错误,但很多时候,一不小心可能就会修改了原来的对象,例如:var newObj = obj; newObj.xxx = xxx 实际上,这个时候newObj和obj两个引用指向的是同一个对象,我修改了newObj,实际上也就等同于修改了obj,这,就是我和深浅拷贝的第一次相遇。

  • 2019-08-22 19:14:21

    Android Studio 3.5最新特性

    Android Studio(以下简称为AS) 3.5正式版终于发布了,从第一个bate版本发布到正式版本,历时三个半月。AS一直以来被开发者吐槽,因此谷歌也放慢了版本的变化,对测试版本进行大力度的优化,提高了稳定性。从3.3版本开始,谷歌启动了名为Project Marble的计划,意为谷歌团队致力于使集成开发环境(IDE)的基本功能和流程变得坚如磐石,同时精炼和完善面向用户的功能。而AS 3.5则是Project Marble主要成果的版本,下面来介绍主要成果。

  • 2019-08-27 05:43:13

    Laravel 门面自动补全工具 laravel-ide-helper

    当我们在 PhpStorm 编辑器中,开发 Laravel 框架的项目时,很多类方法都不能自动补全和定位,比如 Facade 门面的方法,DB::table()、Route::get() 等。