using UnityEngine;
using System.Collections;public class AppStatusBar : MonoSingleton<AppStatusBar>
{[Tooltip("状态栏是否显示状态及通知")]public bool statusBar;[Tooltip("状态栏样式")]public AndroidStatusBar.States states = AndroidStatusBar.States.Visible;public bool _IsStatusVisible = false;// Use this for initializationpublic  override void Awake(){AndroidStatusBar.Init();Screen.fullScreen = true;if (Application.platform == RuntimePlatform.Android){AndroidStatusBar.dimmed = !statusBar;//当AndroidStatusBar.dimmed=false时,状态栏显示所有状态及通知图标//当AndroidStatusBar.dimmed=true时,状态栏仅电量和时间,不显示其他状态及通知显示状态栏,占用屏幕最上方的一部分像素//AndroidStatusBar.statusBarState = AndroidStatusBar.States.Visible;悬浮显示状态栏,不占用屏幕像素//AndroidStatusBar.statusBarState = AndroidStatusBar.States.VisibleOverContent;透明悬浮显示状态栏,不占用屏幕像素//AndroidStatusBar.statusBarState = AndroidStatusBar.States.TranslucentOverContent;隐藏状态栏//AndroidStatusBar.statusBarState = AndroidStatusBar.States.Hidden;AndroidStatusBar.statusBarState = states;}}public void SetVisible(bool b){if (_IsStatusVisible != b){_IsStatusVisible = b;if (Application.platform == RuntimePlatform.Android){//AndroidStatusBar.dimmed = !statusBar;//当AndroidStatusBar.dimmed=false时,状态栏显示所有状态及通知图标//当AndroidStatusBar.dimmed=true时,状态栏仅电量和时间,不显示其他状态及通知显示状态栏,占用屏幕最上方的一部分像素//AndroidStatusBar.statusBarState = AndroidStatusBar.States.Visible;悬浮显示状态栏,不占用屏幕像素//AndroidStatusBar.statusBarState = AndroidStatusBar.States.VisibleOverContent;透明悬浮显示状态栏,不占用屏幕像素//AndroidStatusBar.statusBarState = AndroidStatusBar.States.TranslucentOverContent;隐藏状态栏//AndroidStatusBar.statusBarState = AndroidStatusBar.States.Hidden;if (b){//AndroidStatusBar.statusBarState = AndroidStatusBar.States.VisibleOverContent;//yield return new WaitForSeconds(0.5f);AndroidStatusBar.statusBarState = AndroidStatusBar.States.Visible;}else{AndroidStatusBar.statusBarState = AndroidStatusBar.States.Hidden;}}}}
}
using System;
using System.Collections.Generic;
using UnityEngine;/**
* @author zeh fernando
* @modify MemoryC_2017-02-05
*/
public class AndroidStatusBar
{/**
* Manipulates the system application chrome to change the way the status bar and navigation bar work
*POSTS FROM :
*http://zehfernando.com/2015/unity-tidbits-changing-the-visibility-of-androids-navigation-and-status-bars-and-implementing-immersive-mode/
*[url=http://www.manew.com/thread-100054-1-1.html]http://www.manew.com/thread-100054-1-1.html[/url]
* References:
* . http://developer.android.com/reference/android/view/View.html#setSystemUiVisibility(int)
* . http://forum.unity3d.com/threads/calling-setsystemuivisibility.139445/#post-952946
* . http://developer.android.com/reference/android/view/WindowManager.LayoutParams.html#FLAG_LAYOUT_IN_SCREEN
**/// Enumspublic enum States{Unknown,Visible,//显示状态栏,占用屏幕最上方的一部分像素VisibleOverContent,//悬浮显示状态栏,不占用屏幕像素TranslucentOverContent,//透明悬浮显示状态栏,不占用屏幕像素Hidden,//隐藏状态栏}// Constantsprivate const uint DEFAULT_BACKGROUND_COLOR = 0xff000000;#if UNITY_ANDROID// Original Android flagsprivate const int VIEW_SYSTEM_UI_FLAG_VISIBLE = 0;                                        // Added in API 14 (Android 4.0.x): Status bar visible (the default)private const int VIEW_SYSTEM_UI_FLAG_LOW_PROFILE = 1;                                // Added in API 14 (Android 4.0.x): Low profile for games, book readers, and video players; the status bar and/or navigation icons are dimmed out (if visible)private const int VIEW_SYSTEM_UI_FLAG_HIDE_NAVIGATION = 2;                        // Added in API 14 (Android 4.0.x): Hides all navigation. Cleared when theres any user interaction.private const int VIEW_SYSTEM_UI_FLAG_FULLSCREEN = 4;                                // Added in API 16 (Android 4.1.x): Hides status bar. Does nothing in Unity (already hidden if "status bar hidden" is checked)private const int VIEW_SYSTEM_UI_FLAG_LAYOUT_STABLE = 256;                        // Added in API 16 (Android 4.1.x): ?private const int VIEW_SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION = 512;        // Added in API 16 (Android 4.1.x): like HIDE_NAVIGATION, but for layouts? it causes the layout to be drawn like that, even if the whole view isn't (to avoid artifacts in animation)private const int VIEW_SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN = 1024;                // Added in API 16 (Android 4.1.x): like FULLSCREEN, but for layouts? it causes the layout to be drawn like that, even if the whole view isn't (to avoid artifacts in animation)private const int VIEW_SYSTEM_UI_FLAG_IMMERSIVE = 2048;                                // Added in API 19 (Android 4.4): like HIDE_NAVIGATION, but interactive (it's a modifier for HIDE_NAVIGATION, needs to be used with it)private const int VIEW_SYSTEM_UI_FLAG_IMMERSIVE_STICKY = 4096;                // Added in API 19 (Android 4.4): tells that HIDE_NAVIGATION and FULSCREEN are interactive (also just a modifier)private static int WINDOW_FLAG_FULLSCREEN = 0x00000400;private static int WINDOW_FLAG_FORCE_NOT_FULLSCREEN = 0x00000800;private static int WINDOW_FLAG_LAYOUT_IN_SCREEN = 0x00000100;private static int WINDOW_FLAG_TRANSLUCENT_STATUS = 0x04000000;private static int WINDOW_FLAG_TRANSLUCENT_NAVIGATION = 0x08000000;private static int WINDOW_FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS = -2147483648; // 0x80000000; // Added in API 21 (Android 5.0): tells the Window is responsible for drawing the background for the system bars. If set, the system bars are drawn with a transparent background and the corresponding areas in this window are filled with the colors specified in getStatusBarColor() and getNavigationBarColor()// Current valuesprivate static int systemUiVisibilityValue;private static int flagsValue;#endif// Propertiesprivate static States _statusBarState;//        private static States _navigationBarState;private static uint _statusBarColor = DEFAULT_BACKGROUND_COLOR;//        private static uint _navigationBarColor = DEFAULT_BACKGROUND_COLOR;private static bool _isStatusBarTranslucent; // Just so we know whether its translucent when hidden or not//        private static bool _isNavigationBarTranslucent;private static bool _dimmed;// ================================================================================================================// INTERNAL INTERFACE ---------------------------------------------------------------------------------------------static AndroidStatusBar(){applyUIStates();applyUIColors();}public static void Init(){applyUIStates();applyUIColors();}private static void applyUIStates(){#if UNITY_ANDROID && !UNITY_EDITORint newFlagsValue = 0;int newSystemUiVisibilityValue = 0;// Apply dim valuesif (_dimmed) newSystemUiVisibilityValue |= VIEW_SYSTEM_UI_FLAG_LOW_PROFILE;// Apply color values
//                if (_navigationBarColor != DEFAULT_BACKGROUND_COLOR || _statusBarColor != DEFAULT_BACKGROUND_COLOR) newFlagsValue |= WINDOW_FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS;if (_statusBarColor != DEFAULT_BACKGROUND_COLOR) newFlagsValue |= WINDOW_FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS;// Apply status bar valuesswitch (_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;}// Applies navigation values/*switch (_navigationBarState) {case States.Visible:_isNavigationBarTranslucent = false;newSystemUiVisibilityValue |= VIEW_SYSTEM_UI_FLAG_LAYOUT_STABLE;break;case States.VisibleOverContent:// TODO: Side effect: forces status bar over content if set to VISIBLE_isNavigationBarTranslucent = false;newSystemUiVisibilityValue |= VIEW_SYSTEM_UI_FLAG_LAYOUT_STABLE | VIEW_SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;break;case States.TranslucentOverContent:// TODO: Side effect: forces status bar over content if set to VISIBLE_isNavigationBarTranslucent = true;newFlagsValue |= WINDOW_FLAG_TRANSLUCENT_NAVIGATION;newSystemUiVisibilityValue |= VIEW_SYSTEM_UI_FLAG_LAYOUT_STABLE | VIEW_SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;break;case States.Hidden:newSystemUiVisibilityValue |= VIEW_SYSTEM_UI_FLAG_FULLSCREEN | VIEW_SYSTEM_UI_FLAG_HIDE_NAVIGATION | VIEW_SYSTEM_UI_FLAG_IMMERSIVE_STICKY;if (_isNavigationBarTranslucent) newFlagsValue |= WINDOW_FLAG_TRANSLUCENT_NAVIGATION;break;}*/if (Screen.fullScreen) Screen.fullScreen = false;// Applies everything nativelysetFlags(newFlagsValue);setSystemUiVisibility(newSystemUiVisibilityValue);#endif}private static void applyUIColors(){#if UNITY_ANDROID && !UNITY_EDITORrunOnAndroidUiThread(applyUIColorsAndroidInThread);#endif}#if UNITY_ANDROIDprivate 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));}}}private static void setSystemUiVisibility(int value){if (systemUiVisibilityValue != value){systemUiVisibilityValue = value;runOnAndroidUiThread(setSystemUiVisibilityInThread);}}private static void setSystemUiVisibilityInThread(){//Debug.Log("SYSTEM FLAGS: " + systemUiVisibilityValue);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);}}}}}private static void setFlags(int value){if (flagsValue != value){flagsValue = value;runOnAndroidUiThread(setFlagsInThread);}}private static void setFlagsInThread(){//Debug.Log("FLAGS: " + flagsValue);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); // (int)0x7FFFFFFF}}}}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")){//Debug.Log("Colors SET: " + _statusBarColor);window.Call("setStatusBarColor", unchecked((int)_statusBarColor));//                                        window.Call("setNavigationBarColor", unchecked((int)_navigationBarColor));}}}}#endif// ================================================================================================================// ACCESSOR INTERFACE ---------------------------------------------------------------------------------------------/*public static States navigationBarState {get { return _navigationBarState; }set {if (_navigationBarState != value) {_navigationBarState = value;applyUIStates();}}}
*/public static States statusBarState{get { return _statusBarState; }set{if (_statusBarState != value){_statusBarState = value;applyUIStates();}}}//当AndroidStatusBar.dimmed=false时,状态栏显示所有状态及通知图标//当AndroidStatusBar.dimmed=true时,状态栏仅电量和时间,不显示其他状态及通知//AndroidStatusBar.dimmed = !AndroidStatusBar.dimmed;public static bool dimmed{get { return _dimmed; }set{if (_dimmed != value){_dimmed = value;applyUIStates();}}}public static uint statusBarColor{get { return _statusBarColor; }set{if (_statusBarColor != value){_statusBarColor = value;applyUIColors();applyUIStates();}}}/*public static uint navigationBarColor {get { return _navigationBarColor; }set {if (_navigationBarColor != value) {_navigationBarColor = value;applyUIColors();applyUIStates();}}}*/}

应用:

AppStatusBar.Instance.SetVisible(true);

Unity___状态栏相关相关推荐

