Android沉浸式的兩種方法
隱藏狀態列
一個Android應用程式的介面上其實是有很多系統元素的,觀察下圖:
而打造沉浸式模式的使用者體驗,就是要將這些系統元素全部隱藏,只留下主體內容部分。
怎麼做呢,郭霖的一個Function搞定
//onWindowFocusChanged的呼叫時機為當一個Activity載入完畢得到或者失去焦點的時候 就會觸發
//
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus && Build.VERSION.SDK_INT >= 19) {
View decorView = getWindow().getDecorView();
decorView.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
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
}
}
實現的效果如下圖所示
然而筆者認為這個模式再好也抵擋不住使用者的習慣,下面是筆者的沉浸式模式(僅供參考)。
效果如下圖所示:
可以看到狀態列和導航欄都是半透明模式,並沒有做到正在的隱藏,喜歡這種效果的往下看。
因為沉浸式模式是在Android19以後(4.4)這裡要特別注意所以為了版本相容這裡要用到限定符。
1.開啟Styles.xml,在Style.xml中找到
style名字為"AppTheme"的這個樣式列表,然後新增以下兩個屬性表示狀態列和導航欄為半透明狀態
<!--狀態列半透明-->
<item name="android:windowTranslucentStatus">true</item>
<!--虛擬按鍵全透明-->
<item name="android:windowTranslucentNavigation">true</item>
如果提示當前版本不支援著兩個屬性你需要新增限定符也就是新建Value-19資料夾然後在改目錄下新建一個syles.xml檔案然後進行新增如果不支援android:windowTranslucentNavigation那還需要新建Value-21然後同時操作,Value-19下面需要把
<item name="android:windowTranslucentNavigation">true</item>變成下面的程式碼
//表示狀態列半透明
<item name="android:windowTranslucentStatus">true</item>
這個時候樣式的部分程式碼就已經寫完了
執行以後你回發現我們導航欄把我們的選單遮住了,這個時候你需要判斷手機是不是有底部的導航欄加入下面的方法進行判斷
fun checkDeviceHasNavigationBar(context: Context): Boolean {
var hasNavigationBar = false
val rs = context.resources
val id = rs.getIdentifier("config_showNavigationBar", "bool", "android")
if (id > 0) {
hasNavigationBar = rs.getBoolean(id)
}
try {
val systemPropertiesClass = Class.forName("android.os.SystemProperties")
val m = systemPropertiesClass.getMethod("get", String::class.java)
val navBarOverride = m.invoke(systemPropertiesClass, "qemu.hw.mainkeys") as String
if ("1" == navBarOverride) {
hasNavigationBar = false
} else if ("0" == navBarOverride) {
hasNavigationBar = true
}
} catch (e:Exception) {
}
return hasNavigationBar
}
返回True時也就是有導航欄的時候你需要讓跟容器往上移動50DIP,程式碼如下
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//判斷是否有虛擬按鍵,如果要增加邊距
if(checkDeviceHasNavigationBar(this))
{
//lllayout為跟節點的ID名字dip2px是將dIP裝換成PX的函式
lllayout.setPadding(0,0,0, dip2px(this,50f));
}
}
現在就OK了。兩種方法都已經介紹完了各取