这段代码是一个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状态
}
}
}
}
发表评论