Jump to content

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


RyuSen

Recommended Posts

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  👍

Link to comment
Share on other 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

Link to comment
Share on other sites

vou experimentar a soluçao e ler os artigos, desde ja obrigado 👍 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 👍

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);
}
Link to comment
Share on other 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 👍

nota: ainda n deu pra ler os artigos 🙂

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.