控制器是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;