在AS3中触发事件时修改变量

时间:2016-06-30 15:37:42

标签: actionscript-3

我正在尝试在as3中编写一个简单的通知类,它只是两个按钮,一个用于“ok”,一个用于“取消”,因此每个按钮都有一个事件监听器。

问题是我希望变量从主类传递到通知类,然后在用户触发eventListener之一后返回到main。

我尝试了不同的东西,但似乎没有人工作,我相信有一个共同而简单的方法可以做到这一点,但我是该语言的新手。

谢谢,对不起我的英语。

以下是一个例子:

Main.as:

package {
    import flash.display.Sprite;
    import flash.events.Event;

    public class Main extends Sprite {

    [SWF(width="640",height="480",backgroundColor="#ffffff")]

        public function Main():void {
            if (stage)
            init();
            else
            addEventListener(Event.ADDED_TO_STAGE, init);
        }

        private function init(e:Event = null):void {

            removeEventListener(Event.ADDED_TO_STAGE, init);

            var msg:Notification = new Notification();
            addChild(msg);  

        }
     }
 }

Notification.as:

package {
    import flash.display.Sprite;
    import flash.events.MouseEvent;
    import flash.text.TextField;
    import flash.text.TextFormatAlign;
    import flash.text.TextFieldAutoSize;

    public class Notification extends Sprite {

        private var background:Sprite;
        private var button1:Sprite;
        private var button2:Sprite;
        private var buttonOk:TextField;
        private var buttonCancel:TextField;

        public function Notification() {       
            addBackground();
            addMessage();
            addOkButton();
            addCancelButton();
        }

        private function addBackground():void {
            background = new Sprite();
            background.graphics.beginFill(0x4682b4, 1);
            background.graphics.drawRoundRect(0, 0, 300, 200, 30, 30);
            background.graphics.endFill();
            addChild(background);
        }

        private function addMessage():void {
            message = new TextField();
            message.autoSize = TextFieldAutoSize.LEFT;
            message.text = "My text";
            message.scaleX = 1.2;
            message.scaleY = 1.2;
            message.textColor = 0xffffff;
            background.addChild(message);
       }

       private function addOkButton():void {
           button2 = new Sprite();
           button2.graphics.beginFill(0x35733b, 1);
           button2.graphics.drawRoundRect(0, 0, 90, 40, 10, 10);
           button2.x = 175;
           button2.y = 115;
           button2.buttonMode = true;
           button2.mouseChildren = false;
           button2.alpha = 0.7;
           background.addChild(button2);

           button2.addEventListener(MouseEvent.ROLL_OVER, onButton2);
           button2.addEventListener(MouseEvent.ROLL_OUT, outButton2);
           button2.addEventListener(MouseEvent.CLICK, clickButton2);

           buttonOk = new TextField();
           buttonOk.autoSize = TextFieldAutoSize.LEFT;
           buttonOk.text = "Ok";
           buttonOk.scaleX = 1.2;
           buttonOk.scaleY = 1.2;
           buttonOk.textColor = 0x000000;
           buttonOk.selectable = false;
           buttonOk.x = button2.width/2 - buttonOk.width/2;
           buttonOk.y = button2.height/2 - buttonOk.height/2;
           button2.addChild(buttonOk);
       }   


       private function addCancelButton():void {
           button1 = new Sprite();
           button1.graphics.beginFill(0x771d1d, 1);
           button1.graphics.drawRoundRect(0, 0, 90, 40, 10, 10);
           button1.x = 25;
           button1.y = 115;
           button1.buttonMode = true;
           button1.useHandCursor = true;
           button1.mouseChildren = false;
           button1.alpha = 0.7;
           background.addChild(button1);

           button1.addEventListener(MouseEvent.ROLL_OVER, onButton1);
           button1.addEventListener(MouseEvent.ROLL_OUT, outButton1);
           button1.addEventListener(MouseEvent.CLICK, clickButton1);

           buttonCancel = new TextField();
           buttonCancel.autoSize = TextFieldAutoSize.LEFT;
           buttonCancel.text = "Cancel";
           buttonCancel.scaleX = 1.2;
           buttonCancel.scaleY = 1.2;
           buttonCancel.textColor = 0x000000;
           buttonCancel.x = button1.width/2 - buttonCancel.width/2;
           buttonCancel.y = button1.height/2 - buttonCancel.height/2;
           button1.addChild(buttonCancel);
       }


       private function onButton1(e:MouseEvent):void {
           button1.alpha = 1;
       }
       private function outButton1(e:MouseEvent):void {
           button1.alpha = 0.7;
       }

       private function onButton2(e:MouseEvent):void {
           button2.alpha = 1;
       }
       private function outButton2(e:MouseEvent):void {
           button2.alpha = 0.7;
       }

       private function clickButton1(e:MouseEvent):void {
            this.parent.removeChild(this);
       }
       private function clickButton2(e:MouseEvent):void {
           this.parent.removeChild(this);
       }
    } 
} 

1 个答案:

答案 0 :(得分:2)

向通知发送任何变量并将其返回是没有意义的。 通知应该只告诉您按下了什么按钮。

考虑一下:如果您需要另一个不同值的通知,那也就是“ok”和“取消”按钮。你会为它创建另一个通知类吗?

通知不应该对值或Main类有任何了解。这是为了使其尽可能独立。通过通知将变量保存到往返并返回main。

相反,在Main中执行类似的操作:

  1. 创建通知
  2. 听取通知事件
  3. 通知事件将包含发生的事情(确定或取消)
  4. 根据发生的事情,在Main
  5. 中执行一些逻辑

    您可能希望执行其他辅助操作,例如:

    • 使通知可见/不可见
    • 确保其模态(当它处于活动状态时无法点击任何其他内容)

    此问题超出了此问题的范围,因为这只涉及信息流。

    对于Notification课程,最佳做法是发送自定义事件。此事件包含用户执行的操作,可能看起来像这样(未经测试的代码):

    package
    {
        public class NotificationEvent extends Event
        {
            private var _action:String;
    
            public function get action ()
            {
                return _action;
            }
    
            public NotificationEvent (action:String = "ok")
            {
                _action = action;
            }
        }
    }
    

    在Notification类中,调度该事件并将String传递给描述该操作的构造函数。 (你可以使这个更精细,只允许某些值,这将非常方便,但它不会增加整体功能)

    dispatchEvent(new NotificationEvent("cancel")); // when cancel button is clicked
    

    Main中,添加到通知中的侦听器将接收Event as参数,并可以通过我在类中定义的action属性提取执行的操作,例如在switch case中: / p>

    function notificationHandler(e:NotificationEvent)
    {
        switch(e.action)
        {
            case "ok":
            //do stuff
            break;
    
            case "cancel":
            //do other stuff
            break;
        }
    }
    

    首先,自定义事件看起来像是一个过度复杂,但它为通知提供了一个清晰的界面,而不会暴露任何内部内容。如果你想为“ok”添加“enter”之类的键盘控制,为“cancel”添加“esc”,你可以在Notification类中添加,而不需要在外面改变任何东西。只需确保发送NotificationEvent

    您经常会找到尝试notification.okBtn.addEventListener...类中的Main类特技代码的代码,但是如果您应用更改,则会快速爆发。