android頂部狀態欄
① 關於 Android 中的各種 Bar 和「透明狀態欄」的一些知識
本文主要講解關於Android中沉浸式狀態欄、全屏模式與狀態欄、ActionBar、ToolBar之間的區別與使用方法,旨在幫助讀者理解如何適配Android狀態欄。
請注意,狀態欄與這些所謂的「Bar」在概念上完全不同。狀態欄,即status bar,是Android設備頂部顯示時間、通知等信息的區域。在Android設計中,早期注重功能性,TitleBar(標題欄)僅僅用於顯示頁面標題。隨著Android 3.0的發布,引入了注重美感的Holo樣式,此時TitleBar被ActionBar取代,功能擴展至更多方面。
在Android 3.0之前,TitleBar僅用於顯示頁面標題。而在Android 3.0之後的API 11版本,為了提升美觀性,引入了具有更多功能的ActionBar。簡而言之,ActionBar在本質上與TitleBar類似,它們均不是傳統的控制項形式,而是嵌套在DecorView中,可通過window.setFeatureInt方法進行功能和樣式的修改。
隨著Android 5.0的推出,ToolBar被引入,成為一個獨立控制項,為開發者提供了更多的靈活性。在Android 4.1及以上的版本中,ActionBar是標准配置,但其使用僅限於4.1以上。在Android 4.4之前,狀態欄始終為黑色,而從4.4開始,引入了windowTranslucentStatus特性,使狀態欄顏色可調,這種現象被國內開發者稱為「沉浸式狀態欄」,實際上這一說法並不準確。
所謂的「沉浸式狀態欄」實際上是狀態欄透明模式,即內容UI全屏,狀態欄透明。在Android 4.4中,通過windowTranslucentStatus可以將狀態欄顏色調整為其他顏色,以適應不同的應用需求。然而,在谷歌官方文檔中,並未提及「沉浸式狀態欄」這一概念,僅提及了全屏模式和狀態欄顏色調整。
在實現透明狀態欄模式時,可以採用以下步驟:首先設置內容布局全屏,使內容覆蓋頂部狀態欄;接著將狀態欄設為透明;最後,應用屬性以確保布局全屏顯示。需要注意的是,狀態欄顏色的修改在Android 5.0後支持,而在Android 4.4之前則不允許。
為了適應全屏模式,開發者應考慮使用頁面布局,並通過DecorView來獲取根布局,進而控制狀態欄顯示與布局的全屏擴展。在Android 6.0中,還支持修改狀態欄文字顏色。
通過本文內容,您將對Android中狀態欄、ActionBar、ToolBar的使用以及如何適配狀態欄有更深入的理解。如需進一步學習,可參考相關文章或訪問個人公眾號獲取更多資源。
② Android沉浸式狀態欄 + scrollView頂部伸縮 + actionBar漸變
實現沉浸式狀態欄、ScrollView頂部伸縮和ActionBar漸變效果,主要分為三個步驟。
首先,通過重寫ScrollView的onTouchEvent方法,利用滑動的垂直距離調整圖片大小,實現頂部拉縮效果。注意手指釋放後恢復圖片原始高度。
接著,利用ActionBar的透明度在onScrollChanged方法中進行調整,實現隨著ScrollView滾動而漸變的效果。
第三步,採用沉浸式狀態欄的實現方式。對於4.4至5.0系統和5.0以上系統,處理方式存在差異。可以編寫工具類,只需在相應的Activity或基類執行特定代碼即可完成狀態欄透明化。
此外,通過修改主題在values、values-v19、values-v21目錄下創建主題文件,為Activity或Application設置特定主題,實現風格統一。
完成狀態欄透明化後,下一步是給狀態欄添加所需色彩。在values、values-v19目錄添加特定尺寸定義,確保色彩應用在狀態欄上。
在某些系統上,25dp的尺寸可能因顯示差異而存在誤差,但不影響整體效果。
最後,使用Toolbar(或自定義標題)於頁面頂部,並給其添加與狀態欄高度相匹配的頂部padding,實現與透明狀態欄的完美融合。這樣的設計不僅美觀,還能提升用戶體驗。
③ Android關於StatusBar(狀態欄)總結
從事Android開發的開發者往往需要對狀態欄的控制進行適配,尤其是對於Android的不同系統版本以及國產手機的特殊適配,這些工作並不簡單,與iOS系統的流暢體驗相比,Android在狀態欄控制方面還有一定的差距。
隨著Google對Android系統的持續優化,對狀態欄的操作體驗得到了顯著提升。在Android4.4以下版本,開發者可以實現狀態欄和導航欄的顯示與隱藏,但在Android4.4版本之後,才真正進入了沉浸式狀態欄的階段。這一階段大致可以分為三個關鍵階段:
階段一:從Android4.4(API 19)到Android 5.0(API 21),這一階段的狀態欄沉浸式效果還不夠完美,實現方法是通過設置FLAGTRANSLUCENTSTATUS使狀態欄透明化,並全屏顯示。實現沉浸式體驗需要在全屏模式下,在狀態欄區域添加一個與狀態欄大小一致的自定義View,然後將該View的背景色設為所需顏色。
階段二:自Android5.0(API 21)版本開始,系統正式支持沉浸式功能。通過引入android:statusBarColor屬性或對應的方法setStatusBarColor,開發者可以輕松實現狀態欄顏色的自定義,這標志著沉浸式狀態欄功能的成熟。
階段三:自Android 6.0(API 23)版本起,系統提供了改變狀態欄繪制模式的特性,允許顯示白色或淺黑色的內容和圖標(除了部分定製機型如魅族,該功能在6.0以下版本即可實現)。這使得狀態欄的沉浸式體驗更加完美。
上述階段的劃分體現了Android系統在狀態欄控制上的不斷優化與進步。然而,由於API版本的混亂和各大廠商的定製化,這為Android開發者帶來了額外的挑戰。通過理解不同階段的狀態欄控制策略,開發者能夠更好地適應並優化應用程序的用戶體驗。
④ Android 沉浸式/透明式狀態欄、導航欄
Android 從4.4開始引進透明狀態欄和導航欄的概念,並且在5.0進行了改進,將透明變成了半透明的效果。雖然此特性最早出現在ios,但不否認效果還是很贊的。
至於4.4以下的手機,就不要考慮此特性了,好在4.4以下的手機份額已經非常小了。
我們先來看一下透明狀態欄的實現,兩種常見效果圖如下:
虛擬導航欄並不是所有的手機都有,華為的手機多比較常見,就是上圖屏幕底部按鈕那塊區域。設置導航欄和狀態欄類似:
這是官方的解釋,大致意思就是我們在布局的最外層設置 android:fitsSystemWindows="true",會在屏幕最上方預留出狀態欄高度的padding。
由於fitsSystemWindows屬性本質上是給當前控制項設置了一個padding,所以我們設置到根布局的話,會導致狀態欄是透明的,並且和窗口背景一樣。
但是多數情況,我們並不在根布局設置這個屬性,我們想要的無外乎是讓內容沉浸在狀態欄之中。所以我們經常設置在最上端的圖片背景、Banner之類的,如果是Toolbar的,我們可以使用一層LinearLayout包裹,並把這個屬性設置給LinearLayout,這樣就可以避免Toolbar的內容下沉了。如:
上述方法可以解決普通頁面的透明式狀態欄需求,如有復雜需求可以參考下面這些:
Android 系統狀態欄沉浸式/透明化完整解決方案
Android 沉浸式狀態欄的實現
Android沉浸式狀態欄(透明狀態欄)最佳實現
還有開源庫推薦: ImmersionBar
⑤ android 怎樣把最頂上的狀態欄也改變背景
沉浸式狀態欄,就是將當前Application的background延伸至狀態欄。
(直接貼上在AS中寫的代碼,僅作參考)
/********沉浸式狀態欄***********/
//透明狀態欄
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
//透明導航欄
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
//將狀態欄顏色變深
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
//miui系統
setStatusBarDarkMode(true,this);
/*************以上在onCreate()***************//*************以下在onCreate()外部**********/
//通過反射,使miui系統狀態欄顏色變黑,避免透明
public void setStatusBarDarkMode(boolean darkmode, Activity activity) {
Class<? extends Window> clazz = activity.getWindow().getClass();
try {
Class<?> layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams");
Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE");
int darkModeFlag = field.getInt(layoutParams);
Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class);
extraFlagField.invoke(activity.getWindow(), darkmode ? darkModeFlag : 0, darkModeFlag);
} catch (Exception e) {
e.printStackTrace();
}
}
/************僅供參考***********/
(效果圖)
⑥ android 怎樣在ui拿掉頂部狀態條後怎樣布局到頂部
設置->系統->電源弊嘩菜單選項->勾選「擴展桌面」(見圖1)->然後按住手機「電源鍵」->點下「擴展桌面」(見圖2),這個功能可以隱藏或顯示行納頂檔卜沒部狀態欄。