511 lines
12 KiB
C#
511 lines
12 KiB
C#
|
|
/*
|
|||
|
|
********************************************************************************
|
|||
|
|
*Copyright(C),coolae.net
|
|||
|
|
*Author: chenbin
|
|||
|
|
*Version: 2.0
|
|||
|
|
*Date: 2017-01-09
|
|||
|
|
*Description: 页面基类
|
|||
|
|
*Others:
|
|||
|
|
*History:
|
|||
|
|
*********************************************************************************
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
using UnityEngine;
|
|||
|
|
using System.Collections;
|
|||
|
|
using System.Collections.Generic;
|
|||
|
|
|
|||
|
|
namespace Coolape
|
|||
|
|
{
|
|||
|
|
public abstract class CLPanelBase : CLBaseLua
|
|||
|
|
{
|
|||
|
|
// [HideInInspector]
|
|||
|
|
bool _isActive = false;
|
|||
|
|
|
|||
|
|
public bool isActive {
|
|||
|
|
get {
|
|||
|
|
return _isActive;
|
|||
|
|
}
|
|||
|
|
set {
|
|||
|
|
_isActive = value;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
UIPanel _panel = null;
|
|||
|
|
|
|||
|
|
public UIPanel panel {
|
|||
|
|
get {
|
|||
|
|
if (_panel == null) {
|
|||
|
|
_panel = gameObject.GetComponent<UIPanel> ();
|
|||
|
|
if (_panel == null) {
|
|||
|
|
_panel = gameObject.AddComponent<UIPanel> ();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return _panel;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public bool isNeedBackplate = true;
|
|||
|
|
//是否需要遮罩
|
|||
|
|
public bool destroyWhenHide = false;
|
|||
|
|
public bool isNeedResetAtlase = true;
|
|||
|
|
[HideInInspector]
|
|||
|
|
public bool isNeedMask4Init = false;
|
|||
|
|
[HideInInspector]
|
|||
|
|
public bool isNeedMask4InitOnlyOnce = true;
|
|||
|
|
public bool isHideWithEffect = true;
|
|||
|
|
public bool isRefeshContentWhenEffectFinish = false;
|
|||
|
|
public Transform EffectRoot;
|
|||
|
|
|
|||
|
|
static int _destoryDelaySec = 5;
|
|||
|
|
|
|||
|
|
public static int destoryDelaySec {
|
|||
|
|
get {
|
|||
|
|
return _destoryDelaySec;
|
|||
|
|
}
|
|||
|
|
set {
|
|||
|
|
_destoryDelaySec = value;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
//特效root节点
|
|||
|
|
public enum EffectType
|
|||
|
|
{
|
|||
|
|
synchronized,
|
|||
|
|
//同步执行
|
|||
|
|
ordered,
|
|||
|
|
//顺序执行
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public EffectType effectType = EffectType.ordered;
|
|||
|
|
//特效类型
|
|||
|
|
public List<UITweener> EffectList = new List<UITweener> ();
|
|||
|
|
|
|||
|
|
static public int SortByName (UITweener a, UITweener b)
|
|||
|
|
{
|
|||
|
|
return string.Compare (a.name, b.name);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool isFinishStart = false;
|
|||
|
|
|
|||
|
|
public virtual void Start ()
|
|||
|
|
{
|
|||
|
|
if (isFinishStart)
|
|||
|
|
return;
|
|||
|
|
|
|||
|
|
getSubPanelsDepth ();
|
|||
|
|
UITweener[] tws = null;
|
|||
|
|
if (EffectRoot != null) {
|
|||
|
|
tws = EffectRoot.GetComponents<UITweener> ();
|
|||
|
|
sortTweeners (tws);
|
|||
|
|
for (int j = 0; j < tws.Length; j++) {
|
|||
|
|
if (tws [j] != null) {
|
|||
|
|
tws [j].ResetToBeginning ();
|
|||
|
|
tws [j].enabled = false;
|
|||
|
|
EffectList.Add (tws [j]);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
for (int i = 0; i < EffectRoot.childCount; i++) {
|
|||
|
|
tws = EffectRoot.GetChild (i).GetComponents<UITweener> ();
|
|||
|
|
sortTweeners (tws);
|
|||
|
|
for (int j = 0; j < tws.Length; j++) {
|
|||
|
|
if (tws [j] != null) {
|
|||
|
|
tws [j].ResetToBeginning ();
|
|||
|
|
tws [j].enabled = false;
|
|||
|
|
EffectList.Add (tws [j]);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
EffectList.Sort (SortByName);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
for (int i = EffectList.Count - 1; i >= 0; i--) {
|
|||
|
|
if (EffectList [i] == null) {
|
|||
|
|
EffectList.RemoveAt (i);
|
|||
|
|
} else {
|
|||
|
|
EffectList [i].ResetToBeginning ();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
isFinishStart = true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 冒泡排序法1
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="list"></param>
|
|||
|
|
public void sortTweeners (UITweener[] list)
|
|||
|
|
{
|
|||
|
|
UITweener temp = null;
|
|||
|
|
for (int i = 0; i < list.Length; i++) {
|
|||
|
|
for (int j = i; j < list.Length; j++) {
|
|||
|
|
if (list [i].exeOrder < list [j].exeOrder) {
|
|||
|
|
temp = list [i];
|
|||
|
|
list [i] = list [j];
|
|||
|
|
list [j] = temp;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
object finishShowingCallback = null;
|
|||
|
|
|
|||
|
|
public void showWithEffect (object finishShowingCallback = null)
|
|||
|
|
{
|
|||
|
|
this.finishShowingCallback = finishShowingCallback;
|
|||
|
|
isMoveOut = false;
|
|||
|
|
if (_mask4Hide != null)
|
|||
|
|
{
|
|||
|
|
NGUITools.SetActive(_mask4Hide, false);
|
|||
|
|
}
|
|||
|
|
if (!gameObject.activeInHierarchy || CLPanelManager.showingPanels [gameObject.name] == null) {
|
|||
|
|
NGUITools.SetActive (gameObject, true);
|
|||
|
|
// CLPanelManager.showingPanels [gameObject.name] = this;
|
|||
|
|
CLPanelManager.onShowPanel (this);
|
|||
|
|
}
|
|||
|
|
if (!isRefeshContentWhenEffectFinish) {
|
|||
|
|
callFinishShowingCallback ();
|
|||
|
|
}
|
|||
|
|
playEffect (true);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void callFinishShowingCallback ()
|
|||
|
|
{
|
|||
|
|
Utl.doCallback (finishShowingCallback, this);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// Plaies the effect.
|
|||
|
|
/// 播放ui特效
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name='forward'>
|
|||
|
|
/// Forward.
|
|||
|
|
/// </param>
|
|||
|
|
int EffectIndex = 0;
|
|||
|
|
bool EffectForward = true;
|
|||
|
|
|
|||
|
|
void playEffect (bool forward)
|
|||
|
|
{
|
|||
|
|
if (!isFinishStart) {
|
|||
|
|
Start ();
|
|||
|
|
}
|
|||
|
|
if (EffectList.Count <= 0) {
|
|||
|
|
if (!forward) {
|
|||
|
|
onFinishHideWithEffect ();
|
|||
|
|
}
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (forward) {
|
|||
|
|
EffectIndex = 0;
|
|||
|
|
} else {
|
|||
|
|
EffectIndex = EffectList.Count - 1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
EffectForward = forward;
|
|||
|
|
UITweener tw = null;
|
|||
|
|
|
|||
|
|
//说明有动画可以播放先用mask档一下
|
|||
|
|
if (!forward)
|
|||
|
|
{
|
|||
|
|
NGUITools.SetActive(mask4Hide, true);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (effectType == EffectType.synchronized) {
|
|||
|
|
for (int i = 0; i < EffectList.Count; i++) {
|
|||
|
|
tw = EffectList [i];
|
|||
|
|
if (forward && !isHideWithEffect) {
|
|||
|
|
tw.ResetToBeginning ();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (!forward && i == EffectList.Count - 1) {
|
|||
|
|
tw.callWhenFinished = "onFinishHideWithEffect";
|
|||
|
|
tw.eventReceiver = gameObject;
|
|||
|
|
} else {
|
|||
|
|
tw.callWhenFinished = "";
|
|||
|
|
}
|
|||
|
|
tw.Play (forward);
|
|||
|
|
}
|
|||
|
|
} else {
|
|||
|
|
tw = EffectList [EffectIndex];
|
|||
|
|
if (forward && !isHideWithEffect) {
|
|||
|
|
tw.ResetToBeginning ();
|
|||
|
|
}
|
|||
|
|
tw.eventReceiver = gameObject;
|
|||
|
|
tw.callWhenFinished = "onFinishEffect";
|
|||
|
|
tw.Play (forward);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void onFinishEffect (UITweener tweener)
|
|||
|
|
{
|
|||
|
|
tweener.callWhenFinished = "";
|
|||
|
|
tweener.eventReceiver = gameObject;
|
|||
|
|
|
|||
|
|
if (EffectForward) {
|
|||
|
|
EffectIndex++;
|
|||
|
|
} else {
|
|||
|
|
EffectIndex--;
|
|||
|
|
}
|
|||
|
|
if (EffectIndex < 0) {
|
|||
|
|
if (!EffectForward) {
|
|||
|
|
onFinishHideWithEffect ();
|
|||
|
|
}
|
|||
|
|
} else if (EffectIndex >= EffectList.Count) {
|
|||
|
|
if (isRefeshContentWhenEffectFinish) {
|
|||
|
|
callFinishShowingCallback ();
|
|||
|
|
}
|
|||
|
|
} else {
|
|||
|
|
UITweener tw = EffectList [EffectIndex];
|
|||
|
|
if (EffectForward && !isHideWithEffect) {
|
|||
|
|
tw.ResetToBeginning ();
|
|||
|
|
}
|
|||
|
|
tw.eventReceiver = gameObject;
|
|||
|
|
tw.callWhenFinished = "onFinishEffect";
|
|||
|
|
tw.Play (EffectForward);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
GameObject _mask4Hide = null;
|
|||
|
|
|
|||
|
|
public GameObject mask4Hide
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
if (_mask4Hide == null)
|
|||
|
|
{
|
|||
|
|
_mask4Hide = new GameObject("_____mask4Hide");
|
|||
|
|
_mask4Hide.transform.parent = transform;
|
|||
|
|
NGUITools.SetLayer(_mask4Hide, LayerMask.NameToLayer("UI"));
|
|||
|
|
UIWidget w = _mask4Hide.AddComponent<UIWidget>();
|
|||
|
|
w.depth = 180;
|
|||
|
|
w.SetAnchor(CLUIInit.self.gameObject, -2, -2, 2, 2);
|
|||
|
|
NGUITools.AddWidgetCollider(_mask4Hide);
|
|||
|
|
_mask4Hide.SetActive(false);
|
|||
|
|
}
|
|||
|
|
return _mask4Hide;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool isMoveOut = true;
|
|||
|
|
|
|||
|
|
public void hideWithEffect (bool moveOut = false)
|
|||
|
|
{
|
|||
|
|
isMoveOut = moveOut;
|
|||
|
|
if (isMoveOut) {
|
|||
|
|
Vector3 newPos = transform.localPosition;
|
|||
|
|
newPos.z = -250;
|
|||
|
|
transform.localPosition = newPos;
|
|||
|
|
playEffect (false);
|
|||
|
|
} else {
|
|||
|
|
onFinishHideWithEffect ();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void onFinishHideWithEffect (UITweener tweener = null)
|
|||
|
|
{
|
|||
|
|
isActive = false;
|
|||
|
|
CLPanelManager.onHidePanel (this);
|
|||
|
|
finishMoveOut ();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public virtual void finishMoveOut ()
|
|||
|
|
{
|
|||
|
|
Vector3 newPos = transform.localPosition;
|
|||
|
|
newPos.z = -200;
|
|||
|
|
transform.localPosition = newPos;
|
|||
|
|
NGUITools.SetActive (gameObject, false);
|
|||
|
|
if(_mask4Hide != null) {
|
|||
|
|
NGUITools.SetActive(mask4Hide, false);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void finishMoveIn (UITweener tween)
|
|||
|
|
{
|
|||
|
|
if (CLPanelManager.topPanel == this) {
|
|||
|
|
callFinishShowingCallback ();
|
|||
|
|
Vector3 newPos = transform.localPosition;
|
|||
|
|
newPos.z = -200;
|
|||
|
|
transform.localPosition = newPos;
|
|||
|
|
|
|||
|
|
if (effectType != EffectType.synchronized) {
|
|||
|
|
playEffect (true);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void destroySelf ()
|
|||
|
|
{
|
|||
|
|
if (isActive) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (!CLPanelManager.panelRetainLayer.Contains (this)) {
|
|||
|
|
//虽然页面是关掉了,但是如果还是在panelRetainLayer里,则不能删除,因为当关掉顶层页面时,这个页面还是会被打开
|
|||
|
|
CLPanelManager.destroyPanel (this, false);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public virtual void procNetwork (string fname, int succ, string msg, object pars)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public bool isFinishLoad {
|
|||
|
|
set;
|
|||
|
|
get;
|
|||
|
|
}
|
|||
|
|
public bool isFinishInit {
|
|||
|
|
set;
|
|||
|
|
get;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public virtual void init ()
|
|||
|
|
{
|
|||
|
|
getSubPanelsDepth ();
|
|||
|
|
_isActive = false;
|
|||
|
|
if (Application.isPlaying) {
|
|||
|
|
isFinishInit = true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// getSubPanelsDepth(); //此时页面还没有显示,通过 GetComponentsInChildren取不到
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool isFinishGetSubPanelsDepth = false;
|
|||
|
|
Hashtable subPanelsDepth = new Hashtable ();
|
|||
|
|
|
|||
|
|
public void getSubPanelsDepth ()
|
|||
|
|
{
|
|||
|
|
if (isFinishGetSubPanelsDepth) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
isFinishGetSubPanelsDepth = true;
|
|||
|
|
UIPanel[] ps = gameObject.GetComponentsInChildren<UIPanel> ();
|
|||
|
|
int count = ps.Length;
|
|||
|
|
for (int i = 0; i < count; i++) {
|
|||
|
|
if (ps [i] == panel)
|
|||
|
|
continue;
|
|||
|
|
subPanelsDepth [ps [i]] = ps [i].depth;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void setSubPanelsDepth ()
|
|||
|
|
{
|
|||
|
|
foreach (DictionaryEntry cell in subPanelsDepth) {
|
|||
|
|
((UIPanel)(cell.Key)).depth = ((int)(cell.Value)) + panel.depth;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public abstract void setData (object pars);
|
|||
|
|
|
|||
|
|
public virtual void show (object pars)
|
|||
|
|
{
|
|||
|
|
setData (pars);
|
|||
|
|
show ();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public virtual void onTopPanelChange (CLPanelBase p)
|
|||
|
|
{
|
|||
|
|
//TODO:
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public virtual void show ()
|
|||
|
|
{
|
|||
|
|
isActive = true;
|
|||
|
|
if (!isFinishInit) {
|
|||
|
|
init ();
|
|||
|
|
}
|
|||
|
|
showWithEffect ();
|
|||
|
|
getSubPanelsDepth ();
|
|||
|
|
refresh ();
|
|||
|
|
setSubPanelsDepth ();
|
|||
|
|
isFinishLoad = true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public abstract void refresh ();
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// Raises the press back event.
|
|||
|
|
/// 当点击返回键
|
|||
|
|
/// 当返回true时表明已经关闭了最顶层页面
|
|||
|
|
/// 当返回false时,表明不能关闭最顶层页面,其时可能需要弹出退程序的确认
|
|||
|
|
/// </summary>
|
|||
|
|
public virtual bool hideSelfOnKeyBack ()
|
|||
|
|
{
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public virtual void hide ()
|
|||
|
|
{
|
|||
|
|
isFinishLoad = false;
|
|||
|
|
hideWithEffect (isHideWithEffect);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public int depth {
|
|||
|
|
get {
|
|||
|
|
return panel.depth;
|
|||
|
|
}
|
|||
|
|
set {
|
|||
|
|
panel.depth = value;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public override void OnDestroy ()
|
|||
|
|
{
|
|||
|
|
base.OnDestroy ();
|
|||
|
|
isFinishInit = false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public virtual void prepare (object callback, object orgs)
|
|||
|
|
{
|
|||
|
|
//sprites
|
|||
|
|
UISprite[] sps = gameObject.GetComponentsInChildren<UISprite> ();
|
|||
|
|
UISprite sp = null;
|
|||
|
|
UISpriteData sd = null;
|
|||
|
|
|
|||
|
|
ArrayList list = new ArrayList ();
|
|||
|
|
for (int i = 0; sps != null && i < sps.Length; i++) {
|
|||
|
|
sp = sps [i];
|
|||
|
|
if (sp.atlas == null || string.IsNullOrEmpty (sp.spriteName)) {
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
list.Add (sp.atlas);
|
|||
|
|
list.Add (sp.spriteName);
|
|||
|
|
}
|
|||
|
|
prepareSprites4BorrowMode (list, 0, callback, orgs);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void onFinishPrepareOneSprite (params object[] paras)
|
|||
|
|
{
|
|||
|
|
NewList objList = paras [2] as NewList;
|
|||
|
|
ArrayList list = objList [0] as ArrayList;
|
|||
|
|
int i = (int)(objList [1]);
|
|||
|
|
object callback = objList [2];
|
|||
|
|
object orgs = objList [3];
|
|||
|
|
prepareSprites4BorrowMode (list, i + 2, callback, orgs);
|
|||
|
|
ObjPool.listPool.returnObject (objList);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void prepareSprites4BorrowMode (ArrayList list, int i, object callback, object orgs)
|
|||
|
|
{
|
|||
|
|
if (list == null) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (list.Count <= i + 1) {
|
|||
|
|
Utl.doCallback (callback, orgs);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
NewList paraList = ObjPool.listPool.borrowObject ();
|
|||
|
|
paraList.Add (list);
|
|||
|
|
paraList.Add (i);
|
|||
|
|
paraList.Add (callback);
|
|||
|
|
paraList.Add (orgs);
|
|||
|
|
prepareOneSprite4BorrowMode (list [i] as UIAtlas, list [i + 1] as string, (Callback)onFinishPrepareOneSprite, paraList);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void prepareOneSprite4BorrowMode (UIAtlas atlas, string spriteName, object callback, object orgs)
|
|||
|
|
{
|
|||
|
|
UISpriteData sd = atlas.getSpriteBorrowMode (spriteName);
|
|||
|
|
if (sd != null && MapEx.get (UIAtlas.assetBundleMap, sd.path) != null) {
|
|||
|
|
Utl.doCallback (callback, null, spriteName, orgs);
|
|||
|
|
} else {
|
|||
|
|
atlas.borrowSpriteByname (spriteName, null, callback, orgs);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|