Zurück   Flashforum > Flash > ActionScript > ActionScript 3

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 20-01-2012, 09:41   #1 (permalink)
Neuer User
 
Registriert seit: Jan 2012
Beiträge: 13
Bild laden und Breite abfragen

Hallo Leute,

ich will in meiner fla-Datei ein Bild in einen MC laden und positionieren. Über die x und y Eigenschaft ist das auch kein Problem.

Da mein Movieclip später allerdings maskiert wird, sehe ich nur einen Ausschnitt von dem geladenen Bild. Ich möchte das geladene Bild in dem Ausschnitt zentrieren.
Dazu muss ich jedoch vor Platzierung des Bildes abfragen, welche Breite und Höhe es in Pixeln hat.

Mein Code bisher:
Code:
// MCs anlegen, Bilder einladen und auf Bühne platzieren
var ldr1:Loader = new Loader();
var bild1:MovieClip = new MovieClip();
ldr1.load(new URLRequest("pic1.jpg"));
bild1.x = (200 - ldr1.width) / 2;			// linker Abstand
bild1.y = (150 - ldr1.height) / 2;			// oberer Abstand
bild1.addChild(ldr1);
this.addChild(bild1);
Hier ergeben aber ldr1.width und ldr1.height jeweils 0.

Ich habe auch andere Varianten probiert; entweder erhalte ich auch 0 oder Fehlermeldungen (nicht weit genug geladen oder Eigenschaft nicht verfügbar):
ldr1.content.width
ldr1.contentLoaderInfo.width
ldr1.LoaderInfo.width
ldr1.content.loaderInfo.width

Wie kann ich Breite und Höhe von externen Bitmaps abfragen??
Jemand ne Idee?
der.milco ist offline   Mit Zitat antworten
Alt 20-01-2012, 09:51   #2 (permalink)
Flash-Designer
 
Benutzerbild von Martin Kraft
 
Registriert seit: May 2006
Ort: Wiesbaden
Beiträge: 6.162
Hallo und willkommen im Forum!

Dein Problem ist, dass Flash die Breite erst kennen kann, wenn das Bild Tatsächlich geladen wurde. Und das geschieht eben nicht in »no-time«

Du musst daher auf das zugehörige COMPLETE-Event warten:
ActionScript:
  1. ldr1.contentLoaderInfo.addEventListener(Event.COMPLETE, handleComplete);
  2. function handleComplete(e:Event):void {
  3.     trace(ldr1.width + " / " + ldr1.height);
  4. }
Diesem MovieClip-Container kannst Du Dir übrigens sparen!
  1. MovieClips benötigt man in AS3 generell nur noch, wenn sie tatsächlich Zeitleistenanimationen enthalten. Ansonsten reichen Sprites.
  2. Und da der Loader selbst ein AnzeigeObjekt ist, benötigt man gar keine Conatiner mehr, sondern kann ihn selbst direkt mit addChild in die Anzeigeliste hängen.
__________________
Viele Grüße // Martin

Martin Kraft // Interaktionsdesign

Hilfreiche Websites:
// Hilfe zur Adobe Flash Plattform
// ActionScript 2 Referenz
// ActionScript 3 Referenz
// ActionScript 3 Arbeitshandbuch
// weitere Flash Ressourcen

Bitte keine Flashfragen per PM oder Profilnachricht! Dafür ist das Forum da!

Geändert von Martin Kraft (20-01-2012 um 09:53 Uhr)
Martin Kraft ist offline   Mit Zitat antworten
Alt 21-01-2012, 05:50   #3 (permalink)
Neuer User
 
Registriert seit: Jan 2012
Beiträge: 13
Hallo Martin,

danke für deine Antwort. Das habe ich schon geahnt, dass ich über den Event.COMPLETE gehen muss. Hätte allerdings gedacht, dass sich das trotzdem irgendwie abfragen lässt, da ich ja auch die Anzahl der geladenen Bytes und der totalen Bytes abfragen kann.
Aber gut: bekomm ich hin.

