Android沉浸式状态栏实现

delphi 安卓开发实现沉浸式状态栏 有了上面这三步,功能基本就实现了,但我们会发现界面顶部与底部都有被遮挡的问题,这个简单,后面我们所有创建的FORM,都把最上面的控件和最下面的控件进行Margin设定就可以了。比如上面图片的界面,我把最上面的ToolBar的Margin TOP设置为35,底部TabControl的Margin Buttom设定为15,显示就刚刚好,不是吗?然而之前在网上搜索,找了好多资料,不是修改这个就是修改那个,一番操作下来都不是我想要的效果,下面我把我实现的方式分享给大家,希望对大家有用。 阅读详情

应用市场上App越来越多的出现沉浸式状态栏的设计(如下图所示)状态栏和导航栏具有相同的颜色。Android在4.4开始对于该种效果的支持,而在4.4之下,状态栏只是黑框,无法控制。同时在4.4和5.0及其之上的版本对该种效果的支持又有所差异,因此要实现该种效果,可以将4.4归为一类,5.0及其之上归为一类。接下来,我们将一步步来在4.4和5.0及其之上来实现如下所示效果。

导航栏问题

在Android中,顶部导航栏目前常用的两种实现方式,一个是通过Toolbar,一个是通过自定义View的方式来实现。两种方式各有利弊。Toolbar为官方指定规范,开发者使用更方便,但可拓展性差,对于一些特殊的展示效果无法实现,而通过自定义方式的方式,可以支持更多展示效果,但却需要我们写更多的代码。两种方式在实现状态栏沉浸上也有所差别。

去掉Title
  • Toolbar

    默认主题会具有一个title,当我们使用Toolbar的时候,而没有去掉title,应用则会crash,报出如下所示错误。

因此在使用Toolbar 的时候,我们需要style中添加如下属性配置

<item name="windowNoTitle">true</item>

当然我们也可以通过代码动态去掉title,但当我们的主题从 Theme.AppCompat 作为父类继承的时候,通过代码并不可以去掉title。

  • 自定义导航栏

当我们未设置 windowNoTitle 属性的时候,在导航栏之上有title。显然和我们要实现导航栏的沉浸式有所违背,因此实现对于导航栏的沉浸,

<item name="windowNoTitle">true</item> 该配置是必不可少的。

设置状态栏透明

去掉title之后,是否我们就可以实现上述的效果了呢?

这个时候,我们发现状态栏还是黑色,并没有沉浸,需要我们将状态栏设置为透明。

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

该属性只有在在4.4和高于4.4版本上可以进行该属性的配置,但是在更低版本上则无法使用。配置该属性之后,执行效果如下图所示。

解决导航栏上移问题

这个时候,Toolbar被整体上移了,导致其部分功能也进入了状态栏之下,包括导航栏的内容也到了状态栏位置之中,显然这是不符合我们最初的要求的。如何解决这个问题?我们在Toolbar中添加 fitSystemWindows 属性,即可使得toolbar的上部空出一个高度,使得Toolbar内容部分脱离状态栏。

<android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:fitsSystemWindows="true"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    </android.support.v7.widget.Toolbar>

得到我们最终想要得到的效果

自定义导航栏与之实现类似。

fitsSystemWindows属性

前面对Toolbar的设置是在Toolbar中添加的 fitSystemWindows 属性,那么当我们将其属性添加到Toolbar所在的最外层的布局会怎么样呢?

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_toolbar"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
tools:context="com.example.netease.toolbardemo.activity.ToolbarActivity">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    </android.support.v7.widget.Toolbar>

</RelativeLayout>

执行之后,可以看到和之前未设置状态栏透明时的效果相同。

那么这个fitSystemWindows工作的原理是什么呢?通过上述实验,不难发现,对于沉浸状态栏的控制,该属性起到了一个很关键的作用。

接下来通过一个实验来验证下,该属性所起的作用,在Toolbar所在的布局中,在布局的底部添加一个 Button .

<android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:fitsSystemWindows="true"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    </android.support.v7.widget.Toolbar>

    <Button
        android:text="Test"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/colorAccent"
        android:layout_alignParentBottom="true"/>

