UIView.cs 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
  1. using ET;
  2. using FairyGUI;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using UnityEngine;
  6. namespace GFGGame
  7. {
  8. /// <summary>
  9. /// 视图基类,界面不可以直接继承
  10. /// </summary>
  11. public class UIView : IUIView
  12. {
  13. private string _descFilePath;
  14. private EnumViewAnimationType _viewAnimationType = EnumViewAnimationType.None;
  15. /// <summary>
  16. /// 打开视图传递的参数
  17. /// </summary>
  18. public object viewData { get; set; }
  19. public string viewName { get; set; }
  20. /// <summary>
  21. /// 设置视图组件
  22. /// </summary>
  23. public virtual GComponent viewCom { get; set; }
  24. /// <summary>
  25. /// 设置是否全屏自适应
  26. /// </summary>
  27. public bool isfullScreen { get; set; }
  28. /// <summary>
  29. /// 设置是否可以返回界面
  30. /// </summary>
  31. public bool isReturnView { get; set; }
  32. /// <summary>
  33. /// 设置返回界面是否刷新
  34. /// </summary>
  35. public bool backRefresh { get; set; }
  36. /// <summary>
  37. /// FairyGUI包名
  38. /// </summary>
  39. public string packageName
  40. {
  41. get
  42. {
  43. return _descFilePath;
  44. }
  45. set
  46. {
  47. _descFilePath = ResPathUtil.GetUIPackagePath(value);
  48. GFGUIPackage.AddPackage(_descFilePath);
  49. }
  50. }
  51. /// <summary>
  52. /// 界面关闭时间
  53. /// </summary>
  54. /// <value></value>
  55. public long closeTime { get; set; }
  56. /// <summary>
  57. /// 是否显示中
  58. /// </summary>
  59. public bool isShowing
  60. {
  61. get { return viewCom != null && viewCom.onStage; }
  62. }
  63. /// <summary>
  64. /// 设置视图显示和隐藏的动画类型
  65. /// </summary>
  66. protected EnumViewAnimationType viewAnimationType
  67. {
  68. set
  69. {
  70. _viewAnimationType = value;
  71. }
  72. }
  73. public UIView()
  74. {
  75. //
  76. Init();
  77. OnInit();
  78. if (viewCom != null)
  79. {
  80. viewCom.onAddedToStage.Add(__addedToStage);
  81. viewCom.onRemovedFromStage.Add(__removeFromStage);
  82. }
  83. }
  84. public virtual void Dispose()
  85. {
  86. if (viewCom != null)
  87. {
  88. viewCom.RemoveFromParent();
  89. viewCom.Dispose();
  90. viewCom = null;
  91. }
  92. if (_descFilePath != null)
  93. {
  94. if (packageName != ResPathUtil.GetUIPackagePath("CommonGame") && packageName != ResPathUtil.GetUIPackagePath("Common") && packageName != ResPathUtil.GetUIPackagePath("Main"))
  95. {
  96. GFGUIPackage.ReleasePackage(_descFilePath);
  97. } //这几个包不释放
  98. }
  99. _descFilePath = null;
  100. viewData = null;
  101. ViewManager.ClearUIView(viewName);
  102. }
  103. virtual protected void Init()
  104. {
  105. }
  106. virtual protected void OnInit()
  107. {
  108. }
  109. /// <summary>
  110. /// 界面打开状态刷新界面
  111. /// </summary>
  112. virtual public void Refresh()
  113. {
  114. object temp = viewData;
  115. this.OnHide();
  116. this.viewData = temp;
  117. this.BringToFront();
  118. this.OnShown();
  119. }
  120. public virtual void Show()
  121. {
  122. }
  123. virtual protected void BringToFront()
  124. {
  125. }
  126. public virtual void Hide()
  127. {
  128. // UIPackageManager.Instance.RemovePackageView(_descFilePath, viewName);
  129. // UIPackageManager.Instance.AddCloseTime(_descFilePath);
  130. closeTime = TimeHelper.ClientNowSeconds();
  131. DoHideAnimation();
  132. ViewManager.HideWin(this.viewName);
  133. EventAgent.DispatchEvent(ConstMessage.VIEW_CLOSED);
  134. }
  135. virtual protected void OnShown()
  136. {
  137. if (isfullScreen)
  138. {
  139. MakeFullScreen(viewCom);
  140. }
  141. AddEventListener();
  142. // if (GuideController.IsGuide())
  143. // {
  144. // Timers.inst.AddUpdate(UpdateToCheckGuide);
  145. // }
  146. }
  147. virtual protected void OnHide()
  148. {
  149. viewData = null;
  150. RemoveEventListener();
  151. // Timers.inst.Remove(UpdateToCheckGuide);
  152. TryCompleteGuide();
  153. }
  154. virtual protected void RemoveEventListener()
  155. {
  156. }
  157. virtual protected void AddEventListener()
  158. {
  159. }
  160. virtual protected void UpdateToCheckGuide(object param)
  161. {
  162. }
  163. virtual protected void TryCompleteGuide()
  164. {
  165. }
  166. protected virtual void DoShowAnimation()
  167. {
  168. OnShown();
  169. switch (_viewAnimationType)
  170. {
  171. case EnumViewAnimationType.ZOOM_CENTER:
  172. ViewAnimationFactory.ZoomInCenter(this.viewCom);
  173. break;
  174. default:
  175. break;
  176. }
  177. }
  178. protected virtual void DoHideAnimation()
  179. {
  180. switch (_viewAnimationType)
  181. {
  182. case EnumViewAnimationType.ZOOM_CENTER:
  183. ViewAnimationFactory.ZoomOutCenter(this.viewCom, this.OnDoHideAnimationCompleted);
  184. break;
  185. default:
  186. this.OnDoHideAnimationCompleted();
  187. break;
  188. }
  189. }
  190. protected virtual void OnDoHideAnimationCompleted()
  191. {
  192. if (this.viewCom != null)
  193. {
  194. this.viewCom.RemoveFromParent();
  195. }
  196. }
  197. private void MakeFullScreen(GObject ui)
  198. {
  199. MakeUIFullScreen(ui);
  200. ui.AddRelation(GRoot.inst, RelationType.Size);
  201. }
  202. private bool _adaptFinished = false;
  203. public void MakeUIFullScreen(GObject ui)
  204. {
  205. if (_adaptFinished)
  206. {
  207. return;
  208. }
  209. //这里做了最大宽度适配
  210. float targetWidth;
  211. float maxAspectRatio = 1080 * 1.0f / 1920;
  212. if (Screen.width * 1.0f / Screen.height > maxAspectRatio)
  213. {
  214. targetWidth = GRoot.inst.height * maxAspectRatio;
  215. ui.Center();
  216. }
  217. else
  218. {
  219. targetWidth = GRoot.inst.width;
  220. }
  221. GameObject uiObj = viewCom.displayObject.gameObject;
  222. List<GObject> listTopImg = new List<GObject>();
  223. float offsetY = ViewGlobal.GetRealTopOffset();
  224. // 处理全屏显示的背景图/遮罩
  225. List<Transform> list = ViewGlobal.FindAllGLoaderInTrans(uiObj.transform);
  226. for (int i = 0; i < list.Count; i++)
  227. {
  228. GameObject bg = list[i].gameObject;
  229. DisplayObjectInfo bgInfo = bg.GetComponent<DisplayObjectInfo>();
  230. GObject obj = GRoot.inst.DisplayObjectToGObject(bgInfo.displayObject);
  231. if (obj != null)
  232. {
  233. if (ViewGlobal.IsFullScreenPic(obj.name) && obj.height >= 1920)
  234. {
  235. obj.AddRelation(ui, RelationType.Center_Center);
  236. obj.SetSize(1080, 2400);
  237. obj.SetXY(obj.x, obj.y - offsetY / 2);
  238. }
  239. else if (obj.name.Contains("Top_img"))
  240. {
  241. listTopImg.Add(obj);
  242. }
  243. }
  244. }
  245. // 保存未适配时,不需要改变位置的UI的信息(适配部分存在拉伸效果的UI)
  246. ui.SetSize(targetWidth, GRoot.inst.height);
  247. List<float> heightList = new List<float>();
  248. for (int i = 0; i < listTopImg.Count; i++)
  249. {
  250. listTopImg[i].RemoveRelation(ui, RelationType.Center_Center);
  251. heightList.Add(listTopImg[i].height);
  252. }
  253. // UI整体高度缩放
  254. ui.SetSize(targetWidth, ViewGlobal.GetUIHeight());
  255. // UI整体下移动
  256. ui.SetXY(ui.x, offsetY);
  257. // 还原不需要适配的UI
  258. for (int i = 0; i < listTopImg.Count; i++)
  259. {
  260. listTopImg[i].SetSize(listTopImg[i].width, heightList[i]);
  261. listTopImg[i].SetXY(listTopImg[i].x, listTopImg[i].y - offsetY);
  262. }
  263. _adaptFinished = true;
  264. }
  265. void __addedToStage()
  266. {
  267. DoShowAnimation();
  268. }
  269. void __removeFromStage()
  270. {
  271. OnHide();
  272. if (_descFilePath == ResPathUtil.GetUIPackagePath("Login") || _descFilePath == ResPathUtil.GetUIPackagePath("Loading") || _descFilePath == ResPathUtil.GetUIPackagePath("CreateRole"))//这几个界面关闭后立即释放
  273. {
  274. Dispose();
  275. }
  276. }
  277. }
  278. }