Zu deinem anderen Hinweis:
Was du nicht wissen konntest ist, dass das Bild etwas später im AS-Code per Tween bewegt werden soll. Für mein bisheriges Verständnis brauche ich doch für einen Tween immer einen MovieClip, oder?
Kann ich einen Sprite auch dynamisch tweenen?

Wenn ich das Bild mit addChild auf die Bühne platziere, kann ich es hinterher nicht mehr ansprechen, um es zu tweenen, richtig?
der.milco ist offline   Mit Zitat antworten
Alt 21-01-2012, 09:36   #4 (permalink)
Flash-Designer
 
Benutzerbild von Martin Kraft
 
Registriert seit: May 2006
Ort: Wiesbaden
Beiträge: 6.162
Das, was Du da beschreibst, kannst Du auch alles direkt mit dem Loader selbst machen. Der ist ein vollwertiges AnzeigeObjekt. Solange Du also ein Referenz (Variable) auf ihn hast...

Und per AS tweenen kann man sowieso jedes beliebige Objekt.

Der einzige Unterschied zwischen Sprites und MovieClips ist übrigens, dass letztere eine Zeitleiste mit mehreren Frames und die entsprechenden Steuerbefehle besitzen. Ansonsten sind die beiden Klassen identisch.
__________________
Viele Grüße // Martin

Martin Kraft // Interaktionsdesign

Hilfreiche Websites:
// Hilfe zur Adobe Flash Plattform
// ActionScript 2 Referenz
// ActionScript 3 Referenz
// ActionScript 3 Arbeitshandbuch
// weitere Flash Ressourcen

Bitte keine Flashfragen per PM oder Profilnachricht! Dafür ist das Forum da!
Martin Kraft ist offline   Mit Zitat antworten
Alt 21-01-2012, 20:12   #5 (permalink)
Neuer User
 
Registriert seit: Jan 2012
Beiträge: 13
Hallo Martin,
so kurz vorm Ziel und schon wieder Probleme! Ich habe den Code umgeschrieben. Allerdings geht es um mehrere Bilder, die die gleiche Funktion verwenden sollen, wenn sie jeweils geladen wurden. Ich schaffe es aber nicht, die Quelle abzufragen.
Code:
var bild1:Loader = new Loader();
bild1.load(new URLRequest("pic1.jpg"));
bild1.contentLoaderInfo.addEventListener(Event.COMPLETE, fertig);
container.addChild(bild1);

var bild2:Loader = new Loader();
bild2.load(new URLRequest("pic02.jpg"));
bild2.contentLoaderInfo.addEventListener(Event.COMPLETE, fertig);
container.addChild(bild2);

function fertig(event:Event):void {
	trace(event.target);
	if (event.target.name == "bild1") {
		trace(bild1.width + " / " + bild1.height);
	} else if (event.target.name == "bild2") {
		trace(bild2.width + " / " + bild2.height);
	}
}
Hier bekomme ich aber im Ausgabe-Fenster folgende Meldung:
Code:
[object LoaderInfo]
ReferenceError: Error #1069: Eigenschaft name für flash.display.LoaderInfo nicht gefunden und es ist kein Standardwert vorhanden.
	at ausschnitt_fla::MainTimeline/fertig()
[object LoaderInfo]
ReferenceError: Error #1069: Eigenschaft name für flash.display.LoaderInfo nicht gefunden und es ist kein Standardwert vorhanden.
	at ausschnitt_fla::MainTimeline/fertig()
Wie kann ich den aufrufenden Loader unterscheiden?
der.milco ist offline   Mit Zitat antworten
Alt 22-01-2012, 11:03   #6 (permalink)
Flash-Designer
 
Benutzerbild von Martin Kraft
 
