Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá, pessoal. Estou tentando construir uma classe para exibir um SWF externo dentro de meu filme principal. O código que eu consegui montar até agora não retorna nenhum erro, mas também não mostra o SWF no palco. Será que podem me ajudar :mellow:
Segue o Código:
package layout {
//Importando funções usadas normalmente no FLA
import flash.display.*;
import flash.events.*;
import flash.net.*;
import flash.text.*;
public class SWFExterno extends Sprite {
public function SWFExterno(url_recebida:String) {
var requisicao:URLRequest = new URLRequest(url_recebida);
var loader:Loader = new Loader();
configureListeners(loader.contentLoaderInfo);
loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, mostraProgresso);
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, mostraCompleto);
loader.load(requisicao);
}
private function mostraProgresso(event:ProgressEvent):void {
var percentualCarregado:Number = event.bytesLoaded/event.bytesTotal;
percentualCarregado = Math.round(percentualCarregado * 100);
//Mostrando a porcentagem carregada
var percent_carregado:TextField = new TextField();
percent_carregado.text = "Carregando: " + percentualCarregado + "%";
percent_carregado.alpha = 1;
percent_carregado.x = 25;
percent_carregado.y = 525;
trace("Carregando: " + percentualCarregado + "%");
this.addChild(percent_carregado);
}
private function mostraCompleto(event:Event):void {
event.currentTarget.removeEventListener(Event.COMPLETE, mostraProgresso);
this.addChild(event.currentTarget.content);
trace("Completo");
}
private function removerSWF(event:Event):void {
}
private function configureListeners(dispatcher:IEventDispatcher):void {
dispatcher.addEventListener(Event.COMPLETE, completeHandler);
dispatcher.addEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatusHandler);
dispatcher.addEventListener(Event.INIT, initHandler);
dispatcher.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
dispatcher.addEventListener(Event.OPEN, openHandler);
dispatcher.addEventListener(ProgressEvent.PROGRESS, progressHandler);
dispatcher.addEventListener(Event.UNLOAD, unLoadHandler);
}
private function completeHandler(event:Event):void {
trace("completeHandler: " + event);
}
private function httpStatusHandler(event:HTTPStatusEvent):void {
trace("httpStatusHandler: " + event);
}
private function initHandler(event:Event):void {
trace("initHandler: " + event);
}
private function ioErrorHandler(event:IOErrorEvent):void {
trace("ioErrorHandler: " + event);
}
private function openHandler(event:Event):void {
trace("openHandler: " + event);
}
private function progressHandler(event:ProgressEvent):void {
trace("progressHandler: bytesLoaded=" + event.bytesLoaded + " bytesTotal=" + event.bytesTotal);
}
private function unLoadHandler(event:Event):void {
trace("unLoadHandler: " + event);
}
}//Fecha Class
}//Fecha Package
Agradeço desde já quem puder ajudar...
Efetuei um teste seguindo seu exemplo... mas obtive o seguinte erro:
1067: Implicit coercion of a value of type index:Main Timeline to an unrelated type flash.display:Stage
Pode me ajudar a resolver?
SWFExterno.as
package carregador {
//Efetuando importações necessárias
import flash.display.*;
import flash.events.*;
import flash.net.*;
import flash.text.*;
public class SWFExterno extends Sprite {
public var loader:Loader = new Loader();
public var requisicao:URLRequest;
public var palco:Stage;
public function SWFExterno(stg:Stage) {
this.palco = stg;
}
public function carregaSWF(url_recebida:String):void {
requisicao = new URLRequest(url_recebida);
loader.contentLoaderInfo.addEventListener(Event.OPEN, verificaAbertura);
loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, mostraProgresso);
loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, verificaIOError);
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, mostraCompleto);
loader.load(requisicao);
}
private function mostraProgresso(event:ProgressEvent):void {
var percentualCarregado:Number = event.bytesLoaded/event.bytesTotal;
percentualCarregado = Math.round(percentualCarregado * 100);
//Mostrando a porcentagem carregada
var percent_carregado:TextField = new TextField();
percent_carregado.alpha = 1;
percent_carregado.textColor = 0xFF0000;
percent_carregado.border = true;
percent_carregado.x = 1;
percent_carregado.y = 1;
addChild(percent_carregado);
percent_carregado.text = "Carregando: " + percentualCarregado + "%";
trace("Carregando: " + percentualCarregado + "%");
}
private function mostraCompleto(event:Event):void {
event.currentTarget.removeEventListener(Event.COMPLETE, mostraProgresso);
palco.addChild(loader);
trace("Completo");
}
private function verificaAbertura(event:Event):void {
trace("Aberto com sucesso!");
}
private function verificaIOError(event:IOErrorEvent):void {
trace("Encontrado o seguinte ioError: " + event);
}
}
}
index.fla
import carregador.SWFExterno;
var fundo:SWFExterno = new SWFExterno();
fundo.carregaSWF('layout/background1.swf');Eu testei seu código aqui e funcionou perfeitamente.
var teste:SWFExterno = new SWFExterno("Untitled-2.swf");
addChild(teste);uns detalhes
no construtor da sua classe, você pede o parâmetro "stg:Stage", então faltou passar
import carregador.SWFExterno;
var fundo:SWFExterno = new SWFExterno(this.stage);
fundo.carregaSWF('layout/background1.swf');
outra coisa, não precisa dar um "extends Sprite" nela, já que o proposito não é adiciona-la na tela, e sim apenas carregar
[]´s
>
uns detalhes
no construtor da sua classe, você pede o parâmetro "stg:Stage", então faltou passar
import carregador.SWFExterno;
var fundo:SWFExterno = new SWFExterno(this.stage);
fundo.carregaSWF('layout/background1.swf');
outra coisa, não precisa dar um "extends Sprite" nela, já que o proposito não é adiciona-la na tela, e sim apenas carregar
[]´s
Na verdade, ele deve fazer uma coisa ou outra. Ou usa esse parâmetro passando um DisplayObjetoContainer (no caso, passando o stage), ou extende Sprite e adiciona o carregador no palco com addChild(). Minha opnião é de que a classe como postada inicialmente é mais flexível.
verdade brunobispo, no primeiro caso esta melhor, eu só manteria o método "carregaSWF",(ou só "carregar" )
para iniciar o carregamento, e não dentro do construtor, e depois dê um addChild
[]´s
>
Efetuei um teste seguindo seu exemplo... mas obtive o seguinte erro:
1067: Implicit coercion of a value of type index:Main Timeline to an unrelated type flash.display:Stage
Pode me ajudar a resolver?
SWFExterno.as
package carregador {
//Efetuando importações necessárias
import flash.display.*;
import flash.events.*;
import flash.net.*;
import flash.text.*;
public class SWFExterno extends Sprite {
public var loader:Loader = new Loader();
public var requisicao:URLRequest;
public var palco:Stage;
public function SWFExterno(stg:Stage) {
this.palco = stg;
}
public function carregaSWF(url_recebida:String):void {
requisicao = new URLRequest(url_recebida);
loader.contentLoaderInfo.addEventListener(Event.OPEN, verificaAbertura);
loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, mostraProgresso);
loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, verificaIOError);
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, mostraCompleto);
loader.load(requisicao);
}
private function mostraProgresso(event:ProgressEvent):void {
var percentualCarregado:Number = event.bytesLoaded/event.bytesTotal;
percentualCarregado = Math.round(percentualCarregado * 100);
//Mostrando a porcentagem carregada
var percent_carregado:TextField = new TextField();
percent_carregado.alpha = 1;
percent_carregado.textColor = 0xFF0000;
percent_carregado.border = true;
percent_carregado.x = 1;
percent_carregado.y = 1;
addChild(percent_carregado);
percent_carregado.text = "Carregando: " + percentualCarregado + "%";
trace("Carregando: " + percentualCarregado + "%");
}
private function mostraCompleto(event:Event):void {
event.currentTarget.removeEventListener(Event.COMPLETE, mostraProgresso);
palco.addChild(loader);
trace("Completo");
}
private function verificaAbertura(event:Event):void {
trace("Aberto com sucesso!");
}
private function verificaIOError(event:IOErrorEvent):void {
trace("Encontrado o seguinte ioError: " + event);
}
}
}
index.fla
import carregador.SWFExterno;
var fundo:SWFExterno = new SWFExterno();
fundo.carregaSWF('layout/background1.swf');
Você não leu direito o post que eu fiz, mas os colegas ai acima deram a deixa para você.
Abs
Eu consegui carregar os SWFs com a classe...
Mas como faria para removê-los... teria como criar uma função para isso na classe?
E tem como criar uma função para controlar quem fica por cima de quem no carregamento de vários SWFs... ?
Segue o código até agora...
SWFExterno.as
package carregador {
//Efetuando importações necessárias
import flash.display.*;
import flash.events.*;
import flash.net.*;
import flash.text.*;
public class SWFExterno extends Sprite {
public var loader:Loader = new Loader();
public var requisicao:URLRequest;
public var palco:Stage;
public function SWFExterno(stg:Stage) {
this.palco = stg;
}
public function carregaSWF(url_recebida:String):void {
requisicao = new URLRequest(url_recebida);
loader.contentLoaderInfo.addEventListener(Event.OPEN, verificaAbertura);
loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, mostraProgresso);
loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, verificaIOError);
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, mostraCompleto);
loader.load(requisicao);
}
private function mostraProgresso(event:ProgressEvent):void {
var percentualCarregado:Number = event.bytesLoaded/event.bytesTotal;
percentualCarregado = Math.round(percentualCarregado * 100);
trace("Carregando: " + percentualCarregado + "%");
}
private function mostraCompleto(event:Event):void {
event.currentTarget.removeEventListener(Event.COMPLETE, mostraProgresso);
palco.addChild(event.currentTarget.content);
trace("Carregamento de arquivo completo");
}
private function verificaAbertura(event:Event):void {
trace("Arquivo encontrado / aberto com sucesso!");
}
private function verificaIOError(event:IOErrorEvent):void {
trace("Encontrado o seguinte ioError: " + event);
}
}//Fecha Class
}//Fecha Package
index.fla
import carregador.SWFExterno;
var fundo:SWFExterno = new SWFExterno(this.stage);
fundo.carregaSWF('layout/background1.swf');
Não vejo complicações assim, de uma maneira bem simples:
package {
Dai no fla, voce so precisa instanciar um objeto dessa classe e chamar o metodo carregaSWF, passando o swf que você quer carregar. Depois é so implementar as outras funcoes de preloader,complete etc..
Abs