Unity___状态栏相关
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___状态栏相关相关推荐
- android dialog 隐藏状态栏_Android开发不得不收集的工具类集合
嗨,你终于来啦 ~ 等你好久啦~ 喜欢的小伙伴欢迎关注,我会定期分享Android知识点及解析,还会不断更新的BATJ面试专题,欢迎大家前来探讨交流,如有好的文章也欢迎投稿.更新了几天Android基 ...
- android(cm11)状态栏源码分析(一)
版权声明:您好,转载请留下本人博客的地址,谢谢 https://blog.csdn.net/hongbochen1223/article/details/50216563 (一):写在前面 最近由于工 ...
- 【Qt】MainWindow窗口状态栏
00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 显示菜单动作状态 04. 显示临时信息 05. 显示正常信息 06. 显示永久信息 07. 附录 01. 概述 在程序主窗 ...
- Andorid 系统性能优化---(22)Android性能相关常用命令收集
1.CUP (1)adb shell (进入linux的底层) (2)echo 3>/proc/sys/vm/drop_caches (清除一下系统cache) (3)top -d 1 | gr ...
- 第二十九课、主窗口中的状态栏------------------狄泰软件学院
一.主窗口中的状态栏 1.状态栏的概念和意义 (1).状态栏是应用程序中输出简要信息的区域 (2).状态栏一般位于主窗口的最底部 (3).状态栏中的消息类型 A.实时消息:如当前程序状态 B.永久消息 ...
- android 沉浸式开源库,Android沉浸式状态栏
关于Android沉浸式状态栏, 网上已经有很多开源库, 虽然开源库可以解决某些特定布局下的沉浸式状态栏问题, 但是遇到比较特殊的布局就无法解决了, 所以了解一下沉浸式状态栏如何实现是有必要的. 无论 ...
- Android 12系统源码_SystemUI(五)自定义状态栏和导航栏视图
前言 前面几篇文章我们具体分析了Android12系统原生的StatusBar和CarStatusBar的启动流程以及视图构建流程,本篇文章我们来自定义实现状态栏和导航栏视图. 一.为系统添加自定义状 ...
- iOS开发 - 事件传递响应链
序言 当我们在使用微信等工具,点击扫一扫,就能打开二维码扫描视图.在我们点击屏幕的时候,iphone OS获取到了用户进行了"单击"这一行为,操作系统把包含这些点击事件的信息包装成 ...
- 使用 C# 开发智能手机软件:推箱子(二十三)
这是"使用 C# 开发智能手机软件:推箱子" 系列文章的第二十三篇.在这篇文章中,介绍 Window/MainForm.Common.cs 源程序文件.这个源程序文件是 MainF ...
最新文章
- .NetCore Winform控制台 做HTTP Host,简易接口
- 004_Gson树模型
- NLTK自带的词干提取器
- 全新定义!免费开源ERP平台如何玩转工业互联网
- python爬取豆瓣书籍_Python爬取豆瓣读书
- 有限元分析简单实例之四杆结构(matlab)
- 元气动态壁纸爬虫(入门)
- 堆栈宽度学习Stacked BLS的简单python代码实现
- oracle peoplesoft enterprise,Solix实现与Oracle PeopleSoft Enterprise9.1整合
- Altium Designer,设置一个器件或一个区域不做电气规则检查
- php 2038年,php实现兼容2038年后Unix时间戳转换函数,2038unix_PHP教程
- 苹果设备上的无损音乐alac
- (附源码)计算机毕业设计SSM基于框架的旅游订票系统
- 你真的了解Linux(Deepin)的软件商店吗?(内附极力推荐的软件)
- NASA搞无人车?中国航天也将携手人工智能技术
- C++11条件变量:notify_one()与notify_all()的区别
- SQL server查询出只选修两门课程的学生学号和姓名
- Qt对word文档操作总结
- 【硬核扫盲】到底什么是相干光通信?
- 高德公布2016年度交通报告:十大堵城上榜
热门文章
- 安卓开发--Eclipse搭建开发环境
- 操作系统实验报告【太原理工大学】
- php artisan command,从php函数运行artisan命令
- FFmpeg 命令详解
- TCP、UDP、Socket、HTTP面试题(总结最全面的面试题!!!)
- Python_变量声明
- Flutter学习笔记 —— 完成一个简单的新闻展示页
- 【Mysql】utf8与utf8mb4区别,utf8mb4_bin、utf8mb4_general_ci、utf8mb4_unicode_ci区别
- 古之成大事者必经三境界--王国维《人间词话》
- 学术新秀采访-陆品燕~How To Get Your SIGGRAPH Paper Rejected