当我们将该属性设置到按钮上,又会发生什么呢?

<Button
        android:text="Test"
        android:fitsSystemWindows="true"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/colorAccent"
        android:layout_alignParentBottom="true"/>

通过比较可以很明显的看出,设置了 fitsSystemWindows 属性的View在其上部被设置了一个padding。根据之前做的实验,我们可以知道当我们设置了窗口状态栏透明之后,整个内容视图会向上移动了一个状态栏的高度,而当前为该View增加的padding的大小是不是和其高度相同呢?

Button btn = (Button) findViewById(R.id.test_btn);
 Log.i("padding", btn.getPaddingTop()+"");
 Rect frame = new Rect();
 getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
 Log.i("height", frame.top+"");

获取按钮的padding高度和状态栏的高度,我们可以得到如下日志。

通过实验我们可以得出结论, fitSystemWindows 属性会对所设置的View增加一个top padding,因此当我们在实现让导航栏沉浸的时候,设置窗口状态栏的透明会使得视图整体上移,而借助fitSystemWindows 属性的功能,为视图中最顶部的View设置一个和状态栏高度相同的padding,使得导航栏不会被顶到状态栏内。

当我们在一个视图中,多个View设置该属性时,发现只有第一个设置该属性的View会起作用,在视图布局上,自上而下的第一个View其作用。层级上则为最顶级的View上首先其作用。因此其功能归纳为:

  • 为设置该属性的View增加一个和状态栏高度相同的toppadding

  • 当视图中有多个View被设置了该属性,那么只布局上最顶部的View起作用

5.0及其以上

至此,我们可以完美的实现一个状态栏的沉浸,上述的实现是在Android 4.4版本上,在视图的最上部,会有一个黑色渐变的阴影,而在5.0设备上的展示效果如下所示,在状态栏上整个都会有一个阴影。当然不同厂家对此也有自己的一些优化,比如魅族在4.4上是不具有阴影的。

对于5.0及其之上,官方提供了对状态栏颜色控制的相应API,我们可以通过代码来控制状态栏的颜色,实现如下效果。

实现代码

if(Build.VERSION.SDK_INT >= 21) {
            Window window = getWindow();
            //取消设置透明状态栏,使 ContentView 内容不再沉浸到状态栏下
            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            //需要设置这个 flag 才能调用 setStatusBarColor 来设置状态栏颜色
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            //设置状态栏颜色
            window.setStatusBarColor(getResources().getColor(R.color.yx_red));
        }

据此可以看出,当我们在5.0及其之上的实现中,可以不用进行状态栏透明的设置和 fitSystemWindows 属性的设置,直接通过代码来控制,但为了适应4.4版本,建议在代码中仍然按之前的方式实现,如果想在5.0及其高版本中实现去阴影,再手动在代码中控制。

Android 最新实现沉浸式状态栏的效果 什么是状态栏: 是指手机左上最顶上,显示中国移动、安全卫士、电量、网速等等,在手机的顶部。下拉就会出现通知栏。 下面我放一张图带大家认识一下 沉浸式状态栏:: 简单来说就是状态栏会根据手机内容适应性变色,使软件和系统本身更加融为一体,大大提升了用户体验。 下面我来介绍一下 一、标题栏延伸到状态栏 适用于Android6.0+ 因为我的标题栏是白色,而Android 系统状态栏的字色和图标颜色也为白色,所以这样就会导致状态栏上的内容比如时间,电量等等就看不清楚了。 这个问题在Android 6.0的时候得到 阅读详情

相关推荐

Android沉浸式状态栏与侧滑菜单实现教程

本文还有配套的精品资源,点击获取 简介:在Android应用开发中,实现沉浸式状态栏和侧滑菜单能显著提升用户体验。沉浸式状态栏通过延伸内容到状态栏下方,使得应用界面看起来更现代和一体化。侧滑菜单则用于实现界面间的便捷切换,常用于导航和设置等。文章将详细探讨这两个特性在Android中的实现方法,包括API级别适配、自定义主题以及状态栏颜色管理等,并通过实践项目加深理解。 ...

weixin_42465332的博客 1932

