一行代码实现沉浸式状态栏

来源:互联网 发布:淘宝网店代理商 编辑:程序博客网 时间:2024/06/06 08:36

参考了StatusBarUtil这个库,使用里面StatusBarUtil.setColor(Activity activity,int color),发现状态栏颜色改变 但透明度存在一定差异

于是用其StatusBarUtil.setTransparent(Activity activity),状态栏变为透明,但颜色却变为白色,于是看了其源码,整理出一个方法,一行代码实现沉浸式状态栏效果;

效果图:

StatusBarUtil.setColor(this,0xc30d23,0);
import android.app.Activity;import android.content.Context;import android.os.Build;import android.view.View;import android.view.ViewGroup;import android.view.WindowManager;import android.widget.LinearLayout;/** * Created by Administrator on 2016/12/26. */public class StatusBarUtil {    /**     * 设置状态栏颜色     *     * @param activity       需要设置的activity     * @param color          状态栏颜色值     * @param statusBarAlpha 状态栏透明度     */    public static void setColor(Activity activity, int color, int statusBarAlpha) {        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {            activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);            activity.getWindow().setStatusBarColor(calculateStatusColor(color, statusBarAlpha));        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);            // 生成一个状态栏大小的矩形            View statusView = createStatusBarView(activity, color, statusBarAlpha);            // 添加 statusView 到布局中            ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();            decorView.addView(statusView);            setRootView(activity);        }    }    /**     * 计算状态栏颜色     *     * @param color color值     * @param alpha alpha值     * @return 最终的状态栏颜色     */    private static int calculateStatusColor(int color, int alpha) {        float a = 1 - alpha / 255f;        int red = color >> 16 & 0xff;        int green = color >> 8 & 0xff;        int blue = color & 0xff;        red = (int) (red * a + 0.5);        green = (int) (green * a + 0.5);        blue = (int) (blue * a + 0.5);        return 0xff << 24 | red << 16 | green << 8 | blue;    }    /**     * 设置根布局参数     */    private static void setRootView(Activity activity) {        ViewGroup rootView = (ViewGroup) ((ViewGroup) activity.findViewById(android.R.id.content)).getChildAt(0);        rootView.setFitsSystemWindows(true);        rootView.setClipToPadding(true);    }    /**     * 生成一个和状态栏大小相同的半透明矩形条     *     * @param activity 需要设置的activity     * @param color    状态栏颜色值     * @param alpha    透明值     * @return 状态栏矩形条     */    private static View createStatusBarView(Activity activity, int color, int alpha) {        // 绘制一个和状态栏一样高的矩形        View statusBarView = new View(activity);        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,                getStatusBarHeight(activity));        statusBarView.setLayoutParams(params);        statusBarView.setBackgroundColor(calculateStatusColor(color, alpha));        return statusBarView;    }    /**     * 获取状态栏高度     *     * @param context context     * @return 状态栏高度     */    private static int getStatusBarHeight(Context context) {        // 获得状态栏高度        int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");        return context.getResources().getDimensionPixelSize(resourceId);    }}






0 0
原创粉丝点击