Registriert seit: May 2006
Ort: Wiesbaden
Beiträge: 6.162
Das hat gleich mehrere Gründe:
  • Zum einen zeigt die event.target in diesem Fall nicht auf den Loader selbst, sondern auf die zugehörige LoaderInfo-Instanz (contentLoaderInfo). Und die besitzt nunmal keinen Eigenschaft namens name. Um an diese zukommen müsste Dein Code also so aussehen:
    ActionScript:
    1. LoaderInfo(event.target).loader.name

  • Zum anderen hat das, was da in name drin steht, nichts mit dem Namen der Variablen zu tun, die auf die betreffende Instanz zeigt (was auch einleuchtet, da ja beliebig viele Variablen auf dieselbe Instanz zeigen können), sondern kann frei vergeben werden und wird bei der Instanziierung vom FlashPlayer mit "instance"+<LaufendeNummer> vorbelegt:
    ActionScript:
    1. import flash.display.Sprite;
    2.  
    3. var ref1:Sprite = new Sprite();
    4. trace(ref1.name); // -> instance1
    5.  
    6. var ref2:Sprite = ref1;
    7. trace(ref2.name); // -> instance1
    8. trace(ref1 == ref2); // -> true
    9.  
    10. ref1.name = "test";
    11. trace(ref1.name+" == "+ref2.name)// -> test == test
    12.  
    Nur bei in der Flash IDE selbst erstellten Instanzen entspricht name dem Namen einer auf diese Instanz zeigenden Variablen. Anders als in der statischen Anzeigeliste von AS1/2 sind in AS3 die Instanznamen von der dynamischen Anzeigeliste entkoppelt, weshalb es in den seltensten Fällen überhaupt Sinn macht mit ihnen zu arbeiten. Auf name, getChildByName und Co. kann und sollte man daher in 99% aller Fälle verzichten!
Im Grunde ist das auch alles völlig überflüssig, weil es Dir ja eigentlich nur darum geht, in der Listener-Funktion wieder an eine Referenz auf Deinen Loader zu kommen. Und an die kommst Du so:
ActionScript:
  1. var imageLoader:Loader = LoaderInfo(event.target).loader;
Ein Tipp noch: Immer wenn man anfängt irgendwie seine Objekte durchzunummerieren, ist das ein untrügliches Zeichen dafür, dass man besser mit einem Array arbeiten sollte. Und das sähe in Deinem Fall so aus:
ActionScript:
  1. import flash.display.Loader;
  2. import flash.display.LoaderInfo;
  3. import flash.events.Event;
  4. import flash.net.URLRequest;
  5.  
  6. var urlsToLoad:Array = ["pic1.jpg", "pic02.jpg"];
  7. var images:Array = [];
  8. var imageLoader:Loader;
  9.  
  10. for each (var url:String in urlsToLoad) {
  11.    
  12.     imageLoader = new Loader();
  13.     imageLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, handleImageComplete);
  14.     imageLoader.load(new URLRequest(url));
  15.    
  16.     images.push(imageLoader);
  17.    
  18.     container.addChild(imageLoader);
  19. }
  20.  
  21. function handleImageComplete(event:Event):void {
  22.     var imageLoader:Loader = LoaderInfo(event.target).loader;
  23.     trace(imageLoader.width + " / " + imageLoader.height);
  24. }
__________________
Viele Grüße // Martin

Martin Kraft // Interaktionsdesign

Hilfreiche Websites:
// Hilfe zur Adobe Flash Plattform
// ActionScript 2 Referenz
// ActionScript 3 Referenz
// ActionScript 3 Arbeitshandbuch
// weitere Flash Ressourcen

Bitte keine Flashfragen per PM oder Profilnachricht! Dafür ist das Forum da!
Martin Kraft ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Flash 8] bild laden und auf mc breite&höehe anpassend scallieren? palpalo Flash Einsteiger 6 26-05-2011 10:10
JPG-Breite abfragen Stoschka Flash MX 2004 6 30-03-2008 13:45
MovieClip nach dem Laden eines Bildes in der Breite kleiner als das Bild FLASHStyler ActionScript 1 4 02-02-2007 07:07
Abfragen der Breite....? PistolMichi ActionScript 1 3 22-03-2005 15:45
actionscript: breite abfragen Beach Flash 4 und Flash 5 4 10-04-2002 17:52


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:14 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele