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了。两种方法都已经介绍完了各取所好吧!
参考:https://blog.****.net/guolin_blog/article/details/51763825