我正在尝试在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);
}
}
}
答案 0 :(得分:2)
向通知发送任何变量并将其返回是没有意义的。 通知应该只告诉您按下了什么按钮。
考虑一下:如果您需要另一个不同值的通知,那也就是“ok”和“取消”按钮。你会为它创建另一个通知类吗?
通知不应该对值或Main
类有任何了解。这是为了使其尽可能独立。通过通知将变量保存到往返并返回main。
相反,在Main
中执行类似的操作:
您可能希望执行其他辅助操作,例如:
此问题超出了此问题的范围,因为这只涉及信息流。
对于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
类特技代码的代码,但是如果您应用更改,则会快速爆发。