关于沉浸式状态栏的理解

一. 沉浸式状态栏无非就两种 第一种:设置状态栏透明,布局会往上撑 状态栏全透明或半透明,然后activity布局会向上移,撑到状态栏里面(API>=19时,才会往上撑),如下图所示: 对于这种沉浸式 在布局头部加上一个跟ToolBar颜色相近的View即可,高度为25dp(API>=19)或0dp(API<19)。(状态栏高度为25dp,并且API>=19的时候,ac...

weixin_33863087的博客 182

Android应用中的SlidingMenu侧滑与沉浸式状态栏实现

SlidingMenu是一个非常流行的Android库,它允许开发者轻松地实现一个侧滑菜单。侧滑菜单是指用户从屏幕的左侧或右侧滑动以显示附加的视图或菜单,这样的设计可以提高应用的交互性和可用性。通过SlidingMenu库,可以在不离开当前活动的情况下访问其他内容,提供了更加流畅的用户体验。SlidingMenu库的优势在于其灵活性和易用性,它支持多种类型的视图和布局,并且可以很容易地集成到现有的Android项目中。

weixin_35949153的博客 1000

ANDROID 状态栏一体化

第一种方法: 在oncreate()方法中执行代码: getWindow()         .addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); 当界面中有edittext控件市,有时会出现屏幕上移的现象, 解决方法是 添加代码 getWindow().setSoftInputMode(WindowMana

u010536476的博客 304

掌握Android沉浸式状态栏的实现与应用

为了实现一个统一的用户体验,开发者通常会创建自定义主题来定义应用的颜色、字体以及其他样式元素。这些自定义主题会继承自Android的基本主题,并通过覆盖属性来调整状态栏的视觉表现。以下是一个简单的自定义主题的例子,该主题定义了状态栏颜色为蓝色:-- 自定义状态栏颜色 -->-- 其他样式设置 --></style>在该主题中,项被设置为应用的深色主题颜色,通常用于状态栏和导航栏的背景。通过修改这一属性值,可以快速地改变状态栏的颜色。

weixin_29092787的博客 802

基于simulink的变压器保护仿真设计【MATLAB源码+Word文档】

电力系统变压器保护MATLAB/simulink仿真设计。纵联差动保护-过电流保护-距离保护

weixin_761237174的博客 1270

android 状态栏 上移,教程分享:如何实现Android沉浸式状态栏——教你让你的状态栏变个色!...

package com.zhy.colorfulstatusbar;import android.annotation.TargetApi;import android.app.Activity;import android.content.Context;import android.graphics.Color;import android.os.Build;import android.vi...

weixin_29025911的博客 291

Keil5保姆级安装指南:从破解到STM32开发环境配置(附常见错误解决方案)

本文提供Keil5从安装到STM32开发环境配置的完整指南,包含破解步骤、常见错误解决方案及多芯片支持配置。详细讲解环境预检、核心安装、许可证管理及高效开发环境设置,帮助开发者快速搭建嵌入式开发平台。特别针对安装和卸载过程中的关键问题提供专业解决方案。

weixin_30369041的博客 124

Android 沉浸式总结

本文总结了Android实现沉浸式状态栏的几种方法。首先需要设置透明状态栏主题,并通过fitsSystemWindows属性控制视图与系统栏的交互。测试发现,单独使用FrameLayout加该属性无效,而CoordinatorLayout能使其生效,因其内部处理了该属性标记。两种实现方案:1) CoordinatorLayout结合CollapsingToolbarLayout,可实现图片延伸至状态栏;2) 直接使用FrameLayout时,需通过代码设置SYSTEM_UI_FLAG_LAYOUT_FULL

xiangxiongfly 1万+

RKNN3588——YOLOv8的PT模型转RKNN模型

1. 首先克隆rknn修改后的ultralytics版本项目到本地主要是修改了源码的ultralytics/nn/modules/head.py和ultralytics/engine/exporter.py两个文件。2. 使用修改后的ultralytics对pt模型进行模型转换,此处的format=rknn代表支持rknn后续的转换,而不是用onnx,一定要注意!!!

张飞飞的博客 7169

