Unity中如何控制状态栏显示

这段代码是一个Unity脚本,它提供了一个名为AndroidStatusBar的类,用于在Android平台上控制应用程序的状态栏。这个类包含了一些枚举(如States)来描述状态栏的各种显示状态,同时包含了一系列静态方法和属性来改变状态栏的状态、颜色、透明度和亮度。

该类通过使用Unity对Android Java API的桥接功能,动态地与Android原生API进行交互,以实现对状态栏的精细控制,包括但不限于:

  • 显示/隐藏状态栏
  • 控制状态栏的透明度
  • 调整状态栏的背景颜色
  • 使状态栏在游戏或其他界面内容上方或下方显示
  • 支持状态栏的低亮度(暗化)模式

当状态栏的相关属性被修改时,AndroidStatusBar会确保这些改变在Android主线程上正确且及时地生效。

// AndroidStatusBar.cs - 用于在Unity中控制Android状态栏的显示、隐藏以及颜色等属性的管理类

using System;
using System.Collections.Generic;
using UnityEngine;

public class AndroidStatusBar
{
    // 枚举类型,定义状态栏的不同状态
    public enum States
    {
        Unknown,            // 未知状态
        Visible,            // 状态栏可见
        VisibleOverContent,  // 状态栏在内容之上可见
        TranslucentOverContent, // 状态栏半透明覆盖在内容上
        Hidden,             // 状态栏隐藏
    }

    // 常量:默认背景颜色(黑色)
    private const uint DEFAULT_BACKGROUND_COLOR = 0xff000000;

#if UNITY_ANDROID
    // 定义Android原生状态栏相关的常量,这些常量表示不同UI模式的标志位
    // ...
    // 这部分省略了大量Android系统的UI控制标记位,具体含义已经在问题描述中给出

    // 当前的系统UI可见性值和窗口标记值
    private static int systemUiVisibilityValue;
    private static int flagsValue;

#endif

    // 类级别的私有静态字段,用于存储当前的状态栏状态、颜色及透明度属性
    private static States _statusBarState;
    private static uint _statusBarColor = DEFAULT_BACKGROUND_COLOR;
    private static bool _isStatusBarTranslucent;
    private static bool _dimmed;

    // 类构造器,在第一次访问静态成员时自动调用,初始化状态栏的当前状态和颜色
    static AndroidStatusBar()
    {
        applyUIStates();
        applyUIColors();
    }

    // 应用UI状态方法,根据设定的状态栏状态和用户交互需求调整对应的Android系统设置
    private static void applyUIStates()
    {
        if (Application.platform == RuntimePlatform.Android)
        {
            // 初始化新的Flags和SystemUiVisibility值
            int newFlagsValue = 0;
            int newSystemUiVisibilityValue = 0;

            // 根据_dimmed变量应用暗化效果
            if (_dimmed) newSystemUiVisibilityValue |= VIEW_SYSTEM_UI_FLAG_LOW_PROFILE;

            // 根据_statusBarColor应用颜色变化
            if (_statusBarColor != DEFAULT_BACKGROUND_COLOR) newFlagsValue |= WINDOW_FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS;

            // 根据_statusBarState应用状态栏的不同显示状态
            switch (_statusBarState)
            {
                case States.Visible:
                    _isStatusBarTranslucent = false;
                    newFlagsValue |= WINDOW_FLAG_FORCE_NOT_FULLSCREEN;
                    break;
                case States.VisibleOverContent:
                    _isStatusBarTranslucent = false;
                    newFlagsValue |= WINDOW_FLAG_FORCE_NOT_FULLSCREEN | WINDOW_FLAG_LAYOUT_IN_SCREEN;
                    newSystemUiVisibilityValue |= VIEW_SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
                    break;
                case States.TranslucentOverContent:
                    _isStatusBarTranslucent = true;
                    newFlagsValue |= WINDOW_FLAG_FORCE_NOT_FULLSCREEN | WINDOW_FLAG_LAYOUT_IN_SCREEN | WINDOW_FLAG_TRANSLUCENT_STATUS;
                    newSystemUiVisibilityValue |= VIEW_SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
                    break;
                case States.Hidden:
                    newFlagsValue |= WINDOW_FLAG_FULLSCREEN | WINDOW_FLAG_LAYOUT_IN_SCREEN;
                    if (_isStatusBarTranslucent) newFlagsValue |= WINDOW_FLAG_TRANSLUCENT_STATUS;
                    break;
            }

            // 如果全屏,则取消全屏以便设置状态栏
            if (Screen.fullScreen) Screen.fullScreen = false;

            // 将新设置的应用到Android系统
            setFlags(newFlagsValue);
            setSystemUiVisibility(newSystemUiVisibilityValue);
        }
    }

