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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android沉浸式 字体,全面解析android沉浸式状态栏

發布時間:2023/12/19 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android沉浸式 字体,全面解析android沉浸式状态栏 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、沉浸式實現方式

實現沉浸式狀態樣主要有兩種方式,一種是通過設置theme來實現,另一種是代碼中實現

1.1通過設置theme來實現

通過theme設置也有兩種方法

方法一:

values/style.xml

values-v19/style.xml

true

true

values-v21/style.xml

false

true

@android:color/transparent

方法二:

直接在values/style.xml中通過函數API進行區分

true

true

@android:color/transparent

1.2 代碼中設置

/**

* 通過設置全屏,設置狀態欄透明

*

* @param activity

*/

private void fullScreen(Activity activity) {

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {

Window window = activity.getWindow();

View decorView = window.getDecorView();

//兩個 flag 要結合使用,表示讓應用的主體內容占用系統狀態欄的空間

int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN

| View.SYSTEM_UI_FLAG_LAYOUT_STABLE;

decorView.setSystemUiVisibility(option);

window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);

//設置狀態欄為透明,否則在部分手機上會呈現系統默認的淺灰色

window.setStatusBarColor(Color.TRANSPARENT);

//導航欄顏色也可以考慮設置為透明色

//window.setNavigationBarColor(Color.TRANSPARENT);

} else {

Window window = activity.getWindow();

WindowManager.LayoutParams attributes = window.getAttributes();

int flagTranslucentStatus = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;

int flagTranslucentNavigation = WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION;

attributes.flags |= flagTranslucentStatus;

// attributes.flags |= flagTranslucentNavigation;

window.setAttributes(attributes);

}

}

}

上面設置完之后,會出現頁面擠到狀態欄中去了,如下圖,

image.png

針對這種情況又有2種解決辦法,一種是設置android:fitsSystemWindows,另一種獲取狀態樣高度后,設置頁面的paddingTop值。

方案一:

values/style.xml中設置

true

true

@android:color/transparent

true

方案二:

首先通過反射獲取狀態欄高度

StatusBarCompat.class

public static int getStatusBarHeight(Context context) {

int result = 0;

int resId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");

if (resId > 0) {

result = context.getResources().getDimensionPixelOffset(resId);

}

return result;

}

再獲取頁面的根布局設置paddingTop

final int statusHeight = StatusBarCompat.getStatusBarHeight(this);

root.mToolBar.setPadding(0, statusHeight, 0, 0);

修改后的效果:

image.png

二、狀態欄顏色修改

通過上面的設置可以實現狀態欄的沉浸效果,狀態欄顏色和字體顏色似乎不太近人意

android 5.0之后提供了修改狀態欄顏色的方法

window.setStatusColor(@ColorInt int color)

該方法的生效條件是給window添加LAG_DRAWS_SYSTEM_BAR_BACKGROUNDS并取消FLAG_TRANSLUCENT_STATUS屬性,android 4.4 需要用到SystemBarTintManager 輔助類,在build.gradle中引用compile 'com.readystatesoftware.systembartint:systembartint:1.0.3'

修改的狀態欄顏色的代碼如下:

/**

* 修改狀態欄顏色,支持4.4以上版本

* @param activity

* @param colorId

*/

public static void setStatusBarColor(Activity activity, int colorId) {

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {

Window window = activity.getWindow();

window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);

window.setStatusBarColor(activity.getResources().getColor(colorId));

} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {

//使用SystemBarTint庫使4.4版本狀態欄變色,需要先將狀態欄設置為透明

transparencyBar(activity);

SystemBarTintManager tintManager = new SystemBarTintManager(activity);

tintManager.setStatusBarTintEnabled(true);

tintManager.setStatusBarTintResource(colorId);

}

}

三、狀態欄文字顏色修改

android 6.0以上才添加修改狀態欄字體顏色,修改相對比較麻煩點,分為google原生、小米、魅族三種情況。

google原生狀態欄文字顏色修改

這個方法比較簡單,通過切換DecorView兩個不同的標志位

private static void setAndroidNativeLightStatusBar(Activity activity, boolean dark) {

View decor = activity.getWindow().getDecorView();

if (dark) {

decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);

} else {

decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);

}

}

小米系統狀態欄文字顏色修改

