我动态添加的影片剪辑的名称为“instance XX”

Posted

技术标签:

【中文标题】我动态添加的影片剪辑的名称为“instance XX”【英文标题】:my dynamically added movieclips have a name of "instance XX" 【发布时间】:2013-04-12 02:33:46 【问题描述】:

这里发生了一些我不完全理解的事情。我创建了一个自定义类,它扩展了 MovieClip 以提供一些自定义属性并在创建的 MovieClip 内创建一个几何形状

package com.hyatt

import flash.display.*;
import flash.geom.*;
public class mapPin extends MovieClip


    public var spirit:String;
    public var callName:String;
    public var hotelName:String;
    public var city:String;
    public var s:String;
    public var zip:String;
    public var country:String;
    public var brand:String;
    public var featured:Boolean;
    public var horizon:Boolean;
    private var _mc1:MovieClip = new MovieClip();

    public function mapPin(_brand:String)
    
        brand = _brand;
        switch (_brand)
        
            case "Andaz":
                    pinCircle(0xff0000);
                    break;
            case "Grand Hyatt":
                    pinCircle(0x0000ff);
                    break;
            case "Hyatt":
                    pinCircle(0x4600f0);
                    break;
        
    

    private function pinCircle(color:uint):void
    
        _mc1.graphics.beginFill(color);
        _mc1.graphics.drawCircle(0,0,20);
        this.addChild(_mc1);
        _mc1.graphics.endFill();
    



然后,我将 mapPin 类的几个实例添加到舞台上的容器影片剪辑中,并向该容器剪辑添加事件侦听器。

var myTest1:mapPin = new mapPin("Andaz");
myTest1.brand = "Andaz";
container_mc.addChild(myTest1);
myTest1.name = "myTest1" //this is added purely for testing the "instance xx", same result
myTest.x = 100;
myTest.y = 100;

var myTest2:mapPin = new mapPin("Hyatt");
container_mc.addChild(myTest2);
myTest2.brand = "Hyatt";
myTest2.x = 400;
myTest2.y = 400;

container_mc.addEventListener(MouseEvent.CLICK, pinClicked);

最后我试图能够访问被点击的 mapPin 的属性(迄今为止唯一的一组是“品牌”)。

function pinClicked(e:MouseEvent):void

    trace(e.target.name); // traces "instance xx" instead of "myTest1"
trace(e.target.brand); // traces "undefined"

我可以添加 mapPin 实例,并调整它们的 x 和 y,尽管我无法引用自定义类属性(如“brand”)并且它们的名称变成了通用实例名称。我错过了什么?将添加超过 500 个这样的项目,我希望能够根据用户的点击从它们中提取信息。

【问题讨论】:

【参考方案1】:

我必须查看您的 mapPin 类才能确定,但​​我认为调度事件的 DisplayObject 是 mapPin 的子级。

要解决此问题,请在您的 mapPin 类构造函数中添加以下行:

mouseChildren = false;

这将指定子级不应接收单击/调度鼠标事件。

【讨论】:

您也可以查看e.currentTarget 而不是e.target。 currentTarget 是最近调度一个事件的对象,而 target 是最初调度它的对象。更多时候,e.currentTarget 是您想要的正确对象。 确实如此,但在这种情况下,监听器连接到container_mc,所以e.currentTargetcontainer_mc,而不是mapPin【参考方案2】:

currentTarget 是最近调度事件的对象,target 是最初调度它的对象

不是。 AS3 文档说:

当前目标: 使用事件侦听器主动处理 Event 对象的对象。例如,如果用户单击“确定”按钮,则当前目标可能是包含该按钮的节点或其已为该事件注册事件侦听器的祖先之一。

target :事件目标。此属性包含目标节点。例如,如果用户单击确定按钮,则目标节点是包含该按钮的显示列表节点。

【讨论】:

以上是关于我动态添加的影片剪辑的名称为“instance XX”的主要内容,如果未能解决你的问题,请参考以下文章

AS3.0中影片剪辑元件嵌套了个动态文本框,怎样才能在文本框上也能显示手型?

如何获取动态创建的 Flash 舞台上的 MovieClip 名称?

如何使用一系列影片剪辑名称来控制 as3 中的这些剪辑?

访问链接属性未定义的影片剪辑

如何加载带有条件动态文本的影片剪辑。如果别的

在 flash actionscript 2 中动态访问嵌套的影片剪辑