2012-04-04 4 views
0

Ich habe ein Flex 3-Projekt mit einem Root-MX: Anwendung. Die Breite und die Höhe werden auf pct-Werte festgelegt, da die Anwendung mehrere Größen aufweist, die vom Benutzer ausgewählt werden können. Daher wird die richtige Größe im Attribut width der Einbettungsbreite festgelegt.Wie kann ich auf das Attribut width des embed-Objekts innerhalb meiner Anwendung swf zugreifen?

Ich versuche herauszufinden, wie auf den Wert in diesem Attribut zugreifen. Ich habe an mehreren Stellen gelesen, dass this.root.loaderInfo.width mir diesen Wert geben sollte, aber es gibt immer 500 zurück, was vermutlich auf die Standardbreite des Anwendungscontainers zurückzuführen ist (siehe http://help.adobe.com/en_US/flex/using/WS2db454920e96a9e51e63e3d11c0bf62d75-7fff.html).

Ich weiß, ich könnte es als Flashvar übergeben, aber das ist in diesem Fall keine gute Lösung aufgrund der Art des Projekts. Ich habe auch Application.application.width, stage.width und stage.stageWidth versucht, um einige zu nennen. Ich kann mich nicht auf einen dieser Werte verlassen, da sie sich je nach Browser-Zoomstufe ändern.

Was ich wirklich brauche, ist das Breitenattribut der Einbettung. Vorschläge?

Danke für Ihre Hilfe.

+0

„da sie auf der Browser-Zoom-Ebene basierend ändern“ - sind Sie sicher? Hast du einige Tests gemacht, um es zu bestätigen? –

+0

ExternalInterface ist es! Ich erkannte, dass ich die Callback-Funktion zum Embed-Skript hinzufügen konnte. So, jetzt rufe ich ExternalInterface von der SWF nach dem Einrichten des Rückrufs. Die Lösung kommt, sobald ich sie veröffentlichen kann (nach 8 Stunden). –

Antwort

1

Die Breite stage.stageWidth hängt von der scale mode Einstellung der SWF ab. stage.scaleMode = StageScaleMode.NO_SCALE;, die Flex verwendet, gibt die Größe des Containers zurück. Es wirkt sich sowohl auf die Einbettungsgröße als auch auf die Zoomstufe des Browsers aus.

Wenn stage.scaleMode auf einen anderen Wert gesetzt ist, werden die in der SWF definierten Dimensionen zurückgegeben, wobei immer derselbe Wert zurückgegeben wird. Und wie Sie bereits erwähnt haben, gibt loaderInfo.width die in der SWF-Datei festgelegten Dimensionen zurück, unabhängig vom Skalierungsmodus oder von eingebetteten Dimensionen. Leider gibt es keine Einstellung, so dass es von der Einbettungsgröße betroffen ist, aber nicht der Browser-Zoomstufe.

Die einzige Möglichkeit, die Abmessungen des Containers unabhängig von der Browser-Zoomstufe zu finden, wäre, sie als Parameter im Einbettungscode einzugeben oder ExternalInterface zu verwenden, wie in wvxvw erwähnt. Ich könnte die Flash-Var-Route gehen - Sie wählen zwischen verschiedenen Layouts, also ist es angemessen, eine Einstellung zu haben, anstatt implizit basierend auf der Containergröße zu wählen. Alternativ können Sie das Layout basierend auf einer Reihe von Dimensionen/Seitenverhältnissen anstelle von bestimmten Werten auswählen.

+1

Danke für die hilfreiche Antwort. Ich bin dann auf die ExternalInterface-Route gegangen, da das SWF bereits auf verschiedenen Seiten in einer Weise lebt, die es mir nicht leicht machen würde, die Flashvars zu aktualisieren. Werde meine Lösung posten, sobald mich der Stack überläuft. –

0

Am Ende muss die externe Schnittstelle verwendet werden. Hier ist die js ich zu dem js hinzugefügt einbetten Datei:

function getSwfDimensions() { 
    var swf = document.getElementById('myMovie'); 
    sendSwfDimensions({width:swf.width, height:swf.height}); 
} 
function sendSwfDimensions(d) { 
    thisMovie("myMovie").sendToActionScript(d); 
} 
function thisMovie(movieName) { 
    if (navigator.appName.indexOf("Microsoft") != -1) { 
     return window[movieName]; 
    } else { 
     return document[movieName]; 
    } 
} 

Und im Flash:

private function getSwfDimensions():void { 
    ExternalInterface.addCallback("sendToActionScript", swfDimensionsReceived); 
    ExternalInterface.call("getSwfDimensions"); 
} 
public function swfDimensionsReceived(d):void { 
    //set the width and height 
    this._width = this.width = d.width; 
    this._height = this.height = d.height; 
    //set up a listener to handle browser zoom changes 
    this.stage.addEventListener(Event.RESIZE, onStageResize); 
} 
+0

FYI ExternalInterface unterstützt Rückgabewerte von JavaScript –

+0

Können Sie ein Beispiel dafür geben? –

Verwandte Themen