当前位置: 代码网 > it编程>编程语言>Java > Unity中如何控制状态栏显示

Unity中如何控制状态栏显示

2024年08月06日 Java 我要评论
这段代码是一个Unity脚本,它提供了一个名为AndroidStatusBar的类,用于在Android平台上控制应用程序的状态栏。这个类包含了一些枚举(如States)来描述状态栏的各种显示状态,同时包含了一系列静态方法和属性来改变状态栏的状态、颜色、透明度和亮度。该类通过使用Unity对Android Java API的桥接功能,动态地与Android原生API进行交互,以实现对状态栏的精细控制

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

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com