Android延伸布局到状态栏,Android 状态栏透明

前言:最近项目大量用到状态栏透明,网上也出现很多库可以直接拿来用,个人认为没有必要那么重引用到一个库(有木有同学和我有一样的想法),所以研究了一番,在此做个记录加强记忆也便后期查阅,如果无意中有幸能帮助到你那就再好不过了。

一、两个基本概念

Android 从 4.4 (SDK 19) 开始支持系统栏(状态栏+导航栏)半透明效果:

You can now make the system bars partially translucent with new themes,Theme.Holo.NoActionBar.TranslucentDecorandTheme.Holo.Light.NoActionBar.TranslucentDecor. By enabling translucent system bars, your layout will fill the area behind the system bars, so you must also enablefitsSystemWindowsfor the portion of your layout that should not be covered by the system bars.

If you're creating a custom theme, set one of these themes as the parent theme or include thewindowTranslucentNavigationandwindowTranslucentStatusstyle properties in your theme.

翻译一下就是:

TranslucentDecor主题设置了两个属性windowTranslucentStatus和windowTranslucentNavigation都为 true,前者指定状态栏半透明、后者指定导航栏半透明。

本文只探讨“状态栏”。

默认样式是这样:

1850dc5cfc8caa4c3d023f8fa0508a91.png

可见 Toolbar 和系统状态栏之间有明显的分界,我们要实现的效果是 Toolbar 和状态栏背景统一,看起来像是一个整体(自行脑补图片)。

按照官方文档,我们自定义主题:

对应的 Activity 引用该主题:

android:name=".DetailActivity"

android:label="@string/title_activity_detail"

android:theme="@style/AppTheme.NoActionBar.TransparentStatusBar">

我看来看看效果:

91d1655371e0069c43d2ce791372cc5b.png

重要:图上图所示,在 TranslucentStatusBar 主题下,Android 4.4 状态栏背景为默认黑色到透明的渐变,5.0+ 状态栏背景默认为半透明的黑色。

虽然实现了半透明,但是布局被状态栏覆盖,接下来在布局文件中设置fitSystemWindows(注意加到根节点ConstraintLayout上):

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

xmlns:app="http://schemas.android.com/apk/res-auto"

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

android:layout_width="match_parent"

android:layout_height="match_parent"

android:fitsSystemWindows="true"

tools:context="com.netease.mail.statusbar.DetailActivity">

android:id="@+id/app_bar"

android:layout_width="match_parent"

android:layout_height="?attr/actionBarSize"

android:theme="@style/AppTheme.AppBarOverlay"

app:layout_constraintTop_toTopOf="parent">

android:id="@+id/toolbar"

android:layout_width="match_parent"

android:layout_height="?attr/actionBarSize"

app:layout_collapseMode="pin"

app:popupTheme="@style/AppTheme.PopupOverlay"/>

android:layout_width="match_parent"

android:layout_height="0dp"

app:layout_constraintTop_toBottomOf="@id/app_bar"

app:layout_constraintBottom_toBottomOf="parent">

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_margin="@dimen/text_margin"

android:text="@string/large_text"/>

来看看效果:

de10e0bf450f043254028616cca32209.png

虽然布局没有被状态栏覆盖,但是状态栏背景显然这不是我们想要的效果...

为什么状态栏会这么奇怪?

文章开头的定义中我们说了,布局文件会延伸到状态栏所占区域下,fitsSystemWindows的作用是给对应的 View 增加 padding(这里以 ConstraintLayout 为例),目的是为了让其内容不被状态栏遮挡。

在我们的布局文件中 ConstraintLayout 没有设置背景(默认白色),所以状态栏默认的半透明背景色和 ConstraintLayout 的白色背景叠加,就变成了上图中的效果。

【总结】两个基本概念:

1、windowTranslucentStatus设置为true之后,状态栏默认是半透明的(4.4 是黑色到透明色渐变,5.0+ 是纯黑色半透明),和我们要求的透明相去甚远。更重要的是,布局会延伸到状态栏底下。

2、android:fitsSystemWindows 简单理解就是 View 为了适配系统状态栏和导航栏(不被遮挡)自动增加 padding,当然真正的实现原理比这复杂很多而且不同的 View 可以自定义实现方式。

二、透明效果如何实现

所以,为了实现文章开头提出来的“状态栏透明”效果,我们需要处理:

2.1 设置主题

设置 windowTranslucentStatus 为 true,让状态栏半透明。

2.2 布局自适应状态栏

在根节点设置 android:fitsSystemWindows 使其不被状态栏遮挡。

2.3 状态栏透明

Android 4.4 暂时没有办法去掉状态栏的渐变。

Android 5.0+ 开始支持修改状态栏颜色,设置透明色即可把半透明去掉。

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

//兼容5.0及以上支持全透明

activity.window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)

activity.window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_LAYOUT_STABLE

activity.window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)

activity.window.statusBarColor = Color.TRANSPARENT

}通过 theme 设置无效。

看看效果:

6755c42a6061c54486a192e01968fe1c.png

2.4 给布局上色

我们看到即使状态栏透明了,但是其底色是一片白,因为跟节点 ConstraintLayout 没有设置背景,大多情况下我们不会给整个跟节点设置颜色,可以考虑把 android:fitsSystemWindows 设置到子 View 上,本例中是 AppBarLayout(5.0+ 无效,只能显式给 AppBarLayout 加 padding,可以利用其背景色),实际项目中可灵活调整。

最终效果:

11ab8d9a8436380eda0cd2d13754464f.png

至此,完成状态栏透明效果,网上有很多库,实际上都是基于此原理,在此基础上再自定义 View 做为状态栏背景。

参考

本文来自网易实践者社区,经作者黄仕彪授权发布。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/531595.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为HarmonyOS 鸿蒙,华为鸿蒙HarmonyOS2.0手机开发者Beta版正式发布

据悉,本次手机开发者Beta测试支持以下中国境内主制式手机及平板电脑。手机:全网通(5G双卡)P40 、 全网通版P40 Pro、Mate30、Mate30(5G) 、Mate30 Pro、Mate30 Pro(5G),型号清单为ANA-AN00、ELS-AN00、TAS-AL00、TAS-AN00、LIO-AL00、LIO-AN0…

android oneshot自动播放bug,移动端常见bug汇总001

前言本文是摘录整理了移动端常见的一些bug以及解决方案,第一篇,后面还会有持续的文章更新整理。点击样式闪动Q: 当你点击一个链接或者通过Javascript定义的可点击元素的时候,它就会出现一个半透明的灰色背景。A:根本原因是-webkit-tap-highli…

int.class 与 Integer.class

TYPE 表示的引用类型所对应的基本类型的Class对象! 转载于:https://www.cnblogs.com/hujunzheng/p/4055471.html

android uber启动动画,模仿Uber的启动画面(上)

启动画面(Splash Screen)——不但给开发者们提供了一个尽情发挥、创建有趣动画的机会,也填补了App启动时从终端慢吞吞地下载数据的时间。启动画面(动态的)对于App至关重要:它可以让用户不失兴趣地耐心等待应用完成加载。尽管现在的启动画面多种多样&…

智慧屏用鸿蒙的生态,紧随鸿蒙OS手机版 ,智慧屏为什么对鸿蒙生态这么重要?...

原标题:紧随鸿蒙OS手机版 ,智慧屏为什么对鸿蒙生态这么重要?12 月 21 日,华为正式发布了两款智慧屏新品,智慧屏 S 系列和车载智慧屏,前者是智慧屏的新系列,后者则是新开辟的车机产品线。没有意外…

MySQL不能插入中文字符及中文字符乱码问题

MySQL的默认编码是Latin1,不支持中文,要支持中午需要把数据库的默认编码修改为gbk或者utf8。在安装后MySQL之后,它的配置文件不是很给力,不知道你们的是不是,反正我的是! 开始插入中文字符的时候出现如下错…

codeforces C. Bits(数学题+或运算)

题意:给定一个区间,求区间中的一个数,这个数表示成二进制的时候,数字1的个数最多! 如果有多个这样的数字,输出最小的那个! 思路:对左区间的这个数lx的二进制 从右往左将0变成1&#…

r语言 发送邮件html,r语言读取数据的方法

R 对于基于 SQL 语言的关系型数据库有良好的支持,这些数据库既有商业数据库 Oracle、Microsoft SQL Server、IBM DB2 等,也包含在 GNUGeneral Public License (GPL) 下发布的 MySQL 等开源数据库。RMySQL 包中提供了到 MySQL 数据库的接口;RO…

