沉浸式状态栏,其实真的没什么-阿里云开发者社区

开发者社区> wangqi94> 正文

沉浸式状态栏,其实真的没什么

简介: 很多人在做侧滑布局的时候,会遇到主界面与侧滑菜单的状态栏共用了一个,看起来特别的丑,比如: 这图片是在鸿洋那里搞来的。。。。。 侧滑的时候布局的状态栏是什么鬼,能不能像qq那样,我不要那么丑的还顶在上面 我要这个样子的 这个是在4.4.2上面的效果,5.0以上状态栏会有一层黑透明的效果,但是似乎没上面的那种古怪影响。 比如这样: 好了,介绍结束了,
+关注继续查看

很多人在做侧滑布局的时候,会遇到主界面与侧滑菜单的状态栏共用了一个,看起来特别的丑,比如:

这图片是在鸿洋那里搞来的。。。。。

这里写图片描述

侧滑的时候布局的状态栏是什么鬼,能不能像qq那样,我不要那么丑的还顶在上面

我要这个样子的
这里写图片描述

这个是在4.4.2上面的效果,5.0以上状态栏会有一层黑透明的效果,但是似乎没上面的那种古怪影响。

比如这样:
这里写图片描述

好了,介绍结束了,我来说说如何实现qq这种的状态栏的效果。


思路:

我们在沉浸式状态栏的时候会遇到 android:fitsSystemWindows=”true”这个东东,这个东东放在API19的xml的跟布局的时候就会失去沉浸的效果,状态栏上面会是黑的,在5.0以上的话,状态栏只是更改了颜色,并不是跟随布局,也就是跟布局没关系,就变成图1的那种样子了,所以,我们在做API19以上的时候,尽量不要添加这个东东。

实现步骤:

     ①、取消所有跟布局的android:fitsSystemWindows="true"
     ②、判断当前版本,如果大于等于API19的话,就隐藏状态栏
     ③、但是状态栏必须得要啊,你看别人上面都有状态栏的
     ④、不然,你布局不都顶在上面去了吗?那都是别人忽悠你的
     ⑤、我们来模仿一个状态栏啊,不过得先隐藏我们的状态栏
     ⑥、然后给我们的顶部布局增加一个paddingTop
     ⑦、这个Top值我们去拿到状态栏的高度然后设置,不就安安稳稳的出来了吗
     ⑧、接下来看我的工具代码,只需将你的Title布局传进去就行了,一般放的都是Toolbar
     ⑨、我尝试了一下在布局中引入<include>的layout布局,布局是自定义的标题栏,然后在Activity中inflater拿到布局,将这个返回View传进状态栏的时候设置paddingTop,似乎不行,布局设置的是Relative的centerInParent为true,设置paddingTop值的时候,布局都是居中的,padding似乎没效果,大家可以试试,不过对于那些Widght控件,比如toolbar,TabLayout啥的,都没影响,下面贴工具代码,上面有注释,自己理解理解,不难
隐藏状态栏

有两种方式:
①、在代码中设置
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);这个得持有Activity的引用,不过要是每次都这么去设置的话,我还要在主界面去判断当前的版本,然后再去设置,代码量重复的太多了,不喜欢。
②、在当前主题的style里面设置 name=”android:windowTranslucentStatus”为true的话就有意思了,你要是直接在values的style.xml中的主题里面设置当前的状态栏为无,gradle会提示你,当前的最小版本不能低于19,哈哈,这样是低于19的话,下面的用户怎么用?不要急,我们创建一个名字为value-v19的文件夹,然后复制一份style.xml文件进去,然后我们在主题样式里面设置这段代码就行了,这样设置的话,当API小于19的时候回去默认的value文件夹里面的style.xml找,当大于等于API19的话就会去value-v19的文件夹里面找style.xml

如图:

这里写图片描述

value文件夹下面的style.xml

这里写图片描述

value-v19文件夹下面的style.xml

这里写图片描述

StatusUtils.java
import android.content.Context;
import android.os.Build;
import android.view.View;

/**
 * Created by wangqi on 2016/10/16.
 */
public class StatusUtils {


    public static void initStatus(View view, Context context) {
        //判断当前版本是否大于19,,Build.VERSION_CODES.KITKAT的API版本是19
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            //给传递进来的View设置高度
            view.getLayoutParams().height = getAppBarHeight(context);
            //给view设置paddingTop
            view.setPadding(view.getPaddingLeft(),
                    getStatusBarHeight(context),
                    view.getPaddingRight(),
                    view.getPaddingBottom());
        }
    }

    //设置View的高度为(标题栏的高度+状态栏)的高度,这里这个56是我用来模仿标题栏的高度,想要设置高度的可以自己设置一下
    private static int getAppBarHeight(Context context) {
        return dip2px(context, 56) + getStatusBarHeight(context);
    }

    //拿到状态栏的高度
    private static int getStatusBarHeight(Context context) {
        int result = 0;
        int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");

        if (resourceId > 0) {
            result = context.getResources().getDimensionPixelSize(resourceId);
        }

        return result;
    }


    public static int dip2px(Context context, float dipValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dipValue * scale + 0.5f);
    }
}

上面的工具类可以直接复制下来直接用,然后将需要设置的View传递给他,Activity和Fragment都可以用

下面是5.0效果的

这里写图片描述

这个布局是Fragment,我给TabLayout设置了一下,效果就是这样的,在5.0以上,隐藏状态栏的时候就会有一层透明的黑罩。


附上鸿洋6群里最骚的表情包

这里写图片描述

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Android中Activity和task,活动亲和力,启动模式,活动状态以及生命周期,激活钝化
Activity和task: android通过保持所有activity在同一个task中来维护用户的经历-典型是在launcher选择的 应用,栈顶活动是交互活动,back后,pop栈,即使涉及多个实例活动,不会重新管理,只有pop和push  task:  task是活动的栈,task的值是作为整体设置给root activity的.  activity:  一个task中
944 0
OSPF邻居状态的描述
实效状态down--尝试状态attempt--初始状态init --双向通信状态 2-way --信息初始状态exstart--信息交换状态exchange-- 信息加载状态loading--...
452 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
4397 0
【js:片断】jQuery 设置 select 下拉框的选中状态
注意事项:   1、对象相等行判断,使用 === 而不是 == ,js 引擎执行两个相等符号时,会自动进行类型转换。比较 "1"==1  与 "1"===1 即可知道结果   2、以上代码需要引用 jQuery 库。
475 0
Android 4.4及以后将内容布局延伸到状态栏
【该文章同步发布到CSDN:http://blog.csdn.net/ling9400/article/details/59478358   转载请注明出处:http://www.
734 0
Flink状态管理和容错机制介绍
本文来自2018年8月11日在北京举行的 Flink Meetup会议,分享来自于施晓罡,目前在阿里大数据团队部从事Blink方面的研发,现在主要负责Blink状态管理和容错相关技术的研发
1067 0
针对多状态订单详情的前端mock方案
调试方便、业务语义、代码解耦、mock数据精简
73 0
+关注
wangqi94
android开发
23
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载