1.概述
?????? 隨著安卓4.4版本允許開發(fā)者改變狀態(tài)欄之后太抓,各大App也都選擇了進(jìn)入自己的主題色或背景圖片作為狀態(tài)欄的顏色读整,較之前的系統(tǒng)默認(rèn)狀態(tài)欄相比無疑是提高了用戶體驗(yàn),也讓App在這個(gè)看臉的社會,更具有吸引力茅撞,當(dāng)然對于自己的作品痴昧,有好的東西能實(shí)現(xiàn)的肯定要盡可能的實(shí)現(xiàn)稽穆,畢竟產(chǎn)品的提升就在這點(diǎn)滴之間,下面進(jìn)入今天的主題吧
2.安卓4.4版本的實(shí)現(xiàn)
4.4版本推出后開發(fā)者可以使用浸入圖片的背景色赶撰,但是無法主動的改變顏色舌镶,使用也比較簡單:
if (Build.VERSION.SDK_INT>= Build.VERSION_CODES.KITKAT)
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
FLAG_TRANSLUCENT_STATUS : 意思很簡單就是表面意思,透明狀態(tài)欄
設(shè)置之后你的系統(tǒng)狀態(tài)欄就會隨著你的底色改變顏色了豪娜,效果就不展示了餐胀,不過你會發(fā)現(xiàn),你的標(biāo)題或者ToolBar和狀態(tài)欄重合了瘤载,感覺也浸入進(jìn)去了否灾,這是你需要為浸入的View設(shè)置一下屬性:
android:fitsSystemWindows="true"
android:clipToPadding="true"
android:fitsSystemWindows="true",就是使用系統(tǒng)的窗口布局鸣奔,系統(tǒng)還會自動在浸入狀態(tài)欄的前面加上一個(gè)Padding墨技,這樣你的view或標(biāo)題就不會被頂上去了,至于第二個(gè)屬性溃蔫,以實(shí)際效果來看健提,寫和不寫都不會影響最后的布局,不過別以為就這么簡單伟叛,麻煩由此開始私痹。。。紊遵。账千。
到此你如果在4.4 版本上使用時(shí)一切正常,能達(dá)到你預(yù)期的效果暗膜,但是在5.0以上運(yùn)行的話你會發(fā)現(xiàn)狀態(tài)欄不是完全透明的匀奏,而是有半透明的效果,(本人的魅族手機(jī)除外学搜,魅族的系統(tǒng)顯示的是沒有這個(gè)半透明的)這就是第一個(gè)麻煩娃善,后面會繼續(xù)分析
3.安卓5.0以上的狀態(tài)欄
前面已經(jīng)提到5.0以上的狀態(tài)欄是一種半透明效果,那就先來認(rèn)識一下5.0新增改變狀態(tài)欄的方法瑞佩,使用過ToolBar的同學(xué)應(yīng)該知道聚磺,在stytle文件中就可以設(shè)定狀態(tài)欄和導(dǎo)航欄的顏色,不過5.0以后可以在代碼中改變狀態(tài)欄和導(dǎo)航欄的顏色炬丸,現(xiàn)在我們的目的是要和4.4的統(tǒng)一起來瘫寝,這就需要把半透明顏色改為透明的顏色:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){
Window window = getWindow();
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS );
window.setStatusBarColor(Color.TRANSPARENT);
window.setNavigationBarColor(Color.TRANSPARENT);
}
到此可以讓5.0的狀態(tài)欄變成透明狀態(tài)
4.遇到的問題
1.ViewPagr+Fragment:
筆者首頁使用的是ViewPager可是無論怎么設(shè)置Fragment中的View總是會與狀態(tài)欄重合,而別的界面的Activity和ToolBar都正常稠炬,查了一些資料也沒有特別好的方法焕阿,最后我才用了BUG的一招強(qiáng)行在View的前面添加一個(gè)占位空格,使界面布局回復(fù)到正常的狀態(tài)首启,這里整理一下方便以后查找的同學(xué)暮屡,這也是我為什么寫這篇文章的原因,直接看代碼:
首先在xml中寫一個(gè)占位View
<View
android:id="@+id/view"
android:layout_width="match_parent"
android:layout_height="0dp"></View>
android:id="@+id/view"
android:layout_width="match_parent"
android:layout_height="0dp"></View>
代碼中寫了一個(gè)空的View闽坡,之后根據(jù)手機(jī)狀態(tài)欄的高度設(shè)置其高度達(dá)到適配的效果
獲取狀態(tài)欄的高度
public static int getStatusBarHeight(Context context) {
Class<?> c = null;
Object obj = null;
Field field = null;
int x = 0;
try {
c = Class.forName("com.android.internal.R$dimen");
obj = c.newInstance();
field = c.getField("status_bar_height");
x = Integer.parseInt(field.get(obj).toString());
return context.getResources().getDimensionPixelSize(x);
} catch (Exception e1) {
e1.printStackTrace();
return 75;
}
}
Class<?> c = null;
Object obj = null;
Field field = null;
int x = 0;
try {
c = Class.forName("com.android.internal.R$dimen");
obj = c.newInstance();
field = c.getField("status_bar_height");
x = Integer.parseInt(field.get(obj).toString());
return context.getResources().getDimensionPixelSize(x);
} catch (Exception e1) {
e1.printStackTrace();
return 75;
}
}
這個(gè)利用反射獲取狀態(tài)欄高度的方法大家應(yīng)該不陌生吧栽惶,肯定多數(shù)人都見過
設(shè)置占位View的高度
View view1 = view.findViewById(R.id.view);
ViewGroup.LayoutParams layoutParams = view1.getLayoutParams();
layoutParams.height = IContent.getStatusBarHeight(getActivity());
view1.setLayoutParams(layoutParams);
view1.setBackgroundColor(Color.TRANSPARENT);
到這里就可以實(shí)現(xiàn)在Fragment上顯示的效果了,今天就到這了疾嗅,當(dāng)然后面還有因?yàn)檫@個(gè)浸入式狀態(tài)欄而導(dǎo)致的問題后面再繼續(xù)談?wù)?/p>