Avatar billede eltempogigante Nybegynder
17. oktober 2007 - 00:39 Der er 16 kommentarer

størrelse af array af billeder

lad os sige jeg har et array med 15 billeder, disse loades på en samlet gang via xml. lads os så sige jeg gerne vil lave en status-indikator for den samlede størrelse samt loadning i forhold til samlet størrelse - hvordan kan jeg gøre det?

jeg har forsøgt noget i stil med:

    this.onEnterFrame = function() {
       
        for (var i:Number = 0; i<_items; i++) {
        samletStatus += billeder[i].getBytesLoaded();
       
       
        }
        trace(samletStatus)

men problemet er at man er nødt til at løbe igennem et array, og lægge værdierne sammen, men dette kludrer sig så sammen med enterFrame'en, der skal være der for at opdatere getBytesLoaded.

Jeg kan altså godt få den til at spytte de loadede værdier ud hver for sig, men jeg skal jo have summeret de 15 værdier.
Avatar billede eltempogigante Nybegynder
17. oktober 2007 - 00:40 #1
... kludret resulterer så i at værdierne løber løbsk og gentager med at summere.
Avatar billede mat Nybegynder
17. oktober 2007 - 08:53 #2
Du skal vel bare resette samletStatus inden løkken, så du ikke lægger den forrige "samletStatus" til?

mvh mat
Avatar billede eltempogigante Nybegynder
17. oktober 2007 - 12:20 #3
Ok tak, det virker "lidt", men hvis man så laver en progress-bar ud fra tallene så er denne kortvarrigt 0, og blinker dermed nærmest, hvordan kan man komme ud over dette?
Avatar billede mat Nybegynder
17. oktober 2007 - 14:48 #4
Ved at sætte progress barens størrelse efter løkken?
Avatar billede eltempogigante Nybegynder
17. oktober 2007 - 22:06 #5
Den ser sådan ud:

var crazy1:Number = 0;
            var crazy2:Number = 0;
       
    this.onEnterFrame = function() {
        crazy1 = 0
        crazy2 = 0
        for (var i:Number = 0; i<_items; i++) {
           
        crazy1 += loadingStat[i].getBytesTotal();
        crazy2 += loadingStat[i].getBytesLoaded();
       
        statusPic = crazy2/crazy1;
        }
       
       
        crazyHorse.text = statusPic;
       
        loadIndi._width = Math.round((cols*(w+s)-s)*statusPic)
       
        trace(loadIndi._width)
        if(statusPic == 1) {
            delete this.onEnterFrame;
           
        }


Og den virker fint inde i flashplayer test'eren men ude i browseren blinker statusbaren helt vildt.
Avatar billede eltempogigante Nybegynder
17. oktober 2007 - 22:11 #6
Undskyld de lidt mærkelige varibel navne - det var sent, og var løbet tør for indlysende navne.
Avatar billede mat Nybegynder
17. oktober 2007 - 23:00 #7
Skifter tekstfeltet også fra 0 til den ønskede værdi, eller kan det have noget at gøre med din udregning med "cols" og "w" og "s"?
Avatar billede eltempogigante Nybegynder
18. oktober 2007 - 00:58 #8
selve tekstfeltet springer frem og tilbage i værdi - men kun i browserer og ikke i den "interne flash authoer test player". Cols, w og s er konstante.
Avatar billede mat Nybegynder
18. oktober 2007 - 08:11 #9
Det lyder underligt - det kan ikke have noget med den måde du henter billederne på at gøre?
Avatar billede eltempogigante Nybegynder
18. oktober 2007 - 11:15 #10
Ja det tænkte jeg også og flyttede load-status koden ind i en if-statement der først kører efter arrayet med links til billederne er kørt 100 % igennem. Her er koden:

var thumbHolder:MovieClip;
var thumbClip:MovieClip;
var container:MovieClip = this.createEmptyMovieClip("container", 2);


function loadGrid():Void {
    cols = Math.floor((Stage.width-s-128)/(w+s));
    rows = Math.ceil(_items/cols);
    container._y = 64+16
   
    loadingStat = new Array();
   
    for (var i:Number = 0; i<_items; i++) {
        var thumb:String = xmlObj.firstChild.childNodes[0].childNodes[i].attributes.thumb;
        var nCat:String = xmlObj.firstChild.childNodes[0].childNodes[i].attributes.cat;
        thumbHolder = container.createEmptyMovieClip("thumbHolder"+i, i);
        thumbClip = thumbHolder.createEmptyMovieClip("thumbClip"+i, i);
        thumbClip.loadMovie(thumb);
               
        thumbHolder.i = i;
        thumbHolder.nCat = nCat;
               
        loadingStat.push(thumbClip)
           
        thumbHolder.onRelease = thumbRelease;
               
            if(i+1 == _items){
                trace("go-tjek")
                var crazy1:Number = 0;
                var crazy2:Number = 0;
                   
                this.onEnterFrame = function() {
                    crazy1 = 0
                    crazy2 = 0
                    for (var i:Number = 0; i<_items; i++) {
                        statusPic = crazy2/crazy1;
                        crazy1 += loadingStat[i].getBytesTotal();
                        crazy2 += loadingStat[i].getBytesLoaded();
                    }
           
                crazyHorse.text = statusPic;
                loadIndi._width = Math.round(512*statusPic)
                   
                trace(loadIndi._width)
                if(statusPic == 1) {
                    delete this.onEnterFrame;
                }
           
            };
        }
    }
    iniLayout()
}
Avatar billede mat Nybegynder
18. oktober 2007 - 14:08 #11
Umiddelbart virker det HELT forkert at se den "this.onEnterFrame" inde i for løkken?
Avatar billede eltempogigante Nybegynder
18. oktober 2007 - 14:37 #12
ja men på den måde bliver den først triggered efter arrayet er kørt helt igennem ( if(i+1 == _items){} ), hvis det kunne have været det, men det gør heller ingen forskel.

Her er en udgave som opfører sig på samme måde, men hvor "this.onEnterFrame" er flyttet udenfor:

var thumbHolder:MovieClip;
var thumbClip:MovieClip;
var container:MovieClip = this.createEmptyMovieClip("container", 2);


function loadGrid():Void {
    cols = Math.floor((Stage.width-s-128)/(w+s));
    rows = Math.ceil(_items/cols);
    container._y = 64+16
   
    loadingStat = new Array();
   
    for (var i:Number = 0; i<_items; i++) {
        var thumb:String = xmlObj.firstChild.childNodes[0].childNodes[i].attributes.thumb;
        var nCat:String = xmlObj.firstChild.childNodes[0].childNodes[i].attributes.cat;
        thumbHolder = container.createEmptyMovieClip("thumbHolder"+i, i);
        thumbClip = thumbHolder.createEmptyMovieClip("thumbClip"+i, i);
        thumbClip.loadMovie(thumb);
               
        thumbHolder.i = i;
        thumbHolder.nCat = nCat;
               
        loadingStat.push(thumbClip)
           
        thumbHolder.onRelease = thumbRelease;
               
           
    }
   

   
    iniLayout()
}

    var crazy1:Number = 0;
    var crazy2:Number = 0;
    this.onEnterFrame = function() {
       
        crazy1 = 0
        crazy2 = 0
       
        for (var i:Number = 0; i<_items; i++) {
            statusPic = crazy2/crazy1;
            crazy1 += loadingStat[i].getBytesTotal();
            crazy2 += loadingStat[i].getBytesLoaded();
        }
           
        crazyHorse.text = statusPic;
        loadIndi._width = Math.round(512*statusPic)
                   
        if(statusPic == 1) {
            delete this.onEnterFrame;
        }
           
    };
Avatar billede eltempogigante Nybegynder
18. oktober 2007 - 14:41 #13
Det virker også som om statusbaren når at blive den fulde længde før alle billederne popper frem - ca. 3-4 stykker inden.
Avatar billede mat Nybegynder
18. oktober 2007 - 14:42 #14
Hvorfor står "statusPic = crazy2/crazy1;" før du ved hvad "crazy2" og "crazy1" er?
Avatar billede eltempogigante Nybegynder
18. oktober 2007 - 19:02 #15
Det var et "crazy" forsøg på at se om det gjorde en forskel at sætte det først, men det gør ingen forskel åbenbart, om det står før eller lige efter.

Nu:

var thumbHolder:MovieClip;
var thumbClip:MovieClip;
var container:MovieClip = this.createEmptyMovieClip("container", 2);


function loadGrid():Void {
    cols = Math.floor((Stage.width-s-128)/(w+s));
    rows = Math.ceil(_items/cols);
    container._y = 64+16
   
    loadingStat = new Array();
   
    for (var i:Number = 0; i<_items; i++) {
        var thumb:String = xmlObj.firstChild.childNodes[0].childNodes[i].attributes.thumb;
        var nCat:String = xmlObj.firstChild.childNodes[0].childNodes[i].attributes.cat;
        thumbHolder = container.createEmptyMovieClip("thumbHolder"+i, i);
        thumbClip = thumbHolder.createEmptyMovieClip("thumbClip"+i, i);
        thumbClip.loadMovie(thumb);
               
        thumbHolder.i = i;
        thumbHolder.nCat = nCat;
               
        loadingStat.push(thumbClip)
           
        thumbHolder.onRelease = thumbRelease;
               
           
    }
   

   
    iniLayout()
}

    var crazy1:Number = 0;
    var crazy2:Number = 0;
    this.onEnterFrame = function() {
       
        crazy1 = 0
        crazy2 = 0
       
        for (var i:Number = 0; i<_items; i++) {
           
            crazy1 += loadingStat[i].getBytesTotal();
            crazy2 += loadingStat[i].getBytesLoaded();
            statusPic = crazy2/crazy1;
        }
           
        crazyHorse.text = statusPic;
        loadIndi._width = Math.round(512*statusPic)
                   
        if(statusPic == 1) {
            delete this.onEnterFrame;
        }
           
    };
Avatar billede mat Nybegynder
19. oktober 2007 - 08:25 #16
Jeg kan ikke umiddelbart få øje på noget, der ville få det til at blinke.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester