2016-06-30 56 views
2

我想在as3中編寫一個簡單的通知類,它只是兩個按鈕,一個用於「ok」,一個用於「取消」,因此有一個事件偵聽器用於每個按鈕。在AS3中觸發事件時修改變量

的問題是,我想要一個變量從主類的通知類傳遞,然後到EventListener的一個已經由用戶觸發後返回到主。

我已經試過型動物的事情,但似乎沒有人上班,我肯定有做一個普通而簡單的方式,但我是新來的語言。

謝謝,對不起我的英語。

下面是一個例子:

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); 
     } 
    } 
} 
+0

爲什麼你想要返回相同的值?將它發送給通知有什麼意義? – null

+0

因爲一旦將值返回給Main,我希望它被平衡(按下按鈕)。它不好嗎? – Bogdan

回答

2

有一個在發送任何變量的通知是沒有意義的,然後返回。 通知應該只告訴你它的按鈕被按下了什麼。

想一想:如果您需要另一個不同的值的通知,那也只是有一個「確定」和「取消」按鈕。你會爲此創建另一個通知類嗎?

通知不應該有任何有關值或Main類的知識。這是爲了使其儘可能獨立。通過通知保存您的變量往返並返回主。

相反,做這樣的事情在Main

  1. 創建通知
  2. 監聽的通知事件
  3. 的通知
  4. 事件將包含發生了什麼(確定或取消)的基礎上
  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; 
     } 
    } 
} 

在通知類,分派該事件,並通過一個String來描述動作的構造。 (你可以做這個有很多更復雜,只允許特定的值,這將是很方便,但它不會增加整體功能)

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

Main,監聽器添加到通知將接收事件作爲參數,並且可以在開關殼體中提取通過我的類中定義的action屬性所執行的動作,例如:

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

     case "cancel": 
     //do other stuff 
     break; 
    } 
} 

起初自定義事件似乎是一種overcomplication,但它提供了一種清晰的界面通知,而不暴露任何內部的東西。如果你想添加鍵盤控制,如「確定」的「輸入」和「取消」的「Esc」,你可以在Notification這樣做,不需要改變任何東西。只要確保發送NotificationEvent

您經常會發現代碼嘗試使用Main類中的notification.okBtn.addEventListener...這種類型的特技,這類特技首先起作用,但在應用更改時會很快爆炸。

+0

謝謝,這就是我正在尋找的。 – Bogdan