android让状态栏透明
1. 如何实现android沉浸式状态栏
有些手机是强制改变通知栏颜色的,比如魅族,苹果。但是目前主要还是通过代码作出自己想要的效果。
Android 4.4之前,即使我们打开手机app,我们还总是能看到系统顶部那条黑乎乎的通知栏,这样会使得app稍显突兀。于是Android 4.4开始,便引入了Translucent System Bar的新特性,用于弥补系统通知栏突兀之处。
状态栏透明后,你可以选择设置其颜色或者显示背景图片。效果如下
<?xmlversion="1.0"encoding="utf-8"?><resources>
<!--red-->
<colorname="md_red_50_color_code">#fde0dc</color>
<colorname="md_red_100_color_code">#f9bdbb</color>
<colorname="md_red_200_color_code">#f69988</color>
<colorname="md_red_300_color_code">#f36c60</color>
<colorname="md_red_400_color_code">#e84e40</color>
<colorname="md_red_500_color_code">#e51c23</color>
<colorname="md_red_600_color_code">#dd191d</color>
<colorname="md_red_700_color_code">#d01716</color>
<colorname="md_red_800_color_code">#c41411</color>
<colorname="md_red_900_color_code">#b0120a</color>
<colorname="md_red_a100_color_code">#ff7997</color>
<colorname="md_red_a200_color_code">#ff5177</color>
<colorname="md_red_a400_color_code">#ff2d6f</color>
<colorname="md_red_a700_color_code">#e00032</color>
<!--pink-->
<colorname="md_pink_50_color_code">#fce4ec</color>
<colorname="md_pink_100_color_code">#f8bbd0</color>
<colorname="md_pink_200_color_code">#f48fb1</color>
<colorname="md_pink_300_color_code">#f06292</color>
<colorname="md_pink_400_color_code">#ec407a</color>
<colorname="md_pink_500_color_code">#e91e63</color>
<colorname="md_pink_600_color_code">#d81b60</color>
<colorname="md_pink_700_color_code">#c2185b</color>
<colorname="md_pink_800_color_code">#ad1457</color>
<colorname="md_pink_900_color_code">#880e4f</color>
<colorname="md_pink_a100_color_code">#ff80ab</color>
<colorname="md_pink_a200_color_code">#ff4081</color>
<colorname="md_pink_a400_color_code">#f50057</color>
<colorname="md_pink_a700_color_code">#c51162</color>
<!--deep_purple-->
<colorname="md_deep_purple_50_color_code">#ede7f6</color>
<colorname="md_deep_purple_100_color_code">#d1c4e9</color>
<colorname="md_deep_purple_200_color_code">#b39ddb</color>
<colorname="md_deep_purple_300_color_code">#9575cd</color>
<colorname="md_deep_purple_400_color_code">#7e57c2</color>
<colorname="md_deep_purple_500_color_code">#673ab7</color>
<colorname="md_deep_purple_600_color_code">#5e35b1</color>
<colorname="md_deep_purple_700_color_code">#512da8</color>
<colorname="md_deep_purple_800_color_code">#4527a0</color>
<colorname="md_deep_purple_900_color_code">#311b92</color>
<colorname="md_deep_purple_a100_color_code">#b388ff</color>
<colorname="md_deep_purple_a200_color_code">#7c4dff</color>
<colorname="md_deep_purple_a400_color_code">#651fff</color>
<colorname="md_deep_purple_a700_color_code">#6200ea</color>
<!--yellow-->
<colorname="md_yellow_50_color_code">#fffde7</color>
<colorname="md_yellow_100_color_code">#fff9c4</color>
<colorname="md_yellow_200_color_code">#fff59d</color>
<colorname="md_yellow_300_color_code">#fff176</color>
<colorname="md_yellow_400_color_code">#ffee58</color>
<colorname="md_yellow_500_color_code">#ffeb3b</color>
<colorname="md_yellow_600_color_code">#fdd835</color>
<colorname="md_yellow_700_color_code">#fbc02d</color>
<colorname="md_yellow_800_color_code">#f9a825</color>
<colorname="md_yellow_900_color_code">#f57f17</color>
<colorname="md_yellow_a100_color_code">#ffff8d</color>
<colorname="md_yellow_a200_color_code">#ffff00</color>
<colorname="md_yellow_a400_color_code">#ffea00</color>
<colorname="md_yellow_a700_color_code">#ffd600</color>
<!--orange-->
<colorname="md_orange_50_color_code">#fff3e0</color>
<colorname="md_orange_100_color_code">#ffe0b2</color>
<colorname="md_orange_200_color_code">#ffcc80</color>
<colorname="md_orange_300_color_code">#ffb74d</color>
<colorname="md_orange_400_color_code">#ffa726</color>
<colorname="md_orange_500_color_code">#ff9800</color>
<colorname="md_orange_600_color_code">#fb8c00</color>
<colorname="md_orange_700_color_code">#f57c00</color>
<colorname="md_orange_800_color_code">#ef6c00</color>
<colorname="md_orange_900_color_code">#e65100</color>
<colorname="md_orange_a100_color_code">#ffd180</color>
<colorname="md_orange_a200_color_code">#ffab40</color>
<colorname="md_orange_a400_color_code">#ff9100</color>
<colorname="md_orange_a700_color_code">#ff6d00</color>
<!--...............................-->
<!--grey-->
<colorname="md_grey_50_color_code">#fafafa</color>
<colorname="md_grey_100_color_code">#f5f5f5</color>
<colorname="md_grey_200_color_code">#eeeeee</color>
<colorname="md_grey_300_color_code">#e0e0e0</color>
<colorname="md_grey_400_color_code">#bdbdbd</color>
<colorname="md_grey_500_color_code">#9e9e9e</color>
<colorname="md_grey_600_color_code">#757575</color>
<colorname="md_grey_700_color_code">#616161</color>
<colorname="md_grey_800_color_code">#424242</color>
<colorname="md_grey_900_color_code">#212121</color>
<colorname="md_black_color_code">#000000</color>
<colorname="md_white_color_code">#ffffff</color>
<!--blue_grey-->
<colorname="md_blue_grey_50_color_code">#eceff1</color>
<colorname="md_blue_grey_100_color_code">#cfd8dc</color>
<colorname="md_blue_grey_200_color_code">#b0bec5</color>
<colorname="md_blue_grey_300_color_code">#90a4ae</color>
<colorname="md_blue_grey_400_color_code">#78909c</color>
<colorname="md_blue_grey_500_color_code">#607d8b</color>
<colorname="md_blue_grey_600_color_code">#546e7a</color>
<colorname="md_blue_grey_700_color_code">#455a64</color>
<colorname="md_blue_grey_800_color_code">#37474f</color>
<colorname="md_blue_grey_900_color_code">#263238</color>
<resources>
2. 如何将状态栏设置透明
Android4.4以后, 可以将状态栏设置为透明, 或者任意颜色
1. 全屏模式
最基本的在4.4版本之下会加载默认的values/styles.xml, 如果在4.4版本会加载 values-v19/styles.xml, 5.0以上加载 values-v21/styles.xml文件. 具体配置如下:
values/styles.xml
<style name="ImageTranslucentTheme" parent="AppTheme">
<!--在Android 4.4之前的版本上运行,直接跟随系统主题--></style>123
values-v19/styles.xml
<style name="ImageTranslucentTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowTranslucentNavigation">true</item>
</style>1234
values-v21/styles.xml
<style name="ImageTranslucentTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="android:windowTranslucentStatus">false</item>
<item name="android:windowTranslucentNavigation">true</item>
<!--Android 5.x开始需要把颜色设置透明,否则导航栏会呈现系统默认的浅灰色-->
<item name="android:statusBarColor">@android:color/transparent</item>
</style>
3. Android 沉浸式/透明式状态栏、导航栏
Android 从4.4开始引进透明状态栏和导航栏的概念,并且在5.0进行了改进,将透明变成了半透明的效果。虽然此特性最早出现在ios,但不否认效果还是很赞的。
至于4.4以下的手机,就不要考虑此特性了,好在4.4以下的手机份额已经非常小了。
我们先来看一下透明状态栏的实现,两种常见效果图如下:
虚拟导航栏并不是所有的手机都有,华为的手机多比较常见,就是上图屏幕底部按钮那块区域。设置导航栏和状态栏类似:
这是官方的解释,大致意思就是我们在布局的最外层设置 android:fitsSystemWindows="true",会在屏幕最上方预留出状态栏高度的padding。
由于fitsSystemWindows属性本质上是给当前控件设置了一个padding,所以我们设置到根布局的话,会导致状态栏是透明的,并且和窗口背景一样。
但是多数情况,我们并不在根布局设置这个属性,我们想要的无外乎是让内容沉浸在状态栏之中。所以我们经常设置在最上端的图片背景、Banner之类的,如果是Toolbar的,我们可以使用一层LinearLayout包裹,并把这个属性设置给LinearLayout,这样就可以避免Toolbar的内容下沉了。如:
上述方法可以解决普通页面的透明式状态栏需求,如有复杂需求可以参考下面这些:
Android 系统状态栏沉浸式/透明化完整解决方案
Android 沉浸式状态栏的实现
Android沉浸式状态栏(透明状态栏)最佳实现
还有开源库推荐: ImmersionBar
4. android导航栏与状态栏颜色及透明度
首先创建一个空项目,如下图
可以看到状态栏是白字黑背景, 导航栏也是白图标黑背景
嘿嘿, 我们先把状态栏隐藏掉,在添加一个ImageView, 让ImageView做背景(方便查看)
样子如下:
将状态栏和导航栏设置透明, 找到 Manifest.xml 文件, 在主题样式中修改
android:statusBarColor 设置状态栏背景色
android:navigationBarColor 同上
android:windowLightStatusBar 设置状态栏文字色, true为深色, false为白色
android:windowLightNavigationBar 同上
android:windowTranslucentStatus 设置状态栏半透明状态, true为半透明, false为不透明
android:windowTranslucentNavigation 同上
最后两个半透明状态下面没用, 可自己尝试看效果
效果图如下:
可以看到导航栏与状态栏并没有透明,原因是默认不能占用状态栏空间与导航栏空间,根布局背景为白色,所有这里显示白色
可以通过设置 getWindow().getDecorView().setSystemUiVisibility() 来适配
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 适配状态栏空间
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 适配导航栏空间
效果如下: