当视图状态在Flex中更改时运行一个函数
我正在学习Flex并试图制作一个简单的RPG来练习。 我正在使用视图状态在屏幕之间切换。 现在我有一个显示我的角色信息的HomeView.mxml,显示我的库存项目的InventoryView.mxml,以及显示装备项目的EquipmentView.mxml。 他们每个人都有自己的观点状态。
在我的主要mxml文件中,我为游戏中的角色和物品的ArrayCollection创建了一个全局变量。 它在mxml中为库存和设备创建了2个标签,当我点击标签时,它会调用一个设置currentState =“EquipmentView”或“InventoryView”的点击处理程序,
这是有效的,并且状态改变并且相应的视图被正确显示。
我的问题是在我的EquipmentView状态。 当我第一次进入状态时,它有一个creationComplete功能,它为我的设备显示图像并设置点击处理程序。 当我点击该项目时,它会“解开”它并将其从设备列表中删除并移除图像。 这也可以正常工作,但是当我进入我的库存视图并“装备”一件物品并返回到EquipmentView时,图像不显示。 我有一个标签,它可以计算我的设备列表变量的长度,当我切换视图时它是准确的,但我不能让图像再次显示。
有什么方法可以在视图更改时调用我的displayEquippedItems()函数(最初在creationComplete上调用它)?
这里是我的功能:
protected function displayEquippedItems():void
{
Alert.show("Displaying Items");
for (var i:int = 0; i<c.equippedItems.length; i++)
{
var item:Item = c.equippedItems.getItemAt(i) as Item;
switch (item.type)
{
case 'Weapon':
var il:ItemImage = new ItemImage(item);
il.source = "../assets/sword.gif";
il.scaleX=.25;
il.scaleY=.25;
il.horizontalCenter=-80;
il.verticalCenter=-30;
il.addEventListener(MouseEvent.CLICK, equippedItemClicked);
equipGroup.addElement(il);
break;
default:
Alert.show("Didnt find a weapon");
break;
}
}
}
ItemImage是我定义的一个类,它扩展了Image组件,并且只将一个变量“item”设置为它显示的Item,这样我就可以获取名称,类型(并最终更改图像源)。另外equipGroup只是我定义的一个组装备物品的mxml
任何帮助将是伟大的,谢谢
有几种方法可以完成我相信你想要的。
首先看看updateComplete事件。 而creationComplete只会在组件的创建周期完成后执行一次; 每次组件重绘时,updateComplete事件都会触发。 我毫不怀疑,这个事件会做你想做的事情; 然而,你会想要多次小心地运行你的代码。 许多事情可能会导致组件重绘,而且这听起来像您有一个非常具体的用例。
第二件要看的就是展会。 只要组件可见,就会触发; 当状态改变到显示这个组件的状态时它应该触发。
回答你的具体问题; 只要使用stageChangeComplete事件完成状态更改,就可以运行代码。 在你的情况下,我相信这可能与展会活动类似。 但你会在不同的地方聆听它。 stateChangeComplete事件是您在包含状态的组件中侦听的内容。 展示事件是您在包含广告资源的组件中倾听的内容; 我认为这是控制状态的组件的孩子。
您还可以使用State
对象调度的enterState
事件...您可以像这样在MXML中添加事件侦听器:
<s:states>
<s:State name="myState" enterState="myEventHandler()"/>
</s:states>
有什么更好的,然后'updateComplete'事件是每次组件完成一个完整的“Flex组件生命周期”完成后FlexEvent.UPDATE_COMPLETE
将被分派。 所以,根据你在做什么,你可能会注意到这个事件被调度(并且你的事件处理程序被触发)的次数超过了你需要的次数。
通过使用enterState
事件处理程序,只有在进入特定状态时才会执行代码:)
上一篇: Run a function when view state is change in Flex
下一篇: Flex3 AdvancedDataGrid : how to add a new column based on existing one?