直接來代碼

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 && RomUtils.isMiUIV7OrAbove()) {

//開發版 7.7.13 及以后版本采用了系統API,舊方法無效但不會報錯,所以兩個方式都要加上

if (dark) {

activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);

} else {

activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);

}

}

} catch (Exception e) {

}

}

return result;

}

魅族系統狀態欄文字顏色修改

private static boolean setFlymeLightStatusBar(Activity activity, boolean dark) {

boolean result = false;

if (activity != null) {

try {

WindowManager.LayoutParams lp = activity.getWindow().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);

activity.getWindow().setAttributes(lp);

result = true;

} catch (Exception e) {

}

}

return result;

}

修改成功之后的效果圖

image.png

四、使用建議

android 6.0之前,不能夠修改狀態欄文字顏色,默認的文字顏色是白色,所以,在6.0以下要設置狀態欄顏色不能設置為白色,為了防止文字和背景顏色相同。

我的使用,6.0以上白色狀態欄,黑色背景;6.0以下黑色狀態欄,白色背景

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

StatusBarUtils.setLightStatusBar(this, true);//黑色文字

StatusBarUtils.setStatusBarColor(this, R.color.white);//白色背景

}else {

//6.0以下默認白色文字

StatusBarUtils.setStatusBarColor(this, R.color.black);//黑色背景

}

五、附加代碼

StatusBarUtils類

/**

* Describe : 狀態欄設置工具

*/

public class StatusBarUtils {

@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.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);

window.setStatusBarColor(Color.TRANSPARENT);

window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE

| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);

} 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以上版本

* @param activity

* @param colorId

*/

public static void setStatusBarColor(Activity activity, int colorId) {

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {

Window window = activity.getWindow();

window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);

window.setStatusBarColor(activity.getResources().getColor(colorId));

}

else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {

//使用SystemBarTint庫使4.4版本狀態欄變色,需要先將狀態欄設置為透明

transparencyBar(activity);

SystemBarTintManager tintManager = new SystemBarTintManager(activity);

tintManager.setStatusBarTintEnabled(true);

tintManager.setStatusBarTintResource(colorId);

}

}

/**

* 修改狀態欄文字顏色,這里小米,魅族區別對待。

*/

public static void setLightStatusBar(final Activity activity, final boolean dark) {

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {

switch (RomUtils.getLightStatusBarAvailableRomType()) {

case RomUtils.AvailableRomType.MIUI:

MIUISetStatusBarLightMode(activity, dark);

break;

case RomUtils.AvailableRomType.FLYME:

setFlymeLightStatusBar(activity, dark);

break;

case RomUtils.AvailableRomType.ANDROID_NATIVE:

setAndroidNativeLightStatusBar(activity, dark);

break;

}

}

}

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 && RomUtils.isMiUIV7OrAbove()) {

//開發版 7.7.13 及以后版本采用了系統API,舊方法無效但不會報錯,所以兩個方式都要加上

if (dark) {

activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);

} else {

activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);

}

}

} catch (Exception e) {

}

}

return result;

}

private static boolean setFlymeLightStatusBar(Activity activity, boolean dark) {

boolean result = false;

if (activity != null) {

try {

WindowManager.LayoutParams lp = activity.getWindow().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);

activity.getWindow().setAttributes(lp);

result = true;

} catch (Exception e) {

}

}

return result;

}

private static void setAndroidNativeLightStatusBar(Activity activity, boolean dark) {

View decor = activity.getWindow().getDecorView();

if (dark) {

decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);

} else {

decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);

}

}

}

RomUtils類代碼:

/**

* Describe : rom 工具

*/