黑暗中的爆破(船讯网Ais爬虫暨爬虫实战js逆向学习经验分享)

船讯网 爬虫 js逆向 python

returnadsss的博客 1575

Android 最简单的安卓沉浸式状态栏实现 Java

沉浸式状态栏介绍 沉浸式状态栏式Android 4.4 引入的一个机制,可以将手机顶端的状态栏颜色融入当前app的界面中,而不至于和app的界面以及配色有着明显的割裂。 在如今手机全面屏化的促进下,并且由于安卓手机的碎片化各家的状态栏背景颜色可能还不一定一致。在不进行沉浸式状态栏适配的app在大屏占比的手机上就会显得异常突兀,下面我就介绍一种最快速方便的将当前app和顶部状态栏实现沉浸式体验的方法。 沉浸式状态栏实现 首先需要明确使用下面的方法需要安卓4.4 KITKAT以上的系统,具体实现仅仅需要两步

weixin_45751409的博客 1058

python k线顶分型_【缠论】分型、笔的定义及其程序化

K线包含关系处理和分型的定义如果一个K线的高低点全在另一K线的范围里,称之为包含关系。针对这种K线,需要进行一些处理,去除包含关系,处理方法:向上时,把两K线的高点当高点,而两K线低点中的较高者当成低点;反之,当向下时,把两K线的低点当低点,而两K线高点中的较低者当成高点,这样就把两K线合并成一新的K线。经过这样的处理,所有K线图都可以处理成没有包含关系的图形。两K线的包含关系,可以分成四种:1)...

weixin_39717152的博客 2823

Qt实现安卓沉浸式状态栏

Qt实现安卓沉浸式状态栏Qt实现安卓沉浸式状态栏 Qt实现安卓沉浸式状态栏 笔者写写此篇文章的时候,Qt已经发布了Qt 6版本,相比Qt 5版本有很大改变。所以此篇文章基于Qt 6.2而写。沉浸式状态栏的具体的实现过程,笔者参考了Qt android 设置系统状态栏为全透明,半透明、全屏,设置状态栏颜色,修改程序图标这篇文章,这篇里面写的很详细了,这篇文章的作者使用的是Qt 5,笔者这里主要写与Qt 6的不同,顺便简化一下过程。 首先需要一个.java文件,使用Qt就可以新建一个.java文件,复制以下内容

sdustzk的博客 3100

SAR ADC和sigma delta ADC的区别

0、ADC基本概念 ADC,即analog to digital converter,模拟到数字的转换器,简称模数转换器。 为什么需要ADC?因为现实的世界中,电信号是连续的,例如心电信号,或者声音信号,这些连续的信号被称为“模拟信号”。 图1:心电信号 图2:声音信号 然而这种连续的信号是无法被计算机处理的,计算机只认识0和1组成的“数字信号“。ADC就充当了这样一个桥梁,将“模拟信号”转换为计算机能识别的“数字信号”。举个例子,当前的心电电压为1.2V(实际没有这么高),ADC可能会得

长河柱天的博客 2万+

1、初探 Tiny Machine Learning

Tiny Machine Learning(TinyML)是机器学习与嵌入式系统的融合领域,致力于在资源受限的微控制器上运行AI模型。本文介绍了机器学习基础、TinyML的核心概念、应用领域(如智能家居、工业物联网、医疗保健)、面临的挑战(如资源限制、模型压缩、数据质量),以及从硬件准备到模型部署的实践步骤。通过利用训练与推理的资源不对称性,可在PC上训练模型并部署至低功耗设备进行实时推理,推动边缘智能的发展。

loss4bartender的博客 121

Android史上最简单的沉浸式状态栏实现,不要再乱了

