安卓实现沉浸式安卓状态栏实现

StatusBarUtils工具类

java 复制代码
public class StatusBarUtils {
    public static void initStatusBar(Window window, View view, int color, boolean transparent) {
        // 如果系统版本大于等于 Android 5.0(Lollipop)
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            if (transparent) {
                // 设置状态栏为透明,并且布局充满全屏
                window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
                window.setStatusBarColor(Color.TRANSPARENT);
            } else {
                // 设置状态栏颜色为传入的颜色值
                window.setStatusBarColor(color);
            }

            // 如果系统版本大于等于 Android 6.0(Marshmallow)
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                // 设置状态栏文字颜色为传入的颜色值
                window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
            }
        }

        // 设置顶部内边距等于状态栏高度(使内容在状态栏的下方显示)
        int statusBarHeight = ViewUtils.getStatusBarHeight(view.getContext());
        view.setPadding(0, statusBarHeight, 0, 0);
    }

    /**
     * 隐藏状态栏
     */
    public static void hideStatusBar(Activity activity) {
        // 获取窗口
        Window window = activity.getWindow();

        // 对Android版本进行检查,选择不同的方法实现隐藏状态栏
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            // API Level 19 及以上(Android 4.4及以上)
            View decorView = window.getDecorView();
            int option = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                    | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
            decorView.setSystemUiVisibility(option);
        } else if (Build.VERSION.SDK_INT >= 16) {
            // API Level 16 到 18 (Android 4.1 到 Android 4.3)
            View decorView = window.getDecorView();
            int option = View.SYSTEM_UI_FLAG_FULLSCREEN;
            decorView.setSystemUiVisibility(option);
        } else {
            // API Level 16以下(Android 4.1以下)
            window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                    WindowManager.LayoutParams.FLAG_FULLSCREEN);
        }
    }

    /**
     * 显示状态栏
     *
     * @param activity 当前的Activity
     */
    public static void showStatusBar(Activity activity) {
        // 获取窗口
        Window window = activity.getWindow();

        // 对Android版本进行检查,选择不同的方法实现显示状态栏
        if (Build.VERSION.SDK_INT < 16) {
            // API Level 16以下(Android 4.1以下)
            window.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
        } else {
            // API Level 16 及以上(Android 4.1及以上)
            View decorView = window.getDecorView();
            int option = View.SYSTEM_UI_FLAG_VISIBLE;
            decorView.setSystemUiVisibility(option);
        }
    }
}

ViewUtils工具类

java 复制代码
public class ViewUtils {

    /**
     * 获取状态栏高度
     *
     * @param context 应用上下文
     * @return int 状态栏高度
     */
    public 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;
    }

    /**
     * 计算Item之间的间距
     *
     * @param columnCount 列数
     * @param ratio       宽高比
     * @return int[] 包含水平和垂直间距的数组
     */
    public static int[] calculateSpacing(int columnCount, float ratio) {
        // 计算屏幕宽度
        DisplayMetrics displayMetrics = Resources.getSystem().getDisplayMetrics();
        int screenWidth = displayMetrics.widthPixels;

        // 计算每个item的宽度
        int itemWidth = (screenWidth - (columnCount + 1) * 10) / columnCount;

        // 计算item高度
        int itemHeight = (int) (itemWidth * ratio);

        // 计算水平间距和垂直间距
        int horizontalSpacing = (screenWidth - itemWidth * columnCount) / (columnCount + 1);
        int verticalSpacing = (int) (horizontalSpacing * ratio);

        return new int[]{horizontalSpacing, verticalSpacing};
    }
}

用法

以下是一个简单的示例,演示如何在 Activity 中调用 StatusBarUtils 类和 ViewUtils 类中的方法来初始化状态栏和计算间距:

java 复制代码
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 初始化状态栏
        Window window = getWindow();
        View rootView = getWindow().getDecorView().findViewById(android.R.id.content);
        int statusBarColor = Color.BLUE;
        boolean isTransparent = false;
        StatusBarUtils.initStatusBar(window, rootView, statusBarColor, isTransparent);

        // 隐藏状态栏
        StatusBarUtils.hideStatusBar(this);

        // 显示状态栏(可选)
        // StatusBarUtils.showStatusBar(this);

        // 计算间距
        int columnCount = 2;
        float ratio = 1.5f;
        int[] spacing = ViewUtils.calculateSpacing(columnCount, ratio);
        int horizontalSpacing = spacing[0];
        int verticalSpacing = spacing[1];

        // 设置水平和垂直间距
        RecyclerView recyclerView = findViewById(R.id.recyclerView); // 假设使用 RecyclerView
        recyclerView.addItemDecoration(new GridSpacingItemDecoration(columnCount, horizontalSpacing, verticalSpacing, true));
    }
}

请确保将上述代码中的 R.layout.activity_main 替换为你的实际布局文件,并根据需要调整状态栏颜色、列数、宽高比等参数。这样,在你的 Activity 中就可以使用状态栏工具类和视图工具类中的方法来实现相应的功能

相关推荐
EQ-雪梨蛋花汤21 分钟前
【Part 2安卓原生360°VR播放器开发实战】第四节|安卓VR播放器性能优化与设备适配
android·性能优化·vr
每次的天空40 分钟前
Android学习总结之kotlin篇(二)
android·学习·kotlin
刘洋浪子43 分钟前
Android Studio中Gradle中Task列表显示不全解决方案
android·ide·android studio
橙子199110161 小时前
Kotlin 中 infix 关键字的原理和使用场景
android·开发语言·kotlin
后端码匠7 小时前
MySQL 8.0安装(压缩包方式)
android·mysql·adb
梓仁沐白9 小时前
Android清单文件
android
董可伦11 小时前
Dinky 安装部署并配置提交 Flink Yarn 任务
android·adb·flink
每次的天空11 小时前
Android学习总结之Glide自定义三级缓存(面试篇)
android·学习·glide
恋猫de小郭12 小时前
如何查看项目是否支持最新 Android 16K Page Size 一文汇总
android·开发语言·javascript·kotlin
flying robot13 小时前
小结:Android系统架构
android·系统架构