2

所以我在一个容器movieclip中生成了65个movieclip。(它在一个容器中,因为它在一个游戏中并且它在一个弹出窗口中。)通过访问库中的 AS3 链接的 MovieClip 来创建 MovieClip。每个都存储在一组 MovieClips 中。从那里我将一些文本信息(包括一些隐藏的文本)放入每个信息中,并添加一些事件侦听器。代码本身工作得很好,除了一件事。事件侦听器接收目标作为 MovieClip 内的 TextField 之一,而不是 MovieClip 本身。我绝对确定鼠标事件侦听器已应用于电影剪辑。

for (var i:int = 0; i < mcArray.length; i++)
{
    mcArray[i] = new IDButton();
    MovieClip(mcArray[i]).tf1.text = String(ID1[i])
    MovieClip(mcArray[i]).tf2.text = String(ID2[i]);
    MovieClip(mcArray[i]).tf3.text = String(ID3[i]);
    MovieClip(mcArray[i]).tf1.selectable = false;
    MovieClip(mcArray[i]).tf2.selectable = false;
    MovieClip(mcArray[i]).tf3.selectable = false;
    MovieClip(mcArray[i]).tf1.visible = false;
    MovieClip(mcArray[i]).tf2.visible = false;
    MovieClip(mcArray[i]).name = "MC" + String(i);
    container.addChild(MovieClip(mcArray[i]));
    MovieClip(mcArray[i]).addEventListener(MouseEvent.CLICK, mcClickHandler);
    MovieClip(mcArray[i]).addEventListener(MouseEvent.ROLL_OVER, mcHoverHandler);
    MovieClip(mcArray[i]).addEventListener(MouseEvent.ROLL_OUT, mcOffHandler);
    MovieClip(mcArray[i]).x = 0;
    MovieClip(mcArray[i]).y = MovieClip(mcArray[i]).height * i;
}

(老实说,我不知道那里有 MovieClip 是否是多余的。我想这表明我对 Flash 普遍缺乏信任。)

所以为了测试,我在 mcClickHandler 函数中跟踪了目标名称,它一直返回“tf3”。

4

3 回答 3

4

AS3 中的事件有两个“目标”属性:targetcurrentTarget. 如果一个不工作,另一个通常会。

基本上,target是鼠标单击的实际对象,并且currentTarget是附加了侦听器的对象。

此 SO 问题中的更多信息:Difference between e.target and e.currentTarget

于 2012-06-12T06:25:39.893 回答
1

尝试将mouseChildren设置为false

MovieClip(mcArray[i]).mouseChildren = false;
于 2012-06-12T06:29:09.390 回答
0

我会选择更简单的版本;仅添加一个事件侦听器并用于Event.target确定单击了哪个项目(在容器内)。您可以巧妙地利用它的类型(类)。假设你所有的按钮都扩展了一个名为 的自定义类IDButton,它们都需要做同样的事情(比如调用一个函数),但是使用一个基于它的 id 的参数。

如果按钮基本上应该做同样的事情,并且在同一个容器中没有很多其他类型的剪辑需要监听相同的鼠标事件,这将很有帮助。

package  
{
    import flash.display.Sprite;
    import flash.events.MouseEvent;

    public class Test extends Sprite
    {
        public function Test()
        {
            // one listener for all clicks
            this.addEventListener(MouseEvent.CLICK, handleClick);
            this.addEventListener(MouseEvent.MOUSE_OVER, handleHover);
            this.addEventListener(MouseEvent.MOUSE_OUT, handleHover);
        }

        private function handleClick(event:MouseEvent):void
        {
            // you're need to be sure it's a IDButton
            if (event.target is IDButton)
            {
                var button:IDButton= event.target as IDButton; 
                this.showById(button.id); // let's say CustomButton has a public var 'id'
            }
        }

        private function showById(id:int):void
        {
            // do something
        }


        private function handleHover(event:Event):void
        {
            if (event.target is IDButton)
            {
                var button:IDButton = event.target as IDButton;
                switch (event.type)
                {
                    case MouseEvent.ROLL_OVER:
                    {
                        button.alpha = 0.8;
                        break;
                    }
                    case MouseEvent.ROLL_OUT:
                    {
                        button.alpha = 1;
                        break;
                    }
                }
            }
        }
    }
}

希望有帮助。

于 2012-06-12T10:45:15.130 回答