安卓沉浸式状态栏

安卓沉浸式状态栏是安卓4.4之后才出的,就是让手机最顶部的那条状态栏与app的设计风格融为一体。看两个图

左边是没有沉浸的,右边是有沉浸的安卓沉浸式状态栏_第1张图片安卓沉浸式状态栏_第2张图片

很明显感觉就不一样。

下面来说下这个沉浸式状态栏是怎么实现的。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就可以实现沉浸式了。




你可能感兴趣的:(android)