Android4.4以后, 可以將狀態(tài)欄設(shè)置為透明, 或者任意顏色?
創(chuàng)新互聯(lián)2013年至今,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè)網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元金秀做網(wǎng)站,已為上家服務(wù),為金秀各地企業(yè)和個人服務(wù),聯(lián)系電話:13518219792
1. 全屏模式?
2. 著色模式?
在Android4.4之后提供了可以修改狀態(tài)欄的屬性接口后,我們可以直接通過style文件來配置狀態(tài)欄, 但是需要注意的是, 為了兼容4.4以下的版本, 所以必須在配置多個API級別的values文件. 這里直接借參考文章中的圖:?
最基本的在4.4版本之下會加載默認(rèn)的values/styles.xml, 如果在4.4版本會加載 values-v19/styles.xml, 5.0以上加載 values-v21/styles.xml文件. 具體配置如下:
values/styles.xml
style name="ImageTranslucentTheme" parent="AppTheme"
!--在Android 4.4之前的版本上運(yùn)行,直接跟隨系統(tǒng)主題--/style123
values-v19/styles.xml
style name="ImageTranslucentTheme" parent="Theme.AppCompat.Light.DarkActionBar"
item name="android:windowTranslucentStatus"true/item
item name="android:windowTranslucentNavigation"true/item
/style1234
values-v21/styles.xml
style name="ImageTranslucentTheme" parent="Theme.AppCompat.Light.DarkActionBar"
item name="android:windowTranslucentStatus"false/item
item name="android:windowTranslucentNavigation"true/item
!--Android 5.x開始需要把顏色設(shè)置透明,否則導(dǎo)航欄會呈現(xiàn)系統(tǒng)默認(rèn)的淺灰色--
item name="android:statusBarColor"@android:color/transparent/item
/style
先看一下默認(rèn)的情況:
藍(lán)色一行是自定義的導(dǎo)航欄,
黑色的是自帶的 ActionBar ,也就是我們說的標(biāo)題欄。
首先一般都會選擇去掉 ActionBar:
隱藏 actionbar 有很多種方法
這種方法是全局中隱藏了標(biāo)題欄。
其實在我的手機(jī)更新系統(tǒng)之前,隱藏了 ActionBar 后,狀態(tài)欄和自定義的導(dǎo)航欄顏色是相匹配的,不知道什么原因現(xiàn)在默認(rèn)為灰色了。
上面使用的主題雖然隱藏了標(biāo)題欄,但是和我們自定義的導(dǎo)航欄不搭,
這時候我們可以選擇用自定義的主題(Theme),來改變狀態(tài)欄:
在 values 下的 style.xml 中添加
或者在 onCreate 中:
上面兩行一般不一起設(shè)置,二選一即可。
第一行設(shè)置導(dǎo)航欄為透明,第二行將導(dǎo)航欄隱藏。
不推薦第二種做法,如果一個 Activity 中設(shè)置了隱藏導(dǎo)航欄而另一個 Activity 沒有,那兩者切換的時候會不好看。
融合的效果:
狀態(tài)欄和 app 頂部相融合了,如果標(biāo)題欄是一張圖片效果會更好。
這里還有一個問題,狀態(tài)欄的文字和我們導(dǎo)航欄的文字重疊了,
我們可以選擇在布局文件的根元素中添加:
讓布局為狀態(tài)欄留出空間,就不會出現(xiàn)上面這張被狀態(tài)欄遮擋的情況。
如果像上面的例子是一樣的純色的標(biāo)題欄,我們可以選擇直接改變狀態(tài)欄的顏色解決問題。
或者:
不顯示時間、電量等信息和文字:
同要可以用修改 Theme 來實現(xiàn):
或者在 OnCreat() 中加入,還是要注意加在 setContentView() 的前面
如果想讓圖片全屏要注意設(shè)置為:
注意!兩種方法的區(qū)別:
第一種:為頂部欄跟隨當(dāng)前activity的布局文件的背景的顏色,使用方便,不過也有點問題就是,如果有底部虛擬導(dǎo)航鍵的話,導(dǎo)航鍵的背景跟頂部的顏色一樣,比如:
第二種:是通過設(shè)置頂部欄的顏色來顯示的,可以解決第一種的不足,比如:
第一種使用方法:
第一、首先在values、values-v19、values-v21文件夾下的styles.xml都設(shè)置一個 Translucent System Bar 風(fēng)格的Theme,如下圖:
values/style.xml:
style name="TranslucentTheme" parent="AppTheme"
!--在Android 4.4之前的版本上運(yùn)行,直接跟隨系統(tǒng)主題--
/style123
values-v19/style.xml:
style name="TranslucentTheme" parent="Theme.AppCompat.Light.DarkActionBar"
item name="android:windowTranslucentStatus"true/item
item name="android:windowTranslucentNavigation"true/item
/style1234
values-v21/style.xml:
style name="TranslucentTheme" parent="Theme.AppCompat.Light.DarkActionBar"
item name="android:windowTranslucentStatus"false/item
item name="android:windowTranslucentNavigation"true/item
!--Android 5.x開始需要把顏色設(shè)置透明,否則導(dǎo)航欄會呈現(xiàn)系統(tǒng)默認(rèn)的淺灰色--
item name="android:statusBarColor"@android:color/transparent/item
/style123456
第二、在清單文件中配置需要沉浸式狀態(tài)欄的activity加入theme
activity android:name=".ImageActivity" android:theme="@style/TranslucentTheme" /
activity android:name=".ColorActivity" android:theme="@style/TranslucentTheme" /12
第三、在Activity的布局文件中的跟布局加入“android:fitsSystemWindows=”true””,但是,這里需要區(qū)分一下,就是背景是圖片還是純色:
1.當(dāng)背景為圖片時,布局可以這么寫:
?xml version="1.0" encoding="utf-8"?
RelativeLayout xmlns:android=""
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/imgs_bj"
android:fitsSystemWindows="true"
/RelativeLayout12345678
效果:
2.當(dāng)背景為純色,我們需要對布局劃分一下,標(biāo)題布局與內(nèi)容布局,先把根布局背景設(shè)置成標(biāo)題布局的背景色,然后標(biāo)題背景色可以不用設(shè)置直接使用根布局的背景色,最后內(nèi)容布局背景色設(shè)置為白色
?xml version="1.0" encoding="utf-8"?
LinearLayout xmlns:android=""
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorPrimary" //根布局背景設(shè)置成“標(biāo)題布局”想要的顏色
android:fitsSystemWindows="true"
android:orientation="vertical"
!--標(biāo)題布局--
RelativeLayout
android:layout_width="match_parent"
android:layout_height="55dp"
android:background="@color/color_31c27c"
TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="這是標(biāo)題"
android:textColor="@android:color/white"
android:textSize="20sp" /
/RelativeLayout
!--內(nèi)容布局--
LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/white" //內(nèi)容區(qū)域背景設(shè)置成白色
android:gravity="center"
android:orientation="vertical"
Button
android:layout_marginTop="120dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="8dp"
android:text="顯示信息"
android:onClick="showMsg"
/
/LinearLayout
/LinearLayout
前言:最近項目大量用到狀態(tài)欄透明,網(wǎng)上也出現(xiàn)很多庫可以直接拿來用,個人認(rèn)為沒有必要那么重引用到一個庫(有木有同學(xué)和我有一樣的想法),所以研究了一番,在此做個記錄加強(qiáng)記憶也便后期查閱,如果無意中有幸能幫助到你那就再好不過了。
Android 從 4.4 (SDK 19) 開始支持 系統(tǒng)欄(狀態(tài)欄+導(dǎo)航欄)半透明 效果:
翻譯一下就是:
TranslucentDecor 主題設(shè)置了兩個屬性 windowTranslucentStatus 和 windowTranslucentNavigation 都為 true,前者指定狀態(tài)欄半透明、后者指定導(dǎo)航欄半透明。
本文只探討“狀態(tài)欄” 。
默認(rèn)樣式是這樣:
可見 Toolbar 和系統(tǒng)狀態(tài)欄之間有明顯的分界,我們要實現(xiàn)的效果是 Toolbar 和狀態(tài)欄背景統(tǒng)一,看起來像是一個整體(自行腦補(bǔ)圖片)。
按照官方文檔,我們自定義主題:
對應(yīng)的 Activity 引用該主題:
我看來看看效果:
雖然實現(xiàn)了半透明,但是布局被狀態(tài)欄覆蓋,接下來在布局文件中設(shè)置 fitSystemWindows (注意加到根節(jié)點 ConstraintLayout 上):
來看看效果:
雖然布局沒有被狀態(tài)欄覆蓋,但是狀態(tài)欄背景顯然這不是我們想要的效果????
為什么狀態(tài)欄會這么奇怪?
文章開頭的定義中我們說了,布局文件會延伸到狀態(tài)欄所占區(qū)域下, fitsSystemWindows 的作用是給對應(yīng)的 View 增加 padding(這里以 ConstraintLayout 為例),目的是為了讓其內(nèi)容不被狀態(tài)欄遮擋。
在我們的布局文件中 ConstraintLayout 沒有設(shè)置背景(默認(rèn)白色),所以狀態(tài)欄默認(rèn)的半透明背景色和 ConstraintLayout 的白色背景疊加,就變成了上圖中的效果。
【總結(jié)】兩個基本概念:
1、 windowTranslucentStatus 設(shè)置為true之后,狀態(tài)欄默認(rèn)是 半透明 的(4.4 是黑色到透明色漸變,5.0+ 是純黑色半透明),和我們要求的 透明 相去甚遠(yuǎn)。更重要的是,布局會延伸到狀態(tài)欄底下。
2、 android:fitsSystemWindows 簡單理解 就是 View 為了適配系統(tǒng)狀態(tài)欄和導(dǎo)航欄(不被遮擋)自動 增加 padding ,當(dāng)然真正的實現(xiàn)原理比這復(fù)雜很多而且不同的 View 可以自定義實現(xiàn)方式。
所以,為了實現(xiàn)文章開頭提出來的“狀態(tài)欄透明”效果,我們需要處理:
設(shè)置 windowTranslucentStatus 為 true,讓狀態(tài)欄半透明。
在根節(jié)點設(shè)置 android:fitsSystemWindows 使其不被狀態(tài)欄遮擋。
Android 4.4 暫時沒有辦法去掉狀態(tài)欄的漸變。
Android 5.0+ 開始支持修改狀態(tài)欄顏色,設(shè)置透明色即可把半透明去掉。
看看效果:
我們看到即使?fàn)顟B(tài)欄透明了,但是其底色是一片白,因為跟節(jié)點 ConstraintLayout 沒有設(shè)置背景,大多情況下我們不會給整個跟節(jié)點設(shè)置顏色,可以考慮把 android:fitsSystemWindows 設(shè)置到子 View 上,本例中是 AppBarLayout (5.0+ 無效,只能顯式給 AppBarLayout 加 padding,可以利用其背景色),實際項目中可靈活調(diào)整。
最終效果:
至此,完成狀態(tài)欄透明效果,網(wǎng)上有很多庫,實際上都是基于此原理,在此基礎(chǔ)上再自定義 View 做為狀態(tài)欄背景。
android
kitkat
有一個新的特性可以設(shè)置手機(jī)狀態(tài)欄的背景,讓手機(jī)整個界面的風(fēng)格保持一致,看起來非常清爽。
android
4.4
提供了一套能透明的系統(tǒng)ui樣式給狀態(tài)欄和導(dǎo)航欄,這樣的話就不用向以前那樣每天面對著黑乎乎的上下兩條黑欄了,還可以調(diào)成跟activity
一樣的樣式,形成一個完整的主題。
首先要打開activity的透明主題功能,可以把a(bǔ)ctivity的主題設(shè)置繼承*.TranslucentDecor
主題,然后設(shè)置android:windowTranslucentNavigation?或者android:windowTranslucentStatus的主題屬性為true,又或者在activity的代碼里面開啟FLAG_TRANSLUCENT_NAVIGATION?或是?FLAG_TRANSLUCENT_STATUS的window窗口標(biāo)識。由于透明主題不能在4.4以前的版本里面使用,所以系統(tǒng)樣式跟以前沒有區(qū)別,也就是看不到任何變化,這是一個兼容模式,這個模式可以兼容到api
10。
APP的狀態(tài)欄在5.0下不是半透明的,只是把狀態(tài)欄的顏色設(shè)置為比下面的ActionBar顏色深一點而已。因為5.0可以直接在Theme里面設(shè)置colorPrimary來指定狀態(tài)欄顏色,而4.4是不行的。例如下面這樣的就是用5.0的API設(shè)置的,很好分辨出來,就是看起來沒有漸變色的。
4.4雖然沒有狀態(tài)欄顏色設(shè)置的API,但可以用其他手段達(dá)到狀態(tài)欄變色的效果。使用windowTranslucentStatus使?fàn)顟B(tài)欄變成全透明,同時會把布局?jǐn)U充到全屏。這時候可以往window里的根布局添加一個高度與狀態(tài)欄相等的View,然后給這個View設(shè)置背景色就可以了。
5.0下也完全是可以做成透明狀態(tài)欄的。例如很多APP的抽屜拉出來后像下面的效果估計都是用ToolBar+windowTranslucentStatus做的。