如何检查舞台上是否有点击(不是在舞台前面的其他物体上 - 只是在没有其他物体的地方)或动画片段(名称“mcSlideHolder”)?
function onMouse_Down(e:MouseEvent):void
{
trace("MouseDown occured");
trace("MouseDown target: " + e.target.name);
trace("MouseDown target.tostring: " + e.target.toString);
trace("MouseDown currentTarget: " + e.currentTarget);
if(e.target.name == null || e.target.name == "mcSlideHolder")
{
this._userInput();
}
}
我的问题是,当点击舞台时,e.target.name为null。 单击mcSlideHolder时,e.target.name为“instance235”。 你会怎么做?
感谢您的任何建议!
答案 0 :(得分:4)
通常,当您想要检测特定MovieClip上的点击时,就是您将听众添加到的那个:
mcSlideHolder.addEventListener(MouseEvent.MOUSE_DOWN, onSlideHolderMouseDown);
而不是
stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouse_Down);
听起来你正在做后者;向舞台添加一个监听器,并尝试在监听器功能中找出所点击的内容。这没有任何问题,如果有许多可能的东西可以点击,它甚至可以是高效的。但是在这种情况下,currentTarget总是会成为舞台,目标总是成为你生成事件的点击的东西。如果你确实如何设置,你会得到一个不同的结果 - 可能是你期望的结果 - 如果你这样做:
mcSlideHolder.mouseChildren = false;
我假设mcSlideHolder是实例名称。将mouseChildren设置为false意味着mcSlideHolder将生成MOUSE_DOWN事件而不是作为其子项的instance235。
答案 1 :(得分:2)
Adam smith的回答已经解释了为什么你得到“instance235”所以我将解释为stage
对象的name
属性等于null的解决方法。
您可以为stage
对象创建一个包装类,并为该类提供一个名为name
的属性。包装器类也必须是EventDispatcher
的子类,以便您可以覆盖它的addEventListener()
方法并更改其功能,以便您隐式地将事件侦听器添加到舞台对象以及包装器宾语。解释它的最好方法是向您展示我做的一个例子:
package
{
import flash.display.DisplayObject;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
public class Main extends Sprite
{
private var _stageWrapper:StageWrapper;
public function Main():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}// end function
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
var stageWrapper:StageWrapper = new StageWrapper(stage, "stage");
stageWrapper.addEventListener(MouseEvent.CLICK, onStageWrapperClick);
}// end function
private function onStageWrapperClick(e:MouseEvent):void
{
trace(e.target.name) // output: stage
}// end function
}// end class
}// end package
import flash.display.Stage;
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.events.MouseEvent;
internal class StageWrapper extends EventDispatcher
{
private var _stage:Stage;
private var _name:String;
private var _listener:Function;
public function get stage():Stage { return _stage }
public function get name():String { return _name }
public function StageWrapper(stage:Stage, name:String)
{
_stage = stage;
_name = name;
}// end function
override public function addEventListener(type:String,
listener:Function,
useCapture:Boolean = false,
priority:int = 0,
useWeakReference:Boolean = false):void
{
super.addEventListener(type, listener, useCapture, priority, useWeakReference);
_stage.addEventListener(type, onStageEvent, useCapture, priority, useWeakReference);
}// end function
private function onStageEvent(e:Event):void
{
dispatchEvent(e);
}// end function
}// end class
就我个人而言,我不会采用这种方法,但这是我能给你的最佳答案。你可以选择这个方向。