Em Flex / AS3, como faço para obter uma definição de classe de ativo incorporado com getDefinitionByName
-
01-07-2019 - |
Pergunta
Eu tenho uma classe com muitos recursos incorporados.
Dentro da classe, eu gostaria de obter a definição de classe de um ativo pelo nome. Eu tentei usar getDefinitionByName () e também ApplicationDomain.currentDomain.getDefinition (), mas não trabalho.
Exemplo:
public class MyClass
{
[Embed(source="images/image1.png")] private static var Image1Class:Class;
[Embed(source="images/image2.png")] private static var Image2Class:Class;
[Embed(source="images/image3.png")] private static var Image3Class:Class;
private var _image:Bitmap;
public function MyClass(name:String)
{
var ClassDef:Class = getDefinitionByName(name) as Class; //<<-- Fails
_image = new ClassDef() as Bitmap;
}
}
var cls:MyClass = new MyClass("Image1Class");
Solução
Esta não responder à sua pergunta, mas pode resolver seu problema. Acredito que fazer algo como isso deve funcionar:
public class MyClass
{
[Embed(source="images/image1.png")] private static var Image1Class:Class;
[Embed(source="images/image2.png")] private static var Image2Class:Class;
[Embed(source="images/image3.png")] private static var Image3Class:Class;
private var _image:Bitmap;
public function MyClass(name:String)
{
_image = new this[name]() as Bitmap;
}
}
var cls:MyClass = new MyClass("Image1Class");
Eu estou tendo um momento difícil lembrar se a notação suporte funciona em classes selados. Se isso não acontecer, uma solução simples é para marcar a classe como dinâmica.
Outras dicas
A razão o seu método não funciona é porque "Image1Class" é uma variável nome, não o real nome Class .
Você pode obter o nome da classe como este
import flash.utils.getQualifiedClassName;
trace(getQualifiedClassName(Image1Class));
que, como você pode ver, significa que o seu nome da classe (o que deve ser passado para a função) é algo como MyClass_Image1Class
.
Você não precisa usar qualquer getDefinitionByName fantasia () métodos, simplesmente se referem a ele de forma dinâmica. No seu caso, substitua o 'falha' linha com:
var classDef:Class = MyClass[name] as Class;
E que deve fazê-lo.
Muito obrigado! Passei quase 5 horas a tentar obter o POS getDefinitionByName ao trabalho com o getQualifiedClassName que eu estava pronto para atirar coisas !! Meu código de trabalho final se parece com isso e ainda recebe o nome de cadeia de uma matriz.
CreatureParam é uma matriz tridimensional de duas cadeias;
Tipo é um número inteiro que é enviado a piscar pela tag HTML que é por sua vez, vem de um banco de dados MYSQL via PHP.
Mark1_cb é um combobox que está no palco e tem um nome de instância. É de saída é também um inteiro.
Assim, este código diretamente abaixo importações da classe "BirdBodyColor_mc" de um swf "ArtLibrary.swf" externo. BirdBodyColor_mc é um movieclip criado a partir de uma imagem png. Note que você deve clicar duas vezes sobre o clipe de filme no ArtLibrary.fla e inserir um segundo quadro-chave. Movieclips aparentemente precisa de dois quadros ou tentativas flash para importá-lo como um sprite e provoca uma incompatibilidade de tipo.
[Embed (source = "ArtLibrary.swf", símbolo = "BirdBodyColor_mc")] var BirdBodyColor_mc: Classe;
Normalmente eu iria colocar uma instância desta classe movieclip no palco usando este código.
CJMM: MovieClip = new BirdBodyColor_mc (); addChild (CJMM);
var Definição: class = este [ "BirdBodyColor_mc"] como Classe; var Mark1: MovieClip = new Definição ();
Mas eu preciso fazer isso usando um valor de string olhou na minha matriz. Então, aqui está o código para isso.
var Definição: Class = este [CreatureParam [Type] [Mark1_cb + 2]] como Classe; var Mark1: MovieClip = new Definição ();