开门见山。
原来做的效果,如下图(顶部有一条明显的橙色状态栏):

 
a1.gif

改过之后(顶部状态栏是透明的):

 
p2.gif

我发现网上写的一些文章,不够简洁明了,我整理了一下,复制粘贴一下就可以在项目中运用。

首先,在你的Activity中添加下面四个方法(或者封装在一个工具类中)

   /**
* 全透状态栏
*/
protected void setStatusBarFullTransparent() {
if (Build.VERSION.SDK_INT >= 21) {//21表示5.0
Window window = getWindow();
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(Color.TRANSPARENT);
} else if (Build.VERSION.SDK_INT >= 19) {//19表示4.4
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
//虚拟键盘也透明
//getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
}
} /**
* 半透明状态栏
*/
protected void setHalfTransparent() { if (Build.VERSION.SDK_INT >= 21) {//21表示5.0
View decorView = getWindow().getDecorView();
int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
decorView.setSystemUiVisibility(option);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); } else if (Build.VERSION.SDK_INT >= 19) {//19表示4.4
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
//虚拟键盘也透明
// getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
}
} /**
* 如果需要内容紧贴着StatusBar
* 应该在对应的xml布局文件中,设置根布局fitsSystemWindows=true。
*/
private View contentViewGroup; protected void setFitSystemWindow(boolean fitSystemWindow) {
if (contentViewGroup == null) {
contentViewGroup = ((ViewGroup) findViewById(android.R.id.content)).getChildAt(0);
}
contentViewGroup.setFitsSystemWindows(fitSystemWindow);
} /**
* 为了兼容4.4的抽屉布局->透明状态栏
*/
protected void setDrawerLayoutFitSystemWindow() {
if (Build.VERSION.SDK_INT == 19) {//19表示4.4
int statusBarHeight = getStatusHeight(this);
if (contentViewGroup == null) {
contentViewGroup = ((ViewGroup) findViewById(android.R.id.content)).getChildAt(0);
}
if (contentViewGroup instanceof DrawerLayout) {
DrawerLayout drawerLayout = (DrawerLayout) contentViewGroup;
drawerLayout.setClipToPadding(true);
drawerLayout.setFitsSystemWindows(false);
for (int i = 0; i < drawerLayout.getChildCount(); i++) {
View child = drawerLayout.getChildAt(i);
child.setFitsSystemWindows(false);
child.setPadding(0,statusBarHeight, 0, 0);
} }
}
}

然后,在Activity的onCreate()方法中调用即可。示例如下

Activity

public class TestActivity extends AppCompatActivity {

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test); setHalfTransparent();
setFitSystemWindow(false);
} protected void setHalfTransparent()...
protected void setStatusBarFullTransparent()...
protected void setFitSystemWindow()...
protected void setDrawerLayoutFitSystemWindow()...
}

布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:id="@+id/drawerLayout"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/bg_start"> <Button
android:id="@+id/button"
android:layout_width="100dp"
android:layout_height="40dp"
android:layout_marginLeft="50dp"
android:background="#F86254"
android:text="button"
android:textColor="@color/white" /> </LinearLayout>

1.未做任何设置

可见,Android5.0以上由于默认是Material Design,顶部是蓝色状态栏。而5.0以下,默认都是黑色,而且无法修改。

 
nothing.png

2.半透明状态栏,fitsSystemWindows=false

@Override
public void init(Bundle savedInstanceState) {
setHalfTransparent();
setFitSystemWindow(false);
}
 
half_not_fit.png

可见,5.0以上蓝色状态栏没了,变成了半透明的黑色,而内容区域则有了全屏的效果。
但是也要知道一点,那个红色的TextView,原来是紧贴着状态栏,现在是紧贴着屏幕的上边缘,这样就导致,内容被遮挡。解决这个问题需要一个关键的属性是setFitSystemWindow=true,追踪源码可知,它可以让我们的布局,paddingTop等于状态栏的高度,这样红色TextView的位置就会向下移,从而不会被遮挡。

3.半透明状态栏,fitsSystemWindows=true