沉浸式状态栏,不用我说,大家都知道。就是让你的应用跟状态栏融为一体,视觉上体验更加完美。 Android的沉浸式状态栏实现本来是挺简单的一件事情,但是大家有没有一种感觉,太乱了!本来还有一点思路的,看完网上一大堆的文章以后,更加的懵逼,感觉就是真TM的复杂。今天我就做一个最简单的总结,看完之后大家就知道怎么做了,不用那么复杂。 沉浸式状态栏主要分三种版本情况(4.4以下版本不做考虑,保持原...

shving的专栏 4663

高级技能-高可用和容灾-两地三中心、异地多活架构

两地三中心和异地多活是当前主流的跨地域高可用架构方案。两地三中心通过生产中心、同城灾备和异地灾备的组合,提供多级容灾能力,适合对数据安全要求高的行业。异地多活则采用单元化设计,多个站点同时服务,提升资源利用率,但需解决网络延迟、数据冲突等挑战。两种架构在RTO/RPO、一致性、改造成本等方面各具特点,企业应根据业务规模、一致性要求和预算进行选择,可考虑从同城双活起步,逐步向异地多活演进。混合架构可能是平衡容灾与多活的务实方案。

zhongjianfeng100的博客 168

android实现沉浸式状态栏

1、工程的build.gradle中加入依赖 implementation 'com.github.crossoverone:StatusBarUtil:1.3.3' 2、项目的build.gradle中加入 allprojects { repositories { google() jcenter() maven { url 'https...

weixin_43117800的博客 408

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Android 沉浸式状态栏的实现

​ 一提到沉浸式状态栏,第一个浮现在脑海里的词就是“碎片化”。碎片化是让 Android 开发者很头疼的问题,相信没有哪位开发者会不喜欢“write once, run anywhere”的感觉,碎片化让我们不得不耗费精力去校验代码在各个系统版本、各个机型上是否有效。因此以前我一直把沉浸式状态栏看作一块难啃的骨头,但是该面对的问题迟早还是要面对,所以,不如就此开始吧。 沉浸式状态栏的实现 方法一:通过设置 Theme 主题设置状态栏透明 因为 API21 之后(也就是 android 5.0 之后)的状态栏

Grekit_Sun的博客 2328

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

安卓实现沉浸式状态栏,兼容小米、魅族

现阶段不是很忙,就总结一下自己都实现过的功能。这一篇总结安卓实现沉浸式状态栏Android4.4(API 19) - Android 5.0(API 21): 这个阶段可以实现沉浸式,但是表现得还不是很好,实现方式为: 通过FLAG_TRANSLUCENT_STATUS设置状态栏为透明并且为全屏模式,然后通过添加一个与StatusBar 一样大小的View,将View 的 background 设...

点滴之路的博客 3574

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Android实现沉浸式状态栏的那些坑

最近项目需要实现沉浸式的状态栏,其实我在之前就了解过Android的沉浸式,发现有些棘手就放弃了,但是此次是公司的项目需要的,就花了几天把这个问题搞定了,在此记录一下,并mark几个坑。 首先,沉浸式是Android 4.4及以上才有的,在后续的5.0及6.0上面都增加了一些相关支持,于是问题就不太好办了。先看我实现的效果: 首先,在4.4版本添加了WindowManager.LayoutP

年少的风 4万+

Android中实现沉浸式状态栏的功能

Android中实现沉浸式状态栏的功能 1. 先上效果图,实现沉浸式状态栏有两种方式,一种是通过写Theme主题的方式,另一种是写代码的方式。若要使多个页面出现沉浸式状态栏,则使用主题的方式更方便,如果只要使单个页面出现,则使用代码方式更好!当然了,看个人喜好而去。 2. 先来介绍写主题的方式 2.1 先在res包下新建values-v19和values-v21两个包,为了兼容Android高低...

weixin_43796132的博客 789

Android 实现沉浸式状态栏

文章转载自 原文:点击访问 现在越来越多的软件都开始使用沉浸式状态栏了,下面总结一下沉浸式状态栏的两种使用方法 注意!沉浸式状态栏只支持安卓4.4及以上的版本状态栏:4.4上是渐变色,5.0上是完全透明,本文模拟器为4.4演示 效果图: 注意!两种方法的区别:第一种:为顶部栏跟随当前activity的布局文件的背景的颜色,使用方便,不过也有点问题就是,如果有底部虚拟导航键

zhangkaidsy的博客 2163
上一篇: 菜单开源库装逼大全
下一篇: 【干货】支付宝App架构揭秘—使用的开源组件总结!
探索者丶
博客等级 码龄10年 29粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值