13 de dezembro de 2007

Integração de Flash + XML [ActionScript]

OPa!!

Mais um Post aqui pra vocês sobre ActionScript..
Bom vamos logo ao que interessa ;D

É interessante que antes de tudo vocês já tenham uma boa introdução em XML.

<?xml version="1.0" encoding="iso-8859-1"?>
<album>
<foto imagem="img.jpg" legenda="Minha legenda"/>
<foto imagem="amigos.jpg" legenda="altas festas"/>
<foto imagem="servico.jpg" legenda="mais uma reunião"/>
<foto imagem="montanha.jpg" legenda="uma bela imagem de uma montanha"/>
</album>

Veja que na primeira linha declaramos a versão do XML e o encoding que dá suporte à acentos, assim podemos colocar acentos em nossas tags.

Na segunda linha abrimos a tag "album", informando que ali começa o nosso album de fotos.

Da 3ª à 6ª linha estão nossas fotos e suas legendas. É importante saber que para cada foto você tem que declarar dessa maneira.

<foto - para indicar o início de uma nova foto;
imagem="img.jpg" - para declarar o local do arquivo;
legenda="Minha legenda" - para informar o texto correspondente à imagem;
/> - declara o término da foto.

Salve seu xml como "album.xml" (sem aspas) e vamos ao Flash.
Para testarmos o código, usaremos o "trace", para exibir os resultados na janela de saída.

Abra o Flash e no 1º frame coloque este código:
(As duas barras após cada linha servem para comentários no flash. )

>CODE <<>

System.useCodepage = true; // habilita acentos;
var
arquivo:XML = new XML(); // cria a variável para ler o xml;
arquivo.load("album.xml"); // manda a variável ler o album.xml salvo anteriormente;
arquivo.ignoreWhite = true; // ignora espaços em branco no XML
arquivo.onLoad = function() { // após a leitura do XML, executa a ação:
trace(this); // mostra o conteúdo na janela de saída.
}

Pressione Ctrl + Enter e veja que aparecerá todo o nosso XML na janela de saída.

Vamos começar a fazer a leitura de linha por linhda do XML.
No XML a contagem das linhas começa apartir do 0 (zero), ou seja, a linha 1 na verdade é a linha 0 (zero).

Troque o código pelo seguinte:

>CODE <<>

System.useCodepage = true;
var
arquivo:XML = new XML();
arquivo.load("album.xml");
arquivo.ignoreWhite = true;
arquivo.onLoad = function() {
trace(this.childNodes[0]);
}

Repare que agora ele mostrou somente o que esta entre <album> ... <album> .
Mas por que isso? Simples, porque informamos que nós queríamos tudo o que estiver no primeiro nó do XML. Cada childNodes representa um nó no XML.
Você poderia ter usado também "firstChild"(sem aspas).

Vamos entrar mais no XML.

>CODE <<>

System.useCodepage = true;
var
arquivo:XML = new XML();
arquivo.load("album.xml");
arquivo.ignoreWhite = true;
arquivo.onLoad = function() {
trace(this.childNodes[0].childNodes[0]);
}

Com isso ele acessa a primeira linha das fotos. Lembre que no XML, a contagem começa do 0 (zero).

Sua caixa de saída deve ter aparecido o seguinte:

<foto imagem="img.jpg" legenda="Minha legenda" />

Quando nós vamos usar o XML para ler imagens e textos externos, não podemos deixar assim né? Temos que falar qual atributo queremos que ele pegue para mais tarde usarmos em um loadMovie.

Então vamos fazer isso agora. Pegar apenas o texto e o nome do arquivo no XML.
Como nós já estamos na linha que vai ler os atributos da foto, podemos declarar um "attributes".

>CODE <<>

System.useCodepage = true;
var
arquivo:XML = new XML();
arquivo.load("album.xml");
arquivo.ignoreWhite = true;
arquivo.onLoad = function() {
trace(this.childNodes[0].childNodes[0].attributes.imagem);
trace(this.childNodes[0].childNodes[0].attributes.legenda);

}

Pronto. O seu clipe de filme instanciado como "clipe" vai ler a imagem correspondente à primeira linha do XML, que nesse caso é a "casinha.jpg" e a sua caixa de texto vai ler a legenda correspondente.

