android沈浸式狀態列、變色狀態列、透明狀態列、修改狀態列顏色及透明
首先我要區分清楚沈浸式狀態列與變色狀態列。
沈浸式狀態列指的是,狀態列隱藏,在手指做了相關操作後,狀態列顯示出來,例如視頻播放器,在播放視頻時是隱藏狀態列的,但是點擊螢幕的時候,狀態列會顯示出來,再例如文本閱讀器,在閱讀的時候是全屏的,然後從螢幕上方下滑或者下方上劃,虛擬鍵和狀態列出現了,但卻是直接覆蓋在程式文字上的,這是所謂的沈浸式狀態列。
那麼大家平時所說的狀態列與導覽列顏色相同,或者透明,指的是變色狀態列,或者透明狀態列。
對於這兩個概念的理解,大家可以參考http://www.androidchina.net/3520.html。
v19(4.4)以後開始支援android:windowTranslucentStatus屬性,透明狀態列,而v21(5.0)以後出現變色狀態列,可以自由設定狀態列顏色。
通過這兩個新特性,可以協助我們快速的實現4.4以後的狀態列與app的導覽列顏色相同。
實現變色導覽列主要是通過styles裡面的theme來實現的:
接下來定義主題BaseAppTheme,繼承於上面定義的AppTheme.Base主題,該主題定義了三個顏色,分別指定狀態列、toolbar和頁面中重點控制項的顏色(顏色自己去定義)。
對於AppCompat主題中,各個顏色屬性的含義,可以參考
然後定義一個AppTheme,繼承於BaseAppTheme,
5.0:建立“values-v21\styles.xml”
在裡面定義適用與5.0系統的AppTheme,在5.0系統中提出的變色狀態列,因此這裡我們只需定義一個AppTheme繼承於BaseAppTheme代碼如下:
啟動並執行結果是,在4.4系統上,完全正常顯示,而在5.0上,toolbar正常顯示了透明色,但是狀態列顯示的是灰色透明色
4.4系統:
5.0系統:
原因應該是,4.4系統支援的就是透明狀態列,所以只需要將狀態列顏色設為透明,即可到達效果。
而5.0支援的是變色狀態列,得到的效果與我們預期不同,特做如下處理:
在代碼中設定,判斷當sdk大於等於5.0時,執行以下代碼
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { Window window = getWindow(); window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE); window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); window.setStatusBarColor(Color.TRANSPARENT);}
運行後,在4.4以及5.0系統上都能實現透明效果了,如下:
源碼下載