    // 应用颜色方法,负责更新状态栏的颜色
    private static void applyUIColors()
    {
        if (Application.platform == RuntimePlatform.Android)
        {
            // 在Android主线程上运行颜色更新操作
            runOnAndroidUiThread(applyUIColorsAndroidInThread);
        }
    }

#if UNITY_ANDROID
    // 在Android主线程上执行给定Action的方法
    private static void runOnAndroidUiThread(Action target)
    {
        using (var unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
        {
            using (var activity = unityPlayer.GetStatic("currentActivity"))
            {
                activity.Call("runOnUiThread", new AndroidJavaRunnable(target));
            }
        }
    }

    // 设置System UI可见性方法,并在Android主线程上调用实际设置函数
    private static void setSystemUiVisibility(int value)
    {
        if (systemUiVisibilityValue != value)
        {
            systemUiVisibilityValue = value;
            runOnAndroidUiThread(setSystemUiVisibilityInThread);
        }
    }

    // 在Android主线程上实际设置System UI可见性
    private static void setSystemUiVisibilityInThread()
    {
        using (var unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
        {
            using (var activity = unityPlayer.GetStatic("currentActivity"))
            {
                using (var window = activity.Call("getWindow"))
                {
                    using (var view = window.Call("getDecorView"))
                    {
                        view.Call("setSystemUiVisibility", systemUiVisibilityValue);
                    }
                }
            }
        }
    }

    // 设置窗口标志方法,并在Android主线程上调用实际设置函数
    private static void setFlags(int value)
    {
        if (flagsValue != value)
        {
            flagsValue = value;
            runOnAndroidUiThread(setFlagsInThread);
        }
    }

    // 在Android主线程上实际设置窗口标志
    private static void setFlagsInThread()
    {
        using (var unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
        {
            using (var activity = unityPlayer.GetStatic("currentActivity"))
            {
                using (var window = activity.Call("getWindow"))
                {
                    window.Call("setFlags", flagsValue, -1); // 使用掩码设置全部标志位
                }
            }
        }
    }

    // 在Android主线程上实际应用状态栏颜色
    private static void applyUIColorsAndroidInThread()
    {
        using (var unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
        {
            using (var activity = unityPlayer.GetStatic("currentActivity"))
            {
                using (var window = activity.Call("getWindow"))
                {
                    window.Call("setStatusBarColor", unchecked((int)_statusBarColor));
                }
            }
        }
    }
#endif

    // 公开状态栏状态属性,允许外部获取或设置状态栏的显示状态
    public static States statusBarState
    {
        get { return _statusBarState; }
        set
        {
            if (_statusBarState != value)
            {
                _statusBarState = value;
                applyUIStates(); // 设置状态后重新应用UI状态
            }
        }
    }

    // 公开是否暗化状态栏属性,允许外部控制状态栏是否为低亮度模式
    public static bool dimmed
    {
        get { return _dimmed; }
        set
        {
            if (_dimmed != value)
            {
                _dimmed = value;
                applyUIStates(); // 设置暗化模式后重新应用UI状态
            }
        }
    }

    // 公开状态栏颜色属性,允许外部获取或设置状态栏的背景颜色
    public static uint statusBarColor
    {
        get { return _statusBarColor; }
        set
        {
            if (_statusBarColor != value)
            {
                _statusBarColor = value;
                applyUIColors(); // 设置颜色后直接应用颜色更改
                applyUIStates(); // 颜色更改可能影响UI状态,因此也需重新应用UI状态
            }
        }
    }
}

你可能感兴趣的:(java,Unity)