|
| 1 | +package cc.zsakvo.yueduhchelper.utils; |
| 2 | + |
| 3 | +import android.annotation.TargetApi; |
| 4 | +import android.app.Activity; |
| 5 | +import android.graphics.Color; |
| 6 | +import android.os.Build; |
| 7 | +import android.view.View; |
| 8 | +import android.view.Window; |
| 9 | +import android.view.WindowManager; |
| 10 | + |
| 11 | +import java.lang.reflect.Field; |
| 12 | +import java.lang.reflect.Method; |
| 13 | + |
| 14 | +/** |
| 15 | + * Created by FuKaiqiang on 2017-08-30. |
| 16 | + */ |
| 17 | + |
| 18 | +public class StatusbarUtil { |
| 19 | + /** |
| 20 | + * 修改状态栏为全透明 |
| 21 | + * @param activity |
| 22 | + */ |
| 23 | + @TargetApi(19) |
| 24 | + public static void transparencyBar(Activity activity){ |
| 25 | + if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { |
| 26 | + Window window = activity.getWindow(); |
| 27 | + window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); |
| 28 | + window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |
| 29 | + | View.SYSTEM_UI_FLAG_LAYOUT_STABLE); |
| 30 | + window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); |
| 31 | + window.setStatusBarColor(Color.TRANSPARENT); |
| 32 | + |
| 33 | + } else |
| 34 | + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { |
| 35 | + Window window =activity.getWindow(); |
| 36 | + window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, |
| 37 | + WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); |
| 38 | + } |
| 39 | + } |
| 40 | + |
| 41 | + /** |
| 42 | + * 修改状态栏颜色,支持4.4以上版本 |
| 43 | + * @param activity |
| 44 | + * @param colorId |
| 45 | + */ |
| 46 | + public static void setStatusBarColor(Activity activity,int colorId) { |
| 47 | + |
| 48 | + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { |
| 49 | + Window window = activity.getWindow(); |
| 50 | +// window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); |
| 51 | + window.setStatusBarColor(activity.getResources().getColor(colorId)); |
| 52 | + } |
| 53 | +// } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { |
| 54 | +// //使用SystemBarTint库使4.4版本状态栏变色,需要先将状态栏设置为透明 |
| 55 | +// transparencyBar(activity); |
| 56 | +// SystemBarTintManager tintManager = new SystemBarTintManager(activity); |
| 57 | +// tintManager.setStatusBarTintEnabled(true); |
| 58 | +// tintManager.setStatusBarTintResource(colorId); |
| 59 | +// } |
| 60 | + } |
| 61 | + |
| 62 | + /** |
| 63 | + *状态栏亮色模式,设置状态栏黑色文字、图标, |
| 64 | + * 适配4.4以上版本MIUIV、Flyme和6.0以上版本其他Android |
| 65 | + * @param activity |
| 66 | + * @return 1:MIUUI 2:Flyme 3:android6.0 |
| 67 | + */ |
| 68 | + public static int StatusBarLightMode(Activity activity){ |
| 69 | + int result=0; |
| 70 | + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { |
| 71 | + if(MIUISetStatusBarLightMode(activity, true)){ |
| 72 | + result=1; |
| 73 | + }else if(FlymeSetStatusBarLightMode(activity.getWindow(), true)){ |
| 74 | + result=2; |
| 75 | + }else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { |
| 76 | + activity.getWindow().getDecorView().setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN|View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); |
| 77 | + result=3; |
| 78 | + } |
| 79 | + } |
| 80 | + return result; |
| 81 | + } |
| 82 | + |
| 83 | + /** |
| 84 | + * 已知系统类型时,设置状态栏黑色文字、图标。 |
| 85 | + * 适配4.4以上版本MIUIV、Flyme和6.0以上版本其他Android |
| 86 | + * @param activity |
| 87 | + * @param type 1:MIUUI 2:Flyme 3:android6.0 |
| 88 | + */ |
| 89 | + public static void StatusBarLightMode(Activity activity,int type){ |
| 90 | + if(type==1){ |
| 91 | + MIUISetStatusBarLightMode(activity, true); |
| 92 | + }else if(type==2){ |
| 93 | + FlymeSetStatusBarLightMode(activity.getWindow(), true); |
| 94 | + }else if(type==3){ |
| 95 | + activity.getWindow().getDecorView().setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN|View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); |
| 96 | + } |
| 97 | + |
| 98 | + } |
| 99 | + |
| 100 | + /** |
| 101 | + * 状态栏暗色模式,清除MIUI、flyme或6.0以上版本状态栏黑色文字、图标 |
| 102 | + */ |
| 103 | + public static void StatusBarDarkMode(Activity activity,int type){ |
| 104 | + if(type==1){ |
| 105 | + MIUISetStatusBarLightMode(activity, false); |
| 106 | + }else if(type==2){ |
| 107 | + FlymeSetStatusBarLightMode(activity.getWindow(), false); |
| 108 | + }else if(type==3){ |
| 109 | + activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE); |
| 110 | + } |
| 111 | + |
| 112 | + } |
| 113 | + |
| 114 | + |
| 115 | + /** |
| 116 | + * 设置状态栏图标为深色和魅族特定的文字风格 |
| 117 | + * 可以用来判断是否为Flyme用户 |
| 118 | + * @param window 需要设置的窗口 |
| 119 | + * @param dark 是否把状态栏文字及图标颜色设置为深色 |
| 120 | + * @return boolean 成功执行返回true |
| 121 | + * |
| 122 | + */ |
| 123 | + public static boolean FlymeSetStatusBarLightMode(Window window, boolean dark) { |
| 124 | + boolean result = false; |
| 125 | + if (window != null) { |
| 126 | + try { |
| 127 | + WindowManager.LayoutParams lp = window.getAttributes(); |
| 128 | + Field darkFlag = WindowManager.LayoutParams.class |
| 129 | + .getDeclaredField("MEIZU_FLAG_DARK_STATUS_BAR_ICON"); |
| 130 | + Field meizuFlags = WindowManager.LayoutParams.class |
| 131 | + .getDeclaredField("meizuFlags"); |
| 132 | + darkFlag.setAccessible(true); |
| 133 | + meizuFlags.setAccessible(true); |
| 134 | + int bit = darkFlag.getInt(null); |
| 135 | + int value = meizuFlags.getInt(lp); |
| 136 | + if (dark) { |
| 137 | + value |= bit; |
| 138 | + } else { |
| 139 | + value &= ~bit; |
| 140 | + } |
| 141 | + meizuFlags.setInt(lp, value); |
| 142 | + window.setAttributes(lp); |
| 143 | + result = true; |
| 144 | + } catch (Exception e) { |
| 145 | + |
| 146 | + } |
| 147 | + } |
| 148 | + return result; |
| 149 | + } |
| 150 | + |
| 151 | + /** |
| 152 | + * 需要MIUIV6以上 |
| 153 | + * @param activity |
| 154 | + * @param dark 是否把状态栏文字及图标颜色设置为深色 |
| 155 | + * @return boolean 成功执行返回true |
| 156 | + * |
| 157 | + */ |
| 158 | + public static boolean MIUISetStatusBarLightMode(Activity activity, boolean dark) { |
| 159 | + boolean result = false; |
| 160 | + Window window=activity.getWindow(); |
| 161 | + if (window != null) { |
| 162 | + Class clazz = window.getClass(); |
| 163 | + try { |
| 164 | + int darkModeFlag = 0; |
| 165 | + Class layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams"); |
| 166 | + Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE"); |
| 167 | + darkModeFlag = field.getInt(layoutParams); |
| 168 | + Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class); |
| 169 | + if(dark){ |
| 170 | + extraFlagField.invoke(window,darkModeFlag,darkModeFlag);//状态栏透明且黑色字体 |
| 171 | + }else{ |
| 172 | + extraFlagField.invoke(window, 0, darkModeFlag);//清除黑色字体 |
| 173 | + } |
| 174 | + result=true; |
| 175 | + |
| 176 | + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { |
| 177 | + //开发版 7.7.13 及以后版本采用了系统API,旧方法无效但不会报错,所以两个方式都要加上 |
| 178 | + if(dark){ |
| 179 | + activity.getWindow().getDecorView().setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN| View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); |
| 180 | + }else { |
| 181 | + activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE); |
| 182 | + } |
| 183 | + } |
| 184 | + }catch (Exception e){ |
| 185 | + |
| 186 | + } |
| 187 | + } |
| 188 | + return result; |
| 189 | + } |
| 190 | +} |
0 commit comments