最近深入了解了透明状态栏,记录一下。
透明状态栏大概有两类
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);
效果是这样的
问题解决。