Android BarUtils-栏相关工具类

来源:互联网 发布:windows回滚工具 编辑:程序博客网 时间:2024/06/18 05:39

BarUtils是一个栏相关工具类

功能:

1. 设置状态栏颜色

2.为滑动返回界面设置状态栏颜色

3.设置状态栏纯色 不加半透明效果

4.设置状态栏颜色(5.0以下无半透明效果,不建议使用)

5.使状态栏半透明

6.针对根布局是 CoordinatorLayout, 使状态栏半透明

7.设置状态栏全透明

8.使状态栏透明(5.0以上半透明效果,不建议使用)

9.为DrawerLayout 布局设置状态栏变色

10.为DrawerLayout 布局设置状态栏颜色,纯色

11.为DrawerLayout 布局设置状态栏变色

12.为DrawerLayout 布局设置状态栏变色(5.0以下无半透明效果,不建议使用)

13.为 DrawerLayout 布局设置状态栏透明

14.为 DrawerLayout 布局设置状态栏透明(5.0以上半透明效果,不建议使用)

15.为头部是 ImageView 的界面设置状态栏全透明

16.为头部是 ImageView 的界面设置状态栏透明(使用默认透明度)

17.为头部是 ImageView 的界面设置状态栏透明

18.为 fragment 头部是 ImageView 的设置状态栏透明

19.为 fragment 头部是 ImageView 的设置状态栏透明

20.为 fragment 头部是 ImageView 的设置状态栏透明

21.添加半透明矩形条

22.生成一个和状态栏大小相同的彩色矩形条

23.生成一个和状态栏大小相同的半透明矩形条

24.设置根布局参数

25.设置透明

26.使状态栏透明

27.创建半透明矩形 View

28.获取状态栏高度

29.计算状态栏颜色

30.设置透明状态栏(api大于19方可使用)

31.隐藏状态栏

32.判断状态栏是否存在

33. 获取ActionBar高度

34.显示通知栏

35.隐藏通知栏

36.反射唤醒通知栏

<span style="font-size:18px;">package com.blankj.utilcode.utils;import android.annotation.TargetApi;import android.app.Activity;import android.content.Context;import android.graphics.Color;import android.media.audiofx.BassBoost;import android.os.Build;import android.support.annotation.ColorInt;import android.support.v4.widget.DrawerLayout;import android.util.AttributeSet;import android.util.TypedValue;import android.view.View;import android.view.ViewGroup;import android.view.Window;import android.view.WindowManager;import android.widget.LinearLayout;import java.lang.reflect.Method;/** * <pre> *     author: Blankj *     blog  : http://blankj.com *     time  : 2016/9/23 *     desc  : 栏相关工具类 * </pre> */public class BarUtils {    private BarUtils() {        throw new UnsupportedOperationException("u can't instantiate me...");    }    public static class StatusBarView extends View {        public StatusBarView(Context context, AttributeSet attrs) {            super(context, attrs);        }        public StatusBarView(Context context) {            super(context);        }    }    public static final int DEFAULT_STATUS_BAR_ALPHA = 112;    /**     * 设置状态栏颜色     *     * @param activity 需要设置的 activity     * @param color    状态栏颜色值     */    public static void setColor(Activity activity, int color) {        setColor(activity, color, DEFAULT_STATUS_BAR_ALPHA);    }    /**     * 设置状态栏颜色     *     * @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().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);            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);            ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();            int count = decorView.getChildCount();            if (count > 0 && decorView.getChildAt(count - 1) instanceof StatusBarView) {                decorView.getChildAt(count - 1).setBackgroundColor(calculateStatusColor(color, statusBarAlpha));            } else {                StatusBarView statusView = createStatusBarView(activity, color, statusBarAlpha);                decorView.addView(statusView);            }            setRootView(activity);        }    }    /**     * 为滑动返回界面设置状态栏颜色     *     * @param activity 需要设置的activity     * @param color    状态栏颜色值     */    public static void setColorForSwipeBack(Activity activity, int color) {        setColorForSwipeBack(activity, color, DEFAULT_STATUS_BAR_ALPHA);    }    /**     * 为滑动返回界面设置状态栏颜色     *     * @param activity       需要设置的activity     * @param color          状态栏颜色值     * @param statusBarAlpha 状态栏透明度     */    public static void setColorForSwipeBack(Activity activity, int color, int statusBarAlpha) {        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {            ViewGroup contentView = ((ViewGroup) activity.findViewById(android.R.id.content));            contentView.setPadding(0, getStatusBarHeight(activity), 0, 0);            contentView.setBackgroundColor(calculateStatusColor(color, statusBarAlpha));            setTransparentForWindow(activity);        }    }    /**     * 设置状态栏纯色 不加半透明效果     *     * @param activity 需要设置的 activity     * @param color    状态栏颜色值     */    public static void setColorNoTranslucent(Activity activity, int color) {        setColor(activity, color, 0);    }    /**     * 设置状态栏颜色(5.0以下无半透明效果,不建议使用)     *     * @param activity 需要设置的 activity     * @param color    状态栏颜色值     */    @Deprecated    public static void setColorDiff(Activity activity, int color) {        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {            return;        }        activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);        // 生成一个状态栏大小的矩形        ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();        int count = decorView.getChildCount();        if (count > 0 && decorView.getChildAt(count - 1) instanceof StatusBarView) {            decorView.getChildAt(count - 1).setBackgroundColor(color);        } else {            StatusBarView statusView = createStatusBarView(activity, color);            decorView.addView(statusView);        }        setRootView(activity);    }    /**     * 使状态栏半透明     * <p>     * 适用于图片作为背景的界面,此时需要图片填充到状态栏     *     * @param activity 需要设置的activity     */    public static void setTranslucent(Activity activity) {        setTranslucent(activity, DEFAULT_STATUS_BAR_ALPHA);    }    /**     * 使状态栏半透明     * <p>     * 适用于图片作为背景的界面,此时需要图片填充到状态栏     *     * @param activity       需要设置的activity     * @param statusBarAlpha 状态栏透明度     */    public static void setTranslucent(Activity activity, int statusBarAlpha) {        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {            return;        }        setTransparent(activity);        addTranslucentView(activity, statusBarAlpha);    }    /**     * 针对根布局是 CoordinatorLayout, 使状态栏半透明     * <p>     * 适用于图片作为背景的界面,此时需要图片填充到状态栏     *     * @param activity       需要设置的activity     * @param statusBarAlpha 状态栏透明度     */    public static void setTranslucentForCoordinatorLayout(Activity activity, int statusBarAlpha) {        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {            return;        }        transparentStatusBar(activity);        addTranslucentView(activity, statusBarAlpha);    }    /**     * 设置状态栏全透明     *     * @param activity 需要设置的activity     */    public static void setTransparent(Activity activity) {        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {            return;        }        transparentStatusBar(activity);        setRootView(activity);    }    /**     * 使状态栏透明(5.0以上半透明效果,不建议使用)     * <p>     * 适用于图片作为背景的界面,此时需要图片填充到状态栏     *     * @param activity 需要设置的activity     */    @Deprecated    public static void setTranslucentDiff(Activity activity) {        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {            // 设置状态栏透明            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);            setRootView(activity);        }    }    /**     * 为DrawerLayout 布局设置状态栏变色     *     * @param activity     需要设置的activity     * @param drawerLayout DrawerLayout     * @param color        状态栏颜色值     */    public static void setColorForDrawerLayout(Activity activity, DrawerLayout drawerLayout, int color) {        setColorForDrawerLayout(activity, drawerLayout, color, DEFAULT_STATUS_BAR_ALPHA);    }    /**     * 为DrawerLayout 布局设置状态栏颜色,纯色     *     * @param activity     需要设置的activity     * @param drawerLayout DrawerLayout     * @param color        状态栏颜色值     */    public static void setColorNoTranslucentForDrawerLayout(Activity activity, DrawerLayout drawerLayout, int color) {        setColorForDrawerLayout(activity, drawerLayout, color, 0);    }    /**     * 为DrawerLayout 布局设置状态栏变色     *     * @param activity       需要设置的activity     * @param drawerLayout   DrawerLayout     * @param color          状态栏颜色值     * @param statusBarAlpha 状态栏透明度     */    public static void setColorForDrawerLayout(Activity activity, DrawerLayout drawerLayout, int color,                                               int statusBarAlpha) {        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {            return;        }        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);            activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);            activity.getWindow().setStatusBarColor(Color.TRANSPARENT);        } else {            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);        }        // 生成一个状态栏大小的矩形        // 添加 statusBarView 到布局中        ViewGroup contentLayout = (ViewGroup) drawerLayout.getChildAt(0);        if (contentLayout.getChildCount() > 0 && contentLayout.getChildAt(0) instanceof StatusBarView) {            contentLayout.getChildAt(0).setBackgroundColor(calculateStatusColor(color, statusBarAlpha));        } else {            StatusBarView statusBarView = createStatusBarView(activity, color);            contentLayout.addView(statusBarView, 0);        }        // 内容布局不是 LinearLayout 时,设置padding top        if (!(contentLayout instanceof LinearLayout) && contentLayout.getChildAt(1) != null) {            contentLayout.getChildAt(1)                    .setPadding(contentLayout.getPaddingLeft(), getStatusBarHeight(activity) + contentLayout.getPaddingTop(),                            contentLayout.getPaddingRight(), contentLayout.getPaddingBottom());        }        // 设置属性        ViewGroup drawer = (ViewGroup) drawerLayout.getChildAt(1);        drawerLayout.setFitsSystemWindows(false);        contentLayout.setFitsSystemWindows(false);        contentLayout.setClipToPadding(true);        drawer.setFitsSystemWindows(false);        addTranslucentView(activity, statusBarAlpha);    }    /**     * 为DrawerLayout 布局设置状态栏变色(5.0以下无半透明效果,不建议使用)     *     * @param activity     需要设置的activity     * @param drawerLayout DrawerLayout     * @param color        状态栏颜色值     */    @Deprecated    public static void setColorForDrawerLayoutDiff(Activity activity, DrawerLayout drawerLayout, int color) {        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);            // 生成一个状态栏大小的矩形            ViewGroup contentLayout = (ViewGroup) drawerLayout.getChildAt(0);            if (contentLayout.getChildCount() > 0 && contentLayout.getChildAt(0) instanceof StatusBarView) {                contentLayout.getChildAt(0).setBackgroundColor(calculateStatusColor(color, DEFAULT_STATUS_BAR_ALPHA));            } else {                // 添加 statusBarView 到布局中                StatusBarView statusBarView = createStatusBarView(activity, color);                contentLayout.addView(statusBarView, 0);            }            // 内容布局不是 LinearLayout 时,设置padding top            if (!(contentLayout instanceof LinearLayout) && contentLayout.getChildAt(1) != null) {                contentLayout.getChildAt(1).setPadding(0, getStatusBarHeight(activity), 0, 0);            }            // 设置属性            ViewGroup drawer = (ViewGroup) drawerLayout.getChildAt(1);            drawerLayout.setFitsSystemWindows(false);            contentLayout.setFitsSystemWindows(false);            contentLayout.setClipToPadding(true);            drawer.setFitsSystemWindows(false);        }    }    /**     * 为 DrawerLayout 布局设置状态栏透明     *     * @param activity     需要设置的activity     * @param drawerLayout DrawerLayout     */    public static void setTranslucentForDrawerLayout(Activity activity, DrawerLayout drawerLayout) {        setTranslucentForDrawerLayout(activity, drawerLayout, DEFAULT_STATUS_BAR_ALPHA);    }    /**     * 为 DrawerLayout 布局设置状态栏透明     *     * @param activity     需要设置的activity     * @param drawerLayout DrawerLayout     */    public static void setTranslucentForDrawerLayout(Activity activity, DrawerLayout drawerLayout, int statusBarAlpha) {        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {            return;        }        setTransparentForDrawerLayout(activity, drawerLayout);        addTranslucentView(activity, statusBarAlpha);    }    /**     * 为 DrawerLayout 布局设置状态栏透明     *     * @param activity     需要设置的activity     * @param drawerLayout DrawerLayout     */    public static void setTransparentForDrawerLayout(Activity activity, DrawerLayout drawerLayout) {        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {            return;        }        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);            activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);            activity.getWindow().setStatusBarColor(Color.TRANSPARENT);        } else {            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);        }        ViewGroup contentLayout = (ViewGroup) drawerLayout.getChildAt(0);        // 内容布局不是 LinearLayout 时,设置padding top        if (!(contentLayout instanceof LinearLayout) && contentLayout.getChildAt(1) != null) {            contentLayout.getChildAt(1).setPadding(0, getStatusBarHeight(activity), 0, 0);        }        // 设置属性        ViewGroup drawer = (ViewGroup) drawerLayout.getChildAt(1);        drawerLayout.setFitsSystemWindows(false);        contentLayout.setFitsSystemWindows(false);        contentLayout.setClipToPadding(true);        drawer.setFitsSystemWindows(false);    }    /**     * 为 DrawerLayout 布局设置状态栏透明(5.0以上半透明效果,不建议使用)     *     * @param activity     需要设置的activity     * @param drawerLayout DrawerLayout     */    @Deprecated    public static void setTranslucentForDrawerLayoutDiff(Activity activity, DrawerLayout drawerLayout) {        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {            // 设置状态栏透明            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);            // 设置内容布局属性            ViewGroup contentLayout = (ViewGroup) drawerLayout.getChildAt(0);            contentLayout.setFitsSystemWindows(true);            contentLayout.setClipToPadding(true);            // 设置抽屉布局属性            ViewGroup vg = (ViewGroup) drawerLayout.getChildAt(1);            vg.setFitsSystemWindows(false);            // 设置 DrawerLayout 属性            drawerLayout.setFitsSystemWindows(false);        }    }    /**     * 为头部是 ImageView 的界面设置状态栏全透明     *     * @param activity       需要设置的activity     * @param needOffsetView 需要向下偏移的 View     */    public static void setTransparentForImageView(Activity activity, View needOffsetView) {        setTranslucentForImageView(activity, 0, needOffsetView);    }    /**     * 为头部是 ImageView 的界面设置状态栏透明(使用默认透明度)     *     * @param activity       需要设置的activity     * @param needOffsetView 需要向下偏移的 View     */    public static void setTranslucentForImageView(Activity activity, View needOffsetView) {        setTranslucentForImageView(activity, DEFAULT_STATUS_BAR_ALPHA, needOffsetView);    }    /**     * 为头部是 ImageView 的界面设置状态栏透明     *     * @param activity       需要设置的activity     * @param statusBarAlpha 状态栏透明度     * @param needOffsetView 需要向下偏移的 View     */    public static void setTranslucentForImageView(Activity activity, int statusBarAlpha, View needOffsetView) {        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {            return;        }        setTransparentForWindow(activity);        addTranslucentView(activity, statusBarAlpha);        if (needOffsetView != null) {            ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) needOffsetView.getLayoutParams();            layoutParams.setMargins(0, getStatusBarHeight(activity), 0, 0);        }    }    /**     * 为 fragment 头部是 ImageView 的设置状态栏透明     *     * @param activity       fragment 对应的 activity     * @param needOffsetView 需要向下偏移的 View     */    public static void setTranslucentForImageViewInFragment(Activity activity, View needOffsetView) {        setTranslucentForImageViewInFragment(activity, DEFAULT_STATUS_BAR_ALPHA, needOffsetView);    }    /**     * 为 fragment 头部是 ImageView 的设置状态栏透明     *     * @param activity       fragment 对应的 activity     * @param needOffsetView 需要向下偏移的 View     */    public static void setTransparentForImageViewInFragment(Activity activity, View needOffsetView) {        setTranslucentForImageViewInFragment(activity, 0, needOffsetView);    }    /**     * 为 fragment 头部是 ImageView 的设置状态栏透明     *     * @param activity       fragment 对应的 activity     * @param statusBarAlpha 状态栏透明度     * @param needOffsetView 需要向下偏移的 View     */    public static void setTranslucentForImageViewInFragment(Activity activity, int statusBarAlpha, View needOffsetView) {        setTranslucentForImageView(activity, statusBarAlpha, needOffsetView);        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {            clearPreviousSetting(activity);        }    }    ///////////////////////////////////////////////////////////////////////////////////    @TargetApi(Build.VERSION_CODES.KITKAT)    private static void clearPreviousSetting(Activity activity) {        ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();        int count = decorView.getChildCount();        if (count > 0 && decorView.getChildAt(count - 1) instanceof StatusBarView) {            decorView.removeViewAt(count - 1);            ViewGroup rootView = (ViewGroup) ((ViewGroup) activity.findViewById(android.R.id.content)).getChildAt(0);            rootView.setPadding(0, 0, 0, 0);        }    }    /**     * 添加半透明矩形条     *     * @param activity       需要设置的 activity     * @param statusBarAlpha 透明值     */    private static void addTranslucentView(Activity activity, int statusBarAlpha) {        ViewGroup contentView = (ViewGroup) activity.findViewById(android.R.id.content);        if (contentView.getChildCount() > 1) {            contentView.getChildAt(1).setBackgroundColor(Color.argb(statusBarAlpha, 0, 0, 0));        } else {            contentView.addView(createTranslucentStatusBarView(activity, statusBarAlpha));        }    }    /**     * 生成一个和状态栏大小相同的彩色矩形条     *     * @param activity 需要设置的 activity     * @param color    状态栏颜色值     * @return 状态栏矩形条     */    private static StatusBarView createStatusBarView(Activity activity, int color) {        // 绘制一个和状态栏一样高的矩形        StatusBarView statusBarView = new StatusBarView(activity);        LinearLayout.LayoutParams params =                new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(activity));        statusBarView.setLayoutParams(params);        statusBarView.setBackgroundColor(color);        return statusBarView;    }    /**     * 生成一个和状态栏大小相同的半透明矩形条     *     * @param activity 需要设置的activity     * @param color    状态栏颜色值     * @param alpha    透明值     * @return 状态栏矩形条     */    private static StatusBarView createStatusBarView(Activity activity, int color, int alpha) {        // 绘制一个和状态栏一样高的矩形        StatusBarView statusBarView = new StatusBarView(activity);        LinearLayout.LayoutParams params =                new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(activity));        statusBarView.setLayoutParams(params);        statusBarView.setBackgroundColor(calculateStatusColor(color, alpha));        return statusBarView;    }    /**     * 设置根布局参数     */    @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)    private static void setRootView(Activity activity) {        ViewGroup rootView = (ViewGroup) ((ViewGroup) activity.findViewById(android.R.id.content)).getChildAt(0);        rootView.setFitsSystemWindows(true);        rootView.setClipToPadding(true);    }    /**     * 设置透明     */    private static void setTransparentForWindow(Activity activity) {        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {            activity.getWindow().setStatusBarColor(Color.TRANSPARENT);            activity.getWindow()                    .getDecorView()                    .setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {            activity.getWindow()                    .setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);        }    }    /**     * 使状态栏透明     */    @TargetApi(Build.VERSION_CODES.KITKAT)    private static void transparentStatusBar(Activity activity) {        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);            activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);            activity.getWindow().setStatusBarColor(Color.TRANSPARENT);        } else {            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);        }    }    /**     * 创建半透明矩形 View     *     * @param alpha 透明值     * @return 半透明 View     */    private static StatusBarView createTranslucentStatusBarView(Activity activity, int alpha) {        // 绘制一个和状态栏一样高的矩形        StatusBarView statusBarView = new StatusBarView(activity);        LinearLayout.LayoutParams params =                new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(activity));        statusBarView.setLayoutParams(params);        statusBarView.setBackgroundColor(Color.argb(alpha, 0, 0, 0));        return statusBarView;    }    /**     * 获取状态栏高度     *     * @param context context     * @return 状态栏高度     */    public static int getStatusBarHeight(Context context) {        int result = -1;        int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");        if (resourceId > 0) {            result = context.getResources().getDimensionPixelSize(resourceId);        }        return result;    }    /**     * 计算状态栏颜色     *     * @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;    }    /*--------------------------------old--------------------------------*/    /**     * 设置透明状态栏(api大于19方可使用)     * <p>可在Activity的onCreat()中调用</p>     * <p>需在顶部控件布局中加入以下属性让内容出现在状态栏之下</p>     * <p>android:clipToPadding="true"</p>     * <p>android:fitsSystemWindows="true"</p>     *     * @param activity activity     */    public static void setTransparentStatusBar(Activity activity) {        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {            //透明状态栏            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);            //透明导航栏            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);        }    }    /**     * 隐藏状态栏     * <p>也就是设置全屏,一定要在setContentView之前调用,否则报错</p>     * <p>此方法Activity可以继承AppCompatActivity</p>     * <p>启动的时候状态栏会显示一下再隐藏,比如QQ的欢迎界面</p>     * <p>在配置文件中Activity加属性android:theme="@android:style/Theme.NoTitleBar.Fullscreen"</p>     * <p>如加了以上配置Activity不能继承AppCompatActivity,会报错</p>     *     * @param activity activity     */    public static void hideStatusBar(Activity activity) {        activity.requestWindowFeature(Window.FEATURE_NO_TITLE);        activity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,                WindowManager.LayoutParams.FLAG_FULLSCREEN);    }    /**     * 判断状态栏是否存在     *     * @param activity activity     * @return {@code true}: 存在<br>{@code false}: 不存在     */    public static boolean isStatusBarExists(Activity activity) {        WindowManager.LayoutParams params = activity.getWindow().getAttributes();        return (params.flags & WindowManager.LayoutParams.FLAG_FULLSCREEN) != WindowManager.LayoutParams.FLAG_FULLSCREEN;    }    /**     * 获取ActionBar高度     *     * @param activity activity     * @return ActionBar高度     */    public static int getActionBarHeight(Activity activity) {        TypedValue tv = new TypedValue();        if (activity.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true)) {            return TypedValue.complexToDimensionPixelSize(tv.data, activity.getResources().getDisplayMetrics());        }        return 0;    }    /**     * 显示通知栏     * <p>需添加权限 {@code <uses-permission android:name="android.permission.EXPAND_STATUS_BAR"/>}</p>     *     * @param context        上下文     * @param isSettingPanel {@code true}: 打开设置<br>{@code false}: 打开通知     */    public static void showNotificationBar(Context context, boolean isSettingPanel) {        String methodName = (Build.VERSION.SDK_INT <= 16) ? "expand"                : (isSettingPanel ? "expandSettingsPanel" : "expandNotificationsPanel");        invokePanels(context, methodName);    }    /**     * 隐藏通知栏     * <p>需添加权限 {@code <uses-permission android:name="android.permission.EXPAND_STATUS_BAR"/>}</p>     *     * @param context 上下文     */    public static void hideNotificationBar(Context context) {        String methodName = (Build.VERSION.SDK_INT <= 16) ? "collapse" : "collapsePanels";        invokePanels(context, methodName);    }    /**     * 反射唤醒通知栏     *     * @param context    上下文     * @param methodName 方法名     */    private static void invokePanels(Context context, String methodName) {        try {            Object service = context.getSystemService("statusbar");            Class<?> statusBarManager = Class.forName("android.app.StatusBarManager");            Method expand = statusBarManager.getMethod(methodName);            expand.invoke(service);        } catch (Exception e) {            e.printStackTrace();        }    }}</span>


0 0