隱藏狀態欄
一個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了。兩種方法都已經介紹完了各取所好吧!