项目用到的窗口管理类
来源:互联网 发布:java数组的定义格式 编辑:程序博客网 时间:2024/06/07 10:18
//窗口的层public enum Layer{ UI, EF,}
//对话框类型public enum DialogType{ /// <summary> /// 用户协议弹窗 /// </summary> UserHttps, /// <summary> /// 确定弹窗 /// </summary> TooltipBox,}
//对话框选择结果public enum ResultDialog{ Yes, No,}
//定义一些委托public delegate void ReturnResultCallback(ResultDialog result);public delegate void DoneLoadDialog(GameObject window);public delegate void DoneOpenWindow(GameObject varWindowObj);public delegate void DoneSpecialObject(GameObject varSpecial);
//窗口管理类public class WindowManager{ private static WindowManager Instance; public static WindowManager GetInstance() { if (Instance == null) { Instance = new WindowManager(); } return Instance; } public readonly int MaxHeight = 720; public readonly int MaxWidht = 1280; float standard_width = 1280f; //初始宽度 float standard_height = 720f; //初始高度 float device_width = 0f; //当前设备宽度 float device_height = 0f; //当前设备高度 public float adjustor = 0f; //屏幕矫正比例 private const int IntervalDepth = 21; private const int MaxWindowDepth = 3000; private const int LoadingDepth = 4000; GameObject mMakePanle = null; GameObject mRoot = null; GameObject mWindowRoot = null; GameObject mDialogRoot = null; //GameObject mSpecialObject = null; GameObject mLoadingObject = null; /// <summary> /// 已打开的窗口(注:对窗口进行添加移除一定要同步到mOpenWindowKey集合中、字典集合是保证不了顺序的) /// </summary> SortedDictionary<string, GameObject> mOpenWindow = new SortedDictionary<string, GameObject>(); /// <summary> /// 为保证窗口打开顺序,另用集合存储 /// </summary> List<string> mOpenWindowKey = new List<string>(); /// <summary> /// 已打开的弹窗 /// </summary> SortedDictionary<string, GameObject> mOpenDialog = new SortedDictionary<string, GameObject>(); SortedDictionary<string, GameObject> mSpecial = new SortedDictionary<string, GameObject>(); public List<string> noticeList = null; public GameObject pRoot { get { return mRoot; } } public WindowManager() { //初始化节点 mRoot = new GameObject("UIObject"); mRoot.transform.position = new Vector3(0, 0, -5); noticeList = new List<string>(); UIRoot mRootScripts = mRoot.AddComponent<UIRoot>(); mRootScripts.scalingStyle = UIRoot.Scaling.Constrained; mRootScripts.fitWidth = true; mRootScripts.fitHeight = false; GameObject mCameraObject = new GameObject("UICamera"); mCameraObject.transform.SetParent(mRoot.transform); Camera mCamera = mCameraObject.AddComponent<Camera>(); mCamera.orthographic = true; mCamera.orthographicSize = 1; mCamera.cullingMask = LayerMask.GetMask(Layer.UI.ToString()); mCamera.clearFlags = CameraClearFlags.Depth; mCamera.depth = 2; mCamera.backgroundColor = new Color(0, 0, 0); UICamera uiCamera = mCameraObject.AddComponent<UICamera>(); uiCamera.eventType = UICamera.EventType.UI_3D; uiCamera.transform.localPosition = new Vector3(0, 0, -1000); mWindowRoot = new GameObject("WindowRoot"); mWindowRoot.AddComponent<UIPanel>(); mWindowRoot.transform.SetParent(mRoot.transform); mDialogRoot = new GameObject("DialogRoot"); mDialogRoot.transform.SetParent(mRoot.transform); UIPanel panel = mRoot.AddComponent<UIPanel>(); mMakePanle = new GameObject("MakePanle"); mMakePanle.AddComponent<UIPanel>(); Texture2D texture = Texture2D.whiteTexture; GameObject textureGameObject = new GameObject("background"); UpdateCamera(uiCamera); //获取设备宽高 device_width = Screen.width; device_height = Screen.height; //计算宽高比例 float standard_aspect = standard_width / standard_height; float device_aspect = device_width / device_height; //计算矫正比例 if (device_aspect < standard_aspect) { adjustor = standard_aspect / device_aspect; } if (device_aspect >= standard_aspect) { adjustor = 1; } UITexture ui = textureGameObject.AddComponent<UITexture>(); ui.mainTexture = texture; ui.color = new Color(0, 0, 0, 0.6f); ui.height = (int)device_height + 5000; ui.width = (int)device_width + 5000; NGUITools.AddWidgetCollider(textureGameObject); mMakePanle.SetActive(false); textureGameObject.transform.SetParent(mMakePanle.transform); mMakePanle.transform.SetParent(mWindowRoot.transform); NGUITools.SetChildLayer(mRoot.transform, LayerMask.NameToLayer(Layer.UI.ToString())); Object.DontDestroyOnLoad(mRoot); } public float screenHeight; public float screenWidth; void UpdateCamera(UICamera uiCamera) { screenHeight = Screen.height; screenWidth = Screen.width; Rect r = new Rect(); if (screenHeight / screenWidth > 0.56f)//更方的屏幕 ipad 1024*768 { r.width = 1; r.height = (screenWidth * 0.56f) / screenHeight; r.x = 0; r.y = (1 - r.height) / 2f; } else if (screenHeight / screenWidth < 0.56f)//更长的屏幕480*854 { r.width = (screenHeight / 0.56f) / screenWidth; r.height = 1f; r.x = (1 - r.width) / 2f; r.y = 0; } else //在可适配区域不做处理480*800 - 480*854之间的 { r.width = 1; r.height = 1; r.x = 0; r.y = 0f; } uiCamera.GetComponent<Camera>().rect = r; } /// <summary> /// 设置loading状态 /// </summary> /// <param name="state">当前loading状态</param> /// <param name="makeState">蒙版开关参数</param> public void SetLoading(bool state, bool makeState) { SetLoading(LoadingType.Loading, Vector3.zero, state, makeState); } public void SetLoading(LoadingType type, Vector3 postion, bool state, bool makeState) { if (mLoadingObject != null) { Dialog_Loading loading = mLoadingObject.GetComponent<Dialog_Loading>(); if (loading != null) { loading.SetLoadingType(type, postion, makeState); } mLoadingObject.SetActive(state); return; } DownloadCallback done = (string filePath, Object obj) => { if (obj == null) { return; } GameObject SpecialObject = Object.Instantiate(obj as GameObject); Transform mObject = DetachChildren(SpecialObject); mLoadingObject = mObject.gameObject; UIPanel[] panels = mLoadingObject.GetComponentsInChildren<UIPanel>(); for (int i = 0; i < panels.Length; i++) { panels[i].depth += LoadingDepth; } mObject.transform.SetParent(mWindowRoot.transform); mObject.transform.localScale = Vector3.one; Dialog_Loading loading = mObject.GetComponent<Dialog_Loading>(); if (loading != null) { loading.SetLoadingType(type, postion, makeState); } mLoadingObject.SetActive(state); }; ResourcesManager.GetInstance().AddResourceDownload(Dialog_Loading.DialogPathName, done); } /// <summary> /// 打开一些特殊处理的窗口(如特效) /// </summary> /// <param name="pathName"></param> /// <param name="callback"></param> public void OpenSpecial(string varPathName, DoneSpecialObject callback = null) { varPathName = varPathName.ToLower(); //如果已打开窗口则直接返回 if (mSpecial.ContainsKey(varPathName)) { GameObject obj = null; mSpecial.TryGetValue(varPathName, out obj); if (callback != null) { callback(obj); } return; } DownloadCallback done = (string filePath, Object obj) => { if (obj == null) { return; } GameObject SpecialObject = Object.Instantiate(obj as GameObject); UICamera c = SpecialObject.GetComponentInChildren<UICamera>(); Transform mObject = null; if (c == null) { mObject = SpecialObject.transform; } else { mObject = DetachChildren(SpecialObject); } mObject.transform.SetParent(mWindowRoot.transform); mSpecial[filePath] = mObject.gameObject; if (callback != null) { callback(mObject.gameObject); } }; ResourcesManager.GetInstance().AddResourceDownload(varPathName, done); } public void DestroySpecial(string pathName) { if (mSpecial.ContainsKey(pathName)) { GameObject obj = mSpecial[pathName]; if (obj != null) { Object.Destroy(obj); } } } /// <summary> /// 打开一个窗口 路径以Resources下面的路径为标准 /// </summary> /// <param name="varPathName"></param> public void OpenInWindow(string varPathName, DoneOpenWindow varCallback = null) { OpenInWindow(varPathName, true, varCallback); } public void OpenInWindow(string varPathName, bool isOpenMake, DoneOpenWindow varCallback = null) { //统一转小写 varPathName = varPathName.ToLower(); //如果已打开窗口则直接返回 if (mOpenWindow.ContainsKey(varPathName)) { GameObject obj = null; mOpenWindow.TryGetValue(varPathName, out obj); if (varCallback != null) { varCallback(obj); } return; } mOpenWindow.Add(varPathName, null); mOpenWindowKey.Add(varPathName); DownloadCallback callback = (string vPathName, Object vObject) => { GameObject source = vObject as GameObject; if (source == null) { mOpenWindow.Remove(vPathName); mOpenWindowKey.Remove(varPathName); return; } GameObject windowObject = Object.Instantiate(source); UICamera c = windowObject.GetComponentInChildren<UICamera>(); Transform mObject = null; if (c == null) { mObject = windowObject.transform; } else { mObject = DetachChildren(windowObject); } NGUITools.SetChildLayer(windowObject.transform, LayerMask.NameToLayer(Layer.UI.ToString())); mObject.SetParent(mWindowRoot.transform); mOpenWindow[vPathName] = mObject.gameObject; windowObject.transform.localPosition = Vector2.zero; windowObject.transform.localScale = Vector3.one; if (!isOpenMake) { mMakePanle.SetActive(false); } else { SetWindowDepth(mObject); } if (varCallback != null) { varCallback(mObject.gameObject); } }; ResourcesManager.GetInstance().AddResourceDownload(varPathName, callback); } /// <summary> /// 设置新窗口层级 /// </summary> private void SetWindowDepth(Transform varWindow) { //如果有Dialog打开并且激活则直接return if (IsDialogOpen()) { return; } bool varWindowIsNull = false; if (varWindow == null) { varWindowIsNull = true; } int effectiveWindow = 0; //获取有效的窗口 for (int i = 0; i < mOpenWindowKey.Count; i++) { GameObject window = mOpenWindow[mOpenWindowKey[i]]; if (window == null) { continue; } if (varWindowIsNull) { if (mOpenWindowKey.Count - 1 == i) { varWindow = window.transform; } } if (window.activeSelf) { effectiveWindow++; } } int depth = effectiveWindow * IntervalDepth; if (depth > MaxWindowDepth) { } if (varWindow == null) { mMakePanle.SetActive(false); return; } UIPanel[] panles = varWindow.GetComponentsInChildren<UIPanel>(); for (int i = 0; i < panles.Length; i++) { if (effectiveWindow <= 1) { panles[i].depth = (panles[i].depth % IntervalDepth) + depth; } else { if (varWindowIsNull) { panles[i].depth = (panles[i].depth % IntervalDepth) + depth; continue; } panles[i].depth += depth; } } if (effectiveWindow > 1) { UIPanel tmp = mMakePanle.GetComponent<UIPanel>(); tmp.depth = depth - 1; mMakePanle.SetActive(true); } else { mMakePanle.SetActive(false); } } /// <summary> /// 获取是否有Dilog窗口打开并且激活 /// </summary> public bool IsDialogOpen() { if (mOpenDialog.Count == 0) { return false; } foreach (KeyValuePair<string, GameObject> item in mOpenDialog) { if (item.Value != null && item.Value.activeSelf) { return true; } } return false; } private Transform DetachChildren(GameObject obj) { Transform varWindow = null; for (int i = 0; i < obj.transform.childCount; i++) { Transform tmp = obj.transform.GetChild(i); if (tmp.childCount >= 1) { varWindow = tmp; break; } } if (varWindow != null && varWindow.parent != null) { varWindow.parent = null; } Object.DestroyObject(obj); return varWindow; } /// <summary> /// 用户协议弹窗 /// </summary> /// <param name="context"></param> /// <param name="callback"></param> public void OpenUserHttpsDialog(string context, ReturnResultCallback callback) { DoneLoadDialog doneLoad = (GameObject dialog) => { if (dialog == null) { return; } Dialog_UserHttps https = dialog.GetComponent<Dialog_UserHttps>(); if (https != null) { https.SetContext(context); https.pCallback = callback; } }; OpenDialog(Dialog_UserHttps.DialogPathName, doneLoad); } /// <summary> /// 确定弹窗 /// </summary> /// <param name="context"></param> public void OpenSureDialog(string context, ReturnResultCallback callback = null, Dialog_Sure.AtlasSpriteName atlasName = Dialog_Sure.AtlasSpriteName.none) { DoneLoadDialog doneLoad = (GameObject dialog) => { if (dialog == null) { return; } Dialog_Sure sure = dialog.GetComponent<Dialog_Sure>(); if (sure != null) { sure.SetContext(context); sure.pCallback = callback; if (atlasName != Dialog_Sure.AtlasSpriteName.none) { sure.SetTitle(atlasName); } } }; OpenDialog(Dialog_Sure.DialogPathName, doneLoad); } /// <summary> /// 二次确认弹窗 /// </summary> /// <param name="context"></param> /// <param name="callback"></param> public void OpenConfirmationDialog(string context, ReturnResultCallback callback = null, Dialog_Confirmation.AtlasSpriteName atlasName = Dialog_Confirmation.AtlasSpriteName.none) { DoneLoadDialog doneLoad = (GameObject dialog) => { if (dialog == null) { return; } Dialog_Confirmation sure = dialog.GetComponent<Dialog_Confirmation>(); if (sure != null) { sure.SetContext(context); sure.pCallback = callback; sure.SetTitle(atlasName); } }; OpenDialog(Dialog_Confirmation.DialogPathName, doneLoad); } /// <summary> /// 公告 /// </summary> /// <param name="context"></param> /// <param name="callback"></param> public void OpenNoticeDialog(string context, ReturnResultCallback callback = null) { DoneLoadDialog doneLoad = (GameObject dialog) => { if (dialog == null) { return; } Dialog_Notice notice = dialog.GetComponent<Dialog_Notice>(); if (notice != null) { notice.SetContext(context); notice.pCallback = callback; } }; OpenDialog(Dialog_Notice.DialogPathName, doneLoad); } /// <summary> /// 公告 /// </summary> /// <param name="context"></param> /// <param name="callback"></param> public void OpenFirstTipDialog(string context, ReturnResultCallback callback = null) { DoneLoadDialog doneLoad = (GameObject dialog) => { if (dialog == null) { return; } Dialog_FirstTip notice = dialog.GetComponent<Dialog_FirstTip>(); if (notice != null) { notice.SetContext(context); notice.pCallback = callback; } }; OpenDialog(Dialog_FirstTip.DialogPathName, doneLoad); } private void OpenDialog(string pathName, DoneLoadDialog callback) { pathName = pathName.ToLower(); if (IsDialogOpen()) { CloseAllDialog(); } if (mOpenDialog.ContainsKey(pathName)) { GameObject obj = mOpenDialog[pathName]; if (obj != null) { SetDialogDepth(obj.transform); obj.SetActive(true); } callback(obj); return; } mOpenDialog.Add(pathName, null); DownloadCallback doneCallback = (string filePath, Object obj) => { if (obj == null) { return; } GameObject dialog = Object.Instantiate(obj as GameObject); Transform dialogWindow = DetachChildren(dialog); if (dialogWindow == null) { } mOpenDialog[pathName] = dialogWindow.gameObject; dialogWindow.SetParent(mDialogRoot.transform); dialogWindow.localPosition = Vector3.zero; dialogWindow.localScale = Vector3.one; SetDialogDepth(dialogWindow); if (callback != null) { callback(dialogWindow.gameObject); } }; ResourcesManager.GetInstance().AddResourceDownload(pathName, doneCallback); } private void SetDialogDepth(Transform dialogWindow) { if (dialogWindow == null) { mMakePanle.SetActive(false); SetWindowDepth(null); return; } UIPanel[] panels = dialogWindow.GetComponentsInChildren<UIPanel>(); int depth = MaxWindowDepth + 5; for (int i = 0; i < panels.Length; i++) { panels[i].depth += depth; } UIPanel makePanle = mMakePanle.GetComponent<UIPanel>(); if (makePanle != null) { makePanle.depth = depth - 5; mMakePanle.SetActive(true); } } public void CloseDialog(string pathName) { string name = pathName.ToLower(); if (!mOpenDialog.ContainsKey(name)) { return; } GameObject obj = mOpenDialog[name]; if (obj != null) { obj.SetActive(false); SetDialogDepth(null); } } public void CloseAllDialog() { SortedDictionary<string, GameObject>.Enumerator dialogEnum = mOpenDialog.GetEnumerator(); for (int i = 0; i < mOpenDialog.Count; i++) { dialogEnum.MoveNext(); GameObject obj = dialogEnum.Current.Value; if (obj != null) { obj.SetActive(false); } } SetDialogDepth(null); } /// <summary> /// 销毁一个窗口 /// </summary> /// <param name="varPathName"></param> public void DestroyWindow(string varPathName, bool isOpenMake) { varPathName = varPathName.ToLower(); if (mOpenWindow.ContainsKey(varPathName)) { GameObject obj = mOpenWindow[varPathName]; if (obj != null) { Object.Destroy(obj); } mOpenWindow.Remove(varPathName); mOpenWindowKey.Remove(varPathName); SetWindowDepth(null); } } public void DestroyWindow(string varPathName) { DestroyWindow(varPathName, false); } public void DestroyWindowAll() { SortedDictionary<string, GameObject>.Enumerator windowEnum = mOpenWindow.GetEnumerator(); for (int i = 0; i < mOpenWindow.Count; i++) { windowEnum.MoveNext(); GameObject obj = windowEnum.Current.Value; if (obj != null) { Object.Destroy(obj); } } mOpenWindow.Clear(); mOpenWindowKey.Clear(); SetWindowDepth(null); } public void DestroyWindowByObj(GameObject target) { SortedDictionary<string, GameObject>.Enumerator windowEnum = mOpenWindow.GetEnumerator(); for (int i = 0; i < mOpenWindow.Count; i++) { windowEnum.MoveNext(); GameObject obj = windowEnum.Current.Value; if (obj == target) { Object.Destroy(target); mOpenWindow.Remove(windowEnum.Current.Key); mOpenWindowKey.Remove(windowEnum.Current.Key); } } SetWindowDepth(null); } /// <summary> /// 判断窗口是否被打开状态 /// </summary> /// <param name="pathName"></param> public bool WindowIsActive(string pathName) { string key = pathName.ToLower(); if (mOpenWindow.ContainsKey(key)) { GameObject obj = null; if (mOpenWindow.TryGetValue(key , out obj)) { if (obj != null && obj.activeInHierarchy) { return true; } } } return false; } /// <summary> /// 删除除自己之外的窗口 /// </summary> /// <param name="target"></param> public void DestroyWindowAllExceptObj(string pathName) { string key = pathName.ToLower(); GameObject target = null; if (mOpenWindow.ContainsKey(key)) { target = mOpenWindow[key]; } if (key != string.Empty && target != null) { mOpenWindow.Remove(key); SortedDictionary<string, GameObject>.Enumerator windowEnum = mOpenWindow.GetEnumerator(); for (int i = 0; i < mOpenWindow.Count; i++) { windowEnum.MoveNext(); GameObject obj = windowEnum.Current.Value; if (obj != null) { Object.Destroy(obj); } } mOpenWindow.Clear(); mOpenWindowKey.Clear(); mOpenWindow.Add(key, target); mOpenWindowKey.Add(key); } SetWindowDepth(null); } /// <summary> /// 更改窗口状态 /// </summary> /// <param name="varPathName"></param> /// <param name="varState"></param> public void SetWindowState(string varPathName, bool varState) { if (!mOpenWindow.ContainsKey(varPathName)) { return; } mOpenWindow[varPathName].SetActive(varState); }}
//一个使用示例public class Dialog_Confirmation : MonoBehaviour{ public enum AtlasSpriteName { none, atlas_gonggao, atlas_jiesanfangjian, atlas_fanhuidating, atlas_gengxintishi } public static string DialogPathName { get { return "ui/ui_dialog/twoconfirmation"; } } private ReturnResultCallback mCallback; public ReturnResultCallback pCallback { set { mCallback = value; } } Transform mTranform; void Awake() { mTranform = transform; GameTools.RegisterButton(mTranform, "Button/sure", OnSure); GameTools.RegisterButton(mTranform, "Button/cancle", OnCancle); } public void SetContext(string text) { GameTools.SetLabelText(mTranform, "context", text); } private void OnCancle(GameObject go) { if (mCallback != null) { mCallback(ResultDialog.No); } WindowManager.GetInstance().CloseDialog(DialogPathName); } private void OnSure(GameObject go) { if (mCallback != null) { mCallback(ResultDialog.Yes); } WindowManager.GetInstance().CloseDialog(DialogPathName); } public void SetTitle(AtlasSpriteName spriteName) { UISprite sprite = GameTools.GetComponent<UISprite>(mTranform, "Bg/Title"); if (spriteName== AtlasSpriteName.none) { sprite.gameObject.SetActive(false); return; } if (sprite != null) { sprite.spriteName = spriteName.ToString(); sprite.MakePixelPerfect(); } sprite.gameObject.SetActive(true); }}
阅读全文
0 0
- 项目用到的窗口管理类
- 项目管理中常用到的简便工具
- 一个常常用到的管理类
- android项目用到的公共类方法
- 项目用到的一个资源管理类
- 项目用到的sql
- 项目用到的技术
- 项目用到的开源库
- 项目用到的技术
- 封装窗口类用到的两个函数的效果验证
- Minigui学习--窗口用到的一些函数
- 项目用到的自定义标签
- 项目笔记用到的链接
- 项目用到的分支总汇
- 自己项目用到的gradle
- 开源中国客户端Activity管理类(可直接用到项目中)
- java 项目中经常用到的工具类
- 开发Android项目经常用到的四个工具类
- memcached完全剖析–1. memcached的基础
- Docker入门笔记
- Densely Connected Convolutional Networks
- HDU-6063-RXD and math-
- 安卓恶意锁屏APP分析
- 项目用到的窗口管理类
- 动态代理模式
- 五、迭代器--迭代器类型详述
- 在ssh框架下实现多选传值到后台
- unique函数去除重复行不排序
- mysql数据表常用操作命令
- datetimepicker用法总结
- (2017多校训练第七场)HDU
- 2017多校训练Contest2: 1009 TrickGCD hdu6053