1. 程式人生 > >FairyGUI筆記:Controller(十一)

FairyGUI筆記:Controller(十一)

控制器是FairyGUI核心功能之一,它為UI製作中以下類似需求提供了支援:

  • 分頁 一個元件可以由多個頁面組成。

  • 按鈕狀態 按鈕通常有按下、滑鼠懸浮等多個狀態,我們可以利用控制器為每個狀態安排不同的顯示內容。

  • 其它狀態的變化 利用控制器,我們可以使元件具有多個不同的形態,並且可以方便地切換。

個元件都可以建立一個或多個控制器,如下圖所示:

顯示控制指示該元件只有在控制器的活動頁面屬於參與頁面之一時才顯示,否則不顯示。如果參與頁面為空,則顯示控制無效,元件一直顯示。

設定顯示控制的方式:

如果多個元件需要相同的顯示控制時,可以將這些元件先建一個高階組,再對高階組設定顯示控制。

顯示控制不使用元件本身的可見屬性(visible),兩者是獨立的,最終是否可見是兩者的“與”邏輯結果。

當元件不可見時,它並不會被容器(GComponent)的顯示列表剔除,但FairyGUI底層會處理,使不可見的元件不佔用渲染資源。不受控制器干擾的顯示列表保證了任何時候都可以通過GetChild訪問到需要的元件。

  • Controller

Controller c1 = aComponent.GetController("c1");
//通過索引設定控制器的活動頁面
c1.selectedIndex = 1;
//如果希望改變控制器時不觸發Change事件
c1.setSelectedIndex(1);
//也可以使用頁面的名稱設定
c1.selectedPage = "page_name";
//獲得控制器當前的活動頁面
Debug.Log(c1.selectedIndex);

控制器改變時有通知事件:

//Unity/Cry
c1.onChanged.Add(onChanged);
//AS3
c1.addEventListener(StateChangeEvent.CHANGED, onChanged);
//Egret
c1.addEventListener(StateChangeEvent.CHANGED, this.onChanged, this);
//Laya
c1.on(fairygui.Events.STATE_CHANGED, this, this.onChanged);
//Cocos2dx
c1->addEventListener(UIEventType::Changed, CC_CALLBACK_1(AClass::onChanged, this));

改變控制器頁面時,與之連線的屬性控制可能帶有緩動,如果你要獲得緩動結束的通知,可以偵聽GearStop事件:

//Unity/Cry
aObject.OnGearStop.Add(OnGearStop);
//Egret
c1.addEventListener(GObject.GEAR_STOP, this.OnGearStop, this);
//Laya
c1.on(fairygui.Events.GEAR_STOP, this, this.OnGearStop);
//Cocos2dx
c1->addEventListener(UIEventType::GearStop, CC_CALLBACK_1(AClass::OnGearStop, this));

如果你正在做介面的初始化,可能不希望出現任何緩動。可以這樣做:

//禁止所有控制器引起的緩動
GearBase.disableAllTweenEffect = true; 
c1.selectedIndex = 1;
//記住要復原
GearBase.disableAllTweenEffect = false;

可以用程式碼設定屬性控制,但一般不建議這樣做,應該儘量在編輯器裡完成。

//GearXXX物件是控制器和屬性之間的連線。0-顯示控制,1-位置控制,2-大小控制,
// 3-外觀控制,4-顏色控制,5-動畫控制,6-文字控制,7-圖示控制
GearDisplay gearDisplay = obj.GetGear(0);
gearDisplay.controller = obj.parent.GetController("c1");
//注意這裡是頁面的id,不是索引或者名稱。可以通過Controller.GetPageIdByName轉換。
gearDisplay.pages = new string[] { ... }; 
GearXY gearXY = obj.GetGear(1);
gearXY.tweenConfig.duration = 0.5f;