单击事件不会到达根闪存对象

时间:2016-01-20 10:05:31

标签: actionscript-3 flashdevelop


我刚开始使用as3,主要使用starling而不是本机flash对象。今天我决定试一下原始flash,并创建了一个简单的按钮:

private var _button: SimpleButton;

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

private function init(e:Event = null):void 
{
    removeEventListener(Event.ADDED_TO_STAGE, init);
    // entry point
    _button = new SimpleButton(new BUTTON); //BUTTON is an embedded bitmap
    addChild(_button);
    _button.useHandCursor = true;
    _button.addEventListener(MouseEvent.CLICK, OnClick);
}

private function OnClick(e:MouseEvent):void 
{
    trace("clicked");
}

这肯定会在starling中工作,但我发现click事件由于某种原因不会发送到按钮。鼠标悬停时也没有显示手形光标。我尝试过鼠标,鼠标和其他鼠标事件,但它们都不起作用。我检查按钮是否已正确添加到舞台上。此外,当我向舞台本身添加鼠标单击事件侦听器时,单击正常注册。当我向Main添加一个监听器时,没有再次注册任何事件。 我可能误解了一些明显的东西。也许我需要手动向孩子们发送事件?但那可能是个例子。或者它可能是FlashDevelop中的错误?请帮忙。

1 个答案:

答案 0 :(得分:3)

SimpleButton的构造函数需要4个可选参数:

public function SimpleButton(upState:DisplayObject = null,
                             overState:DisplayObject = null,
                             downState:DisplayObject = null,    
                             hitTestState:DisplayObject = null)`

您提供第一个(upState):

_button = new SimpleButton(new BUTTON); //BUTTON is an embedded bitmap

其他人默认为null。其中包括hitTestState,它与类hitTestState的属性相同:

  

指定用作按钮的命中测试对象的显示对象。 [...] 如果未设置hitTestState属性,则SimpleButton处于非活动状态 - 它不响应用户输入事件。

它还包括解决您问题的方法:

  

对于基本按钮,将hitTestState属性设置为与overState属性相同的显示对象。

但是,如果你想要的只是将点击功能添加到Bitmap ,它本身没有,因为它不是InteractiveObject,< strong>只需使用Sprite

// entry point
_button = new Sprite();
_button.addChild(new BUTTON); //BUTTON is an embedded bitmap
addChild(_button);
_button.useHandCursor = true;
_button.addEventListener(MouseEvent.CLICK, OnClick);

仅当您需要其4种状态的功能时才使用SimpleButton

请注意重载的术语“阶段”:

  

我检查按钮是否正确添加到舞台。

如果你的意思是你可以在Adobe Flash IDE中看到的“绘图区域”或带有“stage”的主时间线,那么是的,你的按钮被添加到那个是正确的。

stage的{​​{1}}属性却有所不同。它是显示列表中最重要的元素,也是添加DisplayObject类实例的容器,它发生在FlashPlayer中.swf的执行开始时。

当您的Main课程通过调用自己的Main_button添加到自身时,该按钮会添加到addChild()的实例和而不是 Main,这是两个不同的对象。