android半透明(为什么Android要支持半透明)
一、android 怎么给一块区域设置背景半透明
activity的背景透明,只需在只要在配置文件内activity属性配置内加上android:theme="@android:style/Theme.Translucent"就好了。
但是想要多方面的设置theme的话,就要在values里设置风格先:
加透明:
先在res/values下建colors.xml文件,写入:
<?xmlversionxmlversion="1.0"encoding="UTF-8"?>
<resources>
<colornamecolorname="transparent">#9000</color><!--透明度-->
</resources>
这个值设定了整个界面的透明度,为了看得见效果,现在设为透明度为56%(9/16)左右。
透明度可以用#9000值调,将这个值(ARGB)改变,就会有不同效果的透明度。
再在res/values/下建styles.xml,设置程序的风格
<?xmlversionxmlversion="1.0"encoding="utf-8"?>
<resources>
<stylenamestylename="Transparent">
<item name="android:windowBackground">@color/transparent</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowAnimationStyle">@+android:style/Animation.Translucent</item>
</style>
</resources>
加了@+android:style/Animation.Translucent这句的时候就会显示出此activity会有动画切换效果
最后一步,把这个styles.xml用在相应的Activity上。即在AndroidManifest.xml中的任意标签中添加 android:theme="@style/transparent"
如果要设置所有的activity都使用这个风格,就把这句标签语句添加在中。
二、为什么很多 Android apps 仍不适配透明状态栏
我觉得有几个原因:
1.android目前支持你说的透明状态栏只有android5.0及5.0以上的版本。而市面上仍有很多低于5.0以下的手机。
2.google官方推荐开发者开发Material风格的app,但我在市面上极少见到过具有Material风格的商业应用。这说明这种理念还不够普及。
3.最重要的一点,状态栏在手机应用上只占据了很小的一块区域。更多的人觉得没有必要做这种沉浸式的状态栏。在我看来沉浸式的状态栏能提高用户体验,让整个应用的风格统一化,开发的时候,需求文档里没有提及的并且只要我觉得合适,我都会尝试做沉浸式的状态栏的。
三、Android 状态栏透明
前言:最近项目大量用到状态栏透明,网上也出现很多库可以直接拿来用,个人认为没有必要那么重引用到一个库(有木有同学和我有一样的想法),所以研究了一番,在此做个记录加强记忆也便后期查阅,如果无意中有幸能帮助到你那就再好不过了。
Android从 4.4(SDK 19)开始支持系统栏(状态栏+导航栏)半透明效果:
翻译一下就是:
TranslucentDecor主题设置了两个属性 windowTranslucentStatus和 windowTranslucentNavigation都为 true,前者指定状态栏半透明、后者指定导航栏半透明。
本文只探讨“状态栏”。
默认样式是这样:
可见 Toolbar和系统状态栏之间有明显的分界,我们要实现的效果是 Toolbar和状态栏背景统一,看起来像是一个整体(自行脑补图片)。
按照官方文档,我们自定义主题:
对应的 Activity引用该主题:
我看来看看效果:
虽然实现了半透明,但是布局被状态栏覆盖,接下来在布局文件中设置 fitSystemWindows(注意加到根节点 ConstraintLayout上):
来看看效果:
虽然布局没有被状态栏覆盖,但是状态栏背景显然这不是我们想要的效果😭
为什么状态栏会这么奇怪?
文章开头的定义中我们说了,布局文件会延伸到状态栏所占区域下, fitsSystemWindows的作用是给对应的 View增加 padding(这里以 ConstraintLayout为例),目的是为了让其内容不被状态栏遮挡。
在我们的布局文件中 ConstraintLayout没有设置背景(默认白色),所以状态栏默认的半透明背景色和 ConstraintLayout的白色背景叠加,就变成了上图中的效果。
【总结】两个基本概念:
1、 windowTranslucentStatus设置为true之后,状态栏默认是半透明的(4.4是黑色到透明色渐变,5.0+是纯黑色半透明),和我们要求的透明相去甚远。更重要的是,布局会延伸到状态栏底下。
2、 android:fitsSystemWindows简单理解就是 View为了适配系统状态栏和导航栏(不被遮挡)自动增加 padding,当然真正的实现原理比这复杂很多而且不同的 View可以自定义实现方式。
所以,为了实现文章开头提出来的“状态栏透明”效果,我们需要处理:
设置 windowTranslucentStatus为 true,让状态栏半透明。
在根节点设置 android:fitsSystemWindows使其不被状态栏遮挡。
Android 4.4暂时没有办法去掉状态栏的渐变。
Android 5.0+开始支持修改状态栏颜色,设置透明色即可把半透明去掉。
看看效果:
我们看到即使状态栏透明了,但是其底色是一片白,因为跟节点 ConstraintLayout没有设置背景,大多情况下我们不会给整个跟节点设置颜色,可以考虑把 android:fitsSystemWindows设置到子 View上,本例中是 AppBarLayout(5.0+无效,只能显式给 AppBarLayout加 padding,可以利用其背景色),实际项目中可灵活调整。
最终效果:
至此,完成状态栏透明效果,网上有很多库,实际上都是基于此原理,在此基础上再自定义 View做为状态栏背景。