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 设置EditText只能输入数字
  2. 2.5.4 使用popupWindow
  3. ANDROID EMULATOR 4 启动报错
  4. Android设置Activity背景为透明style
  5. Android(安卓)设置圆角背景
  6. 设置Textview最大长度,超出显示省略号
  7. android 模拟器上网 设置
  8. ImageView属性中android:src和android:background有什么区别
  9. android 透明效果

随机推荐

  1. Android中的WatchDog
  2. Android(安卓)简单封装一个精美、好用的
  3. 【攻克Android (6)】事件
  4. Android开发工具(Android Studio)
  5. Android 多分辨率机器适配
  6. Get source (Android Open Source Projec
  7. Android(安卓)make sdk 错误解决方案
  8. 【android编程】 第六讲-Android菜单实践
  9. Android面试题精选:讲一讲 Android 的事件
  10. Android中SQLite操作示例