• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

RyuSen

[AS3] como remover/parar swf externo???

6 mensagens neste tópico

Ola pessoal...

ja vi algumas soluçoes pra isto mas nao estou a conseguir por a funcionar...

estou a fazer uma pagina onde carrego um swf externo, é uma galeria de imagens que carrega automaticamente no inicio da pagina... aqui esta o codigo que usei:

Código:

    var galeriaHomeURL:URLRequest = new URLRequest("mySlideshow.swf");
    var galeriaHomeLoader:Loader = new Loader();
    galeriaHomeLoader.load(galeriaHomeURL);
    addChild(galeriaHomeLoader);
    galeriaHomeLoader.x = 0;
    galeriaHomeLoader.y = -50;

agora quero que o swf externo seja removido quando carrego num botao, o codigo que usei:

Código:

   

atelier_btn.addEventListener(MouseEvent.CLICK, removeSWF);
    function removeSWF(e:MouseEvent):void
    {
       removeChild (galeriaHomeLoader);
    }

até aqui correu bem, a funçao retira o swf externo do swf principal, mas a galeria continua a correr e da erro sempre que carrega uma nova imagem, aqui esta o erro:

TypeError: Error #2007: O parâmetro child não deve ser nulo.

at flash.display::DisplayObjectContainer/removeChild()

at temp_fla::MainTimeline/removeSWF()

TypeError: Error #1009: Não é possível acessar uma propriedade ou um método de uma referência de objeto nula.

at mySlideshow_fla::MainTimeline/nextImage()

at mySlideshow_fla::MainTimeline/timerListener()

at flash.utils::Timer/_timerDispatch()

at flash.utils::Timer/tick()

a galeria que estou a usar é a que esta neste site (fui eu proprio que fiz) http://aquadrado.com

nota: apenas pra mostrar a galeria, a pagina é temporaria...

espero que possam ajudar  :)

desde ja agradeço  :thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Um objecto só é retirado da memória quando não existem referências que apontem para ele, é marcado para limpeza e na rotina de garbage collection é limpo.

Esta série de artigos explica como é feita a gestão de memória pelo flash player:

http://www.gskinner.com/blog/archives/2006/06/as3_resource_ma.html

http://www.gskinner.com/blog/archives/2006/07/as3_resource_ma_1.html

http://www.gskinner.com/blog/archives/2006/08/as3_resource_ma_2.html

http://www.gskinner.com/blog/archives/2006/09/garbage_collect.html

http://www.gskinner.com/blog/archives/2008/07/additional_info.html

Voltando ao teu caso, tens de ter certificar que o swf carregado está pronto a ser removido antes de o efectivamente tentares remover. Isto é, "limpar as tuas pegadas".

Sem ver o código do slideshow é dificil ver o que tens de "limpar" antes do conteúdo ser removido, mas pelo erro dá para ver que tens de parar um Timer pelo menos.

Se estiveres à escuta do evento REMOVED_FROM_STAGE (no slideshow) podes executar a tua rotina de limpeza.

addEventListener(Event.REMOVED_FROM_STAGE, rotinaLimpeza);

function rotinaLimpeza(evt:Event):void
{
    timer.stop();
}

atelier_btn.addEventListener(MouseEvent.CLICK, removeSWF);
    function removeSWF(e:MouseEvent):void
    {
       removeChild (galeriaHomeLoader);
       galeriaHomeLoader.unload();
    }

Algumas coisas a ter em atenção que podem prevenir que o conteúdo seja removido:

-Timer internos activos

-Funções registadas para actuar no ENTER_FRAME

-Timeline activa

-Streams activos

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

vou experimentar a soluçao e ler os artigos, desde ja obrigado :thumbsup: virei com o resultado assim que seja possivel...

entretanto deixo aqui o codigo da galeria, é uma galeria como tantas outras que encontramos na net, so alterei pra fazer load das minhas imagens :)

cumps :thumbsup:

import fl.transitions.Tween;
import fl.transitions.easing.*;
import fl.transitions.TweenEvent;

var my_speed:Number;
var my_total:Number;
var my_images:XMLList;

var my_loaders_array:Array=[];
var my_labels_array:Array=[];
var my_success_counter:Number=0;
var my_playback_counter:Number=0;

var my_slideshow:Sprite = new Sprite();
var my_image_slides:Sprite = new Sprite();
var my_label_slides:Sprite = new Sprite();
var my_preloader:TextField;

var my_timer:Timer;
var my_prev_tween:Tween;
var my_tweens_array:Array=[];

var my_xml_loader:URLLoader = new URLLoader();
my_xml_loader.load(new URLRequest("myslideshow.xml"));
my_xml_loader.addEventListener(Event.COMPLETE, processXML);

function processXML(e:Event):void {
var my_xml:XML=new XML(e.target.data);
my_speed=my_xml.@SPEED;
my_images=my_xml.IMAGE;
my_total=my_images.length();

loadImages();

my_xml_loader.removeEventListener(Event.COMPLETE, processXML);
my_xml_loader=null;
}

