//弹出一个指定窗口 public void Popup(ViewBaseView view) { if (view == null) { return; } bool err = true; for (int i = views.Count - 1; i >= 0; --i) { if (views[i].GetInstanceID() == view.GetInstanceID()) { views.RemoveAt(i); PopupSingleView(view); err = false; break; } } if (err) { UtilityLog.LogError(string.Format("Popup view failed. Can not find {0} in {1}", view.config.viewName, UIViewLayer)); return; } //刷新最大order RefreshTopOrder(); }
//长期缓存 private void CacheView(ViewBaseView view) { if (!screenUICache.Contains(view)) { screenUICache.Add(view); } }
//弹出单个界面 private void PopupSingleView(ViewBaseView view) { if (view != null) { view.ViewOrder = 0; view.layerController = null; view.OnPopup(); } }
//压入单个界面 private void PushSingleView(ViewBaseView view) { if (view != null) { view.layerController = this; view.OnPush(); view.ViewOrder = topOrder; } }
//释放界面 private void ReleaseView(ViewBaseView view) { if (view != null) { view.OnExit(); #if UNITY_EDITOR Destroy(view.gameObject); #endif } }
//放入层级中 private void PushViewToLayer(ViewBaseView view, params object[] args) { if (view != null) { //设置参数 // view.SetArguments(args); //添加到相应的列表 viewList.Add(view); //压入对应的层中 UIControllerViews[view.config.viewLayer].Push(view); } }
//临时缓存 private void TempCacheView(ViewBaseView view) { //没有设置池深度,直接释放 if (screenUITempCacheDepth <= 0) { ReleaseView(view); } //放入临时池中 screenUITempCache.Add(view); //整理临时缓存池 TidyTempCache(); }
//展示界面 public void ShowView(UIViewName viewName, params object[] args) { //获取界面配置 UIViewConfig config = GetConfig(viewName); if (config == null) { return; } ViewBaseView view = null; if (config.unique) { //判断是否打开了 for (int i = 0; i < viewList.Count; ++i) { if (viewList[i].config.viewName == viewName) { view = viewList[i]; break; } } //判断是否已被打开,没有打开个新的 if (view != null) { if (view.layerController == null) { UtilityLog.LogError(string.Format("Show view error: {0}, not layer", viewName)); return; } //设置参数,重新放入窗口层级控制器 // view.SetArguments(args); view.layerController.Push(view); } else { ShowViewFromCacheOrCreateNew(config, args); } } else { ShowViewFromCacheOrCreateNew(config, args); } //刷新显示、隐藏状态 UpdateViewHideState(); }
//打开一个新的 private ViewBaseView ShowNewView(UIViewConfig config) { if (!UIControllerViews.ContainsKey(config.viewLayer)) { UtilityLog.LogError("Show new view failed. Layer error."); return(null); } //加载 ViewBaseView view = CreateUIView(config); if (view) { //创建完毕,初始化 view.Init(); view.transform.SetParent(UIControllerViews[config.viewLayer].transform, false); view.GetComponent <RectTransform>().Normalize(); } return(view); }
//先尝试从缓存中打开,如果失败则打开一个新的 private void ShowViewFromCacheOrCreateNew(UIViewConfig config, params object[] args) { //先尝试从缓存区中读取 ViewBaseView view = GetViewFromCache(config); //缓存区内没有,打开新的 if (view == null) { view = ShowNewView(config); } if (view != null) { PushViewToLayer(view, args); } else { UtilityLog.LogError(string.Format("Show view failed -> {0}", config.viewName)); } }
//根据指定界面 public void HideView(ViewBaseView view) { if (view == null) { return; } //在窗口栈中的界面都可以关闭 if (view.layerController != null) { viewList.Remove(view); view.layerController.Popup(view); SchemeViewCache(view); UpdateViewHideState(); } else { UtilityLog.LogError(string.Format("Attamp to hide a error view {0}, not in controller.", view.config.viewName)); } }
//从池中获取界面 private ViewBaseView GetViewFromCache(UIViewConfig config) { if (config == null) { return(null); } ViewBaseView view = null; List <ViewBaseView> cache = null; switch (config.cacheScheme) { case UIViewCacheScheme.Cache: cache = screenUICache; break; case UIViewCacheScheme.TempCache: cache = screenUITempCache; break; default: break; } if (cache != null) { for (int i = 0; i < cache.Count; ++i) { if (cache[i].config.viewName == config.viewName) { view = cache[i]; //从缓冲区中移除 cache.RemoveAt(i); break; } } } return(view); }
//根据缓存类型处理界面 private void SchemeViewCache(ViewBaseView view) { if (view != null) { //根据缓存类型处理 switch (view.config.cacheScheme) { case UIViewCacheScheme.Cache: CacheView(view); break; case UIViewCacheScheme.TempCache: TempCacheView(view); break; case UIViewCacheScheme.AutoRemove: ReleaseView(view); break; default: break; } } }
//压入一个新的窗口(设置为最大order) public void Push(ViewBaseView view) { //判断是否本来就在这个队列中 if (view.layerController != null) { if (view.ViewOrder == topOrder) { return; } else { views.Remove(view); views.Add(view); topOrder += viewOrderStep; view.ViewOrder = topOrder; } } else { views.Add(view); topOrder += viewOrderStep; PushSingleView(view); } }