Perceba que agora temos 2 trace. Um pra a foto e outro para a legenda.
No primeiro, o "attributes.imagem" pega o valor que está declarado no xml como imagem="img.jpg". E no segundo, o "attributes.legenda" pega a respectiva legenda no XML legenda="Minha legenda".

Sua janela de saída deverá ter ficado assim:

img.jpg
Minha legenda

Agora para exibir as informações no Flash, faça o seguinte:

  1. Crie um MovieClip, instancie-o de "imagem_mc" (sem aspas);
  2. Crie um campo de texto dinâmico e instancie-o de "legenda_mc" (sem aspas);

Agora é só informar ao flash para ler a imagem e o texto dentro dos alvos correspondentes.

>CODE <<>

System.useCodepage = true;
var
arquivo:XML = new XML();
arquivo.load("album.xml");
arquivo.ignoreWhite = true;
arquivo.onLoad = function() {
imagem_mc.loadMovie(this.childNodes[0].childNodes[0].attributes.imagem);
legenda_mc.text = this.childNodes[0].childNodes[0].attributes.legenda;

}


É isso pessoal!!
como sempre, espero que tenham gostado...
até mais!
;D

11 comentários:

Ferzito.O disse...

boaaa bro !!!

como sempre um otimo post !!!

eo num intendo muito mais as vezes da ^^

abraçoo bro !!

aaa otima homenagem posaksa ^^

abraço

Herberts Cruz disse...

Oi fera, muito bacana o artigo me ajudou muito.

Quero fazer uma pergunta, você pode postar um material só sobre xml, tipo atributos caracteristicas da linguagem, etc...

Ass. HSC

Unknown disse...

Ola herberts,

desculpe a demora... mas não tenho um material em mãos para disponibilizar aqui para vc!
mas vou preparar algo e te mando via e-mail pode ser?

(só me deixe o e-mail para contato)

até mais ;D

Anônimo disse...

Tutorial Legal cara.. so tem um detalhe a ser ajustado:
A váriavel album esta trocada por arquivo.

;)

valeu..

Unknown disse...

Puxa vida amigo, como eu estava passando um album que eu fiz para cá e explicando acho que passo este detalhe em branco!!!

muito brigado por ter lembrado ;)
até mais!!

Anônimo disse...

Então, muito interessante mesmo, mas como faço para passar do primeiro nó para o segundo, trocando as imagens e tudo o mais?

Unknown disse...

Bom dia amigo,

Você pode fazer uma função chamada

carregaImg e passar atributos pra ela pra você poder identificar qual imagem vai pegar

ex...

vc tem img1.jpg, img2.jpg, img3.jpg

e você tem 3 botões...
bt1, bt2, bt3

quando você da um onRelease no bt1
ele chama a função
carregaImg(1); // estou chamando a função passando o valor 1

ela ficaria assim

function carregaImg(id){
imagem_mc.loadMovie(this.childNodes[0].childNodes[id].attributes.imagem)
}

ai ele sempre pegaria a imagem que você esta passando quando clica...

seria isso sua dúvida?
abraços!

Unknown disse...

Cara valeuzao pela forca...

Helder Zebral disse...

Otimo post! Parabens.
Um grande abraço
Helder Zebral

Radio disse...

Olá, tudo bem? Estava dando uma pesquisada e acabei achando no blog um item seu sobre Xml com Flash..testei esse tuto e deu tudo certo com arquivos SWF tmb.

Estou com uma dúvida aqui, se é possível realizar uma busca de texto em arquivos SWFs externos..por exemplo o meu arquivo 'main' swf carrega varios arquivos swf (que seriam as páginas separadas em arquivos externos), e gostaria de ter a opção de buscar algum texto (nesse arquivo principal), e essa busca chamaria a página que o texto se encontra...

Sabe algum método pra eu realizar essa busca de texto em arquivos SWF externos? Desde já agradeço!

Unknown disse...

Pra você fazer essa busca você teria que dinamizar seu sistema, ou seja, colocar todos os textos em banco de dados e fazer a identificação atravez de uma ID.

Com isso você manda dar um select no banco e o texto que encontrar a palavra buscada vc retira a ID e sabe qual SWF é dono desse conteúdo.