安卓沉浸式状态栏是安卓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
布局文件是这样写的
<?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就可以实现沉浸式了。