• 35648

    文章

  • 23

    评论

  • 20

    友链

  • 最近新加了很多技术文章,大家多来逛逛吧~~~~
  • 喜欢这个网站的朋友可以加一下QQ群,我们一起交流技术。

Android沉浸式的两种方法 转

欢迎来到阿八个人博客网站。本 阿八个人博客 网站提供最新的站长新闻,各种互联网资讯。 喜欢本站的朋友可以收藏本站,或者加QQ:我们大家一起来交流技术! URL链接:https://www.abboke.com/jsh/2019/0625/3914.html

>>>

隐藏状态栏
一个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了。两种方法都已经介绍完了各取所好吧!
 

相关文章

暂住......别动,不想说点什么吗?
  • 全部评论(0
    还没有评论,快来抢沙发吧!