沉浸式状态栏——状态栏的实现封装类

news/2024/7/4 8:45:23

沉浸式状态栏有两种方式:一:当状态栏下面是一张图片的时候,设置上面状态栏为透明,这样状态栏就会被图片覆盖(这里为方便我设置了一个button颜色为#FF4081)

首先看下没有设置沉浸式状态栏时的状态栏:


设置状态栏的颜色代码如下:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    //5.0以上
    this.getWindow().setStatusBarColor(Color.RED);
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    //4.4
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);//设置状态栏为透明
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);//设置导航键为透明
}

结果如下图:


第二种方式:

指定状态栏为某个颜色:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    this.getWindow().setStatusBarColor(Color.BLUE);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    View statusView=createStatusBarView(Color.BLUE);
    ViewGroup viewGroup= (ViewGroup) getWindow().getDecorView();
    viewGroup.addView(statusView);
}
private View createStatusBarView(int color) {
    View statusBarView = new View(this);
    LinearLayout.LayoutParams params=new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
            getStatusBarHeight());
    statusBarView.setLayoutParams(params);
    statusBarView.setBackgroundColor(color);
    return statusBarView;
}

private int getStatusBarHeight() {
    int identifier = getResources().getIdentifier("status_bar_height", "dimen", "android");
    return getResources().getDimensionPixelOffset(identifier);
}
效果如下:


这里我将方法进行了封装,完整代码:

/**
 *
 * 状态栏的实现封装类
 *      - 完成以下两种功能:
 *          1,设置一个纯色,适配4.4并以上,需要处理5.0并以上的阴影效果
 *          2,当顶部是一个图片,上移到状态栏
 */
public class StatusBarUtils  {
    /**
     * 将acitivity中的activity中的状态栏设置为一个纯色
     * @param activity 需要设置的activity
     * @param color 设置的颜色(一般是titlebar的颜色)
     */
    public static void setColor(Activity activity, int color){
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            //5.0及以上,不设置透明状态栏,设置会有半透明阴影
            activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            //设置statusBar的背景色
            activity.getWindow().setStatusBarColor(color);
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            // 生成一个状态栏大小的矩形
            View statusView = createStatusBarView(activity, color);
            // 添加 statusView 到布局中
            ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();
            decorView.addView(statusView);
            //让我们的activity_main。xml中的布局适应屏幕
            setRootView(activity);
        }
    }


    /**
     * 当顶部是图片时,是图片显示到状态栏上
     * @param activity
     */
    public static void setImage(Activity activity){
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            //5.0及以上,不设置透明状态栏,设置会有半透明阴影
            activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            // 使activity_main.xml中的图片可以沉浸到状态栏上
            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);//嵌入式
            //设置状态栏颜色透明。
            activity.getWindow().setStatusBarColor(Color.TRANSPARENT);
        } else {
            //。。。。
            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);//透明状态栏
        }
    }


    /**
     * 设置根布局参数,让跟布局参数适应透明状态栏
     *
     */
    private static void setRootView(Activity activity) {
        //获取到activity_main.xml文件
        ViewGroup rootView = (ViewGroup) ((ViewGroup) activity.findViewById(android.R.id.content)).getChildAt(0);

        //如果不是设置参数,会使内容显示到状态栏上
        rootView.setFitsSystemWindows(true);
    }

    /**
     * 获取状态栏的高度
     * @param acitivity
     * @return
     */
    private static int getStatusBarHeight(Activity acitivity){

        int resourceId = acitivity.getResources().getIdentifier("status_bar_height", "dimen", "android");

        return acitivity.getResources().getDimensionPixelOffset(resourceId);
    }




    /**
     * 生成一个和状态栏大小相同的矩形条
     * @param activity 需要设置的activity
     * @param color    状态栏颜色值
     * @return 状态栏矩形条
     */
    private static View createStatusBarView(Activity activity, int color) {
        // 绘制一个和状态栏一样高的矩形
        View statusBarView = new View(activity);
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                getStatusBarHeight(activity));
        statusBarView.setLayoutParams(params);
        statusBarView.setBackgroundColor(color);
        return statusBarView;
    }


    public static boolean setMiuiStatusBarDarkMode(Activity activity, boolean darkmode) {
        Class<? extends Window> clazz = activity.getWindow().getClass();
        try {
            int darkModeFlag = 0;
            Class<?> layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams");
            Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE");
            darkModeFlag = field.getInt(layoutParams);
            Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class);
            extraFlagField.invoke(activity.getWindow(), darkmode ? darkModeFlag : 0, darkModeFlag);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;

}

}



http://www.niftyadmin.cn/n/3649245.html

相关文章

得到了国内第一本《And I thought I Knew QTP》

承蒙作者厚爱&#xff0c;得到了一本签名版的书&#xff0c;撒几张照片&#xff1a; 加我微博吧&#xff0c;分享更多测试讯息&#xff1a;http://www.weibo.com/quicktest 作者在米国发行此书的照片&#xff1a;

Android之探秘蓝牙隐藏API

上次讲解Android的蓝牙基本用法&#xff0c;这次讲得深入些&#xff0c;探讨下蓝牙方面的隐藏API。用过Android系统设置(Setting)的人都知道蓝牙搜索之后可以建立配对和解除配对&#xff0c;但是这两项功能的函数没有在SDK中给出&#xff0c;那么如何去使用这两项功能呢&#x…

golang flag 包_如何在Go中使用Flag包

golang flag 包介绍 (Introduction) Command-line utilities are rarely useful out of the box without additional configuration. Good defaults are important, but useful utilities need to accept configuration from users. On most platforms, command-line utilities…

Ubuntu 装 Samba 安装详解 (已在Ubuntu11Server测试通过)

转自&#xff1a;http://wiki.ubuntu.org.cn/Samba Samba Samba是Ubuntu和Windows进行网络共享的工具&#xff0c;比如分享打印机&#xff0c;互相之间传输资料文件。 目录 [隐藏]1 安装Samba2 Kubuntu3 配置4 Ubuntu访问windows xp/2003/2000系统5 排错 5.1 乱码 6 smb用户…

golang接口的使用场景_如何在Go中使用接口

golang接口的使用场景介绍 (Introduction) Writing flexible, reusable, and modular code is vital for developing versatile programs. Working in this way ensures code is easier to maintain by avoiding the need to make the same change in multiple places. How you…

android以欺骗的方法使用隐藏API调用举例(国际化,多语言)

Android对国际化与多语言切换已经做得不错了&#xff0c;一个应用只要命名相应语系的values-[language]文件夹&#xff0c;通过“设置”→“语言&键盘”→“选择语言”即可实现应用多种语言的切换。 但如何在应用里自己实现&#xff1f;搜索过发现网上有如下的做法&…

[收藏]mvm的“公司如船”大论

mvm的&#xff1a;http://home.wangjianshuo.com/mvm/000525.htm公司如船有个企业家被问到他为什么喜欢航海。他的回答是&#xff0c;航海和经营企业有强烈的共同点&#xff1a;到了海上以后&#xff0c;就算船上有人你不喜欢&#xff0c;你也只能去适应他&#xff0c;而不可能…