@Override
public void init(Bundle savedInstanceState) {
setHalfTransparent();
setFitSystemWindow(true);
}
 
half_fit.png

此时红色的TextView,位于状态栏下方。

4.全透明状态栏,fitsSystemWindows=false

setStatusBarFullTransparent();
setFitSystemWindow(false);
 
full_no_fit.png

全透明和半透明的区别在于,状态栏是否具有淡黑色的背景,根据项目需求合理运用。

5.全透明状态栏,fitsSystemWindows=true

setStatusBarFullTransparent();
setFitSystemWindow(true);
 
full_fit.png

6.DrawerLayout如何使用

直接使用上述方式,在4.4系统上会出现异常,因此我们需要进行适配。
修改xml文件,DrawerLayout需要添加fitsSystemWindows和clipToPadding属性,DrawerLayout布局里的一级布局,都需设置fitsSystemWindows=true。

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout android:id="@+id/drawerLayout"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:fitsSystemWindows="true"
android:clipToPadding="false"
android:layout_height="match_parent"> <RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fitsSystemWindows="true"
android:background="@drawable/bg_start"
android:orientation="vertical"> <Button
android:id="@+id/button"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:background="#F86254"
android:text="show"
android:textColor="@color/white" /> </RelativeLayout> <FrameLayout
android:id="@+id/sideLayout"
android:layout_width="300dp"
android:fitsSystemWindows="true"
android:layout_height="match_parent"
android:layout_gravity="end"
android:background="@drawable/bg_test"> <Button
android:layout_width="100dp"
android:layout_height="30dp"
android:background="#F86254"
android:text="button"
android:textColor="@color/white" />
</FrameLayout> </android.support.v4.widget.DrawerLayout>
  1. 全透明状态栏,fitsSystemWindows=false
setStatusBarFullTransparent();
 
drawerlayout_nofit.png
  1. DrawerLayout全透明状态栏,fitsSystemWindows=true
setStatusBarFullTransparent();
setDrawerLayoutFitSystemWindow();
 
drawerlayout.png

7.可能会错误的地方

本来我们有一个界面:

 
 

然后按照上面的,添加了代码之后

setStatusBarFullTransparent();
setFitSystemWindow(true);
 
image.png

然后你提刀来问楼主,这是什么鬼!!!
说好的透明状态栏呢,怎么状态栏背景色是白色的!

 
 

确实是全屏了,状态栏也透明了,只是由于,根布局没设置背景色,默认的背景色白色,所以你看到的灰色状态栏底色,其实是根布局的TopPadding。

 
 

8.Activity中嵌套了Fragment,如何使用

另附一张效果图:

 
 

在Activity中设置setStatusBarFullTransparent(),然后在fragment的xml文件中(这边写的粗糙,应该在代码中,获取StatusBar高度然后设置paddingTop):

 
 

有兴趣可以可以琢磨一下,为什么这么写,正所谓:学而不思则罔,思而不学则殆。

9.问题

这个方案总体来说其实不是很好,会导致过度绘制,如果对性能要求不是很严苛,可以选择该方案。

作者:桂林的小河
链接:https://www.jianshu.com/p/e89ee0a77bb5
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

