Zurück   Flashforum > Flash > ActionScript > ActionScript 3

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 22-01-2010, 15:49   #1 (permalink)
Neuer User
 
Registriert seit: Jan 2010
Beiträge: 10
Loader.width auslesen ?!?

Hallo,
ich sitze gerade an einer Flash-Applikation, die Bilder aus einer XML laden soll. Diese Bilder möchte ich in 2 Reihen (5 Bilder pro Reihe) darstellen. Da die Bilder aber unterschiedliche Breiten haben, gestaltet sich das nun ganz schön schwierig :-(
Die x-Position eines Bildes soll sich aus der x-Position des vorhergehenden Bildes + die Breite des vorhergehenden Bildes + 20(Abstand) ergeben. Problem ist aber, dass ich nicht weiß, wo ich die Breite eines Bildes herbekomme.
Die Bilder werden in einen loader geladen, der loader wird dann dem MovieClip Array geaddet, da dieser beim Klick getweent werden soll. Weder der Loader, noch der MC gibt mir ne Breite aus.

Mein AS sieht folgendermaßen aus:

PHP-Code:
        var array:Array = new Array;
        var 
gezoomt:Boolean false;
        var 
portfolioOffset:uint 20;
        var 
posx:Array = new Array();
        var 
breite:Array = new Array();

        

        for (var 
i:int 0xml_portfolio.tt_content.length(); i++)
        {
            var 
bild = new Object();
            
bild.titel xml_portfolio.tt_content[i].header.text();
            
bild.path "img/portfolio/" xml_portfolio.tt_content[i].image.text(); 
            var 
image_loader:Loader = new Loader();
            
image_loader.load(new URLRequest(bild.path));
            
image_loader.scaleX 0.2;
            
image_loader.scaleY 0.2;
            
image_loader.mouseEnabled false;
            
            array[
i] = new MovieClip();
            array[
i].buttonMode true;
            array[
i].addChild(image_loader);
            
trace(array[i].width);
            array[
i].addEventListener(MouseEvent.CLICKfull);
            
this.content_mc.portfolio_mc.content_portfolio_mc.addChild(array[i]);

            
//Positionierung!!!!!!!!!!!
            
if (0)
            {
                
posx[i] = posx[i-1] + breite[i-1] + portfolioOffset;
                array[
i].posx[i];
                
breite[i] = array[i].width;
                
trace("breite:"+breite[i]);
            }
            else
            {
                
posx[0] = 0;
                
breite[0] = array[0].width;

            }

        } 

Geändert von fr34k85 (22-01-2010 um 15:50 Uhr)
fr34k85 ist offline   Mit Zitat antworten
Alt 22-01-2010, 16:01   #2 (permalink)
agedoubleju
Gast
 
Beiträge: n/a
Der Loader hat ja wie ein MC erst einmal keine Höhe und Breite. Du solltest also solange warten, bis er befüllt wurde. Am besten mit einem init-Event und dessen Handler-Funktion.
  Mit Zitat antworten
Alt 22-01-2010, 16:24   #3 (permalink)
Neuer User
 
Benutzerbild von the binary
 
Registriert seit: Jul 2001
Ort: Berlin | Friedrichshain
Beiträge: 3.561
mal ein schuss ins blaue..

ActionScript:
  1. var imagesToLoad: Number = xml_portfolio.tt_content.length();
  2. var imagesLoaded: Number = 0;
  3.        
  4. function buildImages (): void {
  5.  
  6.     for (var i:int = 0; i < imagesToLoad; i++)
  7.     {
  8.         var bild = new Object();
  9.             bild.titel = xml_portfolio.tt_content[i].header.text();
  10.             bild.path = "img/portfolio/" + xml_portfolio.tt_content[i].image.text();
  11.  
  12.         var image_loader:Loader = new Loader()
  13.            
  14.             // function die ausgefuehrt wird, sobald das bild geladen wurde..
  15.             imag_loader.addEventListener(Event.COMPLETE, handleImageLoadComplete);
  16.        
  17.             image_loader.load(new URLRequest(bild.path));
  18.             image_loader.scaleX = 0.2;
  19.             image_loader.scaleY = 0.2;
  20.             image_loader.mouseEnabled = false;
  21.  
  22.         array[i] = new MovieClip();
  23.         array[i].buttonMode = true;
  24.         array[i].addChild(image_loader);
  25.         array[i].addEventListener(MouseEvent.CLICK, full);
  26.        
  27.         trace("width: "+ array[i].width);
  28.        
  29.         this.content_mc.portfolio_mc.content_portfolio_mc.addChild(array[i]);
  30.     }
  31. }
  32.  
  33. // image load-handler
  34. // check ob alle bilder geladen wurden,
  35. // wenn ja #setSize();
  36. function handleImageLoadComplete (evt:Event) {
  37.  
  38.     imagesLoaded++;
  39.    
  40.     if (imagesLoaded == imagesToLoad) {
  41.         setSize();
  42.     }
  43. }
  44.  
  45.  
  46. function setSize (): void {
  47.  
  48.     for (var i:int = 0; i < imagesToLoad; i++)
  49.     {
  50.         if (i > 0)
  51.         {
  52.             posx[i] = posx[i-1] + breite[i-1] + portfolioOffset;
  53.             array[i].x = posx[i];
  54.             breite[i] = array[i].width;
  55.             trace("breite:"+breite[i]);
  56.         }
  57.         else        {
  58.             posx[0] = 0;
  59.             breite[0] = array[0].width;
  60.         }
  61.     }
  62. }

gruss
__________________
8bm | join ff@BOINC
formpackage.org | audiohunter.de | problematica.de | 8ball-media.de/blog | taikonauten.cn
the binary ist offline   Mit Zitat antworten
Alt 22-01-2010, 16:33   #4 (permalink)
Neuer User
 
Registriert seit: Jan 2010
Beiträge: 10
danke für die schnelle Antwort. Funktioniert leider trotzdem nicht :-(
jetzt zeigt er mir die Bilder gar nicht mehr an. Vorher waren sie zwar da, aber die Positionierung klappte nur nicht...
fr34k85 ist offline   Mit Zitat antworten
Alt 22-01-2010, 16:46   #5 (permalink)
Neuer User
 
Benutzerbild von the binary
 
Registriert seit: Jul 2001
Ort: Berlin | Friedrichshain
Beiträge: 3.561
ist das timeline-code, oder klassen-code.. ?
hast du die 'loadImages'-methode auch aufgerufen.. ?
gibts fehler.. ?
__________________
8bm | join ff@BOINC
formpackage.org | audiohunter.de | problematica.de | 8ball-media.de/blog | taikonauten.cn
the binary ist offline   Mit Zitat antworten
Alt 22-01-2010, 16:49   #6 (permalink)
Neuer User
 
Registriert seit: Jan 2010
Beiträge: 10
Ok, also hier mal mein kompletter Code. Vielleicht ist es dann leichter, das Problem zu finden

PHP-Code:
//PORTFOLIO
var xml_portfolio:XML;
var 
loader_portfolio:URLLoader = new URLLoader();
loader_portfolio.load(new URLRequest("portfolio.xml"));//"http://www.marcushamel.com/index.php?id=3&type=444"));
loader_portfolio.addEventListener(Event.COMPLETEparseXML_portfolio);

function 
parseXML_portfolio(evt:Event):void
{
        
// Kommentare in der XML Datei ignorieren
        
XML.ignoreComments true;   
       
        
// Leerzeichen, Leerzeilen und Tabs ignorieren
        
XML.ignoreWhitespace true;
       
        
// XML-Objekt erstellen
        
xml_portfolio = new XML(evt.target.data);
       
        
// Inhalt ausgeben
        
var array:Array = new Array;
        var 
gezoomt:Boolean false;
        var 
portfolioOffset:uint 20;
        var 
posx:Array = new Array();
        var 
breite:Array = new Array();

        

        for (var 
i:int 0xml_portfolio.tt_content.length(); i++)
        {
            var 
bild = new Object();
            
bild.titel xml_portfolio.tt_content[i].header.text();
            
bild.path "img/portfolio/" xml_portfolio.tt_content[i].image.text();
            var 
image_loader:Loader = new Loader();
            
image_loader.load(new URLRequest(bild.path));
            
image_loader.scaleX 0.2;
            
image_loader.scaleY 0.2;
            
image_loader.mouseEnabled false;
            
            array[
i] = new MovieClip();
            array[
i].buttonMode true;
            array[
i].addChild(image_loader);
            
trace(array[i].width);
            array[
i].addEventListener(MouseEvent.CLICKfull);
            
this.content_mc.portfolio_mc.content_portfolio_mc.addChild(array[i]);

            
//Positionierung ??????????
            /*if (i > 0)
            {
                posx[i] = posx[i-1] + breite[i-1] + portfolioOffset;
                array[i].x = posx[i];
                breite[i] = array[i].width;
                trace("breite:"+breite[i]);
            }
            else
            {
                posx[0] = 0;
                breite[0] = array[0].width;

            }*/

        
}
        
//Vollbild
        
function full (e:MouseEvent
        {
            var 
ziel:Sprite Sprite(e.target);
            
            
// wenn momentan kein Bild gezoomt ist useHandCursor
            
if (gezoomt == false
            {
                
// merken, dass bereits eine Instanz auf der Bühne gezoomt wurde
                
gezoomt true;
        
                
// Instanz nach ganz oben holen (d.h. vor alle anderen Instanzen)
                
ziel.parent.setChildIndex(zielziel.parent.numChildren 1);
    
                
// Instanz zoomen
                
Tweener.addTween(ziel, {scaleX:3scaleY:3rotation:-15time:1transition:"Bounce"});
                
                
// Listener austauschen: Jetzt wird bei Klick die Funktion "klein" aufgerufen
                // für Rückbewegung an Originalposition
                
ziel.removeEventListenerMouseEvent.CLICKfull );
                
ziel.addEventListenerMouseEvent.CLICKthumb );
            }
        }
        function 
thumb (e:MouseEvent)
        {
            var 
ziel:Sprite Sprite(e.target);
            
// Variable zurücksetzen (keine Instanz auf der Bühne gezoomt)
            
gezoomt false;
                
            
// Skalierung und Position der Instanz auf Originalwerte zurücksetzen
            
Tweener.addTween(ziel, {scaleX:1scaleY:1rotation:0time:1transition:"Bounce"});

            
// Listener-Austausch rückgängig machen: Jetzt wird bei Klick wieder die Funktion "groß" aufgerufen
            
ziel.removeEventListenerMouseEvent.CLICKthumb );
            
ziel.addEventListenerMouseEvent.CLICKfull );
        }            

fr34k85 ist offline   Mit Zitat antworten
Alt 22-01-2010, 16:55   #7 (permalink)
Neuer User
 
Benutzerbild von the binary
 
Registriert seit: Jul 2001
Ort: Berlin | Friedrichshain
Beiträge: 3.561
als erstes solltest du die beiden functionen 'full' und 'thumb' mal aus der 'parse..' function rausziehen..
__________________
8bm | join ff@BOINC
formpackage.org | audiohunter.de | problematica.de | 8ball-media.de/blog | taikonauten.cn
the binary ist offline   Mit Zitat antworten
Alt 22-01-2010, 17:07   #8 (permalink)
Neuer User
 
Registriert seit: Jan 2010
Beiträge: 10
ok, hab ich gemacht. stehen jetzt außerhalb der parsexml :-)
und nun?
fr34k85 ist offline   Mit Zitat antworten
Alt 22-01-2010, 17:18   #9 (permalink)
Neuer User
 
