zoukankan      html  css  js  c++  java
  • Android沉浸式状态栏的简单实现

    随着卡片式设计在Android系统的上越来越流行,比如现在早已经烂大街的沉浸式状态栏,几乎所有的主流的APP都支持沉浸式状态栏,如QQ、UC浏览器等等。所以觉得有必要学习一下,找了点资料,总结了一下,未测试低版本的效果,如果有测试的话欢迎反馈一下。只是简单的记录这一步骤,更深层次的代码请访问 http://www.open-open.com/lib/view/open1455584716230.html 这里面的大神写的很详细。

    实现效果

    Screenshot_20170104-162632.png

    • 未进行状态栏沉浸效果,状态栏为黑色的

    Screenshot_20170104-161117.png

    +注意观察顶部,不再是黑黑的状态栏了,比原来好看多了

    实现原理

    1. 通过配置标志位来配置状态栏透明
    2. 创建一个和状态栏大小一致的矩形VIew
    3. 添加到布局中,并配置

    具体代码

    • 创建一个类ImmersiveStatusBar.java 内部包含下面两个静态的方法
    • 在Activity中在setContentLayout中,调用本类的setColor即可实现沉浸式状态栏,如
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
      ImmersiveStatusBar.setColor(this,0x387fb5);
      ......
    }
    
    • setColor()方法
    public static void setColor(Activity activity, int color) {
    //限制android系统的版本
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            // 设置状态栏透明 
            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            // 生成一个状态栏大小的矩形
            View statusView = createStatusView(activity, color);
            // 添加 statusView 到布局中
            ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();
            decorView.addView(statusView);
            // 设置根布局的参数
            ViewGroup rootView = (ViewGroup) ((ViewGroup) activity.findViewById(android.R.id.content)).getChildAt(0);
            rootView.setFitsSystemWindows(true);
            rootView.setClipToPadding(true);
        }
    }
    
    • 其中createStatusView()方法代码如下:
    /**
     * 生成一个和状态栏大小相同的矩形条
     * @param activity 需要设置的activity
     * @param color 状态栏颜色值
     * @return 状态栏矩形条
     */
    private static View createStatusView(Activity activity, int color) {
        // 获得状态栏高度
        int resourceId = activity.getResources().getIdentifier("status_bar_height", "dimen", "android");
        int statusBarHeight = activity.getResources().getDimensionPixelSize(resourceId);
        // 绘制一个和状态栏一样高的矩形
        View statusView = new View(activity);
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,            statusBarHeight);
        statusView.setLayoutParams(params);
        statusView.setBackgroundColor(color);
        return statusView;
    }
    
  • 相关阅读:
    关于MySQL INT类型长度的疑惑
    uwp 的锁屏功能
    QT5 动态链接库的创建和使用
    Qt 自定义事件的实现
    学习k8s本地虚拟机安装minikube
    建议收藏!细说HashMap实现,Hash冲突模拟思路讲解。
    95. Unique Binary Search Trees II
    96. Unique Binary Search Trees(dp)
    574 React系列(一)
    如何在Win7电脑上增加新磁盘分区?
  • 原文地址:https://www.cnblogs.com/zhoutao825638/p/10382018.html
Copyright © 2011-2022 走看看