  1. android dialog 隐藏状态栏_Android开发不得不收集的工具类集合

    嗨,你终于来啦 ~ 等你好久啦~ 喜欢的小伙伴欢迎关注,我会定期分享Android知识点及解析,还会不断更新的BATJ面试专题,欢迎大家前来探讨交流,如有好的文章也欢迎投稿.更新了几天Android基 ...

  2. android(cm11)状态栏源码分析(一)

    版权声明:您好,转载请留下本人博客的地址,谢谢 https://blog.csdn.net/hongbochen1223/article/details/50216563 (一):写在前面 最近由于工 ...

  3. 【Qt】MainWindow窗口状态栏

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 显示菜单动作状态 04. 显示临时信息 05. 显示正常信息 06. 显示永久信息 07. 附录 01. 概述 在程序主窗 ...

  4. Andorid 系统性能优化---(22)Android性能相关常用命令收集

    1.CUP (1)adb shell (进入linux的底层) (2)echo 3>/proc/sys/vm/drop_caches (清除一下系统cache) (3)top -d 1 | gr ...

  5. 第二十九课、主窗口中的状态栏------------------狄泰软件学院

    一.主窗口中的状态栏 1.状态栏的概念和意义 (1).状态栏是应用程序中输出简要信息的区域 (2).状态栏一般位于主窗口的最底部 (3).状态栏中的消息类型 A.实时消息:如当前程序状态 B.永久消息 ...

