日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android 状态栏工具——一行代码实现状态栏字体变黑

發(fā)布時間:2023/12/15 Android 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android 状态栏工具——一行代码实现状态栏字体变黑 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

個人網(wǎng)站

參考了一些文章做了一些修改,變成了自己的工具類。其中有很多地方欠考慮,有待改進,歡迎路過的大佬給點建議。

狀態(tài)欄(一)
狀態(tài)欄(二)

經(jīng)過前兩篇的介紹我們對如何修改狀態(tài)欄的效果有了大致的了解,本篇介紹一種使用更加簡單的方式,可以先拉到最后查看效果圖。

設(shè)置主題效果

注意: 要設(shè)置fitsSystemWindows為true

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"><!-- Customize your theme here. --><item name="android:fitsSystemWindows">true</item><item name="colorPrimary">@color/colorPrimary</item><item name="colorPrimaryDark">@color/colorPrimaryDark</item><item name="colorAccent">@color/colorAccent</item></style>

參考SystemBarTint對狀態(tài)欄的改變方式,添加下面這個類方法,用來設(shè)置 API 19 以上的狀態(tài)欄效果

我們的界面繪制時在DecorView中的,這個類的核心思想就是:
1.獲取DecorView
2.繪制狀態(tài)欄高度的View
3.將view添加到DecorView中

所以我們對狀態(tài)欄的操作,其實就是對view的操作。在這個類中默認(rèn)view不顯示,改變狀態(tài)欄的效果時,要調(diào)用

