Frage

Ich versuche, einen Pre-Loader in meiner Flex-Anwendung zu erstellen / verwenden. Der Preloader ist eine Datei, die SWF 100 Frames (1 für jedes Prozent des Laders progress) aufweist. Grundsätzlich versuche ich, diese SWF-Datei in meiner Anwendung einbetten, sie auf dem Bildschirm angezeigt werden und die Rahmennummer ändert angezeigt wird, wie der Fortschritt abgeschlossen ist.

Der Code, den ich bisher haben (was Canvas erweitert):

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

Der Fehler Ich erhalte ist:

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]

Bitte helfen Sie!

War es hilfreich?

Lösung

Verwenden Sie Sprite anstelle von Leinwand als Basisklasse. Zwei Gründe, dies zu tun:

  1. Canvas hat eine Menge von Abhängigkeiten (zur Melodie von 100k + Flex-Komponenten). Sie wollen nicht vor der Anzeige Ihre preloader zu laden ist für all dies warten

  2. Canvas ist UIComponent Behälter. Verwenden Sie es, wenn Sie das Layout UIComponents wollen. In Ihrem Fall müssen Sie keine komplizierten Leinwand Layout Logik - Sie brauchen nur einen MovieClip- angezeigt werden soll. Also nicht eine Leinwand verwenden.

Um Ihre ursprüngliche Frage zu beantworten, SWFLoader und Bild sind UIComponents, die wissen, wie Bitmaps und Movieclips angezeigt werden soll. Tun Sie etwas, wie diese statt:

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

Andere Tipps

Sie müssen einen Wrapper über MovieClip haben, die die IUIComponent um addChild() passieren zu können, implementiert. Vom addChild() Dokumentation :

  

Hinweis: Während das Kind Argument an die Methode als vom Typ Display angegeben ist, muss das Argument des IUIComponent Schnittstelle implementieren als Kind von einem Container hinzugefügt werden. Alle Flex-Komponenten implementieren diese Schnittstelle.

Sie werden so etwas wie dieses brauchen:

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

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

      // add your own magic

      addChild (mc);
   }
}

Achtung: Ungeprüfte Code, sollten Sie nur eine Idee geben,

!

Hope diese Arbeit Ich versuchte dies.

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

Haben Sie einen Blick auf die Preloader Klasse und die preloader Eigenschaft des Application Klasse.

Wie die Dokumentation sagt, sollten Sie auf jeden Fall nicht verlängern die Flex UIComponent (oder Bild oder SWFLoader) Klassen für eine preloader.

Hier sind ein paar Beispiele dafür, wie die preloader gehen über das Anpassen:

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 benutzerdefinierte preloader mit externem swf-Code aus diesem Link
gefunden http://askmeflash.com/article_m.php?p=article&id=7

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top