Android 沉浸式模式與常見狀態列和導航欄效果
阿新 • • 發佈:2019-01-05
官方稱沉浸式狀態列為沉浸式模式。
什麼是沉浸式?
沉浸式就是讓人專注當前的(由設計者營造)情境下感到愉悅和滿足,而忘記真實的情境。什麼是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>
效果圖如下: