我刚开始使用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中的错误?请帮忙。
答案 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
,这是两个不同的对象。