安卓沉浸式状态栏是安卓4.4之后才出的,就是让手机最顶部的那条状态栏与app的设计风格融为一体。看两个图
左边是没有沉浸的,右边是有沉浸的
很明显感觉就不一样。
下面来说下这个沉浸式状态栏是怎么实现的。WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS安卓里面window加这个标志可以使状态栏变透明,但是会出现actionbar整体上移的情况。
所以我们的思路是获取状态栏的高度,然后通过外面头部set一个padding来使其总体下滑来达到效果。
/**
* 获取状态栏的高度
* @return 返回状态栏高度的像素值
*/
public static int getStatusBarHeight(Context context) {
int result = 0;
int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen",
"android");
if (resourceId > 0) {
result = context.getResources().getDimensionPixelSize(resourceId);
}
return result;
}
这个是获取状态栏的高度,然后在代码里面设置一个padding
//设置沉浸,有状态栏的情况下
protected void setImmerseLayout(View view) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
Window window = getWindow();
window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
//window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
//让状态栏透明并且布局填充整个屏幕
if(view != null){
//获取状态栏高度
int statusBarHeight = ScreenUtil.getStatusBarHeight(this.getBaseContext());
//设置头部ViewGroup的内边距
view.setPadding(0, statusBarHeight, 0, 0);
}
}
}
上面的方法需要判断当前api是否大于19,大于19的话就设置状态栏透明并填充整个屏幕。
但是
setImmerseLayout(View view)
这个方法传的必须是一个viewGroup,
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:topbar="http://schemas.android.com/apk/res-auto"
android:id="@+id/durian_head_layout"
android:layout_width="match_parent"
android:layout_height="300dp"
android:background="@drawable/home_banner" >
<!-- 上面设置头部图片还有图片所需要的高度 -->
<!-- 头部actionbar,我封装成了一个view -->
<com.example.immerselayout.TitleBar
android:id="@+id/topbar"
android:layout_width="match_parent"
android:layout_height="50dp"
topbar:leftText="返回"
topbar:rightText="跳转"
topbar:leftTextColor="#fff2ff"
topbar:rightTextColor="#fff2ff"
topbar:title="风景"
topbar:titleTextColor="#fff22f"
topbar:titleTextSize="10sp"
></com.example.immerselayout.TitleBar>
</RelativeLayout>
这个就是activity的头布局,在relativeLayout里面设置头部背景图片
还有一种不用设置头部的activity
布局文件是这样写的
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@color/orange"
android:fitsSystemWindows="true"
android:clipToPadding="true"
>
<!-- android:fitsSystemWindows="true"
android:clipToPadding="true
这两句话一定要加上!!!
-->
<TextView
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:textColor="#838383"
android:text="这是没有头部的沉浸式状态栏。。。。。。。。。。。。。。。。。"
android:textSize="25sp"
/>
</RelativeLayout>
setImmerseLayout(View view)传null就可以实现沉浸式了。