Android沉浸式的兩種方法

隱藏狀態欄
一個Android應用程序的界面上實際上是有不少系統元素的,觀察下圖:java

而打造沉浸式模式的用戶體驗,就是要將這些系統元素所有隱藏,只留下主體內容部分。android

怎麼作呢,郭霖的一個Function搞定ide

//onWindowFocusChanged的調用時機爲當一個Activity加載完畢獲得或者失去焦點的時候 就會觸發函數

//ui

 @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);
        }
    }this

實現的效果以下圖所示.net

然而筆者認爲這個模式再好也抵擋不住用戶的習慣,下面是筆者的沉浸式模式(僅供參考)。xml

效果以下圖所示:blog

能夠看到狀態欄和導航欄都是半透明模式,並無作到正在的隱藏,喜歡這種效果的往下看。ip

由於沉浸式模式是在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了。兩種方法都已經介紹完了各取所好吧!  

相關文章
相關標籤/搜索