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,一经查实,立即删除!

相关文章

glassfish服务器默认的网页所在的位置

http://localhost:8080/ 默认打开的网页所在的位置 E:/glassfish-4.1/glassfish/domains/domain1/docroot/index.html 转载于:https://www.cnblogs.com/hujunzheng/p/4052920.html

华为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…

http协议客户端向服务器端请求时一般需要发送的内容

out.println("GET /shopping/index.html HTTP/1.1");//请求行 包括请求方式,文件路径, http协议版本(必写)请求头.... out.println("Aceept: */*");//客户端能够处理的文件类型(不是必须&#xff…

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至关重要:它可以让用户不失兴趣地耐心等待应用完成加载。尽管现在的启动画面多种多样&…

java中产生对象的两种方式

/** 普通new对象的过程!*/Person pp new Person();System.out.println(pp);/** 利用代用参数的构造器产生对象实例!* 首先获得相应带参数的构造器,然后利用构造器产生对象实例!*/pclass Class.forName("get_class_method.P…

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

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

java中反射机制通过字节码文件对象获取字段和函数的方法

pclass Class.forName("get_class_method.Person");//Field ageField pclass.getField("age");//因为age成员变量是私有的,所以会产生NoSuchFieldException异常Field ageField pclass.getDeclaredField("age");//获得该对象反映此…

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

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

android计算距离顶部的距离,(lua版)计算距离的逻辑是从Android的提供的接口(Location.distanceBetween)中拔来的,应该是最精确的方法了...

---coding by yuangu(lifulinghanaol.com)--用于计算2个pgs之间的距离function computeDistance(lat1, lon1,lat2, lon2)-- Based on http://www.ngs.noaa.gov/PUBS_LIB/inverse.pdf-- using the "Inverse Formula" (section 4)local MAXITERS 20;-- Convert lat/lo…

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

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

密码与确认密码自动验证html,HTML确认密码

今天准备分享一个小知识点,就是确认登录界面输入户名: 输入密码: 确认密码: function validate() {var pw1 document.getElementById("pw1").value;var pw2 document.getElementById("pw2").value;if(pw1 …

实现单词大小写不敏感的正则表达式的匹配!

//实现单词大小写不敏感的正则表达式的匹配! //方法1: tmp "java java JavaJAVA"; px Pattern.compile("java", Pattern.CASE_INSENSITIVE); mx px.matcher(tmp); System.out.println(mx.replaceAll("JAVA")); //方法二…

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

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

正则表达式之IP地址检验

String ipRegex "^(\\d|[1-9]\\d|1\\d*|2[0-4]\\d|25[0-5])(\\.\\1){3}$"; /* * \\d|[1-9]\\d|1\\d*|2[0-4]\\d|25[0-5] * 该段的数字只有一位的时候,两位数字的时候,三位数字的时候(1开头的和2开头的) * \\1 表示向前…

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接口来获取:常用的对焦模式…

eclipes创建一个web项目web.xml不能自动更新的原因(web.xml和@WebServlet的作用)

在eclipse中创建一个Web项目的时候,虽然有web.xml生成,但是再添加Servlet类文件的时候总是看不见web.xml的更新,所以异常的郁闷!上网查了查,原来我们在创建Web项目的时候,会弹出一个对话框,“Dy…

android贝塞尔曲线多点,Canvas 贝塞尔曲线的多点波动

JavaScript语言:JaveScriptBabelCoffeeScript确定function Ball(x, y, radius) {this.x x;this.y y;this.radius radius;this.vx 20;this.vy 10;}Ball.prototype.draw function(ctx) {ctx.save();ctx.translate(this.x, this.y);ctx.fillStyle rgba(255, 255…