Android 應用中半透明狀態欄的原理是什麼?(有分歧故來提問)

根據 MIUI 官方說狀態欄半透明需要應用程序自己支持, 還解釋說為什麼 iOS 能夠全適應, 是因為不支持的 app 不讓上架? 那麼問題就來了, 半透明狀態欄到底是怎麼實現的? 有很多人認為是屏幕取色不知道對不對?


首先,這個功能不是MIUI的,而是從4.4 Kitkat開始Android系統的新特性,叫做Translucent Status Bar。

MIUI官方說狀態欄半透明需要應用程序自己支持,是指的如果想要使用這個新特性,需要在開發時把目標Android版本選為4.4或以上,並在AndroidManifest里定義或者在代碼中為窗口設置flag = FLAG_TRANSLUCENT_STATUS。

設置過這個屬性以後,可以指定標題欄顏色,如果不指定,標題欄會自動把自己變為和當前Activity的根布局background同色。


  1. 先糾正:在國內很多人將「變色狀態欄」叫成「沉浸狀態欄」,而沉浸模式不是使狀態欄變色而是靠隱藏狀態欄和虛擬按鍵達到全屏的效果。

Immersive

The Immersive approach is mainly intended for apps in which the user will be heavily interacting with the full screen as part of the primary experience. Examples are games, viewing images in a gallery, or reading paginated content, like a book or slides in a presentation.

In this type of experience, when users need to bring back the system bars, they swipe from any edge where a system bar is hidden. By requiring this more deliberate gesture, the user"s deep engagement with your app won"t be interrupted by accidental touches and swipes.

  1. 實現,隨便搜了一下:Android 4.4 上實現透明導航欄和狀態欄 Translucent system bar 作者: @MASAILA
  2. 屏幕取色是第三方(例如 Xposed 模塊)常用的方法。
  3. Material Design 開始,變色狀態欄可能不會採用和應用頂部相同的顏色,參考 Google 系應用。


在原生android4.4裡面有透明漸變狀態欄和虛擬按鈕的樣式,也就是沉浸模式(immersive mode)

Action Bar 和狀態欄融為一體,比如這樣:

原理就是開發者調用了4.4的沉浸模式有關的API了。

Android5.0支持上面的沉浸模式,但是取消了漸變效果,比如這樣:

下面這張圖雖然看上去很像5.0的狀態欄變色,實際上是半透明的狀態欄,只是狀態欄層的下面是純色的原因。

除了沉浸模式,Android5.0裡面可以給應用規定狀態欄的顏色,這種指定狀態欄色的功能是android5.0才有的。在原生4.4裡面沒有狀態欄變色的官方API,因此原生4,4中狀態欄變色都是通過有ROOT許可權的第三方軟體來實現的。

個人認為所謂的沉浸式狀態欄不等於狀態欄變色,即便是變色後跟Action Bar顏色一致。

android5.0的計算器APP採用的就是狀態欄變色:

(上述觀點都是從細節觀察出的,因為本人不是android開發者,此答案還需要懂行人進一步核實)


4.4下的狀態欄變色就是開啟透明狀態欄然後在狀態欄底下扔了一個和app顏色一樣的view

5.0的API貌似直接支持了。


首先強烈反對上面所說的不透明就不讓上架,依據是IOS的透明欄是可以根據屏幕的顯示內容來做到全局透明的。也就是說在IOS第三方App上你任意切換背景頂欄仍然是透明的而不是一層黑杠,所以蘋果不可能監測所有app在任意背景下頂欄的顏色變換。

原理的話簡單說下吧(個人也只是懂些皮毛,勿噴)

變色狀態欄這個特性需要建立在Android4.4(或以上)的基礎上開發同時在代碼中為窗口設置成flag=FLAG_TRANSLUCENT_STATUS.

設置過後就可以自由設置狀態欄顏色了,若不指定顏色,標題欄則默認與根布局background同色。

建議下載變色龍的app會比較容易理解,下圖第四個。

附上app界面

以上均個人見解,如有遺漏或錯誤,歡迎補充及批評


以往的應用只可以選擇有沒有狀態欄,4.4之後開始支持透明狀態欄,當你把窗口flag設置成 FLAG_TRANSLUCENT_STATUS後,你的應用所佔的屏幕擴大到全屏,但是最頂上會有背景透明的狀態欄,它的文字可能會蓋著你的應用的標題欄,你可以手動將你的app顯示的內容向下錯出一個狀態欄的高度,這樣就能完成適配了。


應該是狀態欄和下面顯示內容均勻選取一定比例的像素點顯示出來吧,當然像素點位置不重疊,這個比例應該是根據透明度來定吧。個人拙見,可能也有其它實現方式。


其實就是虛化了

// 沉浸式狀態欄

getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

// 透明導航欄

getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);

直接放在onCreate()方法中!


剛好最近的項目里用到了translucent bar,順便解答下你吧。大家說的沒錯,這是安卓4.4以上才支持的特性。把狀態欄也充分的利用起來,有個說法叫沉浸式體驗。可以通過增加一個library來實現。我最早是在path應用上看到這個效果的,覺得很特別,後來特意去了解了一下。就加了下。半透明主要還是比較適合於頂部是圖片的部分,雖然可以用來顯示內容,但大多數應用都只是設了個背景色。


推薦閱讀:

碼農需要的基本款電腦是怎樣的配置?
C語言標準中為什麼不規定int類型的具體長度?
MATLAB面向對象編程是什麼樣的體驗?
如何評價12月22日上線的計蒜客 "CS 212: 面向對象的程序設計 (C++)"?
為什麼程序員覺得自己學的那門語言就是最好的?

TAG:編程 | 米柚MIUI | Android |