  6. android 沉浸式开源库,Android沉浸式状态栏

    关于Android沉浸式状态栏, 网上已经有很多开源库, 虽然开源库可以解决某些特定布局下的沉浸式状态栏问题, 但是遇到比较特殊的布局就无法解决了, 所以了解一下沉浸式状态栏如何实现是有必要的. 无论 ...

  7. Android 12系统源码_SystemUI(五)自定义状态栏和导航栏视图

    前言 前面几篇文章我们具体分析了Android12系统原生的StatusBar和CarStatusBar的启动流程以及视图构建流程,本篇文章我们来自定义实现状态栏和导航栏视图. 一.为系统添加自定义状 ...

  8. iOS开发 - 事件传递响应链

    序言 当我们在使用微信等工具,点击扫一扫,就能打开二维码扫描视图.在我们点击屏幕的时候,iphone OS获取到了用户进行了"单击"这一行为,操作系统把包含这些点击事件的信息包装成 ...

  9. 使用 C# 开发智能手机软件:推箱子(二十三)

    这是"使用 C# 开发智能手机软件:推箱子" 系列文章的第二十三篇.在这篇文章中,介绍 Window/MainForm.Common.cs 源程序文件.这个源程序文件是 MainF ...

最新文章

  1. .NetCore Winform控制台 做HTTP Host,简易接口
  2. 004_Gson树模型
  3. NLTK自带的词干提取器
  4. 全新定义!免费开源ERP平台如何玩转工业互联网
  5. python爬取豆瓣书籍_Python爬取豆瓣读书
  6. 有限元分析简单实例之四杆结构(matlab)
  7. 元气动态壁纸爬虫(入门)
  8. 堆栈宽度学习Stacked BLS的简单python代码实现
  9. oracle peoplesoft enterprise,Solix实现与Oracle PeopleSoft Enterprise9.1整合
  10. Altium Designer,设置一个器件或一个区域不做电气规则检查
  11. php 2038年,php实现兼容2038年后Unix时间戳转换函数,2038unix_PHP教程
  12. 苹果设备上的无损音乐alac
  13. (附源码)计算机毕业设计SSM基于框架的旅游订票系统
  14. 你真的了解Linux(Deepin)的软件商店吗?(内附极力推荐的软件)
  15. NASA搞无人车?中国航天也将携手人工智能技术
  16. C++11条件变量:notify_one()与notify_all()的区别
  17. SQL server查询出只选修两门课程的学生学号和姓名
  18. Qt对word文档操作总结
  19. 【硬核扫盲】到底什么是相干光通信?
  20. 高德公布2016年度交通报告:十大堵城上榜

热门文章

  1. 安卓开发--Eclipse搭建开发环境
  2. 操作系统实验报告【太原理工大学】
  3. php artisan command,从php函数运行artisan命令
  4. FFmpeg 命令详解
  5. TCP、UDP、Socket、HTTP面试题(总结最全面的面试题!!!)
  6. Python_变量声明
  7. Flutter学习笔记 —— 完成一个简单的新闻展示页
  8. 【Mysql】utf8与utf8mb4区别,utf8mb4_bin、utf8mb4_general_ci、utf8mb4_unicode_ci区别
  9. 古之成大事者必经三境界--王国维《人间词话》
  10. 学术新秀采访-陆品燕~How To Get Your SIGGRAPH Paper Rejected