Android 超级简单的沉浸式状态栏
生活随笔
收集整理的這篇文章主要介紹了
Android 超级简单的沉浸式状态栏
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1.兩個工具類和一個xml就完成了
直接復(fù)制即可
package com.example.tongliaodemo.activity;import android.app.Activity; import android.content.Context; import android.graphics.Color; import android.os.Build; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.view.WindowManager; import android.widget.FrameLayout;import com.example.tongliaodemo.R;import java.lang.reflect.Field; import java.lang.reflect.Method;/*** 沉浸式狀態(tài)欄工具* 楊亞東* @since 2021-1-19*/ public class StatusBarUtils {private static final int FAKE_STATUS_BAR_VIEW_ID = R.id.fake_status_bar_view;/*** 獲得狀態(tài)欄的高度** @param context 上下文* @return 狀態(tài)欄高度*/public static int getHeight(Context context) {int statusBarHeight = 0;try {int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen","android");if (resourceId > 0) {statusBarHeight = context.getResources().getDimensionPixelSize(resourceId);}} catch (Exception e) {e.printStackTrace();}return statusBarHeight;}/*** 設(shè)置狀態(tài)欄顏色** @param context 上下文,盡量使用Activity* @param color 狀態(tài)欄顏色*/public static void setColor(Context context, int color) {if (context instanceof Activity) {setColor(((Activity) context).getWindow(), color);}}/*** 設(shè)置狀態(tài)欄顏色** @param window 窗口,可用于Activity和Dialog等* @param color 狀態(tài)欄顏色*/public static void setColor(Window window, int color) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE);window.setStatusBarColor(color);} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {setColor(window, color, false);}}/*** Android 5.0 以下版本設(shè)置狀態(tài)欄顏色** @param window 窗口* @param color 狀態(tài)欄顏色值* @param isTransparent 是否透明*/public static void setColor(Window window, int color,boolean isTransparent) {Context context = window.getContext();window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);ViewGroup decorView = (ViewGroup) window.getDecorView();View contentView = decorView.findViewById(android.R.id.content);if (contentView != null) {contentView.setPadding(0, isTransparent ? 0 : getHeight(context), 0, 0);}View fakeStatusBarView = decorView.findViewById(FAKE_STATUS_BAR_VIEW_ID);if (fakeStatusBarView != null) {fakeStatusBarView.setBackgroundColor(color);if (fakeStatusBarView.getVisibility() == View.GONE) {fakeStatusBarView.setVisibility(View.VISIBLE);}} else {// 繪制一個和狀態(tài)欄一樣高的矩形View statusBarView = new View(context);FrameLayout.LayoutParams layoutParams =new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,getHeight(context));statusBarView.setLayoutParams(layoutParams);statusBarView.setBackgroundColor(color);statusBarView.setId(FAKE_STATUS_BAR_VIEW_ID);decorView.addView(statusBarView);}}/*** 設(shè)置狀態(tài)欄透明** @param context 上下文,盡量使用Activity*/public static void setTransparent(Context context) {if (context instanceof Activity) {setTransparent(((Activity) context).getWindow());}}/*** 設(shè)置狀態(tài)欄透明** @param window 窗口,可用于Activity和Dialog等*/public static void setTransparent(Window window) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);window.setStatusBarColor(Color.TRANSPARENT);} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {setColor(window, 0x80000000, true);}}/*** 設(shè)置狀態(tài)欄是否為黑色文字** @param context 上下文,盡量使用Activity* @param isDark 是否為黑色文字*/public static void setTextDark(Context context, boolean isDark) {if (context instanceof Activity) {setTextDark(((Activity) context).getWindow(), isDark);}}/*** 設(shè)置狀態(tài)欄是否為黑色文字** @param window 窗口,可用于Activity和全屏Dialog* @param isDark 是否為黑色文字*/private static void setTextDark(Window window, boolean isDark) {if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {View decorView = window.getDecorView();int systemUiVisibility = decorView.getSystemUiVisibility();if (isDark) {decorView.setSystemUiVisibility(systemUiVisibility | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);} else {decorView.setSystemUiVisibility(systemUiVisibility & ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);}} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {switch (OSUtils.getRomType()) {case MIUI:setMIUIDark(window, isDark);break;case Flyme:setFlymeDark(window, isDark);break;default:}}}/*** 設(shè)置MIUI系統(tǒng)狀態(tài)欄是否為黑色文字** @param window 窗口,僅可用于Activity* @param isDark 是否為黑色文字*/private static void setMIUIDark(Window window, boolean isDark) {try {Class<? extends Window> clazz = window.getClass();int darkModeFlag;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);extraFlagField.invoke(window, isDark ? darkModeFlag : 0, darkModeFlag);} catch (Exception e) {e.printStackTrace();}}/*** 設(shè)置Flyme系統(tǒng)狀態(tài)欄是否為黑色文字** @param window 窗口* @param isDark 是否為黑色文字*/private static void setFlymeDark(Window window, boolean isDark) {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 (isDark) {value |= bit;} else {value &= ~bit;}meizuFlags.setInt(lp, value);window.setAttributes(lp);} catch (Exception e) {e.printStackTrace();}}}} package com.example.tongliaodemo.activity;import android.os.Environment; import android.text.TextUtils;import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.Properties; import java.util.regex.Matcher; import java.util.regex.Pattern;/*** 楊亞東* 2021.1.19*/public class OSUtils {private static final String KEY_DISPLAY_ID = "ro.build.display.id";private static final String KEY_BASE_OS_VERSION = "ro.build.version.base_os";private static final String KEY_CLIENT_ID_BASE = "ro.com.google.clientidbase";// 小米 : MIUIprivate static final String KEY_MIUI_VERSION = "ro.build.version.incremental"; // "7.6.15"private static final String KEY_MIUI_VERSION_NANE = "ro.miui.ui.version.name"; // "V8"private static final String KEY_MIUI_VERSION_CODE = "ro.miui.ui.version.code"; // "6"private static final String VALUE_MIUI_CLIENT_ID_BASE = "android-xiaomi";// 華為 : EMUIprivate static final String KEY_EMUI_VERSION = "ro.build.version.emui"; // "EmotionUI_3.0"private static final String KEY_EMUI_API_LEVEL = "ro.build.hw_emui_api_level"; //private static final String KEY_EMUI_SYSTEM_VERSION = "ro.confg.hw_systemversion"; //// "T1-A21wV100R001C233B008_SYSIMG"// 魅族 : Flymeprivate static final String KEY_FLYME_PUBLISHED = "ro.flyme.published"; // "true"private static final String KEY_FLYME_SETUP = "ro.meizu.setupwizard.flyme"; // "true"private static final String VALUE_FLYME_DISPLAY_ID_CONTAIN = "Flyme"; // "Flyme OS 4.5.4.2U"// OPPO : ColorOSprivate static final String KEY_COLOROS_VERSION = "ro.oppo.theme.version"; // "703"private static final String KEY_COLOROS_THEME_VERSION = "ro.oppo.version"; // ""private static final String KEY_COLOROS_ROM_VERSION = "ro.rom.different.version"; //private static final String VALUE_COLOROS_BASE_OS_VERSION_CONTAIN = "OPPO"; // "OPPO/R7sm// "ColorOS2.1"// /R7sm:5.1.1/LMY47V/1440928800:user/release-keys"private static final String VALUE_COLOROS_CLIENT_ID_BASE = "android-oppo";// vivo : FuntouchOSprivate static final String KEY_FUNTOUCHOS_BOARD_VERSION = "ro.vivo.board.version"; // "MD"private static final String KEY_FUNTOUCHOS_OS_NAME = "ro.vivo.os.name"; // "Funtouch"private static final String KEY_FUNTOUCHOS_OS_VERSION = "ro.vivo.os.version"; // "3.0"private static final String KEY_FUNTOUCHOS_DISPLAY_ID = "ro.vivo.os.build.display.id"; //// "FuntouchOS_3.0"private static final String KEY_FUNTOUCHOS_ROM_VERSION = "ro.vivo.rom.version"; // "rom_3.1"private static final String VALUE_FUNTOUCHOS_CLIENT_ID_BASE = "android-vivo";// Samsungprivate static final String VALUE_SAMSUNG_BASE_OS_VERSION_CONTAIN = "samsung"; // "samsung// /zeroltezc/zeroltechn:6.0.1/MMB29K/G9250ZCU2DQD1:user/release-keys"private static final String VALUE_SAMSUNG_CLIENT_ID_BASE = "android-samsung";// Sonyprivate static final String KEY_SONY_PROTOCOL_TYPE = "ro.sony.irremote.protocol_type"; // "2"private static final String KEY_SONY_ENCRYPTED_DATA = "ro.sony.fota.encrypteddata"; //private static final String VALUE_SONY_CLIENT_ID_BASE = "android-sonyericsson";// "supported"// 樂視 : euiprivate static final String KEY_EUI_VERSION = "ro.letv.release.version"; // "5.9.023S"private static final String KEY_EUI_VERSION_DATE = "ro.letv.release.version_date"; // "5.9// .023S_03111"private static final String KEY_EUI_NAME = "ro.product.letv_name"; // "樂1s"private static final String KEY_EUI_MODEL = "ro.product.letv_model"; // "Letv X500"// 金立 : amigoprivate static final String KEY_AMIGO_ROM_VERSION = "ro.gn.gnromvernumber"; // "GIONEE ROM5.0// .16"private static final String KEY_AMIGO_SYSTEM_UI_SUPPORT = "ro.gn.amigo.systemui.support"; //private static final String VALUE_AMIGO_DISPLAY_ID_CONTAIN = "amigo"; // "amigo3.5.1"// "yes"private static final String VALUE_AMIGO_CLIENT_ID_BASE = "android-gionee";// 酷派 : yulongprivate static final String KEY_YULONG_VERSION_RELEASE = "ro.yulong.version.release"; // "5.1// .046.P1.150921.8676_M01"private static final String KEY_YULONG_VERSION_TAG = "ro.yulong.version.tag"; // "LC"private static final String VALUE_YULONG_CLIENT_ID_BASE = "android-coolpad";// HTC : Senseprivate static final String KEY_SENSE_BUILD_STAGE = "htc.build.stage"; // "2"private static final String KEY_SENSE_BLUETOOTH_SAP = "ro.htc.bluetooth.sap"; // "true"private static final String VALUE_SENSE_CLIENT_ID_BASE = "android-htc-rev";// LG : LGprivate static final String KEY_LG_SW_VERSION = "ro.lge.swversion"; // "D85720b"private static final String KEY_LG_SW_VERSION_SHORT = "ro.lge.swversion_short"; // "V20b"private static final String KEY_LG_FACTORY_VERSION = "ro.lge.factoryversion"; // "LGD857AT-00// -V20b-CUO-CN-FEB-17-2015+0"// 聯(lián)想private static final String KEY_LENOVO_DEVICE = "ro.lenovo.device"; // "phone"private static final String KEY_LENOVO_PLATFORM = "ro.lenovo.platform"; // "qualcomm"private static final String KEY_LENOVO_ADB = "ro.lenovo.adb"; // "apkctl,speedup"private static final String VALUE_LENOVO_CLIENT_ID_BASE = "android-lenovo";/*** ROM 類型*/private static final ROM ROM_TYPE = initRomType();/*** 獲取 ROM 類型** @return ROM*/public static ROM getRomType() {return ROM_TYPE;}/*** 初始化 ROM 類型*/private static ROM initRomType() {ROM rom = ROM.Other;FileInputStream is = null;try {Properties buildProperties = new Properties();is = new FileInputStream(new File(Environment.getRootDirectory(), "build.prop"));buildProperties.load(is);if (buildProperties.containsKey(KEY_MIUI_VERSION_NANE) || buildProperties.containsKey(KEY_MIUI_VERSION_CODE)) {// MIUIrom = ROM.MIUI;if (buildProperties.containsKey(KEY_MIUI_VERSION_NANE)) {String versionName = buildProperties.getProperty(KEY_MIUI_VERSION_NANE);if (!TextUtils.isEmpty(versionName) && versionName.matches("[Vv]\\d+")) { // V8try {rom.setBaseVersion(Integer.parseInt(versionName.split("[Vv]")[1]));} catch (Exception e) {e.printStackTrace();}}}if (buildProperties.containsKey(KEY_MIUI_VERSION)) {String versionStr = buildProperties.getProperty(KEY_MIUI_VERSION);if (!TextUtils.isEmpty(versionStr) && versionStr.matches("[\\d.]+")) {rom.setVersion(versionStr);}}} else if (buildProperties.containsKey(KEY_EMUI_VERSION) || buildProperties.containsKey(KEY_EMUI_API_LEVEL)|| buildProperties.containsKey(KEY_EMUI_SYSTEM_VERSION)) {// EMUIrom = ROM.EMUI;if (buildProperties.containsKey(KEY_EMUI_VERSION)) {String versionStr = buildProperties.getProperty(KEY_EMUI_VERSION);Matcher matcher = Pattern.compile("EmotionUI_([\\d.]+)").matcher(versionStr); // EmotionUI_3.0if (!TextUtils.isEmpty(versionStr) && matcher.find()) {try {String version = matcher.group(1);rom.setVersion(version);rom.setBaseVersion(Integer.parseInt(version.split("\\.")[0]));} catch (Exception e) {e.printStackTrace();}}}} else if (buildProperties.containsKey(KEY_FLYME_SETUP) || buildProperties.containsKey(KEY_FLYME_PUBLISHED)) {// Flymerom = ROM.Flyme;if (buildProperties.containsKey(KEY_DISPLAY_ID)) {String versionStr = buildProperties.getProperty(KEY_DISPLAY_ID);Matcher matcher =Pattern.compile("Flyme[^\\d]*([\\d.]+)[^\\d]*").matcher(versionStr);// Flyme OS 4.5.4.2Uif (!TextUtils.isEmpty(versionStr) && matcher.find()) {try {String version = matcher.group(1);rom.setVersion(version);rom.setBaseVersion(Integer.parseInt(version.split("\\.")[0]));} catch (Exception e) {e.printStackTrace();}}}} else if (buildProperties.containsKey(KEY_COLOROS_VERSION) || buildProperties.containsKey(KEY_COLOROS_THEME_VERSION)|| buildProperties.containsKey(KEY_COLOROS_ROM_VERSION)) {// ColorOSrom = ROM.ColorOS;if (buildProperties.containsKey(KEY_COLOROS_ROM_VERSION)) {String versionStr = buildProperties.getProperty(KEY_COLOROS_ROM_VERSION);Matcher matcher = Pattern.compile("ColorOS([\\d.]+)").matcher(versionStr); //// ColorOS2.1if (!TextUtils.isEmpty(versionStr) && matcher.find()) {try {String version = matcher.group(1);rom.setVersion(version);rom.setBaseVersion(Integer.parseInt(version.split("\\.")[0]));} catch (Exception e) {e.printStackTrace();}}}} else if (buildProperties.containsKey(KEY_FUNTOUCHOS_OS_NAME) || buildProperties.containsKey(KEY_FUNTOUCHOS_OS_VERSION)|| buildProperties.containsKey(KEY_FUNTOUCHOS_DISPLAY_ID)) {// FuntouchOSrom = ROM.FuntouchOS;if (buildProperties.containsKey(KEY_FUNTOUCHOS_OS_VERSION)) {String versionStr = buildProperties.getProperty(KEY_FUNTOUCHOS_OS_VERSION);if (!TextUtils.isEmpty(versionStr) && versionStr.matches("[\\d.]+")) { // 3.0try {rom.setVersion(versionStr);rom.setBaseVersion(Integer.parseInt(versionStr.split("\\.")[0]));} catch (Exception e) {e.printStackTrace();}}}} else if (buildProperties.containsKey(KEY_EUI_VERSION) || buildProperties.containsKey(KEY_EUI_NAME)|| buildProperties.containsKey(KEY_EUI_MODEL)) {// EUIrom = ROM.EUI;if (buildProperties.containsKey(KEY_EUI_VERSION)) {String versionStr = buildProperties.getProperty(KEY_EUI_VERSION);Matcher matcher = Pattern.compile("([\\d.]+)[^\\d]*").matcher(versionStr); //// 5.9.023Sif (!TextUtils.isEmpty(versionStr) && matcher.find()) {try {String version = matcher.group(1);rom.setVersion(version);rom.setBaseVersion(Integer.parseInt(version.split("\\.")[0]));} catch (Exception e) {e.printStackTrace();}}}} else if (buildProperties.containsKey(KEY_AMIGO_ROM_VERSION) || buildProperties.containsKey(KEY_AMIGO_SYSTEM_UI_SUPPORT)) {// amigorom = ROM.AmigoOS;if (buildProperties.containsKey(KEY_DISPLAY_ID)) {String versionStr = buildProperties.getProperty(KEY_DISPLAY_ID);Matcher matcher =Pattern.compile("amigo([\\d.]+)[a-zA-Z]*").matcher(versionStr); //// "amigo3.5.1"if (!TextUtils.isEmpty(versionStr) && matcher.find()) {try {String version = matcher.group(1);rom.setVersion(version);rom.setBaseVersion(Integer.parseInt(version.split("\\.")[0]));} catch (Exception e) {e.printStackTrace();}}}} else if (buildProperties.containsKey(KEY_SONY_PROTOCOL_TYPE) || buildProperties.containsKey(KEY_SONY_ENCRYPTED_DATA)) {// Sonyrom = ROM.Sony;} else if (buildProperties.containsKey(KEY_YULONG_VERSION_RELEASE) || buildProperties.containsKey(KEY_YULONG_VERSION_TAG)) {// YuLongrom = ROM.YuLong;} else if (buildProperties.containsKey(KEY_SENSE_BUILD_STAGE) || buildProperties.containsKey(KEY_SENSE_BLUETOOTH_SAP)) {// Senserom = ROM.Sense;} else if (buildProperties.containsKey(KEY_LG_SW_VERSION) || buildProperties.containsKey(KEY_LG_SW_VERSION_SHORT)|| buildProperties.containsKey(KEY_LG_FACTORY_VERSION)) {// LGrom = ROM.LG;} else if (buildProperties.containsKey(KEY_LENOVO_DEVICE) || buildProperties.containsKey(KEY_LENOVO_PLATFORM)|| buildProperties.containsKey(KEY_LENOVO_ADB)) {// Lenovorom = ROM.Lenovo;} else if (buildProperties.containsKey(KEY_DISPLAY_ID)) {String displayId = buildProperties.getProperty(KEY_DISPLAY_ID);if (!TextUtils.isEmpty(displayId)) {if (displayId.contains(VALUE_FLYME_DISPLAY_ID_CONTAIN)) {return ROM.Flyme;} else if (displayId.contains(VALUE_AMIGO_DISPLAY_ID_CONTAIN)) {return ROM.AmigoOS;}}} else if (buildProperties.containsKey(KEY_BASE_OS_VERSION)) {String baseOsVersion = buildProperties.getProperty(KEY_BASE_OS_VERSION);if (!TextUtils.isEmpty(baseOsVersion)) {if (baseOsVersion.contains(VALUE_COLOROS_BASE_OS_VERSION_CONTAIN)) {return ROM.ColorOS;} else if (baseOsVersion.contains(VALUE_SAMSUNG_BASE_OS_VERSION_CONTAIN)) {return ROM.SamSung;}}} else if (buildProperties.containsKey(KEY_CLIENT_ID_BASE)) {String clientIdBase = buildProperties.getProperty(KEY_CLIENT_ID_BASE);switch (clientIdBase) {case VALUE_MIUI_CLIENT_ID_BASE:return ROM.MIUI;case VALUE_COLOROS_CLIENT_ID_BASE:return ROM.ColorOS;case VALUE_FUNTOUCHOS_CLIENT_ID_BASE:return ROM.FuntouchOS;case VALUE_SAMSUNG_CLIENT_ID_BASE:return ROM.SamSung;case VALUE_SONY_CLIENT_ID_BASE:return ROM.Sony;case VALUE_YULONG_CLIENT_ID_BASE:return ROM.YuLong;case VALUE_SENSE_CLIENT_ID_BASE:return ROM.Sense;case VALUE_LENOVO_CLIENT_ID_BASE:return ROM.Lenovo;case VALUE_AMIGO_CLIENT_ID_BASE:return ROM.AmigoOS;default:break;}}} catch (IOException e) {e.printStackTrace();} finally {if (is != null) {try {is.close();} catch (IOException e) {e.printStackTrace();}}}return rom;}public enum ROM {MIUI, // 小米Flyme, // 魅族EMUI, // 華為ColorOS, // OPPOFuntouchOS, // vivoSmartisanOS, // 錘子EUI, // 樂視Sense, // HTCAmigoOS, // 金立_360OS, // 奇酷360NubiaUI, // 努比亞H2OS, // 一加YunOS, // 阿里巴巴YuLong, // 酷派SamSung, // 三星Sony, // 索尼Lenovo, // 聯(lián)想LG, // LGGoogle, // 原生Other; // CyanogenMod, Lewa OS, 百度云OS, Tencent OS, 深度OS, IUNI OS, Tapas OS, Mokeeprivate int baseVersion = -1;private String version;public int getBaseVersion() {return baseVersion;}void setBaseVersion(int baseVersion) {this.baseVersion = baseVersion;}public String getVersion() {return version;}void setVersion(String version) {this.version = version;}} }在values文件下創(chuàng)建ids.xml
<resources><item name="fake_status_bar_view" type="id"/> </resources>在需要沉浸式狀態(tài)欄的地方調(diào)用如下代碼即可
//設(shè)置沉浸狀態(tài)欄StatusBarUtils.setColor(this,0x0666F8);StatusBarUtils.setTextDark(this,true);?
總結(jié)
以上是生活随笔為你收集整理的Android 超级简单的沉浸式状态栏的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CSDN 修改名字昵称以及ID
- 下一篇: 数据分析常用知识体系