public class RomUtils {

class AvailableRomType {

public static final int MIUI = 1;

public static final int FLYME = 2;

public static final int ANDROID_NATIVE = 3;

public static final int NA = 4;

}

public static int getLightStatusBarAvailableRomType() {

//開發版 7.7.13 及以后版本采用了系統API,舊方法無效但不會報錯

if (isMiUIV7OrAbove()) {

return AvailableRomType.ANDROID_NATIVE;

}

if (isMiUIV6OrAbove()) {

return AvailableRomType.MIUI;

}

if (isFlymeV4OrAbove()) {

return AvailableRomType.FLYME;

}

if (isAndroidMOrAbove()) {

return AvailableRomType.ANDROID_NATIVE;

}

return AvailableRomType.NA;

}

//Flyme V4的displayId格式為 [Flyme OS 4.x.x.xA]

//Flyme V5的displayId格式為 [Flyme 5.x.x.x beta]

private static boolean isFlymeV4OrAbove() {

String displayId = Build.DISPLAY;

if (!TextUtils.isEmpty(displayId) && displayId.contains("Flyme")) {

String[] displayIdArray = displayId.split(" ");

for (String temp : displayIdArray) {

//版本號4以上,形如4.x.

if (temp.matches("^[4-9]\\.(\\d+\\.)+\\S*")) {

return true;

}

}

}

return false;

}

//Android Api 23以上

private static boolean isAndroidMOrAbove() {

return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M;

}

private static final String KEY_MIUI_VERSION_CODE = "ro.miui.ui.version.code";

private static boolean isMiUIV6OrAbove() {

try {

final Properties properties = new Properties();

properties.load(new FileInputStream(new File(Environment.getRootDirectory(), "build.prop")));

String uiCode = properties.getProperty(KEY_MIUI_VERSION_CODE, null);

if (uiCode != null) {

int code = Integer.parseInt(uiCode);

return code >= 4;

} else {

return false;

}

} catch (final Exception e) {

return false;

}

}

總結

以上是生活随笔為你收集整理的android沉浸式 字体,全面解析android沉浸式状态栏的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产第一av | 中文字幕在线观看免费 | 桥本有菜aⅴ一区二区三区 在线午夜电影 | 亚洲自拍偷拍一区二区三区 | 日本视频一区二区三区 | 久久久久在线 | 欧美激情爱爱 | 国产成人亚洲综合a∨婷婷 台湾a级片 | 一级片网址 | 国产av成人一区二区三区高清 | 国产婷婷色 | 欧美麻豆视频 | 九九精品视频在线 | 污导航在线| av在线天堂网 | 亚洲精品成人 | 亚洲97 | 芭乐视频色 | 美女隐私黄www网站动漫 | 免费黄色小视频网站 | 欧洲中文字幕日韩精品成人 | 久草婷婷| 亚洲av色香蕉一区二区三区 | 制服.丝袜.亚洲.中文.综合懂 | 性欧美jzjz2 九草影院 | 嫩草伊人| 午夜精品久久久久久久久久 | 91理论片| 国产99页| 久久精品视频偷拍 | 日韩男人的天堂 | 九九看片 | 亚洲欧美日韩中文字幕在线观看 | 亚洲天堂免费av | 韩日三级视频 | 羞羞涩涩视频 | 成人网免费 | 一级v片 | 456亚洲影视 | 福利在线一区二区 | 都市激情久久 | 肉色丝袜脚交一区二区 | 国产又粗又猛又黄又爽无遮挡 | 亚洲欧美日韩国产成人精品影院 | 久久精品国产久精国产 | 黄色aa毛片 | 国产成人精品一二三区 | 日韩精品一区二区在线 | 国产一区二区小视频 | 国产精品毛片久久 | 黄页免费视频 | 精品国产视频一区二区三区 | 麻豆视频一区二区 | 男女视频在线观看免费 | 日韩一区二区三区免费视频 | 精品国产免费一区二区三区 | 影音先锋在线视频 | 男人猛进女人爽的大叫 | 亚洲黄色第一页 | 性中文字幕| 91精品国产综合久久精品 | 精品在线视频免费 | 久久精品一二三区 | 日本一区二区高清不卡 | 日韩中文字幕在线播放 | 亚洲最大福利视频 | 亚洲av无码片一区二区三区 | 99re在线视频免费观看 | 中文一二区 | 亚洲精品久久 | 91精产国品 | 污污免费视频 | 久久九九精品 | 久久不卡视频 | 国产片免费 | 青青草原伊人 | 亚洲成人资源 | 国产在线v | 这里只有精品视频在线观看 | 美女扒开腿免费视频 | 成人精品久久久 | 美女的诞生免费观看在线高清 | 成人午夜精品 | 99精品国产免费 | 欧美三区视频 | 北条麻妃二三区 | 欧美老熟妇一区二区三区 | 在线观看中出 | 最新中文字幕在线 | 亚洲午夜不卡 | 97视频网址 | av天天看| 成人黄色a级片 | 在线精品亚洲欧美日韩国产 | 国产av无毛| 91丝袜呻吟高潮美腿白嫩在线观看 | 久久99精品视频 | 91成人免费在线观看视频 | 国产一区二区三区成人 |