Pregunta

Estoy tratando de crear / usar un precargador en mi aplicación flex. El preloader es un archivo SWF que tiene 100 cuadros (1 por cada porcentaje del progreso del cargador). Básicamente, estoy intentando incrustar este archivo SWF en mi aplicación, mostrarlo en la pantalla y cambiar el número de fotograma que se muestra a medida que se completa el progreso.

El código que tengo hasta ahora es (que extiende Canvas):

[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();
}

El error que estoy obteniendo es:

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 ayuda!

¿Fue útil?

Solución

Usa sprite en lugar de Canvas como clase base. Dos razones para hacer esto:

  1. Canvas tiene muchas dependencias (por una suma de 100k + de componentes flexibles). No desea esperar a que todo esto se cargue antes de mostrar su preloader

  2. Canvas es el contenedor UIComponent. Úsalo cuando quieras diseñar UIComponents. En su caso, no necesita una lógica de diseño de lienzo complicada, solo necesita mostrar un clip de película. Así que no uses un lienzo.

Para responder a su pregunta original, SWFLoader e Image son componentes de UIC que saben cómo mostrar Bitmaps y MovieClips. Haz algo como esto en su lugar:

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

Otros consejos

Necesitas tener un envoltorio sobre MovieClip que implemente el IUIComponent para poder pasar a addChild () . Desde addChild () documentación :

  

Nota: mientras que el argumento secundario del método se especifica a partir del tipo DisplayObject, el argumento debe implementar la interfaz IUIComponent para agregarse como elemento secundario de un contenedor. Todos los componentes de Flex implementan esta interfaz.

Necesitarás algo como esto:

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

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

      // add your own magic

      addChild (mc);
   }
}

Advertencia: el código no probado, debe darle una idea solamente.

Espero que este trabajo Intenté esto.

[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();
}

Eche un vistazo a la Preloader class y la preloader de la aplicación clase.

Como dice la documentación, definitivamente no debe extender las clases de Flex UIComponent (o Image o SWFLoader) para un preloader.

Aquí hay algunos ejemplos de cómo personalizar el precargador:

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

Encontré un preloader personalizado utilizando código swf externo desde este enlace
http://askmeflash.com/article_m.php?p=article&id=7

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top