Question

J'essaie de créer / utiliser un pré-chargeur dans mon application flex. Le préchargeur est un fichier SWF comportant 100 images (1 pour chaque pourcentage de la progression du chargeur). En gros, j'essaie d'incorporer ce fichier SWF dans mon application, de l'afficher à l'écran et de modifier le numéro de l'image affichée au fur et à mesure de l'avancement du processus.

Le code que j’ai jusqu’à présent est (qui étend 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();
}

L'erreur que je reçois est la suivante:

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]

S'il vous plaît, aidez!

Était-ce utile?

La solution

Utilisez l'image-objet au lieu de Canvas comme classe de base. Deux raisons pour cela:

  1. Canvas a beaucoup de dépendances (à hauteur de 100k + de composants flex). Vous ne voulez pas attendre que tout cela se charge avant d'afficher votre préchargeur

  2. Canvas est un conteneur UIComponent. Utilisez-le lorsque vous souhaitez disposer de UIComponents. Dans votre cas, vous n'avez pas besoin d'une logique compliquée de mise en page de la toile, vous avez juste besoin d'afficher un MovieClip. Donc, n'utilisez pas de toile.

Pour répondre à votre question initiale, SWFLoader et Image sont des composants UIC qui savent comment afficher les bitmaps et les MovieClips. Faites quelque chose comme ceci à la place:

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

Autres conseils

Vous devez disposer d'un wrapper sur MovieClip qui implémente le IUIComponent afin de pouvoir passer à addChild () . A partir de addChild () documentation :

  

Remarque: Bien que l'argument enfant de la méthode soit spécifié avec le type DisplayObject, l'argument doit implémenter l'interface IUIComponent pour être ajouté en tant qu'enfant d'un conteneur. Tous les composants Flex implémentent cette interface.

Vous aurez besoin de quelque chose comme ça:

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

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

      // add your own magic

      addChild (mc);
   }
}

Attention: le code non testé ne devrait vous donner qu'une idée!

J'espère que ce travail J'ai essayé ça.

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

Consultez le Preloader . classe et la propriété preloader de l'application classe.

Comme le dit la documentation, vous ne devez absolument pas étendre les classes Flex UIComponent (ou Image ou SWFLoader) pour un préchargeur.

Voici quelques exemples de personnalisation du préchargeur:

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

J'ai trouvé un préchargeur personnalisé en utilisant du code swf externe à partir de ce lien
http://askmeflash.com/article_m.php?p=article&id=7

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top