Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

ponto&vetor

Preloader em AS3 - funciona, mas tem um comportamento estranho

Recommended Posts

Salve salve galera ActionScript, tudo certo?

 

Estou desenvolvendo um site em AS3 com o Flash CS4. Manjo de OOP mas tem algumas coisas no Flash que são meio obscuras para mim, hehe!!

 

Agora empaquei num problema cabeludo, quem manjar de AS3 orientado a objeto pode me ajudar, por favor?

 

Então, minha dúvida é a seguinte: criei uma boa e velha galeria com Flash+XML+PHP, coloquei thumbs e a foto maior, estou usando a classe uiLoader para carregar e redimensionar as imagens externas (tanto para thumbs quanto para a maior, usando instâncias diferentes da classe uiLoader)

 

O negócio é que, testando o flash com ctrl+Enter e Simulate Download, percebi que o preloader ficava mais lento à medida que clicava nas thumbs.

 

O preloader carregava cada vez mais lento, mesmo carregando a mesma foto!

 

Bom, explicando melhor - os códigos abaixo estão em métodos, dentro de classes. Coloquei partes do código para não ficar muito grande

 

uiLoaderTb = new UILoader(); //novo objeto uiLoader
uiLoaderTb.unload(); //descarregando qq coisa carregada antes, certo? Isso libera totalmente a memória (acredito eu)
uiLoaderTb.load(urlRequest); // não coloquei listener para o carregamento, pois as thumbs são bem leves.
thumb = new Thumb; //uma classe para desenhar um container para as thumbs
thumb.alvo.addChild(uiLoaderTb);
				
thumb.buttonMode = true;
thumb.addEventListener(MouseEvent.CLICK, exibeFoto); // dispara o evento para carregar a foto maior.

Nenhum novidade certo? Aproveitando a deixa, se alguém achar que a performance pode ser melhorada aqui, vale qualquer dica! Prosseguindo...

 

if(getChildByName('foto'))
removeChild(getChildByName('foto')); //evitando objetos duplicados 
			
urlRequest = new URLRequest(e.currentTarget.foto); // foto é uma propriedade da classe Thumb. É o caminho para a foto maior
uiLoader = new UILoader(); // outro objeto uiLoader
uiLoader.unload(); // descarregando
			
//abaixo os eventos para gerar o preloader
uiLoader.addEventListener(Event.OPEN, loaderOpen);
uiLoader.addEventListener(ProgressEvent.PROGRESS, loaderProgress);
uiLoader.addEventListener(Event.COMPLETE, addFoto)

uiLoader.load(urlRequest); // carrega a foto maior. Essa sim precisa do preloader, e aqui começa o problema...

Bem, os métodos loaderOpen, loaderProgress e addFoto fazem, respectivamente: o preloader aparecer onde será carregada a foto, a barra do preloader aumentar (aquela conta básica, Math.floor(100 * (e.bytesLoaded / e.bytesTotal)) ) e enfim exibem a foto no lugar. Tudo está funcionando, exceto pelo seguinte:

 

Na primeira vez que se clica em alguma thumb, o carregamento ocorre normalmente. Mas se eu clicar novamente (mesmo que seja na mesma thumb) o carregamento fica mais lento, como se tivesse outra coisa sendo carregada, ou como se a propriedade bytesTotal ficasse de repente maior (não fica, pos dei um trace e o valor exibido é o mesmo). Cada clique que eu dou faz o carregamento ficar cada vez mais lento.

 

Como posso fazer então? Ainda não conheço as entranhas do AS3, por isso devo ter deixado passar alguma coisa.

 

Valeu desde já! Abraço a todos!

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu até dei eu pesquisada para ver, mas não achei nada certo, então é só uma teoria

 

mas eu acho que você deveria usar a classe Loader no lugar da UILoader

 

ela seria mais leve, , pode ser isso o problema, vale fazer um teste,

 

pois não vai mudar quase nada o código(na Loader, os addEventListener

 

são colocados na propriedade contentLoaderInfo dela)

 

 

 

 

outra coisa, para melhorar a performance, você poderia guardar as instancias de uiLoader criadas, e caso

 

a mesma foto fosse clicada para carregar, você já teria ela lá, e mandaria exibir

 

 

 

[]´s

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu até dei eu pesquisada para ver, mas não achei nada certo, então é só uma teoria

 

mas eu acho que você deveria usar a classe Loader no lugar da UILoader

 

ela seria mais leve, , pode ser isso o problema, vale fazer um teste,

 

pois não vai mudar quase nada o código(na Loader, os addEventListener

 

são colocados na propriedade contentLoaderInfo dela)

 

 

 

 

outra coisa, para melhorar a performance, você poderia guardar as instancias de uiLoader criadas, e caso

 

a mesma foto fosse clicada para carregar, você já teria ela lá, e mandaria exibir

 

 

 

[]´s

 

Valeu pela dica Eder, eu usei a classe UILoader porque ela permite que eu redimensione o arquivo carregado. Troquei pela Loader mas dá no mesmo...

 

Eu sei que preciso chamar o método close() da Loader para parar o carregamento, mas ainda não consegui usa-lo da forma correta.

 

Mesmo assim, obrigado! Vou continuar testando, uma hora vai! Qualquer ajuda será de mucho gusto!

 

Um abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.