沉浸式状态栏与导航条

安卓笔记侠 安卓笔记侠     2022-09-01     350

关键词:

  在4.4之前状态栏一直是黑色的,在4.4中带来了 windowTranslucentStatus 这一特性,因此可以实现给状态栏设置颜色,如下图所示,状态栏颜色不再是黑色,而是可以定制的颜色。

  国内将状态栏变色叫做沉浸式状态栏,时间久了,叫的人多了,大家就不再深究,默认了这种叫法。

 

方法1:系统的方式沉浸式状态栏实现

步奏一

//当系统版本为4.4或者4.4以上时可以使用沉浸式状态栏
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
       //透明状态栏
       getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
       //透明导航栏
       getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
}

步奏二

布局加入:
android:fitsSystemWindows="true"
android:clipToPadding="true"

eg:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:fitsSystemWindows="true"
        android:clipToPadding="true"
        android:layout_width="match_parent"
        android:layout_height="140dp"
        android:textSize="24dp"
        android:background="@color/mask_tags_1"
        android:text="你好,沉浸式状态栏"/>

</LinearLayout>

方法2:动态添加布局 实现沉浸式状态栏

添加隐藏布局,然后我们动态的计算状态栏的高度,然后把这个高度设置成这个隐藏的布局的高度

xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    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"
    android:orientation="vertical"
    tools:context="com.example.translucentbarstest.TwoActivity">

    <!--这个是隐藏的布局,然后通过动态的设置高度达到效果-->
    <LinearLayout
        android:id="@+id/ll_bar"
        android:layout_width="fill_parent"
        android:layout_height="1dp"
        android:orientation="vertical"
        android:background="#e7abff"
        android:visibility="gone">
    </LinearLayout>
    <TextView
        android:fitsSystemWindows="true"
        android:clipToPadding="true"
        android:layout_width="match_parent"
        android:layout_height="140dp"
        android:background="@color/mask_tags_3"
        android:text="你好,沉浸式状态栏"/>

</LinearLayout>

java:

public class SecondActivity extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_two);
        initState();
    }

    /**
     * 动态的设置状态栏  实现沉浸式状态栏
     *
     */
    private void initState() {
        //当系统版本为4.4或者4.4以上时可以使用沉浸式状态栏
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            //透明状态栏
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            //透明导航栏
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
            //
            LinearLayout linear_bar = (LinearLayout) findViewById(R.id.ll_bar);
            linear_bar.setVisibility(View.VISIBLE);
            //获取到状态栏的高度
            int statusHeight = getStatusBarHeight();
            //动态的设置隐藏布局的高度
            LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) linear_bar.getLayoutParams();
            params.height = statusHeight;
            linear_bar.setLayoutParams(params);
        }
    }

    /**
     * 通过反射的方式获取状态栏高度
     *
     * @return
     */
    private int getStatusBarHeight() {
        try {
            Class<?> c = Class.forName("com.android.internal.R$dimen");
            Object obj = c.newInstance();
            Field field = c.getField("status_bar_height");
            int x = Integer.parseInt(field.get(obj).toString());
            return getResources().getDimensionPixelSize(x);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return 0;
    }
}

方法3:用的github上的第三方库

1.库地址:https://github.com/jgilfelt/SystemBarTint

2.添加依赖库: 
  compile ‘com.readystatesoftware.systembartint:systembartint:1.0.3’

步骤1:

android:fitsSystemWindows="true"
android:clipToPadding="true

步骤2:

SystemBarTintManager tintManager = new SystemBarTintManager(this);
// 激活状态栏
tintManager.setStatusBarTintEnabled(true);
// enable navigation bar tint 激活导航栏
tintManager.setNavigationBarTintEnabled(true);
//设置系统栏设置颜色
//tintManager.setTintColor(R.color.red);
//给状态栏设置颜色
tintManager.setStatusBarTintResource(R.color.mask_tags_1);
//Apply the specified drawable or color resource to the system navigation bar.
//给导航栏设置资源
tintManager.setNavigationBarTintResource(R.color.mask_tags_1);