setStatusBarTintEnabled(true

注意:使用這個方法的前提是 狀態(tài)欄是透明的,因為進行了相關(guān)的判斷(可以自行修改)

public class SystemBarTintManager {public static final int DEFAULT_TINT_COLOR = 0x99000000;private boolean mStatusBarAvailable;private boolean mStatusBarTintEnabled;private View mStatusBarTintView;@TargetApi(19)public SystemBarTintManager(Activity activity) {Window win = activity.getWindow();//獲取DecorViewViewGroup decorViewGroup = (ViewGroup) win.getDecorView();if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {// 檢查主題中是否有透明的狀態(tài)欄int[] attrs = {android.R.attr.windowTranslucentStatus};TypedArray a = activity.obtainStyledAttributes(attrs);try {mStatusBarAvailable = a.getBoolean(0, false);} finally {a.recycle();}WindowManager.LayoutParams winParams = win.getAttributes();int bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;//狀態(tài)欄透明if ((winParams.flags & bits) != 0) {mStatusBarAvailable = true;}}if (mStatusBarAvailable) {setupStatusBarView(activity, decorViewGroup);}}/*** 初始化狀態(tài)欄** @param context* @param decorViewGroup*/private void setupStatusBarView(Activity context, ViewGroup decorViewGroup) {mStatusBarTintView = new View(context);//設(shè)置高度為Statusbar的高度FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, getStatusBarHeight(context));params.gravity = Gravity.TOP;mStatusBarTintView.setLayoutParams(params);mStatusBarTintView.setBackgroundColor(DEFAULT_TINT_COLOR);//默認(rèn)不顯示mStatusBarTintView.setVisibility(View.GONE);//decorView添加狀態(tài)欄高度的ViewdecorViewGroup.addView(mStatusBarTintView);}/*** 獲取狀態(tài)欄高度** @param activity* @return*/private int getStatusBarHeight(Activity activity) {int statusBarHeight = 0;int resourceId = activity.getResources().getIdentifier("status_bar_height", "dimen", "android");if (resourceId > 0) {statusBarHeight = activity.getResources().getDimensionPixelSize(resourceId);}return statusBarHeight;}/*** 顯示狀態(tài)欄*/public void setStatusBarTintEnabled(boolean enabled) {mStatusBarTintEnabled = enabled;if (mStatusBarAvailable) {mStatusBarTintView.setVisibility(enabled ? View.VISIBLE : View.GONE);}}/*** 設(shè)置狀態(tài)欄顏色** @param color*/public void setStatusBarTintColor(int color) {if (mStatusBarAvailable) {mStatusBarTintView.setBackgroundColor(color);}} }

工具類代碼

在這段代碼中當(dāng)我們的API 為4.4.+ 但是小于 5.0時使用上述的類

/*** 修改狀態(tài)欄顏色,支持4.4以上版本* @param colorId 顏色*/public static void setStatusBarColor(Activity activity, int colorId) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {Window window = activity.getWindow();window.setStatusBarColor(colorId);} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {//使用SystemBarTintManager,需要先將狀態(tài)欄設(shè)置為透明setTranslucentStatus(activity);SystemBarTintManager systemBarTintManager = new SystemBarTintManager(activity);systemBarTintManager.setStatusBarTintEnabled(true);//顯示狀態(tài)欄systemBarTintManager.setStatusBarTintColor(colorId);//設(shè)置狀態(tài)欄顏色}}

完整代碼

import android.annotation.TargetApi; import android.app.Activity; import android.graphics.Color; import android.os.Build; import android.support.annotation.IntDef; import android.view.View; import android.view.Window; import android.view.WindowManager;import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.reflect.Field; import java.lang.reflect.Method;/*** Created by rhm on 2018/1/13.*/public class StatusBarUtil {public final static int TYPE_MIUI = 0;public final static int TYPE_FLYME = 1;public final static int TYPE_M = 3;//6.0@IntDef({TYPE_MIUI,TYPE_FLYME,TYPE_M})@Retention(RetentionPolicy.SOURCE)@interface ViewType {}/*** 修改狀態(tài)欄顏色,支持4.4以上版本* @param colorId 顏色*/public static void setStatusBarColor(Activity activity, int colorId) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {Window window = activity.getWindow();window.setStatusBarColor(colorId);} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {//使用SystemBarTintManager,需要先將狀態(tài)欄設(shè)置為透明setTranslucentStatus(activity);SystemBarTintManager systemBarTintManager = new SystemBarTintManager(activity);systemBarTintManager.setStatusBarTintEnabled(true);//顯示狀態(tài)欄systemBarTintManager.setStatusBarTintColor(colorId);//設(shè)置狀態(tài)欄顏色}}/*** 設(shè)置狀態(tài)欄透明*/@TargetApi(19)public static void setTranslucentStatus(Activity activity) {// 5.0以上系統(tǒng)狀態(tài)欄透明if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {Window window = activity.getWindow();//清除透明狀態(tài)欄window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN| View.SYSTEM_UI_FLAG_LAYOUT_STABLE);//設(shè)置狀態(tài)欄顏色必須添加window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);window.setStatusBarColor(Color.TRANSPARENT);//設(shè)置透明} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { //19activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);}}/*** 設(shè)置沉浸式狀態(tài)欄** @param fontIconDark 狀態(tài)欄字體和圖標(biāo)顏色是否為深色*/public static void setImmersiveStatusBar(Activity activity,boolean fontIconDark) {setTranslucentStatus(activity);if (fontIconDark) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {setStatusBarFontIconDark(activity,TYPE_M);} else if (OSUtils.isMiui()) {setStatusBarFontIconDark(activity,TYPE_MIUI);} else if (OSUtils.isFlyme()) {setStatusBarFontIconDark(activity,TYPE_FLYME);} else {//其他情況下我們將狀態(tài)欄設(shè)置為灰色,就不會看不見字體setStatusBarColor(activity,Color.LTGRAY);//灰色}}}/*** 設(shè)置文字顏色*/public static void setStatusBarFontIconDark(Activity activity,@ViewType int type) {switch (type) {case TYPE_MIUI:setMiuiUI(activity,true);break;case TYPE_M:setCommonUI(activity);break;case TYPE_FLYME:setFlymeUI(activity,true);break;}}//設(shè)置6.0的字體public static void setCommonUI(Activity activity) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN| View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);}}//設(shè)置Flyme的字體public static void setFlymeUI(Activity activity,boolean dark) {try {Window window = activity.getWindow();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);} catch (Exception e) {e.printStackTrace();}}//設(shè)置MIUI字體public static void setMiuiUI(Activity activity,boolean dark) {try {Window window = activity.getWindow();Class clazz = activity.getWindow().getClass();Class layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams");Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE");int darkModeFlag = field.getInt(layoutParams);Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class);if (dark) { //狀態(tài)欄亮色且黑色字體extraFlagField.invoke(window, darkModeFlag, darkModeFlag);} else {extraFlagField.invoke(window, 0, darkModeFlag);}} catch (Exception e) {e.printStackTrace();}} }

通用方法為

設(shè)置字體顏色為黑色setImmersiveStatusBar(Activity activity,boolean fontIconDark)設(shè)置狀態(tài)欄透明setTranslucentStatus(Activity activity)設(shè)置狀態(tài)欄的顏色setStatusBarColor(Activity activity, int colorId)

使用方式

public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);StatusBarUtil.setImmersiveStatusBar(this,true);} }

第二個參數(shù)是設(shè)置是否為黑色字體。
我們還可以調(diào)用下面代碼設(shè)置狀態(tài)欄顏色。

StatusBarUtil.setStatusBarColor(Activity activity, int colorId)

效果

使用時只需要一行代碼就可以改變狀態(tài)欄的字體顏色,是不是很簡單呢。

請在github上下載完整的內(nèi)容,工具類在statusbarutil中。

參考文章
https://www.jianshu.com/p/932568ed31af

總結(jié)

以上是生活随笔為你收集整理的Android 状态栏工具——一行代码实现状态栏字体变黑的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。