【问题标题】:ActionScript 3 - How to target textbox inside movieclipActionScript 3 - 如何在影片剪辑中定位文本框
【发布时间】:2014-02-05 18:11:38
【问题描述】:

我有一个名为收音机和手电筒的影片剪辑。在影片剪辑中,有一个文本框,里面有文字。收音机内的文本框的实例名称称为“radioText”,手电筒内的文本框的实例名称称为“flashlightText”。我希望将鼠标悬停在影片剪辑上时文本的颜色变为白色。

下面的代码适用于更改radioText,但不适用于flashlightText:

var containers = [radio, flashlight];

for (var i:int = 0; i<containers.length; i++) {
    containers[i].addEventListener(MouseEvent.MOUSE_OVER, hOver);
}

var whiteFont:TextFormat = new TextFormat();
whiteFont.color = 0xFFFFFF;


function hOver(evt:Event):void {
    evt.currentTarget.radioText.setTextFormat(whiteFont); //change radioText's color
}

我想做的是代替

evt.currentTarget.radioText.setTextFormat(whiteFont);

,我想做类似的事情

evt.currentTarget.(currentTarget.name + 'Text').setTextFormat(whiteFont);

但由于显而易见的原因,这不起作用。有没有办法做我想做的事?

【问题讨论】:

    标签: actionscript-3 flash colors textfield


    【解决方案1】:

    有很多好方法可以实现您所要求的,您所做的实际上取决于您如何设置对象。

    比如你的伪代码:

    evt.currentTarget.(currentTarget.name + 'Text').setTextFormat(whiteFont);
    

    ...如果您以相同的方式命名所有子文本字段,或者根据某些约定命名它们,则可以实现(对于此示例,我为父级设置了一个名称,为子级设置了类似的名称)。因此,假设您的容器名称为“container”,并且有一个名为“containerText”的TextField 子项。它看起来像这样:

    private function hOver(evt:MouseEvent):void {
        var n:String = evt.currentTarget.name;
        evt.currentTarget.getChildByName( n + "Text" ).setTextFormat( whiteFont );
    }
    

    现在这取决于遵循命名约定,这可能是理想的,也可能不是理想的。那么有什么更好、更通用的方法来处理这个问题呢?您可以为您的容器对象设置一个类,并在那里有一个 TextField 属性。例如:

    class myContainer extends Sprite {
        public var textField:TextField;
    
        public function myContainer():void {
            textField = new TextField();
            addChild(textField);
        }
    }
    

    非常基本,但现在如果您将所有侦听器添加到 myContainer 类型,您的事件函数可能如下所示:

    private function hOver(evt:MouseEvent):void {
        evt.currentTarget[ "textField" ].setTextFormat( whiteFont );
    }
    

    这可能是您正在寻找的更多内容。此版本允许您获取应用侦听器的对象的“textField”属性,在这种情况下,该属性本质上就是您的 radioText/flashlightText。

    好吧,最后,最不受欢迎的方法是假设你关心的只是对象有一个TextField类型的子对象,它没有逻辑命名约定,我们不确定它是什么索引在显示列表中。你必须这样做:

    private function hOver(e:MouseEvent):void {
        var i:int;
        var displayObj:DisplayObjectContainer = e.currentTarget as DisplayObjectContainer;
    
        for ( ; i < displayObj.numChildren; i++ ) {
            var obj:* = displayObj.getChildAt( i );
            if ( obj is TextField ) {
                obj.setTextFormat( whiteFont );
            }
        }
    }
    

    这也是到达子对象的最慢方式。这应该涵盖所有基础,祝你好运!

    【讨论】:

      【解决方案2】:

      怎么了?

      DisplayObjectContainer(evt.currentTarget)[evt.currentTarget.name + 'Text'].setTextFormat(whiteFont);
      

      【讨论】:

      • 这行不通,我一眼就能看出 evt.currentTarget.name + "Text" 不会是事件对象当前目标的属性,除非该对象是一个类(即显然继承了 DisplayObjectContainer)包含 textField 成员(正如我在上面的答案中发布的那样)。
      • 我明白了。应该使用带有类型转换的 getChildByName,例如:var parent:MovieClip = new MovieClip(); parent.graphics.beginFill(0xCCCCCC); parent.graphics.drawRect(0, 0, 100, 100); parent.name = "parent"; parent.addEventListener(MouseEvent.CLICK, function(event:Event):void { var txt:TextField = DisplayObjectContainer(event.currentTarget).getChildByName(event.currentTarget.name + 'Text') as TextField; txt.setTextFormat(new TextFormat()); }); addChild(parent); var txtfield:TextField = new TextField(); txtfield.name = "parentText"; parent.addChild(txtfield);
      • 是的,我的回答中也已经说明了这一点。尽管考虑到 currentTarget 是一个对象,但没有理由强制转换为 DisplayObjectContainer。
      猜你喜欢
      • 2014-09-19
      • 2012-02-04
      • 1970-01-01
      • 2012-06-07
      • 2013-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多