詳解Android沉浸式實(shí)現(xiàn)兼容解決辦法
自android5.0開(kāi)始,沉浸式狀態(tài)欄似乎成為一種潮流,應(yīng)用里缺少沉浸式總感覺(jué)少些什么。于是乎,我開(kāi)始到處找如何兼容低版本的沉浸式,由于Android平臺(tái)跨度問(wèn)題,總遇到一些不如人意的問(wèn)題。終于,皇天不負(fù)有心人,通過(guò)參考一些網(wǎng)絡(luò)上的資料以及開(kāi)發(fā)的一些經(jīng)驗(yàn),總結(jié)出一個(gè)可行的且良好的解決方案!
先介紹下,什么是沉浸式狀態(tài)欄?
沉浸式,要求在應(yīng)用中Android狀態(tài)欄(StatusBar)與標(biāo)題欄(ActionBar/Toolbar)要擁有相同的顏色,或者使用同一張圖的連續(xù)背景。


話不多說(shuō),亮劍吧!
具體實(shí)現(xiàn)需要針對(duì)不同Android版本做處理,還有針對(duì)DecorView做處理以及做activity的xml布局文件根布局控件做屬性處理。
java代碼,設(shè)置沉浸式的方法
/**
* 設(shè)置沉浸式狀態(tài)欄顏色
*
* @param colorResId 狀態(tài)欄顏色
*/
protected void setImmersiveStatusBarColor(@ColorRes int colorResId) {
int flags = View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
int statusBarColor = ApkUtil.getColor(this, colorResId); //①
float lightDegress = (Color.red(statusBarColor) + Color.green(statusBarColor) + Color.blue(statusBarColor)) / 3; //作色彩亮度判斷,好針對(duì)顏色做相應(yīng)的狀態(tài)欄的暗色還是亮色。
if ((lightDegress > 200 || lightDegress == 0) && Build.VERSION.SDK_INT > Build.VERSION_CODES.M)
rootView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
window.setStatusBarColor(statusBarColor);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
rootView.setSystemUiVisibility(flags | View.SYSTEM_UI_FLAG_IMMERSIVE | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
rootView.setSystemUiVisibility(flags);
}
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) { //當(dāng)API小于等于19,此時(shí)為了實(shí)現(xiàn)沉浸式狀態(tài)欄,需要添加一個(gè)view來(lái)做statusbar背景控件
final boolean isHasStatusBarView = rootView.getTag() != null;
View statusbarView = !isHasStatusBarView ? new View(this) : (View)rootView.getTag();
statusbarView.setBackgroundResource(colorResId);
if(!isHasStatusBarView) {
rootView.setTag(statusBarView);
statusbarView.setLayoutParams(new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, ViewUtil.getStatusBarHeight(this))); //②
rootView.addView(statusbarView);
}
}
}
注:此處針對(duì)rootView(即DecorView)、window的獲取不再陳述!
①.ApkUtil.getColor(this, colorResId)
/**
* 獲取顏色資源
* @param context 上下文對(duì)象
* @param colorId 顏色ResId
* @return
*/
@SuppressWarnings("deprecation")
public static int getColor(Context context, int colorId) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
return context.getColor(colorId);
}
return context.getResources().getColor(colorId);
}
②. 獲取狀態(tài)欄高度
/**
* 獲取狀態(tài)欄高度
* @param context 上下文對(duì)象
*/
@JvmStatic
@SuppressLint("PrivateApi")
fun getStatusBarHeight(context: Context): Int {
val clazz = Class.forName("com.android.internal.R\$dimen")
val obj = clazz?.newInstance()
val field = clazz.getField("status_bar_height")
field?.let {
field.isAccessible = true
val x = Integer.parseInt(field.get(obj).toString())
return context.resources.getDimensionPixelSize(x)
}
return 75
}
activity布局xml根布局添加以下屬性
android:fitsSystemWindows="true" android:clipToPadding="false"
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android實(shí)現(xiàn)沉浸式通知欄通知欄背景顏色跟隨app導(dǎo)航欄背景顏色而改變
- Android 實(shí)現(xiàn)沉浸式狀態(tài)欄的方法
- Android沉浸式狀態(tài)欄微技巧(帶你真正理解沉浸式模式)
- Android之沉浸式狀態(tài)欄的實(shí)現(xiàn)方法、狀態(tài)欄透明
- Android 4.4以上"沉浸式"狀態(tài)欄效果的實(shí)現(xiàn)方法
- 解決Android 沉浸式狀態(tài)欄和華為虛擬按鍵沖突問(wèn)題
- Android 沉浸式狀態(tài)欄與隱藏導(dǎo)航欄實(shí)例詳解
- Android App仿QQ制作Material Design風(fēng)格沉浸式狀態(tài)欄
- Android實(shí)現(xiàn)沉浸式導(dǎo)航欄實(shí)例代碼
相關(guān)文章
Android獲取網(wǎng)絡(luò)圖片并顯示的方法
這篇文章主要為大家詳細(xì)介紹了Android獲取網(wǎng)絡(luò)圖片并顯示的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-11-11
android傳送照片到FTP服務(wù)器的實(shí)現(xiàn)代碼
這篇文章主要為大家詳細(xì)介紹了android傳送照片到FTP服務(wù)器的實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06
Android編程開(kāi)發(fā)之RadioGroup用法實(shí)例
這篇文章主要介紹了Android編程開(kāi)發(fā)之RadioGroup用法,結(jié)合實(shí)例形式分析了Android中RadioGroup單選按鈕的具體使用技巧,需要的朋友可以參考下2015-12-12
Android UI實(shí)現(xiàn)多行文本折疊展開(kāi)效果
這篇文章主要為大家詳細(xì)介紹了Android UI實(shí)現(xiàn)多行文本折疊展開(kāi)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10
Android自定義View的三種實(shí)現(xiàn)方式總結(jié)
本篇文章主要介紹了Android自定義View的三種實(shí)現(xiàn)方式總結(jié),非常具有實(shí)用價(jià)值,需要的朋友可以參考下。2017-02-02
Android Studio 3.5版本JNI生成SO文件詳解
這篇文章主要介紹了Android Studio 3.5版本JNI生成SO文件詳解,想了解JNI的同學(xué),可以參考下2021-04-04