eg:

xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    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"
    android:background="#ffff"
    android:orientation="vertical"
    tools:context="com.example.translucentbarstest.ThirdActivity">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="140dp"
        android:background="@color/mask_tags_5"
        android:clipToPadding="true"
        android:fitsSystemWindows="true"
        android:text="你好,沉浸式状态栏"
        android:textSize="24dp"/>
</LinearLayout>

java:

public class ThreeActivity extends AppCompatActivity{
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_three);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            //透明状态栏
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            //透明导航栏
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
            SystemBarTintManager tintManager = new SystemBarTintManager(this);
            // 激活状态栏
            tintManager.setStatusBarTintEnabled(true);
            // enable navigation bar tint 激活导航栏
            tintManager.setNavigationBarTintEnabled(true);
            //设置系统栏设置颜色
            //tintManager.setTintColor(R.color.red);
            //给状态栏设置颜色
            tintManager.setStatusBarTintResource(R.color.mask_tags_1);
            //Apply the specified drawable or color resource to the system navigation bar.
            //给导航栏设置资源
            tintManager.setNavigationBarTintResource(R.color.mask_tags_1);
        }
    }
}

 

  

 

沉浸式导航栏及状态栏系统图标颜色的改变

最近研究沉浸式导航栏,上网看了好多,差不多实现都是一样的。。。。代码如下: //透明状态栏getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);//透明导航栏getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIG 查看详情

android实现沉浸式全屏(代码片段)

前言本文总结Android实现沉浸式全屏的实现方式。实现沉浸式全屏在一些需要全屏显示的场景下,比如玩游戏、看横屏视频的时候,内容全屏,占满窗口的体验会让用户更加沉浸到对内容的消费中,带来好的用户体验。沉浸式显... 查看详情

沉浸式状态栏的三种实现方式