Benutzerbild von the binary
 
Registriert seit: Jul 2001
Ort: Berlin | Friedrichshain
Beiträge: 3.561
funktionierts nun mit/ohne meinen vorschlag.. ?
__________________
8bm | join ff@BOINC
formpackage.org | audiohunter.de | problematica.de | 8ball-media.de/blog | taikonauten.cn
the binary ist offline   Mit Zitat antworten
Alt 22-01-2010, 17:23   #10 (permalink)
Neuer User
 
Registriert seit: Jan 2010
Beiträge: 10
so, ich habe dein as mit eingebaut. sieht jetzt so aus:

PHP-Code:
//PORTFOLIO
var xml_portfolio:XML;
var 
loader_portfolio:URLLoader = new URLLoader();
loader_portfolio.load(new URLRequest("portfolio.xml"));
loader_portfolio.addEventListener(Event.COMPLETEparseXML_portfolio);

function 
parseXML_portfolio(evt:Event):void
{
        
// Kommentare in der XML Datei ignorieren
        
XML.ignoreComments true;   
       
        
// Leerzeichen, Leerzeilen und Tabs ignorieren
        
XML.ignoreWhitespace true;
       
        
// XML-Objekt erstellen
        
xml_portfolio = new XML(evt.target.data);
       
        
// Inhalt ausgeben
        
var array:Array = new Array;
        var 
portfolioOffset:uint 20;
        var 
posx:Array = new Array();
        var 
breite:Array = new Array();

        

        for (var 
i:int 0xml_portfolio.tt_content.length(); i++)
        {
            var 
bild = new Object();
            
bild.titel xml_portfolio.tt_content[i].header.text();
            
bild.path "img/portfolio/" xml_portfolio.tt_content[i].image.text(); 
            
            var 
image_loader:Loader = new Loader();
            
image_loader.addEventListener(Event.COMPLETEhandleImageLoadComplete);

            
image_loader.load(new URLRequest(bild.path));
            
image_loader.scaleX 0.2;
            
image_loader.scaleY 0.2;
            
image_loader.mouseEnabled false;
            
            array[
i] = new MovieClip();
            array[
i].buttonMode true;
            array[
i].addChild(image_loader);
            
trace(array[i].width);
            array[
i].addEventListener(MouseEvent.CLICKfull);
            
this.content_mc.portfolio_mc.content_portfolio_mc.addChild(array[i]);
        }
        
        var 
imagesToLoadNumber xml_portfolio.tt_content.length();
        var 
imagesLoadedNumber 0;
        
        function 
handleImageLoadComplete (e:Event) {
         
            
imagesLoaded++;
            
            if (
imagesLoaded == imagesToLoad) {
                
setSize();
            }
        }
        
        function 
setSize (): void {
 
            for (var 
i:int 0imagesToLoadi++)
            {
                if (
0)
                {
                    
posx[i] = posx[i-1] + breite[i-1] + portfolioOffset;
                    array[
i].posx[i];
                    
breite[i] = array[i].width;
                    
trace("breite:"+breite[i]);
                }
                else        {
                    
posx[0] = 0;
                    
breite[0] = array[0].width;
                }
            }
        } 

kommen keine fehlermeldungen, aber die bilder liegen übereinander. und durch das trace("breite:"+breite[i]); bekomm ich nur 0en
fr34k85 ist offline   Mit Zitat antworten
Alt 22-01-2010, 17:43   #11 (permalink)
Neuer User
 
Registriert seit: Jan 2010
Beiträge: 10
...und die funktion handleImageLoadComplete und somit auch setSize wird nicht ausgeführt :-(
fr34k85 ist offline   Mit Zitat antworten
Alt 22-01-2010, 17:44   #12 (permalink)
Neuer User
 
Benutzerbild von the binary
 
Registriert seit: Jul 2001
Ort: Berlin | Friedrichshain
Beiträge: 3.561
mit aus der funktion rausziehen meinte ich, dass jede function fuer sich steht,
und nicht in einer anderen definiert ist..

ActionScript:
  1. //PORTFOLIO
  2. var xml_portfolio:XML;
  3. var loader_portfolio:URLLoader = new URLLoader();
  4.     loader_portfolio.load(new URLRequest("portfolio.xml"));
  5.     loader_portfolio.addEventListener(Event.COMPLETE, parseXML_portfolio);
  6.  
  7.  
  8. var imagesToLoad: Number = 0;
  9. var imagesLoaded: Number = 0;
  10.  
  11. function parseXML_portfolio(evt:Event):void
  12. {
  13.         // Kommentare in der XML Datei ignorieren
  14.         XML.ignoreComments = true;   
  15.        
  16.         // Leerzeichen, Leerzeilen und Tabs ignorieren
  17.         XML.ignoreWhitespace = true;
  18.        
  19.         // XML-Objekt erstellen
  20.         xml_portfolio = new XML(evt.target.data);
  21.        
  22.        // anzahl der zu ladenden bilder
  23.        imagesToLoad: Number = xml_portfolio.tt_content.length();
  24.        
  25.        
  26.         // Inhalt ausgeben
  27.         var array:Array = new Array;
  28.         var portfolioOffset:uint = 20;
  29.         var posx:Array = new Array();
  30.         var breite:Array = new Array();
  31.  
  32.         for (var i:int = 0; i < xml_portfolio.tt_content.length(); i++)
  33.         {
  34.             var bild = new Object();
  35.             bild.titel = xml_portfolio.tt_content[i].header.text();
  36.             bild.path = "img/portfolio/" + xml_portfolio.tt_content[i].image.text();
  37.            
  38.             var image_loader:Loader = new Loader();
  39.             image_loader.addEventListener(Event.COMPLETE, handleImageLoadComplete);
  40.  
  41.             image_loader.load(new URLRequest(bild.path));
  42.             image_loader.scaleX = 0.2;
  43.             image_loader.scaleY = 0.2;
  44.             image_loader.mouseEnabled = false;
  45.            
  46.             array[i] = new MovieClip();
  47.             array[i].buttonMode = true;
  48.             array[i].addChild(image_loader);
  49.             trace(array[i].width);
  50.             array[i].addEventListener(MouseEvent.CLICK, full);
  51.             this.content_mc.portfolio_mc.content_portfolio_mc.addChild(array[i]);
  52.         }
  53. } 
  54.        
  55. function handleImageLoadComplete (e:Event) {
  56.    
  57.     imagesLoaded++;
  58.    
  59.     trace("handleImageLoadComplete() -loaded: "+ imagesLoaded);
  60.    
  61.     if (imagesLoaded == imagesToLoad) {
  62.         setSize();
  63.     }
  64. }
  65.        
  66.  
  67. function setSize (): void {
  68.  
  69.     trace("setSize()");
  70.  
  71.     for (var i:int = 0; i < imagesToLoad; i++)
  72.     {
  73.         if (i > 0)
  74.         {
  75.             posx[i] = posx[i-1] + breite[i-1] + portfolioOffset;
  76.             array[i].x = posx[i];
  77.             breite[i] = array[i].width;
  78.             trace("breite:"+breite[i]);
  79.         }
  80.         else {
  81.             posx[0] = 0;
  82.             breite[0] = array[0].width;
  83.         }
  84.     }
  85. }

was passiert nun.. ?
__________________
8bm | join ff@BOINC
formpackage.org | audiohunter.de | problematica.de | 8ball-media.de/blog | taikonauten.cn
the binary ist offline   Mit Zitat antworten
Alt 22-01-2010, 17:45   #13 (permalink)
Neuer User
 
Registriert seit: Jan 2010
Beiträge: 10
ahhh, ich habs!!!

dein as ist richtig, hast nur bei image_loader.addEventListener(Event.COMPLETE, handleImageLoadComplete);
das "contentLoaderInfo"-objekt vergessen

also, vielen dank für deine hilfe :-)
fr34k85 ist offline   Mit Zitat antworten
Alt 22-01-2010, 17:53   #14 (permalink)
Neuer User
 
Registriert seit: Jan 2010
Beiträge: 10
achso, ich hab noch was! :-(

ich habe für die bilder nur eine beschränkte anzeige (600 pixel in der breite).

wie kann ich das machen, dass er bei 600 in die zweite zeile wechselt und den rest bilder dort anzeigt?
fr34k85 ist offline   Mit Zitat antworten
Alt 22-01-2010, 18:11   #15 (permalink)
Neuer User
 
Benutzerbild von the binary
 
Registriert seit: Jul 2001
Ort: Berlin | Friedrichshain
Beiträge: 3.561
unter der annahme, dass alle bilder gleich breit/hoch sind,
versuchs mal damit..

ActionScript:
  1. function setSize (): void {
  2.  
  3.     trace("setSize()");
  4.  
  5.     var maxWidth: Number = 600;
  6.  
  7.     var xd: Number = 5;        // x-abstand zwischen den bildern
  8.     var yd: Number = 5;        // y-abstand zwischen den bildern
  9.  
  10.     var iw: Number = array[0].width;   // image width
  11.     var ih: Number = array[0].height// image height
  12.     
  13.     var cols: Number = Math.floor(maxWidth/(iw+xd));
  14.  
  15.     for (var i:int = 0; i < imagesToLoad; i++)
  16.     {
  17.         iw = array[i].width;
  18.         ih = array[i].height;
  19.        
  20.         array[i].x = Number((i%cols) * (iw+xd));
  21.         array[i].y = Number((int(i/cols) * (ih+yd));
  22.     }
  23. }

gruss
__________________
8bm | join ff@BOINC
formpackage.org | audiohunter.de | problematica.de | 8ball-media.de/blog | taikonauten.cn
the binary 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
Loader content.width m9k ActionScript 3 2 31-08-2009 10:29
width und height aus swf auslesen ThorstenW Am Rande 9 25-05-2007 12:10
Width & heigth auslesen - Filmgröße Jekill ActionScript 1 12 07-08-2001 14:43
Width & heigth des filmes auslesen Jekill Flash 4 und Flash 5 0 02-08-2001 14:13


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:56 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele