package com.example.pengganggui.tuhu_test.cn.Tuhu.util;import android.annotation.TargetApi;import android.app.Activity;import android.graphics.Color;import android.os.Build;import android.support.v4.view.ViewCompat;import android.view.View;import android.view.ViewGroup;import android.view.Window;import android.view.WindowManager;import android.widget.FrameLayout;import java.lang.reflect.Field;import java.lang.reflect.Method;/** * Created by pengganggui on 2018/7/8. * android状态栏设置的工具类 */public class StatusBarUtil {    public static final int DEFAULT_STATUS_BAR_ALPHA=0;    /**     * 设置状态栏颜色     * @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 defaultStatusBarAlpha 状态栏透明度     */    private static void setColor(Activity activity, int color, int defaultStatusBarAlpha) {        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {            activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);            //Then call setStatusBarColor.            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);            //activity.getWindow().setStatusBarColor(calculateStatusColor(color, statusBarAlpha));            activity.getWindow().setStatusBarColor(color);        }    }    /**     * 计算状态栏颜色     * @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;    }    /**     * 修改状态栏透明     * @param activity 要修改的activity     */    @TargetApi(19)    public static void transparencyBar(Activity activity){        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {            Window window = activity.getWindow();            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);            window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);            window.setStatusBarColor(Color.TRANSPARENT);        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {            Window window = activity.getWindow();            window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,                    WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);        }    }    /**     * 状态栏亮色模式,设置状态栏黑色文字、图标,     * 适配4.4以上版本MIUIV、Flyme和6.0以上版本其他Android     *     * @return 1:MIUUI 2:Flyme 3:android6.0     */    public static int StatusBarLightMode(Activity activity) {        int result = 0;        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {            if (MIUISetStatusBarLightMode(activity, true)) {                result = 1;            } else if (FlymeSetStatusBarLightMode(activity.getWindow(), true)) {                result = 2;            } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {                activity.getWindow()                        .getDecorView()                        .setSystemUiVisibility(                                View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);//View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN|                result = 3;            }        }        return result;    }    /**     * 需要MIUIV6以上     *     * @param dark 是否把状态栏文字及图标颜色设置为深色     * @return boolean 成功执行返回true     */    public static boolean MIUISetStatusBarLightMode(Activity activity, boolean dark) {        boolean result = false;        Window window = activity.getWindow();        if (window != null) {            Class clazz = window.getClass();            try {                int darkModeFlag = 0;                Class layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams");                Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE");                darkModeFlag = field.getInt(layoutParams);                Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class);                if (dark) {                    extraFlagField.invoke(window, darkModeFlag, darkModeFlag);//状态栏透明且黑色字体                } else {                    extraFlagField.invoke(window, 0, darkModeFlag);//清除黑色字体                }                result = true;                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {                    //开发版 7.7.13 及以后版本采用了系统API,旧方法无效但不会报错,所以两个方式都要加上                    if (dark) {                        activity.getWindow()                                .getDecorView()                                .setSystemUiVisibility(                                        View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);//View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN|                    } else {                        activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);                    }                }            } catch (Exception e) {            }        }        return result;    }    /**     * 设置状态栏图标为深色和魅族特定的文字风格     * 可以用来判断是否为Flyme用户     *     * @param window 需要设置的窗口     * @param dark 是否把状态栏文字及图标颜色设置为深色     * @return boolean 成功执行返回true     */    public static boolean FlymeSetStatusBarLightMode(Window window, boolean dark) {        boolean result = false;        if (window != null) {            try {                WindowManager.LayoutParams lp = window.getAttributes();                Field darkFlag = WindowManager.LayoutParams.class                        .getDeclaredField("MEIZU_FLAG_DARK_STATUS_BAR_ICON");                Field meizuFlags = WindowManager.LayoutParams.class                        .getDeclaredField("meizuFlags");                darkFlag.setAccessible(true);                meizuFlags.setAccessible(true);                int bit = darkFlag.getInt(null);                int value = meizuFlags.getInt(lp);                if (dark) {                    value |= bit;                } else {                    value &= ~bit;                }                meizuFlags.setInt(lp, value);                window.setAttributes(lp);                result = true;            } catch (Exception e) {            }        }        return result;    }    /**     * 已知系统类型时,设置状态栏黑色文字、图标。     * 适配4.4以上版本MIUIV、Flyme和6.0以上版本其他Android     *     * @param type 1:MIUUI 2:Flyme 3:android6.0     */    public static void StatusBarLightMode(Activity activity, int type) {        if (type == 1) {            MIUISetStatusBarLightMode(activity, true);        } else if (type == 2) {            FlymeSetStatusBarLightMode(activity.getWindow(), true);        } else if (type == 3) {            activity.getWindow()                    .getDecorView()                    .setSystemUiVisibility(                            View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);//View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN|        }    }    /**     * 状态栏暗色模式,清除MIUI、flyme或6.0以上版本状态栏黑色文字、图标     */    public static void StatusBarDarkMode(Activity activity, int type) {        if (type == 1) {            MIUISetStatusBarLightMode(activity, false);        } else if (type == 2) {            FlymeSetStatusBarLightMode(activity.getWindow(), false);        } else if (type == 3) {            activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);        }    }    /**     * 设置状态栏为透明     * @param activity     */    public static void setStatusBarTranslucent(Activity activity) {        Window window = activity.getWindow();        ViewGroup contentView = activity.findViewById(Window.ID_ANDROID_CONTENT);        if (null != contentView) {            View childView = contentView.getChildAt(0);            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {                // 设置透明状态栏,这样才能让 ContentView 向上                window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);                // 需要设置这个 flag 才能调用 setStatusBarColor 来设置状态栏颜色                window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);                // 设置状态栏颜色                window.setStatusBarColor(Color.TRANSPARENT);                if (childView != null) {                    // 注意不是设置 ContentView 的 FitsSystemWindows, 而是设置 ContentView 的第一个子 View .                    // 使其不为系统 View 预留空间.                    ViewCompat.setFitsSystemWindows(childView, false);                }            } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {                if (childView != null) {                    ViewCompat.setFitsSystemWindows(childView, false);                }                int statusBarHeight = contentView.getTop();                // 需要设置这个 flag 才能设置状态栏                window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);                // 避免多次调用该方法时,多次移除了 View                if (childView != null && childView.getLayoutParams() != null                        && childView.getLayoutParams().height == statusBarHeight) {                    // 移除假的 View.                    contentView.removeView(childView);                    childView = contentView.getChildAt(0);                }                if (childView != null) {                    FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) childView.getLayoutParams();                    // 清除 ChildView 的 marginTop 属性                    if (lp != null && lp.topMargin >= statusBarHeight) {                        lp.topMargin -= statusBarHeight;                        childView.setLayoutParams(lp);                    }                }            } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {                window.getDecorView().setSystemUiVisibility(                        View.SYSTEM_UI_FLAG_LAYOUT_STABLE                                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);            }        }    }}

更多相关文章

  1. Android自带的图标集合
  2. Android版本问题 版本冲突
  3. Android版本和API Level
  4. Android图标的制作
  5. android 4.2修改设置菜单的背景颜色
  6. ADT版本更新失败,降级
  7. Android 系统自带图标
  8. Android自带图标库
  9. Android对应版本号

随机推荐

  1. Android 自定义跑马灯 实现超长文本,滚动
  2. 【Android】使用Intent调用系统其它程序,
  3. 2019 年终总结,240+篇,已分类整理
  4. APP如何适配不同的Android版本
  5. 图解Android启动模式,看完这一篇就真相大
  6. Android定位相关
  7. 学习android上3D-opengl的一个不错的起点
  8. Android Animation动画实战(一): 从布局动画
  9. android/ios 手机移动开发(电子菜谱、健
  10. android通过webview组件实现与js相互调用