2 votes

Chargement et lecture d'un fichier SWF intégré dans Flex / Actionscript

J'essaie de créer / utiliser un pre-loader dans mon application flex. Le préchargeur est un fichier SWF qui a 100 images (1 pour chaque pourcentage de progression du chargeur). J'essaie d'intégrer 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 la progression.

Le code que j'ai jusqu'à présent est le suivant (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 j'obtiens 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]

Aidez-nous !

2voto

dirkgently Points 56879

Il est nécessaire d'avoir une enveloppe au-dessus de MovieClip qui met en œuvre le IUIComponent afin de pouvoir passer à addChild() . De la addChild() [la documentation](http://livedocs.adobe.com/flex/3/langref/mx/core/Container.html#addChild()) :

Remarque : Bien que l'argument enfant de la méthode soit spécifié comme étant de 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 ceci :

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

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

      // add your own magic

      addChild (mc);
   }
}

Avertissement : Code non testé, doit vous donner une idée seulement !

2voto

Jatin Points 11

J'espère que cela fonctionnera J'ai essayé ceci.

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

1voto

Brian Points 545

Utiliser sprite au lieu de Canvas comme classe de base. Il y a deux raisons à cela :

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

  2. Canvas est un conteneur UIComponent. Il est utilisé lorsque vous souhaitez mettre en page des UIComponents. Dans votre cas, vous n'avez pas besoin d'une logique de mise en page compliquée - il vous suffit d'afficher un MovieClip. N'utilisez donc pas de canevas.

Pour répondre à votre question initiale, SWFLoader et Image sont des UIComponents qui savent comment afficher des Bitmaps et des MovieClips. Faites plutôt quelque chose comme ceci :

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

1voto

Sly_cardinal Points 3109

Jetez un coup d'œil à la Préchargeur et la classe préchargeur de la classe Application.

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

Voici quelques exemples de la manière de personnaliser le 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

1voto

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X