【问题标题】:How to add keyBoardEvent for one particular button in actionscript?如何为动作脚本中的一个特定按钮添加 keyBoardEvent?
【发布时间】:2014-06-19 09:18:40
【问题描述】:

我是 actionscript 的新手。前两天刚开始学。我正在尝试为特定按钮添加键盘事件。这是我到目前为止所做的。

import flash.events.KeyboardEvent;
public function f1():void
{
     // something
}
public function keyBoardListener(keyEvent:KeyboardEvent):void
{
    if(keyEvent.keyCode==37)
        f1();

}

在按钮中

<Lib:ManagedButton
     id = "MB"
     labelText = "MB"
     image = " ... "
     click="f1()"
     enabled = "false"
     stage.addEventListener(KeyboardEvent.KEY_DOWN,keyBoardListener);
 />

这是我得到的错误:

Attribute name "stage.addEventListener" associated with an element type "Lib:ManagedButton" must be followed by the ' = ' character.    

我要做的是在按下左箭头键时调用函数 f1()。我不希望此页面上的所有按钮都发生这种情况,而只有这个按钮。

【问题讨论】:

  • 您正在尝试在 mxml 标记属性中运行代码。这就是错误的原因。 stage.addEventListner 不是属性,而是对函数的调用。
  • MangedButton 有可以指定的keyDown 属性吗?如果是这样,请将您对 stage.addEventListener... 的呼叫替换为 keyDown="keyBoardListener"
  • @Brian 这些是 ManagedButton 具有 labelText:String, image:String 的属性。刚刚添加了 keyDown:KeyboardEvent。对吗?
  • ManagedButton 是您自己的自定义类吗?如果是这样,您可以将侦听器代码放在那里。您是希望 f1() 函数仅作用于一个按钮,还是只希望在该按钮具有焦点时使用箭头键来调用它?
  • @Brian ManagedButton 与 s:Button 相同,除了标签、单击等之外还有一些额外的变量。我希望在按钮处于焦点时调用箭头键。

标签: actionscript-3 flash apache-flex actionscript flash-builder


【解决方案1】:

您的问题如下:

stage.addEventListener(KeyboardEvent.KEY_DOWN,keyBoardListener);

您在标记中将其作为属性(它需要 param="value")并且您正在尝试调用代码函数。

您应该为您的按钮创建一个类文件并在其中添加侦听器和处理程序。这样它只会在按钮有焦点时运行(这是我假设你想要的)。

package Lib {
    public class MyButton extends ManagedButton {
        public function MyButton(){
            this.addEventListener(Event.ADDED_TO_STAGE,addedToStage,false,0,true);
            this.addEventListener(Event.REMOVED_FROM_STAGE,removedFromStage,false,0,true);
            this.addEventListener(MouseEvent.CLICK,clickEventHandler,false,0,true);
        }

        private function addedToStage(e:Event):void {
            this.addEventListener(KeyboardEvent.KEY_DOWN, keyBoardListener,false,0,true);
        }
        private function removedFromStage(e:Event):void {
            this.removeEventListener(KeyboardEvent.KEY_DOWN, keyBoardListener,false);
        }

        [Bindable]
        public var clickHandler:Function;

        private function clickEventHandler(e:Event):void {
            if(clickHandler != null) clickHandler();
        }
        public function keyBoardListener(keyEvent:KeyboardEvent):void
        {
            if(keyEvent.keyCode==37)
               if(clickHandler != null) clickHandler();
        }
    }
}

然后您可以指定clickHandler 的值并让您的键盘和点击事件启动它。我并没有真正使用 FLEX,所以可能需要有人来纠正这个问题,但我认为这就是它的样子:

<Lib:MyButton
     id = "MB"
     labelText = "MB"
     image = " ... "
     enabled = "false"
     clickHandler = "f1()"
 />

【讨论】:

  • 非常感谢。我明白这一点。我的问题是如何将此类与一个特定按钮相关联?我正在使用由 声明的许多按钮,每个按钮都有不同的参数值。
  • 我并没有真正使用 FLEX,也不太熟悉它的标记,但是使用类文件方法您必须实际引用该类 而不是 。由于我正在扩展 ManagedButton,您可以使用托管按钮的所有相同参数和功能,唯一的区别是 MyButton 为您提供输入键功能。我的答案中的示例类缺少任何需要的导入。
猜你喜欢
  • 2016-04-10
  • 1970-01-01
  • 2017-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-29
  • 2013-04-29
  • 2017-09-29
相关资源
最近更新 更多