安卓透明状态栏的实现

最近深入了解了透明状态栏,记录一下。

透明状态栏大概有两类

    

    1第一种只要状态栏和标题栏颜色一样就可以了,而第二种的要求是状态栏和标题栏部分是一张图片。

    2  状态栏颜色有完全透明和半透明两种,接下来一一说明。

    3  对于第二种情况还要注意标题栏的位置不要与状态栏重合。

先看下这两种情况下的布局,一下各种效果展示都在这两个布局的基础上

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="@color/colorPrimary"
    tools:context="com.test.lifecycle.MainActivity">
    <ImageView
        android:onClick="onclick"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:scaleType="fitXY"
        android:src="@mipmap/timg"/>
</LinearLayout>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main2"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="@color/colorPrimary"
    tools:context="com.test.lifecycle.Main2Activity">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:gravity="center"
        android:background="@color/colorAccent"
        android:text="Title"/>
</LinearLayout>

布局很简单,除了设置图片与标题外还给了一个背景颜色

    在4.4版本(Build.VERSION_CODES.KITKAT)才引入了透明状态栏的概念,其实现也很简单,只要在onCreate()方法中加入下面一行代码就可以:getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS) 。来看看在不同安卓版本中的效果:

4.4中是将布局扩展到状态栏,同时状态栏完全透明,我们可以透过状态栏看到我们在布局文件中的东西,


在5.0以上,同样是将可控制的区域扩展到状态栏,但是并不是完全透明,默认有一定的透明度。

          

可以看到,图片没有问题,但是标题栏入侵了状态栏,这个不是我们想要看到的,解决方法如下:

1 在根布局中加入 android:fitsSystemWindows="true" 这个设置相当于 android:paddingTop="24dp",也可以在TextView中加入android:layout_marginTop="24dp",24是状态栏的高度,这种方法状态栏的颜色显示的是线性布局背景的颜色如下图左。

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main2"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:fitsSystemWindows="true"
    android:background="@color/colorPrimary"
    tools:context="com.test.lifecycle.Main2Activity">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:gravity="center"
        android:background="@color/colorAccent"
        android:text="Title"/>
</LinearLayout>

     

2 手动增加一块布局,假装是状态栏,这种方法可以随意设置假状态栏的背景颜色,如上图右。

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main2"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="@color/colorPrimary"
    tools:context="com.test.lifecycle.Main2Activity">
    <View
        android:layout_width="match_parent"
        android:layout_height="24dp"
        android:background="#ffaaff"/>
    <TextView
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:gravity="center"
        android:background="@color/colorAccent"
        android:text="Title"/>
</LinearLayout>

以上方法在4.4中可以实现完全透明和半透明,但是在5.0以上只有一种默认透明度,接下来说说在5.0中自由设置透明度的方法。

1 有标题栏的情况  

这种情况比较简单,5.0可以直接修改状态栏的颜色,只需要在onCreate()方法中:getWindow().setStatusBarColor();但是有一个前提是:我们之前说过的一个设置WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS必须是关闭状态,事实上默认就是关闭的,但是为了防止之前已经设置过,为了保险起见可以先将该状态清除掉,所以可以这样写:

 getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
 getWindow().setStatusBarColor(getResources().getColor(R.color.colorAccent));

布局文件不做修改:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main2"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="@color/colorPrimary"
    tools:context="com.test.lifecycle.Main2Activity">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:gravity="center"
        android:background="@color/colorAccent"
        android:text="Title"/>
</LinearLayout>

效果是这样的:


2 整张图片的情况

这种情况下,我们想一想,状态不能挡住图片,一定是透明的,于是这样设置:

getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
getWindow().setStatusBarColor(Color.TRANSPARENT);

布局文件同样没有任何修改,效果是这样的

  


并不是我们想要的效果,这是因为我们清除掉了透明状态栏的Flag,导致无法侵入状态栏,为了解决这个问题可以这样设置,也是为了达到入侵状态栏的目的

getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
getWindow().setStatusBarColor(Color.TRANSPARENT);

效果是这样的



问题解决。


很好的工具类



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值