关于如何实现Android透明状态栏的总结的更多相关文章

  1. android开发(50) Android透明状态栏。适用于 4.4 以上及 5.0以上设备

    概述 有时候我们想在 andorid 手机上实现一种 跨越 顶部状态栏的效果,比如一张图片直接显示在 状态栏内.比如下图: 这个页面里有张图片,这个图片显示在整个页面的上部分.状态栏是 漂浮在这个图片 ...

  2. Android 透明状态栏&着色状态栏

    Android 5.0 及以上实现方式(android在5.0之后引入Material Design 实现方式相对简单) 透明状态栏,背景浸入状态栏 if (Build.VERSION.SDK_INT ...

  3. android 透明状态栏方法及其适配键盘上推(二)

    在上一篇文章中介绍了一种设置透明状态栏及其适配键盘上推得方法.但是上一篇介绍的方法中有个缺点,就是不能消除掉statusbar的阴影.很多手机如(三星,Nexus都带有阴影).即使我用了: <a ...

  4. android 透明状态栏方法及其适配键盘上推(一)

    android的状态栏(statusBar)版本的差异化比较大.在android 4.4 以上和5.x可以设置状态栏背景颜色,但是不可以设置状态栏中字和图标的颜色.而系统默认的statusbar的字体 ...

  5. Android 透明状态栏

    在 android 4 系统中可以设置透明状态栏. 但在 android 5.0 以上遇到问题.但问题是可以解决的,需要正确的设置 theme. 但是需要注意一点,5以上可以修改 status bar ...

  6. Android设置透明状态栏和透明导航栏

    Android透明状态栏只有在4.4之后有. 在代码中加入下面几行代码即可实现

  7. Android UI体验之全屏沉浸式透明状态栏效果

    前言: Android 4.4之后谷歌提供了沉浸式全屏体验, 在沉浸式全屏模式下, 状态栏. 虚拟按键动态隐藏, 应用可以使用完整的屏幕空间, 按照 Google 的说法, 给用户一种 身临其境 的体 ...

  8. 68.Android之透明状态栏

    转载:http://www.jianshu.com/p/2f17d0e7f6b0 Android开发中需要透明状态栏,注意:本文只适配Android4.4以上及5.0以上设备 概述 有时候我们想在 a ...

  9. Android Immersive Mode (沉浸模式) 还是 Translucent Bars (透明状态栏)

    Immersive Mode (沉浸模式) 还是 Translucent Bars (透明状态栏) [科普]什么叫真正的“沉浸式”状态栏? 为什么在国内会有很多用户把「透明栏」(Translucent ...

随机推荐

  1. kali渗透测试之缓冲区溢出实例-windows,POP3,SLmail

    kali渗透测试之缓冲区溢出实例-windows,POP3,SLmail 相关链接:https://www.bbsmax.com/A/xl569l20Jr/ http://4hou.win/wordp ...

  2. JS算法练习三

    JS算法练习 1.生成一个长度为10的随机数组,使用冒泡法给数组排序 var arr=new Array(10); for (var i = 0; i <arr.length ; i++) { ...

  3. windows 程序库

    静态链接库:*.lib 在程序编译时要使用的代码,会嵌入到最后生成的执行程序里. 动态链接库:*.dll 在程序运行时要使用的代码. 可在运行时载入 或 在编译时链接 引入库(*.lib)文件 进行使 ...

  4. ES6走一波 字符串的扩展

    ES6字符串扩展: 处理大码点字符 字符的Unicode表示法 \uxxxx表示一个字符串,超出 \u0000 ~ \uffff范围,必须用两个双字节形式表示. ES6改进为 将码点放到大括号 可正确 ...

  5. 【数据表格】datatable+SpringMVC+Spring Data JPA

    初步实现 $("#userTable").dataTable({ "processing": true, "serverSide": tru ...

  6. jQuery(二)button事件改变标签值

    button事件改变标签值 例子一: <html> <head> <script type="text/javascript" src="/ ...

  7. keepalived高可用系列~keepalived+mysql

    一 简介:建立读写分离模式 二 keepalived相关配置 vrrp_instance VI_1 {  state MASTER  // 可修改  interface eth0  virtual_r ...

  8. 强网杯2018 Web签到

    Web签到 比赛链接:http://39.107.33.96:10000 比赛的时候大佬对这题如切菜一般,小白我只能空流泪,通过赛后看别人的wp,我知道了还有这种操作. 这个赛题分为3层 第一层 Th ...

  9. Setup Sight Sense

    调节感知组件参数 绑定视觉事件 PawnSensingComp->OnSeePawn.AddDynamic(this, &AFPSAIGuard::OnPawnSeen); 在头文件中声 ...

  10. java知识点1

    本系列文章源自大神--纯洁的微笑的博客 http://www.cnblogs.com/ityouknow/ 基础篇 JVM JVM内存结构 堆.栈.方法区.直接内存.堆和栈区别 内存结构图 控制参数 ...