Pergunta

Eu estou tentando criar / usar um pre-loader no meu aplicativo flex. O pré-carregador é um arquivo SWF que possui 100 quadros (1 para cada por cento do progresso loader). Basicamente eu estou tentando incorporar esse arquivo SWF no meu aplicativo, exibi-lo na tela e mudar o número do quadro a ser exibido como da conclusão do progresso.

O código que eu tenho até agora é (que se estende tela):

[Embed("/../assets/preLoader.swf")]
private var SWFClass:Class;

private var _preLoader:MovieClip;

private var _progress:Number;

public function set progress(value:Number) : void {
    _progress = value;

    if(progress < 100) {
        _preLoader.gotoAndPlay(progress, null);
    }else {
        _preLoader.gotoAndStop(0, null);
    }
}   

[Bindable]
public function get progress() : Number {
    return _progress;
}



(Called on creationComplete event)          
private function init() : void {
    _preLoader = MovieClip(new SWFClass());

    this.addChild(_preLoader);

    _preLoader.play();
}

O erro que eu estou recebendo é:

TypeError: Error #1034: Type Coercion failed: cannot convert widgets::PreLoader_SWFClass@30b3be51 to mx.core.IUIComponent.at mx.core::Container/http://www.adobe.com/2006/flex/mx/internal::addingChild()[C:\autobuild\3.2.0\frameworks\projects\framework\src\mx\core\Container.as:3259]

Por favor, ajuda!

Foi útil?

Solução

Use o sprite em vez de lona como uma classe base. Duas razões para fazer isso:

  1. Canvas tem um monte de dependências (da ordem de 100k + de componentes Flex). Você não quer esperar para que tudo isso carga antes de exibir o seu preloader

  2. A lona é recipiente UIComponent. Use-o quando você quer colocar para fora UIComponents. No seu caso, você não precisa de lógica de layout lona complicada - você só precisa exibir um MovieClip. Portanto, não use uma tela.

Para responder à sua pergunta original, SWFLoader e Imagem são UIComponents que sabem como para exibir mapas de bits e MovieClips. Fazer algo como isto em vez disso:

var img:Image = new Image();
img.source = _preloader;
this.addChild(img);

Outras dicas

Você precisa ter um wrapper sobre MovieClip que implementa a IUIComponent, a fim de ser capaz de passar para addChild(). Do addChild() documentação :

Nota: Embora o argumento filho para o método é especificado como do tipo DisplayObject, o argumento deve implementar a interface IUIComponent a ser adicionado como um filho de um recipiente. Todos os componentes Flex implementar essa interface.

Você vai precisar de algo como isto:

public class MovieClipUIComponent extends UIComponent {
   public function MovieClipUIComponent (mc:MovieClip) {
      super ();

      mcHeight = mc.height;
      mcWidth = mc.width;

      // add your own magic

      addChild (mc);
   }
}

Atenção: código não testado, deve dar-lhe uma idéia única

Esperamos que este trabalho Tentei fazer isso.

[Embed(source="assets/yourSWF.swf", mimeType="application/octet-stream")]
public var SWF:Class;

_swfLoader = new Loader();
//nothing to do onComplete or onProgress method just to debug
// Add complete event listener
_swfLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
// Add progress event listener
_swfLoader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgress);


// Add error event listener. Critical if you don't want run time errors if there
// are problems loading the file.
_swfLoader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, onError);

// Incase of loading Flex. Very important.
_swfLoader.addEventListener("mx.managers.SystemManager.isBootstrapRoot", systemManagerHandler);
_swfLoader.addEventListener("mx.managers.SystemManager.isStageRoot", systemManagerHandler);

// Load on the loader with a new URLRequest instance passing the path to
// it's constructor.
_swfLoader.loadBytes(new SWF());

// We have to addd the loader so it creation is done.
addChild(_swfLoader);

private function systemManagerHandler(e:Event):void {
            // Prevent default stops default behaviour here and thus stops some potential
            // run time errors.         
            e.preventDefault();
}

Tenha um olhar para o Preloader classe eo preloader propriedade da Aplicação classe.

Como diz a documentação, você definitivamente não deve estender o Flex UIComponent (ou imagem ou SWFLoader) aulas para um pré-carregador.

Aqui estão alguns exemplos de como ir sobre como personalizar o preloader:

http: //www.pathf.com/blogs/2008/08/custom-flex-3-lightweight-preloader-with-source-code/

http://groups.adobe.com/posts/15d371c71d

http: //www.webapper .net / index.cfm / 2008/1/17 / Flex-NotSo-Custom-Preloader

i encontrado preloader personalizado usando código swf externo a partir deste link
http://askmeflash.com/article_m.php?p=article&id=7

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top