这段代码是一个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<AndroidJavaObject>("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<AndroidJavaObject>("currentActivity"))
{
using (var window = activity.Call<AndroidJavaObject>("getWindow"))
{
using (var view = window.Call<AndroidJavaObject>("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<AndroidJavaObject>("currentActivity"))
{
using (var window = activity.Call<AndroidJavaObject>("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<AndroidJavaObject>("currentActivity"))
{
using (var window = activity.Call<AndroidJavaObject>("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状态
}
}
}
}
更多【unity-Unity中如何控制状态栏显示】相关视频教程:www.yxfzedu.com