eclipse开发web应用程序步骤(图解)

*运行环境(也就是服务器的选择) 环境搭建好之后开始编写web程序!然后右键->Run as -> Run on Server! 转载于:https://www.cnblogs.com/hujunzheng/p/4083560.html

android 测光模式,Android Camera1中的对焦与测光

Android Camera1开发系列连载:Android Camera1详解Android Camera1显示预览的四种方式对焦模式在使用特定的对焦模式的时候,必须确保相机支持该模式,相机支持的对焦模式可以通过Parameters#getFocusMode接口来获取:常用的对焦模式…

html5做一个展示页面,基于HTML5的WebGL实现json和echarts图表展现在同一个界面

突然有个想法,如果能把一些用到不同的知识点放到同一个界面上,并且放到一个盒子里,这样我如果要看什么东西就可以很直接显示出来,而且这个盒子一定要能打开。我用HT实现了我的想法,代码一百多行,这么少的代…

Netbeans 中创建数据连接池和数据源步骤(及解决无法ping通问题)

1.启动glassfish服务器, 在浏览器的地址栏中输入 http://localhost:4848 2.首先建立JDBC Connection Pools; 3.new 一个Connectio Pools 4.对General Settings属性填写; 5.填写Datasource Classname:com.mysql.jdbc.jdbc2.optiona…

Netbeans不能正常启动glassfish或者部署失败不能运行的问题

错误信息:D:\临时文件\netbeans\WebTest\build\web中部署GlassFish Server 4, deploy, Connection refused: connect, falseD:\临时文件\netbeans\WebTest\nbproject\build-impl.xml:1048: 尚未部署该模块。有关详细信息, 请查看服务器日志。构建失败 (总时间: 7 秒…

计算机的好处英语,电脑的好处英语演讲稿

电脑的好处英语演讲稿The computer plays the vital role in ours life, the computer may help us to handle very many matters: The data computation, the study entertainment, the office automation, the control production, draws money automatically, long-distance…

计算机重应用,装了一大堆应用,iPhone6会变重吗?

你有没有想过,iPhone买来以后装入数十甚至上百个应用,手机是否在重量上发生了变化。广泛接受马克思主义教育的人类表示:别闹了,数据和信息属于意识,怎么能有重量(或者应该叫质量)。更何况这个所谓的“信息爆炸”时代每…

电子商务专业需要考计算机证吗,电子商务必考的证有哪些

2020-03-14 16:31:11文/钟诗贺电子商务是当今非常热门的学科,必考的专业证书主要有电子商务员、电子商务师等等。电子商务专业介绍电子商务专业是融计算机科学、市场营销学、管理学、经济学、法学和现代物流于一体的新型交叉学科。该专业培养掌握计算机信息技术、市…

陷阱计算机音乐谱大全,陷阱 原版C调-王北车-和弦谱-《弹吧》官网tan8.com-和弦谱大全,学吉他,秀吉他...

E此浏览器不支持画布前奏扫弦 C Fm C Fm C Am F G7主C Em一封信两年都没动笔C Am三个字过了几个四季F G你是有多想逃避Em Am来不及问问你Dm G我已经错过相爱的日期C Em那天你消失在人海里C Am你的背影沉默得让人恐惧F G Em Am你说的那些问题 我回答得很坚定Dm G偏偏那个时候我最…

江苏省公务员计算机类130分,130分,在江苏省考中是什么水平?

原标题:130分,在江苏省考中是什么水平?关键词回复获取更多详情更多公考常识,后台回复【常识】更多公考素材,后台回复【素材】【130】在江苏算是公考进面的一道普遍门槛。对于2020江苏省考的考生,130分应定为…

软件测试项目时间一般多少钱,项目的时间进度该如何估算?

后来,开发一周左右,发现原来使用的模块,要用新的接口A,但是接口A还不能满足我现有的需求,必须需要程序员A重新包装给我,这样再等了一下午,第二天,问题不断,不停的跟程序员…

计算机寄存器端口,CPU和外设之间的数据传送方式有哪几种

数据传输(data transmission),指的是依照适当的规程,经过一条或多条链路,在数据源和数据宿之间传送数据的过程。也表示借助信道上的信号将数据从一处送往另一处的操作。CPU与外设之间的数据传输有以下三种方式:程序方式、中断方式…