Android 實現變色狀態列

來源:互聯網
上載者:User

標籤:android   沈浸式狀態列   透明狀態列   變色狀態列   著色   

首先我們得瞭解什麼是透明狀態列以及什麼是沈浸式狀態列,以及其區別,國內習慣稱透明狀態列為沈浸式狀態列,但是兩者是有本質區別的。

先來看看什麼是沈浸式模式。

Android 4.4中,沈浸式體驗得到了再次強化,提供了一種“全螢幕模式”(Full-screen Immersive Mode)。全螢幕模式又分兩種,一種叫後撤式 (Lean Back),另一種叫做沈浸式(Immersive)。後撤式已經在之前的系統中被廣泛使用了——當你在優酷APP中觀看視頻時,大部分時間手指是不會去碰螢幕的。這種情況下,虛擬鍵和狀態列都會自動隱藏,但當你觸控螢幕幕的時候,它們又會出現。而新加入的沈浸式則不太一樣,在沈浸式全屏狀態下,對螢幕的操作並不會喚出系統欄。想要喚出系統欄,你必須從螢幕的上/下邊緣向螢幕內劃入。沈浸式的全屏狀態更適合遊戲和閱讀這樣的應用。

但沉浸模式和普通全屏不同點在於,沉浸模式通過下滑螢幕上方或者下方可以調出虛擬鍵和狀態列。
比如多看閱讀,是在閱讀時沉浸模式下全屏。

然後從螢幕上方下滑或者下方上劃,虛擬鍵和狀態列出現了。但卻是直接覆蓋在程式文字上的。

而沈浸式狀態列的來源就是很多手機用的是實體按鍵,沒有虛擬鍵,於是開了沉浸模式就只有狀態列消失了。於是沉浸模式成了沈浸式狀態列。

Android 4.4 一個很重要的改變就是透明系統欄.。新的系統欄是漸層透明的, 可以最大限度的允許螢幕顯示更多內容, 也可以讓系統欄和 Action Bar 融為一體, 僅僅留下最低限度的背景保護以免通知通知欄內容和 Action Bar 文字/表徵圖難以識別。Google把這種效果稱之為:Translucent Bar。

Translucent Bar 是 Android 對 Edge to Edge 嘗試中的一個, 也是最容易被使用者注意到的. 它的初始目的就是要最大化可視面積和淡化系統介面的存在感。

其實簡單一點就是布局延伸到狀態列,狀態列背景與應用背景相同,這就是*透明狀態列*。最直接的例子就是UC瀏覽器的天氣介面,其布局延伸到狀態列,但是狀態列與應用同背景,

但是這樣有時候會把狀態列顏色變得和應用的背景顏色一樣,但是實際上只是修改了狀態列的顏色,我們稱它為變色狀態列

而現在大家所在用的QQ等軟體,狀態列與軟體顏色融為一體,其實就是變色狀態列。而小米MIUI的內建應用,也都是變色狀態列或者是透明狀態列,而並非是沈浸式狀態列。

這裡我們姑且稱變色狀態列為透明狀態列的一種,本篇文章就是帶大家實現這種透明狀態列。

由於這種效果只有在4.4及以上有效,所以本篇文章的效果只有在4.4及以上有效。

首先應用主題

<resources>    <style name="AppTheme" parent="@style/BaseTheme">    </style>    <style name="BaseTheme" parent="Theme.AppCompat.Light.NoActionBar">        <item name="colorPrimary">@color/colorPrimary</item>        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>    </style></resources>

然後我們在res下建立一個values-v19的目錄,代表最低API為19,建立一個style.xml,下面的代碼是透明狀態列的關鍵

<resources>    <style name="AppTheme" parent="@style/BaseTheme">        <item name="android:windowTranslucentNavigation">true</item>        <item name="android:windowTranslucentStatus">true</item>    </style></resources>

我們禁用了系統的ActionBar,使用ToolBar代替,布局代碼如下

<LinearLayout    xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical">    <android.support.v7.widget.Toolbar        android:id="@+id/toolbar"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:background="?attr/colorPrimary"        android:fitsSystemWindows="true"        ></android.support.v7.widget.Toolbar></LinearLayout>

細心的你會發現在Toolbar中加入了android:fitsSystemWindows=”true”屬性,這就是將布局延伸到狀態列,這時候你運行一下,會發現Toolbar上移到了狀態列的位置。上移的高度剛好是狀態列的高度。

但是我們並不想它移動到上面,只是想它狀態列和Toolbar顏色一樣,要怎麼做的,很簡單,在代碼中通過setSupportActionBar設定到ActionBar的位置即可。

Toolbar mToolbar = (Toolbar) findViewById(R.id.toolbar);setSupportActionBar(mToolbar);

之後的效果就是這樣的。

很明顯的看到,ToolBar就是之前的高度,但是狀態列也變色了。

但是我們又怎麼能滿足於此呢。在Android 5.0上,我們的狀態列的顏色是要比Toolbar的顏色要深的。就像這樣。

我們還要進一步修飾,需要對狀態列著色,這裡需要用到一個開源庫SystemBarTint

加入依賴

  compile ‘com.readystatesoftware.systembartint:systembartint:1.0.3‘

之後再設定布局後加入以下代碼

SystemBarTintManager tintManager=new SystemBarTintManager(this);tintManager.setStatusBarTintResource(R.color.colorPrimaryDark);tintManager.setStatusBarTintEnabled(true);

最終效果就是所示

當然這個庫裡還有很多函數,具體功能自己去琢磨吧,並且其內部源碼也並不複雜,建議還是看下其源碼實現。

本篇文章的源碼簡單,就不上源碼了。

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

Android 實現變色狀態列

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.