Android中windowTranslucentStatus与windowTranslucentNavigation的一些设置(转)

在iOS中,你可能发现页面会整体拉升到状态栏,整个页面效果就会显得更加的高端大气上档次,在Android4.4以后其实也有这种效果的实现,下面我就说一下在进行这种效果实现时碰到的一些坑,希望对大家有一些帮助吧。

首先来说一下关于这种效果的一些额外设置:

windowActionBar:这个应该大家都知道,在自定义的Theme中设置成false,就没有系统默认的那个菜单选项了。

windowNotTitle: 设置这个属性为true则不显示标题了

 

colorPrimary:这个属性是你的actiinbar的属性颜色

colorPrimaryDark:这个属性则是你的标题栏的颜色,你可以设置和你自定义的标题栏一个颜色,就可以达到以下这种效果

接下来我们看看windowTranslucentStatus属性与windowTranslucentNavigation属性的设置,首先,我们要知道,Android版本到4.4才会有个属性,所以说不管你是在代码中进行实现或者是在资源文件style中进行实现,
你都需要进行版本的控制。首先在资源文件中进行实现,你要创建一个新的文件夹,value-v19,在这个文件夹中创建
style文件进行编辑,在其中设置主题,定义属性
<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowTranslucentNavigation">true</item>
然后给你的activity设置这个style,第一个属性很明显就是可以拉升到顶部状态栏,并且定义顶部状态栏透明,这样你的页面就是一整张了,没有上面电池背景条之类的了,整个页面看上去会好很多,】
第二个属性,是设置你的虚拟键透明,这个虚拟键就是返回和菜单键等,现在有的手机会放到屏幕上,而有的是没有的。到这个时候,如果你的手机有虚拟键的话,你会发现问题来了,你会发现你的页面拉伸到了虚拟键的下面,
也就是页面填充了整个屏幕,不留一点空间了,如果你是列表的话,那么无所谓,并不影响操作和页面效果,如果你的是最下面有按钮的页面的话,你会发现这玩意就是一个坑啊,
因为你的按钮填充到了下面,你根本按不到,而且如果你设置了透明属性的话,你会发现虚拟键和你最下面的按钮都重合在一起,具体效果
图如下图所示:


然后你开始在style里改变两个属性的所有制测试,发现都没有什么卵用,我不知道还有没有其他的解决办法,反正当我做到这里的时候,认定了它就是一个巨坑。
在你的布局文件中设置fitsSystemWindows这个属性其实也不会拉升到最下面,但是这样的话。。。。连上面都不拉伸了,有什么意义,而且好像设置了以后,你设置的
colorPrimaryDark也会无效,也可能是我的水平不行,反正被这个地方坑了好久。
但是不要急,办法总是人想出来,在xml文件中进行设置既然不方便,不灵活,那么我们就试试去Java代码中设置这个属性。
根绝前面说的那个坑,我们先判断一下你的手机是否含有NavigationBar这个东西,就是虚拟键,判断代码如下

public static boolean isHaveNavigationBar(Context context) {

    boolean isHave = false;
    Resources rs = context.getResources();
    int id = rs.getIdentifier("config_showNavigationBar", "bool", "android");
    if (id > 0) {
        hasNavigationBar = rs.getBoolean(id);
    }
    try {
        Class systemPropertiesClass = Class.forName("android.os.SystemProperties");
        Method m = systemPropertiesClass.getMethod("get", String.class);
        String navBarOverride = (String) m.invoke(systemPropertiesClass, "qemu.hw.mainkeys");
        if ("1".equals(navBarOverride)) {
            isHave = false;
        } else if ("0".equals(navBarOverride)) {
            isHave = true;
        }
    } catch (Exception e) {
        Log.w("TAG", e);
    }


    return isHave;
}
返回为true的话就不给他设置,反之设置,具体代码如下:

public static void transportStatus(Activity context){
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        context.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        if (!isHaveNavigationBar(context))
            context.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
        }
}

这样就可以达到想要的效果了.

https://blog.csdn.net/zjt593688/article/details/52606980

 

posted on 2018-06-29 20:56  洛易  阅读(998)  评论(0编辑  收藏  举报