我們知道,Android5.0以上已經(jīng)可以通過設(shè)置colorPrimaryDark來改變狀態(tài)欄的顏色骡男。但是俭尖,大多數(shù)Android開發(fā)者都會(huì)遇到讓系統(tǒng)狀態(tài)欄透明或者半透明的需求,如下圖所示:
讀這篇文章之前建議研讀郭神的Android狀態(tài)欄微技巧洞翩,帶你真正理解沉浸式模式。這里我們堅(jiān)決不考慮4.4以下的系統(tǒng)焰望,那么基本上可以分為幾種情況骚亿,4.4、 5.0以上6.0以下熊赖、 6.0+来屠。
本篇文章目錄:
1.透明與半透明狀態(tài)欄
2.結(jié)合Toolbar使用技巧
3.白底黑字狀態(tài)欄
4.其他注意事項(xiàng)
透明與半透明狀態(tài)欄
首先我們實(shí)現(xiàn)上邊兩圖的效果,注意下版本的判斷,直接上代碼:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
View decorView = getWindow().getDecorView();
int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
decorView.setSystemUiVisibility(option);
getWindow().setStatusBarColor(Color.TRANSPARENT);
//getWindow().setStatusBarColor(Color.parseColor("#40000000")); //此種效果為類似QQ的半透明狀態(tài)欄
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
getWindow().setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
版本號(hào)為21以上時(shí)俱笛,效果便如上邊兩圖所示捆姜,4.4系統(tǒng)則如下圖所示:
結(jié)合標(biāo)題欄使用的技巧
上述方法基本上已經(jīng)實(shí)現(xiàn)了透明狀態(tài)欄的效果,但是我們添加一個(gè)Toolbar迎膜,設(shè)置各種屬性后泥技,各種元素都上移了,如下圖所示:
部分開發(fā)者用android:fitsSystemWindows = "true"磕仅,然后給狀態(tài)欄添加一個(gè)View來解決珊豹,經(jīng)本人各種實(shí)驗(yàn)后,發(fā)現(xiàn)這種方法不太適合自己榕订。
這里采用一個(gè)比較直接的方式店茶,設(shè)置透明后相當(dāng)于toolbar已經(jīng)被拉長,所以為其設(shè)置一個(gè)padding值來解決問題劫恒,代碼如下贩幻,ScreenUtils為獲取屏幕屬性的一個(gè)工具類:
mToolbar = (Toolbar) findViewById(R.id.toolbar_common);
if (mToolbar != null) {
mToolbar.getLayoutParams().height += ScreenUtils.getStatusHeight(getApplicationContext());
mToolbar.setPadding(0, ScreenUtils.getStatusHeight(getApplicationContext()), 0, 0);
setSupportActionBar(mToolbar);
ActionBar supportActionBar = getSupportActionBar();
if (supportActionBar != null) {
supportActionBar.setDisplayShowTitleEnabled(false); //此處是為了不顯示默認(rèn)的標(biāo)題
}
}
設(shè)置之后,就達(dá)到我們想要的效果了两嘴。
白底黑字狀態(tài)欄
有時(shí)候我們的toolbar背景為淺色甚至是白色丛楚,如果不加修飾的話,狀態(tài)欄的文字由于默認(rèn)白色溶诞,導(dǎo)致很難分辨鸯檬。6.0以上系統(tǒng)直接提供了方法,但是考慮到其他版本螺垢,需要具體判斷:
//設(shè)置狀態(tài)欄文字為暗色
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
//6.0以上可以通過直接設(shè)置SYSTEM_UI_FLAG_LIGHT_STATUS_BAR屬性即可喧务。
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
getWindow().setStatusBarColor(Color.GRAY); //21以上不支持6.0直接設(shè)置的方法,可用灰色代替枉圃,具體可自己設(shè)置
//getWindow().setStatusBarColor(Color.parseColor("#40000000"));
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN){
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);//4.4版本本身就含有暗色陰影功茴,不作其他處理即可
}
效果圖如下:
5.0以上6.0以下:
4.4效果:
注意事項(xiàng)
上述方法基本上已經(jīng)可以滿足大部分需求了,效果都可以稱為(半)透明狀態(tài)欄孽亲。下邊看看真正的沉浸式狀態(tài)欄坎穿,狀態(tài)欄文字和導(dǎo)航欄都被隱藏:
代碼如下:
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus && Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
View decorView = getWindow().getDecorView();
decorView.setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
}
}
實(shí)際開發(fā)中,我們當(dāng)然不可能每個(gè)Activity中都寫一大堆重復(fù)的代碼返劲,所以建議講透明狀態(tài)欄的代碼封裝在BaseActivity中玲昧,然后Toolbar設(shè)置相同的id,或者使用<include>標(biāo)簽公用篮绿,自定義的一個(gè)布局或者其他View也是同理孵延。
Demo中做了一些簡單的封裝,可以參考下亲配,具體實(shí)現(xiàn)還是需要看具體的需求尘应。
本文所有代碼的地址,戳 我的Github 惶凝,在StatusBar包中。