1. 程式人生 > >Android 沉浸式模式與常見狀態列和導航欄效果

Android 沉浸式模式與常見狀態列和導航欄效果

官方稱沉浸式狀態列為沉浸式模式。

  • 什麼是沉浸式?
    沉浸式就是讓人專注當前的(由設計者營造)情境下感到愉悅和滿足,而忘記真實的情境。

  • 什麼是Android中的沉浸式?
    當啟用該模式,應用程式的介面將佔據整個螢幕,自動隱藏系統的狀態列和導航欄,讓應用程式內容可以在最大顯示範圍呈現,增加大屏體驗,而當需要檢視通知的時候只需要從頂部向下滑動就能撥出通知欄。

  • 一個應用程式介面有有如下元素:


  • 而打造沉浸式模式的使用者體驗就是要將這些系統元素全部隱藏,只留下主題內容部分。先看一下效果圖:


進入程式時,自動隱藏了狀態列和導航欄。當用戶從頂部向下滑動就能撥出半透明的狀態列和導航欄。

具體程式碼如下:

public class MainActivity
extends AppCompatActivity
{ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); View mDecorView = getWindow().getDecorView(); mDecorView.setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar
| View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY ); } }
  • 上面使用的SYSTEM_UI_FLAG_IMMERSIVE_STICKY官方稱為粘性沉浸式模式。View.SYSTEM_UI_FLAG_IMMERSIVE為非粘性沉浸式,非粘性沉浸式狀態列和導航欄顯示後不再自動隱藏。

注意:onWindowFocusChanged方法裡面的程式碼不能直接寫在onCreate方法中,如果這麼寫當應用處於後臺Stoped狀態,下次啟動應用便執行不到處理沉浸式的程式碼。Activity生命週期中,真正的visible時間點是onWindowFocusChanged()函式被執行時,所以我們將這段程式碼寫在這個方法中。

其他常見狀態列和導航欄效果

  • 隱藏ActionBar
ActionBar actionBar = getSupportActionBar();
actionBar.hide();

上面的程式碼需要在放在setContentView方法之前,否則會出現ActionBar顯示後再隱藏。如果整個應用沒有用到ActionBar我們可以直接在AndroidManifest.xml中將application的theme設定為NoActionBar,如果只是某個activity不用也可以將這個activity的theme設定為NoActionBar。

<activity android:name=".MainActivity"
     android:theme="@style/Theme.AppCompat.Light.NoActionBar">
     <intent-filter>
           <action android:name="android.intent.action.MAIN"/>
         <category android:name="android.intent.category.LAUNCHER"/>
    </intent-filter>
</activity>

效果圖如下: