• 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

  • 相关阅读:
    关于MFC库和CRT库冲突的分析
    C++ Traits技术
    C/C++的参数传递机制
    C++与正态分布
    前端JavaScript
    python 前端 css
    python 前端 html
    MySQL 数据库
    网络编程 生产者消费者模型 GiL

  • 原文地址:https://www.cnblogs.com/royi123/p/9245416.html
Copyright © 2020-2023  润新知