沉浸式算是目前Android行业比较流行的一种App设计风格,将菜单栏北京设置为导航栏的颜色,感觉顶部状态栏像是被入侵了一样,因此称为沉浸式菜单栏。本文将介绍三种方式去实现沉浸式状态栏。  Google从androidkitkat(Androi... 查看详情

分别用toolbar和自定义导航栏实现沉浸式状态栏

一、ToolBar1、在build.gradle中添加依赖,例如:compile‘com.android.support:appcompat-v7:23.4.0‘2、去掉应用的ActionBar。可以是修改主题theme为“NoActionBar”,例如:<stylename="AppTheme"parent="Theme.AppCompat.Light.NoActionBar">或者 查看详情

android沉浸式/透明式状态栏、导航栏

...并不在根布局设置这个属性,我们想要的无外乎是让内容沉浸在状态栏之中。所以我们经常设置在最上端的图片背景、Banner之类的,如果是Toolbar的,我们可以使用一层LinearLayout包裹,并把这个属性设置给LinearLayout,这样就可以... 查看详情

android--------沉浸式状态栏immersionbar3.0(代码片段)

沉浸式状态栏我一直在使用的一个库ImmersionBar,非常不错,现在都3.0了android4.4以上沉浸式状态栏和沉浸式导航栏管理,适配横竖屏切换、刘海屏、软键盘弹出等问题,可以修改状态栏字体颜色和导航栏图标颜色&#x... 查看详情

android--------沉浸式状态栏immersionbar3.0(代码片段)

沉浸式状态栏我一直在使用的一个库ImmersionBar,非常不错,现在都3.0了android4.4以上沉浸式状态栏和沉浸式导航栏管理,适配横竖屏切换、刘海屏、软键盘弹出等问题,可以修改状态栏字体颜色和导航栏图标颜色&#x... 查看详情

flutter沉浸式透明状态栏|flutter自定义凸起bottomappbar导航(代码片段)

...颜色背景,使titleBar能够和状态栏融为一体,增加沉浸感。 如上图:Flutter状态栏默认为黑色半透明,那么如何去掉这个状态栏的黑色半透明背景色,让其和标题栏颜色一 查看详情

知识教程|优化状态栏沉浸式效果

沉浸式状态栏是让开发者尤其是Android开发者很头疼的问题,耗费开发者很多精力去校验代码在各个系统版本、各个机型上是否有效,今天这篇教程就跟大家分享优化初始化状态栏沉浸式效果的方法。使用APICloud时,参照社区源码... 查看详情

导航栏与状态栏

//具体的控制器设置状态栏样式overridevarpreferredStatusBarStyle:UIStatusBarStyle{return.lightContent}//如果控制器被添加到导航控制器中,上段代码失效,需要在导航控制器中添加以下代码//导航控制器不再统一设置状态栏样式,交给具体的控... 查看详情

android透明状态栏和沉浸式的实现

Android透明状态栏和沉浸式的实现1.什么是沉浸式根据百度百科上的定义,沉浸式就是要给用户提供完全沉浸的体验,使用户有一种置身于虚拟世界之中的感觉。其真正含义并不是大家所想的那样,对屏幕状态栏进行一些操作,甚至... 查看详情

iOS:向应用程序窗口添加导航栏与状态栏冲突

】iOS:向应用程序窗口添加导航栏与状态栏冲突【英文标题】:iOS:AddingnavigationbartoApplicationwindowcollideswithstatusbar【发布时间】:2018-02-2414:58:07【问题描述】:我在应用程序窗口中添加了导航栏,但导航栏与状态栏发生冲突。(我... 查看详情

在 iOS 7 中让导航栏与状态栏重叠

】在iOS7中让导航栏与状态栏重叠【英文标题】:LettingtheNavigationbaroverlaptheStatusbariniOS7【发布时间】:2013-08-2215:01:40【问题描述】:我想制作一个使用导航栏的应用程序,但仅用于显示标题和一些按钮(它使用vie容器)。我希望... 查看详情

如何匹配导航栏与状态栏ios7

】如何匹配导航栏与状态栏ios7【英文标题】:HowtomatchNavigationbarwithstatusbarios7【发布时间】:2014-02-0704:38:37【问题描述】:我正在开发一个基于UINavigationController的应用程序,其中我呈现的视图之一是模态的,我需要一个手动添加... 查看详情

react-native沉浸式状态栏(代码片段)

使用StatusBar即可实现沉浸式,但是必须把背景色设置为透明。否则如果有不同页面的头部颜色不一样的话,导航栏的颜色动画会很怪异,不会是跟着页面一起动画。<StatusBarbarStyle='light-content'backgroundColor='rgba(0,0,0,0)'... 查看详情

iOS11中没有状态栏的导航栏与安全区域重叠

】iOS11中没有状态栏的导航栏与安全区域重叠【英文标题】:NavigationBarwithoutstatusbaroverlapssafeareainiOS11【发布时间】:2017-09-2717:20:30【问题描述】:iOS11的iPhoneX模拟器有问题。我有一个没有状态栏的视图控制器。为此,我添加:-(B... 查看详情

管理systemui(状态栏+导航栏)

...,如下图)与应用程序同时显示。应用程序显示沉浸式的内容时,比如电影或者照片,可以临时地变暗系统栏图标从而让人减少分心,或者为了一个完全的沉浸式体验而隐藏系统栏。 本文主要讲解怎样去调... 查看详情

管理systemui(状态栏+导航栏)

...,如下图)与应用程序同时显示。应用程序显示沉浸式的内容时,比如电影或者照片,可以临时地变暗系统栏图标从而让人减少分心,或者为了一个完全的沉浸式体验而隐藏系统栏。 本文主要讲解怎样去调... 查看详情