function loadImages():void {
for (var i:Number = 0; i < my_total; i++) {
	var my_url:String=my_images[i].@URL;
	var my_loader:Loader = new Loader();
	my_loader.load(new URLRequest(my_url));
	my_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
	my_loaders_array.push(my_loader);

	var my_label:TextField = new TextField();
	my_label.text=my_images[i].@TITLE;
	my_label.autoSize=TextFieldAutoSize.LEFT;
	my_labels_array.push(my_label);

}

my_preloader = new TextField();
my_preloader.text="Loading";
my_preloader.autoSize=TextFieldAutoSize.CENTER;
my_preloader.x = (stage.stageWidth - my_preloader.width)/2;
my_preloader.y = (stage.stageHeight - my_preloader.height)/2;
addChild(my_preloader);

}

function onComplete(e:Event):void {

my_success_counter++;
if (my_success_counter==my_total) {
	startShow();
}

var my_loaderInfo:LoaderInfo=LoaderInfo(e.target);
my_loaderInfo.removeEventListener(Event.COMPLETE, onComplete);

}

function startShow():void {

removeChild(my_preloader);
my_preloader=null;

addChild(my_slideshow);
my_slideshow.addChild(my_image_slides);
my_slideshow.addChild(my_label_slides);

nextImage();

my_timer=new Timer(my_speed*1000);
my_timer.addEventListener(TimerEvent.TIMER, timerListener);
my_timer.start();

}

function nextImage():void {

var my_image:Loader=Loader(my_loaders_array[my_playback_counter]);
my_image_slides.addChild(my_image);
my_image.x = (stage.stageWidth - my_image.width)/2;
my_image.y = (stage.stageHeight - my_image.height)/2;
my_tweens_array[0]=new Tween(my_image,"alpha",Strong.easeOut,0,1,1,true);

var my_label:TextField=TextField(my_labels_array[my_playback_counter]);
my_label_slides.addChild(my_label);
my_label.x=my_image.x;
my_label.y=my_image.y+my_image.height;
my_tweens_array[1]=new Tween(my_label,"alpha",Strong.easeOut,0,1,1,true);

}

function timerListener(e:TimerEvent):void {

hidePrev();

my_playback_counter++;
if (my_playback_counter==my_total) {
	my_playback_counter=0;
}
nextImage();

}

function hidePrev():void {

var my_image:Loader=Loader(my_image_slides.getChildAt(0));
my_prev_tween=new Tween(my_image,"alpha",Strong.easeOut,1,0,1,true);
my_prev_tween.addEventListener(TweenEvent.MOTION_FINISH, onFadeOut);

var my_label:TextField=TextField(my_label_slides.getChildAt(0));
my_tweens_array[2]=new Tween(my_label,"alpha",Strong.easeOut,1,0,1,true);

}

function onFadeOut(e:TweenEvent):void {
my_image_slides.removeChildAt(0);
my_label_slides.removeChildAt(0);
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Voltando ao teu caso, tens de ter certificar que o swf carregado está pronto a ser removido antes de o efectivamente tentares remover. Isto é, "limpar as tuas pegadas".

Sem ver o código do slideshow é dificil ver o que tens de "limpar" antes do conteúdo ser removido, mas pelo erro dá para ver que tens de parar um Timer pelo menos.

Se estiveres à escuta do evento REMOVED_FROM_STAGE (no slideshow) podes executar a tua rotina de limpeza.

addEventListener(Event.REMOVED_FROM_STAGE, rotinaLimpeza);

function rotinaLimpeza(evt:Event):void
{
    timer.stop();
}

atelier_btn.addEventListener(MouseEvent.CLICK, removeSWF);
    function removeSWF(e:MouseEvent):void
    {
       removeChild (galeriaHomeLoader);
       galeriaHomeLoader.unload();
    }

Algumas coisas a ter em atenção que podem prevenir que o conteúdo seja removido:

-Timer internos activos

-Funções registadas para actuar no ENTER_FRAME

-Timeline activa

-Streams activos

ok ja testei o teu codigo e funcionou muito bem... no entanto como o botao que esta a receber a acçao removeSWF é reutilisavel (tem outras funçoes aplicadas) apos esta acçao decorrer sempre que volto a carregar no botao recebo este erro:

ArgumentError: Error #2025: O DisplayObject fornecido deve ser filho do responsável pela chamada.

at flash.display::DisplayObjectContainer/removeChild()

at temp_fla::MainTimeline/removeSWF()

alguma soluçao???

devo ter de desactivar a funçao removeSWF apos decorrer, pelo menos até ser chamada de novo, mas n sei como...

provavelmente é bastante simples mas sou novo nisto da programaçao, o que fazia em flash era animaçao basica de objectos com acçoes simples em as2...

desde ja agradeço :thumbsup:

nota: ainda n deu pra ler os artigos :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

salvast-me o dia  :) realmente n era preciso o removeChild, fazer apenas unload resolve o problema e sem erros... estou mt agradecido  :thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora