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


    StatusBarUtils工具类

    1. public class StatusBarUtils {
    2. public static void initStatusBar(Window window, View view, int color, boolean transparent) {
    3. // 如果系统版本大于等于 Android 5.0(Lollipop)
    4. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    5. if (transparent) {
    6. // 设置状态栏为透明,并且布局充满全屏
    7. window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
    8. window.setStatusBarColor(Color.TRANSPARENT);
    9. } else {
    10. // 设置状态栏颜色为传入的颜色值
    11. window.setStatusBarColor(color);
    12. }
    13. // 如果系统版本大于等于 Android 6.0(Marshmallow)
    14. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    15. // 设置状态栏文字颜色为传入的颜色值
    16. window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
    17. }
    18. }
    19. // 设置顶部内边距等于状态栏高度(使内容在状态栏的下方显示)
    20. int statusBarHeight = ViewUtils.getStatusBarHeight(view.getContext());
    21. view.setPadding(0, statusBarHeight, 0, 0);
    22. }
    23. /**
    24. * 隐藏状态栏
    25. */
    26. public static void hideStatusBar(Activity activity) {
    27. // 获取窗口
    28. Window window = activity.getWindow();
    29. // 对Android版本进行检查,选择不同的方法实现隐藏状态栏
    30. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    31. // API Level 19 及以上(Android 4.4及以上)
    32. View decorView = window.getDecorView();
    33. int option = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
    34. | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
    35. | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
    36. | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
    37. | View.SYSTEM_UI_FLAG_FULLSCREEN
    38. | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
    39. decorView.setSystemUiVisibility(option);
    40. } else if (Build.VERSION.SDK_INT >= 16) {
    41. // API Level 16 到 18 (Android 4.1 到 Android 4.3)
    42. View decorView = window.getDecorView();
    43. int option = View.SYSTEM_UI_FLAG_FULLSCREEN;
    44. decorView.setSystemUiVisibility(option);
    45. } else {
    46. // API Level 16以下(Android 4.1以下)
    47. window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
    48. WindowManager.LayoutParams.FLAG_FULLSCREEN);
    49. }
    50. }
    51. /**
    52. * 显示状态栏
    53. *
    54. * @param activity 当前的Activity
    55. */
    56. public static void showStatusBar(Activity activity) {
    57. // 获取窗口
    58. Window window = activity.getWindow();
    59. // 对Android版本进行检查,选择不同的方法实现显示状态栏
    60. if (Build.VERSION.SDK_INT < 16) {
    61. // API Level 16以下(Android 4.1以下)
    62. window.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
    63. } else {
    64. // API Level 16 及以上(Android 4.1及以上)
    65. View decorView = window.getDecorView();
    66. int option = View.SYSTEM_UI_FLAG_VISIBLE;
    67. decorView.setSystemUiVisibility(option);
    68. }
    69. }
    70. }

    ViewUtils工具类

    1. public class ViewUtils {
    2. /**
    3. * 获取状态栏高度
    4. *
    5. * @param context 应用上下文
    6. * @return int 状态栏高度
    7. */
    8. public static int getStatusBarHeight(Context context) {
    9. int result = 0;
    10. int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
    11. if (resourceId > 0) {
    12. result = context.getResources().getDimensionPixelSize(resourceId);
    13. }
    14. return result;
    15. }
    16. /**
    17. * 计算Item之间的间距
    18. *
    19. * @param columnCount 列数
    20. * @param ratio 宽高比
    21. * @return int[] 包含水平和垂直间距的数组
    22. */
    23. public static int[] calculateSpacing(int columnCount, float ratio) {
    24. // 计算屏幕宽度
    25. DisplayMetrics displayMetrics = Resources.getSystem().getDisplayMetrics();
    26. int screenWidth = displayMetrics.widthPixels;
    27. // 计算每个item的宽度
    28. int itemWidth = (screenWidth - (columnCount + 1) * 10) / columnCount;
    29. // 计算item高度
    30. int itemHeight = (int) (itemWidth * ratio);
    31. // 计算水平间距和垂直间距
    32. int horizontalSpacing = (screenWidth - itemWidth * columnCount) / (columnCount + 1);
    33. int verticalSpacing = (int) (horizontalSpacing * ratio);
    34. return new int[]{horizontalSpacing, verticalSpacing};
    35. }
    36. }

    用法

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

    1. public class MainActivity extends AppCompatActivity {
    2. @Override
    3. protected void onCreate(Bundle savedInstanceState) {
    4. super.onCreate(savedInstanceState);
    5. setContentView(R.layout.activity_main);
    6. // 初始化状态栏
    7. Window window = getWindow();
    8. View rootView = getWindow().getDecorView().findViewById(android.R.id.content);
    9. int statusBarColor = Color.BLUE;
    10. boolean isTransparent = false;
    11. StatusBarUtils.initStatusBar(window, rootView, statusBarColor, isTransparent);
    12. // 隐藏状态栏
    13. StatusBarUtils.hideStatusBar(this);
    14. // 显示状态栏(可选)
    15. // StatusBarUtils.showStatusBar(this);
    16. // 计算间距
    17. int columnCount = 2;
    18. float ratio = 1.5f;
    19. int[] spacing = ViewUtils.calculateSpacing(columnCount, ratio);
    20. int horizontalSpacing = spacing[0];
    21. int verticalSpacing = spacing[1];
    22. // 设置水平和垂直间距
    23. RecyclerView recyclerView = findViewById(R.id.recyclerView); // 假设使用 RecyclerView
    24. recyclerView.addItemDecoration(new GridSpacingItemDecoration(columnCount, horizontalSpacing, verticalSpacing, true));
    25. }
    26. }

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

  • 相关阅读:
    【图像分割】基于元胞自动机实现图像分割附matlab代码
    SAP和APS系统订单BOM核对(SAP配置BOM攻略九)
    使用Unity和纯ECS框架重新打造简单RTS游戏:从零开始的详细C#编程教程
    MySQL 备份和恢复
    Comparison method violates its general contract解决办法
    VINS学习(一)视觉前端
    HACKTHEBOX——Mirai
    Vue | Vue.js 基础 模版语法
    新美域杂志新美域杂志社新美域编辑部2022年第6期目录
    Trie思想及模板
  • 原文地址:https://blog.csdn.net/qq_41733851/article/details/136616633