Höhe von Bild ermitteln

Harlikin

Grünschnabel
Guten Morgen allerseits,

wie kann ich die höhe vone einem dynamisch geladenen Bild ermitteln? Bei mir kommt immer 0 raus und die Bilder werden übereinander geladen... :

Code:
System.useCodepage = true;

var row = new Array();

var base_x = 0;
var base_y = 0;
var abstand = 5;

var xm = new XML();
xm.ignoreWhite = true;
xm.onLoad = function() {
	for (var i=0; i<this.childNodes.length; i++) {
		row[i] = ABFrame.attachMovie("FlyerANZ", "row" + i, i);
		row[i].flyer.text = this.childNodes[i].attributes.flyer;
		row[i].flyer = this.childNodes[i].attributes.flyer;
		bild[i] = loadMovie(row[i].flyer, row[i]);		
		row[i]._x = base_x;
		row[i]._y = base_y + (row[i].bild[i]._height + abstand) * i;
	}
}
xm.load("zeilen.xml");


Bei loadMovie wird doch das Bild volständig gelagen bevors weiter geht

Grüße Josh
 
Zuletzt bearbeitet:
Du musst abwarten, bis das Bild vollständig geladen ist, bis du den nächsten Schritt instanzierst. Am besten machst du das mite ienr eingeschobenen onEnterFrame Funktion, die eben die höhe des Container MC abfragt, und dann, wenn diese grösser als 0 ist, sich selbst terminiert, und den nächsten Ladevorgang beginnt.

B
 
Hi Basileus,

danke für deine Antwort, kannst du mir ein Beispiel an Hand meiner Abfrage nennen?
Wo muss ich die onEnterFrame() einbauen? Der Movieclip wir ja aus der Libary attached, daher kann ich ja kein Actionskrip in den Clip einbauen oder?


Grüße Josh
 
Also so in etwa und ungetestet (bin gerade aufgestanden):

PHP:
bild[i] = loadMovie(row[i].flyer, row[i]);
_root.Positioniere(i);

...


_root.Positioniere = function(Bildnummer){
_root.createEmptyMovieclip("new_mc"+ Bildnummer, 1+ Bildnummer);
_root["new_mc"+ Bildnummer].onEnterFrame = function(){
if(_root.row[Bildnummer].height > 0){
_root.row[Bildnummer]._x = base_x;
_root.row[Bildnummer]._y = base_y + (row[Bildnummer].bild[Bildnummer]._height + abstand)}
..

alswo extern mit einer Funktion - was die Pfade angeht, sorry korrigier sie selber, oder poste die komplette datei mit xml und absoluten Pfaden, weil meine Kristallkugel ist gerade nicht in Betrieb

B
 
Hi,

ich Steig da nicht ganz durch, das Letzte bild wird an das vorletzte angehängt ohne Abstand...

Wieso ist das eigendlich so umständlich? In der Flashhilfe steht, das Flash erst weiter macht wenn der Befehl loadMovie(); ausgefürt ist...

Währe es auch nicht einfacher / besser / vorteilhafter mit diesem
MovieClipLoader.loadClip();
Befehl zu Arbeiten ?

Anbei nochmal mein "Rohfile"

Grüße Josh
 

Anhänge

Hallo!

Die MovieClipLoader-Klasse ist in der Tat eine sehr sinnvolle Erweiterung der Ladefunktionen von Flash. Leider ist sie erst ab MX2004 integriert. Ein enormer Vorteil dieser Klasse (gerade in Bezug auf dein Problem) ist das man eine Vielzahl an Events hat, die für einzelne Schritte des Ladeprozesses stehen. In deinem Fall wäre der Event onLoadComplete bzw. onLoadInit sehr nützlich. Mehr dazu in deiner Flash-Hilfe.

Gruss

EDIT:
Probiers mal hiermit (Code auf erstem KeyFrame des Hauptfilms):

PHP:
System.useCodepage = true;

var row = new Array();
//das hier ist neu!
function loadFlyer (file, container, xPos, yPos, abstand, i) {
	var loader = new MovieClipLoader();
	var listener = new Object();
	listener.onLoadInit = function () {
		container._x = xPos;
		container._y = yPos +((container._height + abstand)*i);
	}
	loader.addListener (listener);
	loader.loadClip(file, container);
}

var base_x = 0;
var base_y = 0;
var abstand = 5;

var xm = new XML();
xm.ignoreWhite = true;
xm.onLoad = function() {
	for (var i=0; i<this.childNodes.length; i++) {
		row[i] = ABFrame.attachMovie("FlyerANZ", "row" + i, i);
		row[i].flyer.text = this.childNodes[i].attributes.flyer;
		row[i].flyer = this.childNodes[i].attributes.flyer;
		loadFlyer (row[i].flyer, row[i], base_x, base_y,abstand,i);//hier rufst du die funktion auf
	}
}
xm.load("zeilen.xml");

Gruss
 

Anhänge

Zuletzt bearbeitet:
Das stimmt. Allerdings macht das Ding meiner Erfahrung nach zumindest für Anfänger zunächst mehr Probleme als ein simples loadMovie. So werden die meisten Ereignisse in der Flash internen Vorschau (Downloadsimulation) ignoriert und müssen online getestet werden (das hat mich am Anfang fast zur Verzweiflung gebracht, bis ich dahinterkam. ;) ).

Wenn es um einzelne Bilder geht, genügt In den meisten Fällen eine ungefähre Übersicht über die geladenen Bytes - und dafür reicht eine kleine onEnterFrame allemal:
PHP:
function loadImage(container, filename) {
    container.loadMovie(filename);
    this.onEnterFrame = function() {
        var cur = container.getBytesLoaded();
        var max = container.getBytesTotal();
        trace(cur + " von " + max + " Bytes geladen");
        if (container._width > 1) {
            trace("Bild geladen");
            delete this.onEnterFrame;
        }
    }
}

Gruß
.
 
Hallo!

Wenn es um einzelne Bilder geht, genügt In den meisten Fällen eine ungefähre Übersicht über die geladenen Bytes

@Datic:
Wenn es um Preloader und Ähnliches geht, stimme ich dir zu. Wenn ich aber nach dem Laden auf eine Eigenschaft, z.B. die Koordinaten des geladenen Clips zugreifen will, dann ist eine onEnterFrame-Kontrolle meiner Meinung nach doch sehr ungenau, gerade wenn die betreffenden Files so klein sind, dass die onEnterFrame-Funktion schon beim zweiten Aufruf gekillt wird. Und der onLoadInit-Event lässt einfach eine genauere Kontrolle zu.
Punkto Anfängerfreundlichkeit muss ich dir jedoch recht geben, die Listener-Geschichte ist wohl nicht ganz einfach zu durchschauen.

Gruss
 
Zurück