在Flex中更改视图状态时运行函数

时间:2012-04-12 20:17:23

标签: flex actionscript flash-builder mxml

我正在学习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组件,只设置了一个变量&#34; item&#34;它显示的项目,所以我可以得到名称,类型(并最终更改图像源) equipGroup也只是我在mxml中定义的用于保存设备项目的组

任何帮助都会很棒,谢谢

2 个答案:

答案 0 :(得分:3)

有几种方法可以实现我认为你想要的东西。

首先是查看updateComplete event。而创建完成只会在组件的创建周期完成后执行一次;每次重新绘制组件时,都会触发updateComplete事件。我毫不怀疑,这个活动会做你想做的事;但是你要小心多次运行你的代码。很多东西都可能导致组件重绘,听起来你有一个非常具体的用例。

要看的第二件事是show事件。只要组件可见,它就会触发;当状态更改为显示此组件的状态时应该触发。

回答您的具体问题;您可以使用stageChangeComplete事件在状态更改完成时运行代码。在你的情况下,我相信这可能与show事件类似;但是你会在不同的地方听它。 stateChangeComplete事件是您在包含状态的组件中侦听的事件。 show事件是您在包含库存的组件中侦听的内容;我假设它是控制状态的组件的子项。

答案 1 :(得分:3)

您还可以使用由enterState对象调度的State事件...您可以在MXML中添加事件侦听器,如下所示:

<s:states>
    <s:State name="myState" enterState="myEventHandler()"/>
</s:states>

有什么比这更好的'updateComplete'事件是每次组件完成一个完整的“Flex组件生命周期”的执行时,FlexEvent.UPDATE_COMPLETE将被调度。因此,根据您正在做的事情,您可能会注意到此事件被调度(并且您的事件处理程序被触发)的次数超过您的需要。

通过使用enterState事件处理程序,您的代码只会在进入特定状态时执行:)