using ET;
using FairyGUI;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace GFGGame
{
///
/// 视图基类,界面不可以直接继承
///
public class UIView : IUIView
{
private string _descFilePath;
private EnumViewAnimationType _viewAnimationType = EnumViewAnimationType.None;
///
/// 打开视图传递的参数
///
public object viewData { get; set; }
public string viewName { get; set; }
///
/// 设置视图组件
///
public virtual GComponent viewCom { get; set; }
///
/// 设置是否全屏自适应
///
public bool isfullScreen { get; set; }
///
/// 设置是否可以返回界面
///
public bool isReturnView { get; set; }
///
/// 设置是否可以返回窗口
///
public bool isReturnWindow { get; set; }
///
/// 设置返回界面是否刷新
///
public bool backRefresh { get; set; }
///
/// FairyGUI包名
///
public string packageName
{
get
{
return _descFilePath;
}
set
{
_descFilePath = ResPathUtil.GetUIPackagePath(value);
GFGUIPackage.AddPackage(_descFilePath);
}
}
///
/// 界面关闭时间
///
///
public long closeTime { get; set; }
///
/// 是否显示中
///
public bool isShowing
{
get { return viewCom != null && viewCom.onStage; }
}
///
/// 设置视图显示和隐藏的动画类型
///
protected EnumViewAnimationType viewAnimationType
{
set
{
_viewAnimationType = value;
}
}
public UIView()
{
//
Init();
OnInit();
if (viewCom != null)
{
viewCom.onAddedToStage.Add(__addedToStage);
viewCom.onRemovedFromStage.Add(__removeFromStage);
}
}
public virtual void Dispose()
{
if (viewCom != null)
{
viewCom.RemoveFromParent();
viewCom.Dispose();
viewCom = null;
}
if (_descFilePath != null)
{
if (packageName != ResPathUtil.GetUIPackagePath("CommonGame") && packageName != ResPathUtil.GetUIPackagePath("Common") && packageName != ResPathUtil.GetUIPackagePath("Main"))
{
GFGUIPackage.ReleasePackage(_descFilePath);
} //这几个包不释放
}
_descFilePath = null;
viewData = null;
ViewManager.ClearUIView(viewName);
}
virtual protected void Init()
{
}
virtual protected void OnInit()
{
}
///
/// 界面打开状态刷新界面
///
virtual public void Refresh()
{
object temp = viewData;
this.OnHide();
this.viewData = temp;
this.BringToFront();
this.OnShown();
}
public virtual void Show()
{
}
virtual protected void BringToFront()
{
}
public virtual void Hide()
{
// UIPackageManager.Instance.RemovePackageView(_descFilePath, viewName);
// UIPackageManager.Instance.AddCloseTime(_descFilePath);
closeTime = TimeHelper.ClientNowSeconds();
DoHideAnimation();
ViewManager.HideWin(this.viewName);
EventAgent.DispatchEvent(ConstMessage.VIEW_CLOSED);
}
virtual protected void OnShown()
{
if (isfullScreen)
{
MakeFullScreen(viewCom);
}
AddEventListener();
// if (GuideController.IsGuide())
// {
// Timers.inst.AddUpdate(UpdateToCheckGuide);
// }
}
virtual protected void OnHide()
{
viewData = null;
RemoveEventListener();
// Timers.inst.Remove(UpdateToCheckGuide);
TryCompleteGuide();
}
virtual protected void RemoveEventListener()
{
}
virtual protected void AddEventListener()
{
}
virtual protected void UpdateToCheckGuide(object param)
{
}
virtual protected void TryCompleteGuide()
{
}
protected virtual void DoShowAnimation()
{
OnShown();
switch (_viewAnimationType)
{
case EnumViewAnimationType.ZOOM_CENTER:
ViewAnimationFactory.ZoomInCenter(this.viewCom);
break;
default:
break;
}
}
protected virtual void DoHideAnimation()
{
switch (_viewAnimationType)
{
case EnumViewAnimationType.ZOOM_CENTER:
ViewAnimationFactory.ZoomOutCenter(this.viewCom, this.OnDoHideAnimationCompleted);
break;
default:
this.OnDoHideAnimationCompleted();
break;
}
}
protected virtual void OnDoHideAnimationCompleted()
{
if (this.viewCom != null)
{
this.viewCom.RemoveFromParent();
}
}
private void MakeFullScreen(GObject ui)
{
MakeUIFullScreen(ui);
ui.AddRelation(GRoot.inst, RelationType.Size);
}
private bool _adaptFinished = false;
public void MakeUIFullScreen(GObject ui)
{
if (_adaptFinished)
{
return;
}
//这里做了最大宽度适配
float targetWidth;
float maxAspectRatio = 1080 * 1.0f / 1920;
if (Screen.width * 1.0f / Screen.height > maxAspectRatio)
{
targetWidth = GRoot.inst.height * maxAspectRatio;
ui.Center();
}
else
{
targetWidth = GRoot.inst.width;
}
GameObject uiObj = viewCom.displayObject.gameObject;
List listTopImg = new List();
float offsetY = ViewGlobal.GetRealTopOffset();
// 处理全屏显示的背景图/遮罩
List list = ViewGlobal.FindAllGLoaderInTrans(uiObj.transform);
for (int i = 0; i < list.Count; i++)
{
GameObject bg = list[i].gameObject;
DisplayObjectInfo bgInfo = bg.GetComponent();
GObject obj = GRoot.inst.DisplayObjectToGObject(bgInfo.displayObject);
if (obj != null)
{
if (ViewGlobal.IsFullScreenPic(obj.name) && obj.height >= 1920)
{
obj.AddRelation(ui, RelationType.Center_Center);
obj.SetSize(1080, 2400);
obj.SetXY(obj.x, obj.y - offsetY / 2);
}
else if (obj.name.Contains("Top_img"))
{
listTopImg.Add(obj);
}
}
}
// 保存未适配时,不需要改变位置的UI的信息(适配部分存在拉伸效果的UI)
ui.SetSize(targetWidth, GRoot.inst.height);
List heightList = new List();
for (int i = 0; i < listTopImg.Count; i++)
{
listTopImg[i].RemoveRelation(ui, RelationType.Center_Center);
heightList.Add(listTopImg[i].height);
}
// UI整体高度缩放
ui.SetSize(targetWidth, ViewGlobal.GetUIHeight());
// UI整体下移动
ui.SetXY(ui.x, offsetY);
// 还原不需要适配的UI
for (int i = 0; i < listTopImg.Count; i++)
{
listTopImg[i].SetSize(listTopImg[i].width, heightList[i] + offsetY * 2);
listTopImg[i].SetXY(listTopImg[i].x, listTopImg[i].y - offsetY);
}
_adaptFinished = true;
}
void __addedToStage()
{
DoShowAnimation();
}
void __removeFromStage()
{
OnHide();
if (_descFilePath == ResPathUtil.GetUIPackagePath("Login") || _descFilePath == ResPathUtil.GetUIPackagePath("Loading") || _descFilePath == ResPathUtil.GetUIPackagePath("CreateRole"))//这几个界面关闭后立即释放
{
Dispose();
}
}
}
}