美文网首页
让侧边栏被拉出的时候出现在状态栏下面

让侧边栏被拉出的时候出现在状态栏下面

作者: _蘇芳_ | 来源:发表于2017-01-19 17:50 被阅读46次

title: 让侧边栏被拉出的时候出现在状态栏下面
date: 2016-11-09 10:33:27
tags: problems


  • 沉浸式状态栏这个东西很多人都说过,4.4开始可以设置透明状态栏了,5.0开始可以直接设置状态栏颜色了,所以基本思路就是:5.0直接改就好了,4.4就是设置成透明的,然后在填充一个view放在状态栏下面,基本代码就是下面这样了(摘自hongyang的博客)

import android.app.Activity;
import android.graphics.Color;
import android.os.Build;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;

/**
 * @author xzj
 * @date 2016/11/4
 */
public class StatusBarCompat {
    private static final int INVALID_VAL = -1;
    private static final int COLOR_DEFAULT = Color.parseColor("#20000000");

    /**
     * 状态栏变色,那么5.0直接设置,4.4设置状态栏透明后,给decorView设置一个有颜色的view填充进去
     * @param activity ...控制的activity
     * @param statusColor 状态栏的颜色
     */
    public static void compat(Activity activity, int statusColor) {
        //5.0以上可以直接设置状态栏颜色
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ) {
            if (statusColor != INVALID_VAL) {
                activity.getWindow().setStatusBarColor(statusColor);
            }
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
            //4.4以上要设置状态栏透明
            setTranslucentStatus(activity);
            int color = COLOR_DEFAULT;
            if (statusColor != INVALID_VAL) {
                color = statusColor;
            }
            //在给整个页面顶端设置一个有颜色的色块
            View statusBarView = new View(activity);
            ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                    getStatusBarHeight(activity));
            statusBarView.setBackgroundColor(color);
            ViewGroup contentView = (ViewGroup) activity.findViewById(android.R.id.content);
            contentView.addView(statusBarView, lp);
            // 设置Activity layout的fitsSystemWindows
            View contentChild = contentView.getChildAt(0);
            contentChild.setFitsSystemWindows(true);
        }
    }

    /**
     * 设置一个透明的黑色状态栏
     * */
    public static void compat(Activity activity) {
        compat(activity, INVALID_VAL);
    }

    public static void setTranslucentStatus(Activity activity) {
        Window win = activity.getWindow();
        WindowManager.LayoutParams winParams = win.getAttributes();
        final int bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
        if ((winParams.flags & bits) == 0) {
            winParams.flags |= bits;
            win.setAttributes(winParams);
        }
        win.setAttributes(winParams);
    }

    public static int getStatusBarHeight(Activity activity) {
        int result = 0;
        int resourceId = activity.getResources().getIdentifier("status_bar_height", "dimen", "android");
        if (resourceId > 0) {
            result = activity.getResources().getDimensionPixelSize(resourceId);
        }
        return result;
    }
}

但是我现在的需求是这样,

平时状态栏是一种颜色,侧边栏拉出来的时候,状态栏也要变色。

这里先说一个tips,如果设置了状态栏透明的话,要给布局加上fitSystemWindows=true,预留一个状态栏的位置,否则布局顶端就会出现在状态栏下面,这本来是一个麻烦的东西,但是!为了实现我的需求,可以利用这一点。

  1. 只要4.4之上就调用上面的setTranslucentStatus()方法,这样布局就会从状态栏下面开始绘制,那么我们的drawerLayout的侧边栏顶端也自然会显示在状态栏下面啦

  2. 在布局顶端放一个view,宽度就match_parent就好,高度通过getStatusBarHeight(this)获取然后设置给这个view

  3. 代码大致就是下面这样,placeHolder就是布局顶端的那个view了

    StatusBarCompat.setTranslucentStatus(this);
    ViewGroup.LayoutParams params = placeHolder.getLayoutParams();
    params.height = StatusBarCompat.getStatusBarHeight(this);
    placeHolder.setLayoutParams(params);
    

而只有主页有侧边栏,需要这么做,其他的activity都可以继承自baseActivity,在baseActivity里设置一句

StatusBarCompat.compat(this,getResources().getColor(R.color.status_bar_color));就好了

相关文章

网友评论

      本文标题:让侧边栏被拉出的时候出现在状态栏下面

      本文链接:https://www.haomeiwen.com/subject/zuiibttx.html