1

我正在寻找一种方法来扩展在 Flash (AS3) 中已经出现在舞台上的 TextField,如下所示:

public class ChildTextField extends TextField 
{
    //code for childTextField comes here    
}

我在舞台上放置了一个实例名称为“thetextfield”的 TextField。现在我想告诉flash 这个文本域是ChildTextField 类型。因此,在我的文档类中,我将该文本字段声明为 ChildTextField:

public class DocumentClass extends Sprite()
{
    public var thetextfield : ChildTextField;
}

这会引发类型强制失败错误。是否可以像使用库符号一样更改用于 Flash IDE 中文本字段的类?

4

1 回答 1

1

怕不是。如果要添加扩展文本字段类,则必须使用 ActionScript。

编辑:有一种黑客方式。来源:http ://board.flashkit.com/board/archive/index.php/t-738887.html

实际上,我以前遇到过这个确切的问题。就我而言,我试图创建一个具有额外行为的文本字段,供其他一些非编码艺术家使用。我会告诉你我原来的解决方案全是 as3,但有一个致命的缺陷,以及我目前的解决方案,它是 as3 和 jsfl 的组合。

所有 as3 解决方案都很棒,除了两件事:首先,它发生在运行时而不是构建时。这意味着有一小部分时间没有正确初始化电影。其次,如果电影中有多个帧,它就不能很好地播放。基本思想是检测您想要更改的文本字段,构建替换它们的东西,然后在舞台上替换它们。您可以通过扩展 TextField 或构建一个包含 TextField 并处理它的接口的类来做到这一点。假设你正在做第一个。向 SmartTextField 添加一个构造函数,用于复制您关心的所有字段:

public function SmartTextField(TextField tf)
{
this.text = tf.text; //continue with copy of anything relevant. 
}

在您的主要电影中具有检测并替换您要替换的 TextFields 的代码

 var toreplace:Array = findTextFields(); 
 var tf:TextField;
 var stf:SmartTextField; 
 var where:int;
 for (int i = 0; i < toreplace.length;i++)
 { tf = TextField(toreplace[i]);
   stf = new SmartTextField(tf); 
   where = getChildIndex(tf); 
    addChildAt(stf,where); 
    removeChild(tf); 
 }

这工作正常,除了上面的几点。

JSFL 解决方案有点过于复杂,无法详细介绍,但这里是基础知识。有一个 as3 类,它用你想要的新行为包装一个文本字段。编写一个迭代所选项目的 jsfl 脚本,如果它是一个文本字段,则转换为具有新包装类的基类的符号。这具有在创作时发生的优点,并且位置、实例名称和其他内容会自动保留。它的缺点是 jsfl 有很多烦人的怪癖需要解决。

编辑:当然,如果这仅适用于一部电影,您可以放弃 jsfl 转换器脚本,而只需手动完成。转换为符号 -> 包装器基类。

于 2009-10-24T10:48:44.197 回答