Você está na página 1de 758

Programao do ADOBE ACTIONSCRIPT 3.

2008 Adobe Systems Incorporated. Todos os direitos reservados.


Copyright

Programao do ActionScript 3.0 Se distribudo com o software que inclui um contrato de usurio final, este guia, juntamente com o software nele descrito, estar sujeito licena, podendo ser usado ou copiado apenas de acordo com os termos dessa licena. Exceto conforme permitido por essa licena, nenhuma parte deste guia pode ser reproduzida, armazenada em um sistema de recuperao ou transmitida, em nenhuma forma ou meio eletrnico, mecnico, de gravao, ou semelhante, sem a permisso prvia por escrito da Adobe Systems Incorporated. Observe que o contedo deste guia est protegido por leis de direitos autorais, mesmo que no seja distribudo com o software que inclui um contrato de licena de usurio final. O contedo deste guia foi desenvolvido apenas para fins informativos, est sujeito a alteraes sem aviso prvio e no deve ser considerado um compromisso firmado pela Adobe Systems Incorporated. A Adobe Systems Incorporated no se responsabiliza por erros ou imprecises que possam aparecer no contedo informativo deste guia. Lembre-se de que os desenhos ou imagens existentes e cogitados para incluso em projetos podem estar protegidos por leis de direitos autorais.. A incorporao no autorizada desse material em um novo trabalho pode ser considerada uma violao dos direitos autorais do respectivo detentor. Certifique-se de obter a permisso necessria do detentor em questo. Todas as referncias a nomes de empresas em modelos de amostra so apenas para fins demonstrativos e no tm o objetivo de fazer aluses a nenhuma organizao real. Adobe, the Adobe logo, Adobe AIR, ActionScript, Flash, Flash Lite, Flex, Flex Builder, MXML, and Pixel Bender are either registered trademarks or trademarks of Adobe Systems Incorporated in the United States and/or other countries. ActiveX and Windows are either registered trademarks or trademarks of Microsoft Corporation in the United States and other countries. Macintosh is a trademark of Apple Inc., registered in the United States and other countries. Java is a trademark or registered trademark of Sun Microsystems, Inc. in the United States and other countries.All other trademarks are the property of their respective owners. This product includes software developed by the Apache Software Foundation (http://www.apache.org/). MPEG Layer-3 audio compression technology licensed by Fraunhofer IIS and Thomson Multimedia (http://www.mp3licensing.com) Speech compression and decompression technology licensed from Nellymoser, Inc. (www.nellymoser.com). Video compression and decompression is powered by On2 TrueMotion video technology. 1992-2005 On2 Technologies, Inc. All Rights Reserved. http://www.on2.com. This product includes software developed by the OpenSymphony Group (http://www.opensymphony.com/). This product contains either BSAFE and/or TIPEM software by RSA Security, Inc.

Sorenson Spark video compression and decompression technology licensed from Sorenson Media, Inc. Adobe Systems Incorporated, 345 Park Avenue, San Jose, California 95110, USA Notice to U.S. government end users. The software and documentation are Commercial Items, as that term is defined at 48 C.F.R. 2.101, consisting of Commercial Computer Software and Commercial Computer Software Documentation, as such terms are used in 48 C.F.R. 12.212 or 48 C.F.R. 227.7202, as applicable. Consistent with 48 C.F.R. 12.212 or 48 C.F.R. 227.7202-1 through 227.7202-4, as applicable, the Commercial Computer Software and Commercial Computer Software Documentation are being licensed to U.S. Government end users (a) only as Commercial items and (b) with only those rights as are granted to all other end users pursuant to the terms and conditions herein. Unpublished-rights reserved under the copyright laws of the United States. Adobe Systems Incorporated, 345 Park Avenue, San Jose, CA 95110-2704, USA. For U.S. Government End Users, Adobe agrees to comply with all applicable equal opportunity laws including, if appropriate, the provisions of Executive Order 11246, as amended, Section 402 of the Vietnam Era Veterans Readjustment Assistance Act of 1974 (38 USC 4212), and Section 503 of the Rehabilitation Act of 1973, as amended, and the regulations at 41 CFR Parts 60-1 through 60-60, 60-250 ,and 60-741. The affirmative action clause and regulations contained in the preceding sentence shall be incorporated by reference.

iii

Contedo
Captulo 1: Sobre este manual Uso deste manual . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 Acesso documentao do ActionScript Recursos de aprendizagem do ActionScript ............................................................................... 2 ............................................................................ 3

Captulo 2: Introduo ao ActionScript 3.0 Sobre o ActionScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 Vantagens do ActionScript 3.0 Novidades do ActionScript 3.0 ......................................................................................... 4 ......................................................................................... 5 ............................................................................... 7

Compatibilidade com verses anteriores

Captulo 3: Introduo do ActionScript Fundamentos de programao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 Trabalho com o objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 Elementos de programa comuns

Exemplo: Pea de portflio de animao Criao de aplicativos com o ActionScript Criao de suas prprias classes Exemplo: Criao de um aplicativo bsico Execuo de exemplos subseqentes

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36

Captulo 4: Linguagem e sintaxe do ActionScript Viso geral da linguagem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 Objetos e classes Variveis Sintaxe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 Pacotes e espaos para nomes Tipos de dados Operadores Condicionais Repetio Funes

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80

Captulo 5: Programao orientada a objetos no ActionScript Noes bsicas de programao orientada a objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 Classes Interfaces Herana . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125

Tpicos avanados

Exemplo: GeometricShapes

Captulo 6: Trabalho com datas e horas Noes bsicas de data e hora . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134 Gerenciamento de datas de calendrio e horas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135

PROGRAMAO DO ACTIONSCRIPT 3.0 iv


Contedo

Controle de intervalos de tempo

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139

Exemplo: relgio analgico simples

Captulo 7: Trabalho com strings Noes bsicas de strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 Criao de strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152 A propriedade length Comparao de strings Concatenao de strings

Trabalho com caracteres em strings

Obteno de representaes de strings de outros objetos Localizao de substrings e padres em strings Exemplo: arte ASCII

Converso de strings entre maisculas e minsculas

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152

Captulo 8: Trabalho com matrizes Noes bsicas sobre matrizes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157 Matrizes indexadas Matrizes associativas Clonagem de matrizes Tpicos avanados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180

Matrizes multidimensionais

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175

Exemplo: lista de reproduo

Captulo 9: Manipulao de erros Noes bsicas da manipulao de erros Tipos de erros Manipulao de erros no ActionScript 3.0

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186

Trabalho com as verses de depurador do Flash Player e do AIR Manipulao de erros sncronos em um aplicativo Criao de classes de erros personalizadas Resposta a eventos e status de erros Comparao das classes Error Exemplo: Aplicativo CustomErrors

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199

Captulo 10: Uso de expresses regulares Noes bsicas de expresses regulares: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209 Sintaxe da expresso regular Exemplo: Um analisador Wiki . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225 Mtodos para usar expresses regulares com strings

Captulo 11: Trabalho com XML Noes bsicas sobre XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230 A abordagem E4X em relao ao processamento de XML Objetos XML Objetos XMLList . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239

Inicializao de variveis XML

Montagem e transformao de objetos XML

PROGRAMAO DO ACTIONSCRIPT 3.0 v


Contedo

Como percorrer estruturas XML Uso de espaos para nomes XML Converso de tipo XML

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246

Leitura de documentos XML externos

Exemplo: carregamento de dados RSS a partir da Internet Captulo 12: Manipulao de eventos Noes bsicas sobre a manipulao de eventos O fluxo de evento Objetos de evento Ouvintes de evento Exemplo: Alarm Clock

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254

Como a manipulao de eventos do ActionScript 3.0 diferente das verses anteriores

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267

Captulo 13: Programao de exibio Noes bsicas sobre a programao de exibio Principais classes de exibio Vantagens da abordagem da lista de exibio Trabalho com os objetos de exibio Manipulao de objetos de exibio Animao de objetos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316

Carregamento dinmico do contedo da exibio Exemplo: SpriteArranger

Captulo 14: Uso de objetos visuais Noes bsicas do uso da API de desenho Compreenso da classe Graphics Desenho de linhas e curvas

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331

Desenho de formas utilizando os mtodos incorporados Criao de linhas e preenchimentos gradientes Uso da classe Math com mtodos de desenho Animao com a API de desenho Uso avanado da API de desenho Caminhos de desenho Definio de regras de contorno Uso de classes de dados grficos Sobre o uso de drawTriangles() Exemplo: Gerador visual algortmico

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335

Captulo 15: Trabalho com geometria Noes bsicas de geometria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342 Uso de objetos Point Uso de objetos Matrix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349 Uso de objetos Rectangle

Exemplo: Aplicao de uma transformao de matriz em um objeto de exibio

PROGRAMAO DO ACTIONSCRIPT 3.0 vi


Contedo

Captulo 16: Filtro de objetos de exibio Noes bsicas sobre filtragem de objetos de exibio Criao e aplicao de filtros Filtros de exibio disponveis Exemplo: Filter Workbench

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379

Captulo 17: Trabalho com sombreadores Pixel Bender Noes bsicas de sombreadores Pixel Bender . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 386 Carregamento ou incorporao de um sombreador Acesso aos metadados do sombreador Uso de um sombreador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 391 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 389

Especificao de valores de entrada e de parmetro de sombreador

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 396

Captulo 18: Trabalho com clipes de filme Noes bsicas de clipes de filme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 408 Trabalho com objetos MovieClip . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 410 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 410 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 413 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415 Controle de reproduo de clipe de filme Carregamento de um arquivo SWF externo Exemplo: RuntimeAssetsExplorer

Criao de objetos MovieClip com o ActionScript

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 416

Captulo 19: Trabalho com interpolaes de movimento Noes bsicas de interpolaes de movimento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 420 Cpia de scripts de interpolaes de movimento Descrio da animao Adio de filtros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 421 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 422 Incorporao de scripts de interpolaes de movimento

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 427

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 425

Associao de uma interpolao de movimento com seus objetos de exibio

Captulo 20: Trabalho com cinemtica inversa Noes bsicas de cinemtica inversa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 428 Viso geral da animao de armaduras IK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 429 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 431 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 431 Obteno de informaes sobre uma armadura IK Movimentao de uma armadura IK Uso de eventos IK

Ocorrncia de IKMover e limitao de seu movimento

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 432

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 432

Captulo 21: Trabalho com texto Noes bsicas do trabalho com texto Uso da classe TextField Uso do Mecanismo de texto do Flash

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 434 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 458

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436

Captulo 22: Trabalho com bitmaps Noes bsicas do trabalho com bitmaps Classes Bitmap e BitmapData Manipulao de pixels Cpia de dados de bitmap

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 485

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 488 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 491 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 492

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 489

Texturas com funes de rudo

PROGRAMAO DO ACTIONSCRIPT 3.0 vii


Contedo

Rolagem de bitmaps

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 494 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 495 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 496

Benefcios do mapeamento mip Exemplo: Lua giratria animada

Captulo 23: Trabalho em 3D (trs dimenses) Noes bsicas de 3D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 507 Noes bsicas sobre os recursos 3D do Flash Player e o runtime do AIR Criao e movimentao de objetos 3D Projeo de objetos 3D em uma exibio 2D Execuo de transformaes 3D complexas Uso de tringulos para obter efeitos 3D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 508 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 510 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 512 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 516

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 519

Captulo 24: Trabalho com vdeo Noes bsicas sobre vdeo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 527 Noes bsicas sobre formatos de vdeo Noes bsicas sobre a classe Video Carregamento de arquivos de vdeo Controle da reproduo de vdeo Uso de tela cheia Acelerao de hardware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 529 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 532 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 532 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 533

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 535 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 539 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 540 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 541 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 542 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547

Arquivos de vdeo em fluxo contnuo

Noes bsicas sobre pontos de sinalizao Uso de pontos de sinalizao e metadados Captura da entrada da cmera Envio de vdeo para um servidor Exemplo: Jukebox de vdeo

Criao de mtodos de retorno de chamada para metadados e pontos de sinalizao

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 556 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 562 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 562

Tpicos avanados sobre arquivos FLV

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 563

Captulo 25: Trabalho com som Noes bsicas do trabalho com som Compreenso da arquitetura do som Trabalho com sons incorporados

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 569 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 571 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 572

Carregamento de arquivos de som externos Trabalho com arquivos de fluxo de som Reproduo de sons

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 574 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 575 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 576 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 582

Trabalho com udio gerado dinamicamente

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 578 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 583

Consideraes sobre segurana ao carregar e reproduzir sons Controle do volume e do panorama do som Trabalho com metadados de som Acesso a dados de som brutos Captura de entrada do som Exemplo: Podcast Player

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 584

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 585

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 589

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 592

Captulo 26: Captura da entrada do usurio Noes bsicas sobre a entrada do usurio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 600 Captura da entrada do teclado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 601

PROGRAMAO DO ACTIONSCRIPT 3.0 viii


Contedo

Captura da entrada do mouse Exemplo: WordSearch

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 603

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 607

Captulo 27: Rede e comunicao Noes bsicas de rede e comunicao Trabalho com dados externos conexes de soquete

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 611 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 619

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 614

Conexo com outras ocorrncias do Flash Player e AIR Armazenamento de dados locais Trabalho com arquivos de dados

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 624 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 628 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 630 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 644 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 647

Exemplo: Criao de um cliente Telnet

Exemplo: Upload e download de arquivos

Captulo 28: Ambiente do sistema cliente Noes bsicas do ambiente do sistema cliente Uso da classe System Uso da classe Capabilities Uso da classe IME

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 653

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 655 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 656 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 657 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 664

Uso da classe ApplicationDomain

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 659

Exemplo: Deteco de capacidades do sistema Captulo 29: Copiar e colar Noes bsicas de copiar e colar

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 668 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 668 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 669

Leitura e gravao na rea de transferncia do sistema Formatos de dados da rea de transferncia Captulo 30: Impresso Noes bsicas de impresso Impresso de uma pgina

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 674 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 676

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 675 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 679

Tarefas do Flash Player e do AIR e impresso do sistema Configurao de tamanho, escala e orientao Exemplo: Impresso de vrias pginas Exemplo: Escala, corte e resposta

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 680

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 682

Captulo 31: Uso da API externa Noes bsicas de uso da API externa Requisitos e vantagens da API externa Uso da classe ExternalInterface

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 685 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 687 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 692

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 688 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 698

Exemplo: uso da API externa em um continer de pgina da Web Exemplo: uso da API externa em um continer ActiveX

Captulo 32: Segurana do Flash Player Viso geral da segurana do Flash Player . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 704 Caixas de proteo de segurana Controles de permisso Restrio de APIs de rede Carregamento de contedo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 706 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 708 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 715 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 717 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 718

Segurana de modo de tela cheia

PROGRAMAO DO ACTIONSCRIPT 3.0 ix


Contedo

Cross-scripting

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 721 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 724 . . . . . . . . . . . . . . . . . 729 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 727 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 730 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 730 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 731 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 734

Acesso mdia carregada como dados Carregamento de dados

Carregamento de contedo incorporado de arquivos SWF importados em um domnio de segurana Trabalho com contedo legado Controle do acesso URL de sada Objetos compartilhados Configurao de permisses de LocalConnection

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 732

Acesso a cmera, microfone, rea de transferncia, mouse e teclado ndice

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 735

Captulo 1: Sobre este manual


Este manual fornece informaes bsicas para o desenvolvimento de aplicativos no Adobe ActionScript 3.0. Para entender melhor as idias e as tcnicas descritas, voc deve estar familiarizado com os conceitos gerais de programao, como tipo de dados, variveis, loops e funes. Voc tambm deve compreender os conceitos bsicos de programao orientada a objetos, como classes e herana. Conhecimento anterior do ActionScript 1.0 ou ActionScript 2.0 til, mas no necessrio.

Uso deste manual


Os captulos deste manual esto organizados nos seguintes grupos lgicos para ajud-lo a localizar melhor as reas relacionadas da documentao do ActionScript:
Captulos Captulos de 2 a 5 - viso geral da programao do ActionScript Descrio Discute os principais conceitos do ActionScript 3.0, incluindo sintaxe de linguagem, instrues e operadores e programao orientada a objetos do ActionScript.

Captulos de 6 a 11 - principais tipos de dados e classes Descreve os tipos de dados de nvel superior no ActionScript 3.0. do ActionScript 3.0 Captulos de 12 a 32 - APIs do Flash Player e do Adobe AIR Descreve recursos importantes que so implementados nos pacotes e nas classes especficas do Adobe Flash Player 10 e do Adobe AIR, incluindo manipulao de eventos, trabalho com objetos de exibio e com a lista de exibio, rede e comunicao, entrada e sada de arquivos, interface externa, modelo de segurana de aplicativos e muito mais.

Este manual tambm contm vrios arquivos de amostra que demonstram os conceitos de programao de aplicativos quanto a classes importantes ou utilizadas normalmente. Os arquivos de amostra so compactados para que se tornem mais fceis de carregar e usar com o Adobe Flash CS4 Professional e podem incluir arquivos delimitadores. Entretanto, o principal cdigo de amostra ActionScript 3.0 puro que pode ser usado em qualquer ambiente de desenvolvimento. O ActionScript 3.0 pode ser escrito e compilado de vrias formas, inclusive:

Com o uso do ambiente de desenvolvimento do Adobe Flex Builder 3 Com o uso de qualquer editor de texto e um compilador de linha de comando, como aquele fornecido com o Flex
Builder 3

Com o uso da ferramenta de autoria do Adobe Flash CS4 Professional


Para obter mais informaes sobre ambientes de desenvolvimento do ActionScript , consulte Introduo ao ActionScript 3.0 na pgina 4 Para compreender as amostras de cdigo neste manual, voc no precisa ter experincia anterior nos ambientes de desenvolvimento integrados para ActionScript, como o Flex Builder ou as ferramentas de autoria do Flash. Entretanto, talvez voc queira fazer referncia na documentao quelas ferramentas para saber como us-las para escrever e compilar o cdigo do ActionScript 3.0 Para obter mais informaes, consulte Acesso documentao do ActionScript na pgina 2.

PROGRAMAO DO ACTIONSCRIPT 3.0 2


Sobre este manual

Acesso documentao do ActionScript


Como este manual concentra-se na descrio do ActionScript 3.0, que uma linguagem rica e poderosa de programao orientada a objetos, ele no abrange totalmente o processo nem o fluxo de trabalho de desenvolvimento de aplicativos dentro de uma determinada ferramenta ou arquitetura de servidor. Portanto, alm da Programao do ActionScript 3.0, talvez voc queira consultar outras fontes de documentao enquanto projeta, desenvolve, testa e implanta aplicativos do ActionScript 3.0.

Documentao do ActionScript 3.0


Este manual fornece os conceitos da linguagem de programao do ActionScript 3.0 alm de detalhes e amostras da implementao ilustrando importante recursos de linguagem. Entretanto, este manual no uma referncia completa quanto linguagem. Para isso, consulte Referncia dos componentes e da linguagem do ActionScript 3.0, que descreve cada classe, mtodo, propriedade e evento na linguagem. A Referncia de componentes e linguagem do ActionScript 3.0 fornece informaes de referncia detalhadas sobre a linguagem principal, os componentes da ferramenta de autoria do Flash (nos pacotes fl) e as APIs do Flash Player e do Adobe AIR (nos pacotes flash).

Documentao do Flash
Se voc usar a ferramenta de autoria do Flash, talvez queira consultar estes manuais:
Manual Uso do Flash Descrio Descreve como desenvolver aplicativos dinmicos da Web na ferramenta de autoria do Flash. Descreve a utilizao especfica da linguagem do ActionScript 3.0 e das APIs principais do Flash Player e do Adobe AIR.

Programao do ActionScript 3.0

Referncia de componentes e linguagem do ActionScript 3.0 Fornece exemplos de sintaxe, utilizao e cdigo para os componentes da ferramenta de autoria do Flash e para as APIs do ActionScript 3.0. Uso dos componentes do ActionScript 3.0 Explica os detalhes do uso de componentes para desenvolvimento de aplicativos desenvolvidos no Flash. Descreve como desenvolver e implantar aplicativos do Adobe AIR utilizando o ActionScript 3.0 e a API do Adobe AIR no Flash. Fornece uma viso geral da sintaxe do ActionScript 2.0 e explica como usar o ActionScript 2.0 quando est trabalhando com diferentes tipos de objetos. Fornece exemplos de sintaxe, utilizao e cdigo para os componentes da ferramenta de autoria do Flash e para as APIs do ActionScript 2.0. Explica os detalhes de como usar os componentes do ActionScript 2.0 para desenvolvimento de aplicativos criados no Flash. Descreve cada componentes disponvel na Arquitetura de componentes da Adobe verso 2, junto com sua API. Descreve os objetos, os mtodos e as propriedades disponveis na API JavaScript. Explica como usar o Adobe Flash Lite 2.x para desenvolver aplicativos e fornece exemplos de sintaxe, utilizao e cdigo para os recursos do ActionScript disponveis com o Flash Lite 2.x Explica como desenvolver aplicativos do Flash Lite 2.x. Mostra como desenvolver aplicativos com o Flash Lite 2.x e descreve todos os recursos do ActionScript disponveis para os desenvolvedores do Flash Lite 2.x.

Desenvolvimento de aplicativos do Adobe AIR com o Flash CS4 Professional Aprendizagem do ActionScript 2.0 no Adobe Flash

Referncia de linguagem do ActionScript 2.0

Uso dos componentes do ActionScript 2.0

Referncia dos componentes e da linguagem do ActionScript 2.0 Ampliao do Flash Introduo ao Flash Lite 2.x

Desenvolvimento de aplicativos do Flash Lite 2.x Introduo ao ActionScript do Flash Lite 2.x

PROGRAMAO DO ACTIONSCRIPT 3.0 3


Sobre este manual

Manual Referncia de linguagem do ActionScript do Flash Lite 2.x

Descrio Fornece exemplos de sintaxe, utilizao e cdigo para a API do ActionScript 2.0 disponvel no Flash Lite 2.x. Apresenta uma introduo ao Flash Lite 1.x e descreve como testar o contedo utilizando o emulador do Adobe Device Central CS4. Descreve como desenvolver aplicativos para dispositivos mveis utilizando o Flash Lite 1.x. Explica como usar o ActionScript em aplicativos do Flash Lite 1.x e descreve todos os recursos do ActionScript disponveis com o Flash Lite 1.x. Fornece a sintaxe e a utilizao dos elementos do ActionScript disponveis com o Flash Lite 1.x.

Introduo ao Flash Lite 1.x

Desenvolvimento de aplicativos do Flash Lite 1.x

Aprendizagem do ActionScript no Flash Lite 1.x

Referncia de linguagem do ActionScript do Flash Lite 1.x

Recursos de aprendizagem do ActionScript


Alm do contedo desses manuais, a Adobe fornece artigos, conceitos de design e exemplos no Adobe Developer Center e no Adobe Design Center atualizados regularmente.

Adobe Developer Center


O Adobe Developer Center o seu recurso para obter informaes atualizadas sobre o ActionScript, artigos sobre desenvolvimento de aplicativos reais e informaes sobre problemas importantes. Consulte o Developer Center em www.adobe.com/devnet/.

Adobe Design Center


Saiba das novidades em design digital e grficos de movimento. Navegue nos trabalhos dos principais artistas, descubra novas tendncias de design e aprimore suas habilidades com tutoriais, fluxos de trabalho importantes e tcnicas avanadas. Confira duas vezes por ms os tutoriais e artigos recentes, alm de peas de galeria inspiradoras. Consulte o Design Center em www.adobe.com/designcenter/.

Captulo 2: Introduo ao ActionScript 3.0


Este captulo fornece uma viso geral do Adobe ActionScript 3.0, a mais recente e revolucionria verso do ActionScript.

Sobre o ActionScript
O ActionScript a linguagem de programao dos ambientes de tempo de execuo Adobe Flash Player e Adobe AIR. Ele permite interatividade, manipulao de dados e muito mais no contedo e nos aplicativos do Flash, Flex e AIR. O ActionScript executado com a AVM (ActionScript Virtual Machine), que faz parte do Flash Player e do AIR. O cdigo do ActionScript em geral compilado no formato de cdigo de bytes (um tipo de linguagem de programao escrita e entendida por computadores) por um compilador, como o criado no Adobe Flash CS4 Professional ou no Adobe Flex Builder ou como o disponvel no Adobe Flex SDK. O cdigo de bytes incorporado aos arquivos SWF, que so executados pelo Flash Player e pelo AIR. O ActionScript 3.0 oferece um modelo de programao robusto que parecer familiar aos desenvolvedores com um conhecimento bsico de programao orientada a objetos. Alguns dos recursos principais do ActionScript 3.0 que foram aprimorados em relao verso anterior incluem:

Uma nova ActionScript Virtual Machine, chamada AVM2, que usa um novo conjunto de instrues de cdigo de
bytes e fornece aprimoramentos de desempenho significativos

Uma base de cdigo de compilador moderna que executa otimizaes mais avanadas do que as verses anteriores
do compilador

Uma API (Interface de programao de aplicativo) expandida e aprimorada, com controle de baixo nvel de objetos
e um autntico modelo orientado a objetos

Uma API XML baseada na especificao de linguagem ECMAScript para XML (E4X) (ECMA-357 edio 2) E4X
a extenso de linguagem para ECMAScript que adiciona XML como um tipo de dados nativo da linguagem.

Um modelo de evento baseado na Especificao de eventos DOM (Document Object Model) nvel 3

Vantagens do ActionScript 3.0


O ActionScript 3.0 vai alm dos recursos de script de suas verses anteriores. Ele foi criado para facilitar a criao de aplicativos altamente complexos com grandes conjuntos de dados e bases de cdigo reutilizveis orientadas a objetos. Embora o ActionScript 3.0 no seja necessrio para o contedo executado no Adobe Flash Player, ele permite melhorias de desempenho que s esto disponveis com a AVM2, a nova mquina virtual. O cdigo do ActionScript 3.0 pode ser executado at 10 vezes mais rpido do que o cdigo do ActionScript existente. A verso antiga da AVM1 (ActionScript Virtual Machine) executa os cdigos ActionScript 1.0 e ActionScript 2.0. As verses 9 e 10 do Flash Player oferecem suporte a AVM1 para compatibilidade com contedo existente e herdado de verses anteriores. Para obter mais informaes, consulte Compatibilidade com verses anteriores na pgina 7.

PROGRAMAO DO ACTIONSCRIPT 3.0 5


Introduo ao ActionScript 3.0

Novidades do ActionScript 3.0


Embora contenha muitas classes e recursos que parecero familiares aos programadores do ActionScript, em termos de arquitetura e conceito, o ActionScript 3.0 diferente de suas verses anteriores. Os aprimoramentos do ActionScript 3.0 incluem novos recursos da linguagem central e uma API do Flash Player melhorada que fornece mais controle sobre objetos de baixo nvel. Nota: Os aplicativos do Adobe AIR tambm podem usar as APIs do Flash Player.

Recursos da linguagem central


A linguagem central define os blocos de construo bsicos da linguagem de programao, como instrues, expresses, condies, loops e tipos. O ActionScript 3.0 contm vrios recursos novos que aceleram o processo de desenvolvimento. Excees de tempo de execuo O ActionScript 3.0 relata mais condies de erros que suas verses anteriores. As excees de tempo de execuo so usadas para condies de erro comuns, melhorar a experincia de depurao e permitir o desenvolvimento de aplicativos que manipulam erros de forma robusta. Os erros de tempo de execuo fornecem rastreamentos de pilha anotados com informaes sobre o arquivo de origem e o nmero de linha, ajudando a detectar os erros rapidamente. Tipos de tempo de execuo No ActionScript 2.0, as anotaes de tipo eram basicamente um recurso de desenvolvedor; em tempo de execuo, todos os valores so tipificados dinamicamente. No ActionScript 3.0, as informaes de tipo so preservadas em tempo de execuo e usadas para diversos fins. O Flash Player e o Adobe AIR fazem a verificao de tipos em tempo de execuo, melhorando a segurana de tipos do sistema. As informaes sobre tipo tambm so usadas para retratar variveis em representaes, melhorando o desempenho e reduzindo o uso de memria. Classes seladas O ActionScript 3.0 apresenta o conceito de classes seladas. Uma classe selada possui apenas o conjunto fixo de propriedades e mtodos que foram definidos em tempo de compilao e no possvel adicionar outros. Ela permite uma verificao em tempo de compilao mais rgida, resultando em programas mais robustos. Ela tambm melhora o uso de memria por no exigir uma tabela de hash interna para cada ocorrncia de objeto. As classes dinmicas tambm so possveis usando a palavra-chave dynamic. Todas as classes no ActionScript 3.0 so seladas por padro, mas podem ser declaradas para se tornar dinmicas com a palavra-chave dynamic. Fechamentos de mtodo O ActionScript 3.0 permite um fechamento de mtodo que lembra automaticamente de sua ocorrncia de objeto original. Esse recurso til para a manipulao de eventos. No ActionScript 2.0, os fechamentos de mtodo no lembravam de qual ocorrncia de objeto tinham sido extrados, gerando um comportamento inesperado quando o fechamento de mtodo era invocado. A classe mx.utils.Delegate era uma soluo conhecida, mas no mais necessria. ECMAScript para XML (E4X) O ActionScript 3.0 implementa o ECMAScript para XML (E4X), recentemente padronizado como ECMA-357. O E4X oferece um conjunto fluente de construes de linguagem para manipular XML. Diferentemente das APIs tradicionais de anlise de XML, o XML com E4X funciona como um tipo de dados nativo da linguagem. O E4X simplifica o desenvolvimento de aplicativos que manipulam XML, reduzindo drasticamente a quantidade de cdigo necessria. Para obter mais informaes sobre a implementao do E4X do ActionScript 3.0, consulte Trabalho com XML na pgina 230.

PROGRAMAO DO ACTIONSCRIPT 3.0 6


Introduo ao ActionScript 3.0

Para exibir a especificao E4X do ECMA, v para www.ecma-international.org. Expresses regulares O ActionScript 3.0 inclui suporte nativo para expresses regulares, o que permite pesquisar e manipular seqncias de caracteres rapidamente. Ele implementa o suporte a expresses regulares conforme definidas na especificao de linguagem ECMAScript (ECMA-262) edio 3. Espaos para nomes Os espaos para nomes so semelhantes aos especificadores de acesso tradicionais usados para controlar a visibilidade de declaraes (public, private, protected). Eles funcionam como especificadores de acesso personalizados, que podem ter os nomes que voc escolher. Os espaos para nomes so equipados com um URI (Identificador Universal de Recursos) para evitar colises e tambm so usados para representar nomes para espaos XML no trabalho com E4X. Novos tipos primitivos O ActionScript 2.0 tem um nico tipo numrico, Number, um nmero de ponto flutuante de preciso dupla. O ActionScript 3.0 contm os tipos int e uint. O tipo int um inteiro assinado de 32 bits que permite ao cdigo ActionScript aproveitar os rpidos recursos matemticos de inteiros da CPU. O tipo int til para contadores de loop e variveis em que os inteiros so usados. O tipo uint um tipo inteiro de 32 bits no assinado, til para valores de cores RGB, contagens de bytes etc.

Recursos da API do Flash Player


As APIs do Flash Player no ActionScript 3.0 contm vrias classes que permitem controlar objetos em um nvel baixo. A arquitetura da linguagem foi projetada para ser mais intuitiva do que a das outras verses. As novas classes so tantas que no cabe tratar em detalhes aqui, mas as sees a seguir destacam algumas alteraes significativas. Nota: Os aplicativos do Adobe AIR tambm podem usar as APIs do Flash Player. Modelo de eventos DOM3 O modelo de eventos DOM (Document Object Model) nvel 3 fornece um meio padro de gerar e manipular mensagens de eventos para que os objetos nos aplicativos possam interagir e se comunicar, mantendo seu estado e respondendo a alteraes. Padronizado segundo as Especificaes de eventos DOM nvel 3 do World Wide Web Consortium, este modelo fornece um mecanismo mais claro e eficiente do que os sistemas de eventos disponveis nas verses anteriores do ActionScript. Os eventos e eventos de erros esto localizados no pacote flash.events. A estrutura dos componentes Flash usa o mesmo modelo de eventos que a API do Flash Player, por isso o sistema de eventos unificado na plataforma Flash. API de lista de exibio A API para acessar a lista de exibio do Flash Player e do Adobe AIR (a rvore que contm os elementos visuais no aplicativo) consiste em classes para trabalhar com primitivas visuais. A nova classe Sprite um bloco de construo leve, semelhante classe MovieClip, porm mais apropriada como uma classe base para componentes da UI. A nova classe Shape representa formas de vetor brutas. Essas classes podem ser instanciadas naturalmente com o operador new e atribudas a um pai dinamicamente a qualquer momento. O gerenciamento de profundidade agora automtico e incorporado ao Flash Player e ao Adobe AIR, tornando desnecessria a atribuio de nmeros de profundidade. Novos mtodos foram fornecidos para especificar e gerenciar a ordem z de objetos.

PROGRAMAO DO ACTIONSCRIPT 3.0 7


Introduo ao ActionScript 3.0

Manipulao de dados e contedo dinmicos O ActionScript 3.contm mecanismos para carregar e manipular ativos e dados no seu aplicativo que so intuitivos e consistentes na API. A nova classe Loader fornece um nico mecanismo para carregar arquivos SWF e ativos de imagem e fornece uma forma de acessar informaes detalhadas sobre o contedo carregado. A classe URLLoader fornece um mecanismo separado para carregar texto e dados binrios em aplicativos orientados a dados. A classe Socket fornece um meio de ler e gravar dados binrios nos soquetes do servidor em qualquer formato. Acesso a dados de baixo nvel Varias APIs fornecem acesso de baixo nvel a dados que nunca antes estiveram disponveis no ActionScript. Para dados obtidos por download, a classe URLStream, que implementada por URLLoader, fornece acesso a dados como dados binrios brutos enquanto esto sendo baixados. A classe ByteArray permite otimizar a leitura, a gravao e o trabalho com dados binrios. A nova API Sound fornece controle detalhado de som por meio das classes SoundChannel e SoundMixer. Novas APIs que lidam com segurana fornecem informaes sobre os privilgios de segurana de um arquivo SWF ou contedo carregado, permitindo manipular melhor os erros de segurana. Trabalho com texto O ActionScript 3.0 contm um pacote flash.text para todas as APIs relacionadas a texto. A classe TextLineMetrics fornece uma mtrica detalhada para uma linha de texto em um campo de texto; ela substitui o mtodo TextFormat.getTextExtent() no ActionScript 2.0. A classe TextField contm vrios novos mtodos de baixo nvel interessantes que podem fornecer informaes especficas sobre uma linha de texto ou um nico caractere em um campo de texto. Esses mtodos incluem getCharBoundaries(), que retorna um retngulo representando a caixa delimitadora de um caractere, getCharIndexAtPoint(), que retorna o ndice do caractere em um ponto especificado, e getFirstCharInParagraph(), que retorna o ndice do primeiro caractere em um pargrafo. Os mtodos de nvel de linha incluem getLineLength(), que retorna o nmero de caracteres em uma linha de texto especificada, e getLineText(), que retorna o texto da linha especificada. Uma nova classe Font fornece um meio de gerenciar fontes incorporadas em arquivos SWF.

Compatibilidade com verses anteriores


Como sempre, o Flash Player fornece compatibilidade total com contedo publicado em verses anteriores. Qualquer contedo executado em verses anteriores do Flash Player pode ser executado no Flash Player 9 e em verses posteriores. A introduo do ActionScript 3.0 no Flash Player 9, contudo, apresenta alguns desafios de interoperabilidade entre o contedo antigo e o novo executado no Flash Player 9 ou posterior. Esses problemas de compatibilidade incluem os seguinte:

Um nico arquivo SWF no pode combinar o cdigo do ActionScript 1.0 ou 2.0 com o cdigo do ActionScript 3.0. O cdigo do ActionScript 3.0 pode ser carregado em um arquivo SWF escrito no ActionScript 1.0 ou 2.0, mas no
pode acessar as variveis e funes do arquivo SWF.

Os arquivos SWF escritos no ActionScript 1.0 ou 2.0 no podem carregar arquivos SWF escritos no ActionScript
3.0. Isso significa que os arquivos SWF criados no Flash 8 ou no Flex Builder 1.5 ou verses anteriores no podem carregar arquivos SWF do ActionScript 3.0. A nica exceo a essa regra que um arquivo SWF do ActionScript 2.0 pode ser substitudo por um arquivo SWF do ActionScript 3.0, contanto que no tenha carregado nada antes em qualquer um de seus nveis. Um arquivo SWF do ActionScript 2.0 pode fazer isso por meio de uma chamada a loadMovieNum(), transmitindo um valor de 0 ao parmetro level.

PROGRAMAO DO ACTIONSCRIPT 3.0 8


Introduo ao ActionScript 3.0

Em geral, os arquivos SWF escritos no ActionScript 1.0 ou 2.0 devem ser migrados para trabalhar com os arquivos
SWF escritos no ActionScript 3.0. Por exemplo, digamos que voc criou um player de mdia usando o ActionScript 2.0. Ele carrega vrios contedos que tambm foram criados usando o ActionScript 2.0. Se voc criar um novo contedo no ActionScript 3.0, no poder carreg-lo no player de mdia. Ser necessrio migrar o player de vdeo para o ActionScript 3.0. Se, no entanto, voc criar um player de mdia no ActionScript 3.0, ele poder executar carregamentos simples do seu contedo do ActionScript 2.0. As tabelas a seguir resumem as limitaes das verses anteriores do Flash Player em relao ao carregamento de novo contedo e execuo de cdigo, bem como as limitaes de scripts entre arquivos SWF escritos em verses diferentes do ActionScript.
Funcionalidade com suporte Pode carregar SWFs publicados para Contm este AVM Executa SWFs gravados no ActionScript Flash Player 7 7 e anterior AVM1 1.0 e 2.0 Flash Player 8 8 e anterior AVM1 1.0 e 2.0 Flash Player 9 e 10 9 (ou 10) e anterior AVM1 e AVM2 1.0, 2.0 e 3.0

Na tabela a seguir, "Funcionalidade com suporte" refere-se ao contedo executado no Flash Player 9 ou posterior. O contedo executado no Flash Player 8 ou anterior s pode ser carregar, exibir, executar e cruzar scripts no ActionScript 1.0 e 2.0.
Funcionalidade com suporte Contedo criado no ActionScript 1.0 e 2.0 Contedo criado no ActionScript 3.0 ActionScript 1.0, 2.0 e 3.0

Pode carregar contedo e executar cdigo no ActionScript 1.0 e 2.0 apenas contedo criado no Pode cruzar contedo de script criado no

ActionScript 1.0 e 2.0 apenas (ActionScript 3.0 ActionScript 1.0 e 2.0 at LocalConnection. at LocalConnection) ActionScript 3.0

Captulo 3: Introduo do ActionScript


Este captulo foi criado para oferecer uma introduo programao do ActionScript e o conhecimento necessrio para que voc entenda os conceitos e exemplos do resto deste manual. Comearemos com uma discusso sobre os conceitos bsicos de programao, descritos no contexto de sua aplicao ao ActionScript. Tambm abordaremos os fundamentos de como organizar e criar um aplicativo do ActionScript.

Fundamentos de programao
Como o ActionScript uma linguagem de programao, para conhec-lo, primeiro necessrio compreender alguns conceitos gerais de programao de computador.

O que os programas de computador fazem


Em primeiro lugar, bom saber o que um programa de computador e o que ele faz. Um programa de computador consiste em dois aspectos principais:

Ele uma srie de instrues ou etapas que o computador deve executar. Cada etapa envolve a manipulao de algumas informaes ou dados.
Em termos gerais, um programa de computador apenas uma srie de comandos passo a passo que voc fornece ao computador e ele executa. Cada comando conhecido como instruo. Como voc ver neste manual, no ActionScript, cada instruo escrita com um ponto-e-vrgula no final. Em essncia, tudo o que uma determinada instruo faz em um programa manipular alguns dados que esto armazenados na memria do computador. Em um caso simples, voc pode instruir o computador a adicionar dois nmeros e armazenar o resultado na memria. Em um caso mais complexo, imagine que existe um desenho de um retngulo em um lugar na tela e voc quer escrever um programa a fim de mov-lo para outro lugar. O computador est mantendo controle de determinadas informaes sobre o retngulo (as coordenadas x, y nas quais ele est localizado, sua largura, altura, cor etc.). Cada uma dessas informaes est armazenada em um local na memria do computador. Um programa que move o retngulo para um local diferente deve ter etapas como "alterar a coordenada x para 200; alterar a coordenada y para 150" (ou seja, deve especificar novos valores a serem usados para as coordenadas x e y). claro que o computador faz alguma coisa com esses dados para realmente transformar os nmeros na imagem que aparece na tela; mas, para o nvel de detalhe que nos interessa, basta saber que o processo de "mover um retngulo na tela", na verdade, implica em alterar alguns dados na memria do computador.

Variveis e constantes
Como a programao envolve principalmente a alterao de algumas informaes na memria do computador, preciso encontrar um meio de representar uma informao isolada no programa. Uma varivel um nome que representa um valor na memria do computador. Durante a escrita de instrues para manipular valores, o nome da varivel escrito no lugar do valor; sempre que se deparar com o nome da varivel no seu programa, o computador consultar a memria e usar o valor que encontrar nela. Por exemplo, se voc tiver duas variveis chamadas value1 e value2, cada uma contendo um nmero, para adicionar esses dois nmeros, voc pode escrever a instruo:
value1 + value2

Quando executar as etapas, o computador verificar os valores de cada varivel e os adicionar juntos.

PROGRAMAO DO ACTIONSCRIPT 3.0 10


Introduo do ActionScript

No ActionScript 3.0, uma varivel consiste em trs partes diferentes:

O nome da varivel O tipo de dados que pode ser armazenado nela O valor real armazenado na memria do computador
Acabamos de ver como o computador usa o nome como alocador de espao para o valor. O tipo de dados tambm importante. Durante a criao de uma varivel no ActionScript, voc especifica o tipo de dados que ela conter; a partir da, as instrues do programa s podem armazenar esse tipo de dados na varivel, e voc pode manipular o valor usando as caractersticas especficas associadas a esse tipo de dados. No ActionScript, a criao de uma varivel (conhecida como declarar a varivel) requer o uso da instruo var:
var value1:Number;

Nesse caso, instrumos o computador a criar uma varivel chamada value1, que contm apenas dados Number (Number um tipo de dados especfico definido no ActionScript). Voc tambm pode armazenar um valor na varivel imediatamente:
var value2:Number = 17;

No Adobe Flash CS4 Professional, existe outro meio de declarar uma varivel. Durante a colocao de um smbolo de clipe de filme, smbolo de boto ou campo de texto no Palco, voc pode lhe dar um nome de ocorrncia no Inspetor de propriedades. Por baixo do pano, o Flash cria uma varivel com o mesmo nome que o nome de ocorrncia, que voc pode usar no cdigo do ActionScript para fazer referncia a esse item do Palco. Assim, por exemplo, se voc der a um smbolo de clipe de filme no Palco o nome de ocorrncia rocketShip, sempre que usar a varivel rocketShip no cdigo do ActionScript, na verdade, estar manipulando esse clipe de filme. Uma constante muito semelhante a uma varivel no sentido de que um nome que representa um valor na memria do computador, com um tipo de dados especfico. A diferena que um valor s pode ser atribudo a uma constante uma nica vez no processamento do aplicativo do ActionScript. Assim que atribudo, o valor da constante o mesmo em todo o aplicativo. A sintaxe para declarar uma constante a mesma que para declarar uma varivel, exceto que voc usa a palavra-chave const em vez da palavra-chave var:
const SALES_TAX_RATE:Number = 0.07;

Uma constante til para definir um valor que usado em vrios locais em um projeto e que no alterado sob circunstncias normais. O uso de uma constante em vez de um valor literal torna o cdigo mais legvel. Por exemplo, mais fcil entender a finalidade de uma linha de cdigo que multiplica um preo pela SALES_TAX_RATE, comparado a uma linha de cdigo que multiplica o preo por 0,07. Alm disso, se o valor definido por uma constante tiver de ser alterado e voc usar uma constante que represente esse valor em todo o seu projeto, bastar alterar o valor em um nico lugar (a declarao da constante), em vez de alter-lo em vrios locais como aconteceria se voc usasse valores literais codificados.

Tipos de dados
No ActionScript, h vrios tipos de dados que voc pode usar como os tipos de dados da varivel que voc criar. Alguns deles podem ser entendidos como "simples" ou "fundamentais":

Seqncia de caracteres: um valor textual, como um nome ou o texto do captulo de um livro Numrico: o ActionScript 3.0 inclui trs tipos de dados especficos para dados numricos: Nmero: qualquer valor numrico, incluindo valores com ou sem uma frao int: um inteiro (um nmero inteiro sem uma frao) uint: um inteiro "sem sinal", que significa um nmero inteiro que no pode ser negativo

PROGRAMAO DO ACTIONSCRIPT 3.0 11


Introduo do ActionScript

Booleano: um valor do tipo verdadeiro ou falso, tal como se uma opo est ativa ou se dois valores so iguais
Os tipos de dados simples representam uma nica informao: por exemplo, um nico nmero ou uma nica seqncia de texto. Entretanto, a maioria dos tipos de dados definidos no ActionScript poderia ser descrita como tipos de dados complexos, porque representam um conjunto de valores agrupados. Por exemplo, uma varivel com o tipo de dados Date representa um valor nico: um momento no tempo. No entanto, esse valor de data na verdade representado com diversos valores: dia, ms, ano, horas, minutos, segundos etc., que so todos nmeros individuais. Portanto, embora pensemos em uma data como um valor nico (e a tratemos dessa forma, criando uma varivel Date), internamente, o computador a entende como um grupo de diversos valores que, juntos, definem uma nica data. A maioria dos tipos de dados embutidos, bem como os definidos pelos programadores, so tipos de dados complexos. Alguns tipos de dados complexos que talvez voc conhea so:

MovieClip: um smbolo de clipe de filme TextField: um campo de texto de entrada ou dinmico SimpleButton: um smbolo de boto Date: informaes sobre um momento nico no tempo (uma data e hora)
Duas palavras que, em geral, so usadas como sinnimos de tipos de dados so classe e objeto. Uma classe simplesmente a definio de um tipo de dados; como um modelo para todos os objetos dos tipos de dados, como dizer "todas as variveis do tipo de dados Example tm estas caractersticas: A, B e C. Um objeto, porm, apenas uma ocorrncia real de uma classe; uma varivel cujo tipo de dados MovieClip poderia ser descrita como um objeto MovieClip. Estas so formas diferentes de dizer a mesma coisa:

O tipo de dados da varivel myVariable Number. A varivel myVariable uma ocorrncia de Number. A varivel myVariable um objeto Number. A varivel myVariable uma ocorrncia da classe Number.

Trabalho com o objetos


O ActionScript conhecido como uma linguagem de programao orientada a objetos. Programao orientada a objetos simplesmente uma abordagem da programao, nada mais do que uma forma de organizar o cdigo em um programa, usando objetos. Anteriormente, definimos um programa de computador como uma srie de etapas ou instrues que o computador executa. De forma conceitual, ento, podemos imaginar um programa de computador como uma longa lista de instrues. Entretanto, na programao orientada a objetos, as instrues do programa so divididas em objetos diferentes, ou seja, o cdigo agrupado em blocos de funcionalidade, de forma que tipos relacionados de funcionalidade ou partes relacionadas de informao so agrupados em um nico continer. Na verdade, se voc j trabalhou com smbolos no Flash, ento est acostumado a trabalhar com objetos. Imagine que voc definiu um smbolo de clipe de filme (digamos que seja o desenho de um retngulo) e colocou uma cpia dele no Palco. Esse smbolo de clipe de filme tambm (literalmente) um objeto no ActionScript; uma ocorrncia da classe MovieClip.

PROGRAMAO DO ACTIONSCRIPT 3.0 12


Introduo do ActionScript

H diversas caractersticas do clipe de filme que voc pode modificar. Por exemplo, quando ele selecionado, h valores que voc pode alterar no Inspetor de propriedades, como a coordenada x, sua largura ou vrios ajustes de cor, como alterar seu alfa (transparncia) ou aplicar um filtro de sombra. Outras ferramentas do Flash permitem fazer mais alteraes, como usar a ferramenta Transformao livre para girar o retngulo. Tudo o que possvel fazer para modificar um smbolo de clipe de filme no ambiente de autoria do Flash tambm pode ser feito no ActionScript, alterando as partes dos dados que so colocadas em um nico pacote chamado objeto MovieClip. Na programao orientada a objetos do ActionScript, h trs tipos de caractersticas que qualquer classe pode incluir:

Propriedades Mtodos Eventos


Juntos, esses elementos ajudam a gerenciar as partes dos dados usadas pelo programa e a decidir quais aes so executadas em uma determinada ordem.

Propriedades
Uma propriedade representa uma das partes dos dados que so compactados em um objeto. Um objeto de msica pode ter propriedades chamadas artist e title; a classe MovieClip tem propriedades como rotation, x, width e alpha. As propriedades so tratadas como variveis individuais; na verdade, elas podem ser entendidas apenas como as variveis "filho" contidas em um objeto. A seguir, apresentamos alguns exemplos de cdigo do ActionScript que usa propriedades. Esta linha de cdigo move o MovieClip chamado square para 100 pixels na coordenada x:
square.x = 100;

Este cdigo usa a propriedade de rotao fazendo com que o MovieClip square gire para corresponder rotao do MovieClip triangle:
square.rotation = triangle.rotation;

Este cdigo altera a escala horizontal do MovieClip square para que ele fique uma vez e meia maior do que antes:
square.scaleX = 1.5;

Observe a estrutura comum: voc usa uma varivel (square, triangle) como o nome do objeto, seguido de um ponto (.) e, depois, o nome da propriedade (x, rotation, scaleX). O ponto, conhecido como operador ponto, usado para indicar que voc est acessando um dos elementos filho de um objeto. A estrutura inteira reunida, "nome da varivelponto-nome da propriedade", usada como uma nica varivel, como um nome para um nico valor na memria do computador.

Mtodos
Um method uma ao que pode ser executada por um objeto. Por exemplo, se voc criou um smbolo de clipe de filme no Flash com vrios quadros-chave e animao em sua linha de tempo, esse clipe de filme pode ser reproduzido, parar ou ser instrudo a mover o indicador de reproduo para um quadro especfico. Este cdigo instrui o MovieClip chamado shortFilm a iniciar a reproduo:
shortFilm.play();

Esta linha faz o MovieClip chamado shortFilm parar a reproduo (o indicador de reproduo pra; como pausar um vdeo):
shortFilm.stop();

PROGRAMAO DO ACTIONSCRIPT 3.0 13


Introduo do ActionScript

Este cdigo faz um MovieClip chamado shortFilm mover o indicador de reproduo para o Quadro 1 e parar a reproduo ( como retroceder um vdeo):
shortFilm.gotoAndStop(1);

Como voc pode ver, os mtodos, assim como as propriedades, so acessados escrevendo o nome do objeto (uma varivel), um ponto e o nome do mtodo seguido de parnteses. Os parnteses so uma forma de indicar que voc est chamando o mtodo ou, em outras palavras, instruindo o objeto a executar aquela ao. s vezes, os valores (ou as variveis) so colocados entre parnteses, como uma forma de passar adiante informaes adicionais necessrias para executar a ao. Esses valores so conhecidos como parmetros de mtodo. Por exemplo, o mtodo gotoAndStop() precisa saber para qual quadro deve ir, por isso requer um nico parmetro entre parnteses. Outros mtodos, como play() e stop(), so auto-explicativos, por isso no requerem informaes extras. No entanto, eles ainda so escritos com parnteses. Diferentemente das propriedades (e variveis), os mtodos no so usados como alocadores de espao de valor. Entretanto, alguns mtodos podem executar clculos e retornar um resultado que pode ser usado como uma varivel. Por exemplo, o mtodo toString() da classe Number converte o valor em sua representao de texto:
var numericData:Number = 9; var textData:String = numericData.toString();

Por exemplo, voc usaria o mtodo toString() se quisesse exibir o valor de uma varivel Number em um campo de texto na tela. A propriedade text da classe TextField (que representa o contedo real do texto exibido na tela) definida como uma String, por isso pode conter apenas valores de texto. Esta linha de cdigo converte o valor numrico na varivel numericData em texto e faz com que aparea na tela, no objeto TextField chamado calculatorDisplay:
calculatorDisplay.text = numericData.toString();

Eventos
Descrevemos um programa de computador como uma srie instrues que o computador executa em etapas. Alguns programas de computador simples consistem em nada mais do que algumas etapas que ele executa e depois encerrado. Entretanto, os programas do ActionScript so criados para continuar a execuo e esperar a entrada do usurio ou a ocorrncia de outras coisas. Os eventos so mecanismos que determinam quais instrues o computador executa em um determinado momento. Basicamente, os eventos so fenmenos que acontecem, sobre os quais o ActionScript informado e aos quais pode responder. Muitos eventos esto relacionados interao do usurio, como quando um usurio clica em um boto ou pressiona uma tecla no teclado, mas tambm h outros tipos. Por exemplo, se voc usar o ActionScript para carregar uma imagem externa, h um evento que poder avis-lo quando o carregamento da imagem for concludo. Em essncia, quando um programa ActionScript executado, o Adobe Flash Player e o Adobe AIR aguardam determinados eventos e, ento, executam o cdigo ActionScript especfico definido para esses eventos.

Tratamento de eventos bsico


A tcnica para especificar determinadas aes que devem ser executadas em resposta a eventos especficos conhecida como tratamento de eventos. Durante a escrita do cdigo do ActionScript para executar o tratamento de eventos, h trs elementos importantes a serem identificados:

A origem do evento: para qual objeto o evento dever ocorrer? Por exemplo, qual boto ser clicado ou qual objeto
Loader est carregando a imagem? A origem do evento tambm conhecida como destino do evento, porque o objeto para o qual o evento destinado pelo Flash Player ou AIR (ou seja, onde o evento realmente acontece).

O evento: o que ir acontecer, a qual fenmeno voc deseja responder? importante identificar isso, porque muitos
objetos acionam diversos eventos.

PROGRAMAO DO ACTIONSCRIPT 3.0 14


Introduo do ActionScript

A resposta: qual ou quais etapas voc deseja executar quando o evento acontecer?
Sempre que voc escrever cdigo do ActionScript para manipular eventos, ele deve incluir estes trs elementos, e o cdigo deve seguir a estrutura bsica (os elementos em negrito so alocadores de espao que voc preenche conforme o caso especfico):
function eventResponse(eventObject:EventType):void { // Actions performed in response to the event go here. } eventSource.addEventListener(EventType.EVENT_NAME, eventResponse);

Esse cdigo faz duas coisas. Primeiro, ele define uma funo, que a forma de especificar as aes que voc deseja executar em resposta ao evento. Em seguida, o mtodo addEventListener() do objeto de origem chamado basicamente inscrevendo a funo do evento especificado para que, quando o evento acontecer, as aes da funo sejam executadas Vejamos cada uma dessas partes com mais detalhes. Uma funo fornece um meio de agrupar as aes, com um nico nome, que como um nome de atalho, para executar as aes. Ela idntica a um mtodo, exceto que no est necessariamente associada a uma classe especfica (na verdade, um mtodo poderia ser definido como uma funo associada a uma classe especfica). Durante a criao de uma funo para tratamento de eventos, voc deve escolher o nome da funo (chamada de eventResponse neste caso). Voc tambm deve especificar um parmetro (chamado eventObject neste exemplo). A especificao de um parmetro de funo como declarar uma varivel, por isso voc tambm deve indicar o tipo de dados do parmetro. (Neste exemplo, o tipo de dados do parmetro EventType.) Cada tipo de evento que voc deseja escutar associado a uma classe do ActionScript. O tipo de dados que voc define para o parmetro de funo sempre a classe associada ao evento especfico ao qual deseja responder. Por exemplo, um evento click (acionado quando o usurio clica em um item com o mouse) associado classe MouseEvent. Para escrever uma funo de ouvinte para um evento click, voc define essa funo com um parmetro com o tipo de dados MouseEvent. Finalmente, entre chaves ({ ... }), voc escreve as instrues que deseja que o computador execute quando o evento ocorrer. Depois de escrever a funo de tratamento de eventos, necessrio informar ao objeto de origem de evento (o objeto para o qual o evento acontece, por exemplo, o boto) que voc deseja que a funo seja chamada quando o evento ocorrer. possvel fazer isso chamando o mtodo addEventListener() desse objeto (todos os objetos que possuem eventos tambm tm um mtodo addEventListener()). O mtodo addEventListener() usa dois parmetros:

O primeiro o nome do evento especfico ao qual voc deseja responder. Novamente, cada evento afiliado a uma
classe especfica, e essa classe ter um valor especial predefinido para cada evento (como se fosse o prprio nome exclusivo do evento, que voc deve usar para o primeiro parmetro).

O segundo o nome da funo de resposta do evento. Observe que um nome de funo escrito sem parnteses
quando transmitido como um parmetro.

Exame do processo de tratamento de eventos


Veja a seguir uma descrio passo a passo do processo que acontece durante a criao de um ouvinte de eventos. Neste caso, um exemplo de criao de uma funo de ouvinte que chamada quando um objeto myButton clicado. O cdigo real escrito pelo programador o seguinte:

PROGRAMAO DO ACTIONSCRIPT 3.0 15


Introduo do ActionScript

function eventResponse(event:MouseEvent):void { // Actions performed in response to the event go here. } myButton.addEventListener(MouseEvent.CLICK, eventResponse);

Apresentaremos a seguir o funcionamento desse cdigo, quando executado no Flash Player. O comportamento o mesmo no Adobe AIR:
1 Quando o arquivo SWF carregado, o Flash Player registra o fato de que h uma funo chamada
eventResponse().

PROGRAMAO DO ACTIONSCRIPT 3.0 16


Introduo do ActionScript

2 Em seguida, o Flash Player executa o cdigo (especificamente, as linhas de cdigo que no esto contidas em uma

funo). Neste caso, apenas uma linha de cdigo: chamar o mtodo addEventListener() no objeto de origem do evento (chamado myButton) e transmitir a funo eventResponse como um parmetro.

a Internamente, myButton tem uma lista de funes que esto ouvindo cada um de seus eventos, por isso quando

seu mtodo addEventListener() chamado, myButtonarmazena a funo eventResponse() na lista de ouvintes de eventos.

3 Em algum momento, o usurio clica no objeto myButton, acionando o evento click (identificado como
MouseEvent.CLICK no cdigo).

PROGRAMAO DO ACTIONSCRIPT 3.0 17


Introduo do ActionScript

Ento, acontece o seguinte:


a O Flash Player cria um objeto, uma ocorrncia da classe associada ao evento em questo (MouseEvent, no

exemplo citado). Para muitos eventos, essa ser uma ocorrncia da classe Event; para eventos do mouse, ser uma ocorrncia de MouseEvent e, para outros eventos, ser uma ocorrncia da classe associada a esse evento. Esse objeto criado conhecido como o objeto de evento e contm informaes especficas sobre o evento que ocorreu: qual o tipo de evento, onde ele ocorreu e outras informaes especficas de evento se aplicvel.

b Em seguida, o Flash Player verifica a lista de ouvintes de eventos armazenada por myButton. Ele verifica todas

essas funes, chamando uma de cada vez e transmitindo o objeto de evento para a funo como um parmetro. Como a funo eventResponse() um dos ouvintes de myButton, como parte desse processo, o Flash Player chama a funo eventResponse().

PROGRAMAO DO ACTIONSCRIPT 3.0 18


Introduo do ActionScript

c Quando a funo eventResponse() chamada, o cdigo nela executado e as aes especificadas so

realizadas.

Exemplos de tratamento de eventos


A seguir, mostramos alguns exemplos mais concretos de eventos para lhe dar uma idia de alguns elementos de eventos comuns e as possveis variaes disponveis durante a escrita do cdigo de tratamento de eventos:

Clicar em um boto para iniciar a reproduo do clipe de filme atual. No exemplo a seguir, playButton o nome
da ocorrncia do boto, e this um nome especial que significa o objeto atual:
this.stop(); function playMovie(event:MouseEvent):void { this.play(); } playButton.addEventListener(MouseEvent.CLICK, playMovie);

Detectar tipos em um campo de texto: Neste exemplo, entryText um campo de texto de entrada, e outputText
um campo de texto dinmico:
function updateOutput(event:TextEvent):void { var pressedKey:String = event.text; outputText.text = "You typed: " + pressedKey; } entryText.addEventListener(TextEvent.TEXT_INPUT, updateOutput);

Clicar em um boto para navegar em uma URL. Nesse caso, linkButton o nome de ocorrncia do boto:
function gotoAdobeSite(event:MouseEvent):void { var adobeURL:URLRequest = new URLRequest("http://www.adobe.com/"); navigateToURL(adobeURL); } linkButton.addEventListener(MouseEvent.CLICK, gotoAdobeSite);

PROGRAMAO DO ACTIONSCRIPT 3.0 19


Introduo do ActionScript

Criar ocorrncias de objetos


Obviamente, para que voc possa usar um objeto no ActionScript, primeiro, ele deve existir. Uma parte da criao de um objeto declarar uma varivel; porm, a declarao de uma varivel s cria um lugar vazio na memria do computador. Voc deve atribuir um valor real varivel, isto , criar um objeto e armazen-lo na varivel, antes de tentar us-lo ou manipul-lo. O processo de criar um objeto conhecido como instanciar o objeto, em outras palavras, criar uma ocorrncia de uma classe especfica. Existe uma maneira simples de criar uma ocorrncia de objeto que no envolve o ActionScript. No Flash, quando voc coloca um smbolo de clipe de filme, smbolo de boto ou campo de texto no Palco e lhe atribui um nome de ocorrncia no Inspetor de propriedades, o Flash automaticamente declara uma varivel com esse nome de ocorrncia, cria uma ocorrncia de objeto e armazena o objeto na varivel. Da mesma forma, quando voc usa a linguagem MXML para criar um componente no Adobe Flex Builder (codificando uma tag MXML ou colocando o componente no editor no modo Design) e lhe atribui uma ID (no markup MXML ou na exibio Propriedades do Flex), essa ID se torna o nome de uma varivel do ActionScript, e uma ocorrncia do componente criada e armazenada nessa varivel. Entretanto, nem sempre voc criar um objeto visualmente. Tambm h vrias formas de criar ocorrncias de objeto usando somente o ActionScript. Primeiro, com vrios tipos de dados do ActionScript, voc pode criar uma ocorrncia usando uma expresso literal, um valor escrito diretamente no cdigo do ActionScript. Eis alguns exemplos:

Valor numrico literal (insere o nmero diretamente):


var someNumber:Number = 17.239; var someNegativeInteger:int = -53; var someUint:uint = 22;

Valor da seqncia de caracteres literal (envolve o texto com aspas duplas):


var firstName:String = "George"; var soliloquy:String = "To be or not to be, that is the question...";

Valor booleano literal (usa os valores literais true ou false):


var niceWeather:Boolean = true; var playingOutside:Boolean = false;

Valor Array literal (envolve uma lista de valores separados por vrgula entre colchetes):
var seasons:Array = ["spring", "summer", "autumn", "winter"];

Valor XML literal (insere o XML diretamente):


var employee:XML = <employee> <firstName>Harold</firstName> <lastName>Webster</lastName> </employee>;

O ActionScript tambm define expresses literais para os tipos de dados Array, RegExp, Object e Function. Para obter detalhes sobre essas classes, consulte Trabalho com matrizes na pgina 157, Uso de expresses regulares na pgina 209 e Tipo de dados Object na pgina 60. Para qualquer outro tipo de dados, para criar uma ocorrncia de objeto, use o operador new como o nome da classe, desta forma:
var raceCar:MovieClip = new MovieClip(); var birthday:Date = new Date(2006, 7, 9);

O ato de criar de um objeto usando o operador new, muitas vezes, descrito como chamar o construtor da classe Um construtor um mtodo especial que chamado como parte do processo de criar uma ocorrncia de uma classe. Observe que, ao criar uma ocorrncia dessa forma, voc coloca parnteses depois do nome da classe e, s vezes, especifica valores de parmetro (duas aes que tambm so executadas ao chamar um mtodo).

PROGRAMAO DO ACTIONSCRIPT 3.0 20


Introduo do ActionScript

Observe que, mesmo para esses tipos de dados que permitem criar ocorrncias usando uma expresso literal, voc ainda pode usar o operador new para criar uma ocorrncia de objeto. Por exemplo, as duas linhas de cdigo a seguir fazem exatamente a mesma coisa:
var someNumber:Number = 6.33; var someNumber:Number = new Number(6.33);

importante se familiarizar com a forma como new ClassName() cria objetos. Se for necessrio criar uma ocorrncia de qualquer tipo de dados ActionScript que no tenha uma representao visual (e no possa ser criada colocando um item no Palco do Flash ou no modo Design do editor XML do Flex Builder), isso s ser possvel criando o objeto diretamente no ActionScript pelo uso do operador new. No Flash especificamente, o operador new tambm pode ser usado para criar uma ocorrncia de um smbolo de clipe de filme que definido na Biblioteca mas no colocado no Palco. Para obter mais informaes sobre isso, consulte Criao de objetos MovieClip com o ActionScript na pgina 413.

Elementos de programa comuns


Alm de declarar variveis, criar ocorrncias de objetos e manipular objetos usando suas propriedades e mtodos, h outros blocos de construo que voc precisa usar para criar um programa do ActionScript.

Operadores
Os operadores so smbolos (ou, ocasionalmente, palavras) essenciais que so usados para executar clculos. Eles so muito usados em operaes matemticas e tambm para comparar valores. Como regra geral, um operador usa um ou mais valores e "obtm" um nico resultado. Por exemplo:

O operador de adio (+) adiciona dois valores, tendo como resultado um nico nmero:
var sum:Number = 23 + 32;

O operador de multiplicao (*) multiplica dois valores, tendo como resultado um nico nmero:
var energy:Number = mass * speedOfLight * speedOfLight;

O operador de igualdade (==) compara se dois valores so iguais, tendo como resultado um nico valor verdadeiro
ou falso (booleano):
if (dayOfWeek == "Wednesday") { takeOutTrash(); }

Conforme mostrado aqui, o operador de igualdade e os outros operadores de "comparao", em geral, so usados com a instruo if para determinar se algumas instrues devem ser executadas. Para obter detalhes e exemplos do uso de operadores, consulte Operadores na pgina 70.

PROGRAMAO DO ACTIONSCRIPT 3.0 21


Introduo do ActionScript

Comentrios
Durante a escrita do ActionScript, muitas vezes, voc desejar fazer anotaes, talvez para explicar como algumas linhas de cdigo funcionam e por que escolheu uma determinada opo. Os comentrios de cdigo so uma ferramenta que voc pode usar para escrever um texto que o computador deve ignorar no seu cdigo. O ActionScript inclui dois tipos de comentrios:

Comentrio de uma linha: um comentrio de uma linha criado colocando duas barras em qualquer lugar de uma
linha. Tudo que vier depois das barras at o fim da linha ser ignorado pelo computador:
// This is a comment; it's ignored by the computer. var age:Number = 10; // Set the age to 10 by default.

Comentrio de vrias linhas: um comentrio de vrias linhas inclui um marcador de comentrio inicial (/*), o
contedo do comentrio e um marcador de comentrio final (*/). Tudo entre os marcadores inicial e final ignorado pelo computador, independentemente do nmero de linhas que o comentrio contm:
/* This might be a really long description, perhaps describing what a particular function is used for or explaining a section of code. In any case, these lines are all ignored by the computer. */

Outro uso comum dos comentrios "desativar" temporariamente uma ou mais linhas de cdigo, por exemplo, se voc estiver testando uma forma diferente de fazer algo ou tentando descobrir por que um cdigo do ActionScript no est funcionando conforme o esperado.

Controle do fluxo
Muitas vezes em um programa, voc desejar repetir determinadas aes, executar apenas algumas e outras no, executar aes conforme condies especficas etc. O controle de fluxo o controle sobre as aes que so executadas. H vrios tipos de elementos de controle de fluxo disponveis no ActionScript.

Funes: as funes so como atalhos: fornecem um meio de agrupar uma srie de aes sob um nico nome e
podem ser usadas para realizar clculos. As funes so especialmente importantes para tratar eventos, mas tambm so usadas como uma ferramenta geral para agrupar uma srie de instrues. Para obter mais informaes sobre funes, consulte Funes na pgina 80.

Loops: as estruturas de loop permitem designar um conjunto de instrues que o computador executar por um
determinado nmero de vezes ou at que alguma condio seja alterada. Com freqncia, os loops so usados para manipular vrios itens relacionados, empregando uma varivel cujo valor alterado sempre que o computador completa o loop. Para obter mais informaes sobre loops, consulte Repetio na pgina 77.

Instrues condicionais: as instrues condicionais fornecem um meio de designar algumas instrues que so
executadas somente sob determinadas circunstncias ou de fornecer conjuntos alternativos de instrues para condies diferentes. O tipo mais comum de instruo condicional a instruo if. A instruo if verifica um valor ou uma expresso entre parnteses. Se o valor for true, as linhas de cdigo entre chaves so executadas; caso contrrio, elas so ignoradas. Por exemplo:
if (age < 20) { // show special teenager-targeted content }

A parceira da instruo if, a instruo else, permite designar instrues alternativas a serem executadas caso a condio no seja true:

PROGRAMAO DO ACTIONSCRIPT 3.0 22


Introduo do ActionScript

if (username == "admin") { // do some administrator-only things, like showing extra options } else { // do some non-administrator things }

Para obter mais informaes sobre instrues condicionais, consulte Condicionais na pgina 76.

Exemplo: Pea de portflio de animao


Este exemplo foi criado para oferecer-lhe uma oportunidade de ver pela primeira vez como possvel juntar partes do ActionScript para obter um aplicativo completo, se no robusto, do ActionScript. A pea de portflio de animao um exemplo de como voc pode usar uma animao linear existente (por exemplo, uma pea criada para um cliente) e adicionar alguns elementos interativos menores apropriados para incorporar essa animao em um portflio on-line. O comportamento interativo que adicionaremos animao incluir dois botes nos quais o espectador poder clicar: um para iniciar a animao e outro para navegar em uma URL separada (como o menu do portflio ou a home page do autor). O processo de criar essa pea pode ser dividido nestas sees principais:
1 Preparar o arquivo FLA para adicionar elementos interativos e do ActionScript. 2 Criar e adicionar os botes. 3 Escrever o cdigo do ActionScript. 4 Testar o aplicativo.

Preparao para adicionar interatividade


Antes que possamos adicionar elementos interativos nossa animao, bom configurar o arquivo FLA criando alguns locais para adicionar o novo contedo. Isso inclui a criao de espao real no Palco onde os botes podem ser colocados e tambm a criao de "espao" no arquivo FLA para manter separados os itens diferentes. Para configurar o FLA para adicionar elementos interativos: 1 Se voc ainda no tiver uma animao linear qual ir adicionar a interatividade, crie um novo arquivo FLA com uma animao simples como uma interpolao de movimento ou uma interpolao de forma. Caso contrrio, abra o arquivo FLA contendo a animao que voc est exibindo no projeto e salve-o com um novo nome para criar um novo arquivo funcional.
2 Decida o local na tela em que voc deseja que os dois botes apaream (um para iniciar a animao e outro para

vincular ao portflio do autor ou home page). Se necessrio, limpe o Palco ou adicione espao para esse novo contedo. Se a animao j no tiver uma, voc pode querer criar uma tela de abertura no primeiro quadro (provavelmente, voc deslocar a animao para que ela comece no Quadro 2 ou depois).
3 Adicione uma nova camada, acima das outras camadas na Linha de tempo, e renomei-a como buttons. Essa ser a

camada na qual voc adicionar os botes.


4 Adicione uma nova camada, acima das camadas de botes, e renomei-a como actions. Nela, voc adicionar o

cdigo do ActionScript para seu aplicativo.

PROGRAMAO DO ACTIONSCRIPT 3.0 23


Introduo do ActionScript

Criao e adio de botes


Em seguida, precisamos realmente criar e posicionar os botes que sero a parte central do nosso aplicativo interativo. Para criar e adicionar botes ao FLA: 1 Usando as ferramentas de desenho, crie a aparncia visual do seu primeiro boto (o boto "reproduzir") na camada de botes. Por exemplo, voc pode desenhar uma figura oval na horizontal com texto em cima.
2 Usando a ferramenta Seleo, selecione todas as partes grficas do boto sozinho. 3 No menu principal, escolha Modificar > Converter em smbolo. 4 Na caixa de dilogo, escolha Boto como o tipo de smbolo, d um nome ao smbolo e clique em OK. 5 Com o boto selecionado, no Inspetor de propriedades, d ao boto o nome de ocorrncia playButton. 6 Repita as etapas de 1 a 5 para criar o boto que levar o espectador home page do autor. Chame este boto de

homeButton.

Gravao do cdigo
O cdigo do ActionScript para este aplicativo pode ser dividido em trs conjuntos de funcionalidade, mas todos sero inseridos no mesmo lugar. As trs coisas que o cdigo precisa fazer so:

Parar o indicador de reproduo assim que o arquivo SWF carregar (quando o indicador de reproduo entrar no
Quadro 1).

Monitorar um evento para iniciar a reproduo do arquivo SWF quando o usurio clicar no boto de reproduo. Monitorar um evento para enviar o navegador URL apropriada quando o usurio clicar no boto da home page
do autor. Para criar um cdigo que pare o indicador de reproduo quando ele entrar no Quadro 1: 1 Selecione o quadro-chave no Quadro 1 da camada de aes.
2 Para abrir o painel Aes, no menu principal, escolha Janela > Aes. 3 No painel Script, digite o seguinte cdigo:
stop();

Para escrever cdigo para iniciar a animao quando o boto de reproduo for clicado: 1 No fim do cdigo digitado nas etapas anteriores, adicione duas linhas vazias.
2 Digite o seguinte cdigo na parte inferior do script:
function startMovie(event:MouseEvent):void { this.play(); }

Este cdigo define uma funo chamada startMovie(). Quando startMovie() chamado, elefaz com que a linha de tempo principal comece a reproduzir.
3 Na linha seguinte ao cdigo adicionado na etapa anterior, digite esta linha de cdigo:
playButton.addEventListener(MouseEvent.CLICK, startMovie);

Esta linha de cdigo registra a funo startMovie() como um ouvinte para o evento click de playButton. Em outras palavras, com ela, sempre que o boto chamado playButton clicado, a funo startMovie() chamada.

PROGRAMAO DO ACTIONSCRIPT 3.0 24


Introduo do ActionScript

Para escrever o cdigo por meio do qual o navegador acessa uma URL quando o boto da home page for clicado: 1 No fim do cdigo digitado nas etapas anteriores, adicione duas linhas vazias.
2 Digite este cdigo na parte inferior do script:
function gotoAuthorPage(event:MouseEvent):void { var targetURL:URLRequest = new URLRequest("http://example.com/"); navigateToURL(targetURL); }

Este cdigo define uma funo chamada gotoAuthorPage(). Essa funo primeiro cria uma ocorrncia de URLRequest representando a URL http://example.com/ e depois repassa essa URL para a funo navigateToURL(), fazendo o navegador do usurio abrir nessa URL.
3 Na linha seguinte ao cdigo adicionado na etapa anterior, digite esta linha de cdigo:
homeButton.addEventListener(MouseEvent.CLICK, gotoAuthorPage);

Esta linha de cdigo registra a funo gotoAuthorPage() como um ouvinte para o evento click de homeButton. Em outras palavras, com ela, sempre que o boto chamado homeButton clicado, a funo gotoAuthorPage() chamada.

Teste do aplicativo
Neste momento, o aplicativo deve estar funcionando completamente. Vamos test-lo para ver se isso verdade. Para testar o aplicativo: 1 Do menu principal, escolha Controlar > Testar filme. O Flash cria o arquivo SWF e o abre em uma janela do Flash Player.
2 Tente os dois botes para verificar se eles agem conforme o esperado. 3 Se os botes no funcionarem, veja algumas coisas que voc pode verificar:

Os dois botes tm nomes de ocorrncia distintos? As chamadas de mtodo addEventListener() usam os mesmos nomes que os nomes de ocorrncia dos
botes?

Os nomes de evento corretos foram usados nas chamadas de mtodo addEventListener()? Foi especificado o parmetro correto para cada uma das funes? (As duas devem ter um nico parmetro com
o tipo de dados MouseEvent.) Tudo isso, alm de outros erros possveis, gera uma mensagem de erro quando voc escolhe o comando Testar filme ou clica no boto. Verifique se h erros de compilao no painel Erros do compilador (aqueles que acontecem quando voc escolhe Testar filme pela primeira vez) e verifique se h erros de tempo de execuo no painel Sada (erros que acontecem quando o SWF reproduzido, tal como quando voc clica em um boto).

Criao de aplicativos com o ActionScript


O processo de escrever no ActionScript para criar um aplicativo vai alm de apenas conhecer a sintaxe e os nomes das classes que sero usadas. Embora a maioria das informaes neste manual seja destinada a esses dois tpicos (sintaxe e uso de classes do ActionScript), outras informaes tambm so teis, tal como quais programas podem ser usados para escrever cdigo do ActionScript, como o ele pode ser organizado e includo em um aplicativo e quais etapas devem ser executadas aps o desenvolvimento do aplicativo do ActionScript.

PROGRAMAO DO ACTIONSCRIPT 3.0 25


Introduo do ActionScript

Opes para organizar seu cdigo


Voc pode usar o cdigo do ActionScript 3.0 para acionar tudo, desde simples animaes grficas at sistemas complexos de processamento de transaes de cliente-servidor. Dependendo do tipo de aplicativo que est sendo criado, voc pode preferir usar uma ou mais dessas formas de incluir o ActionScript no seu projeto. Armazenamento de cdigo em quadros em uma linha de tempo do Flash No ambiente de autoria do Flash, voc pode adicionar cdigo do ActionScript a qualquer quadro na linha de tempo. Esse cdigo ser executado enquanto o filme estiver sendo reproduzido, quando o indicador de reproduo entrar nesse quadro. A colocao de cdigo do ActionScript em quadros fornece um meio simples de adicionar comportamentos a aplicativos criados na ferramenta de autoria do Flash. Voc pode adicionar cdigo a qualquer quadro na linha de tempo principal ou na linha de tempo de qualquer smbolo do MovieClip. Entretanto, essa flexibilidade tem um preo. Durante a criao de aplicativos grandes, fcil perder o controle de quais quadros contm quais scripts. Com o tempo, pode ficar mais difcil manter o aplicativo. Muitos desenvolvedores simplificam a organizao do cdigo do ActionScript na ferramenta de autoria do Flash, colocando o cdigo somente no primeiro quadro de uma linha de tempo ou em uma camada especfica no documento Flash. Isso facilita a localizao e manuteno do cdigo nos arquivos FLA do Flash. Entretanto, para usar o mesmo cdigo em outro projeto Flash, necessrio copiar e colar o cdigo no novo arquivo. Para poder usar o cdigo do ActionScript em outros projetos Flash no futuro, voc deve armazen-lo em arquivos externos do ActionScript (arquivos de texto com a extenso .as). Armazenamento de cdigo em arquivos do ActionScript Se o seu projeto envolve uma quantidade significativa de cdigo do ActionScript, a melhor maneira de organizar seu cdigo em arquivos de origem do ActionScript separados (arquivos de texto com a extenso .as). Um arquivo do ActionScript pode ser estruturado de duas formas, dependendo da maneira como voc pretende us-lo no aplicativo.

Cdigo do ActionScript no estruturado: linhas de cdigo do ActionScript, incluindo instrues ou definies de


funes, escritas como se fossem inseridas diretamente em um script de linha de tempo, arquivo MXML etc. O ActionScript escrito dessa forma pode ser acessado usando a instruo include no ActionScript ou a tag <mx:Script> no MXML do Adobe Flex. A instruo include do ActionScript faz com que o contedo de um arquivo externo do ActionScript seja inserido em um local especfico e dentro de um determinado escopo em um script, como se fosse inserido diretamente. Na linguagem MXML do Flex, a tag <mx:Script> permite especificar um atributo de origem que identifica um arquivo externo do ActionScript a ser carregado nesse momento no aplicativo. Por exemplo, a seguinte tag carregar um arquivo externo do ActionScript chamado Box.as:
<mx:Script source="Box.as" />

Definio da classe do ActionScript: uma definio de uma classe do ActionScript, incluindo suas definies de
mtodo e propriedade. Durante a definio de uma classe, possvel acessar o cdigo do ActionScript na classe, criando uma ocorrncia da classe e usando suas propriedades, seus mtodos e eventos, assim como faria com qualquer classe embutida do ActionScript. Isso requer duas partes:

Use a instruo import para especificar o nome completo da classe, para que o compilador do ActionScript
saiba onde encontr-la. Por exemplo, se voc deseja usar a classe MovieClip no ActionScript, primeiro necessrio importar essa classe usando seu nome completo, incluindo o pacote e a classe:

PROGRAMAO DO ACTIONSCRIPT 3.0 26


Introduo do ActionScript

import flash.display.MovieClip;

Se preferir, voc pode importar o pacote que contm a classe MovieClip, que equivalente a escrever instrues import separadas para cada classe no pacote:
import flash.display.*;

As nicas excees regra de que uma classe deve ser importada se for referida no cdigo so as classes de nvel superior, que no so definidas em um pacote. Nota: No Flash, para scripts anexados aos quadros na Linha de tempo, as classes embutidas (nos pacotes flash.*) so importadas automaticamente. Entretanto, sempre que voc escrever suas prprias classes, se estiver trabalhando com componentes de autoria Flash (os pacotes fl.*) ou se estiver trabalhando no Flex, precisar importar explicitamente qualquer classe para escrever um cdigo que crie ocorrncias dessa classe.

Escreva um cdigo que se refira especificamente ao nome da classe (normalmente declarando uma varivel com
essa classe como seu tipo de dados e criando uma ocorrncia da classe a ser armazenada na varivel). Fazendo referncia a outro nome de classe no cdigo do ActionScript, voc instrui o compilador a carregar a definio dessa classe. Por exemplo, dada uma classe externa chamada Box, esta instruo faz com que uma nova ocorrncia da classe Box seja criada:
var smallBox:Box = new Box(10,20);

Quando encontra a referncia classe Box pela primeira vez, o compilador pesquisa o cdigo-fonte carregado para localizar a definio dessa classe.

Escolha da ferramenta correta


Dependendo da necessidade do seu projeto e dos recursos disponveis, possvel usar uma das diversas ferramentas (ou vrias ferramentas combinadas) para escrever e editar o cdigo do ActionScript. Ferramenta de autoria do Flash Alm de seus recursos grficos e de criao de animaes, o Adobe Flash CS4 Professional inclui ferramentas para trabalhar com cdigos do ActionScript, anexados a elementos em um arquivo FLA ou em arquivos externos, exclusivos do ActionScript. A ferramenta de autoria do Flash ideal para projetos que envolvem grande quantidade de animao ou vdeo, ou quando voc deseja criar a maior parte dos ativos grficos sozinho, especialmente projetos com uma interao mnima do usurio ou funcionalidade que exija o ActionScript. Outro motivo para escolher essa ferramenta ao desenvolver projetos do ActionScript caso prefira criar ativos visuais e escrever cdigo no mesmo aplicativo. Voc tambm pode usar a autoria do Flash se quiser usar componentes da interface do usurio pr-criados, mas com um SWF menor ou uma atribuio de capa visual mais fcil so prioridades essenciais para seu projeto. O Adobe Flash CS4 Professional inclui duas ferramentas para escrever cdigos do ActionScript:

Painel Aes: disponvel para trabalhar em um arquivo FLA, este painel permite escrever cdigo do ActionScript
anexado a quadros em uma linha de tempo.

Janela Script: a janela Script um editor de texto dedicado para trabalhar com arquivos de cdigo do ActionScript
(.as).

PROGRAMAO DO ACTIONSCRIPT 3.0 27


Introduo do ActionScript

Flex Builder O Adobe Flex Builder a principal ferramenta para criar projetos com a estrutura do Flex. Alm do layout visual e das ferramentas de edio de MXML, o Flex Builder tambm inclui um editor do ActionScript, por isso ele pode ser usado para criar projetos do Flex ou somente ActionScript. Os aplicativos do Flex possuem vrias vantagens, incluindo um rico conjunto de controles pr-criados da interface do usurio, controles flexveis de layout dinmico e mecanismos embutidos para trabalhar com fontes de dados externas e vincular dados externos a elementos da interface do usurio. Entretanto, por causa do cdigo adicional necessrio para fornecer esses recursos, os aplicativos do Flex podem ter um arquivo SWF maior e no podem ser completamente encapados com tanta facilidade quanto seus equivalentes do Flash. Use o Flex Builder se estiver criando aplicativos da Internet avanados, orientados a dados e cheios de recursos com o Flex e quiser editar cdigo do ActionScript, cdigo MXML e criar o layout do aplicativo visualmente, tudo com uma nica ferramenta. Editor do ActionScript de terceiros Como os arquivos do ActionScript (.as) so armazenados como arquivos de texto simples, qualquer programa capaz de editar arquivos de texto sem formatao pode ser usado para escrever arquivos do ActionScript. Alm dos produtos do ActionScript da Adobe, foram criados diversos programas de edio de texto de terceiros com recursos especficos do ActionScript. Voc pode escrever um arquivo MXML ou classes do ActionScript usando qualquer programa de editor de texto. possvel, ento, criar um aplicativo SWF (um aplicativo do Flex ou somente ActionScript) a partir desses arquivos usando o SDK do Flex, que inclui as classes de estrutura do Flex, alm do compilador do Flex. Opcionalmente, muitos desenvolvedores usam um editor do ActionScript de terceiros para escrever classes do ActionScript, junto com a ferramenta de autoria do Flash para criar contedo grfico. Voc pode optar por usar um editor do ActionScript de terceiros se:

Preferir escrever cdigo do ActionScript em um programa separado junto com a criao de elementos visuais no
Flash.

Usar um aplicativo para programao que no seja do ActionScript (como criao de pginas HTML ou de
aplicativos em outra linguagem de programao) e quiser usar o mesmo aplicativo para o cdigo do ActionScript tambm.

Quiser criar projetos do Flex ou somente ActionScript usando o SDK do Flex sem o Flash ou o Flex Builder.
Alguns dos notveis editores de cdigo que fornecem suporte especfico ao ActionScript incluem:

Adobe Dreamweaver CS4 ASDT FDT FlashDevelop PrimalScript SE|PY

O processo de desenvolvimento do ActionScript


Quer voc tenha um projeto do ActionScript grande ou pequeno, o uso de um processo para criar e desenvolver seu aplicativo o ajudar a trabalhar com mais eficincia. As etapas a seguir descrevem um processo de desenvolvimento bsico para criar um aplicativo que usa o ActionScript 3.0:
1 Crie seu aplicativo.

Voc deve descrever seu aplicativo de alguma forma antes de comear a cri-lo.

PROGRAMAO DO ACTIONSCRIPT 3.0 28


Introduo do ActionScript

2 Componha o cdigo do ActionScript 3.0.

Voc pode criar cdigo do ActionScript usando o Flash, Flex Builder, Dreamweaver ou um editor de texto.
3 Crie um arquivo de aplicativo do Flash ou Flex para executar o cdigo.

Na ferramenta de autoria do Flash, isso envolve a criao de um novo arquivo FLA, a definio de configuraes de publicao, adio de componentes da interface do usurio ao aplicativo e a referncia ao cdigo do ActionScript. No ambiente de desenvolvimento do Flex, a criao de um novo aplicativo envolve a definio do aplicativo e a adio dos componentes da interface do usurio usando MXML e a referncia ao cdigo do ActionScript.
4 Publique e teste o aplicativo do ActionScript.

Isso significa executar o aplicativo de dentro do ambiente de desenvolvimento do Flex ou de autoria do Flash e verificar se ele faz tudo conforme o esperado. Observe que no preciso seguir essas etapas na ordem nem concluir uma etapa completamente antes de comear outra. Por exemplo, voc pode criar uma tela do aplicativo (etapa 1) e imagens grficas, botes etc. (etapa 3), antes de escrever cdigo do ActionScript (etapa 2) e testar (etapa 4). Ou voc pode criar parte disso e depois adicionar um boto ou um elemento da interface por vez, escrevendo o ActionScript para cada um e testando-o durante a criao. Embora seja til lembrar desses quatro estgios do processo de desenvolvimento, no mundo real, costuma ser mais eficiente executar os estgios avanando e retrocedendo, conforme apropriado.

Criao de suas prprias classes


O processo de criar as classes que sero usadas nos projetos pode parecer assustador. Entretanto, a parte mais difcil da criao de uma classe a tarefa de cri-la, identificando os mtodos, as propriedades e os eventos que ela incluir.

Estratgias para criar uma classe


O tpico de criao orientada a objetos complexo; existem cargos totalmente dedicados ao estudo acadmico e prtica profissional dessa disciplina. No entanto, apresentamos algumas sugestes de abordagens que podem ajud-lo a comear.
1 Pense na funo que as ocorrncias dessa classe exercero no aplicativo. Em geral, os objetos cumprem uma destas

trs funes:

Objeto de valor: esses objetos servem basicamente como contineres de dados, isto , eles costumam ter diversas
propriedades e menos mtodos (ou, s vezes, nenhum mtodo). Em geral, eles so representaes de cdigo de itens definidos claramente, como uma classe Song (representando uma nica msica do mundo real) ou classe Playlist (representando um grupo conceitual de msicas) em um aplicativo de player de msica.

Objeto de exibio: so os objetos que realmente aparecem na tela. Exemplos incluem elementos da interface do
usurio como uma lista suspensa ou exibio de status, elementos grficos como criaturas em um videogame etc.

Estrutura do aplicativo: esses objetos exercem uma ampla gama de funes de suporte na lgica ou no
processamento executados pelos aplicativos. Exemplos incluem um objeto que executa determinados clculos em uma simulao biolgica, um que responsvel por sincronizar valores entre um controle de mostrador e uma exibio de volume em um aplicativo de player de msica, um que gerencia as regras em um videogame ou um que carrega uma imagem salva em um aplicativo de desenho.
2 Escolha a funcionalidade especfica de que a classe precisar. Os diferentes tipos de funcionalidade, em geral, se

tornam mtodos da classe.

PROGRAMAO DO ACTIONSCRIPT 3.0 29


Introduo do ActionScript

3 Se a classe for servir como um objeto de valor, decida quais dados as ocorrncias incluiro. Esses itens so bons

candidatos para propriedades.


4 Como a classe est sendo criada especificamente para seu projeto, o mais importante fornecer a funcionalidade

de que o aplicativo precisa. Talvez ajude responder a estas questes:

Que informaes o aplicativo ir armazenar, controlar e manipular? Decidir isso ajuda a identificar os objetos
de valor e as propriedades que voc deseja.

Quais conjuntos de aes devero ser executados, por exemplo, quando o aplicativo for carregado pela primeira
vez, um boto for clicado, um filme parar de ser reproduzido etc.? Esses so bons candidatos para mtodos (ou propriedades, se as "aes" envolverem apenas a alterao de valores individuais).

Quais informaes a classe deve saber para executar cada ao especfica? Essas informaes se tornam os
parmetros do mtodo.

Conforme o aplicativo executar seu trabalho, o que mudar na sua classe que outras partes do aplicativo dever
saber? Esses itens so bons candidatos para eventos.
5 Se houver um objeto existente semelhante quele de que voc precisa, mas que no tenha alguma funcionalidade

adicional que voc deseja adicionar, considere a criao de uma subclasse (uma classe que aproveite a funcionalidade de uma classe existente, em vez de definir todas as suas prprias funcionalidades). Por exemplo, se voc quiser criar uma classe que seja um objeto visual na tela, pode usar o comportamento de um dos objetos de exibio existentes (por exemplo, Sprite ou MovieClip) como base para sua classe. Nesse caso, MovieClip (ou Sprite) seria a classe base, e sua classe estenderia essa classe. Para obter mais informaes sobre a criao de uma subclasse, consulte Herana na pgina 110.

Escrita do cdigo para uma classe


Depois de fazer um plano de criao para sua classe ou, pelo menos, ter uma idia das informaes sobre as quais ela dever ter controle e quais aes devero ser executadas, a sintaxe real da escrita de uma classe bem direta. Veja as etapas mnimas para criar sua prpria classe do ActionScript:
1 Abra um novo documento de texto, em um programa especfico do ActionScript como o Flex Builder ou o Flash,

em uma ferramenta de programao geral como o Dreamweaver ou em qualquer programa que permita trabalhar com documento de texto sem formatao.
2 Insira uma ocorrncia de class para definir o nome da classe. Para isso, digite as palavras public class, o nome

da classe e as chaves que envolvero o contedo da classe (as definies de mtodo e propriedade). Por exemplo:
public class MyClass { }

A palavra public indica que a classe pode ser acessada de qualquer outro cdigo. Para obter alternativas, consulte Atributos de espao para nomes de controle de acesso na pgina 96.
3 Digite uma instruo package para indicar o nome do pacote no qual sua classe se encontrar. A sintaxe a palavra
package, seguida do nome completo do pacote e das chaves (que envolvero o bloco da instruo class). Por exemplo, o cdigo na etapa anterior seria alterado da seguinte forma: package mypackage { public class MyClass { } }

PROGRAMAO DO ACTIONSCRIPT 3.0 30


Introduo do ActionScript

4 Defina cada propriedade na classe usando a instruo var dentro do corpo da classe; a sintaxe a mesma usada

para declarar qualquer varivel (com a adio do modificador public). Por exemplo, a adio destas linhas entre as chaves de definio da classe criar propriedades chamadas textVariable, numericVariable e dateVariable:
public var textVariable:String = "some default value"; public var numericVariable:Number = 17; public var dateVariable:Date;

5 Defina cada mtodo na classe usando a mesma sintaxe usada para definir uma funo. Por exemplo:

Para criar um mtodo myMethod(), digite:


public function myMethod(param1:String, param2:Number):void { // do something with parameters }

Para criar um construtor (o mtodo especial que chamado como parte do processo de criar uma ocorrncia de
uma classe), crie um mtodo cujo nome corresponda exatamente ao nome da classe:
public function MyClass() { // do stuff to set initial values for properties // and otherwise set up the object textVariable = "Hello there!"; dateVariable = new Date(2001, 5, 11); }

Se voc no incluir um mtodo construtor na classe, o compilador criar automaticamente um construtor vazio (sem nenhum parmetro e nenhuma instruo) na sua classe. H mais alguns elementos de classe que voc pode definir, que so mais complexos.

Assessores so um cruzamento especial entre um mtodo e uma propriedade. Durante a escrita do cdigo para
definir a classe, voc escreve o assessor como um mtodo para poder executar vrias aes (em vez de apenas ler ou atribuir um valor, que tudo o que voc pode fazer ao definir uma propriedade). Entretanto, na criao de uma ocorrncia da classe, voc trata o assessor como uma propriedade, usando apenas o nome para ler ou atribuir o valor. Para obter mais informaes, consulte Mtodos de acessor get e set na pgina 103.

Os eventos no ActionScript no so definidos usando uma sintaxe especfica. Em vez disso, voc define eventos
na classe usando a funcionalidade da classe EventDispatcher para manter controle de ouvintes de evento e notific-los dos eventos. Para obter mais informaes sobre a criao de eventos nas suas prprias classes, consulteManipulao de eventos na pgina 251.

Exemplo: Criao de um aplicativo bsico


Voc pode criar arquivos de cdigo do ActionScript externo com uma extenso .as usando o Flash, Flex Builder, Dreamweaver ou qualquer editor de texto. O ActionScript 3.0 pode ser usado em diversos ambientes de desenvolvimento de aplicativo, incluindo as ferramentas de autoria do Flash e o Flex Builder. Esta seo apresenta as etapas de criao e de aprimoramento de um aplicativo ActionScript 3.0 simples usando a ferramenta de autoria do Flash ou o Flex Builder. O aplicativo que voc criar apresentar um padro simples para usar arquivos externos de classe do ActionScript 3.0 nos aplicativos Flash e Flex. Esse padro se aplicar a todos os outros aplicativos de exemplo deste manual.

PROGRAMAO DO ACTIONSCRIPT 3.0 31


Introduo do ActionScript

Criao do seu aplicativo do ActionScript


Voc deve ter uma idia do aplicativo que deseja ter antes de comear a cri-lo. A representao do seu design pode ser to simples quanto o nome do aplicativo e uma breve instruo de sua finalidade ou to complicado quanto um conjunto de documentos de requisitos contendo vrios diagramas UML (Unified Modeling Language). Este manual no discute a disciplina do design de software em detalhes, mas importante ter em mente que ele uma etapa essencial no desenvolvimento de aplicativos do ActionScript. Nosso primeiro exemplo de um aplicativo do ActionScript ser um aplicativo Hello World padro, pois seu design muito simples:

O aplicativo ser chamado de HelloWorld. Ele exibir um nico campo de texto contendo as palavras Hello World!. Para ser reutilizado facilmente, ele usar uma nica classe orientada a objetos, chamada Greeter, que pode ser usada
de dentro de um documento Flash ou um aplicativo do Flex.

Depois de criar uma verso bsica do aplicativo, voc adicionar uma nova funcionalidade que exija do usurio a
insero de um nome de usurio e faa o aplicativo verificar esse nome em relao ao uma lista de usurios conhecidos. Com essa definio concisa estabelecida, voc pode comear a criar o aplicativo em si.

Criao do projeto HelloWorld e da classe Greeter


A instruo do design para o aplicativo Hello World dizia que seu cdigo deve ser fcil de reutilizar. Com esse objetivo em mente, o aplicativo usa uma nica classe orientada a objetos, chamada Greeter, que usada de dentro de um aplicativo criado no Flex Builder ou na ferramenta de autoria do Flash. Para criar a classe Greeter na ferramenta de autoria do Flash: 1 Na ferramenta autoria do Flash, selecione Arquivo > Novo.
2 Na caixa de dilogo Novo documento, selecione o arquivo do ActionScript e clique em OK.

Uma nova janela de edio do ActionScript ser exibida.


3 Selecione Arquivo > Salvar. Selecione uma pasta para conter o aplicativo, chame o arquivo do ActionScript de

Greeter.as e clique em OK. Continue com Adio de cdigo classe Greeter na pgina 31.

Adio de cdigo classe Greeter


A classe Greeter define um objeto, Greeter, que poder ser usado no aplicativo HelloWorld. Para adicionar cdigo classe Greeter: 1 Digite o seguinte cdigo no novo arquivo:

PROGRAMAO DO ACTIONSCRIPT 3.0 32


Introduo do ActionScript

package { public class Greeter { public function sayHello():String { var greeting:String; greeting = "Hello World!"; return greeting; } } }

A classe Greeter inclui um nico mtodo sayHello() , que retorna uma seqncia de caracteres que diz Hello World!.
2 Clique em Arquivo > Salvar para salvar esse arquivo do ActionScript.

A classe Greeter agora est pronta para ser usada em um aplicativo.

Criao de um aplicativo que usa o cdigo do ActionScript


A classe Greeter que voc criou define um conjunto independente de funes de software, mas no representa um aplicativo completo. Para usar a classe, necessrio criar um documento do Flash ou aplicativo do Flex. O aplicativo HelloWorld cria uma nova ocorrncia da classe Greeter. Veja como anexar a classe Greeter ao seu aplicativo. Para criar um aplicativo do ActionScript usando a ferramenta de autoria do Flash: 1 Selecione Arquivo > Novo.
2 Na caixa de dilogo Novo documento, selecione Documento Flash e clique em OK.

Uma nova janela do Flash ser exibida.


3 Selecione Arquivo > Salvar. Selecione uma pasta que contenha o arquivo de classe Greeter.as, chame o documento

Flash de HelloWorld.fla e clique em OK.


4 Na paleta Ferramentas do Flash, selecione a ferramenta Texto e arraste at o Palco para definir um novo campo de

texto, com aproximadamente 300 pixels de largura e 100 de altura.


5 No painel Propriedades, com o campo de texto ainda selecionado no Palco, defina o tipo de texto como "Texto

dinmico" e digite mainText como o nome de ocorrncia do campo de texto.


6 Clique no primeiro quadro da linha de tempo principal. 7 No painel Aes, digite o seguinte script:
var myGreeter:Greeter = new Greeter(); mainText.text = myGreeter.sayHello();

8 Salve o arquivo.

Continue com Publicao e teste do aplicativo do ActionScript na pgina 33.

PROGRAMAO DO ACTIONSCRIPT 3.0 33


Introduo do ActionScript

Publicao e teste do aplicativo do ActionScript


O desenvolvimento de software um processo interativo. Voc escreve um cdigo, tenta compil-lo e o edita at obter uma compilao limpa. Depois, voc executa o aplicativo compilado, testa-o para ver se ele cumpre o design pretendido e, caso negativo, edita o cdigo novamente at que o faa. Os ambiente de desenvolvimento do Flash e do Flex Builder oferecem vrios meios de publicar, testar e depurar aplicativos. Veja as etapas bsicas para testar o aplicativo HelloWorld em cada ambiente. Para publicar e testar um aplicativo do ActionScript usando a ferramenta de autoria do Flash: 1 Publique seu aplicativo e observe se h erros de compilao. Na ferramenta de autoria do Flash, selecione Controlar > Testar filme para compilar o cdigo do ActionScript e executar o aplicativo HelloWorld.
2 Se forem exibidos erros ou avisos na janela Sada durante o teste do aplicativo, corrija as causas dos erros nos

arquivos HelloWorld.fla ou HelloWorld.as e tente testar o aplicativo novamente.


3 Se no houver nenhum erro de compilao, voc ver uma janela do Flash Player mostrando o aplicativo Hello

World. Voc acabou de criar um aplicativo orientado a objetos simples, mas completo, que usa o ActionScript 3.0. Continue com Aprimoramento do aplicativo HelloWorld na pgina 33.

Aprimoramento do aplicativo HelloWorld


Para tornar o aplicativo um pouco mais interessante, agora voc o far solicitar e validar um nome de usurio em relao a uma lista de nomes predefinida. Primeiro, voc atualizar a classe Greeter para adicionar nova funcionalidade. Depois, voc atualizar o aplicativo para usar a nova funcionalidade. Para atualizar o arquivo Greeter.as: 1 Abra o arquivo Greeter.as.
2 Altere o contedo do arquivo com o seguinte (as linhas novas e alteradas so mostradas em negrito):
package { public class Greeter { /** * Defines the names that should receive a proper greeting. */ public static var validNames:Array = ["Sammy", "Frank", "Dean"]; /** * Builds a greeting string using the given name. */ public function sayHello(userName:String = ""):String { var greeting:String; if (userName == "") { greeting = "Hello. Please type your user name, and then press the Enter key."; } else if (validName(userName)) {

PROGRAMAO DO ACTIONSCRIPT 3.0 34


Introduo do ActionScript

greeting = "Hello, " + userName + "."; } else { greeting = "Sorry " + userName + ", you are not on the list."; } return greeting; } /** * Checks whether a name is in the validNames list. */ public static function validName(inputName:String = ""):Boolean { if (validNames.indexOf(inputName) > -1) { return true; } else { return false; } } } }

A classe Greeter agora tem vrios novos recursos:

A matriz validNames lista os nomes de usurio vlidos. A matriz inicializada com uma lista de trs nomes quando
a classe Greeter carregada.

O mtodo sayHello() agora aceita um nome de usurio e altera a saudao com base em algumas condies. Se
userName for uma seqncia de caracteres vazia (""), a propriedade greeting ser definida para solicitar um nome ao usurio. Se o nome do usurio for vlido, a saudao se tornar "Hello, userName". Finalmente, se as duas condies no forem atendidas, a varivel greeting ser definida como "Sorry userName, you are not on the list".

O mtodo validName() retornar true se inputName for encontrado na matriz validNames e false se no for
encontrado. A instruo validNames.indexOf(inputName) verifica cada seqncia de caracteres na matriz validNames em relao seqncia de caracteres inputName. O mtodo Array.indexOf() retornar a posio de ndice da primeira ocorrncia de um objeto em uma matriz ou o valor -1 se o objeto no for encontrado nela. Em seguida, voc editar o arquivo Flash ou Flex que faz referncia a essa classe do ActionScript. Para modificar o aplicativo usando a ferramenta de autoria do Flash: 1 Abra o arquivo HelloWorld.fla.
2 Modifique o script no Quadro 1 para que uma seqncia de caracteres ("") seja transmitida ao mtodo sayHello()

da classe Greeter:
var myGreeter:Greeter = new Greeter(); mainText.text = myGreeter.sayHello("");

3 Selecione a ferramenta Texto na paleta Ferramentas e crie dois novos campos de texto no Palco, lado a lado e

diretamente sob o campo de texto mainText existente.


4 No primeiro campo de texto novo, digite o texto User Name: para servir de rtulo.

PROGRAMAO DO ACTIONSCRIPT 3.0 35


Introduo do ActionScript

5 No outro campo de texto novo, e no Inspetor de propriedades, selecione InputText como o tipo de campo de texto.

Selecione Linha nica como o Tipo de linha. Digite textIn como o nome de ocorrncia.
6 Clique no primeiro quadro da linha de tempo principal. 7 No painel Aes, adicione as seguintes linhas no final do script existente:
mainText.border = true; textIn.border = true; textIn.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed); function keyPressed(event:KeyboardEvent):void { if (event.keyCode == Keyboard.ENTER) { mainText.text = myGreeter.sayHello(textIn.text); } }

O novo cdigo adiciona a seguinte funcionalidade:

As primeiras duas linhas simplesmente definem bordas para os dois campos de texto. Um campo de texto de entrada, como o campo textIn, possui um conjunto de eventos que ele pode despachar.
O mtodo addEventListener() permite definir uma funo que executada quando um tipo de evento ocorre. Neste caso, o evento o pressionamento de uma tecla no teclado.

A funo personalizada keyPressed() verifica se a tecla que foi pressionada a tecla Enter. Caso afirmativo,
ela chama o mtodo sayHello() do objeto myGreeter , transmitindo o texto do campo de texto textIn como um parmetro. Esse mtodo retorna uma seqncia de caracteres de saudao com base no valor transmitido. A seqncia de caracteres retornada atribuda propriedade text do campo de texto mainText. O script completo para o Quadro 1 o seguinte:
var myGreeter:Greeter = new Greeter(); mainText.text = myGreeter.sayHello(""); mainText.border = true; textIn.border = true; textIn.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed); function keyPressed(event:KeyboardEvent):void { if (event.keyCode == Keyboard.ENTER) { mainText.text = myGreeter.sayHello(textIn.text); } }

8 Salve o arquivo. 9 Selecione Controlar > Testar filme para executar o aplicativo.

Durante a execuo do aplicativo, voc ser solicitado a inserir um nome de usurio. Se for vlido (Sammy, Frank ou Dean), o aplicativo exibir a mensagem de confirmao "hello".

PROGRAMAO DO ACTIONSCRIPT 3.0 36


Introduo do ActionScript

Execuo de exemplos subseqentes


Agora que desenvolveu e executou o aplicativo "Hello World" do ActionScript 3.0, voc tem o conhecimento bsico necessrio para executar os outros exemplos de cdigo apresentados neste manual.

Teste de listagens de cdigo de exemplo dos captulos


Durante a leitura deste manual, talvez voc queira testar as listagens de cdigo de exemplo usadas para ilustrar os diversos tpicos. Esse teste pode envolver a exibio do valor de variveis em determinados pontos no programa ou a exibio ou interao com o contedo na tela. Para testar o contedo ou a interao visual, os elementos necessrios sero descritos antes ou dentro da listagem de cdigo (bastar apenas criar um documento com os elementos conforme descrito para testar o cdigo). Caso voc queira exibir o valor de uma varivel em um determinado ponto no programa, h algumas formas de fazer isso. Uma delas usar um depurador, como aqueles criados no Flex Builder e no Flash. Para um teste simples, porm, pode ser mais fcil apenas imprimir os valores de varivel em um local que permita exibi-los. As etapas a seguir o ajudaro a criar um documento Flash que voc pode usar para testar uma listagem de cdigo e exibir valores de varivel: Para criar um documento Flash para testar os exemplos dos captulos: 1 Crie um novo documento Flash e salve-o no seu disco rgido.
2 Para exibir os valores de teste em um campo de texto no Palco, ative a ferramenta Texto e crie um novo campo

Texto dinmico no Palco. Um campo de texto largo e alto, com o Tipo de linha definido como Multilinha e a borda ativada ser muito til. No Inspetor de propriedades, atribua um nome de ocorrncia ao campo de texto (por exemplo, "outputText"). Para escrever os valores no campo de texto, voc adicionar um cdigo que chama o mtodo appendText() ao cdigo de exemplo (descrito abaixo).
3 Se preferir, voc pode adicionar uma chamada de funo trace() listagem de cdigo (conforme descrito abaixo)

para exibir os resultados do exemplo.


4 Para testar um determinado exemplo, copie a listagem de cdigo para o painel Aes; se necessrio, adicione uma

chamada de funo ou um valor trace() ao campo de texto usando seu mtodo appendText().
5 Do menu principal, escolha Controlar > Testar filme para criar um arquivo SWF e exibir os resultados.

Como esta abordagem para exibir os valores de variveis, h duas formas de fazer isso facilmente ao testar os exemplos: escrever os valores em uma ocorrncia de campo de texto no Palco ou usar a funo trace() para imprimir os valores no painel Sada.

A funo trace(): a funo trace() do ActionScript escreve os valores de qualquer parmetro transmitido
(variveis ou expresses literais) no painel Sada. Muitas listagens de exemplo deste manual j incluem uma chamada de funo trace(), por isso, para essas listagens, basta copiar o cdigo para o documento e testar o projeto. Se quiser usar trace() para testar o valor de uma varivel em uma listagem de cdigo que no a inclua, apenas adicione uma chamada trace() listagem de cdigo, transmitindo a varivel como um parmetro. Por exemplo, se voc encontrar uma listagem de cdigo como esta no captulo,
var albumName:String = "Three for the money";

dever copiar o cdigo no painel Aes e adicionar uma chamada funo trace() como esta para testar o resultado da listagem de cdigo:
var albumName:String = "Three for the money"; trace("albumName =", albumName);

Durante a execuo do programa, esta linha ser impressa:

PROGRAMAO DO ACTIONSCRIPT 3.0 37


Introduo do ActionScript

albumName = Three for the money

Cada chamada de funo trace() pode usar vrios parmetros, que so reunidos em uma string como uma nica linha impressa. Uma quebra de linha adicionada ao final de cada chamada de funo trace(), de forma que chamadas trace() separadas so impressas em linhas separadas.

Um campo de texto no Palco: se preferir no usar a funo trace(), voc pode adicionar um campo Texto
dinmico ao Palco usando a Ferramenta texto e escrever os valores nesse campo de texto para exibir os resultados de uma listagem de cdigo. O mtodo appendText() da classe TextField pode ser usado para adicionar um valor String ao final do contedo do campo de texto. Para acessar o campo de texto usando o ActionScript, atribua-lhe um nome de ocorrncia no Inspetor de propriedades. Por exemplo, se o seu campo de texto tiver o nome de ocorrncia outputText, o seguinte cdigo poder ser usado para verificar o valor da varivel albumName:
var albumName:String = "Three for the money"; outputText.appendText("albumName = "); outputText.appendText(albumName);

Esse cdigo deve escrever o seguinte texto no campo de texto chamado outputText:
albumName = Three for the money

Como mostra o exemplo, o mtodo appendText() adicionar o texto mesma linha que o contedo anterior; portanto, diversos valores podem ser adicionados mesma linha de texto usando vrias chamadas appendText(). Para forar o texto para a linha seguinte, voc pode anexar um caractere de nova linha ("\n"):
outputText.appendText("\n"); // adds a line break to the text field

Diferentemente da funo trace(), o mtodo appendText() aceita apenas um valor como parmetro. Esse valor deve ser uma seqncia de caracteres (uma ocorrncia de String ou um literal de seqncia de caracteres). Para imprimir o valor de uma varivel que no seja uma seqncia de caracteres, primeiro necessrio converter o valor em uma String. A maneira mais fcil de fazer isso chamar o mtodo toString() do objeto:
var albumYear:int = 1999; outputText.appendText("albumYear = "); outputText.appendText(albumYear.toString());

Teste dos exemplos do fim do captulo


Como este, a maioria dos captulos deste manual inclui um exemplo de fim de captulo significativo relacionado aos diversos conceitos discutidos. Entretanto, diferentemente do exemplo Hello World deste captulo, esses exemplos no sero apresentados em um formato de tutorial passo a passo. O cdigo relevante do ActionScript 3.0 em cada exemplo ser destacado e discutido, mas as instrues sobre a execuo dos exemplos em ambientes de desenvolvimento especficos no sero fornecidas. Os arquivos de exemplo distribudos com este manual, contudo, incluiro todos os arquivos necessrios para compilar e executar os exemplos facilmente no ambiente de desenvolvimento de sua escolha.

38

Captulo 4: Linguagem e sintaxe do ActionScript


O ActionScript 3.0 consiste na linguagem central do ActionScript e na API (Application Programming Interface) do Adobe Flash Player. A linguagem principal a parte do ActionScript que define a sintaxe da linguagem, assim como os tipos de dados de nvel superior. O ActionScript 3.0 oferece acesso programtico ao Flash Player. Este captulo apresenta uma breve instruo linguagem e sintaxe centrais do ActionScript. Depois de l-lo, voc ter uma noo bsica de como trabalhar com tipos de dados e variveis, como usar a sintaxe apropriada e como controlar o fluxo de dados no seu programa.

Viso geral da linguagem


Os objetos so a base da linguagem do ActionScript 3.0, seus os blocos de construo fundamentais. Cada varivel declarada, cada funo escrita e cada ocorrncia de classe criada um objeto. Pense em um programa do ActionScript 3.0 como um grupo de objetos que realizam tarefas, respondem a eventos e se comunicam. Os programadores acostumados OOP (Programao orientada a objetos) em Java ou C++ podem pensar nos objetos como mdulos que contm dois tipos de membros: dados armazenados em variveis ou propriedades de membros e comportamento acessvel por meio de mtodos. O ActionScript 3.0 define objetos de modo similar, com pequenas particularidades. No ActionScript 3.0, os objetos so apenas conjuntos de propriedades. Essas propriedades so contineres que podem manter no apenas dados, mas tambm funes ou outros objetos. Se uma funo for anexada a um objeto dessa forma, ela ser chamada de mtodo. Embora a definio do ActionScript 3.0 possa parecer um pouco estranha aos programadores com experincia em Java ou C++, na prtica, a definio dos tipos de objeto com classes do ActionScript 3.0 bastante semelhante forma como as classes so definidas em Java ou C++. A distino entre as duas definies de objeto importante ao discutir o modelo de objeto do ActionScript e outros tpicos avanados, mas, na maioria das situaes, o termo propriedades significa variveis de membro de classe, e no mtodos. A Referncia dos componentes e da linguagem do ActionScript 3.0, por exemplo, usa o termo propriedades para se referir a variveis ou propriedades getter-setter. Ela usa o termo mtodos para se referir s funes que fazem parte de uma classe. Uma diferena sutil entre as classes no ActionScript e as classes em Java ou C++ que, no ActionScript, as classes no so apenas entidades abstratas. As classes do ActionScript so representadas por objetos de classe que armazenam propriedades e mtodos da classe. Isso permite o uso de tcnicas que podem parecer estranhas aos programadores de Java e C++, como incluir instrues ou cdigo executvel no nvel superior de uma classe ou um pacote. Outra diferena entre as classes do ActionScript e as de Java ou C++ que toda classe do ActionScript tem o que chamamos de objeto deprottipo. Nas verses anteriores do ActionScript, os objetos de prottipo, vinculados em cadeias de prottipos, serviam coletivamente como a base de toda a hierarquia de herana de classes. No ActionScript 3.0, contudo, os objetos de prottipo desempenham um papel secundrio no sistema de herana. Apesar disso, eles podero ser teis como uma alternativa s propriedades e aos mtodos estticos se voc quiser compartilhar uma propriedade e seu valor com todas as ocorrncias de uma classe.

PROGRAMAO DO ACTIONSCRIPT 3.0 39


Linguagem e sintaxe do ActionScript

Anteriormente, os programadores de ActionScript avanados podiam manipular diretamente a cadeia de prottipos com elementos de linguagem embutidos especiais. Agora que essa linguagem fornece uma implementao mais madura de uma interface de programao baseada em classes, muitos desses elementos de linguagem especiais, como __proto__ e __resolve, no fazem mais parte da linguagem. Alm disso, as otimizaes do mecanismo de herana interno que fornece melhorias de desempenho significativas no Flash Player e no Adobe AIR impedem o acesso direto ao mecanismo de herana.

Objetos e classes
No ActionScript 3.0, cada objeto definido por uma classe. Uma classe pode ser entendida como um modelo ou uma cpia de um tipo de objeto. As definies de classe podem incluir variveis e constantes, que mantm valores de dados, e mtodos, que so funes de encapsulamento de comportamento vinculadas classe. Os valores armazenados em propriedades podem ser valores primitivos ou outros objetos. Os valores primitivos so nmeros, seqncias de caracteres ou valores booleanos. O ActionScript contm diversas classes embutidas que fazem parte da linguagem central. Algumas delas, como Number, Boolean e String, representam os valores primitivos disponveis no ActionScript. Outras classes, como Array, Math e XML, definem objetos mais complexos. Todas as classes, incorporadas ou definidas pelo usurio, derivam da classe Object. Para os programadores com experincia no ActionScript, importante observar que o tipo de dados Object no mais o tipo de dados padro, muito embora todas as outras classes ainda derivem dessa. No ActionScript 2.0, as duas linhas de cdigo a seguir eram equivalentes porque a falta de uma anotao de tipo significava que uma varivel seria do tipo Object:
var someObj:Object; var someObj;

O ActionScript 3.0, porm, apresenta o conceito de variveis sem tipo, que podem ser designadas destas duas formas:
var someObj:*; var someObj;

Uma varivel sem tipo no igual a uma varivel do tipo Object. A principal diferena que as variveis sem tipo podem manter o valor especial undefined, enquanto que uma varivel do tipo Object no pode. Voc pode definir suas prprias classes usando a palavra-chave class. As propriedades de classe podem ser declaradas de trs formas: as constantes podem ser definidas com a palavra-chave const, as variveis so definidas com a palavrachave var e as propriedades getter e setter so definidas usando os atributos get e set em uma declarao de mtodo. Os mtodos podem ser declarados com a palavra-chave function. Uma ocorrncia de uma classe criada usando o operador new. O exemplo a seguir cria uma ocorrncia da classe Date chamada myBirthday.
var myBirthday:Date = new Date();

Pacotes e espaos para nomes


Os pacotes e espaos para nomes so conceitos relacionados. Os pacotes permitem compactar definies de classe juntas de uma forma que facilita o compartilhamento de dados e minimiza conflitos de nome. Os espaos para nomes permitem controlar a visibilidade de identificadores, como nomes de propriedades e mtodos, e podem ser aplicados ao cdigo quer ele resida dentro ou fora de um pacote. Os pacotes permitem organizar os arquivos de classe, e os espaos para nomes permitem gerenciar a visibilidade de propriedades e mtodos individuais.

PROGRAMAO DO ACTIONSCRIPT 3.0 40


Linguagem e sintaxe do ActionScript

Pacotes
Os pacotes no ActionScript 3.0 so implementados com espaos para nomes, mas eles no so sinnimos. Ao declarar um pacote, voc cria implicitamente um tipo especial de espao para nomes que ser conhecido em tempo de compilao. Os espaos para nomes, quando criados explicitamente, no so necessariamente conhecidos em tempo de compilao. O seguinte exemplo usa a diretiva package para criar um pacote simples contendo uma classe:
package samples { public class SampleCode { public var sampleGreeting:String; public function sampleFunction() { trace(sampleGreeting + " from sampleFunction()"); } } }

O nome da classe neste exemplo SampleCode. Como a classe est dentro do pacote de amostras, o compilador automaticamente qualifica o nome da classe em tempo de compilao em seu nome totalmente qualificado: samples.SampleCode. O compilador tambm qualifica os nomes de quaisquer propriedades e mtodos, para que sampleGreeting e sampleFunction() se tornem samples.SampleCode.sampleGreeting e samples.SampleCode.sampleFunction(), respectivamente. Muitos desenvolvedores, especialmente aqueles com experincia em programao Java, podem optar por colocar apenas classes no nvel superior de um pacote. O ActionScript 3.0, no entanto, oferece suporte no apenas a classes no nvel superior de um pacote, mas tambm a variveis, funes e at mesmo instrues. Uma utilizao avanada desse recurso definir um espao para nomes no nvel superior de um pacote de forma que fique disponvel para todas as classes desse pacote. Observe, porm, que somente dois especificadores de acesso, public e internal, so permitidos no nvel superior de um pacote. Diferentemente de Java, que permite declarar classes aninhadas como particulares, o ActionScript 3.0 no oferece suporte a classes aninhadas nem a particulares. Entretanto, de muitas outras formas, os pacotes do ActionScript 3.0 so semelhantes aos pacotes na linguagem de programao Java. Como voc pode ver no exemplo anterior, as referncias aos pacotes totalmente qualificados so expressas usando o operador dot (.), da mesma forma que em Java. Voc pode usar pacotes para organizar seu cdigo em uma estrutura hierrquica intuitiva para ser usada por outros programadores. Isso facilita o compartilhamento de cdigo, permitindo criar seu prprio pacote para compartilhar com outros e usar pacotes criados por outros em seu cdigo. O uso de pacotes tambm ajuda a garantir que os nomes de identificador usados sejam exclusivos e no entrem em conflito com outros. Na verdade, alguns acham que essa a maior vantagem dos pacotes. Por exemplo, dois programadores que desejam compartilhar cdigo entre si criam uma classe chamada SampleCode. Sem pacotes, ela cria um conflito de nome e a nica soluo seria renomear uma das classes. Com pacotes, porm, o conflito de nomes facilmente evitado colocando uma classe, ou de preferncia as duas, em pacotes com nomes exclusivos. Tambm possvel incluir pontos incorporados no nome do pacote para criar pacotes aninhados. Isso permite criar uma organizao hierrquica de pacotes. Um bom exemplo disso o pacote flash.xml fornecido pelo ActionScript 3.0. O pacote flash.xml aninhado dentro do pacote flash. O pacote flash.xml contm o analisador XML herdado que era usado em verses anteriores do ActionScript. Um dos motivos para que agora ele resida no pacote flash.xml que o nome da classe XML herdada entra em conflito com o nome da nova classe XML que implementa a funcionalidade XML da especificao ECMAScript (E4X) disponvel no ActionScript 3.0.

PROGRAMAO DO ACTIONSCRIPT 3.0 41


Linguagem e sintaxe do ActionScript

Embora o ato de mover a classe XML herdada para um pacote seja uma boa medida inicial, a maioria dos usurios das classes XML herdadas importa o pacote flash.xml, o que ir gerar o conflito de nomes a menos que voc se lembre de sempre usar o nome totalmente qualificado da classe XML herdada (flash.xml.XML). Para evitar essa situao, a classe XML herdada agora se chama XMLDocument, como mostra o seguinte exemplo:
package flash.xml { class XMLDocument {} class XMLNode {} class XMLSocket {} }

Grande parte do ActionScript 3.0 organizado com base no pacote flash. Por exemplo, o pacote flash.display contm a API de lista de exibio, e o pacote flash.events contm o novo modelo de eventos.

Criao de pacotes
O ActionScript 3.0 fornece uma flexibilidade significativa na forma de organizar pacotes, classes e arquivos de origem. As verses anteriores do ActionScript permitiam somente uma classe por arquivo de origem e exigiam que o nome do arquivo de origem correspondesse ao nome da classe. O ActionScript 3.0 permite incluir diversas classes em um nico arquivo de origem, mas somente uma classe em cada arquivo pode ser disponibilizada para um cdigo externo ao arquivo. Em outras palavras, somente uma classe em cada arquivo pode ser declarada dentro de uma declarao de pacote. As classes adicionais devem ser declaradas fora da definio do pacote, o que torna as classes invisveis ao cdigo fora do arquivo de origem. O nome da classe declarada dentro da definio do pacote deve corresponder ao nome do arquivo de origem. O ActionScript 3.0 tambm oferece mais flexibilidade na forma de declarar pacotes. Nas verses anteriores do ActionScript, os pacotes simplesmente representavam diretrios nos quais os arquivos de origem eram colocados e os pacotes no eram declarados com a instruo package, mas incluam o nome do pacote como parte do nome da classe totalmente qualificada na sua declarao de classe. Embora ainda representem diretrios no ActionScript 3.0, os pacotes podem conter mais do que apenas classes. No ActionScript 3.0, a instruo package usada para declarar um pacote, o que significa que voc tambm pode declarar variveis, funes e espaos para nomes no nvel superior de um pacote. possvel at incluir instrues executveis no nvel superior de um pacote. Se voc declarar variveis, funes ou espaos para nomes no nvel superior de um pacote, os nicos atributos disponveis nesse nvel sero public e internal, e somente uma declarao de nvel de pacote por arquivo poder usar o atributo public, quer a declarao seja uma classe, varivel, funo ou um espao para nomes. Os pacotes so teis para organizar o cdigo e evitar conflitos de nome. No confunda o conceito de pacotes com o conceito no relacionado de herana de classe. Duas classes que residem no mesmo pacote tm um espao para nomes em comum, mas no esto necessariamente relacionadas de outra forma. Da mesma forma, um pacote aninhado pode no ter nenhuma relao semntica com o pacote pai.

importao de pacotes
Para usar uma classe que est dentro de um pacote, voc deve importar o pacote ou a classe especfica. Isso difere do ActionScript 2.0, em que a importao de classes era opcional. Por exemplo, considere o exemplo de classe SampleCode apresentado anteriormente neste captulo. Se a classe residir em um pacote chamado sample, voc dever usar uma das seguintes instrues de importao usando a classe SampleCode:
import samples.*;

ou

PROGRAMAO DO ACTIONSCRIPT 3.0 42


Linguagem e sintaxe do ActionScript

import samples.SampleCode;

Em geral, as instrues import devem ser to especficas quanto possvel. Se voc pretende usar apenas a classe SampleCode do pacote samples, dever importar somente a classe SampleCode e no o pacote inteiro ao qual ela pertence. A importao de pacotes inteiros pode gerar conflitos de nome inesperados. Voc tambm deve colocar o cdigo-fonte que define o pacote ou a classe no caminho de classe. O caminho de classe uma lista definida pelo usurio de caminhos de diretrio locais que determina onde o compilador pesquisar as classes e os pacotes importados. O caminho de classe, s vezes, chamado de caminho de criao ou caminho de origem. Depois de importar adequadamente a classe ou o pacote, voc pode usar o nome totalmente qualificado da classe (samples.SampleCode) ou apenas o nome da classe em si (SampleCode). Os nomes totalmente qualificados so teis quando classes, mtodos ou propriedades com nomes idnticos geram cdigo ambguo, mas podem ser difceis de gerenciar se usados para todos os identificadores. Por exemplo, o uso do nome totalmente qualificado gera um cdigo detalhado ao instanciar uma ocorrncia da classe SampleCode:
var mySample:samples.SampleCode = new samples.SampleCode();

Conforme os nveis de pacotes aninhados crescem, a legibilidade do cdigo diminui. Nas situaes em que certamente no haver identificadores ambguos, voc pode tornar seu cdigo mais fcil de ler usando identificadores simples. Por exemplo, a instanciao de uma nova ocorrncia da classe SampleCode ser bem menos detalhada se voc usar somente o identificador de classe:
var mySample:SampleCode = new SampleCode();

Se voc tentar usar os nomes de identificador sem primeiro importar o pacote ou a classe apropriados, o compilador no conseguir encontrar as definies de classe. Entretanto, se voc importar um pacote ou uma classe, qualquer tentativa de definir um nome que entre em conflito com um nome importado ir gerar um erro. Durante a criao de um pacote, o especificador de acesso padro para todos os seus membros internal, o que significa que, por padro, os membros do pacote so visveis apenas por outros membros do mesmo pacote. Para que uma classe fique disponvel para o cdigo fora do pacote, necessrio declar-la como public. Por exemplo, o seguinte pacote contm duas classes, SampleCode e CodeFormatter:
// SampleCode.as file package samples { public class SampleCode {} } // CodeFormatter.as file package samples { class CodeFormatter {} }

A classe SampleCode visvel fora do pacote porque declarada como uma classe public. A classe CodeFormatter, porm, visvel somente dentro do prprio pacote de amostras. Se voc tentar acessar a classe CodeFormatter fora do pacote de amostras, ir gerar um erro, como mostra o exemplo a seguir:
import samples.SampleCode; import samples.CodeFormatter; var mySample:SampleCode = new SampleCode(); // okay, public class var myFormatter:CodeFormatter = new CodeFormatter(); // error

Para que as duas classes fiquem disponveis fora do pacote, necessrio declar-las como public. Voc no pode aplicar o atributo public declarao do pacote.

PROGRAMAO DO ACTIONSCRIPT 3.0 43


Linguagem e sintaxe do ActionScript

Os nomes totalmente qualificados so teis para resolver conflitos de nome que podem ocorrer durante o uso de pacotes. Esse cenrio pode surgir na importao de dois pacotes que definem classes com o mesmo identificador. Por exemplo, considere o seguinte pacote, que tambm tem uma classe chamada SampleCode:
package langref.samples { public class SampleCode {} }

Se voc importar as duas classes, como a seguir, ter um conflito de nomes ao fazer referncia classe SampleCode:
import samples.SampleCode; import langref.samples.SampleCode; var mySample:SampleCode = new SampleCode(); // name conflict

O compilador no tem como saber qual classe SampleCode deve usar. Para resolver o conflito, voc deve usar o nome totalmente qualificado de cada classe, como a seguir:
var sample1:samples.SampleCode = new samples.SampleCode(); var sample2:langref.samples.SampleCode = new langref.samples.SampleCode();

Nota: Os programadores com experincia em C++ costumam confundir a instruo importcom #include. A diretiva #include necessria em C++ porque os compiladores de C++ processam um arquivo por vez e no pesquisam definies de classes em outros arquivos a menos que um arquivo de cabealho seja includo explicitamente. O ActionScript 3.0 tem uma diretiva include, mas no foi criado para importar classes e pacotes. Para importar classes ou pacotes no ActionScript 3.0, necessrio usar a instruo import e colocar o arquivo de origem que contm o pacote no caminho da classe.

Espaos para nomes


Os espaos para nomes fornecem controle sobre a visibilidade das propriedades e dos mtodos criados. Pense nos especificadores de controle de acesso public, private, protected e internal como espaos para nomes embutidos. Se esses especificadores de controle de acesso predefinidos no atenderem s suas necessidades, voc poder definir seus prprios espaos para nomes. Se voc est familiarizado com espaos para nomes XML, boa parte desta discusso no ser novidade, embora a sintaxe e os detalhes da implementao do ActionScript sejam ligeiramente diferentes do XML. Se nunca trabalhou com espaos para nomes antes, o conceito em si simples, mas a implementao tem uma terminologia especfica que voc dever aprender. Para entender como os espaos para nomes funcionam, bom saber que o nome de uma propriedade ou mtodo sempre contm duas partes: um identificador e um espao para nomes. O identificador o que normalmente entendemos como um nome. Por exemplo, os identificadores na seguinte definio de classe so sampleGreeting e sampleFunction():
class SampleCode { var sampleGreeting:String; function sampleFunction () { trace(sampleGreeting + " from sampleFunction()"); } }

PROGRAMAO DO ACTIONSCRIPT 3.0 44


Linguagem e sintaxe do ActionScript

Sempre que as definies no forem precedidas por um atributo de espao para nomes, seus nomes sero qualificados pelo espao para nomes internal padro, o que significa que ficam visveis apenas para os chamadores no mesmo pacote. Se o compilador estiver definido no modo estrito, o compilador emitir um aviso de que o espao para nomes internal se aplica a qualquer identificador sem um atributo de espao para nomes. Para garantir que um identificador fique disponvel em todo lugar, necessrio que seu nome especificamente seja precedido pelo atributo public. No cdigo anterior, sampleGreeting e sampleFunction() tm um valor de espao para nomes internal. H trs etapas bsicas que devem ser seguidas ao usar espaos para nomes: Primeiro, defina o espao para nomes usando a palavra-chave namespace. Por exemplo, o cdigo a seguir define o espao para nomes version1:
namespace version1;

Em segundo lugar, voc deve aplicar o espao para nomes usando-o no lugar de um especificador de controle de acesso em uma declarao de propriedade ou mtodo. O exemplo a seguir coloca uma funo chamada myFunction() no espao para nomes version1:
version1 function myFunction() {}

Por ltimo, depois de aplicar o espao para nomes, voc pode fazer referncia a ele com a diretiva use ou qualificando o nome de um identificador com um espao para nomes. O exemplo a seguir faz referncia funo myFunction() por meio da diretiva use:
use namespace version1; myFunction();

Tambm possvel usar um nome qualificado para fazer referncia funo myFunction(), como mostra o exemplo a seguir:
version1::myFunction();

Definio de espaos para nomes Os espaos para nomes contm um valor, o URI (Localizador uniforme de recursos), que s vezes chamado de nome do espao para nomes. Um URI permite garantir que a definio do espao para nomes seja exclusiva. Voc cria um espao para nomes declarando uma definio para ele de duas formas. Voc pode definir um espao para nomes com um URI explcito, assim como definiria um espao para nomes XML, ou pode omitir o URI. O exemplo a seguir mostra como um espao para nomes pode ser definido usando um URI:
namespace flash_proxy = "http://www.adobe.com/flash/proxy";

O URI funciona como uma seqncia de caracteres de identificao exclusiva para o espao para nomes. Se voc omitir o URI, como no exemplo a seguir, o compilador criar uma seqncia de caracteres de identificao interna exclusiva no lugar do URI. Voc no possui acesso a essa seqncia de caracteres de identificao interna.
namespace flash_proxy;

Depois de definido, com ou sem um URI, o espao para nomes no poder ser redefinido no mesmo escopo. A tentativa de definir um espao para nomes definido anteriormente no mesmo escopo ir gerar um erro de compilao. Se for definido dentro de um pacote ou uma classe, talvez o espao para nomes no fique visvel para o cdigo fora do pacote ou da classe, a menos que seja usado o especificador de controle de acesso apropriado. Por exemplo, o seguinte cdigo mostra o espao para nomes flash_proxy definido com o pacote flash.utils. No exemplo a seguir, a falta de um especificador de controle de acesso significa que o espao para nomes flash_proxy deve ser visvel apenas para o cdigo dentro do pacote flash.utils e no para qualquer outro cdigo fora do pacote:
package flash.utils { namespace flash_proxy; }

PROGRAMAO DO ACTIONSCRIPT 3.0 45


Linguagem e sintaxe do ActionScript

O cdigo a seguir usa o atributo public para tornar o espao para nomes flash_proxy visvel para o cdigo fora do pacote:
package flash.utils { public namespace flash_proxy; }

Aplicao de espaos para nomes Aplicar um espao para nomes significa colocar uma definio em um espao para nomes. As definies que podem ser colocadas em espaos para nomes incluem funes, variveis e constantes (no possvel colocar uma classe em um espao para nomes personalizado). Considere, por exemplo, uma funo declarada usando o espao para nomes de controle de acesso public. O uso do atributo public em uma definio de funo coloca a funo no espao para nomes pblico, tornando-a disponvel para todo o cdigo. Depois de definir um espao para nomes, voc pode us-lo da mesma forma que usa o atributo public, e a definio ficar disponvel para o cdigo que pode referenciar o seu espao para nomes personalizado. Por exemplo, se voc definir um espao para nomes example1, poder adicionar um mtodo chamado myFunction() usando example1 como um atributo, como mostra este exemplo:
namespace example1; class someClass { example1 myFunction() {} }

A declarao do mtodo myFunction() usando o espao para nomes example1 como um atributo significa que o mtodo pertence ao espao para nomes example1. Tenha em mente o seguinte durante a aplicao de espaos para nomes:

Voc s pode aplicar um espao para nomes por declarao. No h como aplicar um atributo de espao para nomes a mais de uma definio por vez. Em outras palavras, se
voc quiser aplicar seu espao para nomes a dez funes diferentes, dever adicion-lo como um atributo a cada uma das dez definies de funo.

Se aplicar um espao para nomes, tambm no ser possvel definir um especificador de controle de acesso porque
espaos para nomes e especificadores de acesso so mutuamente exclusivos. Ou seja, no possvel declarar uma funo ou propriedade como public, private, protected ou internal e aplicar o espao para nomes. Referncia a espaos para nomes No necessrio fazer referncia a um espao para nomes explicitamente durante o uso de um mtodo ou uma propriedade declarados com qualquer um dos espaos para nomes de controle de acesso, como public, private, protected e internal. Isso porque o acesso a esses espaos para nomes especiais controlado por contexto. Por exemplo, as definies colocadas no espao para nomes private ficam disponveis automaticamente para o cdigo dentro da mesma classe. Para os espaos para nomes que voc definir, porm, essa diferenciao de contexto no existe. Para usar um mtodo ou uma propriedade colocados em um espao para nomes personalizado, necessrio fazer referncia ao espao para nomes. Voc pode fazer referncia a espaos para nomes com a diretiva use namespace ou pode qualificar o nome com o espao para nomes usando o pontuador do qualificador de nome (::). A referncia a um espao para nomes com a diretiva use namespace "abre" o espao para nomes, para que ele possa ser aplicado a quaisquer identificadores no qualificados. Por exemplo, se definir o espao para nomes example1, voc poder acessar seus nomes usando use namespace example1:

PROGRAMAO DO ACTIONSCRIPT 3.0 46


Linguagem e sintaxe do ActionScript

use namespace example1; myFunction();

possvel abrir mais de um espao para nomes por vez. Quando aberto com use namespace, o espao para nomes permanece aberto em todo o bloco de cdigo no qual se encontra. No h como fechar explicitamente um espao para nomes. O uso de mais de um espao para nomes, contudo, aumenta a probabilidade de conflitos de nome. Se preferir no abrir um espao para nomes, voc poder evitar a diretiva use namespace qualificando o nome do mtodo ou da propriedade com o espao para nomes e o pontuador do qualificador de nome. Por exemplo, o seguinte cdigo mostra como qualificar o nome myFunction() com o espao para nomes example1:
example1::myFunction();

Uso de espaos para nomes Um exemplo real de um espao para nomes usado para evitar conflitos de nome a classe flash.utils.Proxy que faz parte do ActionScript 3.0. A classe Proxy, que a substituio para a propriedade Object.__resolve do ActionScript 2.0, permite interceptar diferenas em propriedades ou mtodos no definidos antes da ocorrncia de um erro. Todos os mtodos da classe Proxy residem no espao para nomes flash_proxy para evitar conflitos de nome. Para entender melhor como o espao para nomes flash_proxy usado, preciso entender como usar a classe Proxy. A funcionalidade da classe Proxy est disponvel somente para suas classes herdadas. Em outras palavras, se quiser usar os mtodos da classe Proxy em um objeto, a definio de classe do objeto deve estender a classe Proxy. Por exemplo, para interceptar as tentativas de chamar um mtodo no definido, necessrio estender a classe Proxy e substituir seu mtodo callProperty(). Voc deve se lembrar de que a implementao de espaos para nomes, em geral, um processo de trs etapas: definir, aplicar e referenciar um espao para nomes. Como os mtodos da classe Proxy nunca so chamados explicitamente, o espao para nomes flash_proxy definido e aplicado, mas no referenciado. O ActionScript 3.0 define o espao para nomes flash_proxy e o aplica na classe Proxy. O cdigo precisa apenas aplicar o espao para nomes flash_proxy s classes que estendem a classe Proxy. O espao para nomes flash_proxy definido no pacote flash.utils de forma semelhante seguinte:
package flash.utils { public namespace flash_proxy; }

O espao para nomes aplicado aos mtodos da classe Proxy como mostrado no seguinte trecho dessa classe:
public class Proxy { flash_proxy function callProperty(name:*, ... rest):* flash_proxy function deleteProperty(name:*):Boolean ... }

Como mostra o cdigo a seguir, primeiro voc deve importar a classe Proxy e o espao para nomes flash_proxy. Depois, deve declarar sua classe de forma que estenda a classe Proxy (voc tambm deve adicionar o atributo dynamic se estiver compilando no modo estrito). Ao substituir o mtodo callProperty(), o espao para nomes flash_proxy deve ser usado.

PROGRAMAO DO ACTIONSCRIPT 3.0 47


Linguagem e sintaxe do ActionScript

package { import flash.utils.Proxy; import flash.utils.flash_proxy; dynamic class MyProxy extends Proxy { flash_proxy override function callProperty(name:*, ...rest):* { trace("method call intercepted: " + name); } } }

Se criar uma ocorrncia da classe MyProxy e chamar um mtodo no definido, tal como o mtodo testing() chamado no exemplo a seguir, seu objeto Proxy ir interceptar a chamada de mtodo e executar as instrues dentro do mtodo callProperty() (neste caso, uma instruo trace() simples).
var mySample:MyProxy = new MyProxy(); mySample.testing(); // method call intercepted: testing

H duas vantagens em ter os mtodos da classe Proxy dentro do espao para nomes flash_proxy. Primeiro, ter um espao para nomes separado reduz a desordem na interface pblica de qualquer classe que estende a classe Proxy. (H aproximadamente uma dzia de mtodos na classe Proxy que podem ser substitudos e nenhum foi criado para ser chamado diretamente. Coloc-los no espao para nomes pblico poderia gerar confuso.) Em segundo lugar, o uso do espao para nomes flash_proxy evita os conflitos de nome caso a subclasse Proxy contenha mtodos de ocorrncia com nomes que correspondem a qualquer mtodo da classe Proxy. Por exemplo, voc pode querer chamar um de seus mtodos de callProperty(). O cdigo a seguir aceitvel, porque sua verso do mtodo callProperty() est em um espao para nomes diferente:
dynamic class MyProxy extends Proxy { public function callProperty() {} flash_proxy override function callProperty(name:*, ...rest):* { trace("method call intercepted: " + name); } }

Os espaos para nomes tambm podem ser teis para fornecer acesso a mtodos ou propriedades de uma forma que no seria possvel com os quatro especificadores de controle de acesso (public, private, internal e protected). Por exemplo, voc pode ter alguns mtodos utilitrios espalhados em vrios pacotes. Voc quer disponibilizar esses mtodos para todos os pacotes, mas no quer que sejam pblicos. Para fazer isso, voc pode criar um novo espao para nomes e us-lo como seu prprio especificador de controle de acesso especial. O exemplo a seguir usa um espao para nomes definido pelo usurio para agrupar duas funes que residem em pacotes diferentes. Ao agrup-las no mesmo espao para nomes, voc pode tornar as duas funes visveis para uma classe ou um pacote por meio de uma nica instruo use namespace. Este exemplo usa quatro arquivos para demonstrar a tcnica. Todos os arquivos devem estar no caminho de classe. O primeiro deles, myInternal.as, usado para definir o espao para nomes myInternal. Como o arquivo est em um pacote chamado example, voc deve coloc-lo em uma pasta chamada example. O espao para nomes marcado como public para que possa ser importado para outros pacotes.

PROGRAMAO DO ACTIONSCRIPT 3.0 48


Linguagem e sintaxe do ActionScript

// myInternal.as in folder example package example { public namespace myInternal = "http://www.adobe.com/2006/actionscript/examples"; }

O segundo e terceiro arquivos, Utility.as e Helper.as, definem as classes que contm os mtodos que devem estar disponveis para outros pacotes. A classe Utility um pacote example.alpha, o que significa que o arquivo deve ser colocado dentro de uma pasta chamada alpha, que uma subpasta da pasta example. A classe Helper um pacote example.beta, o que significa que o arquivo deve ser colocado dentro de uma pasta chamada beta, que tambm uma subpasta da pasta example. Os dois pacotes, example.alpha e example.beta, devem importar o espao para nomes antes de us-lo.
// Utility.as in the example/alpha folder package example.alpha { import example.myInternal; public class Utility { private static var _taskCounter:int = 0; public static function someTask() { _taskCounter++; } myInternal static function get taskCounter():int { return _taskCounter; } } } // Helper.as in the example/beta folder package example.beta { import example.myInternal; public class Helper { private static var _timeStamp:Date; public static function someTask() { _timeStamp = new Date(); } myInternal static function get lastCalled():Date { return _timeStamp; } } }

PROGRAMAO DO ACTIONSCRIPT 3.0 49


Linguagem e sintaxe do ActionScript

O quarto arquivo, NamespaceUseCase.as, a classe de aplicativo principal e deve ser uma irm da pasta example. No Adobe Flash CS4 Professional, essa classe deveria ser usada como a classe de documento para o FLA. A classe NamespaceUseCase tambm importa o espao para nomes myInternal e o usa para chamar os dois mtodos estticos que residem nos outros pacotes. O exemplo usa mtodos estticos apenas para simplificar o cdigo. Os mtodos estticos e de ocorrncia podem ser colocados no espao para nomes myInternal.
// NamespaceUseCase.as package { import flash.display.MovieClip; import example.myInternal; // import namespace import example.alpha.Utility;// import Utility class import example.beta.Helper;// import Helper class public class NamespaceUseCase extends MovieClip { public function NamespaceUseCase() { use namespace myInternal; Utility.someTask(); Utility.someTask(); trace(Utility.taskCounter); // 2 Helper.someTask(); trace(Helper.lastCalled); // [time someTask() was last called] } } }

Variveis
As variveis permitem armazenar valores usados no programa. Para declarar uma varivel, voc deve usar a instruo var com o nome da varivel. No ActionScript 2.0, o uso da instruo var s necessrio se voc usar anotaes de tipo. No ActionScript 3.0, o uso da instruo var sempre necessrio. Por exemplo, a seguinte linha do ActionScript declara uma varivel chamada i:
var i;

Se omitir a instruo var ao declarar uma varivel, voc obter um erro de compilador no modo estrito e um erro de tempo de execuo no modo padro. Por exemplo, a seguinte linha de cdigo resultar em um erro se a varivel i no for definida antes:
i; // error if i was not previously defined

A associao de uma varivel a um tipo de dados deve ser feita durante a declarao da varivel. A declarao de uma varivel sem designar seu tipo legal, mas gera um aviso do compilador no modo estrito. Um tipo de varivel designado anexando o nome da varivel ao caractere dois-pontos (:) seguido do tipo da varivel. Por exemplo, o seguinte cdigo declara uma varivel i que do tipo int:
var i:int;

Voc atribui um valor varivel usando o operador de atribuio (=). Por exemplo, o seguinte cdigo declara uma varivel i e lhe atribui o valor 20:

PROGRAMAO DO ACTIONSCRIPT 3.0 50


Linguagem e sintaxe do ActionScript

var i:int; i = 20;

Pode ser mais conveniente atribuir um valor a uma varivel ao mesmo que em que ela declarada, como no exemplo a seguir:
var i:int = 20;

A tcnica de atribuir um valor a uma varivel no momento em que ela declarada comumente usado no apenas para atribuir valores primitivos, como inteiros e seqncias de caracteres, mas tambm para criar uma matriz ou instanciao de uma ocorrncia de uma classe. O exemplo a seguir mostra a declarao e a atribuio de um valor a uma matriz usando uma nica linha de cdigo:
var numArray:Array = ["zero", "one", "two"];

possvel criar uma ocorrncia de uma classe usando o operador new. O exemplo a seguir cria uma ocorrncia de uma classe chamada CustomClass e atribui uma referncia para a ocorrncia de classe recm-criada varivel chamada customItem:
var customItem:CustomClass = new CustomClass();

Se tiver mais de uma varivel a declarar, voc poder declar-las em uma nica linha de cdigo usando o operador vrgula (,) para separar as variveis. Por exemplo, o seguinte cdigo declara trs variveis em uma nica linha de cdigo:
var a:int, b:int, c:int;

Voc tambm pode atribuir valores a cada varivel na mesma linha de cdigo. Por exemplo, o seguinte cdigo declara trs variveis (a, b e c), e atribui um valor a cada uma:
var a:int = 10, b:int = 20, c:int = 30;

Embora voc possa usar o operador vrgula para agrupar declaraes de variveis em uma instruo, isso pode reduzir a legibilidade do cdigo.

Noes bsicas sobre o escopo de variveis


O escopo de uma varivel a rea do cdigo em que a varivel pode ser acessada por uma referncia lxica. Uma varivel global aquela definida em todas as reas do seu cdigo, enquanto que uma varivel local aquela definida apenas em uma parte dele. No ActionScript 3.0, s variveis sempre atribudo o escopo da funo ou classe em que elas so declaradas. Uma varivel global aquela especificada fora de qualquer definio de funo ou classe. Por exemplo, o seguinte cdigo cria uma varivel global i declarando-a fora de qualquer funo: O exemplo mostra que uma varivel global est disponvel tanto dentro quanto fora da definio da funo.
var strGlobal:String = "Global"; function scopeTest() { trace(strGlobal); // Global } scopeTest(); trace(strGlobal); // Global

A varivel local declarada dentro de uma definio de funo. A menor rea de cdigo para a qual possvel definir uma varivel local uma definio de funo. Uma varivel local declarada dentro de uma funo existir somente nessa funo. Por exemplo, se voc declarar uma varivel chamada str2 dentro de uma funo chamada localScope(), essa varivel no ficar disponvel fora da funo.

PROGRAMAO DO ACTIONSCRIPT 3.0 51


Linguagem e sintaxe do ActionScript

function localScope() { var strLocal:String = "local"; } localScope(); trace(strLocal); // error because strLocal is not defined globally

Se o nome de varivel usado para a varivel local j estiver declarado como uma varivel global, a definio local ocultar (ou obscurecer) a definio global enquanto a varivel local estiver no escopo. A varivel global ainda existir fora da funo. Por exemplo, o cdigo a seguir cria uma varivel de seqncia de caracteres global chamada str1 e uma varivel local de mesmo nome dentro da funo scopeTest(). A instruo trace dentro da funo gera o valor local da varivel, mas a instruo trace fora da funo gera o valor global da varivel.
var str1:String = "Global"; function scopeTest () { var str1:String = "Local"; trace(str1); // Local } scopeTest(); trace(str1); // Global

As variveis do ActionScript, diferentemente de C++ e Java, no possuem escopo em nvel de bloqueio. Um cdigo de bloqueio qualquer grupo de instrues entre uma chave de abertura ( { ) e uma de fechamento ( } ). Em algumas linguagens de programao, como C++ e Java, as variveis declaradas dentro de um bloco de cdigo no ficam disponveis fora dele. Essa restrio de escopo chamada de escopo em nvel de bloqueio e no existe no ActionScript. Se voc declarar uma varivel dentro de um bloco de cdigo, ela ficar disponvel no apenas nesse bloco, mas tambm em outras partes da funo qual o bloco pertence. Por exemplo, a seguinte funo contm variveis que so definidas em vrios escopos de bloco. Todas as variveis esto disponveis na funo.
function blockTest (testArray:Array) { var numElements:int = testArray.length; if (numElements > 0) { var elemStr:String = "Element #"; for (var i:int = 0; i < numElements; i++) { var valueStr:String = i + ": " + testArray[i]; trace(elemStr + valueStr); } trace(elemStr, valueStr, i); // all still defined } trace(elemStr, valueStr, i); // all defined if numElements > 0 } blockTest(["Earth", "Moon", "Sun"]);

Uma implicao interessante da falta de escopo em nvel de bloco que voc pode ler ou gravar em uma varivel antes que ela seja declarada, contanto que ela seja declarada antes que a funo termine. Isso possvel por causa de uma tcnica chamada iamento, que significa que o compilador move todas as declaraes de varivel para o incio da funo. Por exemplo, o cdigo a seguir compilado muito embora a funo inicial trace() para a varivel num ocorra antes que a varivel num seja declarada:
trace(num); // NaN var num:Number = 10; trace(num); // 10

PROGRAMAO DO ACTIONSCRIPT 3.0 52


Linguagem e sintaxe do ActionScript

O compilador, porm, no iar nenhuma instruo de atribuio. Isso explica por que o trace() inicial de num resulta em NaN (e no um nmero), que o valor padro para as variveis do tipo de dados Number. Isso significa que voc pode atribuir valores a variveis mesmo antes que elas sejam declaradas, como mostra o seguinte exemplo:
num = 5; trace(num); // 5 var num:Number = 10; trace(num); // 10

Valores padro
Um valor padro o valor que uma varivel contm antes que seu valor seja definido. Uma varivel inicializada quando seu valor definido pela primeira vez. Se voc declarar uma varivel, mas no definir seu valor, ela ser uma varivel no inicializada. O valor de uma varivel no inicializada depende de seu tipo de dados. A tabela a seguir descreve os valores padro de variveis, organizados por tipo de dados:
Tipo de dados Boolean int Number Object String uint No declarado (equivalente anotao de tipo *) Todas as outras classes, inclusive classes definidas pelo usurio. Valor padro
false

0
NaN null

null 0
undefined null

Para variveis do tipo Number, o valor padro NaN (e no um nmero), que um valor especial definido pelo padro IEEE-754 para indicar um valor que no representa um nmero. Se voc declarar uma varivel, mas no seu tipo de dados, o tipo de dados padro * ser aplicado, o que significa que, na verdade, a varivel sem tipo. Se voc tambm no inicializar uma varivel sem tipo com um valor, seu valor padro ser undefined. Para tipos de dados que no forem Boolean, Number, int e uint, o valor padro de qualquer varivel no inicializada ser null. Isso se aplica a todas as classes definidas pelo ActionScript 3.0, bem como a quaisquer classes personalizadas que voc criar. O valor null no um valor vlido para variveis do tipo Boolean, Number, int ou uint. Se voc tentar atribuir um valor null a esse tipo de varivel, o valor ser convertido no valor padro para esse tipo de dados. Para variveis do tipo Object, possvel atribuir um valor null. Se voc tentar atribuir um valor undefined a uma varivel do tipo Object, o valor ser convertido em null. Para variveis do tipo Number, existe uma funo especial de nvel superior chamada isNaN() que retorna o valor booleano true se a varivel no for um nmero e false se for.

PROGRAMAO DO ACTIONSCRIPT 3.0 53


Linguagem e sintaxe do ActionScript

Tipos de dados
Um tipo de dados define um conjunto de valores. Por exemplo, o tipo de dados Boolean o conjunto de exatamente dois valores: true e false. Alm do tipo de dados Boolean, o ActionScript 3.0 define vrios tipos de dados mais comumente usados, como String, Number e Array. Voc pode escolher seus prprios tipos de dados usando classes ou interfaces para definir um conjunto de valores personalizado. Todos os valores no ActionScript 3.0, sejam primitivos ou complexos, so objetos. Um valor primitivo aquele que pertence a um dos seguintes tipos de dados: Boolean, int, Number, String e uint. Trabalhar com valores primitivos, em geral, mais rpido do que trabalhar com valores complexos, porque o ActionScript armazena valores primitivos de uma forma especial que torna as otimizaes de memria e velocidade possveis. Nota: Para os leitores interessados nos detalhes tcnicos, o ActionScript armazena valores primitivos internamente como objetos imutveis. O fato de serem armazenados como objetos imutveis significa que transmitir por referncia, na prtica, o mesmo que transmitir por valor. Isso reduz o uso de memria e aumenta a velocidade de execuo, porque as referncias so significativamente menores do que os valores em si. Um valor complexo um valor que no primitivo. Os tipos de dados que definem conjuntos de valores complexos incluem Array, Date, Error, Function, RegExp, XML e XMLList. Muitas linguagens de programao distinguem os valores primitivos dos objetos delimitadores. Java, por exemplo, tem um primitivo int e a classe java.lang.Integer que o delimita. Os primitivos Java no so objetos, mas seus delimitadores so, o que torna os primitivos teis para algumas operaes e os objetos delimitadores mais adequados para outras operaes. No ActionScript 3.0, os valores primitivos e seus objetos delimitadores so, na prtica, indistinguveis. Todos os valores, mesmo os primitivos, so objetos. O Flash Player e o Adobe AIR tratam esses tipos primitivos como casos especiais que se comportam como objetos mas no exigem a sobrecarga normal associada criao de objetos. Isso significa que as duas linhas de cdigo a seguir so equivalentes:
var someInt:int = 3; var someInt:int = new int(3);

Todos os tipos de dados primitivos e complexos listados acima so definidos pelas classes centrais do ActionScript 3.0. As classes centrais permitem criar objetos usando os valores literais em vez do operador new. Por exemplo, voc pode criar uma matriz usando um valor literal ou o construtor de classe Array, como a seguir:
var someArray:Array = [1, 2, 3]; // literal value var someArray:Array = new Array(1,2,3); // Array constructor

Verificao de tipos
A verificao de tipos pode ocorrer em tempo de compilao ou de execuo. Linguagens tipificadas estatisticamente, como C++ e Java, executam a verificao de tipos em tempo de compilao. Linguagens tipificadas dinamicamente, como Smalltalk e Python, manipulam a verificao de tipos em tempo de execuo. Como uma linguagem tipificada dinamicamente, o ActionScript 3.0 tem uma verificao de tipos em tempo de execuo, mas tambm oferece suporte verificao de tipos em tempo de compilao com um modo de compilador especial chamado modo estrito. No modo estrito, a verificao de tipos ocorre em tempo de compilao e de execuo, mas no modo padro, ela ocorre apenas em tempo de execuo. Linguagens tipificadas dinamicamente oferecem grande flexibilidade na estruturao do cdigo, mas s custas de permitir que erros de tipo se manifestem em tempo de execuo. Linguagens tipificadas estatisticamente relatam erros de tipo em tempo de compilao, mas exigem que as informaes de tipo sejam conhecidas em tempo de compilao.

PROGRAMAO DO ACTIONSCRIPT 3.0 54


Linguagem e sintaxe do ActionScript

Verificao de tipos em tempo de compilao A verificao de tipos em tempo de compilao mais vantajosa em projetos grandes porque, conforme o tamanho de um projeto aumenta, a flexibilidade do tipo de dados se torna menos importante do que a rpida deteco de erros de tipo. por isso que, por padro, o compilador do ActionScript no Adobe Flash CS4 Professional e no Adobe Flex Builder definido para ser executado no modo restrito. Para fornecer a verificao de tipos em tempo de compilao, o compilador precisa conhecer as informaes de tipo de dados para as variveis ou expresses no seu cdigo. Para declarar explicitamente um tipo de dados para uma varivel, adicione o operador dois-pontos (:) seguido do tipo de dados como um sufixo para o nome da varivel. Para associar um tipo de dados a um parmetro, use o operador dois-pontos seguido do tipo de dados. Por exemplo, o seguinte cdigo adiciona informaes de tipo de dados ao parmetro xParam e declara uma varivel myParam com um tipo de dados explcito:
function runtimeTest(xParam:String) { trace(xParam); } var myParam:String = "hello"; runtimeTest(myParam);

No modo estrito, o compilador do ActionScript relata incompatibilidades de tipos como erros do compilador. Por exemplo, o cdigo a seguir declara um parmetro de funo xParam, do tipo Object, mas depois tenta atribuir valores do tipo String e Number ao parmetro. Isso gera um erro do compilador no modo estrito.
function dynamicTest(xParam:Object) { if (xParam is String) { var myStr:String = xParam; // compiler error in strict mode trace("String: " + myStr); } else if (xParam is Number) { var myNum:Number = xParam; // compiler error in strict mode trace("Number: " + myNum); } }

Mesmo no modo estrito, porm, possvel optar seletivamente pela verificao de tipos em tempo de compilao deixando o lado direito de uma instruo de atribuio sem tipos. Voc pode marcar uma varivel ou expresso como sem tipo omitindo uma anotao de tipo ou usando a anotao de tipo especial de asterisco (*). Por exemplo, se o parmetro xParam no exemplo anterior for modificado de forma que no tenha mais uma anotao de tipo, o cdigo compilar no modo estrito:

PROGRAMAO DO ACTIONSCRIPT 3.0 55


Linguagem e sintaxe do ActionScript

function dynamicTest(xParam) { if (xParam is String) { var myStr:String = xParam; trace("String: " + myStr); } else if (xParam is Number) { var myNum:Number = xParam; trace("Number: " + myNum); } } dynamicTest(100) dynamicTest("one hundred");

Verificao de tipos em tempo de execuo A verificao de tipos em tempo de execuo ocorrer no ActionScript 3.0 se voc compilar em modo restrito ou em modo de padro. Considere uma situao em que o valor 3 transmitido como um argumento para uma funo que espera uma matriz. No modo estrito, o compilador ir gerar um erro, porque o valor 3 no compatvel com o tipo de dados Array. Se voc desabilitar o modo estrito e executar no modo padro, o compilador no reclamar sobre incompatibilidade de tipos, mas a verificao em tempo de execuo do Flash Player e do Adobe AIR resultar em um erro em tempo de execuo. O exemplo a seguir mostra uma funo chamada typeTest() que espera um argumento Array mas tem um valor transmitido de 3. Isso gera um erro em tempo de execuo no modo padro, porque o valor 3 no um membro do tipo de dados (Array) declarado do parmetro.
function typeTest(xParam:Array) { trace(xParam); } var myNum:Number = 3; typeTest(myNum); // run-time error in ActionScript 3.0 standard mode

Tambm pode haver situaes em que h um erro de tipo em tempo de execuo mesmo durante a operao no modo estrito. Isso possvel se voc usar o modo estrito, mas optar pela verificao de tipos em tempo de compilao, usando uma varivel sem tipo. O uso de uma varivel sem tipo no elimina a verificao de tipos, mas a suspende at o tempo de execuo. Por exemplo, se a varivel myNum do exemplo anterior no tiver um tipo de dados declarado, o compilador no poder detectar a incompatibilidade de tipos, mas o Flash Player e o Adobe AIR iro gerar um erro de tempo de execuo porque comparam o valor do tempo de execuo de myNum, que est definido como 3 como resultado da instruo de atribuio, com o tipo de xParam, que definido com o tipo de dados Array.
function typeTest(xParam:Array) { trace(xParam); } var myNum = 3; typeTest(myNum); // run-time error in ActionScript 3.0

PROGRAMAO DO ACTIONSCRIPT 3.0 56


Linguagem e sintaxe do ActionScript

A verificao de tipos em tempo de execuo tambm permite um uso mais flexvel de herana que a verificao em tempo de compilao. Com a suspenso da verificao de tipos para o tempo de execuo, o modo padro permite referenciar as propriedades de uma subclasse mesmo que voc a eleve. Uma elevao ocorre quando voc usa uma classe base para declarar o tipo de uma ocorrncia de classe mas usa uma subclasse para instanci-la. Por exemplo, voc pode criar uma classe chamada ClassBase que pode ser estendida (classes com o atributo final no podem ser estendidas):
class ClassBase { }

Depois, voc pode criar uma subclasse de uma ClassBase chamada ClassExtender, que tem uma propriedade chamada someString, como a seguir:
class ClassExtender extends ClassBase { var someString:String; }

Usando as duas classes, possvel criar uma ocorrncia de classe que declarada usando o tipo de dados ClassBase, mas instanciada usando o construtor ClassExtender. Uma elevao considerada uma operao segura, porque a classe base no contm nenhuma propriedade ou mtodo que no esteja na subclasse.
var myClass:ClassBase = new ClassExtender();

Uma subclasse, porm, contm propriedades ou mtodos que sua classe base no contm. Por exemplo, a classe ClassExtender contm a propriedade someString, que no existe na classe ClassBase. No modo padro do ActionScript 3.0, possvel referenciar essa propriedade usando a ocorrncia myClass sem gerar um erro de tempo de compilao, como mostra o seguinte exemplo:
var myClass:ClassBase = new ClassExtender(); myClass.someString = "hello"; // no error in ActionScript 3.0 standard mode

O operador is O operador is, que novo no ActionScript 3.0, permite testar se uma varivel ou expresso um membro de um determinado tipo de dados. Nas verses anteriores do ActionScript, o operador instanceof fornecia essa funcionalidade, mas, no ActionScript 3.0, o operador instanceof no deve ser usado para testar a associao de tipo de dados. O operador is deve ser usado no lugar do operador instanceof para verificao de tipos manual, porque a expresso x instanceof y apenas verifica a existncia de x na cadeia de prottipos y (e, no ActionScript 3.0, a cadeia de prottipos no fornece um retrato completo da hierarquia de herana). O operador is examina a hierarquia de herana apropriada e pode ser usado para verificar no apenas se um objeto uma ocorrncia de uma classe especfica, mas tambm de uma classe que implementa uma determinada interface. O exemplo a seguir cria uma ocorrncia da classe Sprite, chamada mySprite e usa o operador is para testar se mySprite uma ocorrncia das classes Sprite e DisplayObject e se implementa a interface IEventDispatcher:
var mySprite:Sprite = new Sprite(); trace(mySprite is Sprite); // true trace(mySprite is DisplayObject);// true trace(mySprite is IEventDispatcher); // true

PROGRAMAO DO ACTIONSCRIPT 3.0 57


Linguagem e sintaxe do ActionScript

O operador is verifica a hierarquia de herana e relata adequadamente que mySprite compatvel com as classes Sprite e DisplayObject (a classe Sprite uma subclasse da classe DisplayObject). O operador is tambm verifica se mySprite herdada de alguma classe que implementa a interface IEventDispatcher. Como a classe Sprite herdada da classe EventDispatcher, que implementa a interface IEventDispatcher, o operador is relata corretamente que mySprite implementa a mesma interface. O exemplo a seguir mostra os mesmos testes do exemplo anterior, mas com instanceof em vez do operador is. O operador instanceof identifica corretamente que mySprite uma ocorrncia de Sprite ou DisplayObject, mas retorna false quando usado para testar se mySprite implementa a interface IEventDispatcher.
trace(mySprite instanceof Sprite); // true trace(mySprite instanceof DisplayObject);// true trace(mySprite instanceof IEventDispatcher); // false

O operador as O operador as, que novo no ActionScript 3.0, tambm permite verificar se uma expresso um membro de um determinado tipo de dados. Diferentemente do operador is, porm, o operador as no retorna um valor booleano. Em vez disso, o operador as retorna o valor da expresso em vez de true e null em vez de false. O exemplo a seguir mostra os resultados do uso do operador as em vez de is no caso simples de verificar se uma ocorrncia de Sprite um membro dos tipos de dados DisplayObject, IEventDispatcher e Number.
var mySprite:Sprite = new Sprite(); trace(mySprite as Sprite); // [object Sprite] trace(mySprite as DisplayObject); // [object Sprite] trace(mySprite as IEventDispatcher); // [object Sprite] trace(mySprite as Number); // null

Durante o uso do operador as, o operando direita deve ser um tipo de dados. Uma tentativa de usar uma expresso diferente de um tipo de dados como operando direita resultar em um erro.

Classes dinmicas
Uma classe dynamic define um objeto que pode ser alterado em tempo de execuo adicionando ou alterando propriedades e mtodos. Uma classe que no dinmica, como a classe String, uma classe selada. No possvel adicionar propriedades ou mtodos a uma classe selada em tempo de execuo. As classes dinmicas so criadas com o uso do atributo dynamic ao declarar uma classe. Por exemplo, o cdigo a seguir cria uma classe dinmica chamada Protean:
dynamic class Protean { private var privateGreeting:String = "hi"; public var publicGreeting:String = "hello"; function Protean() { trace("Protean instance created"); } }

Se, posteriormente, voc instanciar uma ocorrncia da classe Protean, poder adicionar propriedades ou mtodos a ela fora da definio da classe. Por exemplo, o cdigo a seguir cria uma ocorrncia da classe Protean e adiciona uma propriedade chamada aString e outra chamada aNumber ocorrncia:

PROGRAMAO DO ACTIONSCRIPT 3.0 58


Linguagem e sintaxe do ActionScript

var myProtean:Protean = new Protean(); myProtean.aString = "testing"; myProtean.aNumber = 3; trace(myProtean.aString, myProtean.aNumber); // testing 3

As propriedades adicionadas a uma ocorrncia de uma classe dinmica so entidades de tempo de execuo, por isso qualquer tipo de verificao feito em tempo de execuo. No possvel adicionar uma anotao de tipo a uma propriedade adicionada dessa forma. Voc tambm pode adicionar um mtodo ocorrncia myProtean definindo uma funo e anexando-a a uma propriedade da ocorrncia myProtean. O cdigo a seguir move a instruo de rastreamento para um mtodo chamado traceProtean():
var myProtean:Protean = new Protean(); myProtean.aString = "testing"; myProtean.aNumber = 3; myProtean.traceProtean = function () { trace(this.aString, this.aNumber); }; myProtean.traceProtean(); // testing 3

Os mtodos criados dessa forma, entretanto, no tm acesso a qualquer propriedade ou mtodo particular da classe Protean. Alm disso, mesmo as referncias s propriedades ou mtodos pblicos da classe Protean devem ser qualificados com a palavra-chave this ou o nome da classe. O exemplo a seguir mostra a tentativa do mtodo traceProtean() de acessar as variveis particulares e pblicas da classe Protean.
myProtean.traceProtean = function () { trace(myProtean.privateGreeting); // undefined trace(myProtean.publicGreeting); // hello }; myProtean.traceProtean();

Descries de tipos de dados


Os tipos nativos primitivos incluem Boolean, int, Null, Number, String, uint e void. As classes base do ActionScript tambm definem os seguintes tipos de dados complexos: Object, Array, Date, Error, Function, RegExp, XML e XMLList.

Tipo de dados Boolean


O tipo de dados Boolean compreende dois valores: true e false. Nenhum outro valor vlido para variveis do tipo Boolean. O valor padro de uma varivel Boolean que foi declarada mas no inicializada false.

Tipo de dados int


O tipo de dados int armazenado internamente como um inteiro de 32 bits e compreende o conjunto de inteiros de -2,147,483,648 (-231) a 2,147,483,647 (231 - 1), inclusive. As verses anteriores do ActionScript ofereciam apenas o tipo de dados Number, que era usado para nmeros inteiros e de ponto flutuante. No ActionScript 3.0, agora voc tem acesso a tipos de computador de nvel baixo para inteiros de 32 bits assinados e no assinados. Se a sua varivel no tiver nmeros de ponto flutuante, o uso do tipo de dados int em vez do tipo de dados Number dever ser mais rpido e eficiente.

PROGRAMAO DO ACTIONSCRIPT 3.0 59


Linguagem e sintaxe do ActionScript

Para valores inteiros fora do intervalo dos valores int mnimo e mximo, use o tipo de dados Number, que pode manipular valores entre positivo e negativo 9,007,199,254,740,992 (valores inteiros de 53 bits). O valor padro para variveis do tipo de dados int 0.

Tipo de dados Null


O tipo de dados Null contm apenas um valor, null. o valor padro para o tipo de dados String e todas as classes que definem tipos de dados complexos, inclusive a classe Object. Nenhum outro tipo de dados primitivo, como Boolean, Number, int e uint, contm o valor null. O Flash Player e o Adobe AIR convertero o valor null no valor padro apropriado se voc tentar atribuir null a variveis do tipo Boolean, Number, int ou uint. Voc no pode usar esse tipo de dados como uma anotao de tipo.

Tipo de dados Number


No ActionScript 3.0, o tipo de dados Number pode representar inteiros, inteiros no assinados e nmeros de ponto flutuante. Entretanto, para maximizar o desempenho, voc deve usar o tipo de dados Number somente para valores inteiros maiores do que os tipos int e uintde 32 bits podem armazenar ou para nmeros de ponto flutuante. Para armazenar um nmero de ponto flutuante, inclua um ponto decimal no nmero. Se voc omitir um ponto decimal, o nmero ser armazenado como um inteiro. O tipo de dados Number usa o formato de preciso dupla de 64 bits conforme especificado pelo Padro IEEE para Aritmtica de Ponto Flutuante Binrio (IEEE-754). Esse padro determina como os nmeros de ponto flutuante so armazenados usando os 64 bits disponveis. Um bit usado para designar se o nmero positivo ou negativo. Onze bits so usados para o expoente, que armazenado como base 2. Os 52 bits restantes so usados para armazenar o significando (tambm chamado de mantissa), que o nmero elevado potncia indicada pelo expoente. Com o uso de alguns bits para armazenar um expoente, o tipo de dados Number pode armazenar nmeros de ponto flutuante significativamente maiores do que se usasse todos os bits para o significando. Por exemplo, se o tipo de dados Number usasse os 64 bits para armazenar o significando, ele armazenaria um nmero to grande quanto 265 - 1. Com o uso de 11 bits para armazenar um expoente, o tipo de dados Number pode elevar seu significando potncia de 21023. Os valores mximo e mnimo que o tipo Number pode representar so armazenados em propriedades estticas da classe Number chamadas Number.MAX_VALUE e Number.MIN_VALUE.
Number.MAX_VALUE == 1.79769313486231e+308 Number.MIN_VALUE == 4.940656458412467e-324

Embora esse intervalo de nmeros seja enorme, seu custo a preciso. O tipo de dados Number usa 52 bits para armazenar o significando, por isso os nmeros que exigem mais de 52 bits para fazer uma representao precisa, como a frao 1/3, so apenas aproximaes. Se o seu aplicativo exibir preciso absoluta com nmeros decimais, ser necessrio usar um software que implemente a aritmtica de ponto flutuante decimal em vez da aritmtica de ponto flutuante binrio. Durante o armazenamento de valore inteiros com o tipo de dados Number, somente os 52 bits do significando so usados. O tipo de dados Number usa esses 52 bits e um bit oculto especial para representar inteiros de 9,007,199,254,740,992 (-253) a 9,007,199,254,740,992 (253). O Flash Player e o Adobe AIR usam o valor NaN no apenas como o valor padro para variveis do tipo Number, mas tambm como resultado de qualquer operao que deve retornar um nmero e no retorna. Por exemplo, se voc tentar calcular a raiz quadrada de um nmero negativo, o resultado ser NaN. Outros valores Number especiais incluem infinito positivo e infinito negativo. Nota: O resultado da diviso por 0 ser apenas NaN se o divisor tambm for 0. A diviso por 0 produz infinity quando o dividendo positivo ou -infinity quando o dividendo negativo.

PROGRAMAO DO ACTIONSCRIPT 3.0 60


Linguagem e sintaxe do ActionScript

Tipo de dados String


O tipo de dados String representa uma seqncia de caracteres de 16 bits. Os Strings so armazenados internamente como caracteres Unicode, usando o formato UTF-16, Eles so valores imutveis, assim como na linguagem de programao Java. Uma operao sobre um valor String retorna uma nova ocorrncia da seqncia de caracteres. O valor padro para uma varivel declarada com o tipo de dados String null. O valor null no o mesmo que a seqncia de caracteres vazia (""), muito embora ambos representem a ausncia de caracteres.

Tipo de dados uint


O tipo de dados int armazenado internamente como um inteiro no assinado de 32 bits e compreende o conjunto de inteiros de 0 a 4,294,967,295 (232 - 1), inclusive. Use o tipo de dados uint para circunstncias especiais que exigem inteiros no negativos. Por exemplo, voc deve usar o tipo de dados uint para representar os valores de cor de pixel, porque o tipo de dados int tem um bit de sinal interno que no apropriado para manipular valores de cor. Para valores inteiros maiores do que o valor uint mximo, use o tipo de dados Number, que pode manipular valores inteiros de 53 bits. O valor padro para variveis do tipo de dados uint 0.

Tipo de dados void


O tipo de dados void contm apenas um valor, undefined. Nas verses anteriores do ActionScript, undefined era o valor padro para ocorrncias da classe Object. No ActionScript 3.0, o valor padro para ocorrncias de Object null. Se voc tentar atribuir um valor undefined a uma ocorrncia da classe Object, o Flash Player ou o Adobe AIR convertero o valor em null. possvel atribuir apenas um valor de undefined a variveis sem tipo. Variveis sem tipo so aquelas que no possuem nenhuma anotao de tipo ou usam o smbolo asterisco (*) para a anotao de tipo. Voc pode usar void apenas como uma anotao de tipo de retorno.

Tipo de dados Object


O tipo de dados Object definido pela classe Object. A classe Object serve de classe base para todas as definies de classe no ActionScript. A verso do ActionScript 3.0 do tipo de dados Object difere das verses anteriores de trs formas. Primeiro, o tipo de dados Object no mais o tipo de dados padro atribudo a variveis sem nenhuma anotao de tipo. Em segundo lugar, o tipo de dados Object no inclui mais o valor undefined, que costumava ser o valor padro das ocorrncias Object. Em terceiro lugar, no ActionScript 3.0, o valor padro para ocorrncias da classe Object null. Nas verses anteriores do ActionScript, uma varivel sem nenhuma anotao de tipo era automaticamente atribuda ao tipo de dados Object. Isso no acontece mais no ActionScript 3.0, que agora inclui a idia de uma varivel realmente sem tipo. As variveis sem nenhuma anotao de tipo agora so consideradas sem tipo. Se preferir deixar mais claro para os leitores do cdigo que sua inteno deixar uma varivel sem tipo, voc pode usar o novo smbolo de asterisco (*) para a anotao de tipo, que equivalente a omitir uma anotao de tipo. O exemplo a seguir mostra duas instrues equivalentes, que declaram uma varivel sem tipo x:
var x var x:*

Somente variveis sem tipo podem manter o valor undefined. Se voc tentar atribuir o valor undefined a uma varivel que possui um tipo de dados, o Flash Player ou o Adobe AIR convertero o valor undefined no valor padro desse tipo de dados. Para ocorrncias do tipo de dados Object, o valor padro null, o que significa que o Flash Player ou o Adobe AIR convertero o valor undefined em null se voc tentar atribuir undefined a uma ocorrncia de Object.

PROGRAMAO DO ACTIONSCRIPT 3.0 61


Linguagem e sintaxe do ActionScript

Converses de tipo
Uma converso de tipo ocorre quando um valor transformado em um valor de um tipo de dados diferente. As converses de tipo podem ser implcitas ou explcitas. A converso implcita, que tambm chamada de coero, s vezes, executada pelo Flash Player ou Adobe AIR em tempo de execuo. Por exemplo, se o valor 2 for atribudo a uma varivel do tipo de dados Boolean, o Flash Player ou o Adobe AIR converter o valor 2 no valor booleano true antes de atribuir o valor varivel. A converso explcita, tambm chamada de projeo, ocorre quando o cdigo instrui o compilador a tratar uma varivel de um tipo de dados como se pertencesse a um tipo de dados diferente. Quando os valores primitivos esto envolvidos, a projeo realmente converte os valores de um tipo de dados para outro. Para projetar um objeto em um tipo diferente, use parnteses para delimitar o nome do objeto e preceda-o com o nome do novo tipo. Por exemplo, o seguinte cdigo usa um valor booleano e projeta-o em um inteiro:
var myBoolean:Boolean = true; var myINT:int = int(myBoolean); trace(myINT); // 1

Converses implcitas As converses implcitas acontecem em tempo de execuo em diversos contextos:

Em instrues de atribuio Quando os valores so transmitidos como argumentos de funo Quando os valores so retornados de funes Em expresses que usam determinados operadores, como o operador de adio (+)
Para tipos definidos pelo usurio, as converses implcitas so bem-sucedidas quando o valor a ser convertido uma ocorrncia da classe de destino ou de uma classe derivada dela. Se uma converso implcita no for bemsucedida, ocorrer um erro. Por exemplo, o seguinte cdigo contm uma converso implcita bem-sucedida e outra malsucedida:
class A {} class B extends A {} var objA:A = new A(); var objB:B = new B(); var arr:Array = new Array(); objA = objB; // Conversion succeeds. objB = arr; // Conversion fails.

Para os tipos primitivos, as converses implcitas so tratadas chamando os mesmos algoritmos de converso internos que so chamados pelas funes de converso explcitas. As sees a seguir discutem essas converses de tipo primitivas em detalhes. Converses explcitas til usar converses explcitas, ou projeo, ao compilar no modo estrito, porque pode haver situaes em que voc no deseja que uma incompatibilidade de tipos gere um erro em tempo de compilao. Pode ser o caso de quando voc sabe que a coero converter os valores corretamente em tempo de execuo. Por exemplo, ao trabalhar com dados recebidos de um formulrio, voc pode querer contar com a coero para converter determinados valores de seqncia de caracteres em valores numricos. O cdigo a seguir gera um erro em tempo de compilao, muito embora o cdigo seja executado corretamente no modo padro:
var quantityField:String = "3"; var quantity:int = quantityField; // compile time error in strict mode

PROGRAMAO DO ACTIONSCRIPT 3.0 62


Linguagem e sintaxe do ActionScript

Se quiser continuar a usar o modo estrito, mas preferir converter a seqncia de caracteres em um inteiro, voc pode usar a converso explcita da seguinte forma:
var quantityField:String = "3"; var quantity:int = int(quantityField); // Explicit conversion succeeds.

Projeo para int, uint e Number possvel projetar qualquer tipo de dados em um dos trs tipos de nmeros: int, uint e Number. Se o Flash Player ou o Adobe AIR no conseguir converter o nmero por algum motivo, o valor padro de 0 ser atribudo aos tipos de dados int e uint, e o valor padro de NaN ser atribudo para o tipo de dados Number. Se voc converter um valor Boolean em um nmero, true se tornar o valor 1 e false se tornar o valor 0.
var myBoolean:Boolean = true; var myUINT:uint = uint(myBoolean); var myINT:int = int(myBoolean); var myNum:Number = Number(myBoolean); trace(myUINT, myINT, myNum); // 1 1 1 myBoolean = false; myUINT = uint(myBoolean); myINT = int(myBoolean); myNum = Number(myBoolean); trace(myUINT, myINT, myNum); // 0 0 0

Os valores String que contm apenas dgitos pode ser convertidos com xito em um dos tipos de nmero. Os tipos de nmero tambm podem converter seqncias de caracteres que parecem nmeros negativos ou que representam um valor hexadecimal (por exemplo, 0x1A). O processo de converso ignora os caracteres de espao em branco esquerda e direita no valor da seqncia de caracteres. Tambm possvel projetar seqncias de caracteres que se parecem com nmeros de ponto flutuante usando Number(). A incluso de um ponto decimal faz com que uint() e int() retornem um inteiro, truncando o decimal e os caracteres seguintes. Por exemplo, os seguintes valores de seqncia de caracteres podem ser projetados em nmeros:
trace(uint("5")); // 5 trace(uint("-5")); // 4294967291. It wraps around from MAX_VALUE trace(uint(" 27 ")); // 27 trace(uint("3.7")); // 3 trace(int("3.7")); // 3 trace(int("0x1A")); // 26 trace(Number("3.7")); // 3.7

Os valores String que contm caracteres no numricos retornam 0 quando projetados com int() ou uint() e NaN quando projetados com Number(). O processo de converso ignora espao em branco esquerda e direita, mas retorna 0 ou NaN se uma seqncia de caracteres tiver espao em branco separando dois nmeros.
trace(uint("5a")); // 0 trace(uint("ten")); // 0 trace(uint("17 63")); // 0

No ActionScript 3.0, a funo Number() no suporta mais nmeros octais, ou de base 8. Se voc fornecer uma seqncia de caracteres com um zero esquerda para a funo Number() do ActionScript 2.0, o nmero ser interpretado como um nmero octal e convertido em seu equivalente decimal. Isso no acontece com a funo Number() no ActionScript 3.0, que em vez disso ignora o zero esquerda. Por exemplo, o seguinte cdigo gera uma sada diferente quando compilado usando verses diferentes do ActionScript:
trace(Number("044")); // ActionScript 3.0 44 // ActionScript 2.0 36

PROGRAMAO DO ACTIONSCRIPT 3.0 63


Linguagem e sintaxe do ActionScript

A projeo no necessria quando um valor de um tipo numrico atribudo a uma varivel de um tipo numrico diferente. Mesmo no modo estrito, os tipos numricos so implicitamente convertidos em outros tipos numricos. Isso significa que, em alguns casos, quando o intervalo de um tipo for excedido, o resultado poder gerar valores inesperados. Os seguintes exemplos compilam no modo estrito, embora alguns gerem valores inesperados:
var myUInt:uint = -3; // Assign int/Number value to uint variable trace(myUInt); // 4294967293 var myNum:Number = sampleUINT; // Assign int/uint value to Number variable trace(myNum) // 4294967293 var myInt:int = uint.MAX_VALUE + 1; // Assign Number value to uint variable trace(myInt); // 0 myInt = int.MAX_VALUE + 1; // Assign uint/Number value to int variable trace(myInt); // -2147483648

A tabela a seguir resume os resultados da projeo para os tipos de dados Number, int ou uint a partir de outros tipos de dados.
Tipo de dados ou valor Boolean Date Resultado da converso em Number, int ou uint Se o valor for true, 1; caso contrrio, 0. A representao interna do objeto Date, que o nmero de milsimos de segundo desde a meia-noite de 1 de janeiro de 1970, hora universal. 0 Se a ocorrncia for null e convertida para Number, NaN; caso contrrio, 0. Um nmero se o Flash Player ou o Adobe AIR puderem converter a seqncia de caracteres em um nmero; caso contrrio, NaN se convertida em Number ou 0 se convertida em int ou uint. Se convertido em Number, NaN; se convertido em int ou uint, 0.

null

Object String

undefined

Projeo para Boolean A projeo para Boolean a partir de qualquer tipo de dados numrico (uint, int e Number) resultar em false se o valor numrico for 0 e em true se no for. Para o tipo de dados Number, o valor NaN tambm resulta em false. O exemplo a seguir mostra os resultados da projeo dos nmeros em -1, 0 e 1:
var myNum:Number; for (myNum = -1; myNum<2; myNum++) { trace("Boolean(" + myNum +") is " + Boolean(myNum)); }

A sada do exemplo mostra que, dos trs nmeros, somente 0 retorna um valor false:
Boolean(-1) is true Boolean(0) is false Boolean(1) is true

A projeo para Boolean de um valor String retornar false se a seqncia de caracteres for null ou vazia (""). Do contrrio, retornar null.

PROGRAMAO DO ACTIONSCRIPT 3.0 64


Linguagem e sintaxe do ActionScript

var str1:String; // Uninitialized string is null. trace(Boolean(str1)); // false var str2:String = ""; // empty string trace(Boolean(str2)); // false var str3:String = " "; // white space only trace(Boolean(str3)); // true

A projeo para Boolean de uma ocorrncia da classe Object retornar false se a ocorrncia for null; do contrrio, retornar true:
var myObj:Object; // Uninitialized object is null. trace(Boolean(myObj)); // false myObj = new Object(); // instantiate trace(Boolean(myObj)); // true

As variveis Boolean obtm tratamento especial no modo estrito no que se refere a atribuir valores de qualquer tipo de dados a uma varivel Boolean sem projeo. A coero implcita de todos os tipos de dados para o tipo de dados Boolean ocorre mesmo no modo estrito. Em outras palavras, diferentemente de quase todos os outros tipos de dados, a projeo para Boolean no necessria para evitar erros no modo estrito. Os seguintes exemplos compilam no modo estrito e se comportam conforme o esperado em tempo de execuo:
var myObj:Object = new Object(); // instantiate var bool:Boolean = myObj; trace(bool); // true bool = "random string"; trace(bool); // true bool = new Array(); trace(bool); // true bool = NaN; trace(bool); // false

A tabela a seguir resume os resultados da projeo para o tipo de dados Boolean a partir de outros tipos de dados:
Tipo de dados ou valor String
null

Resultado da converso em Boolean


false se o valor for null ou uma seqncia de caracteres vazia (""); caso contrrio, true. false false se o valor for NaN ou 0; caso contrrio, true. false se a ocorrncia for null; caso contrrio, true.

Number, int ou uint Object

Projeo para String A projeo para o tipo de dados String de qualquer tipo de dados numrico retorna uma representao de seqncia de caracteres do nmero. A projeo para o tipo de dados String de um valor Boolean retornar a seqncia de caracteres "true" se o valor for true e retornar a seqncia de caracteres "false" se o valor for false. A projeo para String de uma ocorrncia da classe Object retornar a seqncia de caracteres "null" se a ocorrncia for null. Caso contrrio, a projeo para o tipo String da classe Object retornar a seqncia de caracteres "[object Object]" . A projeo para String de uma ocorrncia da classe Array retorna uma seqncia de caracteres incluindo uma lista delimitada por vrgula de todos os elementos da matriz. Por exemplo, a seguinte projeo para o tipo de dados String retorna uma seqncia de caracteres contendo os trs elementos da matriz:

PROGRAMAO DO ACTIONSCRIPT 3.0 65


Linguagem e sintaxe do ActionScript

var myArray:Array = ["primary", "secondary", "tertiary"]; trace(String(myArray)); // primary,secondary,tertiary

A projeo para String de uma ocorrncia da classe Date retorna uma representao da seqncia de caracteres da data que a ocorrncia contm. Por exemplo, o seguinte exemplo retorna uma representao da seqncia de caracteres da ocorrncia da classe Date (a sada mostra o resultado para o Horrio de Vero do Pacfico):
var myDate:Date = new Date(2005,6,1); trace(String(myDate)); // Fri Jul 1 00:00:00 GMT-0700 2005

A tabela a seguir resume os resultados da projeo para o tipo de dados String a partir de outros tipos de dados:
Tipo de dados ou valor Array Boolean Date
null

Resultado da converso em String Uma seqncia de caracteres incluindo todos os elementos de matriz.
"true" ou "false"

Uma representao da seqncia de caracteres do objeto Date.


"null"

Number, int ou uint Object

Uma representao da seqncia de caracteres do nmero. Se a ocorrncia for null, "null"; caso contrrio, "[object Object]".

Sintaxe
A sintaxe de uma linguagem define um conjunto de regras que deve ser seguido durante a escrita de cdigo executvel.

Diferenciao entre maisculas e minsculas


O ActionScript 3.0 uma linguagem que diferencia maisculas e minsculas. Os identificadores que diferem somente em maisculas e minsculas so considerados identificadores diferentes. Por exemplo, o cdigo a seguir cria duas variveis diferentes:
var num1:int; var Num1:int;

Sintaxe de pontos
O operador dot (.) fornece uma maneira de acessar as propriedades e os mtodos de um objeto. Com o uso da sintaxe de pontos, possvel fazer referncia a uma propriedade ou um mtodo de classe usando um nome de ocorrncia, seguido do operador dot e do nome da propriedade ou do mtodo. Por exemplo, considere a seguinte definio de classe:
class DotExample { public var prop1:String; public function method1():void {} }

Com o uso da sintaxe de pontos, possvel acessar a propriedade prop1 e o mtodo method1() usando o nome de ocorrncia criado no seguinte cdigo:

PROGRAMAO DO ACTIONSCRIPT 3.0 66


Linguagem e sintaxe do ActionScript

var myDotEx:DotExample = new DotExample(); myDotEx.prop1 = "hello"; myDotEx.method1();

possvel usar a sintaxe de pontos para definir pacotes. O operador dot usado para fazer referncia a pacotes aninhados. Por exemplo, a classe EventDispatcher reside em um pacote chamado eventos que aninhado dentro do pacote chamado flash. Voc pode fazer referncia aos pacotes de eventos usando a seguinte expresso:
flash.events

Voc tambm pode fazer referncia classe EventDispatcher usando esta expresso:
flash.events.EventDispatcher

Sintaxe de barras
A sintaxe de barras no suportada no ActionScript 3.0. Ela foi usada nas verses anteriores do ActionScript para indicar o caminho de um clipe de filme ou varivel.

Literais
Um literal um valor que aparece diretamente em seu cdigo. Os seguintes exemplos so de literais:
17 "hello" -3 9.4 null undefined true false

Os literais tambm podem ser agrupados para formar literais compostos. Os literais de matriz so colocados entre colchetes ([]) e usam a vrgula para separar elementos de matriz. Um literal de matriz pode ser usado para inicializar uma matriz. Os exemplos a seguir mostram duas matrizes que so inicializadas usando literais de matriz. possvel usar a instruo new e transmitir o literal composto como um parmetro para o construtor de classe Array, mas voc tambm pode atribuir valores literais diretamente ao instanciar ocorrncias das seguintes classes centrais do ActionScript: Object, Array, String, Number, int, uint, XML, XMLList e Boolean.
// Use new statement. var myStrings:Array = new Array(["alpha", "beta", "gamma"]); var myNums:Array = new Array([1,2,3,5,8]); // Assign literal directly. var myStrings:Array = ["alpha", "beta", "gamma"]; var myNums:Array = [1,2,3,5,8];

Os literais tambm podem ser usado para inicializar um objeto genrico. Um objeto genrico uma ocorrncia da classe Object. Os literais Object so colocados entre chaves ({}) e usam a vrgula para separar propriedades de objetos. Cada propriedade declarada com o caractere dois-pontos (:), que separa o nome da propriedade do valor da propriedade. possvel criar um objeto genrico usando a instruo new e transmitir o literal de objeto como um parmetro para o construtor de classe Objeto ou atribuir o literal de objeto diretamente ocorrncia que voc est declarando. O exemplo a seguir demonstra duas formas alternativas de criar um novo objeto genrico e inicializar o objeto com trs propriedades (propA, propB e propC), cada uma com valores definidos como 1, 2, e 3, respectivamente:

PROGRAMAO DO ACTIONSCRIPT 3.0 67


Linguagem e sintaxe do ActionScript

// Use new statement and add properties. var myObject:Object = new Object(); myObject.propA = 1; myObject.propB = 2; myObject.propC = 3; // Assign literal directly. var myObject:Object = {propA:1, propB:2, propC:3};

Para obter mais informaes, consulte Noes bsicas de strings na pgina 143, Noes bsicas de expresses regulares: na pgina 209 e Inicializao de variveis XML na pgina 238.

Ponto-e-vrgula
Voc pode usar o caractere ponto-e-vrgula (;) para encerrar uma instruo. Opcionalmente, se omitir o caractere ponto-e-vrgula, o compilador presumir que cada linha de cdigo representa uma nica instruo. Como muitos programadores esto acostumados a usar o ponto-e-vrgula para denotar o fim de uma instruo, seu cdigo poder ser mais fcil de ler se voc usar consistentemente ponto-e-vrgula para encerrar as instrues. O uso de um ponto-e-vrgula para encerrar uma instruo permite colocar mais de uma instruo em uma nica linha, mas isso pode tornar o cdigo mais difcil de ler.

Parnteses
Voc pode usar parnteses (()) de trs formas no ActionScript 3.0. Primeiro, voc pode usar parnteses para alterar a ordem das operaes em uma expresso. As operaes que so agrupadas dentro de parnteses so sempre executadas primeiro. Por exemplo, os parnteses so usados para alterar a ordem das operaes no seguinte cdigo:
trace(2 + 3 * 4); // 14 trace((2 + 3) * 4); // 20

Em segundo lugar, voc pode usar parnteses com o operador vrgula (,) para avaliar uma srie de expresses e retornar o resultado da expresso final, como mostra o seguinte exemplo:
var a:int = 2; var b:int = 3; trace((a++, b++, a+b)); // 7

Em terceiro lugar, voc pode usar parnteses para transmitir um ou mais parmetros para funes ou mtodos, como mostra o exemplo a seguir, que transmite um valor String para a funo trace():
trace("hello"); // hello

Comentrios
O cdigo do ActionScript 3.0 oferece suporte a dois tipos de comentrios: comentrios de uma nica linha e de vrias linhas. Esses mecanismos de comentrios so semelhantes aos do C++ e Java. O compilador ir ignorar o texto marcado com um comentrio. Os comentrios de uma nica linha comeam com dois caracteres de barra inclinada (//) e continuam at o fim da linha. Por exemplo, o seguinte cdigo contm um comentrio de uma nica linha:
var someNumber:Number = 3; // a single line comment

Os comentrios de vrias linhas comeam com uma barra inclinada e um asterisco (/*) e terminam com um asterisco e uma barra inclinada (*/).

PROGRAMAO DO ACTIONSCRIPT 3.0 68


Linguagem e sintaxe do ActionScript

/* This is multiline comment that can span more than one line of code. */

Palavras-chave e palavras reservadas


As palavras reservadas so palavras que no podem ser usadas como identificadores no cdigo porque so para uso do ActionScript. Elas incluem palavras-chave lxicas, que so removidas do espao para nomes do programa pelo compilador. O compilador relatar um erro se voc usar uma palavra-chave lxica como identificador. A seguinte tabela lista as palavras-chave lxicas do ActionScript 3.0.
as class delete false if instanceof native private super to use with break const do finally implements interface new protected switch true var case continue else for import internal null public this try void catch default extends function in is package return throw typeof while

H um pequeno conjunto de palavras-chave, chamado palavras-chave sintticas, que pode ser usado como identificador, mas tm um significado especial em determinados contextos. A tabela a seguir lista as palavras-chave sintticas do ActionScript 3.0.
each include override get dynamic static set final namespace native

Tambm h vrios identificadores que, s vezes, so referidos como palavras reservadas futuras. Eles no so reservados pelo ActionScript 3.0, embora alguns sejam tratados como palavras-chave pelo software que incorpora o ActionScript 3.0. Voc pode usar vrios desses identificadores no seu cdigo, mas a Adobe no recomenda essa prtica porque eles podem aparecer como palavras-chave em uma verso subseqente da linguagem.
abstract char export long throws virtual boolean debugger float prototype to volatile byte double goto short transient cast enum intrinsic synchronized type

PROGRAMAO DO ACTIONSCRIPT 3.0 69


Linguagem e sintaxe do ActionScript

Constantes
O ActionScript 3.0 oferece suporte instruo const, que voc pode usar para criar constantes. As constantes so propriedades com um valor fixo que no pode ser alterado. Voc pode atribuir um valor a uma constante apenas uma vez, e a atribuio deve ocorrer prxima declarao da constante. Por exemplo, se uma constante for declarada como um membro de uma classe, voc poder atribuir-lhe um valor somente como parte da declarao ou dentro do construtor de classe. O seguinte cdigo declara duas constantes. A primeira, MINIMUM, tem um valor atribudo como parte da instruo de declarao. A segunda, MAXIMUM, tem um valor atribudo no construtor. Observe que este exemplo compilado apenas no modo padro porque o modo estrito s permite que um valor de constante seja atribudo em tempo de inicializao.
class A { public const MINIMUM:int = 0; public const MAXIMUM:int; public function A() { MAXIMUM = 10; } } var a:A = new A(); trace(a.MINIMUM); // 0 trace(a.MAXIMUM); // 10

Um erro ser gerado se voc tentar atribuir um valor inicial a uma constante de qualquer outra forma. Por exemplo, se voc tentar definir o valor inicial de MAXIMUM fora da classe, ocorrer um erro de tempo de execuo.
class A { public const MINIMUM:int = 0; public const MAXIMUM:int; } var a:A = new A(); a["MAXIMUM"] = 10; // run-time error

O ActionScript 3.0 define uma ampla gama de constantes para sua convenincia. Por conveno, as constantes do ActionScript usam tudo em letras maisculas, com as palavras separadas pelo caractere de sublinhado (_). Por exemplo, a definio de classe MouseEvent usa essa conveno de nomenclatura para suas constantes, cada uma representando um evento relacionado entrada do mouse:
package flash.events { public class MouseEvent extends Event { public static const CLICK:String = "click"; public static const DOUBLE_CLICK:String = "doubleClick"; public static const MOUSE_DOWN:String = "mouseDown"; public static const MOUSE_MOVE:String = "mouseMove"; ... } }

PROGRAMAO DO ACTIONSCRIPT 3.0 70


Linguagem e sintaxe do ActionScript

Operadores
Os operadores so funes especiais que usam um ou mais operandos e retornam um valor. Um operando um valor, normalmente um literal, uma varivel ou uma expresso, que um operador usa como entrada. Por exemplo, no cdigo a seguir, os operadores de adio (+) e de multiplicao (*) so usados com trs operandos literais (2, 3, e 4) para retornar um valor. Esse valor usado pelo operador de atribuio (=) para atribuir o valor retornado, 14, para a varivel sumNumber.
var sumNumber:uint = 2 + 3 * 4; // uint = 14

Os operadores podem ser unrios, binrios ou ternrios. Um operador unrio usa um operando. Por exemplo, o operador de incremento (++) um operador unrio, porque usa apenas um operando. Um operador binrio usa dois operandos. Por exemplo, o operador de diviso (/) usa dois operandos. Um operador ternrio usa trs operandos. Por exemplo, o operador condicional (/) usa trs operandos. Alguns operadores so sobrecarregados, o que significa que se comportam de forma diferente dependendo do tipo ou da quantidade de operandos que lhes so transmitidos. O operador de adio (+) um exemplo de um operador sobrecarregado que se comporta de maneira diferente dependendo do tipo de dados dos operandos. Se os dois operandos forem nmeros, o operador de adio retornar a soma dos valores. Se os dois operandos forem seqncias de caracteres, o operador de adio retornar a concatenao dos dois operandos. O cdigo de exemplo a seguir mostra como o operador se comporta de forma diferente dependendo dos operandos:
trace(5 + 5); // 10 trace("5" + "5"); // 55

Os operadores tambm podem se comportar de forma diferente com base no nmero de operandos fornecidos. O operador de subtrao (-) um operador unrio e binrio. Quando fornecido com apenas um operando, o operador de subtrao nega o operando e retorna o resultado. Quando fornecido com dois operandos, o operador de subtrao retorna a diferena entre os operandos. O exemplo a seguir mostra o operador de subtrao usado primeiro como um operador unrio e depois como binrio.
trace(-3); // -3 trace(7 - 2); // 5

Precedncia e associatividade de operadores


A precedncia e a associatividade de operadores determina a ordem na qual os operadores so processados. Embora possa parecer natural aos que esto familiarizados com aritmtica que o compilador processe o operador de multiplicao (*) antes do operador de adio (+), o compilador precisa de instrues explcitas sobre os operadores que deve processar primeiro. Essas instrues so denominadas coletivamente de precedncia de operador. O ActionScript define a precedncia de um operador padro que voc pode alterar usando o operador parnteses (()). Por exemplo, o seguinte cdigo altera a precedncia padro no exemplo anterior para forar o compilador a processar o operador de adio antes do operador de multiplicao:
var sumNumber:uint = (2 + 3) * 4; // uint == 20

Voc pode encontrar situaes em que dois ou mais operadores da mesma precedncia aparecem na mesma expresso. Nesses casos, o compilador usa as regras de associatividade para determinar qual operador ser processado primeiro. Todos os operadores binrios, exceto os de atribuio, so associativos esquerda, o que significa que os operadores esquerda so processados antes dos que esto direita. Todos os operadores de atribuio e o operador condicional (?:) so associativos direita, o que significa que os operadores direita so processados antes dos que esto esquerda.

PROGRAMAO DO ACTIONSCRIPT 3.0 71


Linguagem e sintaxe do ActionScript

Por exemplo, considere os operadores "menor do que" (<) e "maior do que" (>), que tm a mesma precedncia. Se os dois forem usados na mesma expresso, o operador esquerda ser processado primeiro porque os dois operadores so associativos esquerda. Isso significa que as duas instrues a seguir produzem a mesma sada:
trace(3 > 2 < 1); // false trace((3 > 2) < 1); // false

O operador maior do que processado primeiro, o que resulta em um valor true, porque o operando 3 maior do que o operando 2. O valor true transmitido para o operador menor do que junto com o operando 1. O seguinte cdigo representa esse estado intermedirio:
trace((true) < 1);

O operador menor do que converte o valor true no valor numrico 1 e compara esse valor numrico com o segundo operando 1 para retornar o valor false (o valor 1 no menor que 1).
trace(1 < 1); // false

possvel alterar a associatividade esquerda padro com o operador parnteses. Voc pode instruir o compilador a processar o operador menor do que primeiro, colocando esse operador e seus operandos entre parnteses. O exemplo a seguir usa o operador parnteses para produzir uma sada diferente usando os mesmos nmeros que o exemplo anterior:
trace(3 > (2 < 1)); // true

O operador menor do que processado primeiro, o que resulta em um valor false, porque o operando 2 no menor que o operando 1. O valor false transmitido para o operador maior do que junto com o operando 3. O seguinte cdigo representa esse estado intermedirio:
trace(3 > (false));

O operador maior do que converte o valor false no valor numrico 0 e compara esse valor numrico com o outro operando 3 para retornar o valor true (o valor 3 maior que 0).
trace(3 > 0); // true

A tabela a seguir lista os operadores para o ActionScript 3.0 em ordem decrescente de precedncia. Cada linha da tabela contm operadores de mesma precedncia. Cada linha de operadores tem precedncia sobre a linha que aparece abaixo dela na tabela.
Grupo Primrio Sufixo Unrio Multiplicativo Aditivo Desvio em nvel de bits Relacional Igualdade AND em nvel de bits XOR em nvel de bits OR em nvel de bits Operadores
[] {x:y} () f(x) new x.y x[y] <></> @ :: .. x++ x-++x --x + - ~ ! delete typeof void * / % + << >> >>> < > <= >= as in instanceof is == != === !== & ^ |

PROGRAMAO DO ACTIONSCRIPT 3.0 72


Linguagem e sintaxe do ActionScript

Grupo AND lgico OR lgico Condicional Atribuio Vrgula

Operadores
&& || ?: = *= /= %= += -= <<= >>= >>>= &= ^= |= ,

Operadores primrios
Os operadores primrios incluem aqueles usados para criar literais Array e Object, agrupar expresses, chamar funes, instanciar ocorrncias de classes e acessar propriedades. Todos os operadores primrios, conforme listados na tabela a seguir, tm a mesma precedncia. Os operadores que fazem parte da especificao E4X so indicados pela notao (E4X).
Operador
[] {x:y} () f(x) new x.y x[y] <></> @ :: ..

Operao executada Inicializa uma matriz Inicializa um objeto Agrupa expresses Chama uma funo Chama um construtor Acessa uma propriedade Inicializa um objeto XMLList (E4X) Acessa um atributo (E4X) Qualifica um nome (E4X) Acessa um elemento XML descendente (E4X)

Operadores de sufixo
Os operadores de sufixo usam um operador e incrementam ou decrementam o valor. Embora esses operadores sejam unrios, eles so classificados separadamente do resto dos operadores unrios por causa de sua maior precedncia e seu comportamento especial. Quando um operador de sufixo usado como parte de uma expresso maior, o valor da expresso retornado antes que o operador de sufixo seja processado. Por exemplo, o seguinte cdigo mostra como o valor da expresso xNum++ retornado antes de ser incrementado:
var xNum:Number = 0; trace(xNum++); // 0 trace(xNum); // 1

Todos os operadores de sufixo, conforme listados na tabela a seguir, tm a mesma precedncia:


Operador
++ --

Operao executada Incrementos (sufixo) Decrementos (sufixo)

PROGRAMAO DO ACTIONSCRIPT 3.0 73


Linguagem e sintaxe do ActionScript

Operadores unrios
Os operadores unrios usam um operando. Os operadores de incremento (++) e de decremento (--) deste grupo so operadores deprefixo, o que significa que aparecem antes do operando em uma expresso. Os operadores de prefixo diferem dos de sufixo na operao de incremento ou decremento que executada antes que o valor da expresso geral seja retornado. Por exemplo, o seguinte cdigo mostra como o valor da expresso ++xNum retornado depois de ser incrementado:
var xNum:Number = 0; trace(++xNum); // 1 trace(xNum); // 1

Todos os operadores unrios, conforme listados na tabela a seguir, tm a mesma precedncia:


Operador
++ -+ ! ~ delete typeof void

Operao executada Incrementos (prefixo) Decrementos (prefixo) Unrio + Unrio - (negativa) NOT lgico NOT em nvel de bits Exclui uma propriedade Retorna informaes de tipo Retorna um valor indefinido

Operadores multiplicativos
Os operadores multiplicativos usam dois operandos e executam clculos de multiplicao, diviso ou mdulo. Todos os operadores multiplicativos, conforme listados na tabela a seguir, tm a mesma precedncia:
Operador
* / %

Operao executada Multiplicao Diviso Mdulo

Operadores aditivos
Os operadores aditivos usam dois operandos e executam clculos de adio ou subtrao. Todos os operadores aditivos, conforme listados na tabela a seguir, tm a mesma precedncia:
Operador
+ -

Operao executada Adio Subtrao

PROGRAMAO DO ACTIONSCRIPT 3.0 74


Linguagem e sintaxe do ActionScript

Operadores de desvio em nvel de bits


Os operadores de desvio em nvel de bits usam dois operandos e desviam os bits do primeiro at o ponto especificado pelo segundo operando. Todos os operadores de desvio em nvel de bits, conforme listados na tabela a seguir, tm a mesma precedncia:
Operador
<< >> >>>

Operao executada Desvio esquerda em nvel de bits Desvio direita em nvel de bits Desvio direita no assinado em nvel de bits

Operadores relacionais
Os operadores relacionais usam dois operandos, comparam seus valores e retornam um valor booleano. Todos os operadores relacionais, conforme listados na tabela a seguir, tm a mesma precedncia:
Operador
< > <= >= as in instanceof is

Operao executada Menor do que Maior do que Menor do que ou igual a Maior do que ou igual a Verifica tipo de dados Verifica propriedades de objeto Verifica cadeia de prottipos Verifica tipo de dados

Operadores de igualdade
Os operadores de igualdade usam dois operandos, comparam seus valores e retornam um valor booleano. Todos os operadores de igualdade, conforme listados na tabela a seguir, tm a mesma precedncia:
Operador
== != === !==

Operao executada Igualdade Desigualdade Igualdade estrita Desigualdade estrita

Operadores lgicos em nvel de bits


Os operadores lgicos em nvel de bits usam dois operandos e executam operaes lgicas em nvel de bits. Os operadores lgicos em nvel de bits diferem na precedncia e so listados na tabela a seguir em ordem decrescente de precedncia:

PROGRAMAO DO ACTIONSCRIPT 3.0 75


Linguagem e sintaxe do ActionScript

Operador
& ^ |

Operao executada AND em nvel de bits XOR em nvel de bits OR em nvel de bits

Operadores lgicos
Os operadores lgicos usam dois operandos e retornam um valor booleano. Os operadores lgicos diferem em precedncia e so listados na tabela a seguir em ordem decrescente de precedncia:
Operador
&& ||

Operao executada AND lgico OR lgico

Operador condicional
O operador condicional um operador ternrio, o que significa que usa trs operandos. Ele um mtodo til para aplicar a instruo condicional if..else .
Operador
?:

Operao executada Condicional

Operadores de atribuio
Os operadores de atribuio usam dois operandos e atribuem um valor a um deles, com base no valor do outro. Todos os operadores de atribuio, conforme listados na tabela a seguir, tm a mesma precedncia:
Operador
= *= /= %= += -= <<= >>= >>>= &= ^= |=

Operao executada Atribuio Atribuio de multiplicao Atribuio de diviso Atribuio de mdulo Atribuio de adio Atribuio de subtrao Atribuio de desvio esquerda em nvel de bits Atribuio de desvio direita em nvel de bits Atribuio de desvio direita no assinado em nvel de bits Atribuio AND em nvel de bits Atribuio XOR em nvel de bits Atribuio OR em nvel de bits

PROGRAMAO DO ACTIONSCRIPT 3.0 76


Linguagem e sintaxe do ActionScript

Condicionais
O ActionScript 3.0 fornece trs instrues condicionais bsicas que voc pode usar para controlar o fluxo de programa.

if..else
A instruo condicional if..else permite testar uma condio e executar um bloco de cdigo se essa condio existir, ou executar um bloco de cdigo alternativo se ela no existir. Por exemplo, o seguinte cdigo testa se o valor x excede 20, gera uma funo trace() em caso afirmativo ou gera uma funo trace() diferente em caso negativo:
if (x > 20) { trace("x is > 20"); } else { trace("x is <= 20"); }

Se no quiser executar um bloco de cdigo alternativo, voc poder usar a instruo if sem a instruo else.

if..else if
possvel testar mais de uma condio usando a instruo condicional if..else if. Por exemplo, o cdigo a seguir no apenas testa se o valor x excede 20, mas tambm se o valor x negativo:
if (x > 20) { trace("x is > 20"); } else if (x < 0) { trace("x is negative"); }

Se uma instruo if ou else for seguida de apenas uma instruo, a instruo no precisa ficar entre chaves. Por exemplo, o cdigo a seguir no usa chaves:
if (x > 0) trace("x else if (x < trace("x else trace("x is positive"); 0) is negative"); is 0");

Entretanto, a Adobe recomenda que voc sempre use chaves, porque poder ocorrer um comportamento inesperado se instrues forem adicionadas posteriormente a uma instruo condicional sem chaves. Por exemplo, no cdigo a seguir, o valor positiveNums aumentado em 1 quer a condio seja ou no avaliada como true:
var x:int; var positiveNums:int = 0; if (x > 0) trace("x is positive"); positiveNums++; trace(positiveNums); // 1

PROGRAMAO DO ACTIONSCRIPT 3.0 77


Linguagem e sintaxe do ActionScript

switch
A instruo switch ser til se voc tiver vrios caminhos de execuo que dependam da mesma expresso de condio. Ela fornece uma funcionalidade semelhante a uma longa srie de instrues if..else if, mas mais fcil de ler. Em vez de testar uma condio quanto a um valor booleano, a instruo switch avalia uma expresso e usa o resultado para determinar qual bloco de cdigo ser executado. Os blocos de cdigo comeam com uma instruo case e terminam com uma instruo break. Por exemplo, a seguinte instruo switch imprime o dia da semana, com base no nmero de dias retornado pelo mtodo Date.getDay():
var someDate:Date = new Date(); var dayNum:uint = someDate.getDay(); switch(dayNum) { case 0: trace("Sunday"); break; case 1: trace("Monday"); break; case 2: trace("Tuesday"); break; case 3: trace("Wednesday"); break; case 4: trace("Thursday"); break; case 5: trace("Friday"); break; case 6: trace("Saturday"); break; default: trace("Out of range"); break; }

Repetio
As instrues de repetio permitem executar um bloco especfico de cdigo repetidamente usando uma srie de valores ou variveis. A Adobe recomenda que o bloco de cdigo seja sempre colocado entre chaves ({}). Embora seja possvel omitir as chaves caso o bloco de cdigo contenha apenas uma instruo, essa prtica no recomendada pelo mesmo motivo que para as condicionais: ela aumenta as chances de que as instrues adicionadas em um momento posterior sejam excludas inadvertidamente do bloco de cdigo. Se, mais tarde, voc adicionar uma instruo que deseja incluir no bloco de cdigo, mas esquecer de adicionar as chaves necessrias, a instruo no ser executada como parte da repetio.

PROGRAMAO DO ACTIONSCRIPT 3.0 78


Linguagem e sintaxe do ActionScript

for
A repetio for permite fazer a iterao por meio de uma varivel para um intervalo especfico de valores. Voc deve fornecer trs expresses em uma instruo for: uma varivel que definida com um valor inicial, uma instruo condicional que determina quando a repetio termina e uma expresso que altera o valor da varivel a cada repetio. Por exemplo, o cdigo a seguir repetido cinco vezes. O valor da varivel i comea com 0 e termina com 4, e a sada ser os nmeros de 0 a 4, cada um em sua prpria linha.
var i:int; for (i = 0; i < 5; i++) { trace(i); }

for..in
A repetio for..in itera por meio das propriedades de um objeto ou dos elementos de uma matriz. Por exemplo, voc pode usar uma repetio for..in para iterar por meio das propriedades de um objeto genrico (as propriedades de objeto no so mantidas em uma ordem especfica, por isso elas podem aparecer em uma ordem aparentemente aleatria):
var myObj:Object = {x:20, y:30}; for (var i:String in myObj) { trace(i + ": " + myObj[i]); } // output: // x: 20 // y: 30

Tambm possvel iterar por meio dos elementos de uma matriz:


var myArray:Array = ["one", "two", "three"]; for (var i:String in myArray) { trace(myArray[i]); } // output: // one // two // three

O que voc no pode fazer iterar por meio das propriedades de um objeto se ele for uma ocorrncia de uma classe definida pelo usurio, a menos que a classe seja dinmica. Mesmo com ocorrncias de classes dinmicas, ser possvel iterar somente por meio de propriedades adicionadas dinamicamente.

for each..no
A repetio for each..in itera por meio dos itens de um conjunto, que podem ser tags em um objeto XML ou XMLList, os valores mantidos pelas propriedades do objeto ou os elementos de uma matriz. Por exemplo, como mostra o trecho a seguir, voc pode usar uma repetio for each..in para iterar por meio das propriedades de um objeto genrico, mas diferentemente da repetio for..in, a varivel do iterador em uma repetio for each..in contm o valor mantido pela propriedade em vez do nome da propriedade:

PROGRAMAO DO ACTIONSCRIPT 3.0 79


Linguagem e sintaxe do ActionScript

var myObj:Object = {x:20, y:30}; for each (var num in myObj) { trace(num); } // output: // 20 // 30

Voc pode iterar por meio de um objeto XML ou XMLList, como mostra o seguinte exemplo:
var myXML:XML = <users> <fname>Jane</fname> <fname>Susan</fname> <fname>John</fname> </users>; for each (var item in myXML.fname) { trace(item); } /* output Jane Susan John */

Tambm possvel iterar por meio dos elementos de uma matriz, como mostra este exemplo:
var myArray:Array = ["one", "two", "three"]; for each (var item in myArray) { trace(item); } // output: // one // two // three

Voc no poder iterar por meio das propriedades de um objeto se o objeto for uma ocorrncia de uma classe selada. Mesmo para ocorrncias de classes dinmicas, no possvel iterar por meio de uma propriedade fixa, que a propriedade especificada como parte da definio de classe.

while
A repetio while como uma instruo if que repetida desde que a condio seja true. Por exemplo, o cdigo a seguir produz a mesma sada que o exemplo da repetio for:
var i:int = 0; while (i < 5) { trace(i); i++; }

PROGRAMAO DO ACTIONSCRIPT 3.0 80


Linguagem e sintaxe do ActionScript

Uma desvantagem do uso de uma repetio while em vez de for que repeties infinitas so mais fceis de escrever com repeties while. O exemplo da repetio for no ser compilado se voc omitir a expresso que incrementa a varivel do contador, mas o exemplo da repetio while ser compilado se essa etapa for omitida. Sem a expresso que incrementa i, a repetio se torna infinita.

do..while
A repetio do..while uma repetio while que garante que o bloco de cdigo seja executado pelo menos uma vez, porque a condio verificada depois que o bloco executado. O cdigo a seguir mostra um exemplo simples de uma repetio do..while que gera sada mesmo que a condio no seja atendida:
var i:int = 5; do { trace(i); i++; } while (i < 5); // output: 5

Funes
As funes so blocos de cdigo que executam tarefas especficas e podem ser reutilizados no seu programa. H dois tipos de funes no ActionScript 3.0: mtodos e fechamentos de funo. O fato de uma funo ser uma chamada a um mtodo ou um fechamento de funo depende do contexto na qual ela definida. Uma funo chamada de mtodo quando especificada como parte de uma definio de classe ou anexada a uma ocorrncia de um objeto. Uma funo chamada de fechamento de funo quando definida de qualquer outra forma. As funes sempre foram extremamente importantes no ActionScript. No ActionScript 1.0, por exemplo, a palavrachave class no existir, por isso as "classes" eram definidas pelas funes do construtor. Embora a palavra-chave class tenha sido adicionada linguagem, ainda importante ter um bom entendimento das funes para aproveitar todas as vantagens que ela tem a oferecer. Isso pode ser um desafio para os programadores que esperam que as funes do ActionScript se comportem da mesma forma que as funes em linguagens como C++ ou Java. Embora a definio e a chamada de funes bsicas no apresentem um desafio aos programadores experientes, alguns recursos mais avanados das funes do ActionScript exigem uma explicao.

Conceitos de funes bsicas


Esta seo discute as tcnicas de definio e chamada de funes bsicas. Chamada de funes Uma funo chamada usando seu identificador seguido de um operador parnteses (()). O operador parnteses delimita qualquer parmetro de funo que voc deseja enviar para a funo. Por exemplo, a funo trace(), que uma funo de nvel superior no ActionScript 3.0, usada em todo este manual:
trace("Use trace to help debug your script");

Se estiver chamando uma funo sem nenhum parmetro, voc dever usar parnteses vazios. Por exemplo, voc pode usar o mtodo Math.random(), que no usa nenhum parmetro, para gerar um nmero aleatrio:
var randomNum:Number = Math.random();

PROGRAMAO DO ACTIONSCRIPT 3.0 81


Linguagem e sintaxe do ActionScript

Definio de suas prprias funes H duas maneiras de definir uma funo no ActionScript 3.0: voc pode usar uma instruo de funo ou uma expresso de funo. A escolha da tcnica depende de sua preferncia por um estilo de programao mais esttico ou dinmico. Defina suas funes com instrues de funo se preferir uma programao de modo esttico ou estrito. Defina as funes com expresses de funo se tiver uma necessidade especfica para isso. As expresses de funo so usadas com mais freqncia em programao de modo dinmico ou padro. Instrues de funo A instruo de funo a tcnica preferida para definir funes no modo estrito. Uma instruo de funo comea com a palavra-chave function e, em seguida, vem:

O nome da funo Os parmetros, em uma lista delimitada por vrgula e entre parnteses O corpo da funo, ou seja, o cdigo do ActionScript a ser executado quando a funo chamada, delimitado por
chaves Por exemplo, o cdigo a seguir cria uma funo que define um parmetro e chama a funo usando a seqncia de caracteres "hello" como valor do parmetro:
function traceParameter(aParam:String) { trace(aParam); } traceParameter("hello"); // hello

Expresses de funo A segunda forma de declarar uma funo usar uma instruo de atribuio com uma expresso de funo, que s vezes tambm chamada de literal de funo ou funo annima. Este mtodo mais detalhado e amplamente usado nas verses anteriores do ActionScript. Uma instruo de atribuio com uma expresso de funo comea com a palavra-chave var e, em seguida, vem:

O nome da funo O operador dois-pontos (:) A classe Function para indicar o tipo de dados O operador de atribuio (=) A palavra-chave function Os parmetros, em uma lista delimitada por vrgula e entre parnteses O corpo da funo, ou seja, o cdigo do ActionScript a ser executado quando a funo chamada, delimitado por
chaves Por exemplo, o seguinte cdigo declara a funo traceParameter usando uma expresso de funo:
var traceParameter:Function = function (aParam:String) { trace(aParam); }; traceParameter("hello"); // hello

PROGRAMAO DO ACTIONSCRIPT 3.0 82


Linguagem e sintaxe do ActionScript

Observe que um nome de funo no especificado da mesma forma que em uma instruo de funo. Outra diferena importante entre a expresso de funo e a instruo de funo que a primeira uma expresso e no uma instruo. isso significa que uma expresso de funo no suficiente como uma instruo de funo. Ela s pode ser usada como parte de uma instruo, em geral, de atribuio. O exemplo a seguir mostra uma expresso de funo atribuda a um elemento de matriz:
var traceArray:Array = new Array(); traceArray[0] = function (aParam:String) { trace(aParam); }; traceArray[0]("hello");

Escolha entre instrues e expresses Como regra geral, use uma instruo de funo a menos que circunstncias especficas exijam o uso de uma expresso. As instrues de funo so menos detalhadas e fornecem uma experincia mais consistente entre o modo estrito e o padro do que as expresses de funo. As instrues de funo so mais fceis de ler do que as instrues de atribuio que contm expresses de funo. As instrues de funo tornam o cdigo mais conciso; elas so menos confusas do que as expresses de funo, que requerem o uso das palavras-chave var e function. As instrues de funo fornecem uma experincia mais consistente entre os dois modos de compilao j que possvel usar a sintaxe de pontos nos modos estrito e padro para chamar um mtodo declarado usando uma instruo de funo. Isso no necessariamente verdadeiro para mtodos declarados com uma expresso de funo. Por exemplo, o cdigo a seguir define uma classe chamada Example com dois mtodos: methodExpression(), que declarado com uma expresso de funo, e methodStatement(), que declarado com uma instruo de funo. No modo estrito, no possvel usar a sintaxe de pontos para chamar o mtodo methodExpression().
class Example { var methodExpression = function() {} function methodStatement() {} } var myEx:Example = new Example(); myEx.methodExpression(); // error in strict mode; okay in standard mode myEx.methodStatement(); // okay in strict and standard modes

As expresses de funo so consideradas mais adequadas para a programao direcionada ao comportamento de tempo de execuo ou dinmico. Se preferir usar o modo estrito, mas tambm precisar chamar um mtodo declarado com uma expresso de funo, voc poder usar qualquer uma destas duas tcnicas. Primeiro, voc pode chamar o mtodo usando colchetes ([]) em vez do operador ponto (.). A chamada de mtodo a seguir bem-sucedida nos modos estrito e padro:
myExample["methodLiteral"]();

Em segundo lugar, voc pode declarar a classe inteira como uma classe dinmica. Embora isso permita chamar o mtodo usando o operador dot, o lado negativo que voc sacrifica algumas funcionalidades do modo estrito para todas as ocorrncias dessa classe. Por exemplo, o compilador no ir gerar um erro se voc tentar acessar uma propriedade indefinida em uma ocorrncia de uma classe dinmica. H algumas circunstncias nas quais as expresses de funo so teis. Um uso comum de expresses de funo para funes que so usadas uma nica vez e, depois, so descartadas. Outro uso menos comum para anexar uma funo a uma propriedade de prottipo. Para obter mais informaes, consulte Objeto de prottipo na pgina 123.

PROGRAMAO DO ACTIONSCRIPT 3.0 83


Linguagem e sintaxe do ActionScript

H duas diferenas sutis entre as instrues de funo e as expresses de funo que devem ser levadas em conta ao escolher a tcnica usada. A primeira diferena que as expresses de funo no existem independentemente como objetos em relao ao gerenciamento de memria e coleta de lixo. Em outras palavras, durante a atribuio de uma expresso de funo a outro objeto, como um elemento de matriz ou uma propriedade de objeto, voc cria a nica referncia a essa expresso de funo no cdigo. Se a matriz ou o objeto ao qual a expresso de funo anexada sair do escopo ou no estiver disponvel, no ser mais possvel acessar a expresso de funo. Se a matriz ou o objeto forem excludos, a memria usada pela expresso de funo se tornar qualificada para a coleta de lixo, o que significa que a memria qualificada para ser reivindicada e reutilizada para outros fins. O exemplo a seguir mostra que, para uma expresso de funo, assim que a propriedade com a expresso atribuda for excluda, a funo no ficar mais disponvel. A classe Test dinmica, o que significa que possvel adicionar uma propriedade chamada functionExp que mantm uma expresso de funo. A funo functionExp() pode ser chamada com o operador dot, mas assim que a propriedade functionExp for excluda, a funo ficar inacessvel.
dynamic class Test {} var myTest:Test = new Test(); // function expression myTest.functionExp = function () { trace("Function expression") }; myTest.functionExp(); // Function expression delete myTest.functionExp; myTest.functionExp(); // error

Se, no entanto, for definida com uma instruo de funo, a funo existir como seu prprio objeto e continuar a existir mesmo depois que a propriedade qual est anexada for excluda. O operador delete funciona apenas em propriedades de objetos, por isso at mesmo uma chamada para excluir a funo stateFunc() em si no funciona.
dynamic class Test {} var myTest:Test = new Test(); // function statement function stateFunc() { trace("Function statement") } myTest.statement = stateFunc; myTest.statement(); // Function statement delete myTest.statement; delete stateFunc; // no effect stateFunc();// Function statement myTest.statement(); // error

A segunda diferena entre as instrues de funo e as expresses de funo que as primeiras existem em todo o escopo no qual so definidas, incluindo em instrues que aparecem antes da instruo de funo. As expresses de funo, porm, so definidas somente para instrues subseqentes. Por exemplo, o seguinte cdigo chama com xito a funo scopeTest() antes que ela seja definida:
statementTest(); // statementTest function statementTest():void { trace("statementTest"); }

As expresses de funo no esto disponveis antes de serem definidas, por isso o seguinte cdigo resulta em um erro de tempo de execuo:

PROGRAMAO DO ACTIONSCRIPT 3.0 84


Linguagem e sintaxe do ActionScript

expressionTest(); // run-time error var expressionTest:Function = function () { trace("expressionTest"); }

Retorno de valores de funes Para retornar um valor de sua funo, use a instruo return seguida pela expresso ou pelo valor literal que deseja retornar. Por exemplo, o seguinte cdigo retorna uma expresso representando o parmetro:
function doubleNum(baseNum:int):int { return (baseNum * 2); }

Observe que a instruo return encerra a funo, de forma que as instrues abaixo de uma instruo return no so executadas, como a seguir:
function doubleNum(baseNum:int):int { return (baseNum * 2); trace("after return"); // This trace statement will not be executed. }

No modo estrito, voc deve retornar um valor do tipo apropriado se decidir especificar um tipo de retorno. Por exemplo, o cdigo a seguir gera um erro no modo estrito, porque no retorna um valor vlido:
function doubleNum(baseNum:int):int { trace("after return"); }

Funes aninhadas possvel aninhar funes, o que significa que as funes podem ser declaradas dentro de outras. Uma funo aninhada est disponvel apenas dentro da funo pai, a menos que uma referncia a ela seja transmitida ao cdigo externo. Por exemplo, o seguinte cdigo declara duas funes aninhadas dentro da funo getNameAndVersion():
function getNameAndVersion():String { function getVersion():String { return "10"; } function getProductName():String { return "Flash Player"; } return (getProductName() + " " + getVersion()); } trace(getNameAndVersion()); // Flash Player 10

Quando funes aninhadas so transmitidas ao cdigo externo, elas so transmitidas como fechamentos de funo, o que significa que a funo retm as definies que esto no escopo quando a funo definida. Para obter mais informaes, consulte Escopo da funo na pgina 90.

PROGRAMAO DO ACTIONSCRIPT 3.0 85


Linguagem e sintaxe do ActionScript

Parmetros de funo
O ActionScript 3.0 fornece algumas funcionalidades para parmetros de funo que podem parecer novas aos programadores que no conhecem a linguagem. Embora a idia de transmitir parmetros por valor ou referncia no deva ser nova para a maioria dos programadores, o objeto arguments e o parmetro ... (rest) talvez sejam uma novidade para muitos. Transmisso de argumentos por valor ou referncia Em muitas linguagens de programao, importante entender a distino entre transmitir argumentos por valor ou por referncia, pois ela pode afetar a forma como o cdigo criado. Ser transmitido por valor significa que o valor do argumento copiado em uma varivel local para uso dentro da funo. Ser transmitido por referncia significa que apenas uma referncia ao argumento transmitido, em vez do valor real. No feita nenhuma cpia do argumento real. Em vez disso, uma referncia varivel transmitida como um argumento criada e atribuda a uma varivel local para uso dentro da funo. Como uma referncia a uma varivel fora da funo, a varivel local fornece a capacidade de alterar o valor da varivel original. No ActionScript 3.0, todos os argumentos so transmitidos por referncia, porque todos os valores so armazenados como objetos. Entretanto, os objetos que pertencem aos tipos de dados primitivos, que incluem Boolean, Number, int, uint e String, tm operadores especiais que fazem com que se comportem como se fossem transmitidos por valor. Por exemplo, o seguinte cdigo cria uma funo chamada passPrimitives() que define dois parmetros chamados xParam e yParam, ambos do tipo int. Esses parmetros so semelhantes s variveis locais declaradas no corpo da funo passPrimitives(). Quando a funo chamada com os argumentos xValue e yValue, os parmetros xParam e yParam so inicializados com referncias aos objetos int representados por xValue e yValue. Como so primitivos, os argumentos se comportam como se fossem transmitidos por valor. Embora xParam e yParam inicialmente contenham apenas referncias aos objetos xValue e yValue, quaisquer alteraes s variveis dentro do corpo da funo gera novas cpias dos valores na memria.
function passPrimitives(xParam:int, yParam:int):void { xParam++; yParam++; trace(xParam, yParam); } var xValue:int = 10; var yValue:int = 15; trace(xValue, yValue);// 10 15 passPrimitives(xValue, yValue); // 11 16 trace(xValue, yValue);// 10 15

Dentro da funo passPrimitives(), os valores de xParam e yParam so incrementados, mas isso no afeta os valores de xValue e yValue, como mostra a ltima instruo trace. Isso seria vlido mesmo que os parmetros fossem nomeados de forma idntica s variveis, xValue e yValue, porque xValue e yValue dentro da funo apontariam para novos locais na memria que existem separadamente das variveis de mesmo nome fora da funo. Todos os outros objetos, ou seja, objetos que no pertencem aos tipos de dados primitivos, so transmitidos por referncia, o que fornece a capacidade de alterar o valor das variveis originais. Por exemplo, o cdigo a seguir cria um objeto chamado objVar com duas propriedades, x e y. O objeto transmitido como um argumento para a funo passByRef(). Como no de um tipo primitivo, o objeto no apenas transmitido por referncia, mas tambm permanece como uma. Isso significa que as alteraes feitas aos parmetros dentro da funo afetaro as propriedades do objeto fora da funo.

PROGRAMAO DO ACTIONSCRIPT 3.0 86


Linguagem e sintaxe do ActionScript

function passByRef(objParam:Object):void { objParam.x++; objParam.y++; trace(objParam.x, objParam.y); } var objVar:Object = {x:10, y:15}; trace(objVar.x, objVar.y); // 10 15 passByRef(objVar); // 11 16 trace(objVar.x, objVar.y); // 11 16

O parmetro objParam referencia o mesmo objeto que a varivel global objVar. Como voc pode ver nas instrues trace do exemplo, as alteraes nas propriedades x e y do objeto objParam so refletidas no objeto objVar. Valores de parmetro padro Nova no ActionScript 3.0 a capacidade de declarar valores de parmetro padro para uma funo. Se uma chamada a uma funo com valores de parmetro padro omitir um parmetro com valores padro, ser usado o valor especificado na definio de funo para esse parmetro. Todos os parmetros com valores padro devem ser colocados no final da lista de parmetros. Os valores atribudos como padro devem ser constantes de tempo de compilao. A existncia de um valor padro para um parmetro efetivamente o torna um parmetro opcional. Um parmetro sem um valor padro considerado um parmetro necessrio. Por exemplo, o seguinte cdigo cria uma funo com trs parmetros, dois dos quais tm valores padro. Quando a funo chamada com apenas um parmetro, os valores padro para os parmetros so usados.
function defaultValues(x:int, y:int = 3, z:int = 5):void { trace(x, y, z); } defaultValues(1); // 1 3 5

O objeto arguments Quando parmetros so transmitidos a uma funo, possvel usar o objeto arguments para acessar informaes sobre esses parmetros. Alguns aspectos importantes do objeto arguments incluem o seguinte:

O objeto arguments uma matriz que inclui todos os parmetros transmitidos funo. A propriedade arguments.length relata o nmero de argumentos transmitidos funo. A propriedade arguments.callee fornece uma referncia funo em si, que til para chamadas recursivas s
expresses de funo. Nota: O objeto arguments no estar disponvel se qualquer parmetro for chamado de arguments ou se for usado o parmetro ... (rest). Se o objeto de argumentos estiver referenciado no corpo de uma funo, o ActionScript 3.0 permitir que as chamadas de funo incluam mais parmetros do que os especificados na definio de funo, mas ir gerar um erro no compilador no modo restrito, se o nmero de parmetros no corresponder ao nmero de parmetros necessrios (e, opcionalmente, quaisquer parmetros opcionais). possvel usar o aspecto de matriz do objeto arguments para acessar qualquer parmetro transmitido funo, independentemente de ele ser especificado na definio de funo. O exemplo a seguir, que compilado apenas no modo padro, usa a matriz arguments com a propriedade arguments.length para rastrear todos os parmetros transmitidos para a funo traceArgArray():

PROGRAMAO DO ACTIONSCRIPT 3.0 87


Linguagem e sintaxe do ActionScript

function traceArgArray(x:int):void { for (var i:uint = 0; i < arguments.length; i++) { trace(arguments[i]); } } traceArgArray(1, 2, 3); // // // // output: 1 2 3

A propriedade arguments.callee, em geral, usada em funes annimas para criar recurso. Voc pode us-la para adicionar flexibilidade ao seu cdigo. Se o nome de uma funo recursiva for alterado durante o ciclo de desenvolvimento, no ser necessrio se preocupar em alterar a chamada recursiva no corpo da funo se usar arguments.callee em vez do nome de funo. A propriedade arguments.callee usada na seguinte expresso de funo para permitir recurso:
var factorial:Function = function (x:uint) { if(x == 0) { return 1; } else { return (x * arguments.callee(x - 1)); } } trace(factorial(5)); // 120

Caso voc use o parmetro ... (rest) na declarao de funo, o objeto arguments no ficar disponvel. Em vez disso, voc ter de acessar os parmetros usando os nomes de parmetro declarados para eles. Voc tambm deve ter o cuidado de evitar o uso da seqncia de caracteres "arguments" como parmetro, porque ela ir obscurecer o objeto arguments. Por exemplo, se a funo traceArgArray() for reescrita de forma que um parmetro arguments seja adicionado, as referncias a arguments no corpo da funo iro se referir ao parmetro e no ao objeto arguments. O seguinte cdigo no produz nenhuma sada:
function traceArgArray(x:int, arguments:int):void { for (var i:uint = 0; i < arguments.length; i++) { trace(arguments[i]); } } traceArgArray(1, 2, 3); // no output

PROGRAMAO DO ACTIONSCRIPT 3.0 88


Linguagem e sintaxe do ActionScript

O objeto arguments nas verses anteriores do ActionScript tambm continham uma propriedade chamada caller, que uma referncia funo que chamava a funo atual. A propriedade caller no est presente no ActionScript 3.0, mas, se uma referncia funo de chamada for necessria, voc poder alterar a funo de chamada para que ela transmita um parmetro extra que faa referncia a si mesmo. O parmetro ... (rest) O ActionScript 3.0 apresenta uma nova declarao de parmetro chamada de parmetro ... (rest). Esse parmetro permite especificar um parmetro de matriz que aceita uma grande quantidade de argumentos delimitados por vrgula. O parmetro pode ter qualquer nome que no seja uma palavra reservada. Essa declarao de parmetro deve ser o ltimo parmetro especificado. O uso desse parmetro torna o objeto arguments indisponvel. Embora o parmetro ... (rest) oferea a mesma funcionalidade que a matriz arguments e a propriedade arguments.length, ele no fornece uma funcionalidade semelhante fornecida por arguments.callee. Voc deve se certificar de que no ser preciso usar arguments.callee antes de usar o parmetro ... (rest). O exemplo a seguir reescreve a funo traceArgArray() usando o parmetro ... (rest) em vez do objeto arguments:
function traceArgArray(... args):void { for (var i:uint = 0; i < args.length; i++) { trace(args[i]); } } traceArgArray(1, 2, 3); // // // // output: 1 2 3

O parmetro ... (rest) tambm pode ser usado com outros parmetros, contanto que o ltimo parmetro seja listado. O exemplo a seguir modifica a funo traceArgArray() para que seu primeiro parmetro, x, seja do tipo int e o segundo use o parmetro ... (rest). A sada ignora o primeiro valor, porque o primeiro parmetro no faz mais parte da matriz criada pelo parmetro ... (rest).
function traceArgArray(x: int, ... args) { for (var i:uint = 0; i < args.length; i++) { trace(args[i]); } } traceArgArray(1, 2, 3); // output: // 2 // 3

Funes como objetos


As funes no ActionScript 3.0 so objetos. Durante a criao de uma funo, voc cria um objeto que no apenas pode ser transmitido como um parmetro para outra funo, mas tambm possui propriedades e mtodos anexados.

PROGRAMAO DO ACTIONSCRIPT 3.0 89


Linguagem e sintaxe do ActionScript

As funes transmitidas como argumentos para outra funo so transmitidas por referncia e no por valor. Durante a transmisso de uma funo como um argumento, usado apenas o identificador e no o operador parnteses usado para chamar o mtodo. Por exemplo, o cdigo a seguir transmite uma funo chamada clickListener() como um argumento para o mtodo addEventListener():
addEventListener(MouseEvent.CLICK, clickListener);

O mtodo Array.sort() tambm define um parmetro que aceita uma funo. Para obter um exemplo de uma funo de classificao personalizada que usada como um argumento para a funo Array.sort(), consulte Classificao de uma matriz na pgina 165. Embora possa parecer estranho aos programadores que no conhecem o ActionScript, as funes podem ter propriedades e mtodos, assim como qualquer outro objeto. Na verdade, cada funo possui uma propriedade somente leitura chamada length que armazena o nmero de parmetros definido para a funo. Isso diferente na propriedade arguments.length, que relata o nmero de argumentos enviados funo. Lembre-se de que, no ActionScript, o nmero de argumentos enviados a uma funo pode exceder o nmero de parmetros definido para ela. O exemplo a seguir, que compilado somente no modo padro porque o modo estrito requer uma correspondncia exata entre o nmero de argumentos transmitidos e o nmero de parmetros definido, mostra a diferena entre as duas propriedades:
// Compiles only in standard mode function traceLength(x:uint, y:uint):void { trace("arguments received: " + arguments.length); trace("arguments expected: " + traceLength.length); } traceLength(3, 5, 7, 11); /* output: arguments received: 4 arguments expected: 2 */

No modo padro, possvel especificar suas prprias propriedades de funo definindo-as fora do corpo da funo. As propriedades de funo podem servir como propriedades quase estticas que permitem salvar o estado de uma varivel relacionada funo. Por exemplo, voc pode querer controlar o nmero de vezes que uma funo especfica chamada. Essa funcionalidade pode ser til quando voc escreve um jogo e deseja controlar o nmero de vezes que um usurio usa um comando especifico, embora tambm seja possvel usar uma propriedade de classe esttica para isso. O exemplo a seguir, que compilado somente no modo padro porque o modo estrito no permite adicionar propriedades dinmicas s funes, cria uma propriedade de funo fora da declarao de funo e incrementa a propriedade sempre que a funo chamada:
// Compiles only in standard mode var someFunction:Function = function ():void { someFunction.counter++; } someFunction.counter = 0; someFunction(); someFunction(); trace(someFunction.counter); // 2

PROGRAMAO DO ACTIONSCRIPT 3.0 90


Linguagem e sintaxe do ActionScript

Escopo da funo
Um escopo de funo determina no apenas o local em um programa no qual a funo pode ser chamada, mas tambm as definies que ela pode acessar. As mesmas regras de escopo vlidas para os identificadores de varivel se aplicam aos identificadores de funo. Uma funo declarada no escopo global est disponvel em todo o cdigo. Por exemplo, o ActionScript 3.0 contm funes globais, tais como isNaN() e parseInt(), que esto disponveis em qualquer lugar no seu cdigo. Uma funo aninhada (uma funo declarada dentro de outra funo) pode ser usada em qualquer lugar na funo na qual ela foi declarada. A cadeia do escopo Sempre que uma funo comea com a execuo, vrios objetos e propriedades so criados. Primeiro, criado um objeto especial chamado objeto de ativao que armazena os parmetros e quaisquer variveis locais ou funes declaradas no corpo da funo. No possvel acessar o objeto de ativao diretamente, porque ele um mecanismo interno. Em segundo lugar, criada uma cadeia do escopo que contm uma lista ordenada de objetos na qual o Flash Player ou o Adobe AIR verifica as declaraes de identificador. Cada funo executada tem uma cadeia de escopo que armazenada em uma propriedade interna. Para uma funo aninhada, a cadeia do escopo comea com seu prprio objeto de ativao, seguido pelo objeto de ativao de sua funo pai. A cadeia continua assim at atingir o objeto global. O objeto global criado quando um programa do ActionScript comea e contm todas as variveis e funes globais. Fechamentos de funo Um fechamento de funo um objeto que contm um instantneo de uma funo e seu ambiente lxico. O ambiente lxico de uma funo inclui todas as variveis, propriedades, mtodos e objetos na cadeia do escopo da funo, alm de seus valores. Os fechamentos de funo so criados sempre que uma funo executada independentemente de um objeto ou uma classe. O fato de que os fechamentos de funo mantm o escopo no qual eles foram definidos cria resultados interessantes quando uma funo transmitida como um argumento ou um valor de retorno em um escopo diferente. Por exemplo, o cdigo a seguir cria duas funes: foo(), que retorna uma funo aninhada chamada rectArea() que calcula a rea de um retngulo, e bar(), que chama foo() e armazena o fechamento de funo retornado em uma varivel chamada myProduct. Muito embora a funo bar() defina sua prpria varivel local x (com um valor 2), quando o fechamento de funo myProduct() chamado, ela mantm a varivel x (com um valor 40) definida na funo foo(). A funo bar(), portanto, retorna o valor 160 em vez de 8.
function foo():Function { var x:int = 40; function rectArea(y:int):int // function closure defined { return x * y } return rectArea; } function bar():void { var x:int = 2; var y:int = 4; var myProduct:Function = foo(); trace(myProduct(4)); // function closure called } bar(); // 160

PROGRAMAO DO ACTIONSCRIPT 3.0 91


Linguagem e sintaxe do ActionScript

Os mtodos se comportam de forma semelhante pois tambm mantm as informaes sobre o ambiente lxico no qual so criados. Essa caracterstica a mais notvel quando um mtodo extrado de sua ocorrncia, que cria um mtodo vinculado. A principal diferena entre um fechamento de funo e um mtodo vinculado que o valor da palavrachave this em um mtodo vinculado sempre se refere ocorrncia qual ele foi inicialmente anexado, enquanto que, em um fechamento de funo, o valor da palavra-chave this pode ser alterado. Para obter mais informaes, consulte Mtodos na pgina 100.

92

Captulo 5: Programao orientada a objetos no ActionScript


Este captulo descreve os elementos do ActionScript que oferecem suporte OOP (Programao orientada a objetos). O captulo no descreve princpios de OOP gerais, como design de objeto, abstrao, encapsulamento, herana e polimorfismo. Ele se concentra em como aplicar esses princpios usando o ActionScript 3.0. Devido a razes do ActionScript como uma linguagem de script, o suporte ao OOP do ActionScript 3.0 opcional. Isso fornece aos programadores flexibilidade para escolherem a melhor abordagem para projetos de vrios escopos e complexidades. Para tarefas pequenas, voc pode chegar concluso de que usar o ActionScript com um paradigma de programao de procedimento tudo o que voc precisa. Para projetos maiores, aplicar princpios de OOP pode fazer com que o cdigo fique mais fcil de ser compreendido, mantido e estendido.

Noes bsicas de programao orientada a objetos


Introduo programao orientada a objetos
OOP (Programao orientada a objetos) uma maneira de organizar o cdigo em um programa agrupando-o em objetos, elementos individuais que incluem informaes (valores de dados) e funcionalidade. O uso de uma abordagem orientada a objetos para organizar um programa permite agrupar partes especficas de informaes (por exemplo, informaes sobre msica, como ttulo do lbum, ttulo da faixa ou nome do artista) juntamente com a funcionalidade comum ou com as aes associadas a essas informaes (como adicionar faixa lista de reproduo ou reproduzir todas as canes desse artista). Esses itens so combinados em nico item, um objeto (por exemplo, um Album ou MusicTrack). Vrios benefcios so obtidos quando se pode agrupar esses valores e funes em conjunto, incluindo apenas a necessidade de manter o rastreio de uma nica varivel, em vez de vrias, organizar a funcionalidade relacionada em conjunto, e poder estruturar programas de maneiras muito correspondentes ao mundo real.

Tarefas de programao orientadas a objetos comuns


Na prtica, a programao orientada a objetos tem duas partes. Uma parte so as estratgias e tcnicas para criar um programa (freqentemente chamada de design orientado a objetos). Esse um assunto abrangente e no discutido neste captulo. A outra parte da OOP so as estruturas reais de programao que esto disponveis em uma determinada linguagem de programao para criar um programa usando uma abordagem orientada a objetos. Este captulo abrange as seguintes tarefas comuns na OOP:

Definio de classes Criao de propriedades, mtodos e obteno e definio de acessor (mtodos de acessor) Controle do acesso a classes, propriedades, mtodos e acessores Criao de propriedades e mtodos estticos Criao de estruturas semelhantes a enumerao Definio e uso de interfaces Trabalho com herana, incluindo substituio de elementos de classes

PROGRAMAO DO ACTIONSCRIPT 3.0 93


Programao orientada a objetos no ActionScript

Conceitos e termos importantes


A lista de referncia a seguir contm termos importantes usados neste captulo:

Atributo: Uma caracterstica atribuda a um elemento de classe (como uma propriedade ou mtodo) na definio
de classe. Os atributos so usados normalmente para definir se a propriedade ou mtodo estar disponvel para acesso por cdigo em outras partes do programa. Por exemplo, private e public so atributos. Um mtodo particular pode ser chamado apenas pelo cdigo dentro da classe, enquanto um mtodo pblico pode ser chamado por qualquer cdigo no programa.

Classe: A definio da estrutura e o comportamento de objetos de um determinado tipo (como um modelo ou


plano grfico de objetos desse tipo de dados).

Hierarquia de classes: A estrutura de vrias classes relacionadas, especificando a classes que herdam funcionalidade
de outras classes.

Construtor: Um mtodo especial que voc pode definir em uma classe, que chamado quando uma ocorrncia da
classe criada. Um construtor usado normalmente para especificar valores padro ou, de outra forma, executar operaes de configurao do objeto.

Tipo de dados: O tipo de informaes que uma varivel especfica pode armazenar. Em geral, tipo de dados tem o
mesmo significado que classe.

Operador ponto: O sinal de ponto (.), que no ActionScript (e em muitas outras linguagens de programao)
usado para indicar que um nome faz referncia a um elemento filho de um objeto (como uma propriedade ou mtodo). Por exemplo, na expresso myObject.myProperty, o operador ponto indica que o termo myProperty est fazendo referncia a algum valor que um elemento do objeto denominado myObject.

Enumerao: Um conjunto de valores constantes relacionados, agrupados em conjunto por convenincia como
propriedades de uma nica classe.

Herana: O mecanismo da OOP que permite que uma definio de classe inclua toda a funcionalidade de uma
definio de classe diferente (e geralmente seja adicionada a essa funcionalidade).

Ocorrncia: Um objeto real criado em um programa. Espao para nomes: Essencialmente um atributo personalizado que permite controle mais refinado sobre qual
cdigo pode acessar outro cdigo.

Teste dos exemplos do captulo


Talvez voc queira testar algumas das listagens de cdigo de exemplo por si prprio, durante a leitura deste captulo. Como as listagens de cdigo neste captulo tratam principalmente com a definio e a manipulao de tipos de dados, testar os exemplos envolve a criao de uma ocorrncia da classe que est sendo definida, a manipulao dessa ocorrncia usando suas propriedades ou mtodos e a exibio dos valores das propriedades dessa ocorrncia. Para exibir esses valores, grave-os em uma ocorrncia do campo de texto no Palco ou use a funo trace() para imprimir valores no painel Sada. Essas tcnicas so descritas em detalhes em Teste de listagens de cdigo de exemplo dos captulos na pgina 36.

PROGRAMAO DO ACTIONSCRIPT 3.0 94


Programao orientada a objetos no ActionScript

Classes
Uma classe uma representao abstrata de um objeto. Uma classe armazena informaes sobre os tipos de dados que um objeto pode manter e os comportamentos que um objeto pode exibir. A utilidade dessa abstrao pode no ser aparente quando voc grava pequenos scripts que contm apenas alguns objetos que interagem entre si. No entanto, conforme o escopo de um programa aumenta, assim como o nmero de objetos que precisam ser gerenciados, voc pode descobrir que as classes permitem um controle melhor de como os objetos so criados e como eles interagem entre si. J no ActionScript 1.0, os programadores do ActionScript podiam usar objetos Function para criar construes semelhantes a classes. O ActionScript 2.0 adicionou suporte formal para classes com palavras-chave, como class e extends. O ActionScript 3.0 no apenas continua a oferecer suporte s palavras-chave introduzidas no ActionScript 2.0, mas tambm adiciona alguns novos recursos, como controle de acesso aprimorado com os atributos protected e internal, e melhor controle sobre a herana com as palavras-chave final e override. Se voc j tiver criado classes em linguagens de programao, como Java, C++ ou C#, descobrir que o ActionScript fornece uma experincia familiar. O ActionScript compartilha muitas das mesmas palavras-chave e nomes de atributos, como class, extends e public, que so discutidos nas sees a seguir. Nota: Neste captulo, o termo propriedade significa qualquer membro de um objeto ou classe, incluindo variveis, constantes e mtodos. Alm disso, embora os termos classe e esttica sejam sempre usados alternadamente, neste captulo esses termos so distintos. Por exemplo, neste captulo a expresso propriedades de classes fazem referncia a todos os membros de uma classe, em vez de apenas a membros estticos.

Definies de classes
As definies de classes do ActionScript 3.0 usam sintaxe semelhante a usada no ActionScript 2.0. A sintaxe apropriada para uma definio de classe requer a palavra-chave class seguida pelo nome da classe. O corpo da classe que est entre chaves ({}) segue o nome da classe. Por exemplo, o cdigo a seguir cria uma classe denominada Shape que contm uma varivel denominada visible:
public class Shape { var visible:Boolean = true; }

Uma alterao significativa na sintaxe envolve definies de classes que esto dentro de um pacote. No ActionScript 2.0, se uma classe estiver dentro de um pacote, o nome do pacote dever estar includo na declarao da classe. No ActionScript 3.0, que introduz a instruo package, o nome do pacote deve estar includo na declarao do pacote em vez de na declarao da classe. Por exemplo, as seguintes declaraes de classe mostram como a classe BitmapData, que faz parte do pacote flash.display, definida no ActionScript 2.0 e no ActionScript 3.0:
// ActionScript 2.0 class flash.display.BitmapData {} // ActionScript 3.0 package flash.display { public class BitmapData {} }

Atributos de classes O ActionScript 3.0 permite modificar definies de classe usando um dos quatro seguintes atributos:

PROGRAMAO DO ACTIONSCRIPT 3.0 95


Programao orientada a objetos no ActionScript

Atributo
dinmico final internal (padro) public

Definio Permitir que propriedades sejam adicionadas a ocorrncias em tempo de execuo. No deve ser estendido por outra classe. Visvel para referncias dentro do pacote atual. Visvel para referncias em todos os lugares.

Para cada um desses atributos, exceto para internal, voc deve incluir explicitamente o atributo para obter o comportamento associado. Por exemplo, se voc no incluir o atributo dynamic ao definir uma classe, no poder adicionar propriedades a uma ocorrncia da classe em tempo de execuo. Voc atribui explicitamente um atributo colocando-o no incio da definio de classe, conforme demonstrado no cdigo a seguir:
dynamic class Shape {}

Observe que a lista no inclui um atributo denominado abstract. Isso porque as classes abstratas no tm suporte no ActionScript 3.0. Observe tambm que a lista no inclui atributos denominados private e protected. Esses atributos tm significado apenas dentro de uma definio de classe e no podem ser aplicados s prprias classes. Se voc no desejar que uma classe seja publicamente visvel fora de um pacote, coloque-a no pacote e marque-a com o atributo internal. Como alternativa, voc pode omitir os atributos internal e public e o compilador adicionar automaticamente o atributo internal para voc. Para que uma classe seja visvel fora do arquivo de origem no qual ela est definida, coloque a classe na parte inferior do arquivo de origem, abaixo das chaves de fechamento de definio do pacote. Corpo da classe O corpo da classe, que delimitado por chaves, usado para definir as variveis, constantes e mtodos da classe. O exemplo a seguir mostra a declarao da classe Accessibility na API do Adobe Flash Player:
public final class Accessibility { public static function get active():Boolean; public static function updateProperties():void; }

Voc tambm pode definir um espao para nomes dentro de um corpo de classe. O exemplo a seguir mostra como um espao para nomes pode ser definido dentro de um corpo de classe e usado como atributo de um mtodo naquela classe:
public class SampleClass { public namespace sampleNamespace; sampleNamespace function doSomething():void; }

O ActionScript 3.0 permite incluir no apenas definies em um corpo da classe, mas tambm instrues. Instrues que esto dentro de um corpo de classe, mas fora de uma definio do mtodo, so executadas exatamente uma vez, quando a definio da classe encontrada primeiro e o objeto de classe associado criado. O exemplo a seguir inclui uma chamada para uma funo externa, hello(), e uma instruo trace que produz uma mensagem de confirmao quando a classe definida:

PROGRAMAO DO ACTIONSCRIPT 3.0 96


Programao orientada a objetos no ActionScript

function hello():String { trace("hola"); } class SampleClass { hello(); trace("class created"); } // output when class is created hola class created

Em contraste com verses anteriores do ActionScript, no ActionScript 3.0 permitido definir uma propriedade esttica e uma propriedade de ocorrncia com o mesmo nome no mesmo corpo da classe. Por exemplo, o cdigo a seguir declara uma varivel esttica denominada message e uma varivel da ocorrncia do mesmo nome:
class StaticTest { static var message:String = "static variable"; var message:String = "instance variable"; } // In your script var myST:StaticTest = new StaticTest(); trace(StaticTest.message); // output: static variable trace(myST.message); // output: instance variable

Atributos de propriedade de classes


Em discusses do modelo de objeto do ActionScript, o termo property significa qualquer coisa que possa ser um membro de uma classe, incluindo variveis, constantes e mtodos. Isso diferente da maneira como o termo usado na Referncia dos componentes e da linguagem do ActionScript 3.0, em que o termo usado de maneira mais limitada e inclui apenas membros de classes que so variveis ou so definidos por um mtodo getter ou setter. No ActionScript 3.0, h um conjunto de atributos que pode ser usado com qualquer propriedade de uma classe. A tabela a seguir lista esse conjunto de atributos.
Atributo
internal (padro) private protected public static UserDefinedNamespace

Definio Visvel para referncias dentro do mesmo pacote. Visvel para referncias na mesma classe. Visvel para referncias na mesma classe e em classes derivadas. Visvel para referncias em todos os lugares. Especifica que uma propriedade pertence classe, ao contrrio das ocorrncias da classe. Nome do espao para nomes personalizado definido pelo usurio.

Atributos de espao para nomes de controle de acesso


O ActionScript 3.0 fornece quatro atributos especiais que controlam o acesso s propriedades definidas dentro de uma classe: public, private, protected e internal. O atributo public torna a propriedade visvel em qualquer lugar no script. Por exemplo, para disponibilizar um mtodo para o cdigo fora de seu pacote, declare o mtodo com o atributo public. Isso verdadeiro para qualquer propriedade, se ela for declarada usando as palavras-chave var, const ou function.

PROGRAMAO DO ACTIONSCRIPT 3.0 97


Programao orientada a objetos no ActionScript

O atributo private torna a propriedade visvel apenas para chamadores dentro da classe de definio da propriedade. Esse comportamento diferente daquele do atributo private no ActionScript 2.0, que permite que uma subclasse acesse uma propriedade private em uma superclasse. Outra alterao significativa no comportamento que tem a ver com acesso em tempo de execuo. No ActionScript 2.0, a palavra-chave private proibia o acesso apenas em tempo de compilao e era facilmente contornada em tempo de execuo. No ActionScript 3.0, isso no mais verdade. Propriedades que esto marcadas como private no esto disponveis em tempo de compilao e em tempo de execuo. Por exemplo, o seguinte cdigo cria uma classe simples denominada PrivateExample com uma varivel private, e tenta acessar a varivel private de fora da classe. No ActionScript 2.0, o acesso em tempo de compilao era proibido, mas a proibio era facilmente contornada usando o operador de acesso de propriedade ([]), que faz a pesquisa de propriedades em tempo de execuo em vez de em tempo de compilao.
class PrivateExample { private var privVar:String = "private variable"; } var myExample:PrivateExample = new PrivateExample(); trace(myExample.privVar);// compile-time error in strict mode trace(myExample["privVar"]); // ActionScript 2.0 allows access, but in ActionScript 3.0, this is a run-time error.

No ActionScript 3.0, uma tentativa de acessar uma propriedade private usando o operador ponto (myExample.privVar) resultar em um erro em tempo de compilao se voc estiver usando modo estrito. Caso contrrio, o erro ser relatado em tempo de execuo, exatamente como quando voc usa o operador de acesso de propriedade (myExample["privVar"]). A tabela a seguir resume os resultados da tentativa de acessar uma propriedade private que pertence a uma classe selada (no dinmica):
modo Estrito operador ponto (.) operador colchete ([]) erro em tempo de compilao erro em tempo de execuo modo Padro erro em tempo de execuo erro em tempo de execuo

Em classes declaradas com o atributo dynamic, as tentativas de acessar uma varivel private no resultar em um erro em tempo de execuo. Em vez disso, a varivel simplesmente no visvel, portanto, o Flash Player ou o Adobe AIR retorna o valor undefined. No entanto, ocorrer um erro em tempo de compilao, se voc usar o operador ponto no modo estrito. O exemplo a seguir o mesmo do exemplo anterior, exceto que a classe PrivateExample declarada como uma classe dinmica:
dynamic class PrivateExample { private var privVar:String = "private variable"; } var myExample:PrivateExample = new PrivateExample(); trace(myExample.privVar);// compile-time error in strict mode trace(myExample["privVar"]); // output: undefined

As classes dinmicas geralmente retornam o valor undefined em vez de gerar um erro quando o cdigo externo a uma classe tenta acessar uma propriedade private. A tabela a seguir mostra que um erro gerado apenas quando o operador ponto usado para acessar uma propriedade private no modo estrito:

PROGRAMAO DO ACTIONSCRIPT 3.0 98


Programao orientada a objetos no ActionScript

modo Estrito operador ponto (.) operador colchete ([]) erro em tempo de compilao
undefined

modo Padro
undefined undefined

O atributo protected, que novo para o ActionScript 3.0, torna uma propriedade visvel a chamadores dentro de sua prpria classe ou em uma subclasse. Em outras palavras, uma propriedade protected est disponvel dentro de sua prpria classe ou a classes que esto em qualquer lugar abaixo dela na hierarquia de heranas. Isso ser verdadeiro se a subclasse estiver no mesmo pacote ou em um pacote diferente. Para quem est familiarizado com o ActionScript 2.0, essa funcionalidade semelhante ao atributo private no ActionScript 2.0. O atributo protected do ActionScript 3.0 tambm semelhante ao atributo protected no Java, mas difere j que a verso do Java tambm permite acesso a chamadores dentro do mesmo pacote. O atributo protected til quando voc tem uma varivel ou mtodo que as subclasses precisam, mas que voc deseja ocultar do cdigo que est fora da cadeia de heranas. O atributo internal, que novo para o ActionScript 3.0, torna uma propriedade visvel a chamadores dentro de seu prprio pacote. Este o atributo padro do cdigo dentro de um pacote e se aplica a qualquer propriedade que no tenha nenhum dos seguintes atributos:

public private protected

um espao para nomes definido pelo usurio


O atributo internal semelhante ao controle de acesso padro no Java, embora no Java no haja nenhum nome explcito para este nvel de acesso, e ele pode ser alcanado apenas por meio da omisso de qualquer outro modificador de acesso. O atributo internal est disponvel no ActionScript 3.0 para fornecer a opo de indicar explicitamente a inteno tornar a propriedade visvel apenas para chamadores dentro de seu prprio pacote.

atributo static
O atributo static, que pode ser usado com propriedades declaradas com as palavras-chave var, const ou function, permite anexar uma propriedade classe em vez de s ocorrncias da classe. O cdigo externo classe deve chamar propriedades estticas usando o nome da classe em vez do nome de uma ocorrncia. As propriedades estticas no so herdadas pelas subclasses, mas fazem parte da cadeia de escopos de uma subclasse. Isso significa que dentro do corpo de uma subclasse, uma varivel ou mtodo esttico pode ser usado sem fazer referncia classe na qual ele foi definido. Para obter mais informaes, consulte Propriedades estticas no herdadas na pgina 116.

Atributos de espao para nomes definidos pelo usurio


Como alternativa aos atributos de controle de acesso predefinidos, voc pode criar um espao para nomes personalizado para uso como um atributo. Apenas um atributo de espao para nomes pode ser usado por definio, e voc no pode usar um atributo de espao para nomes em combinao com qualquer um dos atributos de controle de acesso (public, private, protected, internal). Para obter mais informaes sobre como usar espaos para nomes, consulte Espaos para nomes na pgina 43.

PROGRAMAO DO ACTIONSCRIPT 3.0 99


Programao orientada a objetos no ActionScript

Variveis
As variveis podem ser declaradas com as palavras-chave var ou const. Variveis declaradas com a palavra-chave var podem ter seus valores alterados vrias vezes durante a execuo de um script. Variveis declaradas com a palavrachave const so chamadas constants e valores podem ser atribudos a elas apenas uma vez. Uma tentativa de atribuir um novo valor a uma constante inicializada resulta em um erro. Para obter mais informaes, consulte Constantes na pgina 69. Variveis estticas As variveis estticas so declaradas usando uma combinao da palavra-chave static e da instruo var ou const. As variveis estticas que so anexadas a uma classe em vez de a uma ocorrncia de a uma classe so teis para armazenar e compartilhar informaes que se aplicam a uma classe inteira de objetos. Por exemplo, uma varivel esttica ser apropriada se voc desejar manter uma contagem do nmero de vezes que uma classe instanciada ou se desejar armazenar o nmero mximo de ocorrncias da classe que so permitidas. O exemplo a seguir cria uma varivel totalCount para rastrear o nmero de instanciaes de classes e uma constante MAX_NUM para armazenar o nmero mximo de instanciaes. As variveis totalCount e MAX_NUM so estticas porque contm valores que se aplicam classe como um todo em vez de a uma ocorrncia especfica.
class StaticVars { public static var totalCount:int = 0; public static const MAX_NUM:uint = 16; }

O cdigo que externo classe StaticVars e qualquer uma de suas subclasses pode fazer referncia s propriedades totalCount e MAX_NUM apenas por meio da prpria classe. Por exemplo, o cdigo a seguir funciona:
trace(StaticVars.totalCount); // output: 0 trace(StaticVars.MAX_NUM); // output: 16

No possvel acessar variveis estticas por meio de uma ocorrncia da classe, portanto, o cdigo a seguir retorna erros:
var myStaticVars:StaticVars = new StaticVars(); trace(myStaticVars.totalCount); // error trace(myStaticVars.MAX_NUM); // error

Variveis que so declaradas com as palavras-chave static e const devem ser inicializadas ao mesmo tempo em que a constante declarada, como faz a classe StaticVars para MAX_NUM. Voc no pode atribuir um valor a MAX_NUM dentro do construtor ou de um mtodo da ocorrncia. O cdigo a seguir gerar um erro, porque no uma maneira vlida de inicializar uma constante esttica:
// !! Error to initialize static constant this way class StaticVars2 { public static const UNIQUESORT:uint; function initializeStatic():void { UNIQUESORT = 16; } }

PROGRAMAO DO ACTIONSCRIPT 3.0 100


Programao orientada a objetos no ActionScript

Variveis de ocorrncia As variveis de ocorrncia incluem propriedades declaradas com as palavras-chave var e const, mas sem a palavrachave static. As variveis de ocorrncia que so anexadas s ocorrncias da classe em vez de a uma classe inteira so teis para armazenar valores especficos a uma ocorrncia. Por exemplo, a classe Array tem uma propriedade de ocorrncia denominada length que armazena o nmero de elementos da matriz que mantida por uma ocorrncia especfica da classe Array. Variveis de ocorrncia, se declaradas como var ou const, no podem ser substitudas em uma subclasse. No entanto, voc pode alcanar funcionalidade semelhante substituindo variveis pelos mtodos getter e setter. Para obter mais informaes, consulte Mtodos de acessor get e set na pgina 103.

Mtodos
Mtodos so funes que fazem parte de uma definio de classe. Depois que uma ocorrncia da classe criada, um mtodo ligado a essa ocorrncia. Ao contrrio de uma funo declarada fora de uma classe, um mtodo no pode ser usado parte da ocorrncia qual ele est anexado. Os mtodos so definidos usando a palavra-chave function. Assim como em qualquer propriedade de classe, voc pode aplicar atributos de propriedade de classe a mtodos, incluindo um espao para nome privado, protegido, pblico, interno, esttico ou personalizado. Voc pode usar uma instruo de funo da seguinte maneira:
public function sampleFunction():String {}

Ou pode usar uma varivel qual atribuir uma expresso de funo, da seguinte maneira:
public var sampleFunction:Function = function () {}

Na maior parte dos casos convm usar uma instruo function em vez de uma expresso function pelas seguintes razes:

As instrues function so mais concisas e mais fceis de ler. As instrues function permitem usar as palavras-chave override e final. Para obter mais informaes, consulte
Substituio de mtodos na pgina 114.

As instrues function criam uma ligao mais forte entre o identificador, isto , o nome da funo, e o cdigo
dentro do corpo do mtodo. Como o valor de uma varivel pode ser alterado com uma instruo de atribuio, a conexo entre uma varivel e sua expresso de funo pode ser desfeita a qualquer momento. Embora voc possa solucionar esse problema declarando a varivel com const em vez de var, essa tcnica no considerada uma prtica recomendada, porque ela torna cdigo difcil de ler e impede o uso das palavras-chave override e final. Um caso em que voc deve usar uma expresso function ao optar por anexar uma funo ao objeto de prottipo. Para obter mais informaes, consulte Objeto de prottipo na pgina 123.

Mtodos do construtor
Os mtodos de construtor, s vezes chamados simplesmente de construtores, so funes que compartilham o mesmo nome da classe na qual eles so definidos. Qualquer cdigo includo em um mtodo de construtor executado todas as vezes que uma ocorrncia da classe criada com a palavra-chave new. Por exemplo, o cdigo a seguir define uma classe simples denominada Example que contm uma nica propriedade denominada status. O valor inicial da varivel status definido dentro da funo de construtor.

PROGRAMAO DO ACTIONSCRIPT 3.0 101


Programao orientada a objetos no ActionScript

class Example { public var status:String; public function Example() { status = "initialized"; } } var myExample:Example = new Example(); trace(myExample.status); // output: initialized

Os mtodos de construtor podem ser apenas pblicos, mas o uso do atributo public opcional. Voc no pode usar nenhum dos outros especificadores de controle de acesso, inclusive private, protected ou internal, em um construtor. Voc tambm no pode usar um espao para nomes definido pelo usurio com um mtodo de construtor. Um construtor pode fazer uma chamada explcita para o construtor de sua superclasse direta usando a instruo super(). Se o construtor da superclasse no for chamado explicitamente, o compilador inserir automaticamente uma chamada antes da primeira instruo no corpo do construtor. Voc tambm pode chamar mtodos da superclasse usando o prefixo super como uma referncia superclasse. Se voc decidir usar super() e super no mesmo corpo do construtor, verifique se super() chamado primeiro. Caso contrrio, a referncia super no se comportar conforme esperado. O construtor super() deve ser chamado tambm antes de qualquer instruo throw ou return. O exemplo a seguir demonstra o que acontecer se voc tentar usar a referncia super antes de chamar o construtor super(). Uma nova classe, ExampleEx, estende a classe Example. O construtor ExampleEx tenta acessar a varivel status definida em sua superclasse, mas faz isso antes de chamar super(). A instruo trace() dentro do construtor ExampleEx produz o valor null, porque a varivel status no est disponvel at que o construtor super() seja executado.
class ExampleEx extends Example { public function ExampleEx() { trace(super.status); super(); } } var mySample:ExampleEx = new ExampleEx(); // output: null

Embora seja vlido usar a instruo return dentro de um construtor, no permitido retornar um valor. Em outras palavras, a instruo return no deve ter expresses ou valores associados. De forma correspondente, os mtodos do construtor no tm permisso para retornar valores, o que significa que nenhum tipo de retorno pode ser especificado. Se voc no definir um mtodo de construtor em sua classe, o compilador criar automaticamente um construtor vazio. Se a classe estender outra classe, o compilador incluir uma chamada super() no construtor gerado.

Mtodos estticos
Os mtodos estticos, tambm chamados de mtodos de classe, so mtodos que so declarados com a palavra-chave static. Os mtodos estticos que so anexados a uma classe e no em uma ocorrncia de uma classe, so teis para encapsular a funcionalidade que afeta algo diferente do estado de uma ocorrncia individual. Como os mtodos estticos so anexados a uma classe como um todo, eles podem ser acessados apenas por meio de uma classe e no por meio de uma ocorrncia da classe.

PROGRAMAO DO ACTIONSCRIPT 3.0 102


Programao orientada a objetos no ActionScript

Os mtodos estticos so teis para encapsular funcionalidade que no est limitada a afetar o estado das ocorrncias da classe. Em outras palavras, um mtodo dever ser esttico se fornecer funcionalidade que no afete diretamente o valor de uma ocorrncia de classe. Por exemplo, a classe Date tem um mtodo esttico denominado parse(), que obtm uma string e converte-a em um nmero. O mtodo esttico porque no afeta uma ocorrncia individual da classe. Em vez disso, o mtodo parse() obtm uma string que representa um valor de data, analisa-a e retorna um nmero em um formato compatvel com a representao interna de um objeto Date. Esse mtodo no um mtodo da ocorrncia, porque no faz sentido aplicar o mtodo a uma ocorrncia da classe Date. Compare o mtodo esttico parse() com um dos mtodos da ocorrncia da classe Date, como getMonth(). O mtodo getMonth() um mtodo de ocorrncia, porque ele opera diretamente no valor de uma ocorrncia, recuperando um componente especfico, o ms, de uma ocorrncia Date. Como os mtodos estticos no esto ligados a ocorrncias individuais, voc no pode usar as palavras-chave this ou
super dentro do corpo de um mtodo esttico. As referncias this e super tm significado apenas dentro do contexto

de um mtodo de ocorrncia. Em comparao com algumas outras linguagens de programao com base em classe, os mtodos estticos no ActionScript 3.0 no so herdados. Para obter mais informaes, consulte Propriedades estticas no herdadas na pgina 116.

Mtodos de ocorrncia
Mtodos de ocorrncia so mtodos declarados sem a palavra-chave static. Os mtodos de ocorrncia que so anexados a ocorrncias de uma classe e no classe como um todo, so teis para implementar a funcionalidade que afeta ocorrncias individuais de uma classe. Por exemplo, a classe Array contm um mtodo de ocorrncia denominado sort() que opera diretamente em ocorrncias de Array. Dentro do corpo de um mtodo de ocorrncia, as variveis de ocorrncia e estticas esto no escopo, o que significa que as variveis definidas na mesma classe podem ser referenciadas usando um identificador simples. Por exemplo, a seguinte classe, CustomArray, estende a classe Array. A classe CustomArray define uma varivel esttica denominada arrayCountTotal para rastrear o nmero total de ocorrncias da classe, uma varivel de ocorrncia denominada arrayNumber que rastreia a ordem na qual as ocorrncias foram criadas e o mtodo de ocorrncia denominado getPosition() que retorna os valores dessas variveis.
public class CustomArray extends Array { public static var arrayCountTotal:int = 0; public var arrayNumber:int; public function CustomArray() { arrayNumber = ++arrayCountTotal; } public function getArrayPosition():String { return ("Array " + arrayNumber + " of " + arrayCountTotal); } }

PROGRAMAO DO ACTIONSCRIPT 3.0 103


Programao orientada a objetos no ActionScript

Embora o cdigo externo classe deva fazer referncia varivel esttica arrayCountTotal por meio do objeto de classe, usando CustomArray.arrayCountTotal, o cdigo que reside dentro do corpo do mtodo getPosition() pode fazer referncia diretamente varivel esttica arrayCountTotal. Isso verdadeiro mesmo para variveis estticas em superclasses. Apesar das propriedades estticas no serem herdadas no ActionScript 3.0, as propriedades estticas em superclasses esto no escopo. Por exemplo, a classe Array tem algumas variveis estticas, uma das quais uma constante denominada DESCENDING. O cdigo que reside em uma subclasse Array pode fazer referncia constante esttica DESCENDING usando um identificador simples:
public class CustomArray extends Array { public function testStatic():void { trace(DESCENDING); // output: 2 } }

O valor da referncia this dentro do corpo de um mtodo da ocorrncia uma referncia ocorrncia qual o mtodo est anexado. O cdigo a seguir demonstra que a referncia this aponta para a ocorrncia que contm o mtodo:
class ThisTest { function thisValue():ThisTest { return this; } } var myTest:ThisTest = new ThisTest(); trace(myTest.thisValue() == myTest); // output: true

A herana de mtodos de ocorrncia pode ser controlada com as palavras-chave override e final. Voc pode usar o atributo override para redefinir um mtodo herdado e o atributo final para impedir que as subclasses substituam um mtodo. Para obter mais informaes, consulte Substituio de mtodos na pgina 114.

Mtodos de acessor get e set


As funes de acessor get e set, tambm chamadas de getters e setters, permitem aderir aos princpios de programao de ocultao de informaes e encapsulamento enquanto fornece uma interface de programao fcil de usar para as classes criadas. As funes get e set permitem manter as propriedades de classe privadas para a classe, mas permitem que usurios da classe acessem essas propriedades como se fossem acessar uma varivel de classe em vez de chamar um mtodo de classe. A vantagem dessa abordagem que ela permite evitar as funes de acessor tradicional com nomes inadequados, como getPropertyName() e setPropertyName(). Outra vantagem de getters e setters que voc pode evitar ter duas funes voltadas ao pblico para cada propriedade que permitam acesso de leitura e gravao. O seguinte exemplo de classe, denominado GetSet, inclui funes do acessor get e set denominadas publicAccess() que fornecem acesso varivel privada denominada privateProperty:

PROGRAMAO DO ACTIONSCRIPT 3.0 104


Programao orientada a objetos no ActionScript

class GetSet { private var privateProperty:String; public function get publicAccess():String { return privateProperty; } public function set publicAccess(setValue:String):void { privateProperty = setValue; } }

Se voc tentar acessar a propriedade privateProperty diretamente, ocorrer um erro, da seguinte maneira:
var myGetSet:GetSet = new GetSet(); trace(myGetSet.privateProperty); // error occurs

Em vez disso, um usurio da classe GetSet usa alguma coisa que parece ser uma propriedade denominada publicAccess, mas que realmente um par de funes de acessor get e set que operam na propriedade privada denominada privateProperty. O exemplo a seguir instancia a classe GetSet e, em seguida, define o valor da privateProperty usando o acessor pblico denominado publicAccess:
var myGetSet:GetSet = new GetSet(); trace(myGetSet.publicAccess); // output: null myGetSet.publicAccess = "hello"; trace(myGetSet.publicAccess); // output: hello

As funes getter e setter tambm permitem substituir propriedades que so herdadas de uma superclasse, algo que no possvel ao usar variveis de membros de classe normal. As variveis de membros de classe que so declaradas usando a palavra-chave var no podem ser substitudas em uma subclasse. No entanto as propriedades criadas usando as funes getter e setter no tm essa restrio. possvel usar o atributo override nas funes getter e setter que so herdadas de uma superclasse.

Mtodos vinculados
Um mtodo vinculado, s vezes chamado fechamento de mtodo, simplesmente um mtodo extrado de sua ocorrncia. Os exemplos de mtodos vinculados incluem mtodos que so passados como argumentos para uma funo ou retornados de uma funo como valores. Novo no ActionScript 3.0, um mtodo vinculado semelhante a um fechamento de funo j que ele retm seu ambiente lxico mesmo quando extrado de sua ocorrncia. No entanto a diferena principal entre um mtodo vinculado e um fechamento de funo que a referncia this de um mtodo vinculado permanece vinculada, ou ligada, ocorrncia que implementa o mtodo. Em outras palavras, a referncia this em um mtodo vinculado sempre aponta para o objeto original que implementou o mtodo. Para fechamentos de funes, a referncia this genrica, o que significa que ela aponta para qualquer objeto com o qual a funo est associada no momento em que chamada. importante compreender os mtodos vinculados ao usar a palavra-chave this. Lembre-se de que a palavra-chave
this fornece uma referncia ao objeto pai de um mtodo. A maioria dos programadores do ActionScript espera que

a palavra-chave this sempre faa referncia ao objeto ou classe que contm a definio de um mtodo. No entanto, sem a vinculao do mtodo, isso no sempre verdadeiro. Em verses anteriores do ActionScript, por exemplo, a referncia this no se referia sempre ocorrncia que implementou o mtodo. Quando os mtodos so extrados de

PROGRAMAO DO ACTIONSCRIPT 3.0 105


Programao orientada a objetos no ActionScript

uma ocorrncia no ActionScript 2.0, no somente a referncia this no est vinculada ocorrncia original, mas tambm os mtodos as variveis de membros da classe da ocorrncia no esto disponveis. Esse no um problema no ActionScript 3.0 porque os mtodos vinculados so criados automaticamente quando voc transmite um mtodo como um parmetro. Os mtodos vinculados garantem que a palavra-chave this sempre faa referncia ao objeto ou classe na qual um mtodo est definido. O cdigo a seguir define uma classe denominada ThisTest que contm um mtodo denominado foo() que define o mtodo vinculado e um mtodo denominado bar() que retorna o mtodo vinculado. O cdigo externo classe cria uma ocorrncia da classe ThisTest, chama o mtodo bar() e armazena o valor de retorno em uma varivel denominada myFunc.
class ThisTest { private var num:Number = 3; function foo():void // bound method defined { trace("foo's this: " + this); trace("num: " + num); } function bar():Function { return foo; // bound method returned } } var myTest:ThisTest = new ThisTest(); var myFunc:Function = myTest.bar(); trace(this); // output: [object global] myFunc(); /* output: foo's this: [object ThisTest] output: num: 3 */

As duas ltimas linhas do cdigo mostram que a referncia this no mtodo vinculado foo() ainda aponta para uma ocorrncia da classe ThisTest, mesmo que a referncia this na linha imediatamente antes dela aponte para o objeto global. Alm disso, o mtodo vinculado armazenado na varivel myFunc ainda tem acesso s variveis de membros da classe ThisTest. Se esse mesmo cdigo estiver em execuo no ActionScript 2.0, as referncias this correspondero, e a varivel num ser undefined. Uma rea em que a adio de mtodos vinculados mais perceptvel a de identificadores de eventos, porque o mtodo addEventListener() exige que voc passe uma funo ou mtodo como um argumento. Para obter mais informaes, consulte a Funo de ouvinte definida como um mtodo de classe em Ouvintes de evento na pgina 261.

Enumeraes com classes


Enumeraes so tipos de dados personalizados criados para encapsular um pequeno conjunto de valores. O ActionScript 3.0 no oferece suporte a um recurso de enumerao especfico, ao contrrio do C++ com sua palavrachave enum ou do Java com sua interface de Enumerao. No entanto, voc pode criar enumeraes usando classes e constantes estticas. Por exemplo, a classe PrintJob no ActionScript 3.0 usa uma enumerao denominada PrintJobOrientation para armazenar o conjunto de valores que compem "landscape" e "portrait", conforme mostrado no cdigo a seguir:

PROGRAMAO DO ACTIONSCRIPT 3.0 106


Programao orientada a objetos no ActionScript

public final class PrintJobOrientation { public static const LANDSCAPE:String = "landscape"; public static const PORTRAIT:String = "portrait"; }

Por conveno, uma classe de enumerao declarada com o atributo final, porque no h nenhuma necessidade de estender a classe. A classe inclui apenas membros estticos, o que significa que voc no cria ocorrncias da classe. Em vez disso, voc acessa os valores de enumerao diretamente por meio do objeto de classe, conforme mostrado no trecho de cdigo a seguir:
var pj:PrintJob = new PrintJob(); if(pj.start()) { if (pj.orientation == PrintJobOrientation.PORTRAIT) { ... } ... }

Todas as classes de enumerao no ActionScript 3.0 contm apenas variveis do tipo String, int ou uint. A vantagem de usar enumeraes em vez de string literal ou valores numricos que os erros tipogrficos so mais fceis de encontrar com enumeraes. Se voc digitar incorretamente o nome de uma enumerao, o compilador do ActionScript gerar um erro. Se voc usar valores literais, o compilador no reclamar se voc digitar uma palavra incorretamente ou usar um nmero incorreto. No exemplo anterior, o compilador gerar um erro se o nome da constante de enumerao estiver incorreto, conforme mostrado no trecho a seguir:
if (pj.orientation == PrintJobOrientation.PORTRAI) // compiler error

No entanto o compilador no gerar um erro se voc digitar de forma incorreta um valor literal da string, da seguinte maneira:
if (pj.orientation == "portrai") // no compiler error

A segunda tcnica para criar enumeraes tambm envolve a criao de uma classe separada com propriedades estticas para a enumerao. No entanto essa tcnica difere j que cada uma das propriedades estticas contm uma ocorrncia da classe em vez de uma string ou um valor inteiro. Por exemplo, o cdigo a seguir cria uma classe de enumerao para os dias da semana:
public final class Day { public static const public static const public static const public static const public static const public static const public static const }

MONDAY:Day = new Day(); TUESDAY:Day = new Day(); WEDNESDAY:Day = new Day(); THURSDAY:Day = new Day(); FRIDAY:Day = new Day(); SATURDAY:Day = new Day(); SUNDAY:Day = new Day();

Essa tcnica no usada pelo ActionScript 3.0, mas usada por muitos desenvolvedores que preferem a verificao de tipo aprimorada que a tcnica fornece. Por exemplo, um mtodo que retorna um valor de enumerao pode restringir o valor de retorno para o tipo de dados de enumerao. O cdigo a seguir mostra no apenas uma funo que retorna um dia da semana, mas tambm uma chamada de funo que usa o tipo de enumerao como uma anotao de tipo:

PROGRAMAO DO ACTIONSCRIPT 3.0 107


Programao orientada a objetos no ActionScript

function getDay():Day { var date:Date = new Date(); var retDay:Day; switch (date.day) { case 0: retDay = Day.MONDAY; break; case 1: retDay = Day.TUESDAY; break; case 2: retDay = Day.WEDNESDAY; break; case 3: retDay = Day.THURSDAY; break; case 4: retDay = Day.FRIDAY; break; case 5: retDay = Day.SATURDAY; break; case 6: retDay = Day.SUNDAY; break; } return retDay; } var dayOfWeek:Day = getDay();

Voc tambm pode aprimorar a classe Day para que ela associe um inteiro a cada dia da semana, e fornea um mtodo toString() que retorne uma representao da string do dia. Voc pode desejar aprimorar a classe Day dessa maneira como um exerccio.

Classes de ativos incorporados


O ActionScript 3.0 usa classes especiais, chamadas classes de ativos incorporados, para representar ativos incorporados. Um ativo incorporado um ativo, como um som, imagem ou fonte, que includo em um arquivo SWF no momento da compilao. Incorporar um ativo, em vez de carreg-lo dinamicamente, garante que ele estar disponvel em tempo de execuo, mas ao custo do tamanho do arquivo SWF aumentado. Uso de classes de ativos incorporados no Flash Para incorporar um ativo, coloque primeiro o ativo em uma biblioteca do arquivo FLA. Em seguida, use a propriedade de ligao do ativo para fornecer um nome para a classe de ativo incorporado. Se uma classe por esse nome no puder ser encontrada no caminho de classe, ela ser gerada automaticamente para voc. Portanto voc pode criar uma ocorrncia da classe de ativo incorporado e usar todas as propriedades e mtodos definidos ou herdados por essa classe. Por exemplo, o cdigo a seguir pode ser usado para reproduzir um som incorporado que est vinculado a uma classe de ativo incorporado denominada PianoMusic:
var piano:PianoMusic = new PianoMusic(); var sndChannel:SoundChannel = piano.play();

PROGRAMAO DO ACTIONSCRIPT 3.0 108


Programao orientada a objetos no ActionScript

Interfaces
Uma interface uma coleo de declaraes de mtodos que permite que objetos no relacionados se comuniquem. Por exemplo, o ActionScript 3.0 define a interface IEventDispatcher que contm declaraes de mtodos que uma classe pode usar para manipular objetos de eventos. A interface IEventDispatcher estabelece uma maneira padro para os objetos passarem objetos de eventos entre si. O cdigo a seguir mostra a definio da interface IEventDispatcher:
public interface IEventDispatcher { function addEventListener(type:String, listener:Function, useCapture:Boolean=false, priority:int=0, useWeakReference:Boolean = false):void; function removeEventListener(type:String, listener:Function, useCapture:Boolean=false):void; function dispatchEvent(event:Event):Boolean; function hasEventListener(type:String):Boolean; function willTrigger(type:String):Boolean; }

As interfaces so baseadas na distino entre uma interface do mtodo e sua implementao. Uma interface do mtodo inclui todas as informaes necessrias para cham-lo, inclusive o nome do mtodo, todos os seus parmetros e seu tipo de retorno. Uma implementao do mtodo inclui no apenas as informaes da interface, mas tambm as instrues executveis que executam o comportamento do mtodo. Uma definio de interface contm apenas interfaces do mtodo, e qualquer classe que implemente a interface responsvel por definir as implementaes do mtodo. No ActionScript 3.0, a classe EventDispatcher implementa a interface IEventDispatcher definindo todos os mtodos da interface IEventDispatcher e adicionando corpos de mtodos a cada um dos mtodos. O exemplo a seguir um trecho da definio da classe EventDispatcher:
public class EventDispatcher implements IEventDispatcher { function dispatchEvent(event:Event):Boolean { /* implementation statements */ } ... }

A interface IEventDispatcher serve como um protocolo que as ocorrncias do EventDispatcher usam para processar objetos de eventos e pass-los para outros objetos que tambm implementaram a interface IEventDispatcher. Outra maneira de descrever uma interface dizer que ela define um tipo de dados exatamente como faz uma classe. Conseqentemente, uma interface pode ser usada como uma anotao de tipo, exatamente como uma classe. Como um tipo de dados, uma interface pode ser usada tambm com operadores, como os operadores is e as que exigem um tipo de dados. No entanto, ao contrrio de uma classe, uma interface no pode ser instanciada. Essa distino levou muitos programadores a considerar interfaces como tipos de dados abstratos e as classes como tipos de dados concretos.

PROGRAMAO DO ACTIONSCRIPT 3.0 109


Programao orientada a objetos no ActionScript

Definio de uma interface


A estrutura de uma definio de interface semelhante da definio de uma classe, exceto que uma interface pode conter apenas mtodos sem nenhum corpo de mtodo. As interfaces no podem incluir variveis ou constantes, mas podem incluir getters e setters. Para definir uma interface, use a palavra-chave interface. Por exemplo, a seguinte interface, IExternalizable, faz parte do pacote flash.utils no ActionScript 3.0. A interface IExternalizable define um protocolo para serializar um objeto, o que significa converter um objeto em um formato adequado para armazenamento em um dispositivo ou para transporte pela rede.
public interface IExternalizable { function writeExternal(output:IDataOutput):void; function readExternal(input:IDataInput):void; }

Observe que a interface IExternalizable declarada com o modificador de controle de acesso public. As definies de interface podem ser modificadas apenas pelos especificadores de controle de acesso public e internal. As declaraes de mtodo dentro de uma definio de interface no podem ter nenhum especificador de controle de acesso. O ActionScript 3.0 segue uma conveno na qual os nomes de interface comeam com um I maisculo, mas voc pode usar qualquer identificador vlido como o nome de uma interface. As definies de interface so sempre colocadas no nvel superior de um pacote. As definies de interface no podem ser colocadas dentro de uma definio de classe ou dentro da definio de outra interface. As interfaces podem estender uma ou mais interfaces. Por exemplo, a seguinte interface, IExample, estende a interface IExternalizable:
public interface IExample extends IExternalizable { function extra():void; }

Qualquer classe que implemente a interface IExample deve incluir implementaes no apenas para o mtodo extra(), mas tambm para os mtodos writeExternal() e readExternal() herdados da interface IExternalizable.

Implementao de uma interface em uma classe


Uma classe o nico elemento de linguagem do ActionScript 3.0 que pode implementar uma interface. Use a palavrachave implements em uma declarao de classe para implementar uma ou mais interfaces. O exemplo a seguir define duas interfaces, IAlpha e IBeta, e uma classe, Alpha, que implementa as duas:
interface IAlpha { function foo(str:String):String; } interface IBeta { function bar():void; } class Alpha implements IAlpha, IBeta { public function foo(param:String):String {} public function bar():void {} }

PROGRAMAO DO ACTIONSCRIPT 3.0 110


Programao orientada a objetos no ActionScript

Em uma classe que implementa uma interface, os mtodos implementados devem fazer o seguinte:

Usar o identificador de controle de acesso public. Usar o mesmo nome do mtodo da interface. Ter o mesmo nmero de parmetros, cada um com tipos de dados que correspondam aos tipos de dados do
parmetro do mtodo da interface.

Usar o mesmo tipo de retorno.


public function foo(param:String):String {}

No entanto, voc realmente tem alguma flexibilidade quanto a como nomear os parmetros de mtodos implementados. Embora o nmero de parmetros e o tipo de dados de cada parmetro no mtodo implementado devam corresponder quele do mtodo da interface, os nomes de parmetros no precisam corresponder. Por exemplo, no exemplo anterior o parmetro do mtodo Alpha.foo() denominado param: Mas o parmetro denominado str no mtodo da interface IAlpha.foo():
function foo(str:String):String;

Voc tem tambm alguma flexibilidade com valores de parmetro padro. Uma definio de interface pode incluir declaraes de funo com valores de parmetro padro. Um mtodo que implementa um declarao de funo desse tipo deve ter um valor de parmetro padro que seja membro do mesmo tipo de dados que o valor especificado na definio da interface, mas o valor real no precisa corresponder. Por exemplo, o cdigo a seguir define uma interface que contm um mtodo com um valor de parmetro padro 3:
interface IGamma { function doSomething(param:int = 3):void; }

A seguinte definio de classe implementa a interface Igamma, mas usa um valor do parmetro padro diferente:
class Gamma implements IGamma { public function doSomething(param:int = 4):void {} }

O motivo dessa flexibilidade que as regras para implementao de uma interface so projetadas especificamente para garantir a compatibilidade do tipo de dados, e exigir nomes de parmetros idnticos e valores de parmetros padro no necessrio para atingir esse objetivo.

Herana
Herana uma forma de reutilizao de cdigo que permite que programadores desenvolvam novas classes com base em classes existentes. As classes existentes so sempre conhecidas como classes base ou superclasses, enquanto as novas classes normalmente so chamadas de subclasses. A vantagem principal da herana que ela permite reutilizar cdigo de uma classe base e ainda deixar o cdigo existente inalterado. Alm disso, a herana no requer nenhuma alterao no modo como as outras classes interagem com a classe base. Em vez de modificar uma classe existente que pode ter sido completamente testada ou j estar em uso, usando herana voc pode tratar essa classe como um mdulo integrado que pode ser estendido com propriedades ou mtodos adicionais. De forma correspondente, voc usa a palavra-chave extends para indicar que uma classe herda de outra classe.

PROGRAMAO DO ACTIONSCRIPT 3.0 111


Programao orientada a objetos no ActionScript

A herana tambm permite que voc se beneficie com o polimorfismo do cdigo. Polimorfismo a habilidade de usar um nico nome de mtodo para um mtodo que se comporta de maneira diferente ao ser aplicado a diferentes tipos de dados. Um exemplo simples uma classe base denominada Shape com duas subclasses denominadas Circle e Square. A classe Shape define um mtodo denominado area(), que retorna a rea da forma. Se o polimorfismo estiver implementado, voc poder chamar o mtodo area() em objetos do tipo Circle e Square e fazer com que os clculos corretos sejam feitos para voc. A herana ativa o polimorfismo permitindo que as subclasses sejam herdadas e redefinidas, ou substituam, mtodos da classe base. No exemplo a seguir, o mtodo area() redefinido pelas classes Circle e Square:
class Shape { public function area():Number { return NaN; } } class Circle extends Shape { private var radius:Number = 1; override public function area():Number { return (Math.PI * (radius * radius)); } } class Square extends Shape { private var side:Number = 1; override public function area():Number { return (side * side); } } var cir:Circle = new Circle(); trace(cir.area()); // output: 3.141592653589793 var sq:Square = new Square(); trace(sq.area()); // output: 1

Como cada classe define um tipo de dados, o uso da herana cria um relacionamento especial entre a classe base e a classe que a estende. Uma subclasse garantidamente possui todas as propriedades de sua classe base, o que significa que uma ocorrncia de uma subclasse pode ser sempre substituda por uma ocorrncia da classe base. Por exemplo, se um mtodo definir um parmetro do tipo Shape, vlido passar um argumento do tipo Circle, porque Circle estende Shape, da seguinte maneira:
function draw(shapeToDraw:Shape) {} var myCircle:Circle = new Circle(); draw(myCircle);

PROGRAMAO DO ACTIONSCRIPT 3.0 112


Programao orientada a objetos no ActionScript

Propriedades da ocorrncia e herana


Uma propriedade da ocorrncia, se definida com as palavras-chave function, var ou const, ser herdada por todas as subclasses desde que a propriedade no seja declarada com o atributo private na classe base. Por exemplo, a classe Event no ActionScript 3.0 tem vrias subclasses que herdam propriedades comuns a todos os objetos de eventos. Para alguns tipos de eventos, a classe Event contm todas as propriedades necessrias para definir o evento. Esses tipos de eventos no exigem propriedades da ocorrncia alm daquelas definidas na classe Event. Exemplos desses eventos so o evento complete, que ocorre quando os dados foram carregados com xito, e o evento connect, que ocorre quando uma conexo de rede foi estabelecida. O exemplo a seguir um fragmento da classe Event que mostra algumas das propriedades e mtodos herdados por subclasses. Como as propriedades so herdadas, uma ocorrncia de qualquer subclasse pode acessar essas propriedades.
public class Event { public function get type():String; public function get bubbles():Boolean; ... public public public public ... } function function function function stopPropagation():void {} stopImmediatePropagation():void {} preventDefault():void {} isDefaultPrevented():Boolean {}

Outros tipos de eventos exigem propriedades exclusivas no esto disponveis na classe Event. Esses eventos so definidos usando subclasses da classe Event para que novas propriedades possam ser adicionadas s propriedades definidas na classe Event. Um exemplo dessa subclasse a classe MouseEvent, que adiciona propriedades exclusivas a eventos associados a movimento ou a cliques do mouse, como os eventos mouseMove e click. O exemplo a seguir um fragmento da classe MouseEvent que mostra a definio de propriedades que existem na subclasse, mas no na classe base:
public class MouseEvent extends Event { public static const CLICK:String= "click"; public static const MOUSE_MOVE:String = "mouseMove"; ... public function get stageX():Number {} public function get stageY():Number {} ... }

Especificadores de controle de acesso e herana Se uma propriedade for declarada com a palavra-chave public, ela ser visvel ao cdigo em qualquer lugar. Isso significa que a palavra-chave public, ao contrrio das palavras-chave private, protected e internal, no coloca nenhuma restrio sobre a herana da propriedade. Se uma propriedade for declarada com a palavra-chave private, ela ser visvel apenas na classe que a define, o que significa que no ser herdada por nenhuma subclasse. Esse comportamento diferente nas verses anteriores do ActionScript, em que a palavra-chave private se comportava de maneira mais semelhante palavra-chave protected do ActionScript 3.0.

PROGRAMAO DO ACTIONSCRIPT 3.0 113


Programao orientada a objetos no ActionScript

A palavra-chave protected indica que uma propriedade visvel no apenas dentro da classe que a define, mas tambm a todas as subclasses. Ao contrrio da palavra-chave protected na linguagem de programao Java, a palavra-chave protected no ActionScript 3.0 no torna a propriedade visvel para todas as outras classes no mesmo pacote. No ActionScript 3.0, apenas as subclasses podem acessar uma propriedade declarada com a palavra-chave protected. Alm disso, uma propriedade protegida ser visvel para uma subclasse, se a subclasse estiver no mesmo pacote da classe base ou em um pacote diferente. Para limitar a visibilidade de uma propriedade para o pacote no qual ela est definida, use a palavra-chave internal ou no use nenhum especificador de controle de acesso. O especificador de controle de acesso internal o especificador padro aplicado quando um no est especificado. Uma propriedade marcada como internal ser herdada apenas por uma subclasse que reside no mesmo pacote. Voc pode usar o exemplo a seguir para ver como cada um dos especificadores de controle de acesso afeta a herana entre limites de pacotes. O cdigo a seguir define uma classe de aplicativo principal denominada AccessControl e duas outras classes denominadas Base e Extender. A classe Base est em um pacote denominado foo e a classe Extender, que uma subclasse da classe Base, est em um pacote denominado bar. A classe AccessControl importa apenas a classe Extender e cria uma ocorrncia de Extender que tenta acessar uma varivel denominada str definida na classe Base. A varivel str declarada como public para que o cdigo seja compilado e executado, conforme mostrado no seguinte trecho:
// Base.as in a folder named foo package foo { public class Base { public var str:String = "hello"; // change public on this line } } // Extender.as in a folder named bar package bar { import foo.Base; public class Extender extends Base { public function getString():String { return str; } } } // main application class in file named AccessControl.as package { import flash.display.MovieClip; import bar.Extender; public class AccessControl extends MovieClip { public function AccessControl() { var myExt:Extender = new Extender(); trace(myExt.str);// error if str is not public trace(myExt.getString()); // error if str is private or internal } } }

PROGRAMAO DO ACTIONSCRIPT 3.0 114


Programao orientada a objetos no ActionScript

Para ver como os outros especificadores de controle de acesso afetam a compilao e a execuo do exemplo anterior, altere o especificador de controle de acesso da varivel str para private, protected ou internal aps excluir ou comentar a linha seguinte da classe AccessControl:
trace(myExt.str);// error if str is not public

Substituio de variveis no permitidas As propriedades declaradas com as palavras-chave var ou const so herdadas, mas no podem ser substitudas. Substituir uma propriedade significa redefini-la em uma subclasse. O nico tipo de propriedade que pode ser substitudo so os mtodos, isto , propriedades declaradas com a palavra-chave function. Embora no seja possvel substituir uma varivel de ocorrncia, voc pode alcanar funcionalidade semelhante criando os mtodos getter e setter para a varivel de ocorrncia e substituindo os mtodos. Para obter mais informaes, consulte Substituio de mtodos na pgina 114.

Substituio de mtodos
Substituir um mtodo significa redefinir o comportamento de um mtodo herdado. Mtodos estticos no so herdados e no podem ser substitudos. No entanto mtodos de ocorrncia so herdados por subclasses e podem ser substitudos desde que os dois seguintes critrios sejam atendidos:

O mtodo da ocorrncia no declarado com a palavra-chave final na classe base. Quando usada com um mtodo
da ocorrncia, a palavra-chave final indica a inteno do programador de impedir que as subclasses substituam o mtodo.

O mtodo da ocorrncia no declarado com o especificador de controle de acesso private na classe base. Se um
mtodo estiver marcado como private na classe base, no haver necessidade de usar a palavra-chave override ao definir um mtodo nomeado de maneira idntica na subclasse, porque o mtodo da classe base no ser visvel para a subclasse. Para substituir um mtodo da ocorrncia que atenda a esses critrios, a definio do mtodo na subclasse deve usar a palavra-chave override e deve corresponder verso da superclasse do mtodo das seguintes maneiras:

O mtodo de substituio deve ter o mesmo nvel de controle de acesso do mtodo da classe base. Mtodos
marcados como internos tm o mesmo nvel de controle de acesso que os mtodos que no tm nenhum especificador de controle de acesso.

O mtodo de substituio deve ter o mesmo nmero de parmetros que o mtodo da classe base. Os parmetros do mtodo de substituio devem ter as mesmas anotaes de tipo de dados que os parmetros do
mtodo da classe base.

O mtodo de substituio deve ter o mesmo tipo de retorno que o mtodo da classe base.
No entanto os nomes dos parmetros no mtodo de substituio no precisam corresponder aos nomes dos parmetros na classe base, desde que o nmero de parmetros e o tipo de dados de cada parmetro correspondam. A instruo super Ao substituir um mtodo, os programadores sempre querem aumentar o comportamento do mtodo da superclasse que esto substituindo, em vez de substituir completamente o comportamento. Isso requer um mecanismo que permita que um mtodo em uma subclasse chame a verso da superclasse de si prprio. A instruo super fornece esse mecanismo, j que ela contm uma referncia superclasse imediata. O exemplo a seguir define uma classe denominada Base que contm um mtodo denominado thanks() e uma subclasse da classe Base denominada Extender que substitui o mtodo thanks(). O mtodo Extender.thanks() usa a instruo super para chamar Base.thanks().

PROGRAMAO DO ACTIONSCRIPT 3.0 115


Programao orientada a objetos no ActionScript

package { import flash.display.MovieClip; public class SuperExample extends MovieClip { public function SuperExample() { var myExt:Extender = new Extender() trace(myExt.thanks()); // output: Mahalo nui loa } } } class Base { public function thanks():String { return "Mahalo"; } } class Extender extends Base { override public function thanks():String { return super.thanks() + " nui loa"; } }

Substituio de getters e setters Embora no seja possvel substituir variveis definidas em uma superclasse, voc pode substituir getters e setters. Por exemplo, o cdigo a seguir substitui um getter denominado currentLabel que definido na classe MovieClip no ActionScript 3.0:
package { import flash.display.MovieClip; public class OverrideExample extends MovieClip { public function OverrideExample() { trace(currentLabel) } override public function get currentLabel():String { var str:String = "Override: "; str += super.currentLabel; return str; } } }

A sada da instruo trace() no construtor da classe OverrideExample Override: null, que mostra que o exemplo pde substituir a propriedade currentLabel herdada.

PROGRAMAO DO ACTIONSCRIPT 3.0 116


Programao orientada a objetos no ActionScript

Propriedades estticas no herdadas


Propriedades estticas no so herdadas por subclasses. Isso significa que as propriedades estticas no podem ser acessadas por meio de uma ocorrncia de uma subclasse. Uma propriedade esttica pode ser acessada apenas por meio do objeto da classe no qual ela definida. Por exemplo, o cdigo a seguir define uma classe base denominada Base e uma subclasse denominada Extender que estende a Base. Uma varivel esttica denominada test definida na classe Base. O cdigo conforme escrito no fragmento a seguir, no compilado no modo estrito e gera um erro em tempo de execuo no modo padro.
package { import flash.display.MovieClip; public class StaticExample extends MovieClip { public function StaticExample() { var myExt:Extender = new Extender(); trace(myExt.test);// error } } } class Base { public static var test:String = "static"; } class Extender extends Base { }

A nica maneira de acessar a varivel esttica test por meio do objeto da classe, conforme mostrado no cdigo a seguir:
Base.test;

No entanto permitido definir uma propriedade da ocorrncia usando o mesmo nome de uma propriedade esttica. Essa propriedade da ocorrncia pode ser definida na mesma classe que a propriedade esttica ou em uma subclasse. Por exemplo, a classe Base no exemplo anterior podia ter uma propriedade da ocorrncia denominada test. O cdigo a seguir compilado e executado porque a propriedade da ocorrncia herdada pela classe Extender. O cdigo tambm ser compilado e executado, se a definio da varivel da ocorrncia de teste for movida, mas no copiada, para a classe Extender.

PROGRAMAO DO ACTIONSCRIPT 3.0 117


Programao orientada a objetos no ActionScript

package { import flash.display.MovieClip; public class StaticExample extends MovieClip { public function StaticExample() { var myExt:Extender = new Extender(); trace(myExt.test);// output: instance } } } class Base { public static var test:String = "static"; public var test:String = "instance"; } class Extender extends Base {}

Propriedades estticas e a cadeia de escopos


Embora as propriedades estticas no sejam herdadas, elas esto dentro da cadeia do escopo da classe que as define e em qualquer subclasse dessa classe. Como tal, diz-se que as propriedades estticas esto in scope da classe na qual elas so definidas e em qualquer subclasse. Isso significa que uma propriedade esttica pode ser acessada diretamente dentro do corpo da classe que a define e em qualquer subclasse dessa classe. O exemplo a seguir modifica as classes definidas no exemplo anterior para mostrar que a varivel esttica test definida na classe Base est no escopo da classe Extender. Em outras palavras, a classe Extender pode acessar a varivel esttica test sem prefixar a varivel com o nome da classe que define test.
package { import flash.display.MovieClip; public class StaticExample extends MovieClip { public function StaticExample() { var myExt:Extender = new Extender(); } } } class Base { public static var test:String = "static"; } class Extender extends Base { public function Extender() { trace(test); // output: static } }

PROGRAMAO DO ACTIONSCRIPT 3.0 118


Programao orientada a objetos no ActionScript

Se for definida uma propriedade de ocorrncia que usa o mesmo nome que uma propriedade esttica na mesma classe ou em uma superclasse, a propriedade de ocorrncia ter precedncia mais alta na cadeia do escopo. Diz-se que a propriedade da ocorrncia sombreia a propriedade esttica, o que significa que o valor da propriedade da ocorrncia usado no lugar do valor da propriedade esttica. Por exemplo, o cdigo a seguir mostra que se a classe Extender definir uma varivel da ocorrncia denominada test, a instruo trace() usar o valor da varivel da ocorrncia em vez do valor da varivel esttica:
package { import flash.display.MovieClip; public class StaticExample extends MovieClip { public function StaticExample() { var myExt:Extender = new Extender(); } } } class Base { public static var test:String = "static"; } class Extender extends Base { public var test:String = "instance"; public function Extender() { trace(test); // output: instance } }

Tpicos avanados
Esta seo iniciada com um breve histrico do ActionScript e do OOP e continua com uma discusso do modelo de objeto do ActionScript 3.0 e como ele permite que o novo AVM2 (ActionScript Virtual Machine) execute de maneira significativamente mais rpida do que em verses anteriores do Flash Player que contm o AVM1 (ActionScript Virtual Machine) antigo.

Histrico do suporte da OOP ao ActionScript


Como o ActionScript 3.0 foi criado sobre verses anteriores do ActionScript, til compreender como o modelo de objeto do ActionScript evoluiu. O ActionScript comeou como um mecanismo de script simples para verses anteriores da ferramenta de autoria do Flash. Subseqentemente, os programadores comearam a criar aplicativos cada vez mais complexos com o ActionScript. Em resposta s necessidades desses programadores, cada verso subseqente adicionou recursos de linguagem que facilitam a criao de aplicativos complexos.

PROGRAMAO DO ACTIONSCRIPT 3.0 119


Programao orientada a objetos no ActionScript

ActionScript 1.0 O ActionScript 1.0 faz referncia verso da linguagem usada no Flash Player 6 e anterior. Mesmo na primeira fase de desenvolvimento, o modelo de objeto do ActionScript era baseado no conceito do objeto como um tipo de dados fundamental. Um objeto do ActionScript um tipo de dados composto por um grupo de propriedades. Ao discutir o modelo de objeto, o termo propriedades inclui tudo o que est conectado a um objeto, como variveis, funes ou mtodos. Embora essa primeira gerao do ActionScript no oferea suporte definio de classes com uma palavra-chave class, possvel definir uma classe usando um tipo especial de objeto chamado objeto de prottipo. Em vez de usar uma palavra-chave class para criar uma definio de classe abstrata que voc instancia em objetos concretos, como o faz em linguagens baseadas em classe, como Java e C++, as linguagens baseadas em prottipo como o ActionScript 1.0 usam um objeto existente como um modelo (ou prottipo) para outros objetos. Enquanto objetos em uma linguagem baseada em classe podem apontar para uma classe que serve como seu modelo, objetos em uma linguagem baseada em prottipo apontam para outro objeto, seu prottipo, que serve como seu modelo. Para criar uma classe no ActionScript 1.0, defina uma funo de construtor para essa classe. No ActionScript, as funes so objetos reais, no apenas definies abstratas. A funo de construtor que voc cria serve como o objeto de prottipo para ocorrncias dessa classe. O cdigo a seguir cria uma classe denominada Shape e define uma propriedade denominada visible que, por padro, definida como true:
// base class function Shape() {} // Create a property named visible. Shape.prototype.visible = true;

Essa funo de construtor define uma classe Shape que voc pode instanciar com o operador new, da seguinte maneira:
myShape = new Shape();

Do mesmo modo como o objeto de funo de construtor Shape() serve como prottipo para ocorrncias da classe Shape, ele tambm pode servir como o prottipo para subclasses de Shape, isto , outras classes que estendem a classe Shape. A criao de uma classe que uma subclasse da classe Shape um processo de duas etapas. Primeiro, crie a classe definindo uma funo de construtor para a classe, da seguinte maneira:
// child class function Circle(id, radius) { this.id = id; this.radius = radius; }

Segundo, use o operador new para declarar que a classe Shape o prottipo para a classe Circle. Por padro, qualquer classe criada usa a classe Object como seu prottipo, o que significa que Circle.prototype atualmente contm um objeto genrico (uma ocorrncia da classe Object). Para especificar que o prottipo de Circle Shape em vez de Object, use o cdigo a seguir para alterar o valor de Circle.prototype para que ele contenha um objeto Shape em vez de um objeto genrico:
// Make Circle a subclass of Shape. Circle.prototype = new Shape();

PROGRAMAO DO ACTIONSCRIPT 3.0 120


Programao orientada a objetos no ActionScript

As classes Shape e Circle esto agora vinculadas em conjunto em um relacionamento de herana que conhecido como a cadeia de prottipos. O diagrama ilustra os relacionamentos em uma cadeia de prottipos:
Object.prototype

Shape.prototype

Circle.prototype

A classe base no final de cada cadeia de prottipos a classe Object. A classe Object contm uma propriedade esttica denominada Object.prototype que aponta para o objeto de prottipo base de todos os objetos criados no ActionScript 1.0. O prximo objeto em nossa cadeia de prottipos de exemplo o objeto Shape. Isso ocorre porque a propriedade Shape.prototype nunca foi definida explicitamente, portanto ela ainda mantm um objeto genrico (uma ocorrncia da classe Object). O link final nessa cadeia a classe Circle que est vinculada a seu prottipo, a classe Shape (a propriedade Circle.prototype mantm um objeto Shape). Se criarmos uma ocorrncia da classe Circle, como no seguinte exemplo, a ocorrncia herdar a cadeia de prottipos da classe Circle:
// Create an instance of the Circle class. myCircle = new Circle();

Lembre-se de que criamos uma propriedade denominada visible como um membro da classe Shape. Em nosso exemplo, a propriedade visible no existe como parte do objeto myCircle, apenas como membro do objeto Shape, apesar da linha seguinte do cdigo produzir true:
trace(myCircle.visible); // output: true

O Flash Player pode verificar se o objeto myCircle herda a propriedade visible percorrendo a cadeia de prottipos. Ao executar este cdigo, o Flash Player primeiro pesquisa a propriedades do objeto myCircle por uma propriedade denominada visible, mas no encontra essa propriedade. Em seguida, o Flash Player verifica o objeto Circle.prototype, mas ainda no encontra uma propriedade denominada visible. Continuando na cadeia de prottipos, o Flash Player finalmente encontra a propriedade visible definida no objeto Shape.prototype e fornece o valor daquela propriedade. Pelo bem da simplicidade, esta seo omite muitos dos detalhes e complexidades da cadeia de prottipos e tem o objetivo de fornecer informaes suficientes para ajudar a compreender o modelo de objeto do ActionScript 3.0. ActionScript 2.0 O ActionScript 2.0 introduziu novas palavras-chave, como class, extends, publice private, que permitiram definir classes de uma maneira que seja familiar a qualquer pessoa que trabalhe com linguagens baseadas em classes como Java e C++. importante compreender que o mecanismo da herana subjacente no foi alterado entre o ActionScript 1.0 e o ActionScript 2.0. O ActionScript 2.0 simplesmente adicionou uma nova sintaxe para definir classes. A cadeia de prottipos funciona da mesma maneira nas duas verses da linguagem. A nova sintaxe introduzida pelo ActionScript 2.0, mostrada no trecho a seguir, permite definir classes de uma maneira que considerada intuitiva por muitos programadores:

PROGRAMAO DO ACTIONSCRIPT 3.0 121


Programao orientada a objetos no ActionScript

// base class class Shape { var visible:Boolean = true; }

Observe que o ActionScript 2.0 tambm introduziu anotaes de tipo para uso com verificao de tipos em tempo de compilao. Isso permite declarar que a propriedade visible no exemplo anterior deve conter apenas um valor booleano. A nova palavra-chave extends tambm simplifica o processo de criao de uma subclasse. No exemplo a seguir, o processo em duas etapas necessrio no ActionScript 1.0 executado em uma etapa com a palavra-chave extends:
// child class class Circle extends Shape { var id:Number; var radius:Number; function Circle(id, radius) { this.id = id; this.radius = radius; } }

O construtor est agora declarado como parte da definio da classe e as propriedades de classes id e radius tambm devem ser declaradas explicitamente. O ActionScript 2.0 tambm adicionou suporte para a definio de interfaces, o que permite refinar ainda mais os programas orientados a objetos com protocolos definidos formalmente para comunicao entre objetos.

Objeto de classe do ActionScript 3.0


Um paradigma comum da programao orientada a objetos, mais freqentemente associado a Java e C++, usa classes para definir tipos de objetos. Linguagens de programao que adotam esse paradigma tambm tendem a usar classes para construir ocorrncias do tipo de dados que a classe define. O ActionScript usa classes para duas dessas finalidades, mas suas razes como uma linguagem com base em prottipo adicionam uma caracterstica interessante. O ActionScript cria para cada definio de classe um objeto de classe especial que permite o compartilhamento do comportamento e do estado. No entanto, para muitos programadores do ActionScript, esta distino no pode ter nenhuma implicao de codificao prtica. O ActionScript 3.0 projetado de forma que voc possa criar aplicativos do ActionScript orientados a objetos sofisticados sem usar, ou mesmo compreender, esses objetos de classes especiais. Para programadores avanados que desejam tirar proveito de objetos de classes, esta seo discute os problemas em profundidade.

PROGRAMAO DO ACTIONSCRIPT 3.0 122


Programao orientada a objetos no ActionScript

O diagrama a seguir mostra a estrutura de um objeto de classe que representa uma classe simples denominada A que definida com a instruo class A {}:

Class.prototype

Object.prototype

CA

delegate

delegate constructor

tipo

prottipo

caracterstvicas

Cada retngulo no diagrama representa um objeto. Cada objeto no diagrama tem um caractere subscrito A para representar que ele pertence classe A. O objeto de classe (CA) contm referncias a vrios outros objetos importantes. Um objeto com caractersticas da ocorrncia (TA) armazena as propriedades da ocorrncia que so definidas dentro de uma definio de classe. Um objeto de caractersticas da classe (TCA) representa o tipo interno da classe e armazena as propriedades estticas definidas pela classe (o caractere subscrito C representa a classe). O objeto de prottipo (PA) sempre faz referncia ao objeto da classe ao qual ele era originalmente anexado por meio da propriedade constructor.

Objeto de caractersticas
O objeto de caractersticas, novo no ActionScript 3.0, foi implementado tendo em mente o desempenho. Em verses anteriores do ActionScript, a pesquisa de nome era um processo demorado pois o Flash Player percorria a cadeia de prottipos. No ActionScript 3.0, a pesquisa de nome muito mais eficiente e menos demorada, porque as propriedades herdadas so copiadas das superclasses no objeto de caractersticas de subclasses. O objeto de caractersticas no pode ser acessado diretamente pelo cdigo do programador, mas sua presena pode ser sentida pelos aprimoramentos no desempenho e no uso de memria. O objeto de caractersticas fornece ao AVM2 informaes detalhadas sobre o layout e o contedo de uma classe. Com esse conhecimento, o AVM2 pode reduzir significativamente o tempo de execuo, porque pode gerar freqentemente instrues de mquina diretas para acessar propriedades ou chamar mtodos diretamente sem uma pesquisa de nome demorada. Graas ao objeto de caractersticas, uma superfcie de memria do objeto pode ser significativamente menor do que a de um objeto semelhante em verses anteriores do ActionScript. Por exemplo, se uma classe estiver selada (isto , a classe no est declarada dinmica), uma ocorrncia da classe no precisar de uma tabela hash para propriedades adicionadas dinamicamente, e poder manter um pouco mais do que um ponteiro para os objetos de caractersticas e alguns slots para as propriedades fixas definidas na classe. Como resultado, um objeto que exigia 100 bytes de memria no ActionScript 2.0 pode exigir apenas 20 bytes de memria no ActionScript 3.0. Nota: O objeto de caractersticas um detalhe da implementao interna, e no h nenhuma garantia de que ele no seja alterado ou mesmo que desaparea em verses futuras do ActionScript.

PROGRAMAO DO ACTIONSCRIPT 3.0 123


Programao orientada a objetos no ActionScript

Objeto de prottipo
Cada objeto de classe do ActionScript tem uma propriedade denominada prototype, que uma referncia ao objeto de prottipo da classe. O objeto de prottipo um herana das razes do ActionScript como linguagem com base em prottipo. Para obter mais informaes, consulte Histrico do suporte da OOP ao ActionScript na pgina 118. A propriedade prototype somente leitura, o que significa que no pode ser modificada para apontar para objetos diferentes. Ela diferente da propriedade prototype da classe em verses anteriores do ActionScript, em que o prottipo podia ser reatribudo para que apontasse para uma classe diferente. Embora a propriedade prototype seja somente leitura, o objeto de prottipo ao qual ela faz referncia no . Em outras palavras, novas propriedades podem ser adicionadas ao objeto de prottipo. Propriedades adicionadas ao objeto de prottipo so compartilhadas entre todas as ocorrncias da classe. A cadeia de prottipos, que era o nico mecanismo de herana em verses anteriores do ActionScript, serve apenas uma funo secundria no ActionScript 3.0. O mecanismo de herana principal, herana de propriedade fixa, manipulado internamente pelo objeto de caractersticas. Uma propriedade fixa uma varivel ou mtodo que definida como parte de uma definio de classe. A herana de propriedade fixa tambm de chamada herana de classe, porque ela o mecanismo de herana associado a palavras-chave, como class, extends e override. A cadeia de prottipos fornece um mecanismo de herana alternativa que mais dinmico do que a herana de propriedade fixa. Voc pode adicionar propriedades a um objeto de prottipo de classe no apenas como parte da definio da classe, mas tambm em tempo de execuo por meio da propriedade prototype do objeto de classe. No entanto, observe que se voc definir o compilador como modo estrito, talvez no seja possvel acessar propriedades adicionadas a um objeto de prottipo, a no ser que voc declare uma classe com a palavra-chave dynamic. Um bom exemplo de uma classe com vrias propriedades anexadas ao objeto de prottipo a classe Object. Os mtodos toString() e valueOf() da classe Object so realmente funes atribudas s propriedades do objeto de prottipo da classe Object. A seguir est um exemplo de como pode ser a aparncia da declarao desses mtodos, em teoria, (a implementao real um pouco diferente, por causa dos detalhes da implementao):
public dynamic class Object { prototype.toString = function() { // statements }; prototype.valueOf = function() { // statements }; }

Conforme mencionado anteriormente, possvel anexar uma propriedade a um objeto de prottipo de classe fora da definio de classe. Por exemplo, o mtodo toString() tambm pode ser definido fora da definio da classe Object, da seguinte maneira:
Object.prototype.toString = function() { // statements };

PROGRAMAO DO ACTIONSCRIPT 3.0 124


Programao orientada a objetos no ActionScript

No entanto, ao contrrio da herana de propriedade fixa, a herana de prottipo no exigir a palavra-chave override, se voc desejar redefinir um mtodo em uma subclasse. Por exemplo: se voc desejar redefinir o mtodo valueOf() em uma subclasse da classe Object, ter trs opes. Primeiro, voc pode definir um mtodo valueOf() no objeto de prottipo de subclasse dentro da definio de classe. O cdigo a seguir cria uma subclasse de Object denominada Foo e redefine o mtodo valueOf() no objeto de prottipo de Foo como parte da definio de classe. Como cada classe herdada de Object, no necessrio usar a palavra-chave extends.
dynamic class Foo { prototype.valueOf = function() { return "Instance of Foo"; }; }

Segundo, voc pode definir um mtodo valueOf() no objeto de prottipo de Foo fora da definio de classe, conforme mostrado no cdigo a seguir:
Foo.prototype.valueOf = function() { return "Instance of Foo"; };

Terceiro, voc pode definir uma propriedade fixa denominada valueOf() como parte da classe Foo. Essa tcnica diferente das outras j que ela mescla herana de propriedade fixa com herana de prottipo. Qualquer subclasse de Foo que precise redefinir valueOf() deve usar a palavra-chave override. O cdigo a seguir mostra valueOf() definido como uma propriedade fixa em Foo:
class Foo { function valueOf():String { return "Instance of Foo"; } }

Espao para nomes AS3


A existncia de dois mecanismos de herana separados, herana de propriedade fixa e herana de prottipo, cria uma desafio de compatibilidade interessante em relao s propriedades e mtodos das classes principais. A compatibilidade com a especificao de linguagem do ECMAScript na qual o ActionScript baseado exige o uso de herana de prottipo, o que significa que as propriedades e mtodos de uma classe principal so definidos no objeto de prottipo dessa classe. Por outro lado, a compatibilidade com o ActionScript 3.0 exige o uso de herana de propriedade fixa, o que significa que as propriedades e mtodos de uma classe principal so definidos na definio da classe usando as palavras-chave const, var e function. Alm disso, o uso de propriedades fixas, em vez das verses do prottipo pode levar a aumentos significativos no desempenho em tempo de execuo. O ActionScript 3.0 resolve esse problema usando herana de prottipo e herana de propriedade fixa para as classes principais. Cada classe principal contm dois conjuntos de propriedades e mtodos. Um conjunto definido no objeto de prottipo para compatibilidade com a especificao do ECMAScript, e o outro conjunto definido com propriedades fixas e o espao para nomes AS3 para compatibilidade com o ActionScript 3.0.

PROGRAMAO DO ACTIONSCRIPT 3.0 125


Programao orientada a objetos no ActionScript

O espao para nomes AS3 fornece um mecanismo conveniente para escolher entre os dois conjuntos de propriedades e mtodos. Se voc no usar o espao para nomes AS3, uma ocorrncia de uma classe principal herdar as propriedades e mtodos definidos no objeto de prottipo da classe principal. Se voc decidir usar o espao para nomes AS3, uma ocorrncia de uma classe principal herdar as verses do AS3, porque as propriedades fixas so sempre preferidas sobre as propriedades de prottipo. Em outras palavras, sempre que uma propriedade fixa estiver disponvel, ela ser sempre usada no lugar de uma propriedade de prottipo nomeada de forma idntica. Voc pode usar seletivamente a verso do espao para nomes AS3 de uma propriedade ou mtodo qualificando-a com o espao para nomes AS3. Por exemplo, o cdigo a seguir usa a verso do AS3 do mtodo Array.pop():
var nums:Array = new Array(1, 2, 3); nums.AS3::pop(); trace(nums); // output: 1,2

Como alternativa, voc pode usar a diretiva use namespace para abrir o espao para nomes AS3 para todas as definies dentro de um bloco de cdigo. Por exemplo, o cdigo a seguir usa a diretiva use namespace para abrir o espao para nomes AS3 para os mtodos pop() e push():
use namespace AS3; var nums:Array = new Array(1, 2, 3); nums.pop(); nums.push(5); trace(nums) // output: 1,2,5

O ActionScript 3.0 tambm fornece opes de compilador para cada conjunto de propriedades para que voc possa aplicar o espao para nomes AS3 ao programa inteiro. A opo de compilador -as3 representa o espao para nomes AS3, e a opo de compilador -es representa a opo de herana de prottipo (es representa o ECMAScript). Para abrir o espao para nomes AS3 para o programa inteiro, defina a opo de compilador -as3 como true e a opo de compilador -es como false. Para usar as verses de prottipo, defina as opes do compilador como os valores opostos. As configuraes do compilador padro do Adobe Flex Builder 3 e do Adobe Flash CS4 Professional so -as3 = true e -es = false. Se voc planejar estender qualquer uma das classes principais e substituir qualquer mtodo, dever compreender como o espao para nomes AS3 pode afetar o modo como voc deve declarar um mtodo substitudo. Se voc estiver usando o espao para nomes AS3, qualquer substituio de mtodo de um mtodo da classe principal tambm deve usar o espao para nomes AS3 juntamente com o atributo override. Se no estiver usando o espao para nomes AS3 e desejar redefinir um mtodo da classe principal em uma subclasse, voc no dever usar o espao para nomes AS3 ou a palavra-chave override.

Exemplo: GeometricShapes
O aplicativo de amostra GeometricShapes mostra como vrios conceitos e recursos orientados a objetos podem ser aplicados usando o ActionScript 3.0, inclusive:

Definio de classes Extenso de classes Polimorfismo e a palavra-chave override Definio, extenso e implementao de interfaces
Ele tambm inclui um mtodo de fbrica que cria ocorrncias de classes, mostrando como declarar um valor de retorno como uma ocorrncia de uma interface, e usar esse objeto retornado de uma maneira genrica.

PROGRAMAO DO ACTIONSCRIPT 3.0 126


Programao orientada a objetos no ActionScript

Para obter os arquivos do aplicativo desta amostra, consulte www.adobe.com/go/learn_programmingAS3samples_flash_br. Os arquivos do aplicativo GeometricShapes podem ser encontrados na pasta Amostras/GeometricShapes. O aplicativo consiste nos seguintes arquivos:
Arquivo GeometricShapes.mxml ou GeometricShapes.fla com/example/programmingas3/geometricshapes/IGeometricShape.as A interface base que define mtodos a serem implementados por todas as classes do aplicativo GeometricShapes. Uma interface que define mtodos a serem implementados pelas classes do aplicativo GeometricShapes que tm vrios lados. Um tipo de forma geomtrica que tem lados de comprimento igual prolongados simetricamente em torno do centro da forma. Um tipo de forma geomtrica que define um crculo. Uma subclasse de RegularPolygon que define um tringulo com todos os lados com o mesmo comprimento. Uma subclasse de RegularPolygon que define um retngulo com os quatro lados com o mesmo comprimento. Uma classe que contm um mtodo de fbrica para criar formas com tamanho e tipo especificados. Descrio O arquivo principal do aplicativo no Flash (FLA) ou no Flex (MXML).

com/example/programmingas3/geometricshapes/IPolygon.as

com/example/programmingas3/geometricshapes/RegularPolygon.as

com/example/programmingas3/geometricshapes/Circle.as

com/example/programmingas3/geometricshapes/EquilateralTriangle.as

com/example/programmingas3/geometricshapes/Square.as

com/example/programmingas3/geometricshapes/GeometricShapeFactory.as

Definio das classes GeometricShapes


O aplicativo GeometricShapes permite que o usurio especifique um tipo de forma geomtrica e um tamanho. Em seguida, ele responde com uma descrio da forma, sua rea e a distncia em torno de seu permetro. A interface de usurio do aplicativo trivial, incluindo alguns controles para seleo do tipo de forma, configurao do tamanho e exibio da descrio. A parte mais interessante desse aplicativo est sob a superfcie, na estrutura das classes e das prprias interfaces. Esse aplicativo trata de formas geomtricas, mas no as exibe graficamente. Ele fornece uma pequena biblioteca de classes e interfaces que sero reutilizadas no exemplo de um exemplo captulo posterior (consulte Exemplo: SpriteArranger na pgina 316). O exemplo SpriteArranger exibe as formas graficamente e permite que o usurio as manipule, com base na estrutura da classe fornecida aqui no aplicativo GeometricShapes. As classes e interfaces que definem as formas geomtricas neste exemplo so mostradas no diagrama a seguir que usa a notao UML (Linguagem de modelao unificada):

PROGRAMAO DO ACTIONSCRIPT 3.0 127


Programao orientada a objetos no ActionScript

<< interface >> IGeometricShape +getArea (): Number +describe (): Strin

<< interface >> IPolygon +getPerimeter (): Number +getSumOfAngles (): Number

Circle +diameter:Number
+Circle () : Circle +getArea () : Number +describe () : String +getCircumference () : Number

RegularPolygon
+numSides : int +sideLength : Number
+RegularPolygon (): RegularPolygon +getSumOfAngles (): Number +getPerimeter (): Number +getArea (): Number +describe (): String

EquilateralTriangle
+EquilateralTriangle (): EquilateralTriangle +getArea (): Number +describe (): String

Square +Square (): Square +getArea (): Number +describe (): String

Classes de exemplo do GeometricShapes

Definio do comportamento comum com interfaces


Este aplicativo GeometricShapes trata de trs tipos de formas: crculos, quadrados e tringulos eqilteros. A estrutura de classe GeometricShapes comea com uma interface muito simples, IGeometricShape, que lista mtodos comuns para todos os trs tipos de formas:
package com.example.programmingas3.geometricshapes { public interface IGeometricShape { function getArea():Number; function describe():String; } }

A interface define dois mtodos: o mtodo getArea(), que calcula e retorna a rea da forma, e o mtodo describe(), que monta uma descrio de texto das propriedades da forma. Desejamos saber tambm a distncia em torno do permetro de cada forma. No entanto, o permetro de um crculo chamado de circunferncia, e calculado de uma maneira exclusiva, portanto o comportamento diverge daquele de um tringulo ou de um quadrado. Ainda h semelhana suficiente entre tringulos, quadrados e outros polgonos, portanto faz sentido definir uma nova classe de interface s para eles: IPolygon. A interface IPolygon tambm muito simples, conforme mostrado aqui:

PROGRAMAO DO ACTIONSCRIPT 3.0 128


Programao orientada a objetos no ActionScript

package com.example.programmingas3.geometricshapes { public interface IPolygon extends IGeometricShape { function getPerimeter():Number; function getSumOfAngles():Number; } }

Essa interface define dois mtodos comuns a todos os polgonos: o mtodo getPerimeter() que mede a distncia combinada de todos os lados e o mtodo getSumOfAngles() que adiciona todos os ngulos internos. A interface IPolygon estende a interface IGeometricShape, o que significa que qualquer classe que implemente a interface IPolygon deve declarar os quatro mtodos, dois da interface IGeometricShape e dois da interface IPolygon.

Definio das classes Shape


Depois que voc tiver uma boa idia sobre os mtodos comuns a cada tipo de forma, voc pode definir as prprias classes. Em termos da quantidade dos mtodos precisam ser implementados, a forma mais simples a da classe Circle, mostrada aqui:
package com.example.programmingas3.geometricshapes { public class Circle implements IGeometricShape { public var diameter:Number; public function Circle(diam:Number = 100):void { this.diameter = diam; } public function getArea():Number { // The formula is Pi * radius * radius. var radius:Number = diameter / 2; return Math.PI * radius * radius; } public function getCircumference():Number { // The formula is Pi * diameter. return Math.PI * diameter; } public function describe():String { var desc:String = "This shape is a Circle.\n"; desc += "Its diameter is " + diameter + " pixels.\n"; desc += "Its area is " + getArea() + ".\n"; desc += "Its circumference is " + getCircumference() + ".\n"; return desc; } } }

PROGRAMAO DO ACTIONSCRIPT 3.0 129


Programao orientada a objetos no ActionScript

A classe Circle implementa a interface IGeometricShape, portanto ela deve fornecer cdigo para os mtodos getArea() e describe(). Alm disso, ela define o mtodo getCircumference() que exclusivo classe Circle. A classe Circle tambm declara uma propriedade, diameter que no encontrada nas outras classes de polgonos. Os dois outros tipos de formas, quadrados e tringulos eqilteros, tm algumas outras coisas em comum: cada um deles tm lados com o mesmo comprimento e h frmulas comuns que voc pode usar para calcular o permetro e a soma dos ngulos internos dos dois. De fato, essas frmulas comuns so aplicadas a todos os outros polgonos regulares que voc precisar definir no futuro. A classe RegularPolygon a superclasse das classes Square e EquilateralTriangle. Uma superclasse permite definir mtodos comuns em um lugar, portanto voc no precisa defini-los separadamente em cada subclasse. Este o cdigo da classe RegularPolygon:
package com.example.programmingas3.geometricshapes { public class RegularPolygon implements IPolygon { public var numSides:int; public var sideLength:Number; public function RegularPolygon(len:Number = 100, sides:int = 3):void { this.sideLength = len; this.numSides = sides; } public function getArea():Number { // This method should be overridden in subclasses. return 0; } public function getPerimeter():Number { return sideLength * numSides; } public function getSumOfAngles():Number { if (numSides >= 3)

PROGRAMAO DO ACTIONSCRIPT 3.0 130


Programao orientada a objetos no ActionScript

{ return ((numSides - 2) * 180); } else { return 0; } } public function describe():String { var desc:String = "Each side is " + sideLength + " pixels long.\n"; desc += "Its area is " + getArea() + " pixels square.\n"; desc += "Its perimeter is " + getPerimeter() + " pixels long.\n"; desc += "The sum of all interior angles in this shape is " + getSumOfAngles() + " degrees.\n"; return desc; } } }

Primeiro, a classe RegularPolygon declara duas propriedades comuns a todos os polgonos regulares: o comprimento de cada lado (a propriedade sideLength) e o nmero de lados (a propriedade numSides). A classe RegularPolygon implementa a interface IPolygon e declara os quatro mtodos da interface IPolygon. Ela implementa dois desses, os mtodos getPerimeter() e getSumOfAngles(), usando frmulas comuns. Como a frmula do mtodo getArea() diferente de forma para forma, a verso da classe base do mtodo no pode incluir a lgica comum que pode ser herdada pelos mtodos da subclasse. Em vez disso, ele simplesmente retorna um valor padro 0 para indicar que a rea no foi calculada. Para calcular a rea de cada forma corretamente, as prprias subclasses da classe RegularPolygon precisam substituir o mtodo getArea(). O seguinte cdigo da classe EquilateralTriangle mostra como o mtodo getArea() substitudo:

PROGRAMAO DO ACTIONSCRIPT 3.0 131


Programao orientada a objetos no ActionScript

package com.example.programmingas3.geometricshapes { public class EquilateralTriangle extends RegularPolygon { public function EquilateralTriangle(len:Number = 100):void { super(len, 3); } public override function getArea():Number { // The formula is ((sideLength squared) * (square root of 3)) / 4. return ( (this.sideLength * this.sideLength) * Math.sqrt(3) ) / 4; } public override function describe():String { /* starts with the name of the shape, then delegates the rest of the description work to the RegularPolygon superclass */ var desc:String = "This shape is an equilateral Triangle.\n"; desc += super.describe(); return desc; } } }

A palavra-chave override indica que o mtodo EquilateralTriangle.getArea() substitui intencionalmente o mtodo getArea() da superclasse RegularPolygon. Quando o mtodo EquilateralTriangle.getArea() chamado, ele calcula a rea usando a frmula do cdigo anterior, e o cdigo no mtodo RegularPolygon.getArea() nunca executado. Em comparao, a classe EquilateralTriangle no define sua prpria verso do mtodo getPerimeter(). Quando o mtodo EquilateralTriangle.getPerimeter() chamado, a chamada percorre a cadeia de herana e executa o cdigo no mtodo getPerimeter() da superclasse RegularPolygon. O construtor EquilateralTriangle() usa a instruo super() para chamar explicitamente o construtor RegularPolygon() de sua superclasse. Se os dois construtores tivessem o mesmo conjunto de parmetros, voc poderia omitir completamente o construtor EquilateralTriangle() e o construtor RegularPolygon() seria executado. No entanto, o construtor RegularPolygon() precisa de um parmetro extra, numSides. Portanto o construtor EquilateralTriangle() chama super(len, 3) que passa o parmetro de entrada len e o valor 3 para indicar que o tringulo ter 3 lados. O mtodo describe() tambm usa a instruo super(), mas de uma maneira diferente, para chamar a verso da superclasse RegularPolygon do mtodo describe(). O mtodo EquilateralTriangle.describe() define primeiro a varivel da string desc como uma instruo sobre o tipo da forma. Em seguida, ele obtm os resultados do mtodo RegularPolygon.describe() chamando super.describe() e anexa esse resultado string desc. A classe Square no ser descrita em detalhes aqui, mas semelhante classe EquilateralTriangle, fornecendo um construtor e suas prprias implementaes dos mtodos getArea() e describe().

PROGRAMAO DO ACTIONSCRIPT 3.0 132


Programao orientada a objetos no ActionScript

Polimorfismo e o mtodo de fbrica


Um conjunto de classes que faz bom uso de interfaces e herana pode ser usado de muitas maneiras interessantes. Por exemplo, todas essas classes de formas descritas at agora implementam a interface IGeometricShape ou estendem uma superclasse que o faz. Portanto, se voc definir uma varivel como sendo uma ocorrncia de IGeometricShape, no precisar saber se ela realmente uma ocorrncia das classes Circle ou Square para chamar seu mtodo describe(). O cdigo a seguir mostra como isso funciona:
var myShape:IGeometricShape = new Circle(100); trace(myShape.describe());

Quando myShape.describe() chamado, ele executa o mtodo Circle.describe(), porque embora a varivel esteja definida como uma ocorrncia da interface IGeometricShape, Circle sua classe subjacente. Este exemplo mostra o princpio do polimorfismo em ao: a mesma chamada de mtodo exata resulta na execuo de cdigo diferente, dependendo da classe do objeto cujo mtodo est sendo chamado. O aplicativo GeometricShapes aplica esse tipo de polimorfismo com base em interface usando uma verso simplificada de um padro de design conhecido como mtodo de fbrica. O termo mtodo de fbrica faz referncia a uma funo que retorna um objeto cujo tipo de dados subjacentes ou contedo pode ser diferente, dependendo do contexto. A classe GeometricShapeFactory mostrada aqui define um mtodo de fbrica denominado createShape():
package com.example.programmingas3.geometricshapes { public class GeometricShapeFactory { public static var currentShape:IGeometricShape; public static function createShape(shapeName:String, len:Number):IGeometricShape { switch (shapeName) { case "Triangle": return new EquilateralTriangle(len); case "Square": return new Square(len); case "Circle": return new Circle(len); } return null; } public static function describeShape(shapeType:String, shapeSize:Number):String { GeometricShapeFactory.currentShape = GeometricShapeFactory.createShape(shapeType, shapeSize); return GeometricShapeFactory.currentShape.describe(); } } }

PROGRAMAO DO ACTIONSCRIPT 3.0 133


Programao orientada a objetos no ActionScript

O mtodo de fbrica createShape() permite que construtores de subclasses de formas definam os detalhes das ocorrncias que eles criam, enquanto retornam os novos objetos como ocorrncias de IGeometricShape para que eles possam ser manipulados pelo aplicativo de maneira mais geral. O mtodo describeShape() no exemplo anterior mostra como um aplicativo pode usar o mtodo de fbrica para obter uma referncia genrica para um objeto mais especfico. O aplicativo pode obter a descrio de um objeto Circle criado recentemente, como este:
GeometricShapeFactory.describeShape("Circle", 100);

Em seguida, o mtodo describeShape() chama o mtodo de fbrica createShape() com os mesmo parmetros, armazenando o novo objeto Circle em uma varivel esttica denominada currentShape que foi digitada como um objeto IGeometricShape. Em seguida, o mtodo describe() chamado no objeto currentShape, e essa chamada resolvida automaticamente para executar o mtodo Circle.describe() retornando uma descrio detalhada do crculo.

Aprimoramento do aplicativo de amostra


O poder real das interfaces e da herana torna-se aparente quando voc aprimora ou altera o aplicativo. Suponha que voc deseja adicionar uma nova forma, um pentgono, a este aplicativo de amostra. Voc criaria uma nova classe Pentagon que estende a classe RegularPolygon e define suas prprias verses dos mtodos getArea() e describe(). Em seguida, adicionaria uma nova opo de Pentagon caixa de combinao na interface de usurio do aplicativo. Mas isso tudo. A classe Pentagon obteria automaticamente a funcionalidade dos mtodos getPerimeter() e getSumOfAngles() da classe RegularPolygon por herana. Como ela herdada de uma classe que implementa a interface IGeometricShape, uma ocorrncia Pentagon tambm pode ser tratada como uma ocorrncia IGeometricShape. Isso significa que para adicionar um novo tipo de forma, no preciso alterar a assinatura de nenhum dos mtodos na classe GeometricShapeFactory (e, conseqentemente, tambm no preciso alterar nenhum cdigo que use a classe GeometricShapeFactory). Talvez voc queira adicionar uma classe Pentagon ao exemplo de Geometric Shapes como um exerccio, para ver como as interfaces e a herana podem facilitar a carga de trabalho da adio de novos recursos a um aplicativo.

134

Captulo 6: Trabalho com datas e horas


Data e hora talvez no sejam tudo, mas normalmente so um fator chave nos aplicativos de software. O ActionScript 3.0 oferece formas teis para gerenciar datas de calendrio, horas e intervalos de tempo. Duas classes principais permitem gerenciar data e hora: a classe Date e a nova classe Timer do pacote flash.utils.

Noes bsicas de data e hora


Introduo ao trabalho com datas e horas
Datas e horas so informaes comuns usadas nos programas ActionScript. Por exemplo, voc talvez precise saber o dia da semana atual ou medir o tempo que o usurio gasta em uma tela especfica, entre muitas outras possibilidades. No ActionScript, voc pode usar a classe Date para representar um nico ponto temporal, incluindo informaes de data e hora. Em uma ocorrncia de Date esto includos valores de unidades individuais de data e hora, como ano, ms, data, dia da semana, hora, minutos, segundos, milissegundos e fuso horrio. Para usos mais avanados, o ActionScript tambm inclui a classe Timer, que pode ser usada para realizar aes aps um determinado atraso ou em intervalos repetidos.

Tarefas comuns de data e hora


Este captulo descreve as seguintes tarefas comuns para trabalhar com informaes de data e hora:

Trabalho com os objetos de Date Obteno da data e hora atuais Acesso a unidades individuais de data e hora (dias, anos, horas, minutos e assim por diante) Clculos aritmticos com datas e horas Converso entre fusos horrios Realizao de aes repetitivas Realizao de aes aps um intervalo de tempo definido

Conceitos e termos importantes


A lista de referncia a seguir contm termos importantes usados neste captulo:

Horrio UTC: Horrio universal coordenado - o fuso horrio de referncia de zero hora. Todos os outros fusos
horrios so definidos como um nmero de horas (a mais ou a menos) em relao ao horrio UTC.

Teste dos exemplos do captulo


Talvez voc queira testar algumas das listagens de cdigo de exemplo por si prprio, durante a leitura deste captulo. Como as listagens de cdigo deste captulo tratam principalmente de objetos de Date, o teste dos exemplos envolve a visualizao dos valores das variveis usadas nos exemplos, por meio da insero de valores em uma ocorrncia de campo de texto no palco ou pelo uso da funo trace() para imprimir valores no painel Sada. Essas tcnicas so descritas em detalhes em Teste de listagens de cdigo de exemplo dos captulos na pgina 36.

PROGRAMAO DO ACTIONSCRIPT 3.0 135


Trabalho com datas e horas

Gerenciamento de datas de calendrio e horas


Todas as funes de gerenciamento de datas de calendrio e horas do ActionScript 3.0 esto concentradas na classe Date de nvel superior. A classe Date contm mtodos e propriedades que permitem manipular datas e horas no horrio UTC ou em um fuso horrio especfico local. O UTC uma definio de horrio padro basicamente igual ao horrio do Meridiano de Greenwich (GMT).

Criao de objetos de Date


A classe Date tem um dos mtodos de construtor mais versteis de todas as classes bsicas. possvel cham-la de quatro formas diferentes. Primeiro, se no houver nenhum parmetro, o construtor Date() retornar um objeto de Date que contm data e hora atuais, com base no seu fuso horrio local. Eis um exemplo:
var now:Date = new Date();

Segundo, se houver um nico parmetro numrico, o construtor Date() ir trat-lo como o nmero de milissegundos desde 1 de janeiro de 1970 e retornar um objeto de Date correspondente. Observe que o valor de milissegundos fornecido tratado como o nmero de milissegundos desde 1 de janeiro de 1970, em UTC. No entanto, o objeto Date mostra valores no seu fuso horrio local, a no ser que voc use mtodos especficos de UTC para recuper-los e exibilos. Se voc criar um novo objeto Date usando um nico parmetro de milissegundos, leve em considerao a diferena de fuso entre o horrio local e o UTC. As seguintes instrues criam um objeto Date definido como meia-noite do dia 1 de janeiro de 1970, em UTC:
var millisecondsPerDay:int = 1000 * 60 * 60 * 24; // gets a Date one day after the start date of 1/1/1970 var startTime:Date = new Date(millisecondsPerDay);

Terceiro, possvel transmitir vrios parmetros numricos para o construtor Date(). Esses parmetros so tratados como ano, ms, dia, hora, minuto, segundo e milissegundo, respectivamente, e um objeto Date correspondente retornado. Supe-se que esses parmetros de entrada esto no horrio local, no no UTC. As seguintes instrues obtm um objeto Date definido como meia-noite do dia 1 de janeiro de 2000, no horrio local:
var millenium:Date = new Date(2000, 0, 1, 0, 0, 0, 0);

Quarto, possvel transmitir um parmetro com uma nica string para o construtor Date(). O construtor tentar analisar os componentes de data ou hora dessa string e retornar um objeto Date correspondente. Se voc usar essa abordagem, recomendado colocar o construtor Date() entre um bloco try..catch para detectar qualquer erro de anlise. O construtor Date() aceita diversos formatos de string diferentes, conforme descrito no Guia de referncia de componentes e linguagem do ActionScript 3.0. A instruo a seguir inicializa um novo objeto Date usando um valor de string:
var nextDay:Date = new Date("Mon May 1 2006 11:30:00 AM");

Se o construtor Date() no conseguir analisar o parmetro de string, no lanar uma exceo. No entanto, o objeto Date resultante ter um valor de data invlido.

Obteno de valores de unidade de tempo


Voc pode extrair valores para vrias unidades de tempo de um objeto Date usando propriedades ou mtodos da classe Date. Cada propriedade a seguir fornece o valor de uma unidade de tempo no objeto Date:

A propriedade fullYear A propriedade month, que est em um formato numrico que vai de 0 para janeiro at 11 para dezembro

PROGRAMAO DO ACTIONSCRIPT 3.0 136


Trabalho com datas e horas

A propriedade date, que o nmero do calendrio do dia do ms, no intervalo de 1 a 31 A propriedade day, que o dia da semana em formato numrico, com 0 para domingo A propriedade hours, no intervalo de 0 a 23 A propriedade minutes A propriedade seconds A propriedade milliseconds
Na realidade, a classe Date fornece diversas maneiras para obter cada um desses valores. Voc pode obter, por exemplo, o valor do ms de um objeto Date de quatro formas diferentes:

A propriedade month O mtodo getMonth() A propriedade monthUTC O mtodo getMonthUTC()


Os quatro mtodos so praticamente iguais em termos de eficincia, de modo que voc pode usar a abordagem mais adequada para seu aplicativo. Todas as propriedades listadas acima representam componentes do valor de data total. Por exemplo, a propriedade milliseconds nunca ser maior do que 999, pois, quando atingir o nmero 1000, o valor da propriedade seconds aumentar em uma unidade e a propriedade milliseconds ser zerada. Se desejar obter o valor do objeto Date em termos de milissegundos desde 1 de janeiro de 1970 (UTC), use o mtodo getTime(). Seu correspondente, o mtodo setTime(), permite alterar o valor de um objeto Date existente usando os milissegundos desde 1 de janeiro de 1970 (UTC).

Execuo de clculos aritmticos de data e hora


possvel realizar operaes de adio e subtrao em datas e horas com a classe Date. Os valores de Date so mantidos internamente em termos de milissegundos, de modo que voc deve converter outros valores em milissegundos antes de adicion-los ou subtra-los dos objetos Date. Se o seu aplicativo efetua vrios clculos aritmticos de data e hora, crie constantes que armazenam valores comuns de unidade de tempo em milissegundos, conforme mostrado a seguir:
public static const millisecondsPerMinute:int = 1000 * 60; public static const millisecondsPerHour:int = 1000 * 60 * 60; public static const millisecondsPerDay:int = 1000 * 60 * 60 * 24;

Agora fcil efetuar clculos aritmticos de data usando unidades de tempo padro. O cdigo a seguir define um valor de data como uma hora do horrio atual usando os mtodos getTime() e setTime():
var oneHourFromNow:Date = new Date(); oneHourFromNow.setTime(oneHourFromNow.getTime() + millisecondsPerHour);

Outra maneira de definir um valor de data criar um novo objeto Date usando um nico parmetro de milissegundos. Por exemplo, o cdigo a seguir adiciona 30 dias a uma data para calcular outra:
// sets the invoice date to today's date var invoiceDate:Date = new Date(); // adds 30 days to get the due date var dueDate:Date = new Date(invoiceDate.getTime() + (30 * millisecondsPerDay));

PROGRAMAO DO ACTIONSCRIPT 3.0 137


Trabalho com datas e horas

Em seguida, a constante millisecondsPerDay multiplicada por 30 para representar o perodo de 30 dias e o resultado adicionado ao valor invoiceDate e usado para definir o valor dueDate.

Converso entre fusos horrios


Clculos aritmticos de data e hora so teis quando voc deseja converter datas de um fuso horrio para outro. O mtodo getTimezoneOffset() serve para isso, pois retorna o valor como a diferena de minutos entre o fuso horrio do objeto Date e o UTC. Ele retorna um valor em minutos porque nem todos os fusos horrios so definidos como incrementos de horas inteiras - alguns tm diferenas de meia hora em relao s zonas vizinhas. O exemplo a seguir usa a diferena de fuso para converter uma data do horrio local em UTC. Para fazer a converso, primeiro calcula-se o valor do fuso horrio em milissegundos e, depois, ajusta-se o valor de Date de acordo com o resultado:
// creates a Date in local time var nextDay:Date = new Date("Mon May 1 2006 11:30:00 AM"); // converts the Date to UTC by adding or subtracting the time zone offset var offsetMilliseconds:Number = nextDay.getTimezoneOffset() * 60 * 1000; nextDay.setTime(nextDay.getTime() + offsetMilliseconds);

Controle de intervalos de tempo


Ao desenvolver aplicativos usando o Adobe Flash CS4 Professional, voc tem acesso linha do tempo, que oferece uma progresso uniforme quadro a quadro do seu aplicativo. No entanto, em projetos exclusivamente do ActionScript, necessrio usar outros mecanismos de controle de tempo.

Loops versus timers


Em algumas linguagens de programao, voc deve desenvolver seus prprios esquemas de controle de tempo usando instrues de loop como for ou do..while. As instrues de loop geralmente so executadas conforme permitido pela mquina local, ou seja, o aplicativo executado mais rapidamente em algumas mquinas e mais lentamente em outras. Se o seu aplicativo precisa de um intervalo de tempo consistente, associe-o a um calendrio ou relgio real. Muitos aplicativos, como jogos, animaes e controladores em tempo real, precisam de mecanismos de tempo regulares que se adaptem a cada mquina. A classe Timer do ActionScript 3.0 fornece uma soluo incrvel. Usando o modelo de eventos do ActionScript 3.0, a classe Timer envia eventos de tempo sempre que um intervalo especificado atingido.

A classe Timer
O melhor modo de manipular funes de controle de tempo no ActionScript 3.0 usar a classe Timer (flash.utils.Timer) para enviar eventos sempre que um intervalo for atingido. Para iniciar um timer, voc precisa criar primeiro uma ocorrncia da classe Timer, informando com que freqncia um evento de tempo deve ser gerado e quantas vezes isso deve ser feito antes de parar. Por exemplo, o cdigo a seguir cria uma ocorrncia de Timer que envia um evento por segundo e continua durante 60 segundos:
var oneMinuteTimer:Timer = new Timer(1000, 60);

PROGRAMAO DO ACTIONSCRIPT 3.0 138


Trabalho com datas e horas

O objeto Timer envia um objeto TimerEvent sempre que o intervalo especificado atingido. Um tipo de evento do objeto TimerEvent timer (definido pela constante TimerEvent.TIMER). Um objeto TimerEvent contm as mesmas propriedades de um objeto Event padro. Se a ocorrncia de Timer for definida como um nmero fixo de intervalos, um evento timerComplete (definido pela constante TimerEvent.TIMER_COMPLETE) tambm ser enviado quando o intervalo final for atingido. Veja um pequeno aplicativo de exemplo que mostra a classe Timer em ao:
package { import flash.display.Sprite; import flash.events.TimerEvent; import flash.utils.Timer; public class ShortTimer extends Sprite { public function ShortTimer() { // creates a new five-second Timer var minuteTimer:Timer = new Timer(1000, 5); // designates listeners for the interval and completion events minuteTimer.addEventListener(TimerEvent.TIMER, onTick); minuteTimer.addEventListener(TimerEvent.TIMER_COMPLETE, onTimerComplete); // starts the timer ticking minuteTimer.start(); } public function onTick(event:TimerEvent):void { // displays the tick count so far // The target of this event is the Timer instance itself. trace("tick " + event.target.currentCount); } public function onTimerComplete(event:TimerEvent):void { trace("Time's Up!"); } } }

Ao ser criada, a classe ShortTimer cria uma ocorrncia de Timer que ser acionada uma vez por segundo durante cinco segundos. Em seguida, so adicionados dois ouvintes ao timer: um que ouve cada acionamento e outro que ouve o evento timerComplete. Em seguida, comea o acionamento do timer e, a partir desse ponto, o mtodo onTick() executado em intervalos de um segundo. O mtodo onTick() simplesmente exibe a contagem de acionamentos atual. Depois de cinco segundos, o mtodo
onTimerComplete() executado, informando que o tempo acabou.

Ao executar este exemplo, voc deve ver as seguintes linhas na janela do console ou rastreamento, na velocidade de uma linha por segundo:

PROGRAMAO DO ACTIONSCRIPT 3.0 139


Trabalho com datas e horas

tick 1 tick 2 tick 3 tick 4 tick 5 Time's Up!

Funes de controle de tempo do pacote flash.utils


O ActionScript 3.0 contm vrias funes de controle de tempo similares s que estavam disponveis no ActionScript 2.0. Essas funes so fornecidas no nvel do pacote flash.utils e funcionam da mesma maneira como no ActionScript 2.0.
Funo
clearInterval(id:uint):void clearTimeout(id:uint):void getTimer():int

Descrio Cancela uma chamada setInterval() especificada. Cancela uma chamada setTimeout() especificada. Retorna o nmero de milissegundos desde que o Adobe Flash Player ou o Adobe AIR foi inicializado.

setInterval(closure:Function, delay:Number, ... arguments):uint setTimeout(closure:Function, delay:Number, ... arguments):uint

Executa uma funo em um intervalo especificado (em milissegundos).

Executa uma funo especificada aps um atraso especificado (em milissegundos).

Essas funes esto includas no ActionScript 3.0 por questes de compatibilidade com verses anteriores. A Adobe no recomenda utiliz-las em novos aplicativos do ActionScript 3.0. Em geral, mais fcil e mais eficiente usar a classe Timer em seus aplicativos.

Exemplo: relgio analgico simples


O exemplo de um relgio analgico simples ilustra dois conceitos de data e hora discutidos neste captulo:

Obteno de data e hora atuais e extrao de valores para horas, minutos e segundos Utilizao de Timer para definir o ritmo de um aplicativo
Para obter os arquivos de aplicativo desse exemplo, consulte www.adobe.com/go/learn_programmingAS3samples_flash_br. Os arquivos do aplicativo SimpleClock esto localizados na pasta Amostras/SimpleClock. O aplicativo consiste nos seguintes arquivos:
Arquivo SimpleClockApp.mxml ou SimpleClockApp.fla com/example/programmingas3/simpleclock/SimpleClock.as com/example/programmingas3/simpleclock/AnalogClockFace.as O arquivo de aplicativo principal. Desenha a superfcie de um relgio redondo e os ponteiros de horas, minutos e segundos com base na hora. Descrio O arquivo principal do aplicativo no Flash (FLA) ou no Flex (MXML).

PROGRAMAO DO ACTIONSCRIPT 3.0 140


Trabalho com datas e horas

Definio da classe SimpleClock


O exemplo do relgio simples, mas uma boa idia para organizar at mesmo aplicativos simples que podem ser expandidos com facilidade no futuro. Para tanto, o aplicativo SimpleClock usa a classe SimpleClock para manipular as tarefas de inicializao e controle de tempo e usa outra classe chamada AnalogClockFace para exibir realmente a hora. Veja o cdigo que define e inicializa a classe SimpleClock (observe que, na verso Flash, SimpleClock estende a classe Sprite):
public class SimpleClock extends UIComponent { /** * The time display component. */ private var face:AnalogClockFace; /** * The Timer that acts like a heartbeat for the application. */ private var ticker:Timer;

A classe tem duas propriedades importantes:

A propriedade face, que uma ocorrncia da classe AnalogClockFace A propriedade ticker, que uma ocorrncia da classe Timer
A classe SimpleClock usa um construtor padro. O mtodo initClock() realiza o trabalho de configurao real, criando a superfcie do relgio e iniciando o acionamento da ocorrncia de Timer.

Criao da superfcie do relgio


As prximas linhas do cdigo SimpleClock criam a superfcie do relgio que usada para exibir a hora:
/** * Sets up a SimpleClock instance. */ public function initClock(faceSize:Number = 200) { // creates the clock face and adds it to the display list face = new AnalogClockFace(Math.max(20, faceSize)); face.init(); addChild(face); // draws the initial clock display face.draw();

O tamanho da superfcie pode ser transmitido para o mtodo initClock(). Se nenhum valor de faceSize for transmitido, ser usado o tamanho padro de 200 pixels. Em seguida, o aplicativo inicializa a superfcie e a adiciona lista de exibio usando o mtodo addChild() herdado da classe DisplayObject. O mtodo AnalogClockFace.draw() chamado para exibir a superfcie do relgio uma vez, mostrando a hora atual.

Incio do timer
Assim que a superfcie do relgio criada, o mtodo initClock() configura um timer:

PROGRAMAO DO ACTIONSCRIPT 3.0 141


Trabalho com datas e horas

// creates a Timer that fires an event once per second ticker = new Timer(1000); // designates the onTick() method to handle Timer events ticker.addEventListener(TimerEvent.TIMER, onTick); // starts the clock ticking ticker.start();

Primeiro, esse mtodo percorre uma ocorrncia de Timer que enviar um evento por segundo (a cada 1000 milissegundos). Como nenhum outro parmetro repeatCount transmitido para o construtor Timer(), o Timer ser repetido indefinidamente. O mtodo SimpleClock.onTick() ser executado uma vez por segundo quando o evento timer for recebido:
public function onTick(event:TimerEvent):void { // updates the clock display face.draw(); }

O mtodo AnalogClockFace.draw() simplesmente desenha a superfcie e os ponteiros do relgio.

Exibio do horrio atual


A maior parte do cdigo na classe AnalogClockFace envolve a configurao dos elementos de exibio da superfcie do relgio. Ao ser inicializado, o AnalogClockFace desenha um contorno circular, coloca um rtulo de texto numrico em cada marcao de hora e cria trs objetos Shape, um para cada ponteiro do relgio (horas, minutos e segundos). Assim que o aplicativo SimpleClock executado, o mtodo AnalogClockFace.draw() chamado a cada segundo do seguinte modo:
/** * Called by the parent container when the display is being drawn. */ public override function draw():void { // stores the current date and time in an instance variable currentTime = new Date(); showTime(currentTime); }

Este mtodo salva a hora atual em uma varivel para que o horrio no mude no meio do desenho dos ponteiros do relgio. Em seguida, o mtodo showTime() chamado para exibir os ponteiros do seguinte modo:

PROGRAMAO DO ACTIONSCRIPT 3.0 142


Trabalho com datas e horas

/** * Displays the given Date/Time in that good old analog clock style. */ public function showTime(time:Date):void { // gets the time values var seconds:uint = time.getSeconds(); var minutes:uint = time.getMinutes(); var hours:uint = time.getHours(); // multiplies by 6 to get degrees this.secondHand.rotation = 180 + (seconds * 6); this.minuteHand.rotation = 180 + (minutes * 6); // Multiply by 30 to get basic degrees, then // add up to 29.5 degrees (59 * 0.5) // to account for the minutes. this.hourHand.rotation = 180 + (hours * 30) + (minutes * 0.5); }

Primeiro, este mtodo extrai os valores para horas, minutos e segundos do horrio atual. Depois, esses valores so usados para calcular o ngulo de cada ponteiro. Como faz uma rotao completa em 60 segundos, o ponteiro dos segundos gira 6 graus a cada segundo (360/60). O ponteiro dos minutos gira do mesmo modo em cada minuto. O ponteiro das horas tambm atualizado a cada minuto e pode avanar um pouco medida que os minutos passam. Ele gira 30 graus por hora (360/12), mas tambm gira meio grau por minuto (30 graus dividido por 60 minutos).

143

Captulo 7: Trabalho com strings


A classe String contm mtodos que permitem trabalhar com strings de texto. Strings so importantes ao trabalhar com muitos objetos. Os mtodos descritos neste captulo so teis para trabalhar com strings usadas em objetos, como TextField, StaticText, XML, ContextMenu e FileReference. Strings so seqncias de caracteres. O ActionScript 3.0 oferece suporte a caracteres ASCII e Unicode.

Noes bsicas de strings


Introduo ao trabalho com strings
Em linguagem de programao, uma string um valor de texto, uma seqncia de letras, nmeros ou outros caracteres combinados em um nico valor. Por exemplo, esta linha de cdigo cria uma varivel com o tipo de dados String e atribui um valor de string literal quela varivel:
var albumName:String = "Three for the money";

Conforme mostrado nesse exemplo, no ActionScript possvel denotar um valor de string incluindo o texto entre aspas duplas ou simples. Estes so vrios exemplos adicionais de strings:
"Hello" "555-7649" "http://www.adobe.com/"

Ao manipular uma parte de texto no ActionScript, voc est trabalhando com um valor de string. A classe String do ActionScript o tipo de dados que pode ser usado para trabalhar com valores de texto. As ocorrncias de strings so usadas com freqncia para propriedades, parmetros de mtodos e assim por diante em muitas outras classes ActionScript.

Tarefas comuns do trabalho com strings


As seguintes so tarefas comuns relacionadas a strings que so exploradas neste captulo:

Criao de objetos String Trabalho com caracteres especiais, como retorno de carro, tabulao e caracteres que no fazem parte do teclado. Medio do comprimento da string Isolamento de caracteres individuais em uma string Juno de strings Comparao de strings Localizao, extrao e substituio de partes de uma string Colocao de strings em maisculas ou minsculas

PROGRAMAO DO ACTIONSCRIPT 3.0 144


Trabalho com strings

Conceitos e termos importantes


A lista de referncia a seguir contm termos importantes usados neste captulo:

ASCII: Um sistema que representa caracteres de texto e smbolos em programas de computador. O sistema ASCII
oferece suporte ao alfabeto ingls de 26 letras, mais um conjunto limitado de caracteres adicionais.

Caractere: A menor unidade de dados de texto (uma nica letra ou smbolo). Concatenao: Juno de vrios valores de strings com a adio de um ao final do outro, criando um novo valor de
string.

string vazia: Uma string que no contm nenhum texto, espao em branco ou outros caracteres, escrita como "".
Um valor de string vazia diferente de uma varivel String com um valor nulo, uma varivel String nula uma varivel que no tem uma ocorrncia de String atribuda a ela, enquanto que uma string vazia tem uma ocorrncia com um valor que no contm nenhum caractere.

String: Um valor textual (seqncia de caracteres). string literal (ou literal de string): Um valor de string escrito explicitamente em cdigo como um valor de texto
includo entre aspas duplas ou aspas simples.

Substring: Uma string que faz parte de outra string. Unicode: Um sistema padro que representa caracteres de texto e smbolos em programas de computador. O
sistema Unicode permite usar qualquer caractere em qualquer sistema de gravao.

Teste dos exemplos do captulo


Talvez voc queira testar algumas das listagens de cdigo de exemplo por si prprio, durante a leitura deste captulo. Como as listagens de cdigo deste captulo tratam principalmente de manipulao de texto, o teste dos exemplos envolve a exibio dos valores das variveis usadas nos exemplos, seja escrevendo valores em uma ocorrncia de campo de texto no Palco ou usando a funo trace() para imprimir valores no painel Sada. Essas tcnicas so descritas em detalhes em Teste de listagens de cdigo de exemplo dos captulos na pgina 36.

Criao de strings
A classe String usada para representar dados de string (textuais) no ActionScript 3.0. As strings do ActionScript oferecem suporte a caracteres ASCII e Unicode. A maneira mais simples de criar uma string usar uma string literal. Para declarar um string literal, use caracteres de aspas duplas retas (") ou de aspas simples ('). Por exemplo, as duas strings a seguir so equivalentes:
var str1:String = "hello"; var str2:String = 'hello';

Tambm possvel declarar uma string usando o operador new, da seguinte maneira:
var str1:String = new String("hello"); var str2:String = new String(str1); var str3:String = new String(); // str3 == ""

As duas strings a seguir so equivalentes:


var str1:String = "hello"; var str2:String = new String("hello");

PROGRAMAO DO ACTIONSCRIPT 3.0 145


Trabalho com strings

Para usar aspas simples (') em uma string literal definida com delimitadores de aspas simples ('), use o caractere de escape barra invertida (\). De maneira semelhante, para usar aspas duplas (") em uma string literal definida com delimitadores de aspas duplas ("), use o caractere de escape barra invertida (\). As duas strings a seguir so equivalentes:
var str1:String = "That's \"A-OK\""; var str2:String = 'That\'s "A-OK"';

possvel escolher o uso de aspas simples ou de aspas duplas com base em quaisquer aspas simples ou duplas existentes em uma string literal, como no exemplo a seguir:
var str1:String = "ActionScript <span class='heavy'>3.0</span>"; var str2:String = '<item id="155">banana</item>';

Lembre-se de que o ActionScript diferencia aspas simples retas (') e aspas simples esquerda ou direita (' ou ' ). O mesmo verdadeiro para aspas duplas. Use aspas retas para delinear strings literais. Ao colar texto de outra origem no ActionScript, use os caracteres corretos. Conforme mostrado na tabela a seguir, possvel usar o caractere de escape de barra invertida (\) para definir outros caracteres em strings literais:
Seqncia de escape
\b \f \n \r \t \unnnn

Caractere Backspace Feed de formulrio Nova linha Retorno de carro Tabulao O caractere Unicode com o cdigo de caractere especificado pelo nmero hexadecimal nnnn; por exemplo, \u263a o caractere smiley. O caractere ASCII com o cdigo de caractere especificado pelo nmero hexadecimal nn Aspas simples Aspas duplas Caractere de barra invertida simples

\\xnn \' \" \\

A propriedade length
Cada string tem uma propriedade length que igual ao nmero de caracteres da string:
var str:String = "Adobe"; trace(str.length); // output: 5

Uma string vazia e uma string nula tm um comprimento de 0, conforme mostrado no exemplo a seguir:
var str1:String = new String(); trace(str1.length); // output: 0 str2:String = ''; trace(str2.length);

// output: 0

PROGRAMAO DO ACTIONSCRIPT 3.0 146


Trabalho com strings

Trabalho com caracteres em strings


Cada caractere em uma string tem uma posio de ndice na string (um inteiro). A posio do ndice do primeiro caractere 0. Por exemplo, na seguinte string, o caractere y est na posio 0 e o caractere w est na posio 5:
"yellow"

possvel examinar caracteres individuais em vrias posies em uma string usando os mtodos charAt() e charCodeAt(), como neste exemplo:
var str:String = "hello world!"; for (var i:int = 0; i < str.length; i++) { trace(str.charAt(i), "-", str.charCodeAt(i)); }

Quando esse cdigo executado, a seguinte sada produzida:


h e l l o w o r l d ! - 104 - 101 - 108 - 108 - 111 32 - 119 - 111 - 114 - 108 - 100 - 33

Tambm possvel usar cdigos de caracteres para definir uma string usando o mtodo fromCharCode(), como no exemplo a seguir:
var myStr:String = String.fromCharCode(104,101,108,108,111,32,119,111,114,108,100,33); // Sets myStr to "hello world!"

Comparao de strings
possvel usar os seguintes operadores para comparar strings: <, <=, !=, ==, => e >. Esses operadores podem ser usados com declaraes condicionais, como if ewhile, como no exemplo a seguir:
var str1:String = "Apple"; var str2:String = "apple"; if (str1 < str2) { trace("A < a, B < b, C < c, ..."); }

Ao usar esses operadores com strings, o ActionScript considera o valor de cdigo de cada caractere na string, comparando da esquerda para a direita, como no seguinte exemplo:
trace("A" < "B"); // true trace("A" < "a"); // true trace("Ab" < "az"); // true trace("abc" < "abza"); // true

PROGRAMAO DO ACTIONSCRIPT 3.0 147


Trabalho com strings

Use os operadores == e != para comparar strings umas com as outras e para comparar strings com outros tipos de objetos, conforme mostrado no exemplo a seguir:
var str1:String = "1"; var str1b:String = "1"; var str2:String = "2"; trace(str1 == str1b); // true trace(str1 == str2); // false var total:uint = 1; trace(str1 == total); // true

Obteno de representaes de strings de outros objetos


possvel obter uma representao de String de qualquer tipo de objeto. Todos os objetos tm um mtodo toString() para essa finalidade:
var n:Number = 99.47; var str:String = n.toString(); // str == "99.47"

Ao usar o operador de concatenao + com uma combinao de objetos String que no so strings, no necessrio usar o mtodo toString(). Para obter detalhes sobre concatenao, consulte a seo a seguir. A funo global String() retorna o mesmo valor para um determinado objeto que o valor retornado pelo objeto de chamada do mtodo toString().

Concatenao de strings
A concatenao de strings significa utilizar duas strings e uni-las seqencialmente em uma. Por exemplo, possvel usar o operador + para concatenar duas strings:
var str1:String = "green"; var str2:String = "ish"; var str3:String = str1 + str2; // str3 == "greenish"

Tambm possvel usar o operador += para produzir o mesmo resultado, conforme mostrado no exemplo a seguir:
var str:String = "green"; str += "ish"; // str == "greenish"

Alm disso, a classe String inclui um mtodo concat() que pode ser usado da seguinte maneira:
var str1:String = "Bonjour"; var str2:String = "from"; var str3:String = "Paris"; var str4:String = str1.concat(" ", str2, " ", str3); // str4 == "Bonjour from Paris"

Se voc usar o operador + (ou o operador +=) com o objeto String e um objeto no-String, o ActionScript converter automaticamente o objeto no-String em um objeto String para avaliar a expresso, conforme mostrado neste exemplo:

PROGRAMAO DO ACTIONSCRIPT 3.0 148


Trabalho com strings

var str:String = "Area = "; var area:Number = Math.PI * Math.pow(3, 2); str = str + area; // str == "Area = 28.274333882308138"

No entanto possvel usar parnteses para agrupamento para fornecer contexto para o operador +, conforme mostrado no exemplo a seguir:
trace("Total: $" + 4.55 + 1.45); // output: Total: $4.551.45 trace("Total: $" + (4.55 + 1.45)); // output: Total: $6

Localizao de substrings e padres em strings


Substrings so strings dentro de uma string. Por exemplo, a string "abc" tem as seguinte substrings: "", "a", "ab", "abc", "b", "bc", "c". possvel usar os mtodos do ActionScript para localizar substrings de uma string. Padres so definidos no ActionScript por strings ou por expresses regulares. Por exemplo, a expresso regular a seguir define um padro especfico, as letras A, B e C seguidas por um caractere de dgito (as barras so delimitadores de expresses regulares):
/ABC\d/

O ActionScript inclui mtodos para localizao de padres em strings e para substituir correspondncias localizadas com substrings de substituio. Esses mtodos so descritos nas sees a seguir. Expresses regulares podem definir padres intrincados. Para obter mais informaes, consulte Uso de expresses regulares na pgina 209.

Localizao de uma substring pela posio do caractere


Os mtodos substr() e substring() so semelhantes. Os dois retornam uma substring de uma string. Os dois utilizam dois parmetros. Nos dois mtodos, o primeiro parmetro a posio do caractere inicial na string fornecida. No entanto, no mtodo substr(), o segundo parmetro o length da substring a ser retornada e, no mtodo substring(), o segundo parmetro a posio do caractere no end da substring (que no includa na string retornada). Este exemplo mostra a diferena entre esses dois mtodos:
var str:String = "Hello from Paris, Texas!!!"; trace(str.substr(11,15)); // output: Paris, Texas!!! trace(str.substring(11,15)); // output: Pari

O mtodo slice() funciona de maneira semelhante ao mtodo substring(). Quando recebe dois inteiros no negativos como parmetros, ele funciona exatamente da mesma forma. No entanto o mtodo slice() pode utilizar inteiros negativos como parmetros e nesse caso a posio do caractere utilizada a partir do final da string, conforme mostrado no exemplo a seguir:
var str:String = "Hello from Paris, trace(str.slice(11,15)); // output: trace(str.slice(-3,-1)); // output: trace(str.slice(-3,26)); // output: trace(str.slice(-3,str.length)); // trace(str.slice(-8,-3)); // output: Texas!!!"; Pari !! !!! output: !!! Texas

possvel combinar inteiros no negativos e negativos como os parmetros do mtodo slice().

PROGRAMAO DO ACTIONSCRIPT 3.0 149


Trabalho com strings

Localizao da posio do caractere de uma substring correspondente


possvel usar os mtodos indexOf() e lastIndexOf() para localizar substrings dentro de uma string, conforme mostrado no exemplo a seguir:
var str:String = "The moon, the stars, the sea, the land"; trace(str.indexOf("the")); // output: 10

Observe que o mtodo indexOf() faz distino entre maisculas e minsculas. possvel especificar um segundo parmetro para indicar a posio do ndice na string na qual iniciar a pesquisa, da seguinte maneira:
var str:String = "The moon, the stars, the sea, the land" trace(str.indexOf("the", 11)); // output: 21

O mtodo lastIndexOf() localiza a ltima ocorrncia de uma substring na string:


var str:String = "The moon, the stars, the sea, the land" trace(str.lastIndexOf("the")); // output: 30

Se voc incluir um segundo parmetro com o mtodo lastIndexOf(), a pesquisa ser conduzida naquela posio do ndice na string operando retroativamente (da direita para a esquerda):
var str:String = "The moon, the stars, the sea, the land" trace(str.lastIndexOf("the", 29)); // output: 21

Criao de uma matriz de substrings segmentadas por um delimitador


possvel usar o mtodo split() para criar uma matriz de substrings que dividida com base em um delimitador. Por exemplo, possvel segmentar uma string delimitada por vrgula ou por tabulao em vrias strings. O exemplo a seguir mostra como dividir uma matriz em substrings com o caractere e comercial (&) como o delimitador:
var queryStr:String = "first=joe&last=cheng&title=manager&StartDate=3/6/65"; var params:Array = queryStr.split("&", 2); // params == ["first=joe","last=cheng"]

O segundo parmetro do mtodo split(), que opcional, define o tamanho mximo da matriz retornada. Tambm possvel usar uma expresso regular como o caractere delimitador:
var str:String = "Give me\t5." var a:Array = str.split(/\s+/); // a == ["Give","me","5."]

Para obter mais informaes, consulte Uso de expresses regulares na pgina 209 e a Referncia dos componentes e da linguagem do ActionScript 3.0.

Localizao de padres em strings e substituio de substrings


A classe String inclui os seguintes mtodos para trabalhar com padres em strings:

Use os mtodos match() e search() para localizar substrings que correspondem a um padro. Use o mtodo replace() para localizar substrings que correspondem a um padro e substitu-las por uma
substring especificada. Esses mtodos so descritos nas sees a seguir. possvel usar strings ou expresses regulares para definir padres usados nesses mtodos. Para obter mais informaes sobre expresses regulares, consulte Uso de expresses regulares na pgina 209.

PROGRAMAO DO ACTIONSCRIPT 3.0 150


Trabalho com strings

Localizao de substrings correspondentes O mtodo search() retorna a posio do ndice da primeira substring que corresponde a um determinado padro, conforme mostrado neste exemplo:
var str:String = "The more the merrier."; // (This search is case-sensitive.) trace(str.search("the")); // output: 9

Tambm possvel usar expresses regulares para definir o padro a ser correspondido, conforme mostrado no exemplo a seguir:
var pattern:RegExp = /the/i; var str:String = "The more the merrier."; trace(str.search(pattern)); // 0

A sada do mtodo trace() 0, porque o primeiro caractere na string a posio 0 do ndice. O sinalizador i definido na expresso regular, portanto a pesquisa no faz distino entre maisculas e minsculas. O mtodo search() localiza apenas uma correspondncia e retorna sua posio inicial no ndice, mesmo que o sinalizador g (global) esteja definido na expresso regular. O exemplo a seguir mostra uma expresso regular mais intrincada que corresponde a uma string entre aspas duplas:
var pattern:RegExp = /"[^"]*"/; var str:String = "The \"more\" the merrier."; trace(str.search(pattern)); // output: 4 str = "The \"more the merrier."; trace(str.search(pattern)); // output: -1 // (Indicates no match, since there is no closing double quotation mark.)

O mtodo match() funciona de maneira semelhante. Ele pesquisa uma substring correspondente. No entanto quando voc usa o sinalizador global em um padro de expresso regular, como no exemplo a seguir, match() retorna uma matriz de substrings correspondentes:
var str:String = "bob@example.com, omar@example.org"; var pattern:RegExp = /\w*@\w*\.[org|com]+/g; var results:Array = str.match(pattern);

A matriz results definida como o seguinte:


["bob@example.com","omar@example.org"]

Para obter mais informaes sobre expresses regulares, consulte Uso de expresses regulares na pgina 209Uso de expresses regulares na pgina 209. Substituio de substrings correspondentes possvel usar o mtodo replace() para pesquisar um padro especificado em uma string e substituir correspondncias pela string de substituio especificada, conforme mostrado no exemplo a seguir:
var str:String = "She sells seashells by the seashore."; var pattern:RegExp = /sh/gi; trace(str.replace(pattern, "sch")); //sche sells seaschells by the seaschore.

Observe que, neste exemplo, as strings correspondentes no fazem distino entre maisculas e minsculas porque o sinalizador i (ignoreCase) est definido na expresso regular, e vrias correspondncias so substitudas porque o sinalizador g (global) est definido. Para obter mais informaes, consulte Uso de expresses regulares na pgina 209.

PROGRAMAO DO ACTIONSCRIPT 3.0 151


Trabalho com strings

possvel incluir os seguintes cdigos de substituio $na string de substituio. O texto de substituio mostrado na tabela a seguir inserido no lugar do cdigo de substituio $:
$ Code
$$ $& $`

Texto de substituio $ A substring correspondida. A parte da string que precede a substring correspondida. Esse cdigo usa o caractere aspas simples retas esquerdas (`), no aspas simples retas (') ou aspas simples inglesas esquerdas (' ). A parte da string que segue a substring correspondida. Esse cdigo usa as aspas simples retas (' ). A n correspondncia de grupo entre parnteses capturado, em que n um nico dgito, 1 a 9, e $n no seguido por um dgito decimal. A nn correspondncia de grupo entre parnteses capturado, em que nn um nmero decimal de dois dgitos (01 a 99). Se a nn captura estiver indefinida, o texto de substituio ser uma string vazia.

$' $n

$nn

Por exemplo, veja a seguir o uso dos cdigos de substituio $2 e $1 que representam o primeiro e o segundo grupos de captura correspondidos:
var str:String = "flip-flop"; var pattern:RegExp = /(\w+)-(\w+)/g; trace(str.replace(pattern, "$2-$1")); // flop-flip

Tambm possvel usar uma funo como o segundo parmetro do mtodo replace(). O texto correspondente substitudo pelo valor retornado da funo.
var str:String = "Now only $9.95!"; var price:RegExp = /\$([\d,]+.\d+)+/i; trace(str.replace(price, usdToEuro)); function usdToEuro(matchedSubstring:String, capturedMatch1:String, str:String):String { var usd:String = capturedMatch1; usd = usd.replace(",", ""); var exchangeRate:Number = 0.853690; var euro:Number = parseFloat(usd) * exchangeRate; const euroSymbol:String = String.fromCharCode(8364); return euro.toFixed(2) + " " + euroSymbol; } index:int,

Ao usar uma funo como o segundo parmetro do mtodo replace(), os seguintes argumentos so passados para a funo:

A parte correspondente da string. Quaisquer correspondncias de grupos entre parnteses capturadas. O nmero de argumentos transmitidos dessa
maneira ir variar dependendo do nmero de correspondncias parentticas. possvel determinar o nmero de correspondncias entre parnteses verificando arguments.length - 3 no cdigo da funo.

A posio de ndice na string em que a correspondncia comea. A string completa.

PROGRAMAO DO ACTIONSCRIPT 3.0 152


Trabalho com strings

Converso de strings entre maisculas e minsculas


Conforme mostrado no exemplo a seguir, os mtodos toLowerCase() e toUpperCase() convertem caracteres alfabticos da string em minsculas e maisculas, respectivamente:
var str:String = "Dr. Bob Roberts, #9." trace(str.toLowerCase()); // dr. bob roberts, #9. trace(str.toUpperCase()); // DR. BOB ROBERTS, #9.

Aps a execuo desses mtodos, a string de origem permanece inalterada. Para transformar a string de origem, use o seguinte cdigo:
str = str.toUpperCase();

Esses mtodos funcionam com caracteres estendidos, no simplesmente com a a z e A a Z:


var str:String = "Jos Bara"; trace(str.toUpperCase(), str.toLowerCase()); // JOS BARA jos bara

Exemplo: arte ASCII


Este exemplo de Arte ASCII mostra vrios recursos para trabalhar com a classe String no ActionScript 3.0, incluindo o seguinte:

O mtodo split() da classe String usado para extrair valores de uma string delimitada por caracteres
(informaes de imagem em um arquivo de texto delimitado por tabulao).

Vrias tcnicas de manipulao de string, incluindo split(), concatenao e extrao de uma parte da string
usando substring() e substr(), so usadas para colocar a primeira letra de cada palavra em maiscula nos ttulos de imagem.

O mtodo getCharAt() usado para obter um nico caractere de uma string (para determinar o caractere ASCII
correspondente a um valor de bitmap em escala de cinza).

A concatenao de string usada para criar a representao de arte ASCII de uma imagem com um caractere de
cada vez. O termo arte ASCII faz referncia a representaes de texto de uma imagem, na qual uma grade de caracteres de fonte monoespaada, como caracteres Courier New, plotam a imagem. A imagem a seguir mostra um exemplo de arte ASCII produzida pelo aplicativo:

A verso da arte ASCII do grfico mostrada direita.

PROGRAMAO DO ACTIONSCRIPT 3.0 153


Trabalho com strings

Para obter os arquivos de aplicativo deste exemplo, consulte www.adobe.com/go/learn_programmingAS3samples_flash_br. Os arquivos do aplicativo ASCIIArt podem ser encontrados na pasta Amostras/AsciiArt. O aplicativo consiste nos seguintes arquivos:
Arquivo AsciiArtApp.mxml ou AsciiArtApp.fla com/example/programmingas3/asciiArt/AsciiArtBuilder.as A classe que fornece a funcionalidade principal do aplicativo, incluindo a extrao de metadados da imagem de um arquivo de texto, carregamento de imagens e gerenciamento do processo de converso de imagem para texto. A classe que fornece o mtodo parseBitmapData() para converso de dados de imagem em uma verso String. Uma classe que representa uma imagem de bitmap carregada. Uma classe que representa metadados para uma imagem arte ASCII (como ttulo, URL do arquivo de imagem, etc.) Uma pasta que contm imagens usadas pelo aplicativo. O arquivo de texto delimitado por tabulao que contm informaes sobre as imagens a serem carregadas pelo aplicativo. Descrio O arquivo principal do aplicativo no Flash (FLA) ou no Flex (MXML).

com/example/programmingas3/asciiArt/BitmapToAsciiConverter.as

com/example/programmingas3/asciiArt/Image.as

com/example/programmingas3/asciiArt/ImageInfo.as

imagem/ txt/ImageData.txt

Extrao de valores delimitados por tabulao


Este exemplo usa a prtica comum de armazenar dados do aplicativo separados do prprio aplicativo. Dessa maneira, se os dados forem alterados (por exemplo, se outra imagem for adicionada ou um ttulo da imagem for alterado) no haver necessidade de recriar o arquivo SWF. Nesse caso, os metadados da imagem, incluindo o ttulo da imagem, a URL do arquivo real da imagem e alguns valores que so usados para manipular a imagem so armazenados em um arquivo de texto (o arquivo txt\ImageData.ttx do projeto). O contedo do arquivo de texto o seguinte:
FILENAMETITLEWHITE_THRESHHOLDBLACK_THRESHHOLD FruitBasket.jpgPear, apple, orange, and bananad810 Banana.jpgA picture of a bananaC820 Orange.jpgorangeFF20 Apple.jpgpicture of an apple6E10

O arquivo usa um formato delimitado por tabulao especfico. A primeira linha uma linha de ttulo. As linhas restantes contm os seguintes dados para cada bitmap a ser carregado:

O nome do arquivo do bitmap. O nome de exibio do bitmap. Os valores de limite de branco e de limite de preto dos bitmaps. Esses so valores hexadecimais acima e abaixo dos
quais um pixel deve ser considerado completamente branco ou completamente preto. Assim que o aplicativo iniciado, a classe AsciiArtBuilder carrega e analisa o contedo do arquivo de texto para criar a pilha de imagens que ir exibir usando o seguinte cdigo do mtodo parseImageInfo() da classe AsciiArtBuilder:

PROGRAMAO DO ACTIONSCRIPT 3.0 154


Trabalho com strings

var lines:Array = _imageInfoLoader.data.split("\n"); var numLines:uint = lines.length; for (var i:uint = 1; i < numLines; i++) { var imageInfoRaw:String = lines[i]; ... if (imageInfoRaw.length > 0) { // Create a new image info record and add it to the array of image info. var imageInfo:ImageInfo = new ImageInfo(); // Split the current line into values (separated by tab (\t) // characters) and extract the individual properties: var imageProperties:Array = imageInfoRaw.split("\t"); imageInfo.fileName = imageProperties[0]; imageInfo.title = normalizeTitle(imageProperties[1]); imageInfo.whiteThreshold = parseInt(imageProperties[2], 16); imageInfo.blackThreshold = parseInt(imageProperties[3], 16); result.push(imageInfo); } }

Todo o contedo do arquivo de texto contido em uma nica ocorrncia de String, a propriedade _imageInfoLoader.data. Usando o mtodo split() com o caractere de nova linha ("\n") como um parmetro, a ocorrncia de String dividida em uma matriz (linhas) cujos elementos so as linhas individuais do arquivo de texto. Em seguida, o cdigo usa um loop para trabalhar com cada uma das linhas (exceto a primeira, porque ela contm apenas cabealhos em vez do contedo real). Dentro do loop, o mtodo split() usado uma vez novamente para dividir o contedo da nica linha em um conjunto de valores (o objeto Array denominado imageProperties). O parmetro usado com o mtodo split() nesse caso o caractere de tabulao ("\t"), porque os valores de cada linha esto delineados por caracteres de tabulao.

Uso de mtodo String para normalizar ttulos de imagens


Uma da decises de design desse aplicativo que todos os ttulos de imagens so exibidos usando um formato padro, com a primeira letra de cada palavra colocada em maiscula (exceto por algumas palavras que normalmente no so colocadas em maisculas em ttulos em ingls). Em vez de assumir que o arquivo de texto contm ttulos formatados de maneira apropriada, o aplicativo formata os ttulos enquanto eles esto sendo extrados do arquivo de texto. Na listagem de cdigo anterior, como parte da extrao de valores individuais de metadados da imagem, a seguinte linha de cdigo usada:
imageInfo.title = normalizeTitle(imageProperties[1]);

Nesse cdigo, o ttulo da imagem do arquivo de texto passado pelo mtodo normalizeTitle() antes de ser armazenado no objeto ImageInfo:

PROGRAMAO DO ACTIONSCRIPT 3.0 155


Trabalho com strings

private { var var for { }

function normalizeTitle(title:String):String words:Array = title.split(" "); len:uint = words.length; (var i:uint; i < len; i++) words[i] = capitalizeFirstLetter(words[i]);

return words.join(" "); }

Esse mtodo usa o mtodo split() para dividir o ttulo em palavras individuais (separadas pelo caractere espao), passa cada palavra pelo mtodo capitalizeFirstLetter() e, em seguida, usa o mtodo join() da classe Array para combinar as palavras em uma nica string novamente. Como o nome sugere, o mtodo capitalizeFirstLetter() realmente faz o trabalho de colocar a primeira letra de cada palavra em maiscula:
/** * Capitalizes the first letter of a single word, unless it's one of * a set of words that are normally not capitalized in English. */ private function capitalizeFirstLetter(word:String):String { switch (word) { case "and": case "the": case "in": case "an": case "or": case "at": case "of": case "a": // Don't do anything to these words. break; default: // For any other word, capitalize the first character. var firstLetter:String = word.substr(0, 1); firstLetter = firstLetter.toUpperCase(); var otherLetters:String = word.substring(1); word = firstLetter + otherLetters; } return word; }

Em ingls, o caractere inicial de cada palavra em um ttulo no ser colocado em maiscula se a palavra for uma das seguintes: and, the, in, an, or, at, of ou a (essa uma verso simplificada das regras). Para executar essa lgica, o cdigo primeiro usa uma declarao switch para verificar se a palavra uma das palavras que no devem ser colocadas em letra maiscula. Nesse caso, o cdigo simplesmente ignora a declarao switch. Por outro lado, se a palavra precisar ser colocada em maiscula, isso ser feito em vrias etapas, da seguinte maneira:
1 A primeira letra da palavra extrada usando substr(0, 1) que extrai uma substring a partir do caractere no

ndice 0 (a primeira letra da string, conforme indicado pelo primeiro parmetro 0). A substring ter um caractere de comprimento (indicado pelo segundo parmetro 1).

PROGRAMAO DO ACTIONSCRIPT 3.0 156


Trabalho com strings

2 Esse caractere colocado em maiscula usando o mtodo toUpperCase(). 3 Os caracteres restantes da palavra original so extrados usando substring(1) que extrai uma substring no ndice

1 (a segunda letra) at o final da string (indicado pela omisso do segundo parmetro do mtodo substring()).
4 A palavra final criada combinando a primeira letra recm colocada em maiscula com as letras restantes usando

concatenao de strings: firstLetter + otherLetters.

Gerao do texto de arte ASCII


A classe BitmapToAsciiConverter fornece a funcionalidade de converter uma imagem de bitmap em sua representao de texto ASCII. Esse processo executado pelo mtodo parseBitmapData() que parcialmente mostrado aqui:
var result:String = ""; // Loop through the rows of pixels top to bottom: for (var y:uint = 0; y < _data.height; y += verticalResolution) { // Within each row, loop through pixels left to right: for (var x:uint = 0; x < _data.width; x += horizontalResolution) { ... // Convert the gray value in the 0-255 range to a value // in the 0-64 range (since that's the number of "shades of // gray" in the set of available characters): index = Math.floor(grayVal / 4); result += palette.charAt(index); } result += "\n"; } return result;

Esse cdigo primeiro define uma ocorrncia de String denominada result que ser usada para criar a verso de arte ASCII da imagem de bitmap. Em seguida, ela executa loop pelos pixels individuais da imagem do bitmap de origem. Usando vrias tcnicas de manipulao de cores (omitidas aqui para resumir), ela converte os valores das cores vermelho, verde e azul de um pixel individual em um valor de escala de cinza nico (um nmero de 0 a 255). Em seguida, o cdigo divide esse valor por 4 (conforme mostrado) para convert-lo em um valor na escala de 0 a 63 que armazenado na varivel index. (A escala de 0 a 63 usada porque o palete de caracteres ASCII disponveis usado por esse aplicativo contm 64 valores.) O palete de caracteres definido como uma ocorrncia de String na classe BitmapToAsciiConverter:
// The characters are in order from darkest to lightest, so that their // position (index) in the string corresponds to a relative color value // (0 = black). private static const palette:String = "@#$%&8BMW*mwqpdbkhaoQ0OZXYUJCLtfjzxnuvcr[]{}1()|/?Il!i><+_~-;,. ";

Como a varivel index define qual caractere ASCII no palete corresponde ao pixel atual na imagem de bitmap, esse caractere recuperado da String palette usando o mtodo charAt(). Em seguida, ele anexado ocorrncia da String result usando o operador de atribuio de concatenao (+=). Alm disso, no final de cada linha de pixels, um caractere de nova linha concatenado ao final da String result, forando uma quebra de linha para criar uma nova linha de pixels de caracteres.

157

Captulo 8: Trabalho com matrizes


As matrizes permitem que voc armazene vrios valores em uma nica estrutura de dados. possvel usar matrizes indexadas simples que armazenam valores usando ndices de nmeros ordinais inteiros e fixos ou matrizes associativas complexas que armazenam valores usando chaves arbitrrias. As matrizes tambm podem ser multidimensionais, contendo elementos que j so matrizes propriamente ditas. Finalmente, voc pode usar um Vetor para uma matriz cujos elementos so ocorrncias do mesmo tipo de dados. Este captulo discute como criar e manipular vrios tipos de matriz.

Noes bsicas sobre matrizes


Introduo ao trabalho com matrizes
Em programao comum o trabalho com uma srie de itens, e no com um nico objeto. Por exemplo, talvez voc queira ter uma lista de msicas pronta para ser reproduzida em um aplicativo de player de msica. Voc certamente no optaria por criar uma varivel especfica para cada msica da lista. Seria melhor juntar todos os objetos Song em um pacote e trabalhar com eles como se fossem um grupo. Uma matriz um elemento de programao que funciona como continer para um conjunto de itens, como uma lista de msicas. De modo geral, todos os itens da matriz so ocorrncias da mesma classe, mas isso no uma exigncia no ActionScript. Os itens individuais de uma matriz so conhecidos como elementos da matriz. A matriz pode ser considerada como um arquivador de variveis. As variveis podem ser adicionadas como elementos na matriz, como quando voc coloca uma pasta em seu arquivador. Voc pode trabalhar com a matriz como uma nica varivel, como carregar todo o seu arquivo para um outro local. Voc pode trabalhar com as variveis como um grupo, como analisar as pastas uma a uma para buscar informaes. Voc tambm pode acess-las individualmente, como se estivesse abrindo o arquivo e selecionando uma nica pasta. Por exemplo, imagine que est criando um aplicativo de player de msica no qual o usurio pode selecionar vrias msicas e adicion-las a uma lista de reproduo. No cdigo do ActionScript, h um mtodo chamado addSongsToPlaylist(), que aceita uma nica matriz como parmetro. Independentemente da quantidade de msicas que forem adicionadas lista (poucas, muitas ou apenas uma), voc pode chamar o mtodo addSongsToPlaylist() apenas uma vez, transmitindo a matriz que contm os objetos Song. Dentro do mtodo addSongsToPlaylist(), voc pode usar um loop para navegar entre os elementos da matriz (as msicas) uma a uma e adicion-las lista de reproduo. A matriz indexada o tipo de matriz mais comum do ActionScript. Em uma matriz indexada, cada item armazenado em um slot numerado (conhecido como ndice). Os itens so acessados por meio de nmeros, como em endereos. As matrizes indexadas atendem a maior parte das exigncias de programao. A classe Array uma das classes mais comuns utilizada para representar uma matriz indexada. Em geral, uma matriz indexada usada para armazenar vrios itens do mesmo tipo (objetos que so ocorrncias da mesma classe). A classe Array no tem meios de restringir o tipo de itens que ela contm. A classe Vector o tipo de matriz indexada no qual todos os itens de uma nica matriz so do mesmo tipo. O uso da ocorrncia Vector em vez de Array tambm pode proporcionar melhorias no desempenho, alm de outras vantagens. A classe Vector est disponvel a partir do Flash Player 10.

PROGRAMAO DO ACTIONSCRIPT 3.0 158


Trabalho com matrizes

A matriz multidimensional representa um caso especial de utilizao de matrizes indexadas. Uma matriz multidimensional uma matriz indexada cujos elementos so matrizes indexadas que, por sua vez, contm outros elementos. A matriz associativa um outro tipo de matriz, que usa uma string key em vez do ndice numrico para identificar elementos individuais. Por fim, o ActionScript 3.0 tambm possui a classe Dictionary, que representa um dicionrio. Um dicionrio uma matriz que permite o uso de qualquer tipo de objeto como uma chave de distino entre elementos.

Tarefas comuns de matrizes


As seguintes atividades comuns para se trabalhar com matrizes so descritas neste captulo:

Criao de matrizes indexadas usando as classes Array e Vector Adio e remoo de elementos de matriz Classificao de elementos de matriz Extrao de partes de uma matriz Trabalho com matrizes associativas e dicionrios Trabalho com matrizes multidimensionais Cpia de elementos de matriz Criao de uma subclasse de matriz

Conceitos e termos importantes


A lista de referncia a seguir contm termos importantes usados neste captulo:

Matriz: um objeto que serve como continer para agrupar vrios objetos Operador de acesso matriz ([]): um par de colchetes que circundam um ndice ou uma chave e identifica
exclusivamente um elemento de matriz. Essa sintaxe usada aps um nome de varivel de matriz para especificar um nico elemento da matriz, em vez de especific-la inteira.

Matriz associativa: uma matriz que usa chaves de string para identificar elementos individuais Tipo base: o tipo de dados dos objetos que uma ocorrncia de Vector pode armazenar Dicionrio: uma matriz cujos itens consistem em pares de objetos, conhecidos como chaves e valores. A chave
usada no lugar de um ndice numrico para identificar um nico elemento.

Elemento: um item nico de uma matriz ndice: o "endereo" numrico usado para identificar um nico elemento em uma matriz indexada Matriz indexada: o tipo padro da matriz que armazena cada elemento em uma posio numerada e usa o nmero
(ndice) para identificar elementos individuais

Chave: a string ou o objeto usado para identificar um nico elemento em uma matriz associativa ou em um
dicionrio

Matriz multidimensional: uma matriz que contm itens que so matrizes, em vez de valores nicos
T: a conveno padro usada nesta documentao para representar o tipo base de uma ocorrncia de Vector, independentemente do tipo base. A conveno T usada para representar um nome de classe, conforme exibido na descrio do parmetro Type. (T corresponde a tipo, como em tipo de dados).

PROGRAMAO DO ACTIONSCRIPT 3.0 159


Trabalho com matrizes

Parmetro Type: a sintaxe usada com o nome da classe Vector para especificar o tipo base do vetor (o tipo de
dados dos objetos que ele armazena). A sintaxe consiste em um ponto (.), seguido do nome do tipo de dados entre colchetes angulares (<>). Resumindo, teremos algo como: Vector.<T>. Nessa documentao, a classe especificada no parmetro type representada genericamente como T.

Vector: um tipo de matriz cujos elementos so todos ocorrncias do mesmo tipo de dados

Teste dos exemplos do captulo


Durante a leitura deste captulo, talvez voc queira testar algumas listagens de cdigo de exemplo sozinho. Basicamente, todas as listagens de cdigo deste captulo incluem a chamada de funo trace() apropriada. Para testar as listagens de cdigo deste captulo:
1 Crie um documento vazio com a ferramenta de autoria do Flash 2 Selecione um quadro-chave na linha de tempo. 3 Abra o painel Aes e copie a listagem de cdigo no painel Script. 4 Execute o programa usando o comando Controlar > Testar filme.

Voc ver os resultados da funo trace() no painel Sada. Essa e outras tcnicas para testar as listagens de cdigo de exemplo esto descritas detalhadamente em Teste de listagens de cdigo de exemplo dos captulos na pgina 36.

Matrizes indexadas
As matrizes indexadas armazenam uma srie de um ou mais valores organizados de tal maneira que cada valor pode ser acessado com um valor inteiro sem sinal. O primeiro ndice sempre o nmero 0 e o ndice aumenta em incrementos de 1 para cada elemento subseqente adicionado matriz. No ActionScript 3.0, duas classes so usadas como matrizes indexadas: classes Array e Vector. As matrizes indexadas usam um inteiro de 32 bits sem sinal como nmero do ndice. O tamanho mximo de uma matriz indexada 232 - 1 ou 4.294.967.295. Uma tentativa de criar uma matriz maior que o tamanho mximo resulta em um erro de tempo de execuo. Para acessar um elemento individual de uma matriz indexada, use o operador de acesso matriz ([]) para especificar a posio de ndice do elemento que deseja acessar. Por exemplo, o cdigo a seguir representa o primeiro elemento (o elemento no ndice 0) em uma matriz indexada chamada songTitles:
songTitles[0]

A combinao do nome da varivel de matriz seguido pelo ndice entre colchetes funciona como um identificador nico (em outras palavras, ele pode ser usado da mesma forma que um nome de varivel). Voc pode atribuir um valor para um elemento de matriz indexada usando o nome e o ndice esquerda de uma instruo de atribuio:
songTitles[1] = "Symphony No. 5 in D minor";

Da mesma forma, voc pode recuperar o valor de um elemento de matriz indexada usando o nome e o ndice direita de uma instruo de atribuio:
var nextSong:String = songTitles[2];

PROGRAMAO DO ACTIONSCRIPT 3.0 160


Trabalho com matrizes

Voc tambm pode usar uma varivel entre colchetes em vez de fornecer um valor explcito (a varivel deve conter um valor inteiro no-negativo como uint, um nmero inteiro positivo ou uma ocorrncia de Number de um nmero inteiro positivo). Geralmente, essa tcnica usada para fazer um loop dos elementos de uma matriz indexada e executar uma operao em alguns ou todos os elementos. A lista de cdigos a seguir demonstra essa tcnica: O cdigo usa um loop para acessar cada valor em um objeto Array denominado oddNumbers. Ele usa a instruo trace() para imprimir cada valor da frmula oddNumber[index] = value:
var oddNumbers:Array = [1, 3, 5, 7, 9, 11]; var len:uint = oddNumbers.length; for (var i:uint = 0; i < len; i++) { trace("oddNumbers[" + i.toString() + "] = " + oddNumbers[i].toString()); }

Classe Array A classe Array o primeiro tipo de matriz indexada. Uma ocorrncia de Array pode armazenar valores de qualquer tipo de dados. O mesmo objeto Array pode armazenar objetos de diferentes tipos de dados. Por exemplo, uma nica ocorrncia de Array pode ter um valor String no ndice 0, uma ocorrncia de Number no ndice 1 e um objeto XML no ndice 2. Classe Vector A classe Vector corresponde a outro tipo de matriz indexada que est disponvel no ActionScript 3.0. Uma ocorrncia de Vector uma matriz tipificada, o que significa que todos os elementos dessa ocorrncia possuem o mesmo tipo de dados. Nota: A classe Vector est disponvel a partir do Flash Player 10. Quando voc declara uma varivel Vector ou cria ocorrncia de um objeto Vector, est especificando explicitamente os tipos de dados dos objetos que o vetor pode conter. O tipo de dados especificado conhecido como o tipo base do vetor. Nos tempos de execuo e de compilao (no modo restrito), qualquer cdigo que define o valor de um elemento Vector ou recupera um valor de um vetor verificado. Se o tipo de dados do objeto que est sendo adicionado ou recuperado no corresponder ao tipo base do vetor, ocorrer um erro. Alm da restrio de tipo de dados, a classe Vector tem outras restries que a diferenciam da classe Array:

Um vetor uma matriz densa. Um objeto Array pode ter valores nos ndices 0 e 7, mesmo se no tiver valores nas
posies de 1 a 6. Entretanto, um vetor deve ter um valor (ou null) em cada ndice.

Um vetor pode ter tamanho fixo, opcionalmente. Isso significa que o nmero de elementos contidos no vetor no
pode ser alterado.

Os limites de acesso aos elementos de um vetor so verificados. No possvel ler um valor de um ndice maior que
o elemento final (tamanho - 1). Nunca defina um valor com um ndice que exceda o ndice final atual (em outras palavras, voc s pode definir um valor em um ndice existente ou no ndice [length]). Como resultado das restries, um vetor tem duas vantagens principais sobre uma ocorrncia de Array cujos elementos so ocorrncias de uma nica classe:

Desempenho: a iterao e o acesso ao elemento da matriz so muito mais rpidos ao usar uma ocorrncia de Vector
do que ao usar uma de Array.

PROGRAMAO DO ACTIONSCRIPT 3.0 161


Trabalho com matrizes

Segurana do tipo: o compilador pode identificar erros de tipo de dados no modo restrito. Exemplos de erros desse
tipo incluem a atribuio de valor de um tipo de dados incorreto ao um vetor ou a espera do tipo de dados errado na leitura de um valor de um vetor. Em tempo de execuo, os tipos de dados tambm so verificados durante a adio ou leitura de dados de um objeto Vector. Observe, entretanto, que ao usar o mtodo push() ou unshift() para adicionar valores a um vetor, os tipos de dados dos argumentos no so verificados durante a compilao. Quando usar esses mtodos, os valores sero verificados no tempo de execuo. Com exceo das restries adicionais e vantagens, a classe Vector muito parecida com a classe Array. As propriedades e os mtodos de um objeto Vector so semelhantes em grande parte, idnticos aos de um Array. De qualquer forma, quando voc usa uma Matriz em que todos os elementos tm o mesmo tipo de dados, uma ocorrncia de Vector tem preferncia.

Criao de matrizes
possvel usar diversas tcnicas para criar uma ocorrncia de Array ou Vector. No entanto, as tcnicas para criao de cada tipo de matriz apresentam diferenas entre si.

Criao de uma ocorrncia de Array


possvel criar um objeto Array ao chamar o construtor Array() ou ao usar a sintaxe literal de matriz. A funo de construtor Array() pode ser usada de trs modos: Primeiro, se voc chama o construtor sem nenhum argumento, obtm uma matriz vazia. Voc pode usar a propriedade length da classe Array para verificar se a matriz no tem nenhum elemento. Por exemplo, o cdigo a seguir chama o construtor Array() sem nenhum argumento:
var names:Array = new Array(); trace(names.length); // output: 0

Segundo, se voc usar um nmero como o nico parmetro do construtor Array(), uma matriz com esse comprimento ser criada, com o valor de cada elemento definido como undefined. O argumento deve ser um nmero inteiro sem sinal entre os valores 0 e 4.294.967.295. Por exemplo, o cdigo a seguir chama o construtor Array() com um nico argumento numrico:
var names:Array = new Array(3); trace(names.length); // output: 3 trace(names[0]); // output: undefined trace(names[1]); // output: undefined trace(names[2]); // output: undefined

Terceiro, se voc chama o construtor e transmite uma lista de elementos como parmetros, uma matriz com elementos correspondem a cada parmetro criada. O cdigo a seguir transmite trs argumentos para o construtor Array():
var names:Array = new Array("John", "Jane", "David"); trace(names.length); // output: 3 trace(names[0]); // output: John trace(names[1]); // output: Jane trace(names[2]); // output: David

Voc tambm pode criar matrizes com literais de matriz. Um literal de matriz pode ser atribudo diretamente a uma varivel de matriz, como mostra o exemplo a seguir:
var names:Array = ["John", "Jane", "David"];

Criao de uma ocorrncia de Vector


Voc pode criar uma ocorrncia de Vector ao chamar o construtor Vector.<T>(). Voc tambm pode criar um vetor ao chamar a funo global Vector.<T>(). Essa funo converte um objeto especificado em uma ocorrncia de Vector. O ActionScript no contm vetores equivalentes sintaxe do literal de matriz.

PROGRAMAO DO ACTIONSCRIPT 3.0 162


Trabalho com matrizes

Quando voc declara uma varivel de vetor (ou do mesmo modo, um parmetro de mtodo de vetor ou um tipo de retorno de mtodo), est especificando o tipo base da varivel de vetor. O tipo base tambm especificado quando voc cria uma ocorrncia de Vector ao chamar o construtor Vector.<T>(). Em outras palavras, sempre que usar o termo Vector no ActionScript, ele estar acompanhado por um tipo base. O tipo base do vetor especificado por meio de uma sintaxe de parmetro de tipo. O parmetro de tipo segue imediatamente a palavra Vector no cdigo. Esse parmetro consiste em um ponto (.), seguido do nome de classe base entre colchetes angulares (<>), conforme apresentado no exemplo a seguir:
var v:Vector.<String>; v = new Vector.<String>();

Na primeira linha do exemplo, a varivel v est declarada como uma ocorrncia de Vector.<String>. Em outras palavras, ela representa uma matriz indexada que pode conter apenas ocorrncias de String. A segunda linha chama o construtor Vector() para criar uma ocorrncia do mesmo tipo de vetor, ou seja, um vetor cujos elementos so objetos String. Esse construtor atribui o objeto a v. Uso do construtor Vector.<T>() Caso voc use o construtor Vector.<T>() sem quaisquer argumentos, uma ocorrncia de Vector vazia ser criada. Voc pode verificar se um vetor est vazio ao conferir sua propriedade length. Por exemplo, o cdigo a seguir chama o construtor Vector.<T>() sem argumentos:
var names:Vector.<String> = new Vector.<String>(); trace(names.length); // output: 0

Voc pode predefinir a quantidade de elementos que um vetor precisa ter inicialmente, se tiver essa informao antecipadamente. Para criar um vetor com um determinado nmero de elementos, transfira o nmero de elementos como o primeiro parmetro (o parmetro length). Os elementos Vector so preenchidos com ocorrncias do tipo base, j que no podem ficar vazios. Se o tipo base um tipo de referncia que permite valores null, todos os elementos contero null. Caso contrrio, os elementos contero o valor padro para a classe. Por exemplo, uma varivel uint no pode ser null. Conseqentemente, o cdigo a seguir que lista o vetor chamado ages criado com sete elementos contendo o valor 0:
var ages:Vector.<uint> = new Vector.<uint>(7); trace(ages); // output: 0,0,0,0,0,0,0

Por fim, ao usar o construtor Vector.<T>(), voc tambm poder criar um vetor de tamanho fixo ao passar true para o segundo parmetro (o parmetro fixed). Nesse caso o vetor criado com o nmero de elementos especificado e esse nmero no pode ser alterado. Note, no entanto, que ainda ser possvel mudar os valores dos elementos de um vetor de tamanho fixo. Diferentemente do que ocorre na classe Array, no possvel passar a lista de valores para o construtor Vector.<T>() para especificar os valores iniciais do vetor. Uso da funo global Vector.<T>() Alm do construtor Vector.<T>(), voc tambm pode usar a funo global Vector.<T>() para criar um objeto Vector. A funo global Vector.<T>() uma funo de converso. Quando a funo global Vector.<T>() chamada, voc est especificando o tipo base do vetor que o mtodo retorna. Com isso, uma nica matriz indexada (ocorrncia de Array ou Vector) passada como um argumento. Em seguida, o mtodo retorna um vetor com o tipo base especificado, contendo os valores do argumento da matriz de origem. A listagem de cdigo a seguir exibe a sintaxe necessria para chamar a funo global Vector.<T>():
var friends:Vector.<String> = Vector.<String>(["Bob", "Larry", "Sarah"]);

PROGRAMAO DO ACTIONSCRIPT 3.0 163


Trabalho com matrizes

A funo global Vector.<T>() executa a converso do tipo de dados em dois nveis. Primeiro, uma ocorrncia de Vector retornada quando uma ocorrncia de Array passada para a funo. Segundo, quando a matriz de origem uma ocorrncia de Array ou Vector, a funo tenta converter os elementos da matriz de origem em valores do tipo base. A converso usa regras de converso de tipo de dados padro do ActionScript. Por exemplo, a listagem de cdigo a seguir converte os valores de string na matriz de origem para nmeros inteiros no vetor resultante. A parte decimal do primeiro valor ("1.5") est truncada e o terceiro valor no-numrico ("Waffles") convertido para 0 no resultado:
var numbers:Vector.<int> = Vector.<int>("1.5", "17", "Waffles"]); trace(numbers); // output: 1,17,0

Se no for possvel converter nenhum dos elementos de origem, ocorrer um erro. Quando o cdigo chama a funo global Vector.<T>(), se um elemento da matriz de origem uma ocorrncia de uma subclasse do tipo base especificado, o elemento adicionado ao vetor resultante (no h ocorrncia de erros). O uso da funo global Vector.<T>() o nico modo de converter um vetor com tipo base T em um vetor com tipo base que seja uma superclasse de T.

Insero de elementos de matriz


A maneira mais simples de adicionar um elemento a uma matriz indexada usar o operador de acesso matriz ([]). Para definir um valor de um elemento de matriz indexada, use o nome de objeto Array ou Vector e o nmero de ndice esquerda de uma instruo de atribuio:
songTitles[5] = "Happy Birthday";

Se a matriz ou o vetor ainda no tiver um elemento no ndice, esse ndice ser criado e o valor ser armazenado nele. Se houver um valor no ndice, o novo valor substituir o existente. Um objeto Array permite a criao de um elemento em qualquer ndice. Entretanto, com um objeto Vector voc somente poder atribuir um valor a um ndice existente ou ao prximo ndice disponvel. O prximo ndice disponvel corresponde propriedade length do objeto Vector. A maneira mais segura de adicionar um novo elemento a um objeto Vector usar um cdigo como na listagem a seguir:
myVector[myVector.length] = valueToAdd;

Trs mtodos da classe Array e Vector - push(), unshift() e splice() - permitem inserir elementos em uma matriz indexada. O mtodo push() anexa um ou mais elementos ao final de uma matriz. Em outras palavras, o ltimo elemento inserido na matriz com o mtodo push() ter o maior nmero de ndice. O mtodo unshift() insere um ou mais elementos no incio de uma matriz, sempre no nmero de ndice 0. O mtodo splice() insere qualquer nmero de itens em um ndice especificado na matriz. O exemplo a seguir demonstra os trs mtodos. Uma matriz chamada planetas criada para armazenar os nomes dos planetas de acordo com a proximidade ao Sol. Primeiro, o mtodo push() chamado para adicionar o item inicial, Marte. Segundo, o mtodo unshift() chamado para inserir o item que pertence ao incio da matriz, Mercrio. Finalmente, o mtodo splice() chamado para inserir os itens Vnus e Terra depois de Mercrio, mas antes de Marte. O primeiro argumento enviado para splice(), o inteiro 1, direciona a insero para comear no ndice 1. O segundo argumento enviado para splice(), o inteiro 0, indica que nenhum item deve ser excludo. Finalmente, o terceiro e quarto argumentos enviados para splice(), Vnus e Terra, so os itens que devem ser inseridos.
var planets:Array = new Array(); planets.push("Mars"); // array contents: Mars planets.unshift("Mercury"); // array contents: Mercury,Mars planets.splice(1, 0, "Venus", "Earth"); trace(planets); // array contents: Mercury,Venus,Earth,Mars

PROGRAMAO DO ACTIONSCRIPT 3.0 164


Trabalho com matrizes

Os mtodos push() e unshift() retornam um inteiro sem sinal que representa o comprimento da matriz modificada. O mtodo splice() retorna uma matriz vazia quando usado para inserir elementos, o que pode parecer estranho, mas faz mais sentido de acordo com a versatilidade do mtodo splice(). Voc pode usar o mtodo splice() no s para inserir elementos em uma matriz, mas tambm para remover elementos de uma matriz. Quando usado para remover elementos, o mtodo splice() retorna uma matriz que contm os elementos removidos. Nota: Se a propriedade fixed do objeto Vector for true, o nmero total de elementos do vetor no poder ser alterado. Se voc tentar adicionar um novo elemento a um vetor de tamanho fixo por meio de tcnicas aqui descritas, ocorrer um erro.

Recuperao de valores e remoo de elementos de matriz


A maneira mais simples de recuperar o valor de um elemento de uma matriz indexada usar o operador de acesso matriz ([]). Para recuperar o valor de um elemento de matriz indexada, use o nome de objeto Array ou Vector e o nmero de ndice direita de uma instruo de atribuio:
var myFavoriteSong:String = songTitles[3];

Voc pode tentar recuperar um valor de uma matriz ou vetor usando um ndice onde no houver elementos. Nesse caso, um objeto Array retorna um valor indefinido e um vetor emite uma exceo RangeError. Trs mtodos das classes Array e Vector - pop(), shift() e splice() - permitem a remoo de elementos. O mtodo pop() remove um elemento do final da matriz. Em outras palavras, ele remove o elemento com o nmero de ndice mais alto. O mtodo shift() remove um elemento do incio da matriz, ou seja, sempre remove o elemento com o nmero de ndice 0. O mtodo splice(), que tambm pode ser usado para inserir elementos, remove um nmero arbitrrio de elementos comeando no nmero de ndice especificado pelo primeiro argumento enviado ao mtodo. O exemplo a seguir usa os trs mtodos para remover elementos de uma ocorrncia de Array. Uma matriz chamada
oceanos criada para armazenar os nomes dos grandes corpos de gua. Alguns nomes da matriz referem-se a lagos,

no a oceanos, e precisam ser removidos. Primeiro, o mtodo splice() usado para remover os itens Aral e Superior, e inserir os itens Atlntico e ndico. O primeiro argumento enviado para splice(), o inteiro 2, indica que a operao deve comear com o terceiro item da lista, que est no ndice 2. O segundo argumento, 2, indica que dois itens devem ser removidos. Os argumentos restantes, Atlntico e ndico, so os valores que devem ser inseridos no ndice 2. Segundo, o mtodo pop() usado para remover o ltimo elemento da matriz, Huron. Finalmente, o mtodo shift() usado para remover o primeiro item da matriz, Vitria.
var oceans:Array = ["Victoria", "Pacific", "Aral", "Superior", "Indian", "Huron"]; oceans.splice(2, 2, "Arctic", "Atlantic"); // replaces Aral and Superior oceans.pop(); // removes Huron oceans.shift(); // removes Victoria trace(oceans);// output: Pacific,Arctic,Atlantic,Indian

Os mtodos pop() e shift() retornam o item que foi removido. Para uma ocorrncia de Array, o tipo de dados do valor de retorno Object porque as matrizes podem armazenar valores de qualquer tipo de dados. Para uma ocorrncia de Vector, o tipo de dados do valor de retorno o tipo base do vetor. O mtodo splice() retorna uma matriz ou um vetor que contm os valores removidos. Voc pode alterar o exemplo de matriz oceanos para que a chamada do mtodo splice() atribua a matriz retornada a uma nova varivel Array, como mostra o exemplo a seguir:
var lakes:Array = oceans.splice(2, 2, "Arctic", "Atlantic"); trace(lakes); // output: Aral,Superior

Talvez aparea um cdigo que usa o operador delete em um elemento de objeto Array. O operador delete define o valor de um elemento Array como undefined, mas no remove o elemento da matriz. Por exemplo, o cdigo a seguir usa o operador delete no terceiro elemento da matriz oceanos, mas o comprimento da matriz continua sendo 5:

PROGRAMAO DO ACTIONSCRIPT 3.0 165


Trabalho com matrizes

var oceans:Array = ["Arctic", "Pacific", "Victoria", "Indian", "Atlantic"]; delete oceans[2]; trace(oceans);// output: Arctic,Pacific,,Indian,Atlantic trace(oceans[2]); // output: undefined trace(oceans.length); // output: 5

Voc pode truncar uma matriz ou um vetor usando uma propriedade de matriz length. Se a propriedade length de uma matriz indexada for definida como um comprimento menor do que o atual, a matriz ser truncada, o que remove os elementos armazenados nos nmeros de ndice maiores do que o novo valor de length menos 1. Por exemplo, se a matriz oceanos fosse classificada de modo que todas as entradas vlidas estivessem no incio da matriz, a propriedade length poderia ser usada para remover as entradas no final da matriz, como mostra o cdigo a seguir:
var oceans:Array = ["Arctic", "Pacific", "Victoria", "Aral", "Superior"]; oceans.length = 2; trace(oceans); // output: Arctic,Pacific

Nota: Se a propriedade fixed do objeto Vector for true, o nmero total de elementos do vetor no poder ser alterado. Se voc tentar remover um elemento ou truncar um vetor de tamanho fixo usando as tcnicas aqui descritas, ocorrer um erro.

Classificao de uma matriz


Existem trs mtodos - reverse(), sort() e sortOn() - que permitem alterar a ordem de uma matriz indexada, classificando-a ou invertendo-a. Todos esses mtodos modificam a matriz existente. A tabela a seguir resume esses mtodos e seus respectivos comportamentos para objetos Array e Vector:
Mtodo
reverse()

Comportamento de Array Altera a ordem dos elementos de modo de que o ltimo elemento se transforma no primeiro, o penltimo no segundo e assim por diante. Permite a classificao dos elementos da matriz de diversos modos predefinidos, como ordem alfabtica ou numrica. Tambm possvel especificar um algoritmo de classificao personalizada.

Comportamento de Vector Idntico ao comportamento de Array

sort()

Classifica os elementos de acordo com o algoritmo de classificao personalizada especificado

sortOn()

Permite a classificao de objetos que possuem uma ou mais Indisponvel na classe Vector. propriedades em comum, especificando a(s) propriedade(s) que podem ser usadas como chaves de classificao.

O mtodo reverse() O mtodo reverse() no assume nenhum parmetro e no retorna um valor, mas permite alternar a ordem da matriz do estado atual para a ordem inversa. O exemplo a seguir inverte a ordem dos oceanos listados na matriz oceanos:
var oceans:Array = ["Arctic", "Atlantic", "Indian", "Pacific"]; oceans.reverse(); trace(oceans); // output: Pacific,Indian,Atlantic,Arctic

Classificao bsica com o mtodo sort() (somente para a classe Array) Para uma ocorrncia de Array, o mtodo sort() reorganiza os elementos de uma matriz usando a ordem de classificao padro. A ordem de classificao padro deve ter as seguintes caractersticas:

A classificao diferencia maisculas de minsculas, isto , os caracteres maisculos precedem os minsculos. Por
exemplo, a letra D precede a letra b.

A classificao crescente, ou seja, os cdigos de caracteres menores (como A) precedem os maiores (como B). A classificao coloca valores idnticos perto um do outro, mas no em uma ordem especfica.

PROGRAMAO DO ACTIONSCRIPT 3.0 166


Trabalho com matrizes

A classificao baseia-se em strings, ou seja, os elementos so convertidos em strings antes de serem comparados
(por exemplo, 10 vem antes de 3 porque a string "1" tem um cdigo de caractere menor do que o da string "3"). Talvez voc precise classificar uma matriz sem diferenciar maisculas de minsculas, em ordem decrescente ou sua matriz pode conter elementos que devem ser classificados numericamente em vez de em ordem alfabtica. O mtodo sort() de classe Array tem um parmetro options que permite a alterao de cada caracterstica da ordem de classificao padro. As opes so definidas por um conjunto de constantes estticas da classe Array, como mostra a lista a seguir:

Array.CASEINSENSITIVE: essa opo no diferencia maisculas de minsculas durante a classificao. Por

exemplo, a letra minscula b precede a letra maiscula D.


Array.DESCENDING: essa opo inverte a classificao crescente padro. Por exemplo, a letra B precede a letra A. Array.UNIQUESORT: essa opo interrompe a classificao quando dois valores idnticos so encontrados. Array.NUMERIC: essa opo faz a classificao numrica, de modo que 3 vem antes de 10.

O exemplo a seguir destaca algumas dessas opes. Uma matriz chamada poetas criada e classificada com diversas opes diferentes.
var poets:Array = ["Blake", "cummings", "Angelou", "Dante"]; poets.sort(); // default sort trace(poets); // output: Angelou,Blake,Dante,cummings poets.sort(Array.CASEINSENSITIVE); trace(poets); // output: Angelou,Blake,cummings,Dante poets.sort(Array.DESCENDING); trace(poets); // output: cummings,Dante,Blake,Angelou poets.sort(Array.DESCENDING | Array.CASEINSENSITIVE); // use two options trace(poets); // output: Dante,cummings,Blake,Angelou

Classificao padro com o mtodo sort() (somente para as classes Array e Vector) Alm da classificao bsica disponvel para um objeto Array, tambm possvel definir uma regra de classificao personalizada. Essa tcnica a nica forma do mtodo sort() disponvel para a classe Vector. Para definir uma classificao padro, escreva uma funo de classificao personalizada e passe-a como um argumento para o mtodo sort(). Por exemplo, se houver uma lista de nomes e cada elemento da lista tiver o nome completo da pessoa, mas voc quiser classificar a lista pelo sobrenome, use uma funo de classificao personalizada para analisar cada elemento e use o sobrenome na funo de classificao. O cdigo a seguir mostra como isso pode ser feito com uma funo personalizada que usada como um parmetro para o mtodo Array.sort():

PROGRAMAO DO ACTIONSCRIPT 3.0 167


Trabalho com matrizes

var names:Array = new Array("John Q. Smith", "Jane Doe", "Mike Jones"); function orderLastName(a, b):int { var lastName:RegExp = /\b\S+$/; var name1 = a.match(lastName); var name2 = b.match(lastName); if (name1 < name2) { return -1; } else if (name1 > name2) { return 1; } else { return 0; } } trace(names); // output: John Q. Smith,Jane Doe,Mike Jones names.sort(orderLastName); trace(names); // output: Jane Doe,Mike Jones,John Q. Smith

A funo de classificao personalizada orderLastName() usa uma expresso regular para extrair o sobrenome de cada elemento a ser usado para a operao de comparao. O identificador da funo orderLastName usado como o nico parmetro ao chamar o mtodo sort() na matriz nomes. A funo de classificao aceita dois parmetros, a e b, porque atua em dois elementos de matriz ao mesmo tempo. O valor de retorno da funo de classificao indica como os elementos devem ser classificados:

O valor de retorno -1 indica que o primeiro parmetro, a, precede o segundo, b. O valor de retorno 1 indica que o segundo parmetro, b, precede o primeiro, a. O valor de retorno 0 indica que os elementos tm a mesma precedncia de classificao.
O mtodo sortOn() (somente para a classe Array) O mtodo sortOn() foi desenvolvido para objetos Array com elementos que contm objetos. Esses objetos devem ter pelo menos uma propriedade comum que pode ser usada como a chave de classificao. O uso do mtodo sortOn() para outros tipos de matriz gera resultados inesperados. Nota: A classe Vector no inclui um mtodo sortOn(). Esse mtodo est disponvel apenas para objetos Array. O exemplo a seguir revisa a matriz poetas para que cada elemento seja um objeto, em vez de uma string. Cada objeto armazena o sobrenome e o ano de nascimento do poeta.
var poets:Array = new Array(); poets.push({name:"Angelou", born:"1928"}); poets.push({name:"Blake", born:"1757"}); poets.push({name:"cummings", born:"1894"}); poets.push({name:"Dante", born:"1265"}); poets.push({name:"Wang", born:"701"});

PROGRAMAO DO ACTIONSCRIPT 3.0 168


Trabalho com matrizes

Voc pode usar o mtodo sortOn() para classificar a matriz pela propriedade born. O mtodo sortOn() define dois parmetros, fieldName e options. O argumento fieldName deve ser especificado como uma string. No exemplo a seguir, sortOn() chamado com dois argumentos, "born" e Array.NUMERIC. O argumento Array.NUMERIC usado para assegurar que a classificao seja feita numericamente, no em ordem alfabtica. Isso til mesmo quando todos os nmeros tm o mesmo nmero de dgitos porque garante que a classificao continuar apresentando o comportamento esperado se um nmero com mais ou menos dgitos for adicionado posteriormente matriz.
poets.sortOn("born", Array.NUMERIC); for (var i:int = 0; i < poets.length; ++i) { trace(poets[i].name, poets[i].born); } /* output: Wang 701 Dante 1265 Blake 1757 cummings 1894 Angelou 1928 */

Classificao sem modificao da matriz original (somente para a classe Array) Geralmente, os mtodos sort() e sortOn() modificam uma matriz. Se desejar classificar uma matriz sem modificar a existente, transmita a constante Array.RETURNINDEXEDARRAY como parte do parmetro options. Essa opo instrui os mtodos a retornar uma nova matriz que reflete a classificao e deixar a matriz original inalterada. A matriz retornada pelos mtodos uma simples matriz de nmeros de ndice que reflete a nova ordem de classificao e no contm nenhum elemento da matriz original. Por exemplo, para classificar a matriz poetas por ano de nascimento sem modific-la, inclua a constante Array.RETURNINDEXEDARRAY como parte do argumento transmitido para o parmetro options. O exemplo a seguir armazena as informaes de ndice retornadas em uma matriz chamada ndices e usa a matriz ndices junto com a matriz poetas inalterada para classificar os poetas por ano de nascimento:
var indices:Array; indices = poets.sortOn("born", Array.NUMERIC | Array.RETURNINDEXEDARRAY); for (var i:int = 0; i < indices.length; ++i) { var index:int = indices[i]; trace(poets[index].name, poets[index].born); } /* output: Wang 701 Dante 1265 Blake 1757 cummings 1894 Angelou 1928 */

PROGRAMAO DO ACTIONSCRIPT 3.0 169


Trabalho com matrizes

Consulta de uma matriz


Quatro mtodos das classes Array e Vector - concat(), join(), slice() e toString() - consultam a matriz em busca de informaes, mas no a modificam. Os mtodos concat() e slice() retornam novas matrizes, enquanto os mtodos join() e toString() retornam strings. O mtodo concat() pega uma nova matriz ou lista de elementos como argumentos e a combina com a matriz existente para criar uma nova. O mtodo slice() tem dois parmetros, devidamente chamados de startIndex e endIndex, e retorna uma nova matriz que contm uma cpia dos elementos "fatiados" a partir da matriz existente. A fatia comea com o elemento em startIndex e termina com o elemento bem antes de endIndex. A mxima a mesma: O elemento em endIndex no includo no valor de retorno. O exemplo a seguir usa concat() e slice() para criar novas matrizes com elementos de outras matrizes:
var array1:Array = ["alpha", "beta"]; var array2:Array = array1.concat("gamma", "delta"); trace(array2); // output: alpha,beta,gamma,delta var array3:Array = array1.concat(array2); trace(array3); // output: alpha,beta,alpha,beta,gamma,delta var array4:Array = array3.slice(2,5); trace(array4); // output: alpha,beta,gamma

Voc pode usar os mtodos join() e toString() para consultar a matriz e retornar seu contedo como uma string. Se nenhum parmetro for usado para o mtodo join(), os dois mtodos tero o mesmo comportamento: eles retornaro uma string que contm uma lista delimitada por vrgulas de todos os elementos da matriz. O mtodo join(), diferente do mtodo toString(), aceita um parmetro chamado delimiter, que permite escolher o smbolo a ser usado como separador entre cada elemento na string retornada. O exemplo a seguir cria uma matriz chamada rios e chama join() e toString() para retornar os valores na matriz como uma string. O mtodo toString() usado para retornar valores separados por vrgula (riverCSV), enquanto o mtodo join() usado para retornar valores separados pelo caractere +.
var rivers:Array = ["Nile", "Amazon", "Yangtze", "Mississippi"]; var riverCSV:String = rivers.toString(); trace(riverCSV); // output: Nile,Amazon,Yangtze,Mississippi var riverPSV:String = rivers.join("+"); trace(riverPSV); // output: Nile+Amazon+Yangtze+Mississippi

Um problema do mtodo join() que deve ser levado em considerao o fato de as ocorrncias de Array ou Vector aninhadas sempre serem retornadas com valores separados por vrgula, independentemente do separador especificado para os elementos principais da matriz, como mostra o exemplo a seguir:
var nested:Array = ["b","c","d"]; var letters:Array = ["a",nested,"e"]; var joined:String = letters.join("+"); trace(joined); // output: a+b,c,d+e

Matrizes associativas
Uma matriz associativa, s vezes chamadas de hash ou mapa, usa chaves em vez de ndices numricos para organizar os valores armazenados. Cada chave de uma matriz associativa uma string exclusiva que usada para acessar um valor armazenado. Uma matriz associativa uma ocorrncia da classe Object, o que indica que cada chave corresponde a um nome de propriedade. As matrizes associativas so colees no ordenadas de pares de chave e valor. Seu cdigo no deve esperar que as chaves de uma matriz associativa estejam em uma ordem especfica.

PROGRAMAO DO ACTIONSCRIPT 3.0 170


Trabalho com matrizes

O ActionScript 3.0 tambm inclui um tipo avanado de matriz associativa chamado dicionrio. Os dicionrios, que so ocorrncias da classe Dictionary no pacote flash.utils, usa chaves que podem ser de qualquer tipo de dados. Em outras palavras, as chaves de dicionrio no esto limitadas aos valores do tipo String.

Matrizes associativas com chaves de string


H duas maneiras de criar matrizes associativas no ActionScript 3.0. A primeira alternativa usar uma ocorrncia de Object. Ao usar essa ocorrncia, ser possvel inicializar a matriz com um literal de objeto. Uma ocorrncia da classe Object, tambm chamada de objeto genrico, tem a mesma funcionalidade de uma matriz associativa. Cada nome de propriedade do objeto genrico serve como a chave que fornece acesso a um valor armazenado. O exemplo a seguir cria uma matriz associativa chamada monitorInfo, usando um literal de objeto para inicializar a matriz com dois pares de chave e valor:
var monitorInfo:Object = {type:"Flat Panel", resolution:"1600 x 1200"}; trace(monitorInfo["type"], monitorInfo["resolution"]); // output: Flat Panel 1600 x 1200

Se no for necessrio inicializar a matriz no tempo da declarao, use o construtor Object para criar a matriz da seguinte maneira:
var monitorInfo:Object = new Object();

Depois que a matriz criada com um literal de objeto ou um construtor da classe Object, voc pode adicionar novos valores matriz usando o operador de acesso matriz ([]) ou o operador de ponto (.). O exemplo a seguir adiciona dois novos valores a monitorArray:
monitorInfo["aspect ratio"] = "16:10"; // bad form, do not use spaces monitorInfo.colors = "16.7 million"; trace(monitorInfo["aspect ratio"], monitorInfo.colors); // output: 16:10 16.7 million

Observe que a chave chamada aspect ratio contm um caractere de espao. Isso possvel com o operador de acesso matriz ([]), mas gera um erro se a tentativa for feita com o operador ponto. No recomendado usar espaos em nomes de chave. A segunda maneira de criar uma matriz associativa usar o construtor Array (ou o construtor de qualquer classe dinmica) e usar o operador de acesso matriz ([]) ou o operador de ponto (.) para adicionar os pares de chave e valor matriz. Se declarar que a matriz associativa do tipo Array, voc no poder usar um literal de objeto para inicializar a matriz. O exemplo a seguir cria uma matriz associativa chamada monitorInfo usando o construtor Array e adiciona uma chave chamada type e uma chave chamada resolution, junto com seus valores:
var monitorInfo:Array = new Array(); monitorInfo["type"] = "Flat Panel"; monitorInfo["resolution"] = "1600 x 1200"; trace(monitorInfo["type"], monitorInfo["resolution"]); // output: Flat Panel 1600 x 1200

No h nenhuma vantagem em usar o construtor Array para criar uma matriz associativa. Voc no pode usar a propriedade Array.length ou algum mtodo da classe Array com matrizes associativas, mesmo se o construtor Array ou o tipo de dados Array for usado. O uso do construtor Array mais adequado para a criao de matrizes indexadas.

PROGRAMAO DO ACTIONSCRIPT 3.0 171


Trabalho com matrizes

Matrizes associativas com chaves de objeto (Dicionrios)


possvel usar a classe Dictionary para criar uma matriz associativa que usa objetos para chaves em vez de strings. Essas matrizes s vezes so chamadas de dicionrios, hashes ou mapas. Pense, por exemplo, em um aplicativo que determina o local de um objeto Sprite com base em sua associao com um recipiente especfico. Voc pode usar um objeto Dictionary para mapear cada objeto Sprite para um recipiente. O cdigo a seguir cria trs ocorrncias da classe Sprite que servem como chaves para o objeto Dictionary. Cada chave recebe o valor GroupA ou GroupB. Os valores podem ser de qualquer tipo de dados, mas, nesse exemplo, GroupA e GroupB so ocorrncias da classe Object. Posteriormente, voc poder acessar o valor associado a cada chave com o operador de acesso matriz ([]), como mostra o cdigo a seguir:
import flash.display.Sprite; import flash.utils.Dictionary; var groupMap:Dictionary = new Dictionary(); // objects to use var spr1:Sprite = var spr2:Sprite = var spr3:Sprite = as keys new Sprite(); new Sprite(); new Sprite();

// objects to use as values var groupA:Object = new Object(); var groupB:Object = new Object(); // Create new key-value pairs in dictionary. groupMap[spr1] = groupA; groupMap[spr2] = groupB; groupMap[spr3] = groupB; if (groupMap[spr1] { trace("spr1 is } if (groupMap[spr2] { trace("spr2 is } if (groupMap[spr3] { trace("spr3 is } == groupA) in groupA"); == groupB) in groupB"); == groupB) in groupB");

Iterao com chaves de objeto possvel percorrer o contedo de um objeto Dictionary com um loop for..in ou um loop for each..in. O loop for..in permite percorrer o contedo com base nas chaves, enquanto o loop for each..in baseia-se nos valores associados a cada chave. Use o loop for..in para acessar diretamente as chaves de um objeto Dictionary. Voc tambm pode acessar os valores do objeto Dictionary com o operador de acesso matriz ([]). O cdigo a seguir usa o exemplo anterior do dicionrio groupMap para mostrar como percorrer um objeto Dictionary com o loop for..in:

PROGRAMAO DO ACTIONSCRIPT 3.0 172


Trabalho com matrizes

for (var key:Object in groupMap) { trace(key, groupMap[key]); } /* output: [object Sprite] [object Object] [object Sprite] [object Object] [object Sprite] [object Object] */

Use o loop for each..in para acessar diretamente os valores de um objeto Dictionary. O cdigo a seguir tambm usa o dicionrio groupMap para mostrar como percorrer um objeto Dictionary com o loop for each..in:
for each (var item:Object in groupMap) { trace(item); } /* output: [object Object] [object Object] [object Object] */

Gerenciamento de memria e chaves de objeto O Adobe Flash Player e o Adobe AIR usam um sistema de coleta de lixo para recuperar a memria que no mais usada. Quando um objeto no tem nenhuma referncia apontada para ele, est qualificado para a coleta de lixo e a memria recuperada na prxima vez em que o sistema executado. Por exemplo, o cdigo a seguir cria um novo objeto e atribui uma referncia do objeto varivel myObject:
var myObject:Object = new Object();

Contanto que exista alguma referncia ao objeto, o sistema de coleta de lixo no recuperar a memria ocupada pelo objeto. Se o valor de myObject for alterado de modo que aponte para um objeto diferente ou seja definido como o valor null, a memria ocupada pelo objeto original se qualificar para a coleta de lixo, mas somente se no houver nenhuma outra referncia ao objeto original. Se myObject for usado como uma chave em um objeto Dictionary, outra referncia ao objeto original estar sendo criado. Por exemplo, o cdigo a seguir cria duas referncias a um objeto: a varivel myObject e a chave no objeto myMap:
import flash.utils.Dictionary; var myObject:Object = new Object(); var myMap:Dictionary = new Dictionary(); myMap[myObject] = "foo";

Para que o objeto mencionado por myObject se qualifique para a coleta de lixo, remova todas as referncias a ele. Nesse caso, altere o valor de myObject e exclua a chave myObject de myMap, como mostra o cdigo a seguir:
myObject = null; delete myMap[myObject];

Como alternativa, voc pode usar o parmetro useWeakReference do construtor Dictionary para que todas as chaves de dicionrio sejam referncias fracas. O sistema de coleta de lixo ignora as referncias fracas e, desse modo, um objeto que tem apenas referncias fracas se qualifica para a coleta de lixo. Por exemplo, no cdigo a seguir, no necessrio excluir a chave myObject de myMap para que o objeto se qualifique para coleta de lixo:

PROGRAMAO DO ACTIONSCRIPT 3.0 173


Trabalho com matrizes

import flash.utils.Dictionary; var myObject:Object = new Object(); var myMap:Dictionary = new Dictionary(true); myMap[myObject] = "foo"; myObject = null; // Make object eligible for garbage collection.

Matrizes multidimensionais
As matrizes multidimensionais contm outras matrizes como elementos. Por exemplo, considere uma lista de tarefas armazenada como uma matriz indexada de strings:
var tasks:Array = ["wash dishes", "take out trash"];

Se desejar armazenar uma lista separada de tarefas para cada dia da semana, voc poder criar uma matriz multidimensional com um elemento para cada dia da semana. Cada elemento contm uma matriz indexada, similar matriz tarefas, que armazena a lista de tarefas. possvel usar qualquer combinao de matrizes indexadas ou associativas em matrizes multidimensionais. Os exemplos das sees a seguir usam duas matrizes indexadas ou uma matriz associativa de matrizes indexadas. Se desejar, experimente outras combinaes para praticar.

Duas matrizes indexadas


Ao usar duas matrizes indexadas, voc pode visualizar o resultado como uma tabela ou uma planilha. Os elementos da primeira matriz representam as linhas da tabela, enquanto os elementos da segunda matriz representam as colunas. Por exemplo, a seguinte matriz multidimensional usa duas matrizes indexadas para rastrear as listas de tarefas de cada dia da semana. A primeira matriz, masterTaskList, criada com o construtor da classe Array. Cada elemento da matriz representa um dia da semana; o ndice 0 representa segunda-feira e o ndice 6 representa domingo. Esses elementos podem ser considerados linhas da tabela. Voc pode criar a lista de tarefas de cada dia atribuindo um literal de matriz a cada um dos sete elementos que podem ser criados na matriz masterTaskList. Os literais de matriz representam as colunas da tabela.
var masterTaskList:Array = new Array(); masterTaskList[0] = ["wash dishes", "take out trash"]; masterTaskList[1] = ["wash dishes", "pay bills"]; masterTaskList[2] = ["wash dishes", "dentist", "wash dog"]; masterTaskList[3] = ["wash dishes"]; masterTaskList[4] = ["wash dishes", "clean house"]; masterTaskList[5] = ["wash dishes", "wash car", "pay rent"]; masterTaskList[6] = ["mow lawn", "fix chair"];

Voc pode acessar itens individuais em qualquer lista de tarefas, usando o operador de acesso matriz ([]). O primeiro conjunto de colchetes representa o dia da semana e o segundo representa a lista de tarefas desse dia. Por exemplo, para recuperar a segunda tarefa da lista de quarta-feira, use primeiro o ndice 2 para quarta-feira e, em seguida, use o ndice 1 para a segunda tarefa da lista.
trace(masterTaskList[2][1]); // output: dentist

Para recuperar a primeira tarefa da lista de domingo, use o ndice 6 para domingo e o ndice 0 para a primeira tarefa da lista.
trace(masterTaskList[6][0]); // output: mow lawn

PROGRAMAO DO ACTIONSCRIPT 3.0 174


Trabalho com matrizes

Matriz associativa com uma matriz indexada


Para facilitar o acesso a matrizes individuais, voc pode usar uma matriz associativa para os dias da semana e uma matriz indexada para as listas de tarefas. A matriz associativa permite usar a sintaxe de ponto ao fazer referncia a um dia da semana especfico, mas aumenta o tempo de processamento de tempo de execuo para acessar cada elemento da matriz associativa. O exemplo a seguir usa uma matriz associativa como base de uma lista de tarefas, com um par de chave e valor para cada dia da semana:
var masterTaskList:Object = new Object(); masterTaskList["Monday"] = ["wash dishes", "take out trash"]; masterTaskList["Tuesday"] = ["wash dishes", "pay bills"]; masterTaskList["Wednesday"] = ["wash dishes", "dentist", "wash dog"]; masterTaskList["Thursday"] = ["wash dishes"]; masterTaskList["Friday"] = ["wash dishes", "clean house"]; masterTaskList["Saturday"] = ["wash dishes", "wash car", "pay rent"]; masterTaskList["Sunday"] = ["mow lawn", "fix chair"];

A sintaxe de ponto deixa o cdigo mais legvel, evitando vrios conjuntos de colchetes.
trace(masterTaskList.Wednesday[1]); // output: dentist trace(masterTaskList.Sunday[0]);// output: mow lawn

possvel percorrer a lista de tarefas usando um loop for..in, mas necessrio usar o operador de acesso matriz ([] em vez da sintaxe de ponto para acessar o valor associado a cada chave. Como masterTaskList uma matriz associativa, os elementos no so recuperados necessariamente na ordem esperada, como mostra o exemplo a seguir:
for (var day:String in masterTaskList) { trace(day + ": " + masterTaskList[day]) } /* output: Sunday: mow lawn,fix chair Wednesday: wash dishes,dentist,wash dog Friday: wash dishes,clean house Thursday: wash dishes Monday: wash dishes,take out trash Saturday: wash dishes,wash car,pay rent Tuesday: wash dishes,pay bills */

Clonagem de matrizes
A classe Array no tem nenhum mtodo incorporado para fazer cpias de matrizes. Voc pode criar uma cpiasuperficial de uma matriz chamando os mtodos concat() ou slice() sem nenhum argumento. Em uma cpia superficial, se a matriz original tiver elementos que so objetos, somente as referncias aos objetos sero copiadas, no os objetos propriamente ditos. A cpia aponta para os mesmos objetos da original. Qualquer alterao feita nos objetos refletida nas duas matrizes. Em uma cpia profunda, todos os objetos encontrados na matriz original tambm so copiados para que a nova matriz no aponte para os mesmos objetos da matriz original. A cpia profunda requer mais de uma linha de cdigo, que normalmente chama uma funo de criao. Essa funo pode ser criada como uma funo do utilitrio global ou como um mtodo de uma subclasse de Array.

PROGRAMAO DO ACTIONSCRIPT 3.0 175


Trabalho com matrizes

O exemplo a seguir define uma funo chamada clone() que faz a cpia profunda. O algoritmo emprestado de uma tcnica comum de programao Java. A funo cria uma cpia profunda serializando a matriz em uma ocorrncia da classe ByteArray e lendo a matriz de volta em uma nova matriz. Essa funo aceita um objeto para que possa ser usada com matrizes indexadas e associativas, como mostra o cdigo a seguir:
import flash.utils.ByteArray; function clone(source:Object):* { var myBA:ByteArray = new ByteArray(); myBA.writeObject(source); myBA.position = 0; return(myBA.readObject()); }

Tpicos avanados
Extenso da classe Array
A classe Array uma das poucas classes principais que no final, ou seja, voc pode criar sua prpria subclasse de Array. Esta seo mostra um exemplo de como criar uma subclasse de Array e discute alguns problemas que podem ocorrer durante o processo. Como mencionado anteriormente, as matrizes no ActionScript no so tipificadas, mas possvel criar uma subclasse de Array que aceita elementos somente de um tipo de dados especfico. O exemplo das sees a seguir define uma subclasse de Array chamada TypedArray que limita seus elementos aos valores do tipo de dados especificado no primeiro parmetro. A classe TypedArray apresentada simplesmente como um exemplo que mostra como estender a classe Array e talvez no seja adequada para fins de produo por diversos motivos. Primeiro, a verificao de tipo ocorre durante o tempo de execuo, no no tempo de compilao. Segundo, quando um mtodo TypedArray encontra uma discordncia, esta ignorada e nenhuma exceo lanada, embora os mtodos possam ser facilmente modificados para lanar excees. Terceiro, a classe no pode impedir o uso do operador de acesso matriz para inserir valores de qualquer tipo na matriz. Quarto, o estilo de codificao favorece a simplicidade por meio da otimizao do desempenho. Nota: Voc pode usar a tcnica descrita aqui para criar uma matriz tipificada. No entanto, recomenda-se o uso de um objeto Vector. Uma ocorrncia de Vector uma matriz true type e fornece desempenho e outros aprimoramentos em relao classe Array ou qualquer subclasse. O objetivo desta discusso demonstrar como criar uma subclasse Array. Declarao da subclasse Use a palavra-chave extends para indicar que uma classe subclasse de Array. Uma subclasse de Array deve usar o atributo dynamic, assim como a classe Array. Caso contrrio, a subclasse no funcionar adequadamente. O cdigo a seguir mostra a definio da classe TypedArray, que contm uma constante para armazenar o tipo de dados, um mtodo de construtor e os quatro mtodos que permitem adicionar elementos matriz. O cdigo de cada mtodo omitido neste exemplo, mas descrito e explicado em detalhes nas sees a seguir:

PROGRAMAO DO ACTIONSCRIPT 3.0 176


Trabalho com matrizes

public dynamic class TypedArray extends Array { private const dataType:Class; public function TypedArray(...args) {} AS3 override function concat(...args):Array {} AS3 override function push(...args):uint {} AS3 override function splice(...args) {} AS3 override function unshift(...args):uint {} }

Os quatro mtodos de substituio usam o espao para nomes AS3 em vez do atributo public porque este exemplo supe que a opo -as3 do compilador est definida como true e a opo -es est definida como false. Essas so as configuraes padro do Adobe Flex Builder 3 e do Adobe Flash CS4 Professional. Para obter mais informaes, consulte Espao para nomes AS3 na pgina 124. Se voc for um desenvolvedor experiente que prefere usar prottipos herdados, faa duas pequenas alteraes na classe TypedArray para compil-la com a opo -es do compilador definida como true. Primeiro, remova todas as ocorrncias do atributo override e substitua o espao para nomes AS3 pelo atributo public. Segundo, substitua Array.prototype nas quatro ocorrncias de super. construtor TypedArray O construtor de subclasse cria um desafio interessante porque aceita uma lista de argumentos de comprimento arbitrrio. O desafio agora transmitir os argumentos para o superconstrutor a fim de criar a matriz. Se voc transmitir a lista de argumentos como uma matriz, o superconstrutor ir consider-la como um nico argumento do tipo Array e a matriz resultante ter sempre um elemento. O modo tradicional de manipular a transmisso de listas de argumentos usar o mtodo Function.apply(), que trata uma matriz de argumentos como seu segundo parmetro, mas a converte em uma lista de argumentos ao executar a funo. Infelizmente, o mtodo Function.apply() no pode ser usado com construtores. A nica opo restante recriar a lgica do construtor Array no construtor TypedArray. O cdigo a seguir mostra o algoritmo usado no construtor da classe Array, que pode ser reutilizado no construtor da subclasse de Array:

PROGRAMAO DO ACTIONSCRIPT 3.0 177


Trabalho com matrizes

public dynamic class Array { public function Array(...args) { var n:uint = args.length if (n == 1 && (args[0] is Number)) { var dlen:Number = args[0]; var ulen:uint = dlen; if (ulen != dlen) { throw new RangeError("Array index is not a 32-bit unsigned integer ("+dlen+")"); } length = ulen; } else { length = n; for (var i:int=0; i < n; i++) { this[i] = args[i] } } } }

O construtor TypedArray compartilha a maior parte do cdigo do construtor Array, com apenas quatro alteraes no cdigo. Primeiro, a lista de parmetros inclui um novo parmetro obrigatrio de classe de tipo que permite especificar o tipo de dados da matriz. Segundo, a varivel dataType atribuda ao tipo de dados transmitido ao construtor. Terceiro, na instruo else, o valor da propriedade length atribudo depois do loop for para que length inclua somente os argumentos do tipo correto. Quarto, o corpo do loop for usa a verso de substituio do mtodo push() para que apenas os argumentos do tipo de dados correto sejam adicionados matriz. O exemplo a seguir mostra a funo do construtor TypedArray:

PROGRAMAO DO ACTIONSCRIPT 3.0 178


Trabalho com matrizes

public dynamic class TypedArray extends Array { private var dataType:Class; public function TypedArray(typeParam:Class, ...args) { dataType = typeParam; var n:uint = args.length if (n == 1 && (args[0] is Number)) { var dlen:Number = args[0]; var ulen:uint = dlen if (ulen != dlen) { throw new RangeError("Array index is not a 32-bit unsigned integer ("+dlen+")") } length = ulen; } else { for (var i:int=0; i < n; i++) { // type check done in push() this.push(args[i]) } length = this.length; } } }

Mtodos de substituio de TypedArray A classe TypedArray substitui os quatro mtodos da classe Array que permitem adicionar elementos a uma matriz. Em cada caso, o mtodo de substituio adiciona uma verificao de tipo que impede a adio de elementos que no so do tipo de dados correto. Posteriormente, cada mtodo chama sua prpria verso de superclasse. O mtodo push() percorre a lista de argumentos com um loop for..in e faz uma verificao de tipo em cada argumento. Todos os argumentos que no so do tipo correto so removidos da matriz args com o mtodo splice(). Quando o loop for..in termina, a matriz args contm valores somente do tipo dataType. A verso de superclasse de push() chamada com a matriz args atualizada, como mostra o cdigo a seguir:
AS3 override function push(...args):uint { for (var i:* in args) { if (!(args[i] is dataType)) { args.splice(i,1); } } return (super.push.apply(this, args)); }

O mtodo concat() cria uma matriz TypedArray temporria chamada passArgs para armazenar os argumentos aprovados na verificao de tipo. Isso permite a reutilizao do cdigo de verificao de tipo existente no mtodo push(). O loop for..in percorre a matriz args e chama push() em cada argumento. Como passArgs tipificada como TypedArray, a verso TypedArray de push() executada. Em seguida, o mtodo concat() chama sua prpria verso de superclasse, como mostra o cdigo a seguir:

PROGRAMAO DO ACTIONSCRIPT 3.0 179


Trabalho com matrizes

AS3 override function concat(...args):Array { var passArgs:TypedArray = new TypedArray(dataType); for (var i:* in args) { // type check done in push() passArgs.push(args[i]); } return (super.concat.apply(this, passArgs)); }

O mtodo splice() usa uma lista arbitrria de argumentos, mas os dois primeiros argumentos sempre fazem referncia a um nmero de ndice e ao nmero de elementos a serem excludos. por esse motivo que o mtodo de substituio splice() executa a verificao de tipo somente para os elementos da matriz args nas posies de ndice 2 ou superior. interessante observar que o cdigo parece ser uma chamada recursiva para splice() no loop for, mas no porque args do tipo Array e no TypedArray, o que significa que a chamada para args.splice() uma chamada para a verso de superclasse do mtodo. Quando o loop for..in termina, a matriz args contm apenas os valores do tipo correto nas posies de ndice 2 ou superior e splice() chama sua prpria verso de superclasse, como mostra o cdigo a seguir:
AS3 override function splice(...args):* { if (args.length > 2) { for (var i:int=2; i< args.length; i++) { if (!(args[i] is dataType)) { args.splice(i,1); } } } return (super.splice.apply(this, args)); }

O mtodo unshift(), que adiciona elementos ao incio de uma matriz, tambm aceita uma lista arbitrria de argumentos. O mtodo de substituio unshift() usa um algoritmo muito parecido com o usado pelo mtodo push(), como mostra o exemplo a seguir:
AS3 override function unshift(...args):uint { for (var i:* in args) { if (!(args[i] is dataType)) { args.splice(i,1); } } return (super.unshift.apply(this, args)); } }

PROGRAMAO DO ACTIONSCRIPT 3.0 180


Trabalho com matrizes

Exemplo: lista de reproduo


O exemplo Lista de reproduo demonstra tcnicas de trabalho com matrizes, no mbito de um aplicativo de lista de reproduo que gerencia uma lista de msicas. Estas tcnicas so:

Criao de uma matriz indexada Adio de itens a uma matriz indexada Classificao de uma matriz de objetos por propriedades diferentes, usando opes de classificao diferentes Converso de uma matriz em uma string delimitada por caracteres
Para obter os arquivos de aplicativo desse exemplo, consulte www.adobe.com/go/learn_programmingAS3samples_flash_br. Os arquivos do aplicativo Lista de reproduo esto localizados na pasta Amostras/Lista de reproduo. O aplicativo consiste nos seguintes arquivos:
Arquivo PlayList.mxml ou PlayList.fla com/example/programmingas3/playlist/Song.as O objeto de valor que representa informaes sobre uma nica msica. Os itens gerenciados pela classe PlayList so ocorrncias de Song. Uma pseudo enumerao cujos valores disponveis representam as propriedades da classe Song por meio da qual uma lista de objetos Song pode ser classificada. Descrio O arquivo principal do aplicativo no Flash (FLA) ou no Flex (MXML).

com/example/programmingas3/playlist/SortProperty.as

Viso geral da classe PlayList


A classe PlayList gerencia um conjunto de objetos Song. Ela tem mtodos pblicos e adiciona uma msica lista de reproduo (o mtodo addSong()), alm de classificar as msicas na lista (o mtodo sortList()). Alm disso, a classe inclui uma propriedade de acesso somente leitura, songList, que fornece acesso ao conjunto real de msicas da lista de reproduo. Internamente, a classe PlayList mantm um registro das msicas usando uma varivel de Array privada:
public class PlayList { private var _songs:Array; private var _currentSort:SortProperty = null; private var _needToSort:Boolean = false; ... }

Alm da varivel _songs de Array, que usada pela classe PlayList para manter um registro da lista de msicas, duas outras classes privadas mantm um registro que indica se a lista precisa ser classificada (_needToSort) e qual propriedade classifica a lista de msicas em um determinado momento (_currentSort). Assim como com todos os objetos, declarar uma ocorrncia de Array apenas metade do trabalho de criao de uma matriz. Antes de acessar propriedades ou mtodos de uma ocorrncia de Array, essa classe deve ser instanciada, o que feito no construtor da classe PlayList.

PROGRAMAO DO ACTIONSCRIPT 3.0 181


Trabalho com matrizes

public function PlayList() { this._songs = new Array(); // Set the initial sorting. this.sortList(SortProperty.TITLE); }

A primeira linha do construtor instancia a varivel _songs, que fica pronta para ser usada. Alm disso, o mtodo sortList() chamado para definir a propriedade sort-by inicial.

Adio de uma msica lista


Quando o usurio insere uma nova msica do aplicativo, o cdigo no formulrio de entrada de dados chama o mtodo addSong() da classe PlayList.
/** * Adds a song to the playlist. */ public function addSong(song:Song):void { this._songs.push(song); this._needToSort = true; }

Em addSong(), o mtodo push() da matriz _songs chamado e adiciona o objeto Song que foi transmitido para addSong() como um novo elemento dessa matriz. Com o mtodo push(), o novo elemento adicionado ao final da matriz, independentemente de alguma classificao que tenha sido aplicada anteriormente. Isso significa que, depois que o mtodo push() chamado, a lista de msicas provavelmente no ser mais classificada corretamente, de modo que a varivel _needToSort ser definida como true. Teoricamente, o mtodo sortList() poderia ser chamado imediatamente, no sendo mais necessrio manter o registro que indica se a lista deve ou no ser classificada em um determinado momento. No entanto, na prtica, no necessrio classificar a lista de msicas imediatamente antes que ela seja recuperada. Adiando a operao de classificao, o aplicativo no executar uma classificao desnecessria se, por exemplo, vrias msicas forem adicionadas lista antes de ser recuperada.

Classificao da lista de msicas


Como as ocorrncias de Song gerenciadas pela lista de reproduo so objetos complexos, os usurios do aplicativo talvez queiram classificar a lista de reproduo de acordo com propriedades diferentes, como o ttulo da msica ou o ano de publicao. No aplicativo PlayList, a tarefa de classificar a lista de msicas tem trs partes: identificar a propriedade que classifica a lista, indicar as opes de classificao que devem ser usadas ao classificar de acordo com essa propriedade e executar a operao de classificao real. Propriedades de classificao Um objeto Song mantm o registro de vrias propriedades, incluindo o ttulo da msica, o artista, o ano de publicao, o nome do arquivo e um conjunto de gneros definido pelo usurio ao qual a msica pertence. Entre essas propriedades, apenas as trs primeiras so prticas para classificao. Para facilitar o entendimento dos desenvolvedores, o exemplo inclui a classe SortProperty, que age como uma enumerao com valores que representam as propriedades disponveis para classificao.
public static const TITLE:SortProperty = new SortProperty("title"); public static const ARTIST:SortProperty = new SortProperty("artist"); public static const YEAR:SortProperty = new SortProperty("year");

PROGRAMAO DO ACTIONSCRIPT 3.0 182


Trabalho com matrizes

A classe SortProperty contm trs constantes (TITLE, ARTIST e YEAR), que armazenam uma string com o nome real da propriedade associada da classe Song que pode ser usada para classificao. No restante do cdigo, sempre que uma propriedade de classificao for indicada, o membro de enumerao ser usado. Por exemplo, no construtor PlayList, a lista classificada inicialmente chamando o mtodo sortList() do seguinte modo:
// Set the initial sorting. this.sortList(SortProperty.TITLE);

Como a propriedade de classificao especificada como SortProperty.TITLE, as msicas so classificadas de acordo com o ttulo. Classificao por propriedade e especificao das opes de classificao A classificao real da lista de msicas realizada pela classe PlayList no mtodo sortList() do seguinte modo:
/** * Sorts the list of songs according to the specified property. */ public function sortList(sortProperty:SortProperty):void { ... var sortOptions:uint; switch (sortProperty) { case SortProperty.TITLE: sortOptions = Array.CASEINSENSITIVE; break; case SortProperty.ARTIST: sortOptions = Array.CASEINSENSITIVE; break; case SortProperty.YEAR: sortOptions = Array.NUMERIC; break; } // Perform the actual sorting of the data. this._songs.sortOn(sortProperty.propertyName, sortOptions); // Save the current sort property. this._currentSort = sortProperty; // Record that the list is sorted. this._needToSort = false; }

Quando a classificao feita por ttulo ou artista, faz sentido classificar em ordem alfabtica, mas, quando a classificao feita por ano, mais lgico realizar uma classificao numrica. A instruo switch usada para definir a opo de classificao adequada, armazenada na varivel sortOptions, de acordo com o valor especificado no parmetro sortProperty. Aqui, mais uma vez, os membros de enumerao nomeados so usados para diferenciar as propriedades, em vez de valores codificados. Quando a propriedade e as opes de classificao so determinadas, a matriz _songs realmente classificada chamando o mtodo sortOn() e transmitindo esses dois valores como parmetros. A propriedade de classificao atual registrada, o que indica que a lista de msicas est classificada no momento.

PROGRAMAO DO ACTIONSCRIPT 3.0 183


Trabalho com matrizes

Combinao de elementos de matriz em uma string delimitada por caracteres


Alm de usar uma matriz para manter a lista de msicas na classe PlayList, neste exemplo, as matrizes tambm so usadas na classe Song para ajudar a gerenciar a lista de gneros aos quais pertencem as msicas. Veja este snippet da definio da classe Song:
private var _genres:String; public function Song(title:String, artist:String, year:uint, filename:String, genres:Array) { ... // Genres are passed in as an array // but stored as a semicolon-separated string. this._genres = genres.join(";"); }

Ao criar uma nova ocorrncia de Song, o parmetro genres que usado para especificar os gneros das msicas definido como uma ocorrncia de Array. Desse modo, fcil agrupar vrios gneros em uma nica varivel que pode ser transmitida para o construtor. No entanto, internamente, a classe Song mantm os gneros na varivel _genres privada como uma ocorrncia de String separada por ponto-e-vrgula. O parmetro Array convertido em uma string separada por ponto-e-vrgula chamando seu mtodo join() com o valor de string literal ";" como o delimitador especificado. Com o mesmo token, os acessadores de genres permitem que os gneros sejam definidos ou recuperados como uma matriz:
public function get genres():Array { // Genres are stored as a semicolon-separated String, // so they need to be transformed into an Array to pass them back out. return this._genres.split(";"); } public function set genres(value:Array):void { // Genres are passed in as an array, // but stored as a semicolon-separated string. this._genres = value.join(";"); }

O acessador genresset se comporta exatamente como o construtor: aceita uma matriz e chama o mtodo join() para convert-la em uma string separada por ponto-e-vrgula. O acessador get executa a operao oposta: o mtodo split() da varivel _genres chamado, dividindo a string em uma matriz de valores que usa o delimitador especificado (o valor de string literal ";" como antes).

184

Captulo 9: Manipulao de erros


"Manipular" um erro significa criar uma lgica no aplicativo que responda a, ou corrija, um erro gerado quando um aplicativo compilado ou quando um aplicativo compilado executado. Quando o seu aplicativo manipula erros e o erro encontrado, acontece algo em resposta, em vez de ficar sem resposta, independentemente do processo que criou a falha do erro silenciosamente. Usado corretamente, a manipulao de erros ajuda a proteger o aplicativos e seus usurios de um comportamento inesperado. Contudo, trata-se de uma categoria ampla que inclui a resposta a vrios tipos de erros que so lanados durante a compilao ou em tempo de execuo. Este captulo descreve como manipular erros de tempo de execuo, os diferentes tipos de erros que podem ser gerados e as vantagens do novo sistema de manipulao de erros no ActionScript 3.0. Alm disso, explica como implementar suas prprias estratgias personalizadas de manipulao de erros para seus aplicativos.

Noes bsicas da manipulao de erros


Introduo manipulao de erros
Um erro de tempo de execuo acontece quando h algo de errado no cdigo do ActionScript que impede a execuo de seu contedo no Adobe Flash Player ou no Adobe AIR. Para garantir que o seu cdigo do ActionScript seja executado corretamente para os usurios, voc deve escrev-lo no aplicativo que manipula o erro (que o corrige, contorna ou pelo menos deixa o usurio saber o que aconteceu). Esse processo chamado de manipulao de erros. A manipulao de erros uma categoria ampla que inclui a resposta a vrios tipos de erros que so lanados durante a compilao ou em tempo de execuo. Os erros que acontecem em tempo de compilao, em geral, so mais fceis de identificar; necessrio corrigi-los para concluir o processo de criao de um arquivo SWF. Este captulo no discute os erros em tempo de compilao; para obter mais informaes sobre a escrita de cdigo que no contm erros de tempo de compilao, consulte Linguagem e sintaxe do ActionScript na pgina 38 e Programao orientada a objetos no ActionScript na pgina 92. Este captulo enfoca os erros de tempo de execuo. Os erros de tempo de execuo podem ser mais difceis de detectar, porque, para que ocorram, o cdigo com falha deve realmente ser executado. Se um segmento do seu programa tiver vrias ramificaes de cdigo, como uma instruo if..then..else, ser necessrio testar cada condio possvel, com todos os valores de entrada possveis que os usurios reais podem usar, para confirmar que o seu cdigo no possui erros. Os erros de tempo de execuo podem ser divididos em duas categorias: erros de programa so erros no seu cdigo do ActionScript, como especificar o tipo de dados errado para o parmetro de um mtodo; erros lgicos so erros na lgica (na verificao de dados e manipulao de valores) do seu programa, tal como usar a frmula errada para calcular taxas de juros em um aplicativo bancrio. Novamente, os dois tipos de erros, em geral, podem ser detectados e corrigidos com antecedncia, testando prontamente o aplicativo. Provavelmente, voc desejar identificar e remover todos os erros do aplicativo antes de lan-lo para os usurios finais. Entretanto, nem todos os erros podem ser previstos ou evitados. Por exemplo, suponha que o seu aplicativo do ActionScript carregue informaes de um site especfico que esteja fora do seu controle. Se, em algum momento, esse site no estiver disponvel, a parte do seu aplicativo que depende desses dados externos no se comportar corretamente. O aspecto mais importante da manipulao de erros envolve a preparao para esses casos desconhecidos e sua manipulao de forma apropriada para que os usurios possam continuar a usar o seu aplicativo ou, pelo menos, recebam uma mensagem de erro amigvel explicando por que ele no est funcionando.

PROGRAMAO DO ACTIONSCRIPT 3.0 185


Manipulao de erros

Os erros de tempo de execuo so representados de duas formas no ActionScript:

Classes de erro: muitos erros possuem uma classe de erro associada. Quando ocorre um erro, o Flash Player ou o
Adobe AIR cria uma ocorrncia da classe de erro especfica associada a esse erro em particular. O seu cdigo pode usar as informaes contidas nesse objeto de erro para dar uma resposta apropriada ao erro.

Eventos de erro: s vezes, ocorre um erro quando o Flash Player ou o Adobe AIR normalmente acionaria um
evento. Em vez disso, o Flash Player e o Adobe AIR acionam um evento de erro nesses casos. Como outros eventos, cada evento de erro possui uma classe associada, e o Flash Player e o Adobe AIR transmitem uma ocorrncia dessa classe para os mtodos que so inscritos no evento de erro. Para determinar se um mtodo especfico pode acionar um erro ou evento de erro, consulte a entrada do mtodo na Referncia dos componentes e da linguagem do ActionScript 3.0.

Tarefas comuns da manipulao de erros


As tarefas comuns relacionadas a erros que voc precisa executar com o seu cdigo so:

Escrever cdigo para manipular erros Testar, detectar e relanar erros Definir sua prpria classe de erro Responder a eventos de status e erro

Conceitos e termos importantes


A lista de referncia a seguir contm termos importantes usados neste captulo:

Assncrono: um comando de programa, como uma chamada de mtodo, que no fornece um resultado imediato e,
em vez disso, apresenta um resultado (ou erro) na forma de um evento.

Catch: quando ocorre uma exceo (um erro de tempo de execuo) e seu cdigo obtm essa informao, ele recebe
a instruo catch para detectar a exceo. Assim que a exceo detectada, o Flash Player e o Adobe AIR param de notificar outro cdigo do ActionScript a respeito dela.

Verso de depurador: uma verso especial do Flash Player ou do Adobe AIR (ADL) que contm cdigo para
notificar os usurios de erros de tempo de execuo. Na verso padro do Flash Player ou do Adobe AIR (aquela que a maioria dos usurios possui), os erros que no so manipulados pelo cdigo do ActionScript so ignorados. Nas verses de depurador (que so includas no Adobe Flash CS4 Professional e no Adobe Flex), exibida uma mensagem de aviso quando acontece um erro no manipulado.

Exceo: um erro que ocorre quando um programa executado e o ambiente de tempo de execuo (ou seja, o Flash
Player ou Adobe AIR) no consegue resolv-lo sozinho.

Relanar: quando o seu cdigo detecta uma exceo, o Flash Player e o Adobe AIR param de notificar os outros
objetos a respeito dela. Se for importante que os outros objetos sejam notificados a seu respeito, o seu cdigo dever relanar a exceo para reiniciar o processo de notificao.

Sncrono: um comando de programa, como uma chamada de mtodo, que fornece um resultado imediato (ou
imediatamente lana um erro), o que significa que a resposta pode ser usada dentro do mesmo bloco de cdigo.

Lanar: o ato de notificar o Flash Player ou o Adobe AIR (e conseqentemente notificar outros objetos e cdigo do
ActionScript) de que um erro ocorreu conhecido como lanar um erro.

PROGRAMAO DO ACTIONSCRIPT 3.0 186


Manipulao de erros

Teste dos exemplos do captulo


Durante a leitura deste captulo, talvez voc queira testar algumas listagens de cdigo de exemplo sozinho. Basicamente, todas as listagens de cdigo deste captulo incluem a chamada de funo trace() apropriada. Para testar as listagens de cdigo deste captulo:
1 Crie um documento Flash vazio. 2 Selecione um quadro-chave na linha de tempo. 3 Abra o painel Aes e copie a listagem de cdigo no painel Script. 4 Execute o programa usando Controlar > Testar filme.

Voc ver os resultados das funes trace() da listagem de cdigo no painel Sada. Algumas das ltimas listagens de cdigo so mais complexas e so escritas como uma classe. Para testar esses exemplos:
1 Crie um documento Flash e salve-o no seu computador. 2 Crie e salve um novo arquivo do ActionScript no mesmo diretrio do documento Flash. O nome do arquivo deve

corresponder ao nome da classe na listagem de cdigo. Por exemplo, se a listagem de cdigo definir uma classe chamada ErrorTest, use o nome ErrorTest.as para salvar o arquivo do ActionScript.
3 Copie a listagem de cdigo no arquivo do ActionScript e salve o arquivo. 4 No documento Flash, clique em uma parte em branco do Palco ou espao de trabalho para ativar o Inspetor de

propriedades do documento.
5 No Inspetor de propriedades no campo Classe do documento, digite o nome da classe do ActionScript que voc

copiou do texto.
6 Execute o programa usando Controlar > Testar filme.

Voc ver os resultados do exemplo no painel Sada (se o exemplo usar a funo trace()) ou um campo de texto criado pelo cdigo de exemplo. Essas tcnicas para testar as listagens de cdigo de exemplo so descritas com mais detalhes em Teste de listagens de cdigo de exemplo dos captulos na pgina 36.

Tipos de erros
Quando desenvolver e executar aplicativos, voc encontrar diferentes tipos de erros e terminologia de erros. A lista a seguir apresenta os principais termos e tipos de erros:

Erros de tempo de compilao so gerados pelo compilador do ActionScript durante a compilao de cdigo. Os
erros de compilao ocorrem quando problemas sintticos no seu cdigo impedem a criao do aplicativo.

Erros de tempo de execuo ocorrem quando voc executa o aplicativo depois de compil-lo. Os erros de tempo de
execuo representam os erros causados quando um arquivo SWF reproduzido no Adobe Flash Player ou no Adobe AIR. Na maioria dos casos, voc poder manipular os erros de tempo de execuo assim que eles ocorrerem, relatando-os ao usurio e tomando medidas para manter o aplicativo em execuo. Se o erro for fatal, por exemplo, no for possvel conectar a um site remoto ou carregar os dados necessrios, voc poder usar a manipulao de erros para permitir que o aplicativo seja concludo normalmente.

PROGRAMAO DO ACTIONSCRIPT 3.0 187


Manipulao de erros

Erros sncronos so erros de tempo de execuo que ocorrem no momento em que uma funo chamada; por
exemplo, quando voc tenta usar um mtodo especfico e o argumento que transmite para o mtodo invlido, o Flash Player ou o Adobe AIR lana uma exceo. A maioria dos erros ocorre de forma sncrona, no momento em que a instruo executada, e o fluxo de controle transmite imediatamente para a instruo catch mais aplicvel. Por exemplo, o trecho de cdigo a seguir lana um erro de tempo de execuo porque o mtodo browse() no chamado antes de o programa tentar carregar um arquivo:
var fileRef:FileReference = new FileReference(); try { fileRef.upload("http://www.yourdomain.com/fileupload.cfm"); } catch (error:IllegalOperationError) { trace(error); // Error #2037: Functions called in incorrect sequence, or earlier // call was unsuccessful. }

Nesse caso, um erro de tempo de execuo lanado de forma sncrona porque o Flash Player determinou que o mtodo browse() no foi chamado antes da tentativa de upload do arquivo. Para obter informaes detalhadas sobre manipulao de erros sncronos, consulte Manipulao de erros sncronos em um aplicativo na pgina 191.

Errosassncronos so erros de tempo de execuo que ocorrem em vrios momentos durante o tempo de execuo;
eles geram eventos e so detectados por ouvintes de eventos. Uma operao assncrona aquela na qual uma funo inicia uma operao, mas no espera ela ser concluda. Voc pode criar um ouvinte de eventos de erro que espere o aplicativo ou usurio tentar alguma operao e, se a operao falhar, detecte o erro com um ouvinte de eventos e responda ao evento de erro. Depois, o ouvinte de eventos chama uma funo de manipulador de eventos para responder ao evento de erro da melhor maneira. Por exemplo, o manipulador de eventos pode iniciar uma caixa de dilogo que solicite que o usurio resolva o erro. Considere o exemplo de erro sncrono de carregamento de arquivo apresentado anteriormente. Se voc chamar com xito o mtodo browse() antes de comear a carregar um arquivo, o Flash Player ir despachar vrios eventos. Por exemplo, quando um upload iniciado, o evento open despachado. Quando a operao de upload de arquivo concluda com xito, o evento complete despachado. Como a manipulao de eventos assncrona (isto , no ocorre em momentos especficos, conhecidos e predeterminados), necessrio usar o mtodo addEventListener() para ouvir esses eventos especficos, como mostra o seguinte cdigo:

PROGRAMAO DO ACTIONSCRIPT 3.0 188


Manipulao de erros

var fileRef:FileReference = new FileReference(); fileRef.addEventListener(Event.SELECT, selectHandler); fileRef.addEventListener(Event.OPEN, openHandler); fileRef.addEventListener(Event.COMPLETE, completeHandler); fileRef.browse(); function selectHandler(event:Event):void { trace("...select..."); var request:URLRequest = new URLRequest("http://www.yourdomain.com/fileupload.cfm"); request.method = URLRequestMethod.POST; event.target.upload(request.url); } function openHandler(event:Event):void { trace("...open..."); } function completeHandler(event:Event):void { trace("...complete..."); }

Para obter informaes detalhadas sobre manipulao de erros assncronos, consulte Resposta a eventos e status de erros na pgina 196.

Excees no detectadas so erros lanados sem nenhuma lgica correspondente (como uma instruo catch) em
resposta a elas. Se o seu aplicativo lanar um erro, e nenhuma instruo catch apropriada ou manipulador de eventos puderem ser encontrados no nvel atual ou superior para manipular o erro, o erro ser considerado uma exceo no detectada. Em tempo de execuo, o Flash Player ignora, por design, os erros no detectados e tenta continuar a reproduo quando o erro no interrompe o arquivo SWF atual, porque os usurios no podem necessariamente resolver um erro sozinhos. O processo de ignorar um erro no detectado chamado de "falha silenciosa" e pode complicar a depurao de aplicativos. A verso de depurador do Flash Player responde a um erro no detectado finalizando o script atual e exibindo o erro no detectado na sada da instruo trace ou escrevendo a mensagem de erro em um arquivo de log. Se o objeto de exceo for uma ocorrncia da classe Error ou uma de suas subclasses, o mtodo getStackTrace() ser chamado e as informaes de rastreamento de pilha tambm sero exibidas na sada da instruo de rastreamento ou em um arquivo de log. Para obter mais informaes sobre como usar a verso de depurador do Flash Player, consulte Trabalho com as verses de depurador do Flash Player e do AIR na pgina 190.

Manipulao de erros no ActionScript 3.0


Como muitos aplicativos podem ser executados sem construir a lgica para manipular erros, os desenvolvedores ficam tentados a adiar a criao da manipulao de erros em seus aplicativos. Entretanto, sem isso, um aplicativo pode parar facilmente ou frustrar o usurio caso algo no funcione conforme o esperado. O ActionScript 2.0 possui uma classe Error que permite criar a lgica dentro de funes personalizadas e lanar uma exceo com uma mensagem especfica. Como a manipulao de erros essencial para tornar um aplicativo amigvel, o ActionScript 3.0 inclui uma arquitetura expandida para detectar erros.

PROGRAMAO DO ACTIONSCRIPT 3.0 189


Manipulao de erros

Nota: Embora a Referncia dos componentes e da linguagem do ActionScript 3.0 documente as excees lanadas por vrios mtodos, ela pode no incluir todas as excees possveis para cada mtodo. Um mtodo pode lanar uma exceo para erros de sintaxe ou outros problemas que no so observados explicitamente na descrio do mtodo, mesmo quando a descrio lista algumas das excees que um mtodo lana.

Elementos de manipulao de erros do ActionScript 3.0


O ActionScript 3.0 inclui vrias ferramentas para manipulao de erros, incluindo:

Classes de erro. O ActionScript 3.0 inclui uma ampla variedade de classes Error para expandir o escopo de situaes
que podem produzir objetos de erro. Cada classe Error ajuda os aplicativos a manipular e responder a condies de erro especficas, quer estejam relacionadas a erros de sistema (como uma condio MemoryError), erros de cdigo (como uma condio ArgumentError), erros de rede e comunicao (como uma condio URIError) ou a outras situaes. Para obter mais informaes sobre cada classe, consulte Comparao das classes Error na pgina 199.

Menos falhas silenciosas. Nas verses anteriores do Flash Player, os erros eram gerados e relatados somente se voc
usasse a instruo throw explicitamente. Para o Flash Player 9 e suas verses posteriores e o Adobe AIR, mtodos e propriedades nativos do ActionScript lanam erros de tempo de execuo que permitem manipular essas excees com mais eficincia quando elas ocorrem e reagir individualmente a cada uma delas.

Limpar mensagens de erro exibidas durante a depurao. Ao usar a verso de depurador do Flash Player ou do
Adobe AIR, situaes ou cdigos problemticos geram mensagens de erro robustas, o que ajuda a identificar facilmente os motivos da falha de um bloco de cdigo especfico. Com isso, a correo de erros torna-se mais eficiente. Para obter mais informaes, consulte Trabalho com as verses de depurador do Flash Player e do AIR na pgina 190.

Erros precisos permitem a exibio de claras mensagens de erro aos usurios em tempo de execuo. Nas verses
anteriores do Flash Player, o mtodo FileReference.upload() retornava um valor booleano de false se a chamada upload() no fosse bem-sucedida, indicando um de cinco erros possveis. Se ocorrer um erro ao chamar o mtodo upload() no ActionScript 3.0, voc poder lanar um de quatro erros especficos, o que ajuda a exibir mensagens de erro mais precisas aos usurios finais.

Manipulao de erros refinada. Erros distintos so lanados para vrias situaes comuns. Por exemplo, no
ActionScript 2.0, antes de um objeto FileReference ser preenchido, a propriedade name tem o valor null (portanto, antes de usar ou exibir a propriedade name, necessrio garantir que o valor seja definido e no seja null). No ActionScript 3.0, se voc tentar acessar a propriedade name antes que ela seja preenchida, o Flash Player ou o AIR lanar IllegalOperationError, informando que o valor no foi definido, e voc pode usar blocos try..catch..finally para manipular o erro. Para obter mais informaes, consulte, Uso das instrues try..catch..finally na pgina 191.

Nenhuma desvantagem de desempenho significativa. O uso de blocos try..catch..finally para manipular


erros exige poucos (ou nenhum dos) recursos adicionais comparado s verses anteriores do ActionScript.

Uma classe ErrorEvent que permite criar ouvintes para eventos de erro assncronos especficos. Para obter mais
informaes, consulte Resposta a eventos e status de erros na pgina 196.

Estratgias de manipulao de erros


Contanto que seu aplicativo no encontre uma condio problemtica, ele poder ser executado com xito se voc no criar uma lgica de manipulao de erros no seu cdigo. Entretanto, se voc no manipular os erros ativamente e seu aplicativo encontrar um problema, seus usurios nunca sabero por que ocorreu uma falha.

PROGRAMAO DO ACTIONSCRIPT 3.0 190


Manipulao de erros

H diferentes maneiras de abordar a manipulao de erros no seu aplicativo. A lista a seguir resume as trs principais opes para manipular erros:

Usar instrues try..catch..finally. Elas detectaro os erros sncronos que ocorrerem. Voc pode aninhar
essas instrues em uma hierarquia para detectar excees em diversos nveis de execuo de cdigo. Para obter mais informaes, consulte, Uso das instrues try..catch..finally na pgina 191.

Criar seus prprios objetos de erro personalizados. Voc pode usar a classe Error para criar seus prprios objetos
de erro personalizados a fim de controlar operaes especficas no seu aplicativo que no estejam includas nos tipos de erro embutidos. Depois, voc pode usar as instrues try..catch..finally nos seus objetos de erro personalizados. Para obter mais informaes, consulte Criao de classes de erros personalizadas na pgina 195.

Escreva ouvintes e manipuladores de eventos para responder aos eventos de erro. Usando essa estratgia, voc pode
criar manipuladores de erro globais que permitem manipular eventos semelhantes sem duplicar uma grande quantidade de cdigo nos blocos try..catch..finally. Voc tem muito mais chances de detectar erros assncronos usando essa abordagem. Para obter mais informaes, consulte Resposta a eventos e status de erros na pgina 196.

Trabalho com as verses de depurador do Flash Player e do AIR


A Adobe fornece aos desenvolvedores edies especiais do Flash Player e do Adobe AIR para ajudar nos esforos de depurao. Ao instalar o Adobe Flash CS4 Professional ou o Adobe Flex Builder 3, voc obtm uma cpia da verso de depurador do Flash Player. Ao instalar uma dessas ferramentas, voc obter uma verso de depurador do Adobe AIR chamada ADL, tambm fornecida como parte do Adobe AIR SDK. H uma grande diferena na forma como as verses de depurador e de lanamento do Flash Player e do Adobe AIR indicam os erros. As verses de depurador mostram o tipo de erro (como Error, IOError ou EOFError genricos), o nmero de erros e uma mensagem de erro legvel. As verses de lanamento mostram apenas o tipo de erro e o nmero de erros. Por exemplo, considere o seguinte cdigo:
try { tf.text = myByteArray.readBoolean(); } catch (error:EOFError) { tf.text = error.toString(); }

Se o mtodo readBoolean() lanasse um EOFError na verso de depurador do Flash Player, seria exibida a seguinte mensagem no campo de texto tf: "EOFError: Erro 2030: Fim do arquivo localizado." O mesmo cdigo em uma verso de lanamento do Flash Player ou do Adobe AIR exibiria o seguinte texto: "EOFError: Erro 2030." Para manter os recursos e o tamanho mnimos nas verses de lanamento, as seqncias de caracteres de mensagem de erro no esto presentes. Voc pode pesquisar o nmero do erro na documentao (os apndices da Referncia dos componentes e da linguagem do ActionScript 3.0) para correlacionar uma mensagem de erro. Se preferir, voc pode reproduzir o erro usando as verses de depurador do Flash Player e do AIR para ver a mensagem inteira.

PROGRAMAO DO ACTIONSCRIPT 3.0 191


Manipulao de erros

Manipulao de erros sncronos em um aplicativo


A manipulao de erros mais comum a lgica de manipulao de erros sncrona, em que voc insere instrues no cdigo para detectar erros sncronos em tempo de execuo. Esse tipo de manipulao de erros permite ao aplicativo notar e se recuperar de erros de tempo de execuo quando as funes falham. A lgica para detectar um erro sncrono inclui as instrues try..catch..finally, que literalmente tentam uma operao, detectam qualquer resposta de erro do Flash Player ou do Adobe AIR e finalmente executam outra operao para manipular a operao que falhou.

Uso das instrues try..catch..finally


Durante o trabalho com erros de tempo de execuo sncronos, use as instrues try..catch..finally para detectar erros. Quando um erro de tempo de execuo ocorre, o Flash Player ou o Adobe AIR lana uma exceo, o que significa que ele suspende a execuo normal e cria um objeto especial do tipo Error. O objeto Error lanado para o primeiro bloco catch disponvel. A instruo try delimita instrues com potencial para criar erros. A instruo catch sempre usada com uma instruo try. Se for detectado um erro em uma das instrues no bloco try, as instrues catch anexadas a try sero executadas. A instruo finally delimitar as instrues que sero executadas caso ocorra ou no um erro no bloco try. Se no houver nenhum erro, as instrues no bloco finally sero executadas depois que as instrues do bloco try forem concludas. Se houver um erro, a instruo catch apropriada ser executada primeiro, seguida pelas instrues no bloco finally. O cdigo a seguir demonstra a sintaxe para usar as instrues try..catch..finally:
try { // some code that could throw an error } catch (err:Error) { // code to react to the error } finally { // Code that runs whether or not an error was thrown. This code can clean // up after the error, or take steps to keep the application running. }

Cada instruo catch identifica um tipo especfico de exceo que ela manipula. A instruo catch pode especificar apenas as classes de erro que forem subclasses da classe Error. Cada instruo catch verificada por ordem. Somente a primeira instruo catch que corresponder ao tipo de erro lanado ser executada. Em outras palavras, se voc verificar primeiro a classe Error de alto nvel e depois uma subclasse dela, somente a classe Error de alto nvel ser correspondente. O seguinte cdigo ilustra essa questo:

PROGRAMAO DO ACTIONSCRIPT 3.0 192


Manipulao de erros

try { throw new ArgumentError("I am an ArgumentError"); } catch (error:Error) { trace("<Error> " + error.message); } catch (error:ArgumentError) { trace("<ArgumentError> " + error.message); }

O cdigo anterior exibe a seguinte sada:


<Error> I am an ArgumentError

Para detectar corretamente o ArgumentError, os tipos de erro mais especficos devem ser listados primeiro e os mais genricos por ltimo, como mostra o seguinte cdigo:
try { throw new ArgumentError("I am an ArgumentError"); } catch (error:ArgumentError) { trace("<ArgumentError> " + error.message); } catch (error:Error) { trace("<Error> " + error.message); }

Vrios mtodos e propriedades na API do Flash Player lanam erros de tempo de execuo quando encontram erros ao serem executados. Por exemplo, o mtodo close() na classe Sound lanar um IOError se o mtodo no conseguir fechar o fluxo de udio, conforme demonstrado no seguinte cdigo:
var mySound:Sound = new Sound(); try { mySound.close(); } catch (error:IOError) { // Error #2029: This URLStream object does not have an open stream. }

Conforme se familiarizar mais com a Referncia dos componentes e da linguagem do ActionScript 3.0, voc notar quais mtodos lanam excees, conforme detalhado em cada descrio de mtodo.

A instruo throw
O Flash Player e o Adobe AIR lanam excees quando encontram erros no aplicativo em tempo de execuo. Alm disso, voc mesmo pode lanar excees explicitamente usando a instruo throw. Ao lanar erros explicitamente, a Adobe recomenda que voc lance ocorrncias da classe Error ou de suas subclasses. O cdigo a seguir demonstra uma instruo throw que lana uma ocorrncia da classe Error, MyErr e finalmente chama uma funo, myFunction(), para responder depois que o erro lanado:

PROGRAMAO DO ACTIONSCRIPT 3.0 193


Manipulao de erros

var MyError:Error = new Error("Encountered an error with the numUsers value", 99); var numUsers:uint = 0; try { if (numUsers == 0) { trace("numUsers equals 0"); } } catch (error:uint) { throw MyError; // Catch unsigned integer errors. } catch (error:int) { throw MyError; // Catch integer errors. } catch (error:Number) { throw MyError; // Catch number errors. } catch (error:*) { throw MyError; // Catch any other error. } finally { myFunction(); // Perform any necessary cleanup here. }

Observe que as instrues catch so ordenadas de forma que os tipos de dados mais especficos sejam listados primeiro. Se a instruo catch do tipo de dados Number fosse listada primeiro, a instruo catch para o tipo de dados uint e a instruo catch para o tipo de dados int nunca seriam executadas. Nota: Na linguagem de programao Java, cada funo que pode lanar uma exceo deve declarar esse fato, listando as classes de exceo que pode lanar em uma clusula throws anexada declarao de funo. O ActionScript no requer que voc declare as excees que podem ser lanadas por uma funo.

Exibio de uma mensagem de erro simples


Uma das grandes vantagens do novo modelo de eventos de exceo e erro que ele permite dizer aos usurios quando e por que uma ao falhou. Cabe a voc escrever o cdigo para exibir a mensagem e oferecer opes em resposta. O cdigo a seguir mostra uma instruo try..catch simples para exibir o erro em um campo de texto:

PROGRAMAO DO ACTIONSCRIPT 3.0 194


Manipulao de erros

package { import flash.display.Sprite; import flash.text.TextField; public class SimpleError extends Sprite { public var employee:XML = <EmpCode> <costCenter>1234</costCenter> <costCenter>1-234</costCenter> </EmpCode>; public function SimpleError() { try { if (employee.costCenter.length() != 1) { throw new Error("Error, employee must have exactly one cost center assigned."); } } catch (error:Error) { var errorMessage:TextField = new TextField(); errorMessage.autoSize = TextFieldAutoSize.LEFT; errorMessage.textColor = 0xFF0000; errorMessage.text = error.message; addChild(errorMessage); } } } }

Usando uma ampla variedade de classes de erro e erros do compilador embutidos, o ActionScript 3.0 oferece mais informaes do que as verses anteriores do ActionScript sobre o motivo de uma falha. Isso permite criar aplicativos mais estveis com uma manipulao de erros melhor.

Relanamento de erros
Ao criar aplicativos, h vrias ocasies em que pode ser preciso relanar um erro quando no possvel manipul-lo adequadamente. Por exemplo, o cdigo a seguir mostra um bloco try..catch aninhado, que relana um ApplicationError personalizado quando o bloco catch no consegue manipular o erro:

PROGRAMAO DO ACTIONSCRIPT 3.0 195


Manipulao de erros

try { try { trace("<< try >>"); throw new ArgumentError("some error which will be rethrown"); } catch (error:ApplicationError) { trace("<< catch >> " + error); trace("<< throw >>"); throw error; } catch (error:Error) { trace("<< Error >> " + error); } } catch (error:ApplicationError) { trace("<< catch >> " + error); }

O resultado do snippet anterior seria o seguinte:


<< << << << try >> catch >> ApplicationError: some error which will be rethrown throw >> catch >> ApplicationError: some error which will be rethrown

O bloco try aninhado lana um erro ApplicationError personalizado que detectado pelo bloco catch subseqente. Esse bloco catch aninhado pode tentar manipular o erro e, se for bem-sucedido, lanar o objeto ApplicationError ao bloco try..catch delimitador.

Criao de classes de erros personalizadas


Voc pode estender uma das classes Error padro para criar suas prprias classes de erro especializadas no ActionScript. H vrios motivos para criar suas prprias classes de erro:

Para identificar erros ou grupos de erros especficos que so exclusivos do seu aplicativo.
Por exemplo, voc pode querer executar aes diferentes para erros lanados por seu prprio cdigo, alm daqueles capturados pelo Flash Player ou pelo Adobe AIR. Voc pode criar uma subclasse da classe Error para controlar o novo tipo de dados de erro em blocos try..catch.

Para fornecer recursos de exibio de erros exclusivos para os erros gerados pelo seu aplicativo.
Por exemplo, voc pode criar um novo mtodo toString() que formata suas mensagens de erro de uma determinada maneira. Voc tambm pode definir o mtodo lookupErrorString() que obtm um cdigo de erro e recupera a mensagem apropriada com base na preferncia de idioma do usurio. Uma classe de erro especializada deve estender a classe Error principal do ActionScript. Veja um exemplo de uma classe AppError especializada que estende a classe Error:

PROGRAMAO DO ACTIONSCRIPT 3.0 196


Manipulao de erros

public class AppError extends Error { public function AppError(message:String, errorID:int) { super(message, errorID); } }

O exemplo a seguir mostra o uso de AppError em seu projeto:


try { throw new AppError("Encountered Custom AppError", 29); } catch (error:AppError) { trace(error.errorID + ": " + error.message) }

Nota: Para substituir o mtodo Error.toString() na sua subclasse, voc deve atribuir-lhe um parmetro ...(rest). A especificao da linguagem ECMAScript na qual o ActionScript 3.0 baseado define o mtodo Error.toString() desse modo, enquanto o ActionScript 3.0 adota a mesma definio para garantir a compatibilidade com verses anteriores. Portanto, ao substituir o mtodo Error.toString(), deve haver uma correspondncia exata de parmetros. Os parmetros no devem ser transmitidos para o mtodo toString() em tempo de execuo, porque sero ignorados.

Resposta a eventos e status de erros


Um dos aprimoramentos mais notveis da manipulao de erros no ActionScript 3.0 o suporte manipulao de eventos de erro para responder a erros de tempo de execuo assncronos. (Para obter uma definio de erros assncronos, consulte Tipos de erros na pgina 186.) Voc pode criar ouvintes e manipuladores de eventos para responder aos eventos de erro. Muitas classes despacham os eventos de erro da mesma forma o fazem com outros eventos. Por exemplo, uma instncia da classe XMLSocket normalmente despacha trs tipos de eventos: Event.CLOSE, Event.CONNECT e DataEvent.DATA. Entretanto, quando ocorre um problema, a classe XMLSocket pode despachar o IOErrorEvent.IOError ou o SecurityErrorEvent.SECURITY_ERROR. Para obter mais informaes sobre ouvintes e manipuladores de eventos, consulteManipulao de eventos na pgina 251. Os eventos de erro se enquadram em duas categorias:

Eventos de erro que estendem a classe ErrorEvent


A classe flash.events.ErrorEvent contm as propriedades e os mtodos para gerenciar erros de tempo de execuo relacionados s operaes de rede e comunicao. As classes AsyncErrorEvent, IOErrorEvent e SecurityErrorEvent estendem a classe ErrorEvent. Se voc estiver usando a verso de depurador do Flash Player ou do Adobe AIR, uma caixa de dilogo o informar, em tempo de execuo, de qualquer evento de erro sem as funes de ouvinte que o player encontrar.

Eventos de erro baseados no status


Os eventos de erro baseados no status esto relacionados s propriedades netStatus e status das classes de rede e comunicao. Se o Flash Player ou o Adobe AIR encontrar um problema ao ler ou gravar dados, o valor das propriedades netStatus.info.level ou status.level (dependendo do objeto de classe usado) ser definido com o valor "error". A resposta a esse erro verificar se a propriedade level contm o valor "error" na funo do manipulador de eventos.

PROGRAMAO DO ACTIONSCRIPT 3.0 197


Manipulao de erros

Trabalho com eventos de erro


A classe ErrorEvent e suas subclasses contm tipos de erro para manipular erros que o Flash Player e Adobe AIR despacham quando tentam ler ou gravar dados. O exemplo a seguir usa uma instruo try..catch e manipuladores de evento de erro para exibir os erros detectados ao tentar ler um arquivo local. Voc pode adicionar cdigo de manipulao mais sofisticado para fornecer opes a um usurio ou manipular o erro automaticamente nos locais indicados pelo comentrio "seu cdigo de manipulao de erros aqui":
package { import import import import import import import import import

flash.display.Sprite; flash.errors.IOError; flash.events.IOErrorEvent; flash.events.TextEvent; flash.media.Sound; flash.media.SoundChannel; flash.net.URLRequest; flash.text.TextField; flash.text.TextFieldAutoSize;

public class LinkEventExample extends Sprite { private var myMP3:Sound; public function LinkEventExample() { myMP3 = new Sound(); var list:TextField = new TextField(); list.autoSize = TextFieldAutoSize.LEFT; list.multiline = true; list.htmlText = "<a href=\"event:track1.mp3\">Track 1</a><br>"; list.htmlText += "<a href=\"event:track2.mp3\">Track 2</a><br>"; addEventListener(TextEvent.LINK, linkHandler); addChild(list); } private function playMP3(mp3:String):void { try { myMP3.load(new URLRequest(mp3)); myMP3.play(); } catch (err:Error)

PROGRAMAO DO ACTIONSCRIPT 3.0 198


Manipulao de erros

{ trace(err.message); // your error-handling code here } myMP3.addEventListener(IOErrorEvent.IO_ERROR, errorHandler); } private function linkHandler(linkEvent:TextEvent):void { playMP3(linkEvent.text); // your error-handling code here } private function errorHandler(errorEvent:IOErrorEvent):void { trace(errorEvent.text); // your error-handling code here } } }

Trabalho com eventos de alterao de status


O Flash Player e o Adobe AIR alteram dinamicamente o valor das propriedades netStatus.info.level ou status.level para as classes que oferecem suporte propriedade level. As classes que possuem a propriedade netStatus.info.level so: NetConnection, NetStream e SharedObject. As classes que possuem a propriedade status.level so: HTTPStatusEvent, Camera, Microphone e LocalConnection. Voc pode escrever uma funo de manipulador para responder alterao no valor level e controlar os erros de comunicao. O exemplo a seguir usa uma funo netStatusHandler() para testar o valor da propriedade level. Se a propriedade level indicar que um erro foi encontrado, o cdigo rastreia a mensagem Falha no fluxo de vdeo.
package { import import import import import import

flash.display.Sprite; flash.events.NetStatusEvent; flash.events.SecurityErrorEvent; flash.media.Video; flash.net.NetConnection; flash.net.NetStream;

public class VideoExample extends Sprite { private var videoUrl:String = "Video.flv"; private var connection:NetConnection; private var stream:NetStream; public function VideoExample() { connection = new NetConnection(); connection.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); connection.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler); connection.connect(null); } private function netStatusHandler(event:NetStatusEvent):void

PROGRAMAO DO ACTIONSCRIPT 3.0 199


Manipulao de erros

{ if (event.info.level == "error") { trace("Video stream failed") } else { connectStream(); } } private function securityErrorHandler(event:SecurityErrorEvent):void { trace("securityErrorHandler: " + event); } private function connectStream():void { var stream:NetStream = new NetStream(connection); var video:Video = new Video(); video.attachNetStream(stream); stream.play(videoUrl); addChild(video); } } }

Comparao das classes Error


O ActionScript fornece vrias classes Error predefinidas. Muitas delas so usadas pelo Flash Player e Adobe AIR, mas voc tambm pode usar as mesmas classes Error no seu prprio cdigo. H dois tipos principais de classes Error no ActionScript 3.0: As classes Error principais do ActionScript e as classes Error do pacote flash.error. As classes Error principais so prescritas pela especificao de linguagem do ECMAScript (ECMA-262) edio 3. O pacote flash.error contm classes adicionais introduzidas para auxiliar no desenvolvimento e na depurao de aplicativos do ActionScript 3.0.

ECMAScript, classes Error principais


As classes de erro principais do ECMAScript incluem as classes Error, EvalError, RangeError, ReferenceError, SyntaxError, TypeError e URIError. Cada uma dessas classes est localizada no espao para nomes de nvel superior.

PROGRAMAO DO ACTIONSCRIPT 3.0 200


Manipulao de erros

Nome da classe Error

Descrio A classe Error pode ser usada para lanar excees e a classe base para as outras classes de exceo definidas no ECMAScript: EvalError, RangeError, ReferenceError, SyntaxError, TypeError e URIError.

Observaes A classe Error serve de classe base para todos os erros de tempo de execuo lanados pelo Flash Player e Adobe AIR e a classe base recomendada para qualquer classe de erro personalizada.

EvalError

Uma exceo EvalError lanada se qualquer No ActionScript 3.0, o suporte funo eval() foi removido e parmetro for transmitido para o construtor da classe as tentativas de usar a funo causam o lanamento de um erro. Function ou se o cdigo do usurio chamar a funo As verses anteriores do Flash Player usavam a funo eval() eval(). para acessar variveis, propriedades, objetos ou clipes de filme pelo nome. Uma exceo RangeError lanada quando um valor Por exemplo, um RangeError seria lanado pela classe Timer se numrico fica fora de uma faixa aceitvel. um atraso fosse negativo ou no fosse finito. Um RangeError tambm poderia ser lanado se voc tentasse adicionar um objeto de exibio em uma profundidade invlida. Uma exceo de ReferenceError lanada quando h uma tentativa de referncia a uma propriedade no definida em um objeto selado (no dinmico). As verses de compilador do ActionScript antes do ActionScript 3.0 no lanavam um erro quando havia uma tentativa de acesso a uma propriedade no definida. No entanto, o ActionScript 3.0 lana a exceo ReferenceError nessa condio. As excees para variveis no definidas apontam para possveis bugs, ajudando a melhorar a qualidade do software. Entretanto, se voc no est acostumado a inicializar as variveis, esse novo comportamento do ActionScript pode exigir algumas alteraes nos seus hbitos de criao de cdigo.

RangeError

ReferenceError

PROGRAMAO DO ACTIONSCRIPT 3.0 201


Manipulao de erros

Nome da classe SyntaxError

Descrio Uma exceo SyntaxError lanada quando ocorre um erro de anlise no cdigo do ActionScript. Para obter mais informaes, consulte a Seo 15.11.6.4 da especificao de linguagem do ECMAScript (ECMA-262) edio 3 em www.ecmainternational.org/publications/standards/Ecma262.htm, bem como a Seo 10.3.1 da especificao do ECMAScript para XML (E4X) (ECMA-357 edio 2) em www.ecmainternational.org/publications/standards/Ecma357.htm.

Observaes Um SyntaxError pode ser lanado sob as seguintes circunstncias:

O ActionScript lana excees SyntaxError quando uma expresso regular invlida analisada pela classe RegExp. O ActionScript lana excees SyntaxError quando um XML invlido analisado pela classe XMLDocument.

TypeError

A exceo TypeError lanada quando o tipo real de operando diferente do tipo esperado. Para obter mais informaes, consulte a Seo 15.11.6.5 da especificao ECMAScript em www.ecmainternational.org/publications/standards/Ecma262.htm, bem como a Seo 10.3 da especificao E4X em www.ecmainternational.org/publications/standards/Ecma357.htm.

Um TypeError pode ser lanado sob as seguintes circunstncias:

Um parmetro real para uma funo ou um mtodo no pde ser forado ao tipo de parmetro formal. Um valor atribudo a uma varivel e no pode ser forado ao tipo da varivel. O lado direito do operador is ou instanceof no um tipo vlido. A palavra-chave super usada ilegalmente. Uma pesquisa de propriedades resulta em mais de uma ligao e, portanto, ambgua. Um mtodo chamado em um objeto incompatvel. Por exemplo, uma exceo TypeError ser lanada se um mtodo na classe RegExp for "enxertado" em um objeto genrico e, depois, chamado.

URIError

Uma exceo URIError lanada quando uma das funes de manipulao de URI global usada de forma incompatvel com sua definio. Para obter mais informaes, consulte a Seo 15.11.6.6 da especificao ECMAScript em www.ecmainternational.org/publications/standards/Ecma262.htm.

Um URIError pode ser lanado sob as seguintes circunstncias: Um URI invlido especificado para uma funo da API do Flash Player que espera um URI vlido, como Socket.connect().

ActionScript, classes Error principais


Alm das classes Error ECMAScript principais, o ActionScript adiciona vrias de suas prprias classes para as condies de erro e funcionalidades de manipulao de erros especficas do ActionScript. Como essas classes eram extenses da linguagem do ActionScript para a especificao de linguagem do ECMAScript edio 3 que podiam ser adies interessantes para uma futura verso da especificao, elas foram mantidas no nvel superior em vez de serem colocadas em um pacote como flash.error.

PROGRAMAO DO ACTIONSCRIPT 3.0 202


Manipulao de erros

Nome da classe ArgumentError

Descrio

Observaes

A classe ArgumentError representa um erro que ocorre Alguns exemplos de erros de argumento incluem: quando os valores de parmetro fornecidos durante Foram fornecidos argumentos insuficientes ou uma chamada de funo no correspondem aos excedentes para um mtodo. definidos para essa funo.

SecurityError

Um argumento que deveria ser um membro de uma enumerao no .

A exceo SecurityError lanada quando ocorre uma Alguns exemplos de erros de segurana incluem: violao de segurana e o acesso negado. Um acesso a propriedade ou uma chamada de mtodo no autorizado feito no outro lado de um limite de caixa de proteo.

Foi feita uma tentativa de acessar uma URL no permitida pela caixa de proteo. Foi feita uma tentativa de conexo de soquete a uma porta, mas o arquivo de poltica de soquete necessrio no estava disponvel. Foi feita uma tentativa de acessar a cmera ou o microfone do usurio, e a solicitao de acesso ao dispositivo foi negada pelo usurio.

VerifyError

Uma exceo VerifyError lanada quando encontrado um arquivo SWF malformado ou corrompido.

Quando um arquivo SWF carrega outro arquivo SWF, o SWF pai pode detectar um VerifyError gerado pelo SWF carregado.

flash.error, classes Error do pacote


O pacote flash.error contm classes de Error que so consideradas parte da API do Flash Player. Ao contrrio das classes Error que acabamos de descrever, o pacote flash.error comunica eventos de erro especficos do Flash Player ou do Adobe AIR.

PROGRAMAO DO ACTIONSCRIPT 3.0 203


Manipulao de erros

Nome da classe EOFError

Descrio Uma exceo EOFError lanada quando voc tenta ler alm do fim dos dados disponveis.

Observaes Por exemplo, um EOFError mostrado quando um dos mtodos de leitura na interface IDataInput chamado e no h dados suficientes para atender solicitao de leitura. Exemplos de excees de erro de operao ilegal incluem:

IllegalOperationError

Uma exceo IllegalOperationError lanada quando um mtodo no implementado ou quando a implementao no abrange o uso atual.

Uma classe base, como DisplayObjectContainer, fornece mais funcionalidade do que o Palco pode suportar. Por exemplo, se voc tentar obter ou definir uma mscara no Palco (usando stage.mask), o Flash Player e o Adobe AIR lanaro um IllegalOperationError com a mensagem: "A classe Stage no implementa essa propriedade ou esse mtodo". Uma subclasse herda um mtodo que no requer e para o qual no deseja oferecer suporte. Determinados mtodos de acessibilidade so chamados quando o Flash Player compilado sem o suporte de acessibilidade. Recursos somente de autoria so chamados de uma verso de tempo de execuo do Flash Player. Voc tenta definir o nome de um objeto colocado na linha de tempo.


IOError Uma exceo IOError lanada quando ocorre algum tipo de exceo de E/S.

Por exemplo, voc obtm este erro quando uma operao de leitura/gravao tentada em um soquete que no est conectado ou se desconectou.

MemoryError

Uma exceo MemoryError lanada quando h Por padro, a ActionScript Virtual Machine 2 no uma falha na solicitao de alocao de memria. impe um limite sobre a quantidade de memria que um programa do ActionScript pode alocar. Em um PC desktop, as falhas de alocao de memria no so freqentes. Um erro lanado quando o sistema no consegue alocar a memria necessria para uma operao. Por isso, em um PC desktop, essa exceo rara, a menos que uma solicitao de alocao seja extremamente grande; por exemplo, uma solicitao de 3 bilhes de bytes impossvel porque um programa Microsoft Windows de 32 bits s pode acessar 2 GB de espao de endereamento. Uma exceo ScriptTimeoutError lanada quando um intervalo de tempo limite do script de 15 segundos atingido. Ao detectar uma exceo ScriptTimeoutError, possvel manipular melhor o tempo limite do script. Se no houver um manipulador de excees, a exceo no capturada exibir uma caixa de dilogo com uma mensagem de erro. Para impedir que um desenvolvedor malintencionado detecte a exceo e permanea em um loop infinito, somente a primeira exceo ScriptTimeoutError lanada durante um determinado script pode ser detectada. Uma exceo ScriptTimeoutError subseqente no poder ser detectada pelo seu cdigo e ir imediatamente para o manipulador de excees no detectadas.

ScriptTimeoutError

StackOverflowError

A exceo StackOverflowError lanada quando a Uma exceo StackOverflowError pode indicar que pilha disponvel para o script esgotada. ocorreu recurso infinita.

PROGRAMAO DO ACTIONSCRIPT 3.0 204


Manipulao de erros

Exemplo: Aplicativo CustomErrors


O aplicativo CustomErrors demonstra tcnicas para trabalhar com erros personalizados ao criar um aplicativo. Estas tcnicas so:

Validar um pacote XML Escrever um erro personalizado Lanar erros personalizados Notificar os usurios quando um erro lanado
Para obter os arquivos do aplicativo para este exemplo, consulte www.adobe.com/go/learn_programmingAS3samples_flash_br. Os arquivos do aplicativo CustomErrors podem ser encontrados na pasta Samples/CustomError. O aplicativo consiste nos seguintes arquivos:
Arquivo CustomErrors.mxml ou CustomErrors.fla com/example/programmingas3/errors/ApplicationError.as Uma classe que serve de classe de erro base para as classes FatalError e WarningError. Uma classe que define um erro FatalError que pode ser lanado pelo aplicativo. Essa classe estende a classe ApplicationError personalizada. Uma classe que define um nico mtodo que valida um pacote XML funcionrio fornecido pelo usurio. Uma classe que define um erro WarningError que pode ser lanado pelo aplicativo. Essa classe estende a classe ApplicationError personalizada. Descrio O arquivo principal do aplicativo no Flash (FLA) ou no Flex (MXML).

com/example/programmingas3/errors/FatalError.as

com/example/programmingas3/errors/Validator.as

com/example/programmingas3/errors/WarningError.as

Viso geral do aplicativo CustomErrors


Quando o aplicativo carregado, o mtodo initApp() chamado no Flex ou o cdigo (no-funo) de linha de tempo executado no Flash. Esse cdigo define um pacote XML de exemplo que ser verificado pela classe Validator. O seguinte cdigo executado:
employeeXML = <employee id="12345"> <firstName>John</firstName> <lastName>Doe</lastName> <costCenter>12345</costCenter> <costCenter>67890</costCenter> </employee>; }

O pacote XML exibido posteriormente em uma ocorrncia do componente TextArea no Palco. Isso permite modificar o pacote XML antes de tentar valid-lo novamente. Quando o usurio clica no boto Validate, o mtodo validateData() chamado. Esse mtodo valida o pacote XML funcionrio usando o mtodo validateEmployeeXML() na classe Validator. O cdigo a seguir mostra o mtodo validateData():

PROGRAMAO DO ACTIONSCRIPT 3.0 205


Manipulao de erros

function validateData():void { try { var tempXML:XML = XML(xmlText.text); Validator.validateEmployeeXML(tempXML); status.text = "The XML was successfully validated."; } catch (error:FatalError) { showFatalError(error); } catch (error:WarningError) { showWarningError(error); } catch (error:Error) { showGenericError(error); } }

Primeiro, um objeto XML temporrio criado usando o contedo da ocorrncia do componente TextArea xmlText. Em seguida, o mtodo validateEmployeeXML() na classe Validator personalizada (com.example.programmingas3/errors/Validator.as) chamado e transmite o objeto XML temporrio como um parmetro. Se o pacote XML for vlido, a ocorrncia do componente Label status exibir uma mensagem de xito e o aplicativo ser encerrado. Se o mtodo validateEmployeeXML() lanar um erro personalizado (isto , se ocorrer um FatalError, WarningError ou um Error genrico), a instruo catch apropriada executar e chamar o mtodo showFatalError(), showWarningError() ou showGenericError(). Cada um desses mtodos exibe uma mensagem apropriada em uma rea de texto chamada statusText para notificar o usurio do erro especfico que ocorreu. Cada mtodo tambm atualiza a ocorrncia do componente Label status com uma mensagem especfica. Se ocorrer um erro fatal durante a tentativa de validar o pacote XML funcionrio, a mensagem de erro ser exibida na rea de texto statusText e as ocorrncias dos componentes TextArea xmlText e Button validateBtn sero desativadas, como mostra o seguinte cdigo:
function showFatalError(error:FatalError):void { var message:String = error.message + "\n\n"; var title:String = error.getTitle(); statusText.text = message + " " + title + "\n\nThis application has ended."; this.xmlText.enabled = false; this.validateBtn.enabled = false; hideButtons(); }

Se ocorrer um erro de aviso, em vez de um erro fatal, a mensagem de erro ser exibida na ocorrncia statusText TextArea, mas as ocorrncias dos componentes Button e TextField xmlText no sero desativadas. O mtodo showWarningError() exibe uma mensagem de erro personalizada na rea de texto statusText. A mensagem tambm solicita que o usurio decida se deseja prosseguir com a validao do XML ou abortar o script. O seguinte trecho mostra o mtodo showWarningError():

PROGRAMAO DO ACTIONSCRIPT 3.0 206


Manipulao de erros

function showWarningError(error:WarningError):void { var message:String = error.message + "\n\n" + "Do you want to exit this application?"; showButtons(); var title:String = error.getTitle(); statusText.text = message; }

Quando o usurio clica no boto Yes ou No, o mtodo closeHandler() chamado. O seguinte trecho mostra o mtodo closeHandler():
function closeHandler(event:CloseEvent):void { switch (event.detail) { case yesButton: showFatalError(new FatalError(9999)); break; case noButton: statusText.text = ""; hideButtons(); break; } }

Se o usurio decidir abortar o script clicando em Yes, um FatalError ser lanado fazendo com que o aplicativo seja encerrado.

Criao de um validador personalizado


A classe Validator personalizada contm um nico mtodo, validateEmployeeXML(). O mtodo validateEmployeeXML() usa um nico argumento, employee, que o pacote XML que voc deseja validar. O mtodo validateEmployeeXML() o seguinte:
public static function validateEmployeeXML(employee:XML):void { // checks for the integrity of items in the XML if (employee.costCenter.length() < 1) { throw new FatalError(9000); } if (employee.costCenter.length() > 1) { throw new WarningError(9001); } if (employee.ssn.length() != 1) { throw new FatalError(9002); } }

Para ser validado, um funcionrio deve pertencer a um (e apenas um) centro de custos. Se o funcionrio no pertencer a nenhum centro de custos, o mtodo lanar um FatalError, que emitido ao mtodo validateData() no arquivo do aplicativo principal. Se o funcionrio pertencer a mais de um centro de custos, ser lanado um WarningError. A verificao final no validador XML que o usurio tem exatamente um nmero de seguro social (o n ssn no pacote XML). Se no houver exatamente um n ssn, ser lanado um erro FatalError.

PROGRAMAO DO ACTIONSCRIPT 3.0 207


Manipulao de erros

Voc pode adicionar outras verificaes ao mtodo validateEmployeeXML(), por exemplo, para garantir que o n ssn contenha um nmero vlido ou que o funcionrio tenha pelo menos um nmero de telefone e um endereo de email definido, e os dois valores sejam vlidos. Tambm possvel modificar o XML de forma que cada funcionrio tenha uma ID exclusiva e especifique a ID do seu gerente.

Definio da classe ApplicationError


A classe ApplicationError serve de classe base para as classes FatalError e WarningError. A classe ApplicationError estende a classe Error e define seus prprios mtodos e propriedades personalizados, incluindo a definio de ID e gravidade de um erro, e um objeto XML que contm os cdigos e as mensagens de erro personalizados. Essa classe tambm define duas constantes estticas que so usadas para definir a gravidade de cada tipo de erro. O mtodo do construtor da classe ApplicationError o seguinte:
public function ApplicationError() { messages = <errors> <error code="9000"> <![CDATA[Employee must be assigned to a cost center.]]> </error> <error code="9001"> <![CDATA[Employee must be assigned to only one cost center.]]> </error> <error code="9002"> <![CDATA[Employee must have one and only one SSN.]]> </error> <error code="9999"> <![CDATA[The application has been stopped.]]> </error> </errors>; }

Cada n de erro no objeto XML contm um cdigo numrico exclusivo e uma mensagem de erro. As mensagens de erro podem ser facilmente pesquisadas pelo seu cdigo de erro usando o E4X, como mostra o seguinte mtodo getMessageText():
public function getMessageText(id:int):String { var message:XMLList = messages.error.(@code == id); return message[0].text(); }

O mtodo getMessageText() usa um nico argumento inteiro, id, e retorna uma seqncia de caracteres. O argumento id o cdigo de erro para o erro a ser pesquisado. Por exemplo, transmitir um id de 9001 recupera o erro dizendo que os funcionrios devem ser atribudos apenas a um centro de custos. Se houver mais de um erro com o mesmo cdigo, o ActionScript retornar a mensagem de erro apenas para o primeiro resultado encontrado (message[0] no objeto XMLList retornado). O mtodo seguinte nessa classe, getTitle(), no usa nenhum parmetro e retorna um valor de seqncia de caracteres que contm a ID de erro para esse erro especfico. Esse valor usado para ajudar a identificar com facilidade o erro exato que ocorreu durante a validao do pacote XML. O seguinte trecho mostra o mtodo getTitle():
public function getTitle():String { return "Error #" + id; }

PROGRAMAO DO ACTIONSCRIPT 3.0 208


Manipulao de erros

O mtodo final na classe ApplicationError toString(). Esse mtodo substitui a funo definida na classe Error para que voc possa personalizar a apresentao da mensagem de erro. O mtodo retorna uma seqncia de caracteres que identifica o nmero do erro especfico e a mensagem que ocorreu.
public override function toString():String { return "[APPLICATION ERROR #" + id + "] " + message; }

Definio da classe FatalError


A classe FatalError estende a classe ApplicationError personalizada e define trs mtodos: o construtor FatalError, getTitle() e toString(). O primeiro mtodo, o construtor FatalError, usa um nico argumento inteiro, errorID, define a gravidade do erro usando os valores constantes estticos definidos na classe ApplicationError e obtm a mensagem de erro especfica, chamando o mtodo getMessageText() na classe ApplicationError. O construtor FatalError o seguinte:
public function FatalError(errorID:int) { id = errorID; severity = ApplicationError.FATAL; message = getMessageText(errorID); }

O mtodo seguinte na classe FatalError, getTitle(), substitui o mtodo getTitle() definido anteriormente na classe ApplicationError e anexa o texto "-- FATAL" no ttulo para informar ao usurio que um erro fatal ocorreu. O mtodo getTitle() o seguinte:
public override function getTitle():String { return "Error #" + id + " -- FATAL"; }

O mtodo final nessa classe, toString(), substitui o mtodo toString() definido na classe ApplicationError. O mtodo toString() :
public override function toString():String { return "[FATAL ERROR #" + id + "] " + message; }

Definio da classe WarningError


A classe WarningError estende a classe ApplicationError e quase idntica classe FatalError, exceto por duas pequenas alteraes de seqncia de caracteres e por definir a gravidade do erro como ApplicationError.WARNING, em vez de ApplicationError.FATAL, como mostra o seguinte cdigo:
public function WarningError(errorID:int) { id = errorID; severity = ApplicationError.WARNING; message = super.getMessageText(errorID); }

209

Captulo 10: Uso de expresses regulares


Uma expresso regular descreve um padro que utilizado para localizar e manipular texto correspondente em strings. As expresses regulares parecem ser strings, mas elas podem incluir cdigos especiais para descrever padres e repetio. Por exemplo, a expresso regular a seguir corresponde a uma string que comea com o caractere A seguido por um ou mais dgitos seqenciais.
/A\d+/

Este captulo descreve a sintaxe bsica para construir expresses regulares. Entretanto, as expresses regulares podem ter muita complexidade e nuances. Voc pode encontrar informaes detalhadas sobre expresses regulares na Web e nas livrarias. Lembre-se de que diferentes ambientes de programao implementam expresses regulares de modos diferentes. O ActionScript 3.0 implementa expresses regulares como definido na especificao de idioma do ECMAScript Edio 3 (ECMA-262).

Noes bsicas de expresses regulares:


Introduo ao uso de expresses regulares
Uma expresso regular descreve um padro de caracteres. As expresses regulares so normalmente usadas para verificar se um valor de texto est em conformidade com um determinado padro (como a verificao para saber se o nmero de telefone digitado pelo usurio tem o nmero de dgitos adequado) ou para substituir partes de um valor de texto que corresponde a um determinado padro. As expresses regulares podem ser simples. Por exemplo, suponha que voc queira confirmar se uma determinada string corresponde a "ABC" ou substituir cada ocorrncia de "ABC" em uma string por algum outro texto. Nesse caso, voc pode usar a seguinte expresso regular, que define o padro composto pelas letras A, B e C em seqncia:
/ABC/

Observe que o literal de uma expresso regular delineado com o caractere de barra (/). Os padres de expresses regulares tambm podem ser complexos e, s vezes, crptico na aparncia, como a expresso a seguir, para corresponder a uma endereo de email vlido:
/([0-9a-zA-Z]+[-._+&])*[0-9a-zA-Z]+@([-0-9a-zA-Z]+[.])+[a-zA-Z]{2,6}/

Com mais freqncia, voc utilizar expresses regulares para pesquisar padres em strings e substituir caracteres. Nesses casos, voc criar um objeto de expresso regular e o usar como um parmetro para um dos vrios mtodos da classe String. Os seguintes mtodos da classe String usam as expresses regulares como parmetros: match(), replace(), search() esplit(). Para obter mais informaes sobre esses mtodos, consulte Localizao de padres em strings e substituio de substrings na pgina 149. A classe RegExp inclui as seguintes opes: test() e exec(). Para obter mais informaes, consulte Mtodos para usar expresses regulares com strings na pgina 224.

PROGRAMAO DO ACTIONSCRIPT 3.0 210


Uso de expresses regulares

Tarefas comuns de expresses regulares


H vrios usos comuns para as expresses regulares, descritos em detalhes neste captulo:

Criao de uma expresso regular padro Uso de caracteres especiais nos padres Identificao das seqncias de vrios caracteres (como "um nmero de dois dgitos" ou "entre sete e dez letras") Identificao de qualquer caractere em um intervalo de letras ou nmeros (como qualquer letra de a a m ) Identificao de um caractere em um conjunto de possveis caracteres Identificao de subseqncias (segmentos dentro de um padro) Correspondncia e substituio de texto com base em padres

Conceitos e termos importantes


A lista de referncia a seguir contm termos importantes usados neste captulo:

Caractere Escape: indica que o caractere seguinte deve ser tratado como um metacaractere em vez de um caractere
literal. Na sintaxe de expresses regulares, o caractere de barra invertida (\) o caractere escape; portanto uma barra invertida seguida por outro caractere um cdigo especial e no apenas o prprio caractere.

Sinalizador: especifica algumas opes sobre como o padro de expresso regular deve ser utilizado, como
distinguir entre caracteres maisculos e minsculos.

Metacaractere: um caractere que tem um significado especial em um padro de expresso regular, em oposio
representao literal do caractere no padro.

Quantificador: um caractere (ou vrios) indicando quantas vezes uma parte do padro deve se repetir. Por exemplo,
um quantificador utilizado para designar que o cdigo postal dos Estados Unidos deve conter cinco ou nove nmeros.

Expresso regular: Uma instruo do programa que define um padro de caracteres que podem ser usados para
confirmar se outras strings correspondem quele padro ou substituir partes de uma string.

Teste dos exemplos do captulo


Talvez voc queira testar algumas das listagens de cdigo de exemplo por si prprio, durante a leitura deste captulo. Como as listagens de cdigo neste captulo consistem principalmente de padres de expresses regulares, o teste dos exemplos envolve algumas etapas:
1 Crie um novo documento Flash. 2 Selecione um quadro-chave e abra o painel Aes 3 Crie uma varivel RegExp (expresso regular) como esta:
var pattern:RegExp = /ABC/;

4 Copie o padro do exemplo e atribua-o como o valor da varivel RegExp. Por exemplo, na linha de cdigo anterior,

o padro a parte do cdigo direita do sinal de igual, sem incluir o ponto-e-vrgula (/ABC/).
5 Crie uma ou mais variveis String contendo strings apropriadas para testar sua expresso regular. Por exemplo, se

voc estiver criando uma expresso regular para testar endereos de email vlidos, crie algumas variveis String contendo endereos de email vlidos e incorretos.
var goodEmail:String = "bob@example.com"; var badEmail:String = "5@$2.99";

PROGRAMAO DO ACTIONSCRIPT 3.0 211


Uso de expresses regulares

6 Adicione linhas de cdigo para testar as variveis String para determinar se elas correspondem ao padro da

expresso regular. Esses sero os valores que sero exibidos na tela utilizando a funo trace() ou sero gravados em um campo de texto no Palco.
trace(goodEmail, " is valid:", pattern.test(goodEmail)); trace(badEmail, " is valid:", pattern.test(badEmail));

Por exemplo, considerando que pattern define o padro da expresso regular para um endereo de email vlido, as linhas de cdigo anteriores gravam esse texto no painel Sada:
bob@example.com is valid: true 5@$2.99 is valid: false

Para obter mais informaes sobre valores de teste, gravando os valores em uma ocorrncia de campo de texto no Palco ou utilizando a funo trace() para imprimir valores no painel Sada, consulte Teste de listagens de cdigo de exemplo dos captulos na pgina 36.

Sintaxe da expresso regular


Esta seo descreve todos os elementos da sintaxe de expresso regular do ActionScript. Como voc ver, as expresses regulares podem ter muita complexidade e nuances. Voc pode encontrar informaes detalhadas sobre expresses regulares na Web e nas livrarias. Lembre-se de que diferentes ambientes de programao implementam expresses regulares de modos diferentes. O ActionScript 3.0 implementa expresses regulares como definido na especificao de idioma do ECMAScript Edio 3 (ECMA-262). Normalmente, voc usa expresses regulares que correspondem a padres mais complicados do que uma string de caracteres simples. Por exemplo, a seguinte expresso regular define o padro composto pelas letras A, B e C em seqncia seguida por qualquer dgito:
/ABC\d/

O cdigo \d representa qualquer dgito. O caractere de barra invertida (\) chamado de caractere escape e combinado ao caractere que o segue (nesse caso a letra d), tendo um significado especial na expresso regular. Este captulo descreve essas seqncias de caracteres escape e outros recursos de sintaxe de expresses regulares. A expresso regular a seguir define o padro das letras ABC seguido por qualquer nmero de dgitos (observe o asterisco):
/ABC\d*/

O caractere asterisco (*) um metacaractere. Um metacaractere um caractere que tem significado especial nas expresses regulares. O asterisco um tipo especfico de metacaractere chamado de quantificador que usado para quantificar o nmero de repetio de um caractere ou de um grupo de caracteres. Para obter mais informaes, consulte Quantificadores na pgina 216. Alm desse padro, uma expresso regular pode conter sinalizadores, que especificam como ela deve ser correspondida. Por exemplo, a seguinte expresso regular usa o sinalizador i, que especifica que a expresso regular no diferencia maisculas de minsculas na correspondncia de strings:
/ABC\d*/i

Para obter mais informaes, consulte Sinalizadores e propriedades na pgina 221. Voc pode usar expresses regulares com os seguintes mtodos da classe String: match(), replace() esearch(). Para obter mais informaes sobre esses mtodos, consulte Localizao de padres em strings e substituio de substrings na pgina 149.

PROGRAMAO DO ACTIONSCRIPT 3.0 212


Uso de expresses regulares

Criao de uma ocorrncia de uma expresso regular


H duas maneiras de criar uma ocorrncia de expresso regular: Um modo usa caracteres de barra (/) para delinear a expresso regular; o outro usa o construtor new. Por exemplo, as expresses regulares a seguir so equivalentes:
var pattern1:RegExp = /bob/i; var pattern2:RegExp = new RegExp("bob", "i");

As barras delineiam um literal da expresso regular da mesma forma que as aspas delineiam um literal de string. A parte da expresso regular entre as barras define o padro. A expresso regular tambm pode incluir sinalizadores depois da barra delineadora final. Esses sinalizadores so considerados como parte da expresso regular, mas so separados do padro. Ao usar o construtor new, voc usa duas strings para definir a expresso regular. A primeira string define o padro e a segunda string define os sinalizadores como no exemplo a seguir:
var pattern2:RegExp = new RegExp("bob", "i");

Ao incluir uma barra em uma expresso regular que definida utilizando os delineadores de barra, voc deve preceder a barra com um caractere escape de barra invertida (\). Por exemplo, as expresses regulares a seguir correspondem ao padro 1/2:
var pattern:RegExp = /1\/2/;

Para incluir aspas em uma expresso regular que definida com o construtor new, voc deve adicionar uma caractere escape de barra invertida (\) antes das aspas (assim como faria ao definir qualquer literal String). Por exemplo, as expresses regulares a seguir correspondem ao padro eat at "joe's":
var pattern1:RegExp = new RegExp("eat at \"joe's\"", ""); var pattern2:RegExp = new RegExp('eat at "joe\'s"', "");

No use o caractere escape de barra invertida com aspas em expresses regulares que so definidas utilizando os delineadores de barra. Da mesma forma, no use o caractere escape com barras em expresses regulares que so definidas utilizando o construtor new. As expresses regulares a seguir so equivalentes e definem o padro 1/2 "joe's":
var pattern1:RegExp = /1\/2 "joe's"/; var pattern2:RegExp = new RegExp("1/2 \"joe's\"", ""); var pattern3:RegExp = new RegExp('1/2 "joe\'s"', '');

Em uma expresso regular definida com o construtor new, para usar uma metaseqncia que comece com o caractere de barra invertida (\) , como \d (que corresponde a qualquer dgito), digite duas vezes esse caractere de barra invertida:
var pattern:RegExp = new RegExp("\\d+", ""); // matches one or more digits

necessrio digitar o caractere de barra invertida duas vezes nesse caso, pois o primeiro parmetro do mtodo do construtor RegExp() uma string, e, em um literal de string, necessrio digitar um caractere de barra invertida duas vezes para que ele seja reconhecido como um nico caractere de barra invertida. As sees a seguir descrevem a sintaxe para definir os padres de expresses regulares. Para obter mais informaes sobre sinalizadores, consulte Sinalizadores e propriedades na pgina 221.

Caracteres, metacaracteres e metaseqncias


A expresso regular mais simples aquela que corresponde a uma seqncia de caracteres, como no exemplo a seguir:
var pattern:RegExp = /hello/;

Entretanto, os seguintes caracteres, conhecidos como metacaracteres , tm significado especial nas expresses regulares:

PROGRAMAO DO ACTIONSCRIPT 3.0 213


Uso de expresses regulares

^ $ \ . * + ? ( ) [ ] { } |

Por exemplo, a expresso regular a seguir corresponde letra A seguida por nenhuma ou mais ocorrncias da letra B (o metacaractere asterisco indica essa repetio), seguida pela letra C:
/AB*C/

Para incluir um metacaractere sem seu significado especial em um padro de expresso regular, voc deve usar o caractere escape de barra invertida (\). Por exemplo, a seguinte expresso regular corresponde letra A seguida pela letra B, seguida por um asterisco e pela letra C:
var pattern:RegExp = /AB\*C/;

Uma metaseqncia, como um metacaractere, tem um significado especial em uma expresso regular. Uma metaseqncia composta por mais de um caractere. As sees a seguir fornecem detalhes sobre o uso de metacaracteres e metaseqncias. Sobre metacaracteres A tabela a seguir resume os metacaracteres que voc pode usar em expresses regulares:
Metacaractere
^ (circunflexo)

Descrio Correspondente ao incio da string. Com o sinalizador m (multiline) definido, o circunflexo tambm corresponde ao incio de uma linha (consulte Sinalizadores e propriedades na pgina 221). Observe que, quando utilizado no incio de uma classe de caracteres, o circunflexo indica negao e no o incio de uma string. Para obter mais informaes, consulte Classes de caracteres na pgina 215. Correspondente ao fim da string. Com o conjunto de sinalizadores m (multilinha), $ tambm corresponde posio antes de um caractere de nova linha (\n). Para obter mais informaes, consulte Sinalizadores e propriedades na pgina 221. Elimina o significado do metacaractere especial dos caracteres especiais. Alm disso, use o caractere de barra invertida se voc quiser utilizar o caractere de barra em um literal de expresso regular, como em /1\/2/ (para corresponder ao caractere 1, seguido pelo caractere de barra e pelo caractere 2).

$(sinal de dlar)

(barra invertida) \

. (ponto)

Corresponde a qualquer caractere nico. Um ponto corresponde a um caractere de nova linha (\n) apenas se o sinalizador s (dotall) est definido. Para obter mais informaes, consulte Sinalizadores e propriedades na pgina 221.

* (estrela)

Corresponde ao item anterior repetido nenhuma ou vrias vezes. Para obter mais informaes, consulte Quantificadores na pgina 216.

+ (adio)

Corresponde ao item anterior repetido uma ou vrias vezes. Para obter mais informaes, consulte Quantificadores na pgina 216.

? (ponto de interrogao)

Corresponde ao item anterior repetido nenhuma ou uma vezes. Para obter mais informaes, consulte Quantificadores na pgina 216.

PROGRAMAO DO ACTIONSCRIPT 3.0 214


Uso de expresses regulares

Metacaractere
(e)

Descrio Define grupos dentro de uma expresso regular. Use os grupos para:

Confinar o escopo do alternador |: /(a|b|c)d/ Definir o escopo de um quantificador: /(walla.){1,2}/ Em referncias anteriores: Por exemplo, \1 na expresso regular a seguir corresponde quilo que correspondeu ao primeiro grupo entre parnteses do padro:
/(\w*) repetido: \1/

Para obter mais informaes, consulte Grupos na pgina 218.


[e]

Define uma classe de caracteres que define possveis correspondncias para um nico caractere:
/[aeiou]/ corresponde a qualquer um dos caracteres especificados.

Nas classes de caracteres, use o hfen (-) para designar um intervalo de caracteres:
/[A-Z0-9]/ corresponde s letras maisculas de A a Z ou de 0 a 9.

Nas classes de caracteres, insira uma barra invertida para eliminar os caracteres ] e -:
/[+\-]\d+/ corresponde a + ou- antes de um ou mais dgitos.

Nas classes de caracteres, outros caracteres - normalmente metacaracteres -, no tratados como caracteres normais (e no metacaracteres), sem a necessidade de usar uma barra invertida:
/[$]/ corresponde a $ou .

Para obter mais informaes, consulte Classes de caracteres na pgina 215.


| (pipe)

Utilizado para alternao, para corresponder parte do lado esquerdo ou do lado direito:
/abc|xyz/ corresponde a abc ouxyz.

Sobre metaseqncias As metaseqncias so seqncias de caracteres que tm significado especial em um padro de expresso regular. A tabela a seguir descreve essas metaseqncias:
Metaseqncia
{n} {n,}

Descrio Especifica um quantificador numrico ou intervalo de quantificador para o item anterior:


/A{27}/ corresponde ao caractereA repetido 27 vezes. /A{3,}/ corresponde ao caractereA repetido 3 vezes. /A{3,5}/ corresponde ao caractere A repetido de 3 a 5 vezes.

e
{n,n}

Para obter mais informaes, consulte Quantificadores na pgina 216.


\b

Corresponde posio entre um caractere de palavra e um diferente de palavra. Se o primeiro ou o ltimo caractere na string for um caractere de palavra, ele tambm corresponder ao incio ou ao fim da string. Corresponde posio entre dois caracteres de palavra. Tambm corresponde posio entre dois caracteres diferentes de palavra. Corresponde a um dgito decimal. Corresponde a qualquer caractere diferente de dgito. Corresponde ao caractere feed de formulrio. Corresponde ao caractere de nova linha.

\B

\d \D \f \n

PROGRAMAO DO ACTIONSCRIPT 3.0 215


Uso de expresses regulares

Metaseqncia
\r \s

Descrio Corresponde ao caractere de retorno. Corresponde a qualquer caractere de espao em branco (um caractere de espao, tabulao, nova linha ou retorno). Corresponde a qualquer caractere diferente de um caractere de espao em branco. Corresponde ao caractere de tabulao. Corresponde ao caractere Unicode com o cdigo de caractere especificado pelo nmero hexadecimal nn. Por exemplo, \u263a um caractere smiley. Corresponde ao caractere feed vertical. Corresponde a um caractere de palavra (AZ, az, 0-9 ou_). Observe que \w no corresponde a caracteres diferentes de ingls, como , ou . Corresponde a qualquer caractere diferente de um caractere de palavra. Corresponde ao caractere com o valor ASCII especificado, como definido pelo nmero hexadecimal nn.

\S \t \unnnn

\v \w

\W \\xnn

Classes de caracteres
Voc usa as classes de caracteres para especificar uma lista de caracteres que correspondem a uma posio na expresso regular. Voc define as classes de caracteres com colchetes ( [ e ] ). Por exemplo, a expresso regular a seguir define uma classe de caracteres que corresponde a bag, beg, big, bog oubug:
/b[aeiou]g/

Seqncias de eliminao nas classes de caracteres A maioria dos metacaracteres e das metaseqncias que normalmente tem significados especiais em uma expresso regularno tem esses mesmos significados em uma classe de caractere. Por exemplo, em uma expresso regular, o asterisco usado para repetio, mas esse no o caso quando o asterisco aparece em uma classe de caracteres. A classe de caracteres a seguir corresponde ao asterisco literalmente, junto com qualquer outro caractere listado:
/[abc*123]/

Entretanto, os trs caracteres listados na tabela a seguir funcionam como metacaracteres, com significado especial, nas classes de caracteres:
Metacaractere
] -

Significado nas classes de caracteres Define o final de uma classe de caracteres. Define um intervalo de caracteres (consulte a prxima seo, Intervalos de caracteres nas classes de caracteres). Define metaseqncias e elimina o significao especial dos metacaracteres.

Para que qualquer um desses caracteres seja reconhecido como caracteres literais (sem o significado do metacaractere especial), voc deve preced-lo com o caractere escape de barra invertida. Por exemplo, a expresso regular a seguir inclui uma classe de caracteres que corresponde a qualquer um dos quatro smbolos ($, \, ] ou-):
/[$\\\]\-]/

Alm dos metacaracteres que mantm seu significado especial, as metaseqncias a seguir funcionam como metaseqncias nas classes de caracteres:

PROGRAMAO DO ACTIONSCRIPT 3.0 216


Uso de expresses regulares

Metaseqncia
\n \r \t \unnnn

Significado nas classes de caracteres Corresponde a um caractere de nova linha. Corresponde a um caractere de retorno. Corresponde a um caractere de tabulao. Corresponde ao caractere com o valor do ponto de cdigo Unicode especificado (como definido pelo nmero hexadecimal nnnn). Corresponde ao caractere com o valor ASCII especificado (como definido pelo nmero hexadecimal nn).

\\xnn

Outros metacaracteres e metaseqncias de expresses regulares so tratados como caracteres normais em uma classe de caracteres. Intervalos de caracteres nas classes de caracteres Use o hfen para especificar um intervalo de caracteres, como A-Z, a-z ou0-9. Esses caracteres devem constituir um intervalo vlido no conjunto de caracteres. Por exemplo, a classe de caracteres a seguir corresponde a qualquer um dos caracteres no intervalo de a-z ou qualquer dgito:
/[a-z0-9]/

Voc tambm pode usar o cdigo de caractere ASCII \\xnn para especificar um intervalo por valor ASCII. Por exemplo, a classe de caracteres a seguir corresponde a qualquer caractere de um conjunto de caracteres ASCII estendido (como e ):
\\x

Classes de caracteres negadas Quando voc usa um caractere circunflexo (^) no incio de uma classe de caracteres, ele nega aquela classe qualquer caractere no listado considerado uma correspondncia. A classe de caracteres a seguir corresponde a qualquer caractere exceto a uma letra minscula (az) ou um dgito:
/[^a-z0-9]/

Voc deve digitar o caractere circunflexo (^) no incio de uma classe de caracteres para indicar a negao. Caso contrrio, voc estar simplesmente adicionando o caractere circunflexo aos caracteres na classe de caracteres. Por exemplo, a classe de caracteres a seguir corresponde a qualquer um dos caracteres de smbolo, incluindo o circunflexo:
/[!.,#+*%$&^]/

Quantificadores
Voc usa quantificadores para especificar repeties de caracteres ou seqncias nos padres, como se segue:
Metacaractere de quantificador
* (estrela)

Descrio

Corresponde ao item anterior repetido nenhuma ou vrias vezes.

PROGRAMAO DO ACTIONSCRIPT 3.0 217


Uso de expresses regulares

Metacaractere de quantificador
+ (adio) ? (ponto de interrogao) {n} {n,}

Descrio

Corresponde ao item anterior repetido uma ou vrias vezes. Corresponde ao item anterior repetido nenhuma ou uma vezes. Especifica um quantificador numrico ou intervalo de quantificador para o item anterior:
/A{27}/ corresponde ao caractere A repetido 27 vezes. /A{3,}/ corresponde ao caractere A repetido 3 ou mais vezes. /A{3,5}/ corresponde ao caractere A repetido de 3 a 5 vezes.

e
{n,n}

Voc pode aplicar um quantificador a um nico caractere, a uma classe de caracteres ou a um grupo:

/a+/ corresponde ao caracterea repetido uma ou mais vezes. /\d+/ corresponde a um ou mais dgitos. /[abc]+/ corresponde a uma repetio de um ou mais caracteres, cada um a, b ouc. /(very, )*/ corresponde palavravery seguida por uma vrgula e um espao repetido nenhuma ou vrias vezes.

Voc pode usar quantificadores em grupos entre parnteses que tm quantificadores aplicados a eles. Por exemplo, o quantificador a seguir corresponde a strings como word e word-word-word:
/\w+(-\w+)*/

Por padro, as expresses regulares executam o que conhecido como correspondncia greedy. Qualquer subpadro na expresso regular (como .*) tenta corresponder o mximo possvel de caracteres na string antes de avanar para a prxima parte da expresso regular. Por exemplo, considere a seguinte expresso regular e string:
var pattern:RegExp = /<p>.*<\/p>/; str:String = "<p>Paragraph 1</p> <p>Paragraph 2</p>";

A expresso regular corresponde string inteira:


<p>Paragraph 1</p> <p>Paragraph 2</p>

Considere, entretanto, que voc deseja corresponder apenas um grupo <p>...</p>. possvel fazer isso da seguinte forma:
<p>Paragraph 1</p>

Adicione um ponto de interrogao (?) depois de qualquer quantificador para alter-lo para o que conhecido como quantificador lazy. Por exemplo, a seguinte expresso regular, que usa o quantificador lazy *? , corresponde a <p> seguido pelo nmero mnimo de caracteres possveis (lazy) e por </p>:
/<p>.*?<\/p>/

Lembre os seguintes pontos sobre quantificadores:

Os quantificadores {0} e {0,0} no excluem um item de uma correspondncia. No combine vrios quantificadores, como em /abc+*/. O ponto (.) no estende linhas a menos que o sinalizador s (dotall) esteja definido, mesmo se for seguido por um
quantificador *. Por exemplo, considere o seguinte cdigo:

PROGRAMAO DO ACTIONSCRIPT 3.0 218


Uso de expresses regulares

var str:String = "<p>Test\n"; str += "Multiline</p>"; var re:RegExp = /<p>.*<\/p>/; trace(str.match(re)); // null; re = /<p>.*<\/p>/s; trace(str.match(re)); // output: <p>Test //

Multiline</p>

Para obter mais informaes, consulte Sinalizadores e propriedades na pgina 221.

Alternao
Use o caractere | (pipe) em uma expresso regular para que o mecanismo de expresses regulares considere as alternativas para uma correspondncia. Por exemplo, as expresses regulares a seguir correspondem a qualquer uma das palavras cat, dog, pig, rat:
var pattern:RegExp = /cat|dog|pig|rat/;

Voc pode usar parnteses para definir grupos a fim de restringir o escopo do alternador |. A expresso regular a seguir corresponde a cat seguido por nap ounip:
var pattern:RegExp = /cat(nap|nip)/;

Para obter mais informaes, consulte Grupos na pgina 218. As duas expresses regulares a seguir, uma usando o alternador | e a outra usando uma classe de caracteres (definida com [ e ] ), so equivalentes:
/1|3|5|7|9/ /[13579]/

Para obter mais informaes, consulte Classes de caracteres na pgina 215.

Grupos
Voc pode especificar um grupo em uma expresso regular utilizando parnteses, como se segue:
/class-(\d*)/

Um grupo uma subseo de um padro. Voc pode usar grupos para fazer as seguintes atividades:

Aplicar um quantificador a mais de um caractere. Delinear subpadres a serem aplicados com alternao (utilizando o caractere |). Capturar correspondncias de substring (por exemplo, utilizando \1 em uma expresso regular para corresponder
um grupo com correspondncia anterior ou utilizando $1 de modo semelhante no mtodo replace() da classe String). As sees a seguir fornecem detalhes sobre o uso de grupos. Uso de grupos com quantificadores Se voc no usar um grupo, um quantificador se aplicar ao caractere ou classe de caracteres que o precede, como mostrado a seguir:

PROGRAMAO DO ACTIONSCRIPT 3.0 219


Uso de expresses regulares

var pattern:RegExp = /ab*/ ; // matches the character a followed by // zero or more occurrences of the character b pattern = /a\d+/; // matches the character a followed by // one or more digits pattern = /a[123]{1,3}/; // matches the character a followed by // one to three occurrences of either 1, 2, or 3

Entretanto, voc pode usar um grupo para aplicar um quantificador a mais de um caractere ou classe de caracteres:
var pattern:RegExp = /(ab)*/; // matches zero or more occurrences of the character a // followed by the character b, such as ababab pattern = /(a\d)+/; // matches one or more occurrences of the character a followed by // a digit, such as a1a5a8a3 pattern = /(spam ){1,3}/; // matches 1 to 3 occurrences of the word spam followed by a space

Para obter mais informaes sobre quantificadores, consulte Quantificadores na pgina 216. Uso de grupos com o caractere alternador (|) Voc pode usar grupos para definir o grupo de caracteres aos quais deseja aplicar um caractere alternador (|), como se segue:
var pattern:RegExp = /cat|dog/; // matches cat or dog pattern = /ca(t|d)og/; // matches catog or cadog

Uso de grupos para capturar correspondncias de substrings Quando terminar de definir um grupo entre parnteses padro, poder se referir a ele posteriormente na expresso regular. Isso conhecido como referncia anterior, e essas classificaes de grupos so conhecidas como capturas de grupos. Por exemplo, na expresso regular a seguir, a seqncia \1 corresponde a qualquer substring que correspondeu captura do grupo entre parnteses:
var pattern:RegExp = /(\d+)-by-\1/; // matches the following: 48-by-48

Voc pode especificar at 99 dessas referncias anteriores em uma expresso regular digitando \1, \2, ... , \99. De modo semelhante, no mtodo replace() da classe String, voc pode usar $1$99 para inserir correspondncia de substring de grupos capturados na string de substituio:
var pattern:RegExp = /Hi, (\w+)\./; var str:String = "Hi, Bob."; trace(str.replace(pattern, "$1, hello.")); // output: Bob, hello.

Alm disso, se voc usar a captura de grupo, o mtodo exec() da classe RegExp e o mtodo match() da classe String retornaro substrings que correspondem captura de grupos:

PROGRAMAO DO ACTIONSCRIPT 3.0 220


Uso de expresses regulares

var pattern:RegExp = /(\w+)@(\w+).(\w+)/; var str:String = "bob@example.com"; trace(pattern.exec(str)); // bob@example.com,bob,example,com

Uso de grupos de no captura e grupos lookahead Um grupo de no captura aquele que usado para agrupamento apenas; ele no "coletado" e no corresponde a referncias anteriores numeradas. Use (?: e ) para definir grupos de no captura, como se segue:
var pattern = /(?:com|org|net);

Por exemplo, observe a diferena entre colocar (com|org) em uma captura versus um grupo de no captura (o mtodo exec() lista os grupos de captura depois da concluso da correspondncia):
var pattern:RegExp = /(\w+)@(\w+).(com|org)/; var str:String = "bob@example.com"; trace(pattern.exec(str)); // bob@example.com,bob,example,com //noncapturing: var pattern:RegExp = /(\w+)@(\w+).(?:com|org)/; var str:String = "bob@example.com"; trace(pattern.exec(str)); // bob@example.com,bob,example

Um tipo especial de grupo de no captura o grupo lookahead, composto por dois tipos: o grupo lookahead positivo e o grupo lookahead negativo. Use (?= e ) para definir um grupo lookahead positivo, que especifica que o subpadro no grupo deve corresponder posio. Entretanto, a poro da string que corresponde ao grupo lookahead positivo pode corresponder aos padres restantes na expresso regular. Por exemplo, como (?=e) um grupo lookahead positivo no cdigo a seguir, o caractere e ao qual ele corresponde pode ser correspondido por uma parte subseqente da expresso regular nesse caso, o grupo de captura, \w*):
var pattern:RegExp = /sh(?=e)(\w*)/i; var str:String = "Shelly sells seashells by the seashore"; trace(pattern.exec(str)); // Shelly,elly

Use (?! e ) para definir um grupo lookahead negativo, que especifica que o subpadro no grupo no deve corresponder posio. Por exemplo:
var pattern:RegExp = /sh(?!e)(\w*)/i; var str:String = "She sells seashells by the seashore"; trace(pattern.exec(str)); // shore,ore

Uso de grupos nomeados Um grupo nomeado um tipo de grupo em uma expresso regular que tem um identificador nomeado. Use (?P<name> e ) para definir um grupo nomeado. Por exemplo, as expresses regulares a seguir incluem um grupo nomeado com os dgitos nomeados do identificador:
var pattern = /[a-z]+(?P<digits>\d+)[a-z]+/;

Quando voc use o mtodo exec(), uma correspondncia de grupo nomeado adicionada como uma propriedade da matriz result:

PROGRAMAO DO ACTIONSCRIPT 3.0 221


Uso de expresses regulares

var myPattern:RegExp = /([a-z]+)(?P<digits>\d+)[a-z]+/; var str:String = "a123bcd"; var result:Array = myPattern.exec(str); trace(result.digits); // 123

Aqui est outro exemplo, que usa dois grupos nomeados, com os identificadores name e dom:
var emailPattern:RegExp = /(?P<name>(\w|[_.\-])+)@(?P<dom>((\w|-)+))+\.\w{2,4}+/; var address:String = "bob@example.com"; var result:Array = emailPattern.exec(address); trace(result.name); // bob trace(result.dom); // example

Nota: Os grupos nomeados no fazem parte da especificao de linguagem ECMAScript. Eles so um recurso adicionado no ActionScript 3.0.

Sinalizadores e propriedades
A tabela a seguir lista os cinco sinalizadores que voc pode definir para expresses regulares: Cada sinalizador pode ser acessado como uma propriedade do objeto da expresso regular.
Sinalizador Propriedade
g i global ignoreCase

Descrio Corresponde a mais de uma correspondncia. Correspondncia que no faz distino entre maisculas e minsculas. Aplica-se aos caracteres AZ e az, mas no a caracteres estendidos como e . Com esse sinalizador definido, $ e ^ pode corresponder ao incio e ao fim de uma linha, respectivamente. Com esse sinalizador definido, . (ponto) pode corresponder ao caractere de nova linha (\n). Permite expresses regulares estendidas. Voc pode digitar espaos na expresso regular, que sero ignorados como parte do padro. Isso permite digitar cdigo de expresso regular de modo mais legvel.

multiline

s x

dotall extended

Observe que essas propriedade so somente leitura. Voc pode definir os sinalizadores (g, i, m, s, x) quando definir uma varivel de expresso regular, como se segue:
var re:RegExp = /abc/gimsx;

Entretanto, no possvel definir diretamente as propriedades nomeadas. Por exemplo, o cdigo a seguir resulta em um erro:
var re:RegExp = /abc/; re.global = true; // This generates an error.

Por padro, a menos que voc os especifique na declarao de expresso regular, os sinalizadores no sero definidos e as propriedades de correspondncia tambm so definidas como false. De modo adicional, h duas outras propriedades de uma expresso regular:

A propriedade lastIndex especifica a posio de ndice na string para a prxima chamada do mtodo exec() or
test() de uma expresso regular.

A propriedade source especifica a string que define a parte padro da expresso regular.

PROGRAMAO DO ACTIONSCRIPT 3.0 222


Uso de expresses regulares

O sinalizador g (global) Quando o sinalizador g (global) no includo, uma expresso regular tem no mais do que uma correspondncia. Por exemplo, com o sinalizador g no incluso na expresso regular, o mtodo String.match() retorna somente uma substring de correspondncia:
var str:String = "she sells seashells by the seashore."; var pattern:RegExp = /sh\w*/; trace(str.match(pattern)) // output: she

Quando o sinalizador g definido, o mtodo Sting.match() retorna vrias correspondncias, como se segue:
var str:String = "she sells seashells by the seashore."; var pattern:RegExp = /sh\w*/g; // The same pattern, but this time the g flag IS set. trace(str.match(pattern)); // output: she,shells,shore

O sinalizador i (ignoreCase) Por padro, as correspondncias de expresses regulares fazem distino entre maisculas e minsculas. Quando voc define o sinalizador i (ignoreCase), a distino entre maisculas e minsculas ignorada. Por exemplo, o s minsculo na expresso regular no corresponde ao S maisculo, o primeiro caractere da string:
var str:String = "She sells seashells by the seashore."; trace(str.search(/sh/)); // output: 13 -- Not the first character

Com o sinalizador i definido, entretanto, a expresso regular corresponde ao S maisculo:


var str:String = "She sells seashells by the seashore."; trace(str.search(/sh/i)); // output: 0

O sinalizador i ignora a distino entre maisculas e minsculas somente para os caracteres AZ e az, mas no para caracteres estendidos como e . O sinalizador m (multiline) Se o sinalizador m (multiline) no estiver definido, ^ corresponde ao incio da string e $ corresponde ao fim da string. Se o sinalizador m estiver definido, esses caracteres correspondero ao incio e ao fim de uma linha, respectivamente. Considere a seguinte string, que inclui um caractere de nova linha:
var str:String = "Test\n"; str += "Multiline"; trace(str.match(/^\w*/g)); // Match a word at the beginning of the string.

Mesmo que o sinalizador g (global) esteja definido na expresso regular, o mtodo match() corresponde a apenas uma substring, pois h apenas uma correspondncia para ^ o incio da string. A sada :
Test

Aqui est o mesmo cdigo com o sinalizador m definido:


var str:String = "Test\n"; str += "Multiline"; trace(str.match(/^\w*/gm)); // Match a word at the beginning of lines.

Neste momento, a sada inclui as palavras no incio das linhas:


Test,Multiline

Observe que apenas o caractere \n sinaliza o fim de uma linha. Os caracteres a seguir no:

Caractere de retorno (\r)

PROGRAMAO DO ACTIONSCRIPT 3.0 223


Uso de expresses regulares

Caractere Unicode separador de linha (\u2028) Caractere Unicode separador de pargrafo (\u2028)
O sinalizador s (dotall) Se o sinalizador s (dotall ou dot all) no estiver definido, um ponto (.) em um padro de expresso regular no corresponde a um caractere de nova linha (\n). Portanto para o exemplo a seguir, no h nenhuma correspondncia:
var str:String = "<p>Test\n"; str += "Multiline</p>"; var re:RegExp = /<p>.*?<\/p>/; trace(str.match(re));

Entretanto, se o sinalizador s estiver definido, o ponto corresponder ao caractere de nova linha:


var str:String = "<p>Test\n"; str += "Multiline</p>"; var re:RegExp = /<p>.*?<\/p>/s; trace(str.match(re));

Nesse caso, a correspondncia a substring inteira dentro das tags <p>, incluindo o caractere de nova linha:
<p>Test Multiline</p>

O sinalizador x (extended) As expresses regulares podem ser difceis de ler, especialmente quando incluem muitos metasmbolos e metaseqncias. Por exemplo:
/<p(>|(\s*[^>]*>)).*?<\/p>/gi

Quando voc usa o sinalizador x (extended) em uma expresso regular, qualquer espao em branco digitado no padro ser ignorado. Por exemplo, a expresso regular a seguir idntica ao exemplo anterior:
/ <p (> | (\s* [^>]* >)) .*? <\/p> /gix

Se o sinalizador x estiver definido e voc quiser uma correspondncia com o caractere de espao em branco, preceda o espao em branco com uma barra invertida. Por exemplo, as duas expresses regulares a seguir so equivalentes:
/foo bar/ /foo \ bar/x

A propriedade lastIndex A propriedade lastIndex especifica a posio de ndice na string no qual a prxima pesquisa ser iniciada. Essa propriedade afeta os mtodos exec() e test() chamados em uma expresso regular que tem o sinalizador g definido como true. Por exemplo, considere o seguinte cdigo:
var pattern:RegExp = /p\w*/gi; var str:String = "Pedro Piper picked a peck of pickled peppers."; trace(pattern.lastIndex); var result:Object = pattern.exec(str); while (result != null) { trace(pattern.lastIndex); result = pattern.exec(str); }

PROGRAMAO DO ACTIONSCRIPT 3.0 224


Uso de expresses regulares

A propriedade lastIndex definida como 0 por padro (para iniciar a pesquisa no incio da string). Depois de cada correspondncia, ela definida para a posio de ndice seguindo a correspondncia. Portanto, a sada para o cdigo precedente a seguinte:
0 5 11 18 25 36 44

Se o sinalizador global estiver definido como false, os mtodos exec() e test() no usam nem definem a propriedade lastIndex. Os mtodos match(), replace() e search() da classe String iniciam todas as pesquisas no incio da string, independentemente da configurao da propriedade lastIndex da expresso regular utilizada na chamada do mtodo. (Contudo, o mtodo match() define lastIndex como 0.) Voc pode definir a propriedade lastIndex para ajustar a posio inicial na string para a correspondncia da expresso regular. A propriedade source A propriedade source especifica a string que define a parte padro de uma expresso regular. Por exemplo:
var pattern:RegExp = /foo/gi; trace(pattern.source); // foo

Mtodos para usar expresses regulares com strings


A classe RegExp inclui dois mtodos: exec() etest(). Alm dos mtodos exec() e test() da classe RegExp, a classe String inclui os seguintes mtodos que permitem corresponder expresses regulares em strings: match(), replace(), search() esplice().

O mtodo test()
O mtodo test() da classe RegExp verifica simplesmente a string fornecida para ver se ela contm uma correspondncia para a expresso regular, como mostra o exemplo a seguir:
var pattern:RegExp = /Class-\w/; var str = "Class-A"; trace(pattern.test(str)); // output: true

O mtodo exec()
O mtodo exec() da classe RegExp verifica a string fornecida quanto a uma correspondncia da expresso regular e retorna uma matriz com o seguinte:

A substring de correspondncia Correspondncia de substring para qualquer grupo entre parnteses na expresso regular
A matriz tambm inclui uma propriedade index, indicando a posio de ndice do incio da correspondncia de substring.

PROGRAMAO DO ACTIONSCRIPT 3.0 225


Uso de expresses regulares

Por exemplo, considere o seguinte cdigo:


var pattern:RegExp = /\d{3}\-\d{3}-\d{4}/; //U.S phone number var str:String = "phone: 415-555-1212"; var result:Array = pattern.exec(str); trace(result.index, " - ", result); // 7-415-555-1212

Use o mtodo exec() vrias vezes para corresponder vrias substrings quando o sinalizador g (global) est definido para uma expresso regular:
var pattern:RegExp = /\w*sh\w*/gi; var str:String = "She sells seashells by the seashore"; var result:Array = pattern.exec(str); while (result != null) { trace(result.index, "\t", pattern.lastIndex, "\t", result); result = pattern.exec(str); } //output: // 0 3 She // 10 19 seashells // 27 35 seashore

Mtodos String que usam parmetros RegExp


Os seguintes mtodos da classe String usam as expresses regulares como parmetros: match(), replace(), search() esplit(). Para obter mais informaes sobre esses mtodos, consulte Localizao de padres em strings e substituio de substrings na pgina 149.

Exemplo: Um analisador Wiki


Esse exemplo simples de converso de texto Wiki ilustra vrios usos para expresses regulares:

Converso de linhas de texto que correspondem o padro Wiki de origem s strings de sada HTML apropriadas. Uso de uma expresso regular para converter padres de URL para tags de hiperlinks HTML <a>. Uso de uma expresso regular para converter strings com dlares norte-americanos (como "$9,95") em strings
com euros (como "8,24 "). Para obter os arquivos de aplicativo deste exemplo, consulte www.adobe.com/go/learn_programmingAS3samples_flash_br. Os arquivos de aplicativo WikiEditor podem ser encontrados na pasta Samples/WikiEditor. O aplicativo consiste nos seguintes arquivos:

PROGRAMAO DO ACTIONSCRIPT 3.0 226


Uso de expresses regulares

Arquivo WikiEditor.mxml ou WikiEditor.fla com/example/programmingas3/regExpExamples/WikiParser.as

Descrio O arquivo principal do aplicativo no Flash (FLA) ou no Flex (MXML).

Uma classe que inclui mtodos que usam expresses regulares para converter padres de texto de entrada Wiki em sada HTML equivalente. Uma classe que inclui mtodos que usam expresses regulares para converter strings URL para tags de hiperlinks HTML <a>. Uma classe que inclui mtodos que usam expresses regulares para converter strings de dlar americano em strings de euro.

com/example/programmingas3/regExpExamples/URLParser.as

com/example/programmingas3/regExpExamples/CurrencyConverter.as

Definio da classe WikiParser


A classe WikiParser inclui mtodos que convertem texto de entrada Wiki em sada HTML equivalente. Esse no um aplicativo de converso Wiki muito robusto, mas ele ilustra alguns bons usos de expresses regulares para correspondncia de padro e converso de strings. A funo de construtor, junto com o mtodo setWikiData(), simplesmente inicializa uma string de amostra do texto de entrada Wiki, como se segue:
public function WikiParser() { wikiData = setWikiData(); }

Quando o usurio clica no boto Testar no aplicativo de amostra, o aplicativo chama o mtodo parseWikiString() do objeto WikiParser. Esse mtodo chama vrios outros mtodos, que por sua vez montam a string HTML resultante.
public function parseWikiString(wikiString:String):String { var result:String = parseBold(wikiString); result = parseItalic(result); result = linesToParagraphs(result); result = parseBullets(result); return result; }

Cada um dos mtodos chamados parseBold(), parseItalic(), linesToParagraphs() e parseBullets() usa o mtodo replace() da string para substituir os padres de correspondncia, definidos por uma expresso regular, para transformar o texto de entrada Wiki em texto no formato HTML. Converso de padres negrito e itlico O mtodo parseBold() procura padro de texto negrito Wiki (como '''foo''') e o transforma em seu equivalente em HTML (como <b>foo</b>), como se segue:
private function parseBold(input:String):String { var pattern:RegExp = /'''(.*?)'''/g; return input.replace(pattern, "<b>$1</b>"); }

PROGRAMAO DO ACTIONSCRIPT 3.0 227


Uso de expresses regulares

Observe que a parte (.?*) de uma presso regular corresponde a vrios caracteres (*) entre os dois padres de definio'''. O quantificador ? torna a correspondncia no greedy, para que uma string como '''aaa''' bbb '''ccc''', a primeira string correspondida ser '''aaa''' e no a string inteira (que comea e termina com o padro '''). Os parnteses na expresso regular definem um grupo de captura, e o mtodo replace() se refere a esse grupo utilizando o cdigo $1 na string de substituio. O sinalizador g (global) na expresso regular garante que o mtodo replace() substitua todas as correspondncias na string (no simplesmente a primeira). O mtodo parseItalic() funciona de forma semelhante ao mtodo parseBold(), exceto pelo fato de ele verificar dois apstrofes ('') como o delimitador para texto itlico (no trs):
private function parseItalic(input:String):String { var pattern:RegExp = /''(.*?)''/g; return input.replace(pattern, "<i>$1</i>"); }

Converso de padres de bullet Como mostra o exemplo a seguir, o mtodo parseBullet() procura o padro de linha de bullet Wiki (como * foo) e o transforma em seu equivalente HTML (como <li>foo</li>):
private function parseBullets(input:String):String { var pattern:RegExp = /^\*(.*)/gm; return input.replace(pattern, "<li>$1</li>"); }

O smbolo ^ no incio de uma expresso regular corresponde ao incio de uma linha. O sinalizador m (multiline) na expresso regular faz com que essa expresso corresponda o smbolo ^ ao incio de uma linha, e no simplesmente ao incio da string. O padro \* corresponde a um caractere asterisco (a barra invertida usada para sinalizar um asterisco literal em vez de um quantificador *). Os parnteses na expresso regular definem um grupo de captura, e o mtodo replace() se refere a esse grupo utilizando o cdigo $1 na string de substituio. O sinalizador g (global) na expresso regular garante que o mtodo replace() substitua todas as correspondncias na string (no simplesmente a primeira). Converso de padres Wiki de pargrafos O mtodo linesToParagraphs() converte cada linha na string Wiki de entrada em uma tag de pargrafo HTML <p>. Essas linhas no mtodo retiram linhas vazias da string Wiki de entrada:
var pattern:RegExp = /^$/gm; var result:String = input.replace(pattern, "");

Os smbolos ^ e $ de uma expresso regular correspondem ao incio e ao fim de uma linha. O sinalizador m (multiline) na expresso regular faz com que essa expresso corresponda o smbolo ^ ao incio de uma linha, e no simplesmente ao incio da string. O mtodo replace() substitui todas as substrings correspondentes (linhas vazias) por uma string vazia (""). O sinalizador g (global) na expresso regular garante que o mtodo replace() substitua todas as correspondncias na string (no simplesmente a primeira).

PROGRAMAO DO ACTIONSCRIPT 3.0 228


Uso de expresses regulares

Converso de URLs para tags HTML <a>


Quando o usurio clica no boto Testar no aplicativo de amostra, se ele marcou a caixa de seleo urlToATag, o aplicativo chama o mtodo esttico URLParser.urlToATag() para converter as strings URL da string Wiki de entrada em tags HTML <a>.
var var var var var protocol:String = "((?:http|ftp)://)"; urlPart:String = "([a-z0-9_-]+\.[a-z0-9_-]+)"; optionalUrlPart:String = "(\.[a-z0-9_-]*)"; urlPattern:RegExp = new RegExp(protocol + urlPart + optionalUrlPart, "ig"); result:String = input.replace(urlPattern, "<a href='$1$2$3'><u>$1$2$3</u></a>");

A funo do construtor RegExp() usada para montar uma expresso regular (urlPattern) a partir de inmeras partes constituintes. Essas partes constituintes so cada string que define parte do padro da expresso regular. A primeira parte do padro da expresso regular, definida pela string protocol, define um protocolo de URL: http:// ou ftp://. Os parnteses definem um grupo de no captura, indicado pelo smbolo ?. Isso significa que os parnteses so usados simplesmente para definir um grupo para o padro de alternao |; o grupo no corresponder a cdigos de referncia anterior ($1, $2, $3) na string de substituio do mtodo replace(). As outras partes constituintes da expresso regular usam grupos de captura (indicado por parnteses no padro), que so usados nos cdigos de referncia anterior ($1, $2, $3) na string de substituio do mtodo replace(). A parte do padro definido pela string urlPart corresponde a pelo menos um destes caracteres: a-z, 0-9, _ ou-. O quantificador + indica que pelo menos um caractere tem correspondncia. \. indica um caractere de ponto (.) exigido. E o restante corresponde a outra string de pelo menos um destes caracteres: a-z, 0-9, _ ou-. A parte do padro definido pela string optionalUrlPart corresponde a nenhum ou mais destes caracteres: um ponto (.) seguido por qualquer nmero de caracteres alfanumricos (incluindo _ e -). O quantificador * indica que nenhum ou mais caracteres tm correspondncia. A chamada do mtodo replace() aplica a expresso regular e monta a string HTML de substituio, utilizando referncias anteriores. O mtodo urlToATag() chama o mtodo emailToATag(), que usa tcnicas semelhantes para substituir padres de email por string de hiperlinks HTML <a>. As expresses regulares utilizadas para corresponder HTTP, FTP e URLs de email nesse arquivo de amostra so muito simples, com o objetivo de exemplificao; h expresses regulares muito mais complicadas para correspondncia com esses URLs.

Converso de strings de dlar americano para strings de euro


Quando o usurio clica no boto Testar do aplicativo de exemplo, se ele marcou a caixa de seleo dollarToEuro, o aplicativo chama o mtodo esttico CurrencyConverter.usdToEuro() para converter as strings com dlares norteamericanos (como "$9,95") em strings com euros (como "8,24 "), da seguinte maneira:
var usdPrice:RegExp = /\$([\d,]+.\d+)+/g; return input.replace(usdPrice, usdStrToEuroStr);

A primeira linha define um padro simples para correspondncia de strings de dlar americano. Observe que o caractere $ precedido por um caractere escape de barra invertida (\). O mtodo replace() usa a expresso regular como o correspondente padro e chama a funo usdStrToEuroStr() para determinar a string de substituio (um valor em euros). Quando um nome de funo for utilizado como o parmetro secundrio do mtodo replace(), o seguinte ser transmitido como parmetros para a funo chamada:

A parte correspondente da string.

PROGRAMAO DO ACTIONSCRIPT 3.0 229


Uso de expresses regulares

Qualquer correspondncia de grupo em parnteses capturado. O nmero de argumentos transmitidos dessa


maneira ir variar dependendo do nmero de correspondncias de grupo entre parnteses capturado. possvel determinar o nmero de correspondncias de grupo entre parnteses capturado, verificando arguments.length -3 no cdigo da funo.

A posio de ndice na string em que a correspondncia comea. A string completa.


O mtodo usdStrToEuroStr() converte padres de string de dlar americano para string de euro, como se segue:
private function usdToEuro(...args):String { var usd:String = args[1]; usd = usd.replace(",", ""); var exchangeRate:Number = 0.828017; var euro:Number = Number(usd) * exchangeRate; trace(usd, Number(usd), euro); const euroSymbol:String = String.fromCharCode(8364); // return euro.toFixed(2) + " " + euroSymbol; }

Observe que args[1] representa o grupo entre parnteses capturado, correspondido pela expresso regular usdPrice. Essa uma parte numrica da string de dlar americano: isto , a quantidade de dlar sem o sinal $. O mtodo aplica uma converso de taxa de cmbio e retorna a string resultante (com o smbolo direita em vez do smbolo $ esquerda).

230

Captulo 11: Trabalho com XML


O ActionScript 3.0 inclui um grupo de classes com base na especificao ECMAScript para XML (E4X) (ECMA-357 edio 2). Essas classes incluem recursos avanados e fceis de usar para trabalhar com dados XML. Usando o E4X, voc poder desenvolver cdigos com dados XML mais rpido do que com as tcnicas de programao anteriores. Alm disso, o cdigo produzido ser mais fcil de ler. Este captulo descreve como usar o E4X para processar dados XML.

Noes bsicas sobre XML


Introduo ao trabalho com XML
XML uma maneira padro de representar informaes estruturadas com a qual os computadores devem trabalhar com facilidade e que deve ser relativamente fcil para as pessoas gravarem e entenderem. XML uma abreviao de eXtensible Markup Language (Linguagem de markup extensvel). O padro XML est disponvel em www.w3.org/XML/. O XML oferece um modo prtico e padro de classificar dados, facilitando a leitura, o acesso e a manipulao. O XML usa estruturas de rvore e de tag similares s do HTML. Veja um exemplo simples de dados XML:
<song> <title>What you know?</title> <artist>Steve and the flubberblubs</artist> <year>1989</year> <lastplayed>2006-10-17-08:31</lastplayed> </song>

Os dados XML tambm podem ser mais complexos, com tags aninhadas em outras tags, bem como em atributos e outros componentes estruturais. Veja um exemplo mais complexo de dados XML:

PROGRAMAO DO ACTIONSCRIPT 3.0 231


Trabalho com XML

<album> <title>Questions, unanswered</title> <artist>Steve and the flubberblubs</artist> <year>1989</year> <tracks> <song tracknumber="1" length="4:05"> <title>What do you know?</title> <artist>Steve and the flubberblubs</artist> <lastplayed>2006-10-17-08:31</lastplayed> </song> <song tracknumber="2" length="3:45"> <title>Who do you know?</title> <artist>Steve and the flubberblubs</artist> <lastplayed>2006-10-17-08:35</lastplayed> </song> <song tracknumber="3" length="5:14"> <title>When do you know?</title> <artist>Steve and the flubberblubs</artist> <lastplayed>2006-10-17-08:39</lastplayed> </song> <song tracknumber="4" length="4:19"> <title>Do you know?</title> <artist>Steve and the flubberblubs</artist> <lastplayed>2006-10-17-08:44</lastplayed> </song> </tracks> </album>

Observe que esse documento XML contm outras estruturas XML completas (como as tags song e seus filhos). Ele tambm demonstra outras estruturas XML como atributos (tracknumber e length nas tags song) e tags que contm outras tags em vez de dados (como a tag tracks). Como comear a usar o XML Se voc tiver pouca ou nenhuma experincia com XML, veja uma breve descrio dos aspectos mais comuns dos dados XML. Os dados XML so gravados em texto sem formatao, com uma sintaxe especfica para organizar as informaes em um formato estruturado. Em geral, um nico conjunto de dados XML conhecido como documento XML. No formato XML, os dados so organizados em elementos (que podem ser itens de dados nicos ou contineres de outros elementos) usando uma estrutura hierrquica. Cada documento XML tem um nico elemento como item de nvel superior ou principal; dentro desse elemento raiz, pode existir uma nica informao, embora provavelmente haja outros elementos que, por sua vez, contm outros elementos e assim por diante. Por exemplo, esse documento XML contm as informaes sobre um lbum de msica:
<song tracknumber="1" length="4:05"> <title>What do you know?</title> <artist>Steve and the flubberblubs</artist> <mood>Happy</mood> <lastplayed>2006-10-17-08:31</lastplayed> </song>

Cada elemento diferenciado por um conjunto de tags - o nome do elemento entre os sinais de menor do que e maior do que. A tag de abertura, que indica o incio do elemento, tem o nome do elemento:
<title>

A tag de fechamento, que marca o final do elemento, tem uma barra antes do nome do elemento:
</title>

PROGRAMAO DO ACTIONSCRIPT 3.0 232


Trabalho com XML

Se um elemento no tiver nenhum contedo, poder ser gravado como um elemento vazio (s vezes chamado de elemento de fechamento automtico). Em XML, esse elemento:
<lastplayed/>

idntico a este elemento:


<lastplayed></lastplayed>

Alm do contedo do elemento contido entre as tags de abertura e fechamento, um elemento tambm pode incluir outros valores, conhecidos como atributos, definidos na tag de abertura. Por exemplo, este elemento XML define um nico atributo chamado length, com o valor "4:19" :
<song length="4:19"></song>

Cada elemento XML tem contedo, que pode ser um nico valor, um ou mais elementos XML ou nada (para um elemento vazio). Mais informaes sobre XML Para saber mais sobre como trabalhar com XML, existem diversos outros livros e recursos, incluindo estes sites:

Tutorial W3Schools XML: http://w3schools.com/xml/ XML.com: http://www.xml.com/ Tutoriais da XMLpitstop, listas de discusso e muito mais: http://xmlpitstop.com/
Classes do ActionScript para trabalhar com XML O ActionScript 3.0 inclui vrias classes que so usadas para trabalhar com informaes estruturadas como XML. As duas classes principais so as seguintes:

XML: representa um nico elemento XML, que pode ser um documento XML com vrios filhos ou um elemento
com um nico valor em um documento.

XMLList: representa um conjunto de elementos XML. Um objeto XMLList usado quando existem vrios
elementos XML que so "irmos" (no mesmo nvel e contidos pelo mesmo pai na hierarquia de documento XML). Por exemplo, uma ocorrncia de XMLList seria o modo mais fcil de trabalhar com este conjunto de elementos XML (supostamente contidos em um documento XML):
<artist type="composer">Fred Wilson</artist> <artist type="conductor">James Schmidt</artist> <artist type="soloist">Susan Harriet Thurndon</artist>

Para usos mais avanados que envolvem espaos para nomes XML, o ActionScript tambm inclui as classes Namespace e QName. Para obter mais informaes, consulte Uso de espaos para nomes XML na pgina 245. Alm das classes internas para trabalhar com XML, o ActionScript 3.0 tambm inclui vrios operadores que fornecem recursos especficos para acessar e manipular dados XML. Essa abordagem de trabalhar com XML usando essas classes e operadores conhecida como ECMAScript para XML (E4X), conforme definido pela especificao ECMA-357 edio 2.

Tarefas comuns de XML


Ao trabalhar com XML no ActionScript, voc provavelmente realizar as seguintes tarefas:

Criao de documentos XML (adio de elementos e valores) Acesso a elementos, valores e atributos XML Filtragem (pesquisa) de elementos XML

PROGRAMAO DO ACTIONSCRIPT 3.0 233


Trabalho com XML

Consulta de um conjunto de elementos XML Converso de dados entre classes XML e a classe String Trabalho com espaos para nomes XML Carregamento de arquivos XML externos

Conceitos e termos importantes


A lista de referncia a seguir contm termos importantes usados neste captulo:

Elemento: um nico item em um documento XML, identificado como o contedo contido entre uma tag inicial e
uma tag final (incluindo as tags). Os elementos XML podem conter dados de texto ou outros elementos, ou podem ser vazios.

Elemento vazio: um elemento XML que no contm nenhum elemento filho. Os elementos vazios geralmente so
gravados como tags de fechamento (como <element/>).

Documento: uma nica estrutura XML. Um documento XML pode conter qualquer nmero de elementos (ou ser
constitudo por apenas um nico elemento vazio); no entanto, um documento XML deve ter um elemento de nvel superior que contm todos os outros elementos do documento.

N: outro nome para um elemento XML. Atributo: um valor nomeado associado a um elemento que est gravado na tag de abertura do elemento no formato
attributename="value", em vez de estar gravado como um elemento filho separado aninhado no elemento.

Teste dos exemplos do captulo


Talvez voc queira testar algumas das listagens de cdigo de exemplo por si prprio, durante a leitura deste captulo. Basicamente, todas as listagens de cdigo deste captulo j incluem a chamada da funo trace() adequada. Para testar as listagens de cdigo deste captulo:
1 Crie um documento do Flash vazio. 2 Selecione um quadro-chave na linha de tempo. 3 Abra o painel Aes e copie a listagem de cdigo no painel Script. 4 Execute o programa usando o comando Controlar > Testar filme.

Voc ver os resultados da funo trace() no painel Sada. Essa e outras tcnicas para testar as listagens de cdigo de exemplo esto descritas em mais detalhes em Teste de listagens de cdigo de exemplo dos captulos na pgina 36.

A abordagem E4X em relao ao processamento de XML


A especificao ECMAScript para XML define um conjunto de classes e recursos para trabalhar com dados XML. Em conjunto, essas classes e recursos so conhecidos como E4X. O ActionScript 3.0 inclui as seguintes classes E4X: XML, XMLList, QName e Namespace. Os mtodos, as propriedades e os operadores das classes E4X foram desenvolvidos com os seguintes objetivos:

Simplicidade - Sempre que possvel, o E4X facilita a gravao e a compreenso do cdigo para trabalhar com dados XML. Consistncia - Os mtodos e princpios por trs do E4X so consistentes internamente e com outras partes do
ActionScript.

PROGRAMAO DO ACTIONSCRIPT 3.0 234


Trabalho com XML

Familiaridade - Voc manipula os dados XML com operadores conhecidos, como o operador de ponto (.).
Nota: Havia uma classe XML no ActionScript 2.0. No ActionScript 3.0, ela foi renomeada como XMLDocument, de modo que no entra em conflito com a classe XML do ActionScript 3.0 que faz parte do E4X. No ActionScript 3.0, as classes herdadas (XMLDocument, XMLNode, XMLParser e XMLTag) so includas no pacote flash.xml principalmente para dar suporte a verses anteriores. As novas classes do E4X so classes bsicas; no necessrio importar um pacote para utiliz-las. Este captulo no descreve em detalhes as classes XML herdadas do ActionScript 2.0. Para obter informaes sobre elas, consulte o pacote flash.xml na Referncia de componentes e linguagem do ActionScript 3.0. Veja um exemplo de manipulao dos dados com E4X:
var myXML:XML = <order> <item id='1'> <menuName>burger</menuName> <price>3.95</price> </item> <item id='2'> <menuName>fries</menuName> <price>1.45</price> </item> </order>

Normalmente, seu aplicativo carregar dados XML a partir de uma fonte externa, como um servio da Web ou um feed RSS. No entanto, para simplificar, os exemplos deste captulo atribuem dados XML como literais. Como mostra o cdigo a seguir, o E4X inclui alguns operadores intuitivos, como os operadores de ponto (.) e de identificador de atributo (@), para acessar propriedades e atributos no XML:
trace(myXML.item[0].menuName); // Output: burger trace(myXML.item.(@id==2).menuName); // Output: fries trace(myXML.item.(menuName=="burger").price); // Output: 3.95

Use o mtodo appendChild() para atribuir um novo n filho ao XML, como mostra o snippet a seguir:
var newItem:XML = <item id="3"> <menuName>medium cola</menuName> <price>1.25</price> </item> myXML.appendChild(newItem);

Use os operadores @ e . no s para ler, mas tambm para atribuir dados do seguinte modo:
myXML.item[0].menuName="regular burger"; myXML.item[1].menuName="small fries"; myXML.item[2].menuName="medium cola"; myXML.item.(menuName=="regular burger").@quantity = "2"; myXML.item.(menuName=="small fries").@quantity = "2"; myXML.item.(menuName=="medium cola").@quantity = "2";

Use um loop for para percorrer os ns do XML do seguinte modo:

PROGRAMAO DO ACTIONSCRIPT 3.0 235


Trabalho com XML

var total:Number = 0; for each (var property:XML in myXML.item) { var q:int = Number(property.@quantity); var p:Number = Number(property.price); var itemTotal:Number = q * p; total += itemTotal; trace(q + " " + property.menuName + " $" + itemTotal.toFixed(2)) } trace("Total: $", total.toFixed(2));

Objetos XML
Um objeto XML pode representar um elemento, atributo, comentrios, instruo de processamento ou elemento de texto XML. Um objeto XML pode ter contedo simples ou contedo complexo. Um objeto XML que tem ns filho tem contedo complexo. Um objeto XML ter contedo simples se contiver um dos seguintes itens: um atributo, um comentrio, uma instruo de processamento ou um n de texto. Por exemplo, o objeto XML a seguir tem contedo complexo, incluindo um comentrio e uma instruo de processamento:
XML.ignoreComments = false; XML.ignoreProcessingInstructions = false; var x1:XML = <order> <!--This is a comment. --> <?PROC_INSTR sample ?> <item id='1'> <menuName>burger</menuName> <price>3.95</price> </item> <item id='2'> <menuName>fries</menuName> <price>1.45</price> </item> </order>

Como mostra o exemplo a seguir, agora voc pode usar os mtodos comments() e processingInstructions() para criar novos objetos XML, um comentrio e uma instruo de processamento:
var x2:XML = x1.comments()[0]; var x3:XML = x1.processingInstructions()[0];

propriedades XML
A classe XML tem cinco propriedades estticas:

As propriedades ignoreComments e ignoreProcessingInstructions determinam se comentrios ou instrues


de processamento devem ser ignorados quando o objeto XML analisado.

A propriedade ignoreWhitespace determina se os caracteres de espao em branco devem ser ignorados em tags
de elemento e expresses incorporadas que so separadas somente por caracteres de espao em branco.

PROGRAMAO DO ACTIONSCRIPT 3.0 236


Trabalho com XML

As propriedades prettyIndenteprettyPrinting so usadas para formatar o texto que retornado pelos mtodos
toString() e toXMLString() da classe XML.

Para obter detalhes sobre essas propriedades, consulte a Referncia de componentes e linguagem do ActionScript 3.0.

mtodos XML
Os mtodos a seguir permitem trabalhar com a estrutura hierrquica dos objetos XML:

appendChild() child() childIndex() children() descendants() elements() insertChildAfter() insertChildBefore() parent() prependChild()

Os mtodos a seguir permitem trabalhar com atributos de objetos XML:

attribute() attributes()

Os mtodos a seguir permitem trabalhar com propriedades de objetos XML:

hasOwnProperty() propertyIsEnumerable() replace() setChildren()

Os mtodos a seguir permitem trabalhar com nomes e espaos para nomes qualificados:

addNamespace() inScopeNamespaces() localName() name() namespace() namespaceDeclarations() removeNamespace() setLocalName() setName() setNamespace()

Os mtodos a seguir permitem trabalhar e determinar tipos especficos de contedo XML:

comments()

PROGRAMAO DO ACTIONSCRIPT 3.0 237


Trabalho com XML

hasComplexContent() hasSimpleContent() nodeKind() processingInstructions() text()

Os mtodos a seguir servem para a converso em strings e a formatao de objetos XML:

defaultSettings() setSettings() settings() normalize() toString() toXMLString()

Existem alguns mtodos adicionais:

contains() copy() valueOf() length()

Para obter detalhes sobre esses mtodos, consulte a Referncia de componentes e linguagem do ActionScript 3.0

Objetos XMLList
Uma ocorrncia de XMLList representa uma coleo arbitrria de objetos XML. Ela contm documentos XML completos, fragmentos de XML ou os resultados de uma consulta XML. Os mtodos a seguir permitem trabalhar com a estrutura hierrquica dos objetos XMLList:

child() children() descendants() elements() parent()

Os mtodos a seguir permitem trabalhar com atributos de objetos XMLList:

attribute() attributes()

Os mtodos a seguir permitem trabalhar com propriedades XMLList:

hasOwnProperty() propertyIsEnumerable()

PROGRAMAO DO ACTIONSCRIPT 3.0 238


Trabalho com XML

Os mtodos a seguir permitem trabalhar e determinar tipos especficos de contedo XML:

comments() hasComplexContent() hasSimpleContent() processingInstructions() text()

Os mtodos a seguir servem para a converso em strings e a formatao do objeto XMLList:

normalize() toString() toXMLString()

Existem alguns mtodos adicionais:

contains() copy() length() valueOf()

Para obter detalhes sobre esses mtodos, consulte a Referncia de componentes e linguagem do ActionScript 3.0 Para um objeto XMLList que contm exatamente um elemento XML, voc pode usar todos os mtodos e propriedades da classe XML porque um XMLList com um elemento XML tratado do mesmo modo como um objeto XML. Por exemplo, no cdigo a seguir, como doc.div um objeto XMLList que contm um elemento, voc pode usar o mtodo appendChild() da classe XML:
var doc:XML = <body> <div> <p>Hello</p> </div> </body>; doc.div.appendChild(<p>World</p>);

Para obter uma lista de propriedades e mtodos XML, consulte Objetos XML na pgina 235.

Inicializao de variveis XML


Voc pode atribuir um literal XML a um objeto XML do seguinte modo:
var myXML:XML = <order> <item id='1'> <menuName>burger</menuName> <price>3.95</price> </item> <item id='2'> <menuName>fries</menuName> <price>1.45</price> </item> </order>

PROGRAMAO DO ACTIONSCRIPT 3.0 239


Trabalho com XML

Como mostra o snippet a seguir, tambm possvel usar o construtor new para criar uma ocorrncia de um objeto XML a partir de uma string que contm dados XML:
var str:String = "<order><item id='1'><menuName>burger</menuName>" + "<price>3.95</price></item></order>"; var myXML:XML = new XML(str);

Se os dados XML da string no estiverem bem formados (por exemplo, se estiver faltando uma tag de fechamento), ocorrer um erro de tempo de execuo. Voc tambm pode transmitir os dados por referncia (de outras variveis) em um objeto XML, como mostra o exemplo a seguir:
var tagname:String = "item"; var attributename:String = "id"; var attributevalue:String = "5"; var content:String = "Chicken"; var x:XML = <{tagname} {attributename}={attributevalue}>{content}</{tagname}>; trace(x.toXMLString()) // Output: <item id="5">Chicken</item>

Para carregar os dados XML a partir de uma URL, use a classe URLLoader, como mostra o exemplo a seguir:
import flash.events.Event; import flash.net.URLLoader; import flash.net.URLRequest; var externalXML:XML; var loader:URLLoader = new URLLoader(); var request:URLRequest = new URLRequest("xmlFile.xml"); loader.load(request); loader.addEventListener(Event.COMPLETE, onComplete); function onComplete(event:Event):void { var loader:URLLoader = event.target as URLLoader; if (loader != null) { externalXML = new XML(loader.data); trace(externalXML.toXMLString()); } else { trace("loader is not a URLLoader!"); } }

Para ler dados XML a partir de uma conexo de soquete, use a classe XMLSocket. Para obter mais informaes, consulte a entrada classe XMLSocket na Referncia de componentes e linguagem do ActionScript 3.0.

Montagem e transformao de objetos XML


Use o mtodo prependChild() ou o mtodo appendChild() para adicionar uma propriedade ao incio ou ao final de uma lista de propriedades do objeto XML, como mostra o exemplo a seguir:

PROGRAMAO DO ACTIONSCRIPT 3.0 240


Trabalho com XML

var var var x = x = x =

x1:XML = <p>Line 1</p> x2:XML = <p>Line 2</p> x:XML = <body></body> x.appendChild(x1); x.appendChild(x2); x.prependChild(<p>Line 0</p>); // x == <body><p>Line 0</p><p>Line 1</p><p>Line 2</p></body>

Use o mtodo insertChildBefore() ou o mtodo insertChildAfter() para adicionar uma propriedade antes ou depois de uma propriedade especificada, do seguinte modo:
var x:XML = <body> <p>Paragraph 1</p> <p>Paragraph 2</p> </body> var newNode:XML = <p>Paragraph 1.5</p> x = x.insertChildAfter(x.p[0], newNode) x = x.insertChildBefore(x.p[2], <p>Paragraph 1.75</p>)

Como mostra o exemplo a seguir, voc tambm pode usar os operadores de chaves ( { e } ) para transmitir dados por referncia (de outras variveis) ao criar objetos XML:
var ids:Array = [121, 122, 123]; var names:Array = [["Murphy","Pat"], ["Thibaut","Jean"], ["Smith","Vijay"]] var x:XML = new XML("<employeeList></employeeList>"); for (var i:int = 0; i < 3; i++) { var newnode:XML = new XML(); newnode = <employee id={ids[i]}> <last>{names[i][0]}</last> <first>{names[i][1]}</first> </employee>; x = x.appendChild(newnode) }

possvel atribuir propriedades e atributos a um objeto XML usando o operador =, conforme mostrado a seguir:
var x:XML = <employee> <lastname>Smith</lastname> </employee> x.firstname = "Jean"; x.@id = "239";

Isso define o objeto XML x como o seguinte:


<employee id="239"> <lastname>Smith</lastname> <firstname>Jean</firstname> </employee>

Voc pode usar os operadores + e += para concatenar objetos XMLList:

PROGRAMAO DO ACTIONSCRIPT 3.0 241


Trabalho com XML

var x1:XML = <a>test1</a> var x2:XML = <b>test2</b> var xList:XMLList = x1 + x2; xList += <c>test3</c>

Isso define o objeto XMLList xList como o seguinte:


<a>test1</a> <b>test2</b> <c>test3</c>

Como percorrer estruturas XML


Um dos recursos avanados do XML fornecer dados aninhados complexos por meio de uma string linear de caracteres de texto. Ao carregar dados em um objeto XML, o ActionScript analisa os dados e carrega sua estrutura hierrquica na memria (ou envia um erro de tempo de execuo se os dados XML no estiverem bem formados). Os operadores e mtodos dos objetos XML e XMLList facilitam o percurso pela estrutura de dados XML. Use o operador de ponto (.) e o operador de acessador do descendente (..) para acessar as propriedades filho de um objeto XML. Considere o objeto XML a seguir:
var myXML:XML = <order> <book ISBN="0942407296"> <title>Baking Extravagant Pastries with Kumquats</title> <author> <lastName>Contino</lastName> <firstName>Chuck</firstName> </author> <pageCount>238</pageCount> </book> <book ISBN="0865436401"> <title>Emu Care and Breeding</title> <editor> <lastName>Case</lastName> <firstName>Justin</firstName> </editor> <pageCount>115</pageCount> </book> </order>

O objeto myXML.book um objeto XMLList que contm as propriedades filho do objeto myXML chamado book. Esses dois objetos XML correspondem s duas propriedades book do objeto myXML. O objeto myXML..lastName um objeto XMLList que contm todas as propriedades do descendente com o nome
lastName. Esses dois objetos XML correspondem s duas propriedades lastName do objeto myXML.

O objeto myXML.book.editor.lastName um objeto XMLList que contm todos os filhos com o nome lastName dos filhos com o nome editor dos filhos com o nome book do objeto myXML: nesse caso, um objeto XMLList que contm apenas um objeto XML (a propriedade lastName com o valor "Case").

Acesso a ns pai e filho


O mtodo parent() retorna o pai de um objeto XML.

PROGRAMAO DO ACTIONSCRIPT 3.0 242


Trabalho com XML

Voc pode usar os valores ordinais de ndice de uma lista de filhos para acessar objetos filho especficos. Por exemplo, considere um objeto XML myXML que tem duas propriedades filho chamadas book. Cada propriedade filho chamada book tem um nmero de ndice associado:
myXML.book[0] myXML.book[1]

Para acessar um neto especfico, voc pode indicar nmeros de ndice para os nomes do filho e do neto:
myXML.book[0].title[0]

No entanto, se houver apenas um filho de x.book[0] com o nome title, voc poder omitir a referncia de ndice do seguinte modo:
myXML.book[0].title

Do mesmo modo, se houver apenas um filho de book do objeto x, e se esse objeto filho tiver apenas um objeto title, voc poder omitir as duas referncias de ndice assim:
myXML.book.title

possvel usar o mtodo child() para navegar at os filhos com nomes baseados em uma varivel ou expresso, como mostra o exemplo a seguir:
var myXML:XML = <order> <book> <title>Dictionary</title> </book> </order>; var childName:String = "book"; trace(myXML.child(childName).title) // output: Dictionary

Acesso a atributos
Use o smbolo @ (operador de identificador de atributo) para acessar atributos em um objeto XML ou XMLList, como mostra o cdigo a seguir:
var employee:XML = <employee id="6401" code="233"> <lastName>Wu</lastName> <firstName>Erin</firstName> </employee>; trace(employee.@id); // 6401

Voc pode usar o smbolo de caractere curinga * com o smbolo @ para acessar todos os atributos de um objeto XML ou XMLList, como no cdigo a seguir:
var employee:XML = <employee id="6401" code="233"> <lastName>Wu</lastName> <firstName>Erin</firstName> </employee>; trace(employee.@*.toXMLString()); // 6401 // 233

PROGRAMAO DO ACTIONSCRIPT 3.0 243


Trabalho com XML

Voc pode usar o mtodo attribute() ou attributes() para acessar um atributo especfico ou todos os atributos de um objeto XML ou XMLList, como no cdigo a seguir:
var employee:XML = <employee id="6401" code="233"> <lastName>Wu</lastName> <firstName>Erin</firstName> </employee>; trace(employee.attribute("id")); // 6401 trace(employee.attribute("*").toXMLString()); // 6401 // 233 trace(employee.attributes().toXMLString()); // 6401 // 233

Tambm possvel usar a sintaxe a seguir para acessar atributos, como mostra o seguinte exemplo:
employee.attribute("id") employee["@id"] employee.@["id"]

Cada um equivalente a employee.@id. No entanto, a sintaxe employee.@id recomendada.

Filtragem por valor de elemento ou atributo


Voc pode usar os operadores de parnteses - ( e ) - para filtrar elementos com um nome de elemento ou valor de atributo especfico. Considere o objeto XML a seguir:
var x:XML = <employeeList> <employee id="347"> <lastName>Zmed</lastName> <firstName>Sue</firstName> <position>Data analyst</position> </employee> <employee id="348"> <lastName>McGee</lastName> <firstName>Chuck</firstName> <position>Jr. data analyst</position> </employee> </employeeList>

As seguintes expresses so vlidas:

x.employee.(lastName == "McGee") - o segundo n employee. x.employee.(lastName == "McGee").firstName - a propriedade firstName do segundo n employee. x.employee.(lastName == "McGee").@id - o valor do atributo id do segundo n employee. x.employee.(@id == 347) - O primeiro n employee. x.employee.(@id == 347).lastName - a propriedade lastName do primeiro n employee. x.employee.(@id > 300) - um objeto XMLList com as duas propriedades employee. x.employee.(position.toString().search("analyst") > -1) - um objeto XMLList com as duas

propriedades position.

PROGRAMAO DO ACTIONSCRIPT 3.0 244


Trabalho com XML

Se voc tentar filtrar atributos ou elementos que no existem, o Flash Player e o Adobe AIR lanaro uma exceo. Por exemplo, a linha final do cdigo a seguir gera um erro porque no existe nenhum atributo id no segundo elemento p:
var doc:XML = <body> <p id='123'>Hello, <b>Bob</b>.</p> <p>Hello.</p> </body>; trace(doc.p.(@id == '123'));

Do mesmo modo, a linha final do cdigo a seguir gera um erro porque no existe nenhuma propriedade b do segundo elemento p:
var doc:XML = <body> <p id='123'>Hello, <b>Bob</b>.</p> <p>Hello.</p> </body>; trace(doc.p.(b == 'Bob'));

Para evitar esses erros, voc pode identificar as propriedades que tm atributos ou elementos correspondentes usando os mtodos attribute() e elements(), assim como no cdigo a seguir:
var doc:XML = <body> <p id='123'>Hello, <b>Bob</b>.</p> <p>Hello.</p> </body>; trace(doc.p.(attribute('id') == '123')); trace(doc.p.(elements('b') == 'Bob'));

Tambm possvel usar o mtodo hasOwnProperty(), como no seguinte cdigo:


var doc:XML = <body> <p id='123'>Hello, <b>Bob</b>.</p> <p>Hello.</p> </body>; trace(doc.p.(hasOwnProperty('@id') && @id == '123')); trace(doc.p.(hasOwnProperty('b') && b == 'Bob'));

Uso de for..in e for each..em instrues


O ActionScript 3.0 inclui a instruo for..in e a instruo for each..in para percorrer objetos XMLList. Por exemplo, considere o seguinte objeto XML, myXML, e o objeto XMLList, myXML.item. O objeto XMLList, myXML.item, consiste em dois ns item do objeto XML.
var myXML:XML = <order> <item id='1' quantity='2'> <menuName>burger</menuName> <price>3.95</price> </item> <item id='2' quantity='2'> <menuName>fries</menuName> <price>1.45</price> </item> </order>;

PROGRAMAO DO ACTIONSCRIPT 3.0 245


Trabalho com XML

A instruo for..in permite percorrer um conjunto de nomes de propriedades em um objeto XMLList:


var total:Number = 0; for (var pname:String in myXML.item) { total += myXML.item.@quantity[pname] * myXML.item.price[pname]; }

A instruo for each..in permite percorrer as propriedades em um objeto XMLList:


var total2:Number = 0; for each (var prop:XML in myXML.item) { total2 += prop.@quantity * prop.price; }

Uso de espaos para nomes XML


Os espaos para nomes em um objeto (ou documento) XML identificam o tipo de dados contido no objeto. Por exemplo, ao enviar e fornecer dados XML para um servio da Web que usa o protocolo SOAP, voc declara o espao para nomes na tag de abertura do XML:
var message:XML = <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <soap:Body xmlns:w="http://www.test.com/weather/"> <w:getWeatherResponse> <w:tempurature >78</w:tempurature> </w:getWeatherResponse> </soap:Body> </soap:Envelope>;

O espao para nomes tem um prefixo, soap, e uma URI que define o espao para nomes, http://schemas.xmlsoap.org/soap/envelope/. O ActionScript 3.0 inclui a classe Namespace para trabalhar com espaos para nomes XML. Para o objeto XML do exemplo anterior, voc pode usar a classe Namespace do seguinte modo:
var soapNS:Namespace = message.namespace("soap"); trace(soapNS); // Output: http://schemas.xmlsoap.org/soap/envelope/ var wNS:Namespace = new Namespace("w", "http://www.test.com/weather/"); message.addNamespace(wNS); var encodingStyle:XMLList = message.@soapNS::encodingStyle; var body:XMLList = message.soapNS::Body; message.soapNS::Body.wNS::GetWeatherResponse.wNS::tempurature = "78";

A classe XML inclui os seguintes mtodos para trabalhar com espaos para nomes: addNamespace(), inScopeNamespaces(), localName(), name(), namespace(), namespaceDeclarations(), removeNamespace(), setLocalName(), setName() e setNamespace(). A diretiva de espao para nomes XML padro permite atribuir um espao para nomes padro para objetos XML. Por exemplo, a seguir, x1 e x2 tm o mesmo espao para nomes padro:

PROGRAMAO DO ACTIONSCRIPT 3.0 246


Trabalho com XML

var ns1:Namespace = new Namespace("http://www.example.com/namespaces/"); default xml namespace = ns1; var x1:XML = <test1 />; var x2:XML = <test2 />;

Converso de tipo XML


Voc pode converter objetos XML e XMLList em valores de string. Do mesmo modo, possvel converter strings em objetos XML e XMLList. Alm disso, tenha em mente que todos os valores de atributo, nomes e valores de texto XML so strings. As sees a seguir discutem todas essas formas de converso de tipo XML.

Converso de objetos XML e XMLList em strings


As classes XML e XMLList incluem um mtodo toString() e um mtodo toXMLString(). O mtodo toXMLString() retorna uma string que inclui todas as tags, atributos, instrues de espao para nomes e contedo do objeto XML. Para objetos XML com contedo complexo (elementos filho), o mtodo toString() exatamente igual ao mtodo toXMLString(). Para objetos XML com contedo simples (aqueles que contm apenas um elemento de texto), o mtodo toString() retorna somente o contedo de texto do elemento, como mostra o exemplo a seguir:
var myXML:XML = <order> <item id='1' quantity='2'> <menuName>burger</menuName> <price>3.95</price> </item> <order>; trace(myXML.item[0].menuName.toXMLString()); // <menuName>burger</menuName> trace(myXML.item[0].menuName.toString()); // burger

Se o mtodo trace() usado sem especificar toString() ou toXMLString(), os dados so convertidos usando o mtodo toString() por padro, como mostra este cdigo:
var myXML:XML = <order> <item id='1' quantity='2'> <menuName>burger</menuName> <price>3.95</price> </item> <order>; trace(myXML.item[0].menuName); // burger

Ao usar o mtodo trace() para depurar o cdigo, voc normalmente usar o mtodo toXMLString() para que trace() gere dados mais completos.

Converso de strings em objetos XML


possvel usar o construtor new XML() para criar um objeto XML a partir de uma string, do seguinte modo:
var x:XML = new XML("<a>test</a>");

PROGRAMAO DO ACTIONSCRIPT 3.0 247


Trabalho com XML

Se voc tentar converter uma string em XML a partir de uma string que representa um XML invlido ou mal formado, ocorrer um erro de tempo de execuo do seguinte modo:
var x:XML = new XML("<a>test"); // throws an error

Converso de valores de atributo, nomes e valores de texto a partir de strings


Todos os valores de atributo, nomes e valores de texto XML so tipos de dados String e talvez seja necessrio convertlos em outros tipos de dados. Por exemplo, o cdigo a seguir usa a funo Number() para converter valores de texto em nmeros:
var myXML:XML = <order> <item> <price>3.95</price> </item> <item> <price>1.00</price> </item> </order>; var total:XML = <total>0</total>; myXML.appendChild(total); for each (var item:XML in myXML.item) { myXML.total.children()[0] = Number(myXML.total.children()[0]) + Number(item.price.children()[0]); } trace(myXML.total); // 4.35;

Se esse cdigo no tivesse usado a funo Number(), o cdigo interpretaria o operador + como o operador de concatenao de string e o mtodo trace() na ltima linha seria o seguinte:
01.003.95

Leitura de documentos XML externos


Voc pode usar a classe URLLoader para carregar dados XML a partir de uma URL. Para usar o cdigo a seguir em seus aplicativos, substitua o valor XML_URL do exemplo por uma URL vlida:
var myXML:XML = new XML(); var XML_URL:String = "http://www.example.com/Sample3.xml"; var myXMLURL:URLRequest = new URLRequest(XML_URL); var myLoader:URLLoader = new URLLoader(myXMLURL); myLoader.addEventListener("complete", xmlLoaded); function xmlLoaded(event:Event):void { myXML = XML(myLoader.data); trace("Data loaded."); }

Voc tambm pode usar a classe XMLSocket para configurar uma conexo de soquete XML assncrona com um servidor. Para obter mais informaes, consulte a Referncia de componentes e linguagem do ActionScript 3.0.

PROGRAMAO DO ACTIONSCRIPT 3.0 248


Trabalho com XML

Exemplo: carregamento de dados RSS a partir da Internet


O aplicativo de exemplo RSSViewer mostra diversos recursos para trabalhar com XML no ActionScript, incluindo os seguintes:

Uso dos mtodos XML para percorrer dados XML em forma de um feed RSS. Uso dos mtodos XML para montar dados XML em forma de HTML a ser usado em um campo de texto.
O formato RSS muito utilizado para distribuir notcias via XML. Um arquivo de dados RSS simples pode ser parecido com o seguinte:
<?xml version="1.0" encoding="UTF-8" ?> <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"> <channel> <title>Alaska - Weather</title> <link>http://www.nws.noaa.gov/alerts/ak.html</link> <description>Alaska - Watches, Warnings and Advisories</description> <item> <title> Short Term Forecast - Taiya Inlet, Klondike Highway (Alaska) </title> <link> http://www.nws.noaa.gov/alerts/ak.html#A18.AJKNK.1900 </link> <description> Short Term Forecast Issued At: 2005-04-11T19:00:00 Expired At: 2005-04-12T01:00:00 Issuing Weather Forecast Office Homepage: http://pajk.arh.noaa.gov </description> </item> <item> <title> Short Term Forecast - Haines Borough (Alaska) </title> <link> http://www.nws.noaa.gov/alerts/ak.html#AKZ019.AJKNOWAJK.190000 </link> <description> Short Term Forecast Issued At: 2005-04-11T19:00:00 Expired At: 2005-04-12T01:00:00 Issuing Weather Forecast Office Homepage: http://pajk.arh.noaa.gov </description> </item> </channel> </rss>

O aplicativo SimpleRSS l os dados RSS na Internet, analisa os dados em busca de cabealhos (ttulos), links e descries e retorna esses dados. A classe SimpleRSSUI fornece a interface de usurio e chama a classe SimpleRSS, que faz todo o processamento XML. Para obter os arquivos de aplicativo deste exemplo, consulte www.adobe.com/go/learn_programmingAS3samples_flash_br. Os arquivos do aplicativo RSSViewer esto localizados na pasta Amostras/RSSViewer. O aplicativo consiste nos seguintes arquivos:

PROGRAMAO DO ACTIONSCRIPT 3.0 249


Trabalho com XML

Arquivo RSSViewer.mxml ou RSSViewer.fla com/example/programmingas3/rssViewer/RSSParser.as

Descrio O arquivo principal do aplicativo no Flash (FLA) ou no Flex (MXML).

Uma classe que contm mtodos que usam o E4X para percorrer dados RSS (XML) e gerar uma representao em HTML correspondente. Um arquivo RSS de exemplo. O aplicativo configurado para ler dados RSS na Web, em um feed RSS do Flex hospedado pela Adobe. No entanto, voc pode alterar o arquivo com facilidade para ler dados RSS neste documento, que usa um esquema ligeiramente diferente do feed RSS do Flex.

RSSData/ak.rss

Leitura e anlise de dados XML


A classe RSSParser inclui um mtodo xmlLoaded() que converte os dados RSS de entrada, armazenados na varivel rssXML, em uma string que contm a sada em formato HTML, rssOutput. Logo do incio do mtodo, o cdigo define o espao para nomes XML padro se os dados RSS de origem inclurem um espao para nomes padro:
if (rssXML.namespace("") != undefined) { default xml namespace = rssXML.namespace(""); }

As prximas linhas percorrem o contedo dos dados XML de origem, examinando cada propriedade de descendente chamada item:
for each (var item:XML in rssXML..item) { var itemTitle:String = item.title.toString(); var itemDescription:String = item.description.toString(); var itemLink:String = item.link.toString(); outXML += buildItemHTML(itemTitle, itemDescription, itemLink); }

As trs primeiras linhas simplesmente definem variveis de string para representar as propriedades de ttulo, descrio e link da propriedade item dos dados XML. Em seguida, a prxima linha chama o mtodo buildItemHTML() para obter os dados HTML em forma de um objeto XMLList, usando as trs novas variveis de string como parmetros.

Montagem de dados XMLList


Os dados HTML (um objeto XMLList) tm uma das seguintes formas:
<b>itemTitle</b> <p> itemDescription <br /> <a href="link"> <font color="#008000">More...</font> </a> </p>

As primeiras linhas do mtodo apagam o espao para nomes XML padro:

PROGRAMAO DO ACTIONSCRIPT 3.0 250


Trabalho com XML

default xml namespace = new Namespace();

A diretiva de espao para nomes XML padro tem o escopo do nvel de bloqueio da funo. Isso significa que os escopo dessa instruo o mtodo buildItemHTML(). As prximas linhas montam o XMLList, com base nos argumentos de string transmitidos para a funo:
var body:XMLList = new XMLList(); body += new XML("<b>" + itemTitle + "</b>"); var p:XML = new XML("<p>" + itemDescription + "</p>"); var link:XML = <a></a>; link.@href = itemLink; // <link href="itemLinkString"></link> link.font.@color = "#008000"; // <font color="#008000"></font></a> // 0x008000 = green link.font = "More..."; p.appendChild(<br/>); p.appendChild(link); body += p;

Esse objeto XMLList representa dados de string adequados para um campo de texto HTML do ActionScript. O mtodo xmlLoaded() usa o valor de retorno do mtodo buildItemHTML() e o converte em uma string:
XML.prettyPrinting = false; rssOutput = outXML.toXMLString();

Extrao do ttulo do feed RSS e envio de um evento personalizado


O mtodo xmlLoaded() define uma varivel de string rssTitle, com base nas informaes dos dados XML RSS de origem:
rssTitle = rssXML.channel.title.toString();

Finalmente, o mtodo xmlLoaded() gera um evento, que informa ao aplicativo que os dados esto analisados e disponveis:
dataWritten = new Event("dataWritten", true);

251

Captulo 12: Manipulao de eventos


Um sistema de manipulao de eventos permite que os programadores respondam entrada do usurio e aos eventos do sistema de modo prtico. Alm de prtico, o modelo de evento do ActionScript 3.0 est em conformidade com os padres e est bem integrado s listas de exibio do Adobe Flash Player e do Adobe AIR. Com base na especificao de eventos DOM nvel 3 e em uma arquitetura de manipulao de eventos padro do setor, o novo modelo de evento fornece uma ferramenta poderosa e intuitiva para os programadores do ActionScript. Este captulo est organizado em cinco sees. As duas primeiras sees fornecem informaes bsicas sobre a manipulao de eventos no ActionScript. As trs ltimas sees descrevem os principais conceitos do modelo de evento: fluxo, objeto e ouvintes de evento. O sistema de manipulao de eventos do ActionScript 3.0 interage de perto com a lista de exibio. Este captulo supe que voc tem noes bsicas sobre a lista de exibio. Para obter mais informaes, consulte Programao de exibio na pgina 274.

Noes bsicas sobre a manipulao de eventos


Introduo manipulao de eventos
Pense nos eventos como ocorrncias de qualquer tipo no arquivo SWF que interessam a voc como programador. Por exemplo, a maioria dos arquivos SWF oferece suporte a algum tipo de interao do usurio - seja algo simples, como responder ao clique do mouse, ou algo mais complexo, como aceitar e processar dados inseridos em um formulrio. Toda interao do usurio com seu arquivo SWF considerada um evento. Os eventos tambm podem ocorrer sem nenhuma interao direta do usurio, como quando os dados terminam de ser carregados a partir de um servidor ou quando uma cmera acoplada ativada. No ActionScript 3.0, cada evento representado por um objeto, que uma ocorrncia da classe Event ou uma de suas subclasses. Um objeto de evento no s armazena informaes sobre um evento especfico, mas tambm contm mtodos que facilitam a manipulao do objeto. Por exemplo, quando detecta um clique do mouse, o Flash Player ou o AIR cria um objeto de evento (uma ocorrncia da classe MouseEvent) para representar esse evento especfico de clique do mouse. Depois de criar um objeto de evento, o Flash Player ou o AIR o envia, ou seja, o objeto de evento transmitido para o objeto que destino do evento. O objeto que o destino de um objeto de evento enviado chamado de destino do evento. Por exemplo, quando uma cmera acoplada ativada, o Flash Player envia um objeto de evento diretamente ao destino que, nesse caso, o objeto que representa a cmera. No entanto, se o destino do evento estiver na lista de exibio, o objeto ser transmitido pela hierarquia da lista de exibio at atingir o destino do evento. Em alguns casos, o objeto de evento forma "bolhas" na hierarquia da lista de exibio ao longo da mesma rota. Essa profundidade da hierarquia da lista de exibio chamada de fluxo de evento. Voc pode ouvir objetos de evento no seu cdigo usando ouvintes de evento. Ouvintes de evento so as funes ou os mtodos gravados para responder a eventos especficos. Para garantir que seu programa responda a eventos, adicione ouvintes ao destino do evento ou a qualquer objeto da lista de exibio que faa parte do fluxo de um objeto de evento. Sempre que gravado, o cdigo do ouvinte de evento segue essa estrutura bsica (os elementos em negrito so alocadores de espao preenchidos de acordo com suas necessidades):

PROGRAMAO DO ACTIONSCRIPT 3.0 252


Manipulao de eventos

function eventResponse(eventObject:EventType):void { // Actions performed in response to the event go here. } eventTarget.addEventListener(EventType.EVENT_NAME, eventResponse);

Esse cdigo faz duas coisas. Primeiro, ele define uma funo, que a maneira de especificar as aes que sero executadas em resposta ao evento. Em seguida, o mtodo addEventListener() do objeto de origem chamado, basicamente inscrevendo a funo do evento especificado para que, quando o evento acontecer, as aes da funo sejam executadas. Quando o evento realmente acontece, o destino do evento verifica a lista de todos os mtodos e funes registrados como ouvintes de evento. Cada um deles chamado e o objeto de evento transmitido como um parmetro. Para criar seu prprio ouvinte de evento, necessrio alterar quatro coisas nesse cdigo. Primeiro, voc deve dar funo o nome que deseja usar (essa alterao deve ser feita em dois lugares, onde aparece eventResponse no cdigo). Segundo, voc deve especificar o nome de classe adequado do objeto que enviado pelo evento que deseja ouvir (EventType no cdigo) e tambm deve especificar a constante correta para o evento em questo (EVENT_NAME na listagem). Terceiro, voc deve chamar o mtodo addEventListener() no objeto que enviar o evento (eventTarget neste cdigo). Se desejar, altere o nome da varivel usada como parmetro da funo (eventObject neste cdigo).

Tarefas comuns de manipulao de eventos


As seguintes tarefas comuns de manipulao de eventos so descritas neste captulo:

Gravao do cdigo para responder a eventos Interrupo do cdigo em resposta aos eventos Trabalho com os objetos de evento Trabalho com o fluxo de evento: Identificao de informaes do fluxo de evento Interrupo do fluxo de evento Como evitar o comportamento padro Envio de eventos a partir de suas classes Criao de um tipo de evento personalizado

Conceitos e termos importantes


A lista de referncia a seguir contm termos importantes usados neste captulo:

Comportamento padro: alguns eventos incluem um comportamento que normalmente ocorre ao longo do evento
e conhecido como comportamento padro. Por exemplo, quando um usurio digita em um campo de texto, ocorre um evento de entrada de texto. O comportamento padro desse evento exibir o caractere que realmente foi digitado no campo de texto, mas voc pode substitu-lo (se, por algum motivo, no desejar exibir o caractere digitado).

Envio: para notificar o evento ocorrido para os ouvintes de evento. Evento: algo que acontece em um objeto e que pode ser informado para outros objetos.

PROGRAMAO DO ACTIONSCRIPT 3.0 253


Manipulao de eventos

Fluxo de evento: quando os eventos acontecem em um objeto na lista de exibio (um objeto exibido na tela), todos
os objetos que contm o objeto em questo so informados sobre o evento e notificam seus ouvintes. Esse processo comea com o palco e continua na lista de exibio at o objeto real onde ocorreu o evento e, em seguida, retorna ao palco. Esse processo tambm conhecido como fluxo de evento.

Objeto de evento: um objeto que contm informaes sobre a ocorrncia de um evento especfico, que enviado
para todos os ouvintes assim que o evento acontece.

Destino do evento: o objeto que realmente envia um evento. Por exemplo, se o usurio clica em um boto que est
dentro de uma entidade grfica que, por sua vez, est no palco, todos esses objetos enviam eventos, mas o destino do evento o local onde o evento realmente aconteceu - nesse caso, o boto clicado.

Ouvinte: um objeto ou uma funo que foi registrada com um objeto para indicar que deve ser notificado quando
ocorrer um evento especfico.

Teste dos exemplos do captulo


Talvez voc queira testar algumas das listagens de cdigo de exemplo por si prprio, durante a leitura deste captulo. Basicamente, todas as listagens de cdigo deste captulo incluem uma chamada da funo trace() para testar os resultados do cdigo. Para testar as listagens de cdigo deste captulo:
1 Crie um documento vazio usando a ferramenta de autoria do Flash. 2 Selecione um quadro-chave na linha de tempo. 3 Abra o painel Aes e copie a listagem de cdigo no painel Script. 4 Execute o programa usando o comando Controlar > Testar filme.

Voc ver os resultados das funes trace() da listagem de cdigo no painel Sada. Algumas listagens de cdigo so mais complexas e gravadas como uma classe. Para testar esses exemplos:
1 Crie um documento vazio usando a ferramenta de autoria do Flash e salve-o no computador. 2 Crie um novo arquivo ActionScript e salve-o no mesmo diretrio em que o documento criado na etapa 1. O nome

do arquivo deve corresponder ao nome da classe na listagem de cdigo. Por exemplo, se a listagem de cdigo define uma classe chamada EventTest, use o nome EventTest.as para salvar o arquivo do ActionScript.
3 Copie a listagem de cdigo no arquivo do ActionScript e salve o arquivo. 4 No documento, clique em uma parte branca do Palco ou espao de trabalho para ativar o Inspetor de propriedades

do documento.
5 No Inspetor de propriedades, no campo Classe do documento, digite o nome da classe ActionScript que voc

copiou do texto.
6 Execute o programa usando o comando Controlar > Testar filme.

Voc ver os resultados do exemplo no painel Sada. Essas tcnicas para testar listagens de cdigo de exemplo so detalhadas em Teste de listagens de cdigo de exemplo dos captulos na pgina 36.

PROGRAMAO DO ACTIONSCRIPT 3.0 254


Manipulao de eventos

Como a manipulao de eventos do ActionScript 3.0 diferente das verses anteriores


A diferena mais notvel entre a manipulao de eventos no ActionScript 3.0 e nas verses anteriores do ActionScript o fato de que, no ActionScript 3.0, existe apenas um sistema para manipulao de eventos, enquanto nas verses anteriores existem diversos sistemas diferentes de manipulao de eventos. Esta seo comea com uma viso geral de como era a manipulao de eventos nas verses anteriores do ActionScript e, em seguida, discute como a manipulao de eventos foi alterada para o ActionScript 3.0.

Manipulao de eventos nas verses anteriores do ActionScript


As verses anteriores ao ActionScript 3.0 forneciam diversas maneiras diferentes para manipular eventos:

Manipuladores de eventos on() que podem ser colocados diretamente nas ocorrncias de Button e de MovieClip Manipuladores onClipEvent() que podem ser colocados diretamente nas ocorrncias de MovieClip Propriedades de funo de retorno de chamada, como XML.onload e Camera.onActivity Ouvintes de evento registrados ao usar o mtodo addListener() A classe UIEventDispatcher que implementou parcialmente o modelo de evento DOM.
Cada um desses mecanismos tem vantagens e desvantagens. Os manipuladores on() e onClipEvent() so fceis de usar, mas dificultam a manuteno posterior dos projetos porque o cdigo colocado diretamente nos botes e clipes de filme pode ser difcil de localizar. As funes de retorno de chamada tambm so simples de implementar, mas voc s pode usar uma funo por evento. Os ouvintes de evento so mais difceis de implementar porque requerem no s a criao de um objeto de ouvinte e de uma funo, mas tambm o registro do ouvinte com o objeto que gera o evento. No entanto, esse aumento da sobrecarga permite criar vrios objetos de ouvinte e registrar todos eles para o mesmo evento. O desenvolvimento de componentes para o ActionScript 2.0 gerou mais um modelo de evento. Esse novo modelo, incorporado na classe UIEventDispatcher, foi baseado em um subconjunto da especificao de eventos DOM. Os desenvolvedores familiarizados com a manipulao de eventos de componente acharo a transio para o modelo de evento do ActionScript 3.0 relativamente fcil. Infelizmente, a sintaxe usada pelos diversos modelos de evento diferente em alguns pontos. Por exemplo, no ActionScript 2.0, algumas propriedades, como TextField.onChanged, podem ser usadas como uma funo de retorno de chamada ou um ouvinte de evento. No entanto, a sintaxe para registrar objetos de ouvinte diferente, dependendo do uso de uma das seis classes que oferecem suporte aos ouvintes ou da classe UIEventDispatcher. Para as classes Key, Mouse, MovieClipLoader, Selection, Stage e TextField, use o mtodo addListener(), mas, para a manipulao de eventos de componentes, use o mtodo chamado addEventListener(). Outra complexidade decorrente dos diferentes modelos de manipulao de eventos o escopo da funo do manipulador de eventos, que variava muito dependendo do mecanismo usado. Em outras palavras, o significado da palavra-chave this no era consistente entre os sistemas de manipulao de eventos.

PROGRAMAO DO ACTIONSCRIPT 3.0 255


Manipulao de eventos

Manipulao de eventos no ActionScript 3.0


O ActionScript 3.0 apresenta um nico modelo de manipulao de eventos que substitui os diversos mecanismos diferentes que existiam nas verses anteriores da linguagem. O novo modelo de evento baseia-se na especificao de eventos DOM nvel 3. Embora o formato de arquivo SWF no estejam em conformidade especificamente com o padro DOM, existem similaridades suficientes entre a lista de exibio e a estrutura do DOM que permitem a implementao do modelo de evento DOM. Um objeto na lista de exibio equivalente a um n na estrutura hierrquica DOM e os termos objeto da lista de exibio e n so usados alternadamente nesta discusso. A implementao do Flash Player e do AIR do modelo de evento DOM inclui um conceito chamado comportamento padro. Um comportamento padro uma ao executada pelo Flash Player ou AIR como conseqncia normal de determinados eventos. Comportamentos padro Os desenvolvedores normalmente so responsveis por gravar o cdigo que responde aos eventos. No entanto, em alguns casos, como um comportamento normalmente associado a um evento, o Flash Player ou o AIR o executa automaticamente a no ser que o desenvolvedor adicione algum cdigo para cancel-lo. Como o Flash Player ou o AIR exibe o comportamento automaticamente, tais comportamentos so chamados de padro. Por exemplo, quando um usurio insere um texto em um objeto TextField, a expectativa de que o texto ser exibido nesse objeto TextField to comum que o comportamento incorporado no Flash Player e no AIR. Se no desejar que esse comportamento padro ocorra, cancele-o usando o novo sistema de manipulao de eventos. Quando o usurio insere o texto em um objeto TextField, o Flash Player ou o AIR cria uma ocorrncia da classe TextEvent para representar essa entrada do usurio. Para impedir que o Flash Player ou o AIR exiba o texto no objeto TextField, acesse essa ocorrncia especfica de TextEvent e chame o mtodo preventDefault() dessa ocorrncia. No possvel impedir todos os comportamentos padro. Por exemplo, o Flash Player e o AIR geram um objeto MouseEvent quando o usurio clica duas vezes em uma palavra em um objeto TextField. O comportamento padro, que no pode ser evitado, a palavra realada quando o cursor passa. Muitos tipos de objetos de evento no tm comportamentos padro associados. Por exemplo, o Flash Player envia um objeto de evento connect quando uma conexo de rede estabelecida, mas no h nenhum comportamento padro associado a esse objeto. A documentao da API da classe Event e de suas subclasses relaciona cada tipo de evento e descreve os comportamentos padro associados, alm de indicar se esse comportamento pode ser evitado. importante mencionar que os comportamentos padro so associados apenas aos objetos de evento enviados pelo Flash Player ou AIR, e no existem para objetos de evento enviados de modo programtico pelo ActionScript. Por exemplo, voc pode usar os mtodos da classe EventDispatcher para enviar um objeto de evento do tipo textInput, mas esse objeto no ter nenhum comportamento padro associado. Em outras palavras, o Flash Player e o AIR no exibiro um caractere em um objeto TextField em decorrncia de um evento textInput enviado programaticamente. Novidades dos ouvintes de evento do ActionScript 3.0 Para desenvolvedores familiarizados com o mtodo addListener() do ActionScript 2.0, talvez seja til descrever as diferenas entre o modelo de ouvinte de evento do ActionScript 2.0 e o modelo de evento do ActionScript 3.0. A lista a seguir descreve as principais diferenas entre os dois modelos de evento:

Para incluir ouvintes de evento no ActionScript 2.0, voc usa addListener() em alguns casos e
addEventListener() em outros, enquanto no ActionScript 3.0, addEventListener() usado em todas as

situaes.

No existe nenhum fluxo de evento no ActionScript 2.0, ou seja, o mtodo addListener() pode ser chamado
somente no objeto que transmite o evento. J no ActionScript 3.0, o mtodo addEventListener() pode ser chamado em qualquer objeto que faa parte do fluxo de evento.

PROGRAMAO DO ACTIONSCRIPT 3.0 256


Manipulao de eventos

No ActionScript 2.0, os ouvintes de evento podem ser funes, mtodos ou objetos e, no ActionScript 3.0, apenas
funes ou mtodos podem ser ouvintes de evento.

O fluxo de evento
O Flash Player ou o AIR envia objetos de evento sempre que ocorre um evento. Se o destino do evento no estiver na lista de exibio, o Flash Player ou o AIR enviar o objeto diretamente para o destino. Por exemplo, o Flash Player envia o objeto de evento progress diretamente para um objeto URLStream. No entanto, se o destino do evento estiver na lista de exibio, o Flash Player enviar o objeto para a lista de exibio e esse objeto ir percorrer a lista at chegar ao destino. O fluxo de evento descreve como um objeto de evento se move pela lista de exibio. A lista de exibio est organizada em uma hierarquia que pode ser descrita como uma rvore. No topo da hierarquia da lista de exibio est o palco, que um continer especial de objeto de exibio que serve como raiz da lista de exibio. O palco representado pela classe flash.display.Stage e s pode ser acessado por meio de um objeto de exibio. Cada objeto de exibio tem uma propriedade chamada stage que faz referncia ao palco desse aplicativo. Quando o Flash Player ou o AIR envia um objeto para um evento relacionado lista de exibio, esse objeto de evento faz uma viagem de ida e volta do palco ao n de destino. A especificao de eventos DOM define o n de destinocomo o n que representa o destino do evento. Em outras palavras, o n de destino o objeto da lista de exibio onde ocorreu o evento. Por exemplo, se o usurio clicar em um objeto da lista de exibio chamado child1, o Flash Player ou o AIR enviar um objeto de evento usando child1 como n de destino. O fluxo de evento dividido conceitualmente em trs partes. A primeira parte chamada de fase de captura; essa fase compreende todos os ns do palco ao pai do n de destino. A segunda parte chamada de fase de destino e consiste apenas no n de destino. A terceira parte chamada de fase de bubbling. A fase de bubbling composta pelos ns encontrados na viagem de retorno do pai do n de destino ao palco. Os nomes das fases faro mais sentido se voc pensar na lista de exibio como uma hierarquia vertical com o palco no topo, como mostra o diagrama a seguir:
Palco

N pai

N filho1

N filho2

PROGRAMAO DO ACTIONSCRIPT 3.0 257


Manipulao de eventos

Se o usurio clicar no n Child1, o Flash Player ou o AIR enviar um objeto ao fluxo de evento. Como mostra a imagem a seguir, a jornada do objeto comea no palco, vai at o n pai, segue para o n Child1 e volta ao palco, movendo-se pelo n pai novamente at voltar ao palco.
Palco Fase de captura N pai Fase de animao

N filho1 Fase de destino

N filho2

Neste exemplo, a fase de captura inclui o palco e o n pai durante a viagem de ida inicial. A fase de destino consiste no tempo gasto no n Child1. A fase de bubbling inclui o n pai e o palco, pois ambos esto presentes na viagem de volta ao n raiz. O fluxo de evento contribui com um sistema de manipulao de eventos mais avanado do que o anteriormente disponvel para os programadores no ActionScript. Nas verses anteriores do ActionScript, no existe o fluxo de evento, ou seja, os ouvintes de evento podem ser adicionados somente ao objeto que gera o evento. No ActionScript 3.0, possvel adicionar ouvintes de evento no s a um n de destino, mas tambm a qualquer n ao longo do fluxo de evento. A possibilidade de adicionar ouvintes ao longo do fluxo de evento til quando um componente da interface do usurio tem mais de um objeto. Por exemplo, um objeto de boto normalmente contm um objeto de texto que serve como rtulo do boto. Sem poder adicionar um ouvinte ao fluxo de evento, seria necessrio adicionar um ouvinte ao objeto de boto e ao objeto de texto para garantir o recebimento de notificaes sobre eventos de clique que ocorrem em qualquer lugar no boto. No entanto, a existncia do fluxo de evento permite colocar um nico ouvinte no objeto de boto que manipula eventos de clique ocorridos no objeto de texto ou nas reas do objeto de boto que no so obscurecidas pelo objeto de texto. Porm, nem todos os objetos de evento participam das trs fases do fluxo de evento. Alguns tipos de eventos, como
enterFrame e init, so enviados diretamente para o n de destino e no participam da fase de captura, nem da fase

de bubbling. Outros eventos podem ser direcionados para objetos que no esto na lista de exibio, como eventos enviados para uma ocorrncia da classe Socket. Esses objetos de evento tambm vo diretamente para o objeto de destino, sem participar das fases de captura e de bubbling. Para descobrir como se comporta um tipo de evento especfico, consulte a documentao da API ou examine as propriedades do objeto de evento. O exame das propriedades do objeto de evento est descrito na prxima seo.

Objetos de evento
Os objetos de evento tm duas finalidades principais no novo sistema de manipulao de eventos. Primeiro, esses objetos representam eventos reais, armazenando informaes sobre eventos especficos em um conjunto de propriedades. Segundo, os objetos de evento contm um conjunto de mtodos que permitem manipular objetos de evento e afetam o comportamento do sistema de manipulao de eventos.

PROGRAMAO DO ACTIONSCRIPT 3.0 258


Manipulao de eventos

Para facilitar o acesso a esses mtodos e propriedades, a API do Flash Player define uma classe Event que serve como base para todos os objetos de evento. A classe Event define um conjunto bsico de mtodos e propriedades comuns a todos os objetos de evento. Esta seo comea com uma discusso sobre as propriedades da classe Event, continua com uma descrio dos mtodos da classe Event e termina explicando por que existem subclasses de Event.

Compreenso das propriedades da classe Event


A classe Event define diversas propriedades e constantes somente leitura que fornecem informaes importantes sobre um objeto de evento. As seguintes propriedades so especialmente importantes:

Os tipos de objeto de evento so representados por constantes e armazenados na propriedade Event.type. Se for necessrio impedir o comportamento padro de um evento, isso ser representado por um valor booleano e
armazenado na propriedade Event.cancelable.

As informaes de fluxo de evento so contidas nas propriedades restantes.


Tipos de objeto de evento Cada objeto de evento tem um tipo associado. Os tipos de evento so armazenados na propriedade Event.type como valores de string. til saber o tipo de um objeto de evento para que o cdigo possa diferenciar os objetos de tipos diferentes. Por exemplo, o cdigo a seguir especifica que a funo do ouvinte clickHandler() deve responder a qualquer objeto de evento de clique de mouse transmitido para myDisplayObject:
myDisplayObject.addEventListener(MouseEvent.CLICK, clickHandler);

Vinte e quatro tipos de evento so associados classe Event propriamente dita e representados por constantes da classe Event; alguns deles so mostrados no trecho a seguir da definio da classe Event:
package flash.events { public class Event { // class constants public static const ACTIVATE:String = "activate"; public static const ADDED:String= "added"; // remaining constants omitted for brevity } }

Essas constantes facilitam a referncia a tipos de evento especficos. Use essas constantes em vez das strings que representam. Se voc digitar o nome de uma constante incorretamente no cdigo, o compilador detectar o erro, mas, se as strings forem utilizadas, um erro tipogrfico talvez no se manifeste no tempo de compilao e gere um comportamento inesperado difcil de depurar. Por exemplo, ao adicionar um ouvinte de evento, use o seguinte cdigo:
myDisplayObject.addEventListener(MouseEvent.CLICK, clickHandler);

em vez de:
myDisplayObject.addEventListener("click", clickHandler);

PROGRAMAO DO ACTIONSCRIPT 3.0 259


Manipulao de eventos

Informaes sobre o comportamento padro Seu cdigo pode verificar se o comportamento padro de um determinado objeto de evento pode ser impedido acessando a propriedade cancelable. A propriedade cancelable tem um valor booleano que indica se um comportamento padro pode ou no ser impedido. Voc pode impedir ou cancelar o comportamento padro associado a um pequeno nmero de eventos usando o mtodo preventDefault(). Para obter mais informaes, consulte Cancelamento do comportamento padro do evento em Compreenso dos mtodos da classe Event na pgina 260. Informaes sobre o fluxo de evento As demais propriedades da classe Event contm informaes importantes sobre um objeto de evento e sua relao com o fluxo de evento, conforme descrito na lista a seguir:

A propriedade bubbles contm informaes sobre as partes do fluxo nas quais o objeto de evento participa. A propriedade eventPhase indica a fase atual no fluxo de evento. A propriedade target armazena uma referncia ao destino do evento. A propriedade currentTarget armazena uma referncia ao objeto da lista de exibio que est processando o
objeto de evento no momento. A propriedade bubbles Um evento animado se seu objeto participa da fase de bubbling do fluxo de evento, o que significa que o objeto de evento volta do n de destino para seu ancestral at chegar ao palco. A propriedade Event.bubbles armazena um valor booleano que indica se o objeto de evento participa na fase de bubbling. Como todos os eventos que so animados tambm participam nas fases de captura e de destino, qualquer evento animado participa das trs fases do fluxo de evento. Se o valor for true, o objeto de evento participar das trs fases. Se o valor for false, o objeto de evento no participar na fase de bubbling. A propriedade eventPhase Voc pode determinar a fase de qualquer objeto de evento investigando a propriedade eventPhase. A propriedade eventPhase contm um valor inteiro sem sinal que representa uma das trs fases do fluxo de evento. A API do Flash Player define uma classe EventPhase separada que contm trs constantes que correspondem a trs valores inteiros sem sinal, como mostra o seguinte trecho de cdigo:
package flash.events { public final class EventPhase { public static const CAPTURING_PHASE:uint = 1; public static const AT_TARGET:uint = 2; public static const BUBBLING_PHASE:uint= 3; } }

Essa constantes correspondem a trs valores vlidos da propriedade eventPhase. Voc pode usar essas constantes para deixar seu cdigo mais legvel. Por exemplo, se desejar assegurar que uma funo myFunc() seja chamada somente se o destino do evento estiver no palco de destino, use o cdigo a seguir para testar essa condio:
if (event.eventPhase == EventPhase.AT_TARGET) { myFunc(); }

PROGRAMAO DO ACTIONSCRIPT 3.0 260


Manipulao de eventos

A propriedade target A propriedade target armazena uma referncia ao objeto que o destino do evento. Em alguns casos, isso simples, como quando um microfone ativado; o destino do objeto de evento o objeto Microphone. No entanto, se o destino estiver na lista de exibio, a hierarquia da lista deve ser levada em considerao. Por exemplo, se o usurio inserir um clique de mouse em um ponto que inclui objetos sobrepostos da lista de exibio, o Flash Player e o AIR sempre escolhero o objeto mais distante do palco como destino do evento. Para arquivos SWF complexos, especialmente aqueles nos quais os botes so decorados regularmente com objetos filho menores, a propriedade target talvez no seja usada com freqncia porque, em geral, apontar para o objeto filho de um boto, no para o boto. Nesses casos, a prtica comum adicionar ouvintes de evento ao boto e usar a propriedade currentTarget que aponta para o boto, j que a propriedade target pode apontar para um filho do boto. A propriedade currentTarget A propriedade currentTarget contm uma referncia ao objeto que est processando o objeto de evento no momento. Embora possa parecer estranho no saber qual n est processando o objeto de evento que voc est examinando no momento, possvel adicionar uma funo de ouvinte a qualquer objeto de exibio do fluxo desse objeto de evento; a funo de ouvinte pode ser colocada em qualquer lugar. Alm disso, a mesma funo de ouvinte pode ser adicionada a diferentes objetos de exibio. medida que aumenta o tamanho e a complexidade de um projeto, a propriedade currentTarget fica cada vez mais til.

Compreenso dos mtodos da classe Event


Existem trs categorias de mtodos da classe Event:

Mtodos de utilitrio, que podem criar cpias de um objeto de evento ou convert-lo em uma string Mtodos de fluxo de evento, que removem objetos do fluxo de evento Mtodos de comportamento padro, que impedem o comportamento padro ou verificam se ele foi impedido
Mtodos de utilitrio da classe Event Existem dois mtodos de utilitrio na classe Event. O mtodo clone() permite criar cpias de um objeto de evento. O mtodo toString() permite gerar uma representao de string das propriedades de um objeto de evento, junto com seus valores. Esses dois mtodos so usados internamente pelo sistema de modelo de evento, mais so expostos aos desenvolvedores para uso geral. Para desenvolvedores avanados que criam subclasses de Event, necessrio substituir e implementar verses dos dois mtodos de utilitrio para garantir que a subclasse funcione corretamente. Interrupo do fluxo de evento Voc pode chamar o mtodo Event.stopPropagation() ou o mtodo Event.stopImmediatePropagation() para impedir que um objeto de evento continue seu percurso no fluxo. Os dois mtodos so praticamente idnticos e diferem apenas quanto aos ouvintes de evento do n atual que podem ser executados:

O mtodo Event.stopPropagation() impede que o objeto de evento se mova para o prximo n, mas s depois
que algum outro ouvinte de evento do n atual tenha permisso para ser executado.

O mtodo Event.stopImmediatePropagation() tambm impede que o objeto de evento se mova para o


prximo n, mas no permite que outros ouvintes de evento do n atual sejam executados. Chamar um desses mtodos no afeta a ocorrncia do comportamento padro associado a um evento. Use os mtodos do comportamento padro da classe Event para impedir tal comportamento.

PROGRAMAO DO ACTIONSCRIPT 3.0 261


Manipulao de eventos

Cancelamento do comportamento padro do evento Os dois mtodos envolvidos no cancelamento do comportamento padro so preventDefault() e isDefaultPrevented(). Chame o mtodo preventDefault() para cancelar o comportamento padro associado a um evento. Para verificar se preventDefault() j foi chamado em um objeto de evento, chame o mtodo isDefaultPrevented(), que retorna o valor true se o mtodo j tiver sido chamado; caso contrrio, retornar false. O mtodo preventDefault() s funcionar se o comportamento padro do evento puder ser cancelado. Para verificar isso, consulte a documentao da API para esse tipo de evento ou use o ActionScript para examinar a propriedade cancelable do objeto de evento. O cancelamento do comportamento padro no afeta o progresso de um objeto no fluxo de evento. Use os mtodos do fluxo de evento da classe Event para remover um objeto do fluxo.

Subclasses de Event
Para muitos eventos, o conjunto comum de propriedades definido na classe Event suficiente. No entanto, outros eventos tm caractersticas exclusivas que no podem ser capturadas pelas propriedades disponveis na classe Event. Para esses eventos, o ActionScript 3.0 define vrias subclasses da classe Event. Cada subclasse fornece propriedades e tipos de evento adicionais que so exclusivos dessa categoria de eventos. Por exemplo, os eventos relacionados entrada do mouse tm vrias caractersticas exclusivas que no podem ser capturadas pelas propriedades definidas na classe Event. A classe MouseEvent estende a classe Event adicionando dez propriedades que contm informaes como o local do evento de mouse e que indicam se teclas especficas foram pressionadas durante o evento de mouse. Uma subclasse de Event tambm contm constantes que representam os tipos de evento associados subclasse. Por exemplo, a classe MouseEvent define constantes para vrios tipos de evento de mouse, incluindo click, doubleClick, mouseDown e mouseUp. Conforme descrito na seo de mtodos de utilitrio da classe Event emObjetos de evento na pgina 257, preciso substituir os mtodos clone() e toString() para oferecer funcionalidade especfica para a subclasse.

Ouvintes de evento
Os ouvintes de evento, tambm chamados de manipuladores de evento, so funes executadas pelo Flash Player e pelo AIR em resposta a eventos especficos. A adio de um ouvinte de evento um processo de duas etapas. Primeiro, crie um mtodo de funo ou classe a ser executado pelo Flash Player ou AIR em resposta ao evento. s vezes, isso chamado de funo de ouvinte ou de manipulador de evento. Segundo, use o mtodo addEventListener() para registrar a funo de ouvinte no destino do evento ou em qualquer objeto da lista de exibio ao longo do fluxo de evento adequado.

Criao de uma funo de ouvinte


A criao de funes de ouvinte uma das diferenas entre o modelo de evento do ActionScript 3.0 e o modelo de evento DOM. No modelo de evento DOM, existe uma distino clara entre um ouvinte de evento e uma funo de ouvinte: um ouvinte de evento uma ocorrncia de uma classe que implementa a interface EventListener, enquanto a funo de ouvinte um mtodo dessa classe chamado handleEvent(). No modelo de evento DOM, a ocorrncia da classe que contm a funo de ouvinte registrada, no a funo de ouvinte propriamente dita.

PROGRAMAO DO ACTIONSCRIPT 3.0 262


Manipulao de eventos

No modelo de evento do ActionScript 3.0, no existe diferena entre um ouvinte de evento e uma funo de ouvinte. O ActionScript 3.0 no tem uma interface EventListener e as funes de ouvinte podem ser definidas fora de uma classe ou como parte dela. Alm disso, as funes de ouvinte no precisam ser chamadas de handleEvent() - elas podem ser chamadas com qualquer identificador vlido. No ActionScript 3.0, o nome da funo de ouvinte real registrado. Funo de ouvinte definida fora de uma classe O cdigo a seguir cria um arquivo SWF simples que exibe um quadrado vermelho. Uma funo de ouvinte chamada clickHandler(), que no faz parte de uma classe, ouve os eventos de clique de mouse no quadrado vermelho.
package { import flash.display.Sprite; public class ClickExample extends Sprite { public function ClickExample() { var child:ChildSprite = new ChildSprite(); addChild(child); } } } import flash.display.Sprite; import flash.events.MouseEvent; class ChildSprite extends Sprite { public function ChildSprite() { graphics.beginFill(0xFF0000); graphics.drawRect(0,0,100,100); graphics.endFill(); addEventListener(MouseEvent.CLICK, clickHandler); } } function clickHandler(event:MouseEvent):void { trace("clickHandler detected an event of type: " + event.type); trace("the this keyword refers to: " + this); }

Quando um usurio interage com o arquivo SWF resultante clicando no quadrado, o Flash Player ou AIR gera a seguinte sada de trao:
clickHandler detected an event of type: click the this keyword refers to: [object global]

Observe que o objeto de evento transmitido como um argumento para clickHandler(). Isso permite que a funo de ouvinte examine o objeto de evento. Neste exemplo, use a propriedade type do objeto de evento para certificar-se de que o evento um evento de clique. O exemplo tambm verifica o valor da palavra-chave this. Nesse caso, this representa o objeto global, o que faz sentido porque a funo definida fora de um objeto ou classe personalizado.

PROGRAMAO DO ACTIONSCRIPT 3.0 263


Manipulao de eventos

Funo de ouvinte definida como um mtodo de classe O exemplo a seguir idntico ao anterior que define a classe ClickExample, mas a funo clickHandler() definida como um mtodo da classe ChildSprite:
package { import flash.display.Sprite; public class ClickExample extends Sprite { public function ClickExample() { var child:ChildSprite = new ChildSprite(); addChild(child); } } } import flash.display.Sprite; import flash.events.MouseEvent; class ChildSprite extends Sprite { public function ChildSprite() { graphics.beginFill(0xFF0000); graphics.drawRect(0,0,100,100); graphics.endFill(); addEventListener(MouseEvent.CLICK, clickHandler); } private function clickHandler(event:MouseEvent):void { trace("clickHandler detected an event of type: " + event.type); trace("the this keyword refers to: " + this); } }

Quando um usurio interage com o arquivo SWF resultante clicando no quadrado vermelho, o Flash Player ou AIR gera a seguinte sada de trao:
clickHandler detected an event of type: click the this keyword refers to: [object ChildSprite]

Observe que a palavra-chave this faz referncia ocorrncia de ChildSprite chamada child. Este comportamento diferente do ActionScript 2.0. Caso j tenha usado componentes no ActionScript 2.0, talvez se lembre que, quando um mtodo de classe era transmitido para UIEventDispatcher.addEventListener(), o escopo do mtodo ia at o componente que transmite o evento em vez da classe na qual o mtodo de ouvinte era definido. Em outras palavras, se voc utilizou essa tcnica no ActionScript 2.0, a palavra-chave this fazia referncia ao componente que transmite o evento, no ocorrncia de ChildSprite. Isso foi um problema significativo para alguns programadores, pois no permitia o acesso a outros mtodos e propriedades da classe que contm o mtodo de ouvinte. Como soluo temporria, os programadores do ActionScript 2.0 podiam usar a classe mx.util.Delegate para alterar o escopo do mtodo de ouvinte. No entanto, isso no mais necessrio porque o ActionScript 3.0 cria um mtodo vinculado quando addEventListener() chamado. Em resultado disso, a palavra-chave this faz referncia ocorrncia de ChildSprite chamada child, e o programador tem acesso a outros mtodos e propriedades da classe ChildSprite.

PROGRAMAO DO ACTIONSCRIPT 3.0 264


Manipulao de eventos

Ouvinte de evento que no deve ser usado Existe uma terceira tcnica que permite criar um objeto genrico com uma propriedade que aponta para uma funo de ouvinte atribuda dinamicamente, mas essa tcnica no recomendada. Ela ser discutida aqui porque foi muito usada no ActionScript 2.0, mas no deve ser usada no ActionScript 3.0. Essa tcnica no recomendada porque a palavra-chave this far referncia ao objeto global em vez do objeto de ouvinte. O exemplo a seguir idntico ao exemplo anterior da classe ClickExample, mas a funo de ouvinte definida como parte de um objeto genrico chamado myListenerObj:
package { import flash.display.Sprite; public class ClickExample extends Sprite { public function ClickExample() { var child:ChildSprite = new ChildSprite(); addChild(child); } } } import flash.display.Sprite; import flash.events.MouseEvent; class ChildSprite extends Sprite { public function ChildSprite() { graphics.beginFill(0xFF0000); graphics.drawRect(0,0,100,100); graphics.endFill(); addEventListener(MouseEvent.CLICK, myListenerObj.clickHandler); } } var myListenerObj:Object = new Object(); myListenerObj.clickHandler = function (event:MouseEvent):void { trace("clickHandler detected an event of type: " + event.type); trace("the this keyword refers to: " + this); }

Os resultados do trao sero similares a:


clickHandler detected an event of type: click the this keyword refers to: [object global]

Voc talvez pensasse que this faria referncia a myListenerObj e que a sada de trao seria [object Object], mas a referncia foi feita ao objeto global. Ao transmitir o nome de uma propriedade dinmica como um argumento para addEventListener(), o Flash Player ou AIR no consegue criar um mtodo vinculado. Isso ocorre porque, quando est transmitindo o parmetro listener, voc no est transmitindo nada mais do que o endereo de memria da funo de ouvinte, e o Flash Player e AIR no conseguem vincular esse endereo de memria com a ocorrncia de
myListenerObj.

PROGRAMAO DO ACTIONSCRIPT 3.0 265


Manipulao de eventos

Gerenciamento de ouvintes de evento


Voc pode gerenciar suas funes de ouvinte usando os mtodos da interface IEventDispatcher. A interface IEventDispatcher a verso ActionScript 3.0 da interface EventTarget do modelo de evento DOM. Embora o nome IEventDispatcher possa transmitir a idia de que o objetivo principal enviar (ou despachar) objetos de evento, os mtodos dessa classe so usados com mais freqncia para registrar, verificar e remover ouvintes de evento. A interface IEventDispatcher define cinco mtodos, como mostra o cdigo a seguir:
package flash.events { public interface IEventDispatcher { function addEventListener(eventName:String, listener:Object, useCapture:Boolean=false, priority:Integer=0, useWeakReference:Boolean=false):Boolean; function removeEventListener(eventName:String, listener:Object, useCapture:Boolean=false):Boolean; function dispatchEvent(eventObject:Event):Boolean; function hasEventListener(eventName:String):Boolean; function willTrigger(eventName:String):Boolean; } }

A API do Flash Player implementa a interface IEventDispatcher com a classe EventDispatcher, que serve como base para todas as classes que podem ser destinos de evento ou fazer parte de um fluxo de evento. Por exemplo, a classe DisplayObject herdada da classe EventDispatcher. Isso significa que todos os objetos da lista de exibio tm acesso aos mtodos da interface IEventDispatcher. Adio de ouvintes de evento O mtodo addEventListener() a fora motriz da interface IEventDispatcher. Voc pode us-lo para registrar suas funes de ouvinte. Os dois parmetros necessrios so type e listener. Use o parmetro type para especificar o tipo de evento. Use o parmetro listener para especificar a funo de ouvinte que ser executada quando o evento ocorrer. O parmetro listener pode ser uma referncia a um mtodo de classe ou funo. Nota: No use parnteses ao especificar o parmetro listener. Por exemplo, a funo clickHandler() especificada sem parnteses na seguinte chamada do mtodo addEventListener(): Nota: addEventListener(MouseEvent.CLICK, clickHandler). O parmetro useCapture do mtodo addEventListener() permite controlar a fase do fluxo de evento na qual o ouvinte estar ativo. Se useCapture for definido como true, o ouvinte estar ativo durante a fase de captura do fluxo de evento. Se useCapture for definido como false, o ouvinte estar ativo durante as fases de destinos e de bubbling do fluxo de evento. Para ouvir um evento durante todas as fases do fluxo de evento, chame addEventListener() duas vezes, uma com useCapture definido como true e outra com useCapture definido como false.

PROGRAMAO DO ACTIONSCRIPT 3.0 266


Manipulao de eventos

O parmetro priority do mtodo addEventListener() no uma parte oficial do modelo de evento DOM nvel 3. Ele est includo no ActionScript 3.0 para fornecer mais flexibilidade para organizar os ouvintes de evento. Ao chamar addEventListener(), voc pode definir a prioridade desse ouvinte de evento transmitindo um valor inteiro como o parmetro priority. O valor padro 0, mas possvel definir valores inteiros negativos ou positivos. Quanto maior o nmero, mais rapidamente o ouvinte de evento ser executado. Os ouvintes de evento com a mesma prioridade so executados na ordem em que foram adicionados, de modo que o ouvinte adicionado primeiro ser executado antes. O parmetro useWeakReference permite especificar se a referncia funo de ouvinte ser fraca ou normal. Se esse parmetro for definido como true, voc poder evitar situaes nas quais as funes de ouvinte persistem na memria mesmo quando no so mais necessrias. O Flash Player e o AIR usam uma tcnica chamada coleta de lixo para apagar da memria os objetos que no so mais usados. Um objeto no mais necessrio quando no existe nenhuma referncia a ele. O coletor de lixo ignora as referncias fracas e, desse modo, uma funo de ouvinte que tem apenas uma referncia fraca se qualifica para a coleta de lixo. Remoo de ouvintes de evento Voc pode usar o mtodo removeEventListener() para remover um ouvinte de evento que no mais necessrio. recomendado remover todos os ouvintes que no sero mais usados. Os parmetros necessrios incluem eventName e listener, que so os mesmos parmetros obrigatrios para o mtodo addEventListener(). No se esquea que possvel ouvir eventos durante todas as fases chamando addEventListener() duas vezes, uma com useCapture definido como true e outra definido como false. Para remover os dois ouvintes de evento, seria necessrio chamar removeEventListener() duas vezes, uma com useCapture definido como true e outra definido como false. Envio de eventos O mtodo dispatchEvent() pode ser usado por programadores avanados para enviar um objeto de evento personalizado para o fluxo de evento. O nico parmetro aceito por esse mtodo uma referncia a um objeto de evento, que deve ser uma ocorrncia da classe Event ou uma subclasse de Event. Assim que enviada, a propriedade target do objeto de evento definida como o objeto no qual dispatchEvent() foi chamado. Verificao de ouvintes de evento existentes Os dois mtodos finais da interface IEventDispatcher fornecem informaes teis sobre a existncia de ouvintes de evento. O mtodo hasEventListener() retornar true se um ouvinte de evento for encontrado para um tipo de evento especfico em um determinado objeto da lista de exibio. O mtodo willTrigger() tambm retornar true se um ouvinte for encontrado para um objeto especfico da lista de exibio, mas willTrigger() procurar ouvintes nesse objeto de exibio e em todos os ancestrais desse objeto em todas as fases do fluxo de evento.

PROGRAMAO DO ACTIONSCRIPT 3.0 267


Manipulao de eventos

Eventos de erro sem ouvintes


As excees, em vez dos eventos, so o principal mecanismo de manipulao de erros no ActionScript 3.0, mas a manipulao de excees no funciona para operaes assncronas, como o carregamento de arquivos. Se ocorrer um erro durante uma operao assncrona, o Flash Player e o AIR enviaro um objeto de evento de erro. Se nenhum ouvinte for criado para o evento de erro, as verses do depurador do Flash Player e do AIR exibiro uma caixa de dilogo com informaes sobre o erro. Por exemplo, a verso do depurador do Flash Player exibe a caixa de dilogo a seguir, descrevendo o erro quando o aplicativo tentar carregar arquivos a partir de URLs invlidas:

A maioria dos eventos de erro baseia-se na classe ErrorEvent e, desse modo, tem uma propriedade chamada text que usada para armazenar a mensagem de erro exibida pelo Flash Player ou AIR. As duas excees so as classes StatusEvent e NetStatusEvent. Essas duas classes tm uma propriedade level (StatusEvent.level e NetStatusEvent.info.level). Quando o valor da propriedade level "error", esses tipos de evento so considerados eventos de erro. Um evento de erro no interrompe a execuo do arquivo SWF. Ele ser manifestado somente como uma caixa de dilogo nas verses do depurador dos plug-ins do navegador e de players dedicados, como uma mensagem no painel de sada do player de criao e como uma entrada no arquivo de log do Adobe Flex Builder 3. Ele no ser manifesto de modo algum nas verses do Flash Player ou AIR.

Exemplo: Alarm Clock


O exemplo do Alarm Clock consiste em um relgio que permite que o usurio especifique um horrio no qual o alarme deve ser desativado, bem como uma mensagem a ser exibida nesse horrio. O exemplo do Alarm Clock baseia-se no aplicativo SimpleClock da seo Trabalho com datas e horas na pgina 134 e ilustra vrios aspectos do trabalho com eventos ActionScript 3.0, incluindo:

Como ouvir e responder a um evento Notificao de um evento aos ouvintes Criao de um tipo de evento personalizado
Para obter os arquivos de aplicativo desse exemplo, consulte www.adobe.com/go/learn_programmingAS3samples_flash_br. Os arquivos do aplicativo Alarm Clock esto localizados na pasta Amostras/AlarmClock. O aplicativo inclui estes arquivos:

PROGRAMAO DO ACTIONSCRIPT 3.0 268


Manipulao de eventos

Arquivo AlarmClockApp.mxml ou AlarmClockApp.fla com/example/programmingas3/clock/AlarmClock.as

Descrio O arquivo principal do aplicativo no Flash (FLA) ou no Flex (MXML).

Uma classe que estende a classe SimpleClock, adicionando a funcionalidade do despertador. Uma classe de evento personalizada (uma subclasse de flash.events.Event) que serve como objeto do evento alarm da classe AlarmClock. Desenha a superfcie de um relgio redondo e os ponteiros de horas, minutos e segundos com base na hora (descrito no exemplo de SimpleClock). Um componente da interface do relgio com um recurso simples de marcao da hora (descrito no exemplo de SimpleClock).

com/example/programmingas3/clock/AlarmEvent.as

com/example/programmingas3/clock/AnalogClockFace.as

com/example/programmingas3/clock/SimpleClock.as

Viso geral do Alarm Clock


O principal recurso do relgio neste exemplo, incluindo o controle da hora e a exibio da superfcie do relgio, reutiliza o cdigo do aplicativo SimpleClock, descrito em Exemplo: relgio analgico simples na pgina 139. A classe AlarmClock estende a classe SimpleClock desse exemplo, adicionando a funcionalidade necessria para um despertador, incluindo a definio da hora do alarme e do envio da notificao quando o alarme for desativado. Os eventos so gerados para enviar a notificao sobre algo ocorrido. A classe AlarmClock expe o evento Alarm, que outros objetos podem ouvir para executar as aes desejadas. Alm disso, a classe AlarmClock usa uma ocorrncia da classe Timer para determinar quando o alarme deve ser acionado. Assim como AlarmClock, a classe Timer gera um evento para notificar outros objetos (neste caso, uma ocorrncia de AlarmClock) aps um determinado perodo. Assim como a maioria dos aplicativos do ActionScript, os eventos formam uma parte importante da funcionalidade do aplicativo Alarm Clock de exemplo.

Acionamento do alarme
Conforme mencionado anteriormente, a nica funcionalidade da classe AlarmClock est relacionada com a definio e o acionamento do alarme. A classe incorporada Timer (flash.utils.Timer) permite que o desenvolvedor defina o cdigo que ser executado aps o perodo especificado. A classe AlarmClock usa uma ocorrncia de Timer para determinar quando o alarme deve ser desativado.

PROGRAMAO DO ACTIONSCRIPT 3.0 269


Manipulao de eventos

import flash.events.TimerEvent; import flash.utils.Timer; /** * The Timer that will be used for the alarm. */ public var alarmTimer:Timer; ... /** * Instantiates a new AlarmClock of a given size. */ public override function initClock(faceSize:Number = 200):void { super.initClock(faceSize); alarmTimer = new Timer(0, 1); alarmTimer.addEventListener(TimerEvent.TIMER, onAlarm); }

A ocorrncia de Timer definida na classe AlarmClock chama-se alarmTimer. O mtodo initClock(), que executa as operaes de configurao necessrias para a ocorrncia de AlarmClock, faz duas coisas com a varivel alarmTimer. Primeiro, a varivel percorrida com os parmetros que instruem a ocorrncia de Timer a aguardar 0 milissegundos e acionar o evento timer apenas uma vez. Depois de percorrer alarmTimer, o cdigo chama o mtodo addEventListener() da varivel para indicar se deseja ouvir o evento timer dessa varivel. Uma ocorrncia de Timer funciona enviando o evento timer aps um perodo especificado. A classe AlarmClock no precisa saber quando o evento timer enviado para desativar seu prprio alarme. Chamando addEventListener(), o cdigo de AlarmClock se auto-registra como ouvinte em alarmTimer. Os dois parmetros indicam que a classe AlarmClock deseja ouvir o evento timer (indicado pela constante TimerEvent.TIMER) e que, quando o evento ocorrer, o mtodo onAlarm() da classe AlarmClock deve ser chamado em resposta a esse evento. Para definir o alarme realmente, o mtodo setAlarm() da classe AlarmClock chamado do seguinte modo:

PROGRAMAO DO ACTIONSCRIPT 3.0 270


Manipulao de eventos

/** * Sets the time at which the alarm should go off. * @param hour The hour portion of the alarm time. * @param minutes The minutes portion of the alarm time. * @param message The message to display when the alarm goes off. * @return The time at which the alarm will go off. */ public function setAlarm(hour:Number = 0, minutes:Number = 0, message:String = "Alarm!"):Date { this.alarmMessage = message; var now:Date = new Date(); // Create this time on today's date. alarmTime = new Date(now.fullYear, now.month, now.date, hour, minutes); // Determine if the specified time has already passed today. if (alarmTime <= now) { alarmTime.setTime(alarmTime.time + MILLISECONDS_PER_DAY); } // Stop the alarm timer if it's currently set. alarmTimer.reset(); // Calculate how many milliseconds should pass before the alarm should // go off (the difference between the alarm time and now) and set that // value as the delay for the alarm timer. alarmTimer.delay = Math.max(1000, alarmTime.time - now.time); alarmTimer.start(); return alarmTime; }

Esse mtodo faz vrias coisas, como armazenar a mensagem do alarme e criar um objeto Date (alarmTime) que representa o momento real em que o alarme desativado. O mais importante nisto tudo, nas vrias linhas finais do mtodo, o fato de o objeto timer da varivel alarmTimer ser definido e ativado. Primeiro, o mtodo reset() chamado, interrompendo o cronmetro e redefinindo-o caso j esteja em execuo. Em seguida, o horrio atual (representado pela varivel now) subtrado do valor da varivel alarmTime para determinar quantos milissegundos devem se passar at o alarme ser desativado. A classe Timer no aciona o evento timer em um tempo absoluto, de modo que essa diferena relativa de tempo atribuda propriedade delay de alarmTimer. Finalmente, o mtodo start() chamado para iniciar o cronmetro realmente. Assim que o perodo especificado termina, alarmTimer envia o evento timer. Com a classe AlarmClock registrou o mtodo onAlarm() como um ouvinte desse evento, quando o evento timer acontece, onAlarm() chamado.
/** * Called when the timer event is dispatched. */ public function onAlarm(event:TimerEvent):void { trace("Alarm!"); var alarm:AlarmEvent = new AlarmEvent(this.alarmMessage); this.dispatchEvent(alarm); }

PROGRAMAO DO ACTIONSCRIPT 3.0 271


Manipulao de eventos

Um mtodo que registrado como ouvinte de evento deve ser definido com a assinatura apropriada (isto , o conjunto de parmetros e o tipo de retorno do mtodo). Para ser ouvinte do evento timer da classe Timer, um mtodo deve definir um parmetro cujo tipo de dados seja TimerEvent (flash.events.TimerEvent), uma subclasse de Event. Quando chama seus ouvintes de evento, a ocorrncia de Timer transmite uma ocorrncia de TimerEvent como objeto de evento.

Notificao do alarme a outros


Assim como a classe Timer, a classe AlarmClock fornece um evento que permite que outros cdigos recebam notificaes quando o alarme desativado. Para que uma classe use a estrutura de manipulao de eventos incorporada no ActionScript, essa classe deve implementar a interface flash.events.IEventDispatcher. Normalmente, isso feito por meio da extenso da classe flash.events.EventDispatcher, que fornece uma implementao padro de IEventDispatcher (ou por meio da extenso de uma das subclasses de EventDispatcher). Conforme descrito anteriormente, a classe AlarmClock estende a classe SimpleClock que, por sua vez, estende a classe Sprite, que (por meio de uma cadeia de herana) estende a classe EventDispatcher. Tudo isso significa que a classe AlarmClock j tem uma funcionalidade interna para fornecer seus prprios eventos. Outro cdigo pode ser registrado para ser notificado sobre o evento alarm da classe AlarmClock chamando o mtodo addEventListener() que AlarmClock herda de EventDispatcher. Quando uma ocorrncia de AlarmClock est pronta para notificar outro cdigo sobre a gerao do evento alarm, o mtodo dispatchEvent(), que tambm herdado de EventDispatcher, chamado.
var alarm:AlarmEvent = new AlarmEvent(this.alarmMessage); this.dispatchEvent(alarm);

Essas linhas de cdigo foram obtidas do mtodo onAlarm() da classe AlarmClock (mostrada por completo antes). O mtodo dispatchEvent() da ocorrncia de AlarmClock chamado e notifica todos os ouvintes registrados sobre o acionamento do evento alarm da ocorrncia de AlarmClock. O parmetro transmitido para dispatchEvent() o objeto de evento que ser transmitido junto com os mtodos de ouvinte. Nesse caso, uma ocorrncia da classe AlarmEvent, uma subclasse de Event criada especificamente para este exemplo.

Fornecimento de um evento de alarme personalizado


Todos os ouvintes de evento recebem um parmetro de objeto de evento com informaes sobre o evento especfico que est sendo acionado. Em muitos casos, o objeto de evento uma ocorrncia da classe Event. No entanto, em alguns casos til fornecer informaes adicionais aos ouvintes de evento. Conforme descrito anteriormente neste captulo, uma maneira comum de fazer isso definir uma nova classe, uma subclasse de Event, e usar uma ocorrncia dessa classe como objeto de evento. Neste exemplo, uma ocorrncia de AlarmEvent usada como objeto quando o evento alarm da classe AlarmClock enviado. A classe AlarmEvent, mostrada aqui, fornece informaes adicionais sobre o evento alarm, especificamente a mensagem de alarme:

PROGRAMAO DO ACTIONSCRIPT 3.0 272


Manipulao de eventos

import flash.events.Event; /** * This custom Event class adds a message property to a basic Event. */ public class AlarmEvent extends Event { /** * The name of the new AlarmEvent type. */ public static const ALARM:String = "alarm"; /** * A text message that can be passed to an event handler * with this event object. */ public var message:String; /** *Constructor. *@param message The text to display when the alarm goes off. */ public function AlarmEvent(message:String = "ALARM!") { super(ALARM); this.message = message; } ... }

A melhor maneira de criar uma classe de objeto de evento personalizada definir uma classe que estende a classe Event, como mostrou o exemplo anterior. Para complementar a funcionalidade herdada, a classe AlarmEvent define uma propriedade message que contm o texto da mensagem de alarme associada ao evento; o valor de message transmitido como um parmetro no construtor AlarmEvent. A classe AlarmEvent tambm define a constante ALARM, que pode ser usada para fazer referncia ao evento especfico (alarm) ao chamar o mtodo addEventListener() da classe AlarmClock. Alm de adicionar a funcionalidade personalizada, cada subclasse de Event deve substituir o mtodo clone() herdado como parte da estrutura de manipulao de eventos do ActionScript. As subclasses de Event tambm podem substituir o mtodo toString() herdado para incluir as propriedades do evento personalizado no valor retornado quando o mtodo toString() chamado.

PROGRAMAO DO ACTIONSCRIPT 3.0 273


Manipulao de eventos

/** * Creates and returns a copy of the current instance. * @return A copy of the current instance. */ public override function clone():Event { return new AlarmEvent(message); } /** * Returns a String containing all the properties of the current * instance. * @return A string representation of the current instance. */ public override function toString():String { return formatToString("AlarmEvent", "type", "bubbles", "cancelable", "eventPhase", "message"); }

O mtodo clone() substitudo precisa retornar uma nova ocorrncia da subclasse personalizada de Event, com todas as propriedades personalizadas definidas para corresponder ocorrncia atual. No mtodo toString() substitudo, o mtodo de utilitrio formatToString() (herdado de Event) usado para fornecer uma string com o nome do tipo personalizado, bem como nomes e valores de todas as propriedades.

274

Captulo 13: Programao de exibio


A programao de exibio do Adobe ActionScript 3.0 permite que voc trabalhe com elementos que aparecem no palco do Adobe Flash Player ou do AdobeAIR. Este captulo descreve os conceitos bsicos do trabalho com elementos da tela. Voc aprender detalhes sobre como organizar os elementos visuais de modo programtico. Voc tambm aprender a criar suas prprias classes personalizadas para objetos de exibio.

Noes bsicas sobre a programao de exibio


Introduo programao de exibio
Cada aplicativo desenvolvido no ActionScript 3.0 tem uma hierarquia de objetos exibidos, conhecida como lista de exibio, apresentada a seguir. A lista de exibio contm todos os elementos visveis do aplicativo.
Palco Stage

Ocorrncia da classe principal do arquivo SWF

Objeto Display

Continer do objeto Display

Continer do objeto Display

Objeto Display

Continer do objeto Display

Objeto Display

Continer do objeto Display

PROGRAMAO DO ACTIONSCRIPT 3.0 275


Programao de exibio

Conforme mostrado na ilustrao, os elementos de exibio podem pertencer a um ou mais dos seguintes grupos:

O Palco
O Palco o continer bsico de objetos de exibio. Cada aplicativo tem um objeto Stage, que contm todos os objetos de exibio da tela. O Palco o continer de nvel superior e est no topo da hierarquia da lista de exibio: Cada arquivo SWF tem uma classe ActionScript associada, conhecida como a classe principal do arquivo SWF. Quando abre um arquivo SWF em uma pgina HTML, o Flash Player chama a funo do construtor dessa classe e a ocorrncia criada (que sempre um tipo do objeto de exibio) adicionada como filho do objeto Stage. A classe principal de um arquivo SWF sempre amplia a classe Sprite (para obter mais informaes, consulte Vantagens da abordagem da lista de exibio na pgina 279). Voc pode acessar o palco por meio da propriedade stage de qualquer ocorrncia de DisplayObject. Para obter mais informaes, consulte Configurao de propriedades do palco na pgina 287.

Objetos de exibio
No ActionScript 3.0, todos os elementos que aparecem na tela de um aplicativo so tipos de objetos de exibio. O pacote flash.display contm uma classe DisplayObject, que uma classe base estendida por uma srie de outras classes. Essas classes diferentes representam tipos diferentes de objetos de exibio, como formas vetoriais, clipes de filme e campos de texto, entre outros. Para obter uma viso geral dessas classes, consulte Vantagens da abordagem da lista de exibio na pgina 279.

Contineres de objeto de exibio


Os contineres so tipos especiais de objeto de exibio que, alm de ter sua prpria representao visual, podem conter objetos filho que tambm so objetos de exibio. A classe DisplayObjectContainer uma subclasse da classe DisplayObject. Um objeto DisplayObjectContainer pode conter vrios objetos de exibio em sua lista defilhos. Por exemplo, a ilustrao a seguir mostra um tipo de objeto DisplayObjectContainer conhecido como Sprite que contm vrios objetos de exibio:
A

A. Um objeto SimpleButton. Esse tipo de objeto de exibio tem estados up, down e over diferentes. B. Um objeto Bitmap. Nesse caso, o objeto Bitmap foi carregado a partir de um JPEG externo por meio de um objeto Loader. C. Um objeto Shape. O quadro de imagem contm um retngulo arredondado que desenhado no ActionScript. Esse objeto Shape tem o filtro Sombra projetada aplicado. D. Um objeto TextField.

No mbito da discusso sobre objetos de exibio, os objetos DisplayObjectContainer tambm so conhecidos como contineres de objeto de exibio ou simplesmente contineres. Conforme mencionado anteriormente, o palco um continer de objetos de exibio.

PROGRAMAO DO ACTIONSCRIPT 3.0 276


Programao de exibio

Embora todos os objetos de exibio visveis sejam herdados da classe DisplayObject, o tipo de cada um de uma subclasse especfica da classe DisplayObject. Por exemplo, existe uma funo de construtor para as classes Shape ou Video, mas no existe nenhum funo assim para a classe DisplayObject.

Tarefas comuns de programao de exibio


Como grande parte da programao do ActionScript envolve a criao e a manipulao de elementos visuais, existem diversas tarefas relacionadas programao de exibio. Este captulo descreve as tarefas comuns que se aplicam a todos os objetos de exibio, incluindo:

Trabalho com a lista de exibio e os contineres de objeto de exibio Adio de objetos lista de exibio Remoo de objetos da lista de exibio Movimentao de objetos entre contineres de exibio Movimentao de objetos na frente ou atrs de outros objetos Trabalho com o palco Configurao da taxa de quadros Controle do dimensionamento do palco Trabalho com o modo de tela cheia Manipulao de eventos de objeto de exibio Posicionamento de objetos de exibio, incluindo a criao da interao de arrastar e soltar Redimensionamento, dimensionamento e rotao dos objetos de exibio Aplicao de modos de mesclagem, transformaes de cor e transparncia em objetos de exibio Mascaramento de objetos de exibio Animao de objetos de exibio Carregamento de contedo de exibio externo (como arquivos SWF ou imagens)
Os ltimos captulos deste manual descrevem tarefas adicionais para trabalhar com objetos de exibio. Essas tarefas incluem tarefas gerais e tarefas associadas a tipos especficos de objetos de exibio:

Desenho de grficos vetoriais com o ActionScript nos objetos de exibio, descrito em Uso de objetos visuais na
pgina 322

Aplicao de transformaes geomtricas em objetos de exibio, descrito em Trabalho com geometria na


pgina 342

Aplicao de efeitos de filtro grfico como desfoque, brilho e sombra projetada em objetos de exibio, descrito em
Filtro de objetos de exibio na pgina 354

Trabalho com caractersticas especficas de clipes de filme, descrito em Trabalho com clipes de filme na
pgina 408

Trabalho com objetos TextField, descrito em Trabalho com texto na pgina 434 Trabalho com grficos de bitmap, descrito em Trabalho com bitmaps na pgina 485 Trabalho com elementos de vdeo, descrito em Trabalho com vdeo na pgina 527

PROGRAMAO DO ACTIONSCRIPT 3.0 277


Programao de exibio

Conceitos e termos importantes


A lista de referncia a seguir contm termos importantes usados neste captulo:

Alfa: o valor de cor que representa a quantidade de transparncia (melhor dizendo, a quantidade de opacidade) de
uma cor. Por exemplo, uma cor com um canal alfa de 60% mostra apenas 60% de sua intensidade total e 40% transparente.

Grfico de bitmap: um elemento grfico que definido no computador como uma grade (linhas e colunas) de pixels
coloridos. Em geral, os grficos de bitmap incluem fotos digitais e imagens similares.

Modo de mesclagem: uma especificao de como o contedo de duas imagens sobrepostas deve interagir.
Normalmente, uma imagem opaca em cima de outra imagem simplesmente bloqueia a imagem subjacente para que no fique visvel; no entanto, modos de mesclagem diferentes fazem com que as cores das imagens se misturem de formas diferentes, de modo que o contedo resultante alguma combinao das duas imagens.

Lista de exibio: a hierarquia de objetos de exibio que ser renderizada como o contedo visvel na tela pelo Flash
Player e pelo AIR. O palco a raiz da lista de exibio e todos os objetos de exibio anexados ao palco ou a um de seus filhos formam a lista de exibio (mesmo que o objeto no seja realmente renderizado, por exemplo, se estiver fora dos limites do palco).

Objeto de exibio: um objeto que representa algum tipo de contedo visual no Flash Player ou no AIR. Apenas
objetos de exibio podem ser includos na lista de exibio e todas as classes desses objetos so subclasses de DisplayObject.

Continer de objeto de exibio: um tipo especial de objeto de exibio que pode conter objetos de exibio filhos
alm de (geralmente) ter sua prpria representao visual.

Classe principal do arquivo SWF: classe que define o comportamento do objeto de exibio mais externo de um
arquivo SWF e que, conceitualmente, a classe do prprio arquivo SWF. Por exemplo, um SWF criado no Flash tem uma linha do tempo principal que contm todas as outras linhas do tempo; a classe principal do arquivo SWF a classe da qual a linha do tempo principal uma ocorrncia.

Mascaramento: tcnica para ocultar algumas partes de uma imagem (ou de exibir apenas algumas partes da
imagem). As partes mascaradas da imagem ficam transparentes, de modo que o contedo subjacente exibido. O termo est relacionado fita isolante do pintor que usada para impedir que algumas reas sejam pintadas.

Palco: o continer visual que a base ou o plano de fundo de todo o contedo visual de um SWF. Transformao: ajuste de uma caracterstica visual de um grfico como a rotao do objeto, a alterao da escala, a
inclinao ou distoro da forma ou a alterao da cor.

Grfico vetorial: elemento grfico que definido no computador como linhas e formas desenhadas com
caractersticas especficas (como espessura, comprimento, tamanho, ngulo e posio).

Teste dos exemplos do captulo


Talvez voc queira testar algumas das listagens de cdigo de exemplo por si prprio, durante a leitura deste captulo. Como este captulo trata da criao e da manipulao do contedo visual, basicamente todas as listagens de cdigo mencionadas criam objetos visuais e os exibem na tela; o teste do exemplo envolve a visualizao do resultado no Flash Player ou no AIR, em vez da visualizao de valores de variveis como nos captulos anteriores. Para testar as listagens de cdigo deste captulo:
1 Criar um documento vazio usando a ferramenta de autoria do Flash 2 Selecione um quadro-chave na Linha de tempo. 3 Abra o painel Aes e copie a listagem de cdigo no painel Script. 4 Execute o programa usando o comando Controlar > Testar filme.

PROGRAMAO DO ACTIONSCRIPT 3.0 278


Programao de exibio

Voc ver os resultados do cdigo exibidos na tela e todas as chamadas da funo trace() sero exibidas no painel Sada. As tcnicas para testar listagens de cdigo de exemplo so detalhadas em Teste de listagens de cdigo de exemplo dos captulos na pgina 36.

Principais classes de exibio


O pacote flash.display do ActionScript 3.0 inclui classes para objetos visuais que podem aparecer no Flash Player ou no AIR. A ilustrao a seguir mostra as relaes de subclasse dessas classes principais de objeto de exibio.
DisplayObject

AVM1Movie

Bitmap

InteractiveObject

MorphShape

Shape

StaticText

Video

DisplayObjectContainer SimpleButton

TextField

Loader

Sprite

Stage

MovieClip

A ilustrao mostra a herana das classes de objeto de exibio. Algumas dessas classes, especificamente StaticText, TextField e Video, no esto no pacote flash.display, mas ainda so herdadas da classe DisplayObject. Todas as classes derivadas de DisplayObject herdam seus mtodos e propriedades. Para obter mais informaes, consulte Propriedades e mtodos da classe DisplayObject na pgina 282. possvel percorrer os objetos das seguintes classes contidas no pacote flash.display:

Bitmap - A classe Bitmap pode ser usada para definir objetos de bitmap, carregados a partir de arquivos externos
ou renderizados pelo ActionScript. possvel carregar bitmaps a partir de arquivos externos por meio da classe Loader. possvel carregar arquivos GIF, JPG ou PNG. Alm disso, voc pode criar um objeto BitmapData com dados personalizados e criar um objeto Bitmap que usa esses dados. Voc pode usar os mtodos da classe BitmapData para alterar bitmaps, sejam eles carregados ou criados no ActionScript. Para obter mais informaes, consulte Carregamento de objetos de exibio na pgina 313 e Trabalho com bitmaps na pgina 485.

Loader - A classe Loader pode ser usada para carregar ativos externos (arquivos SWF ou elementos grficos). Para
obter mais informaes, consulte Carregamento dinmico do contedo da exibio na pgina 313.

Shape - A classe Shape pode ser usada para criar grficos vetoriais, como retngulos, linhas, crculos e assim por
diante. Para obter mais informaes, consulte Uso de objetos visuais na pgina 322.

SimpleButton - Um objeto SimpleButton a representao do ActionScript do smbolo de um boto criado com a


ferramenta de autoria do Flash. Uma ocorrncia de SimpleButton tem quatro estados de boto: para cima, para baixo, por cima e teste de ocorrncia (a rea que responde aos eventos de mouse e de teclado).

PROGRAMAO DO ACTIONSCRIPT 3.0 279


Programao de exibio

Sprite - Um objeto Sprite pode conter grficos prprios e objetos de exibio filho. A classe Sprite estende a classe
DisplayObjectContainer. Para obter mais informaes, consulte Trabalho com contineres de objeto de exibio na pgina 282 e Uso de objetos visuais na pgina 322.

MovieClip - Um objeto MovieClip a forma atribuda pelo ActionScript a um smbolo de clipe de filme criado com
a ferramenta de autoria do Flash. Na prtica, o objeto MovieClip similar a um objeto Sprite, mas tambm tem uma linha do tempo. Para obter mais informaes, consulte Trabalho com clipes de filme na pgina 408. As classes a seguir, que no esto no pacote flash.display, so subclasses de DisplayObject:

A classe TextField, includa no pacote flash.text, um objeto de exibio para entrada e exibio de texto. Para obter
mais informaes, consulte Trabalho com texto na pgina 434.

A classe Video, includa no pacote flash.media, um objeto de exibio usado para exibir arquivos de vdeo. Para
obter mais informaes, consulte Trabalho com vdeo na pgina 527. As seguintes classes do pacote flash.display estendem a classe DisplayObject, mas no possvel criar ocorrncias delas. Em vez disso, elas servem como classes pai para outros objetos de exibio, combinando funcionalidades comuns em uma nica classe.

AVM1Movie - A classe AVM1Movie usada para representar arquivos SWF carregados que so criados no
ActionScript 1.0 e 2.0.

DisplayObjectContainer - As classes Loader, Stage, Sprite e MovieClip estendem a classe DisplayObjectContainer.


Para obter mais informaes, consulte Trabalho com contineres de objeto de exibio na pgina 282.

InteractiveObject - InteractiveObject a classe base de todos os objetos usados para interagir com o mouse e o
teclado. Os objetos SimpleButton, TextField, Loader, Sprite, Stage e MovieClip so subclasses de InteractiveObject. Para obter mais informaes sobre como criar a interao do mouse e do teclado, consulte Captura da entrada do usurio na pgina 600.

MorphShape - Esses objetos so criados quando voc cria uma interpolao de forma na ferramenta de criao do
Flash. No possvel percorr-los usando o ActionScript, mas possvel acess-los a partir da lista de exibio.

Stage - A classe Stage estende a classe DisplayObjectContainer. Existe uma ocorrncia de Stage em cada aplicativo,
que fica no topo da hierarquia da lista de exibio. Para acessar o palco, use a propriedade stage de qualquer ocorrncia de DisplayObject. Para obter mais informaes, consulte Configurao de propriedades do palco na pgina 287. Alm disso, a classe StaticText do pacote flash.text estende a classe DisplayObject, mas no possvel criar uma ocorrncia dela no cdigo. Os campos de texto esttico s podem ser criados no Flash.

Vantagens da abordagem da lista de exibio


No ActionScript 3.0, existem classes separadas para diferentes tipos de objeto de exibio. No ActionScript 1.0 e 2.0, muitos objetos do mesmo tipo so includos em uma classe: a classe MovieClip. Essa individualizao de classes e a estrutura hierrquica das listas de exibio tm as seguintes vantagens:

Renderizao mais eficiente e menos uso da memria Melhor gerenciamento de profundidade Profundidade completa da lista de exibio Objetos de exibio fora da lista Facilidade de subclassificao dos objetos de exibio

PROGRAMAO DO ACTIONSCRIPT 3.0 280


Programao de exibio

Renderizao mais eficiente e arquivos menores


No ActionScript 1.0 e 2.0, voc pode desenhar formas somente em um objeto MovieClip. No ActionScript 3.0, existem classes de objeto de exibio mais simples nas quais possvel desenhar formas. Como essas classes de objeto de exibio do ActionScript 3.0 no incluem um conjunto completo de mtodos e propriedades como o objeto MovieClip, consomem menos recursos da memria e do processador. Por exemplo, cada objeto MovieClip inclui propriedades para a linha do tempo do clipe de filme, enquanto o objeto Shape no faz isso. As propriedades de gerenciamento da linha do tempo podem usar muitos recursos da memria e do processador. No ActionScript 3.0, usar o objeto Shape melhora o desempenho. O objeto Shape tem uma sobrecarga menor do que o objeto MovieClip mais complexo. O Flash Player e o AIR no precisam gerenciar propriedades MovieClip no utilizadas, o que melhora a velocidade e reduz a memria usada pelo objeto.

Melhor gerenciamento de profundidade


No ActionScript 1.0 e 2.0, a profundidade era gerenciada por um esquema linear e mtodos como getNextHighestDepth(). O ActionScript 3.0 inclui a classe DisplayObjectContainer, que tem mtodos e propriedades mais prticos para gerenciar a profundidade dos objetos de exibio. No ActionScript 3.0, ao mover um objeto de exibio para uma nova posio da lista de filhos de uma ocorrncia de DisplayObjectContainer, os outros filhos do continer de objeto de exibio so reposicionados automaticamente e designados nas posies de ndice secundrias apropriadas no continer. Alm disso, no ActionScript 3.0, sempre possvel detectar todos os objetos filho de qualquer continer de objeto de exibio. Cada ocorrncia de DisplayObjectContainer tem uma propriedade numChildren, que lista o nmero de filhos no continer de objeto de exibio. Como a lista de filhos de um continer de objeto de exibio sempre uma lista indexada, voc pode examinar todos os objetos da lista desde a posio 0 at a ltima posio de ndice (numChildren - 1). Isso no era possvel com os mtodos e as propriedades de um objeto MovieClip no ActionScript 1.0 e no 2.0. No ActionScript 3.0, voc pode percorrer com facilidade a lista de exibio na seqncia; no existe nenhuma falha nos nmeros de ndice de uma lista de filhos de um continer de objeto de exibio. Percorrer a lista de exibio e gerenciar a profundidade dos objetos muito mais fcil do que o que era permitido no ActionScript 1.0 e 2.0. No ActionScript 1.0 e 2.0, um clipe de filme podia ter objetos com lacunas intermitentes na ordem de profundidade, o que dificultava percorrer a lista de objetos. No ActionScript 3.0, cada lista de filhos de um continer de objeto de exibio armazenada em cache internamente como uma matriz, resultando em consultas muito rpidas (por ndice). Percorrer todos os filhos de um continer de objeto de exibio tambm muito rpido. No ActionScript 3.0, voc tambm pode acessar os filhos de um continer de objeto de exibio usando o mtodo
getChildByName() da classe DisplayObjectContainer.

Profundidade completa da lista de exibio


No ActionScript 1.0 e 2.0, no era possvel acessar alguns objetos, como formas vetoriais, que eram desenhados na ferramenta de criao do Flash. No ActionScript 3.0, voc pode acessar todos os objetos da lista de exibio - os criados com o ActionScript e todos os objetos criados na ferramenta de criao do Flash. Para obter detalhes, consulte Como percorrer a lista de exibio na pgina 286.

PROGRAMAO DO ACTIONSCRIPT 3.0 281


Programao de exibio

Objetos de exibio fora da lista


No ActionScript 3.0, voc pode criar objetos que no esto na lista de exibio visvel. So os chamados objetos de exibio fora da lista. Um objeto de exibio adicionado lista visvel somente quando voc chama o mtodo addChild() ou addChildAt() de uma ocorrncia de DisplayObjectContainer que j foi adicionada lista de exibio. Voc pode usar objetos de exibio fora da lista para montar objetos complexos, como os que tm vrios contineres com vrios objetos de exibio. Mantendo os objetos de exibio fora da lista, voc pode montar objetos complicados sem usar o tempo de processamento para renderizar esses objetos de exibio. Em seguida, voc pode adicionar um objeto fora da lista lista de exibio quando necessrio. Alm disso, possvel mover um filho de um continer de objeto de exibio na lista e fora dela e para qualquer posio desejada.

Facilidade de subclassificao dos objetos de exibio


No ActionScript 1.0 e 2.0, voc tinha que adicionar com freqncia novos objetos MovieClip a um arquivo SWF para criar formas bsicas ou exibir bitmaps. No ActionScript 3.0, a classe DisplayObject inclui muitas subclasses internas, como Shape e Bitmap. Como as classes do ActionScript 3.0 so mais especializadas para tipos especficos de objetos, mais fcil criar subclasses bsicas das classes internas. Por exemplo, para desenhar um crculo no ActionScript 2.0, era necessrio criar uma classe CustomCircle que estende a classe MovieClip quando um objeto da classe personalizada percorrido. No entanto, essa classe tambm inclua diversos mtodos e propriedades da classe MovieClip (como totalFrames) no apropriados. No ActionScript 3.0, entretanto, possvel criar uma classe CustomCircle que estende o objeto Shape e, desse modo, no inclui mtodos e propriedades no relacionados que esto contidos na classe MovieClip. O cdigo a seguir mostra um exemplo de uma classe CustomCircle:
import flash.display.*; public class CustomCircle extends Shape { var xPos:Number; var yPos:Number; var radius:Number; var color:uint; public function CustomCircle(xInput:Number, yInput:Number, rInput:Number, colorInput:uint) { xPos = xInput; yPos = yInput; radius = rInput; color = colorInput; this.graphics.beginFill(color); this.graphics.drawCircle(xPos, yPos, radius); } }

Trabalho com os objetos de exibio


Agora que voc j conhece os conceitos bsicos de palco, objetos de exibio, contineres de objeto de exibio e lista de exibio, esta seo fornece informaes mais especficas sobre como trabalhar com objetos de exibio no ActionScript 3.0.

PROGRAMAO DO ACTIONSCRIPT 3.0 282


Programao de exibio

Propriedades e mtodos da classe DisplayObject


Todos os objetos de exibio so subclasses de DisplayObject e, como tal, herda as propriedades e os mtodos da classe DisplayObject. As propriedades herdadas so bsicas e se aplicam a todos os objetos de exibio. Por exemplo, cada objeto de exibio tem uma propriedade x e uma propriedade y que especifica a posio do objeto no continer. No possvel criar uma ocorrncia de DisplayObject usando o construtor da classe DisplayObject. Voc deve criar outro tipo de objeto (que seja uma subclasse de DisplayObject), como Sprite, para percorrer um objeto com o operador new. Alm disso, se desejar criar uma classe personalizada de objeto de exibio, voc deve criar uma subclasse de uma das subclasses que tm uma funo de construtor til (como a classe Shape ou a classe Sprite). Para obter mais informaes, consulte a descrio da classe DisplayObject na Referncia dos componentes e da linguagem do ActionScript 3.0.

Adio de objetos lista de exibio


Ao ser percorrido, o objeto de exibio no aparece na tela (no palco) at que voc adicione a ocorrncia desse objeto a um continer que est na lista de exibio. Por exemplo, no cdigo a seguir, o objeto TextField myText no ficaria visvel se a ltima linha do cdigo fosse omitida. Na ltima linha do cdigo, a palavra-chave this deve fazer referncia a um continer j adicionado lista de exibio.
import flash.display.*; import flash.text.TextField; var myText:TextField = new TextField(); myText.text = "Buenos dias."; this.addChild(myText);

Quando algum elemento visual adicionado ao palco, esse elemento se transforma em filho do objeto Stage. O primeiro arquivo SWF carregado em um aplicativo (por exemplo, aquele incorporado em uma pgina HTML) adicionado automaticamente como filho do objeto Stage. Pode ser um objeto de qualquer tipo que estende a classe Sprite. Todos os objetos de exibio criados sem o ActionScript (por exemplo, por meio da insero de uma tag MXML no Adobe Flex Builder 3 ou da colocao de um item no palco do Flash) so adicionados lista de exibio. Embora esses objetos de exibio no sejam adicionados por meio do ActionScript, possvel acess-los usando o ActionScript. Por exemplo, o cdigo a seguir ajusta a largura de um objeto chamado button1 que foi inserido na ferramenta de criao (no por meio do ActionScript):
button1.width = 200;

Trabalho com contineres de objeto de exibio


Se um objeto DisplayObjectContainer for excludo da lista de exibio, ou movido ou transformado de algum modo, cada objeto de exibio de DisplayObjectContainer tambm ser excludo, movido ou transformado. Um continer um tipo de objeto de exibio propriamente dito e pode ser adicionado a outro continer. Por exemplo, a imagem a seguir mostra um continer de objeto de exibio, pictureScreen, que tem uma forma de contorno e outros quatro contineres (do tipo PictureFrame):

PROGRAMAO DO ACTIONSCRIPT 3.0 283


Programao de exibio

A. Uma forma que define a borda do continer de objeto de exibio pictureScreen B. Quatro contineres de objeto de exibio que so filhos do objeto pictureScreen

Para que um objeto aparea na lista de exibio, voc deve adicion-lo a um continer que esteja na lista. Para fazer isso, use o mtodo addChild() ou o mtodo addChildAt() do objeto de continer. Por exemplo, sem a linha final do cdigo a seguir, o objeto myTextField no seria exibido:
var myTextField:TextField = new TextField(); myTextField.text = "hello"; this.root.addChild(myTextField);

Nesse exemplo de cdigo, this.root aponta para o continer de objeto de exibio MovieClip que tem o cdigo. No seu cdigo real, voc pode especificar um continer diferente.

PROGRAMAO DO ACTIONSCRIPT 3.0 284


Programao de exibio

Use o mtodo addChildAt() para adicionar o filho a uma posio especfica na lista de filhos do continer de objeto de exibio. Essas posies de ndice baseadas em zero da lista de filhos esto relacionadas disposio em camadas (ordem da frente para trs) dos objetos de exibio. Por exemplo, considere os trs objetos de exibio a seguir. Cada objeto foi criado a partir de uma classe personalizada chamada Ball.

A disposio em camadas desses objetos de exibio no continer pode ser ajustada com o mtodo addChildAt(). Por exemplo, considere o seguinte cdigo:
ball_A = new Ball(0xFFCC00, "a"); ball_A.name = "ball_A"; ball_A.x = 20; ball_A.y = 20; container.addChild(ball_A); ball_B = new Ball(0xFFCC00, "b"); ball_B.name = "ball_B"; ball_B.x = 70; ball_B.y = 20; container.addChild(ball_B); ball_C = new Ball(0xFFCC00, "c"); ball_C.name = "ball_C"; ball_C.x = 40; ball_C.y = 60; container.addChildAt(ball_C, 1);

Depois que este cdigo executado, os objetos de exibio so posicionados do seguinte modo no objeto DisplayObjectContainer do continer. Observe a disposio em camadas dos objetos.

Para reposicionar um objeto na parte superior da lista de exibio, basta adicion-lo novamente lista. Por exemplo, depois do cdigo anterior, para mover ball_A at a parte superior da pilha, use esta linha do cdigo:
container.addChild(ball_A);

Este cdigo remove ball_A por completo do seu local na lista de exibio do continer e o adicionam novamente parte superior da lista, que equivale a mov-lo at a parte superior da pilha.

PROGRAMAO DO ACTIONSCRIPT 3.0 285


Programao de exibio

Voc pode usar o mtodo getChildAt() para verificar a ordem de camadas dos objetos de exibio. O mtodo getChildAt() retorna objetos filho de um continer com base no nmero de ndice fornecido. Por exemplo, o cdigo a seguir revela nomes de objetos de exibio em posies diferentes da lista de filhos do objeto DisplayObjectContainer do continer:
trace(container.getChildAt(0).name); // ball_A trace(container.getChildAt(1).name); // ball_C trace(container.getChildAt(2).name); // ball_B

Se voc remover um objeto de exibio da lista de filhos do continer pai, os elementos superiores da lista sero movidos para uma posio inferior no ndice filho. Por exemplo, continuando com o cdigo anterior, o cdigo a seguir mostra como o objeto de exibio que estava na posio 2 no DisplayObjectContainer do continer ser movido para a posio 1 se um objeto de exibio inferior da lista de filhos for removido:
container.removeChild(ball_C); trace(container.getChildAt(0).name); // ball_A trace(container.getChildAt(1).name); // ball_B

Os mtodos removeChild() e removeChildAt() no excluem uma ocorrncia de objeto de exibio por completo. Eles simplesmente a removem da lista de filhos do continer. A ocorrncia ainda pode ser mencionada por outra varivel. Use o operador delete para remover um objeto por completo. Como um objeto de exibio tem apenas um continer pai, voc pode adicionar uma ocorrncia de um objeto de exibio a somente um continer. Por exemplo, o cdigo a seguir mostra que o objeto de exibio tf1 pode existir em apenas um continer (nesse caso, um Sprite, que estende a classe DisplayObjectContainer):
tf1:TextField = new TextField(); tf2:TextField = new TextField(); tf1.name = "text 1"; tf2.name = "text 2"; container1:Sprite = new Sprite(); container2:Sprite = new Sprite(); container1.addChild(tf1); container1.addChild(tf2); container2.addChild(tf1); trace(container1.numChildren); // 1 trace(container1.getChildAt(0).name); // text 2 trace(container2.numChildren); // 1 trace(container2.getChildAt(0).name); // text 1

Se voc adicionar um objeto de exibio que est contido em um continer a outro continer, esse objeto ser removido da lista de filhos do primeiro continer. Alm dos mtodos descritos acima, a classe DisplayObjectContainer define vrios mtodos para trabalhar com objetos de exibio filho, incluindo os seguintes:

contains(): determina se um objeto de exibio filho de DisplayObjectContainer. getChildByName(): recupera um objeto de exibio por nome. getChildIndex(): retorna a posio de ndice de um objeto de exibio. setChildIndex(): altera a posio de um objeto de exibio filho. swapChildren(): alterna a ordem de frente para trs de dois objetos de exibio.

PROGRAMAO DO ACTIONSCRIPT 3.0 286


Programao de exibio

swapChildrenAt(): alterna a ordem de frente para trs de dois objetos de exibio, especificados pelos valores de

ndice. Para obter mais informaes, consulte as entradas relevantes na Referncia dos componentes e da linguagem do ActionScript 3.0. Lembre-se de que um objeto de exibio que est fora da lista (no includo em um continer de objeto de exibio que filho do objeto Stage) conhecido como objeto de exibio fora da lista.

Como percorrer a lista de exibio


Como voc observou, a lista de exibio uma estrutura de rvore. Na parte superior da rvore est o palco, que pode conter vrios objetos de exibio. Esses objetos que so contineres propriamente ditos podem ter outros objetos de exibio ou contineres.
Palco Stage

Ocorrncia da classe principal do arquivo SWF

Objeto Display

Continer do objeto Display

Continer do objeto Display

Objeto Display

Continer do objeto Display

Objeto Display

Continer do objeto Display

A classe DisplayObjectContainer inclui propriedades e mtodos para percorrer a lista de exibio por meio das listas de filhos dos contineres de objeto de exibio. Por exemplo, considere o cdigo a seguir, que adiciona dois objetos de exibio, title e pict, ao objeto container (que um Sprite; a classe Sprite estende a classe DisplayObjectContainer):
var container:Sprite = new Sprite(); var title:TextField = new TextField(); title.text = "Hello"; var pict:Loader = new Loader(); var url:URLRequest = new URLRequest("banana.jpg"); pict.load(url); pict.name = "banana loader"; container.addChild(title); container.addChild(pict);

PROGRAMAO DO ACTIONSCRIPT 3.0 287


Programao de exibio

O mtodo getChildAt() retorna o filho da lista de exibio em uma posio de ndice especfica:
trace(container.getChildAt(0) is TextField); // true

Voc tambm pode acessar objetos filho por nome. Cada objeto de exibio tem uma propriedade de nome e, se voc no design-la, o Flash Player ou AIR atribuir um valor padro, como "instance1". Por exemplo, o cdigo a seguir mostra como usar o mtodo getChildByName() para acessar um objeto de exibio filho com o nome "banana loader":
trace(container.getChildByName("banana loader") is Loader); // true

O mtodo getChildByName() piora mais o desempenho do que o mtodo getChildAt(). Como um continer de objeto de exibio pode ter outros contineres como objetos filho em sua lista de exibio, possvel percorrer a lista inteira do aplicativo como uma rvore. Por exemplo, no trecho de cdigo mostrado anteriormente, assim que a operao de carregamento do objeto pict Loader for concluda, o objeto pict ter um objeto de exibio filho, que o bitmap carregado. Para acessar esse objeto de exibio de bitmap, voc pode gravar pict.getChildAt(0). Voc tambm pode gravar container.getChildAt(0).getChildAt(0) (visto que container.getChildAt(0) == pict). A funo a seguir fornece uma sada trace() pretendida da lista de exibio a partir de um continer:
function traceDisplayList(container:DisplayObjectContainer,indentString:String = ""):void { var child:DisplayObject; for (var i:uint=0; i < container.numChildren; i++) { child = container.getChildAt(i); trace(indentString, child, child.name); if (container.getChildAt(i) is DisplayObjectContainer) { traceDisplayList(DisplayObjectContainer(child), indentString + "") } } }

Configurao de propriedades do palco


A classe Stage substitui a maioria das propriedades e dos mtodos da classe DisplayObject. Se um desses mtodos ou propriedades substitudos for chamado, o Flash Player e o AIR lanaro uma exceo. Por exemplo, o objeto Stage no tem as propriedades x ou y, pois sua posio fixa como o principal continer do aplicativo. As propriedades x e y fazem referncia posio de um objeto de exibio com relao ao seu continer e, como o objeto Stage no est contido em nenhum outro continer, essas propriedades no so aplicveis. Nota: Alguns mtodos e propriedades da classe Stage esto disponveis somente para objetos de exibio que esto na mesma caixa de proteo de segurana do primeiro arquivo SWF carregado. Para obter detalhes, consulte segurana de Palco na pgina 722. Controle da taxa de quadros de reproduo A propriedade framerate da classe Stage usada para definir a taxa de quadros de todos os arquivos SWF carregados no aplicativo. Para obter mais informaes, consulte a Referncia dos componentes e da linguagem do ActionScript 3.0.

PROGRAMAO DO ACTIONSCRIPT 3.0 288


Programao de exibio

Controle do dimensionamento do palco Quando uma parte da tela de representao do Flash Player ou do AIR redimensionada, o Flash Player ou o AIR ajusta o contedo do palco automaticamente para fazer uma compensao. A propriedade scaleMode da classe Stage determina como o contedo do palco ajustado. Essa propriedade pode ter quatro valores diferentes, definidos como constantes na classe flash.display.StageScaleMode. Para trs valores de scaleMode (StageScaleMode.EXACT_FIT, StageScaleMode.SHOW_ALL e StageScaleMode.NO_BORDER), o Flash Player e o AIR dimensionam o contedo do palco para ajust-lo dentro dos limites. O modo de dimensionamento diferente nessas trs opes:

StageScaleMode.EXACT_FIT dimensiona o SWFproporcionalmente. StageScaleMode.SHOW_ALL determina se uma borda deve aparecer, como as barras pretas que so exibidas ao

visualizar um filme em uma televiso de tela plana padro.


StageScaleMode.NO_BORDER determinase o contedo pode ser parcialmente cortado ou no.

Como alternativa, se scaleMode estiver definido como StageScaleMode.NO_SCALE, o contedo do palco mantm o tamanho definido quando o visualizador redimensiona a janela do Flash Player ou do AIR. Somente neste modo de escala, as propriedades stageWidth e stageHeight da classe Stage podem ser usadas para determinar as dimenses de pixel reais da janela redimensionada do Flash Player. Nos outros modos de escala, as propriedades stageWidth e stageHeight sempre refletem a largura e a altura originais do SWF. Alm disso, quando scaleMode definido como StageScaleMode.NO_SCALE e o arquivo SWF redimensionado, o evento resize da classe Stage enviado e permite fazer os ajustes adequados. Conseqentemente, definir scaleMode como StageScaleMode.NO_SCALE permite que voc tenha mais controle sobre o ajuste do contedo da tela para redimensionar a janela se desejar. Por exemplo, em um arquivo SWF que contm um vdeo e uma barra de controle, voc talvez queira que a barra de controle permanea do mesmo tamanho quando o palco for redimensionado e apenas o tamanho da janela do vdeo seja alterado para acomodar o novo tamanho do palco. Isso demonstrado no exemplo a seguir:

PROGRAMAO DO ACTIONSCRIPT 3.0 289


Programao de exibio

// videoScreen is a display object (e.g. a Video instance) containing a // video; it is positioned at the top-left corner of the Stage, and // it should resize when the SWF resizes. // // // // controlBar is a display object (e.g. a Sprite) containing several buttons; it should stay positioned at the bottom-left corner of the Stage (below videoScreen) and it should not resize when the SWF resizes. flash.display.Stage; flash.display.StageAlign; flash.display.StageScaleMode; flash.events.Event;

import import import import

var swfStage:Stage = videoScreen.stage; swfStage.scaleMode = StageScaleMode.NO_SCALE; swfStage.align = StageAlign.TOP_LEFT; function resizeDisplay(event:Event):void { var swfWidth:int = swfStage.stageWidth; var swfHeight:int = swfStage.stageHeight; // Resize the video window. var newVideoHeight:Number = swfHeight - controlBar.height; videoScreen.height = newVideoHeight; videoScreen.scaleX = videoScreen.scaleY; // Reposition the control bar. controlBar.y = newVideoHeight; } swfStage.addEventListener(Event.RESIZE, resizeDisplay);

Trabalho com o modo de tela cheia O modo de tela cheia permite que voc configure o palco de um filme para preencher todo o monitor do visualizador, sem nenhuma borda ou menu de continer. A propriedade displayState da classe Stage usada para ativar e desativar o modo de tela cheia para um SWF. A propriedade displayState pode ser configurada como um dos valores definidos pelas constantes da classe flash.display.StageDisplayState. Para ativar o modo de tela cheia, defina displayState como StageDisplayState.FULL_SCREEN:
// Send the stage to full-screen in ActionScript 3.0 stage.displayState = StageDisplayState.FULL_SCREEN; // Exit full-screen mode in ActionScript 3.0 stage.displayState = StageDisplayState.NORMAL; // Send the stage to full-screen in ActionScript 2.0 Stage.displayState = "fullScreen"; // Exit full-screen mode in ActionScript 2.0 Stage.displayState = "normal";

Alm disso, o usurio pode optar por sair do modo de tela cheia alternando o foco para uma janela diferente ou usando uma de vrias combinaes de tecla: a tecla Esc (todas as plataformas), Ctrl-W (Windows), Command-W (Mac) ou Alt-F4 (Windows).

PROGRAMAO DO ACTIONSCRIPT 3.0 290


Programao de exibio

O comportamento de dimensionamento do palco para o modo de tela cheia igual ao de um modo normal; o dimensionamento controlado pela propriedade scaleMode da classe Stage. Se a propriedade scaleMode estiver definida como StageScaleMode.NO_SCALE, as propriedades stageWidth e stageHeight da classe Stage sero alteradas para refletir o tamanho da rea da tela ocupado pelo SWF (a tela inteira, nesse caso); se for visualizado no navegador, o parmetro HTML controlar a configurao. Voc pode usar o evento fullScreen da classe Stage para detectar e responder quando o modo de tela cheia est ativado ou desativado. Por exemplo, voc talvez queira reposicionar, adicionar ou remover itens da tela ao acessar ou sair do modo de tela cheia, como mostra este exemplo:
import flash.events.FullScreenEvent; function fullScreenRedraw(event:FullScreenEvent):void { if (event.fullScreen) { // Remove input text fields. // Add a button that closes full-screen mode. } else { // Re-add input text fields. // Remove the button that closes full-screen mode. } } mySprite.stage.addEventListener(FullScreenEvent.FULL_SCREEN, fullScreenRedraw);

Como mostra este cdigo, o objeto do evento fullScreen uma ocorrncia da classe flash.events.FullScreenEvent, que inclui uma propriedade fullScreen que indica se o modo de tela cheia est ativado (true) ou no (false). Ao trabalhar com o modo de tela cheia no ActionScript, considere o seguinte:

No Flash Player, o modo de tela cheia s pode ser iniciado por meio do ActionScript em resposta a um clique do
mouse (incluindo o clique com o boto direito) ou pressionamento de tecla. O contedo do AIR em execuo na caixa de proteo de segurana do aplicativo no requer a ativao do modo de tela cheia em resposta a um gesto do usurio.

Para usurios com vrios monitores, o contedo do SWF ser expandido para preencher apenas um monitor. O
Flash Player e o AIR usam uma mtrica para determinar qual monitor contm a maior parte do SWF e usam esse monitor para o modo de tela cheia.

Para um arquivo SWF incorporado em uma pgina HTML, o cdigo HTML a ser incorporado no Flash Player deve
incluir uma tag param e o atributo embed com o nome allowFullScreen e o valor true, do seguinte modo:
<object> ... <param name="allowFullScreen" value="true" /> <embed ... allowfullscreen="true" /> </object>

Se estiver usando JavaScript em uma pgina da Web para gerar as tags incorporadas no SWF, altere o JavaScript para adicionar a tag allowFullScreen param e o atributo. Por exemplo, se a pgina HTML usa a funo AC_FL_RunContent() (que usada pelas pginas HTML geradas pelo Flex Builder e pelo Flash), adicione o parmetro allowFullScreen a essa chamada de funo do seguinte modo:

PROGRAMAO DO ACTIONSCRIPT 3.0 291


Programao de exibio

AC_FL_RunContent( ... 'allowFullScreen','true', ... ); //end AC code

Isso no se aplica aos arquivos SWF em execuo no Flash Player autnomo.

Todo ActionScript relacionado ao teclado, como eventos de teclado e entrada de texto nas ocorrncias de TextField,
desativado no modo de tela cheia. Os atalhos de teclado que fecham o modo de tela cheia so a exceo. Existem tambm algumas restries adicionais relacionadas segurana que devem ser consideradas. Elas esto descritas em Caixas de proteo de segurana na pgina 706. Dimensionamento em hardware Voc pode usar a propriedade fullScreenSourceRect da classe Stage para configurar o Flash Player ou o AIR para dimensionar uma regio especfica do palco no modo de tela cheia. O Flash Player e o AIR so dimensionados em hardware, se disponvel, usando os grficos e a placa de vdeo no computador de um usurio, e geralmente exibem o contedo mais rapidamente do que no dimensionamento em software. Para tirar vantagem do dimensionamento em hardware, defina o palco inteiro ou parte dele para o modo de tela cheia. O cdigo ActionScript 3.0 a seguir define o palco inteiro para o modo de tela cheia:
import flash.geom.*; { stage.fullScreenSourceRect = new Rectangle(0,0,320,240); stage.displayState = StageDisplayState.FULL_SCREEN; }

Quando essa propriedade definida como um retngulo vlido e a propriedade displayState definida como o modo de tela cheia o Flash Player e o AIR dimensionam a rea especificada. O tamanho real do Palco em pixels no ActionScript no alterado. O Flash Player e o AIR foram um limite mnimo para o tamanho do retngulo de forma a acomodar a mensagem padro "Pressione Esc para sair do modo de tela cheia". Em geral, esse limite est em torno de 260 por 30 pixels, mas pode variar de acordo com a plataforma e a verso do Flash Player. A propriedade fullScreenSourceRect s pode ser definida quando o Flash Player ou AIR no est no modo de tela cheia. Para us-la corretamente, defina-a primeiro e depois defina a propriedade displayState como o modo de tela cheia, como mostram os exemplos de cdigo. Para ativar o dimensionamento, defina a propriedade fullScreenSourceRect como um objeto de retngulo.
stage.fullScreenSourceRect = new Rectangle(0,0,320,240); // Valid, will enable hardware scaling.

Para desativar o dimensionamento, defina a propriedade fullScreenSourceRect como null no ActionScript 3.0 e como undefined no ActionScript 2.0.
stage.fullScreenSourceRect = null;

Manipulao de eventos de objetos de exibio


A classe DisplayObject herdada da classe EventDispatcher. Desse modo, todos os objetos de exibio podem participar plenamente no modelo de evento (descrito em Manipulao de eventos na pgina 251). Todos os objetos de exibio podem usar seu mtodo addEventListener() (herdado da classe EventDispatcher) para ouvir um evento especfico, mas somente se o objeto ouvinte fizer parte do fluxo desse evento.

PROGRAMAO DO ACTIONSCRIPT 3.0 292


Programao de exibio

Quando o Flash Player ou o AIR envia um objeto de evento, esse objeto faz uma viagem de ida e volta do palco at o objeto de exibio onde ocorreu o evento. Por exemplo, se o usurio clicar em um objeto de exibio chamado child1, o Flash Player enviar um objeto de evento do palco, por meio da hierarquia da lista de exibio, at o objeto de exibio child1. O fluxo do evento conceitualmente dividido em trs fases, como mostra este diagrama:
Stage Capture Phase Parent Node Bubbling Phase

Child1 Node Target Phase

Child2 Node

Para obter mais informaes, consulte Manipulao de eventos na pgina 251. Uma questo importante que deve ser considerada ao trabalhar com eventos de objeto de exibio o efeito que os ouvintes de evento podem ter quando os objetos de exibio removidos automaticamente da memria (lixo coletado) forem removidos da lista de exibio. Se um objeto de exibio tiver objetos inscritos como ouvintes de eventos, esse objeto no ser removido da memria mesmo quando for removido da lista de exibio, pois ainda ter referncias a esses objetos de ouvinte. Para obter mais informaes, consulte Gerenciamento de ouvintes de evento na pgina 265.

Escolha de uma subclasse de DisplayObject


Com tantas opes disponveis, ao trabalhar com objetos de exibio, uma das decises importantes definir qual objeto ser usado para cada finalidade. Veja algumas diretrizes que podem ajud-lo a tomar essa deciso. Essas mesmas sugestes podem ser usadas quando voc precisa de uma ocorrncia de uma classe ou est escolhendo uma base para criar uma classe:

Se voc no precisar de um objeto que possa ser continer de outros objetos de exibio (isto , precisar de apenas
um que sirva como um elemento de tela autnomo), escolha uma dessas subclasses de DisplayObject ou InteractiveObject, dependendo do uso pretendido:

Bitmap para exibir uma imagem de bitmap. TextField para adicionar texto. Video para exibir vdeo. Shape para uma tela de desenho do contedo na tela. Especificamente, se desejar criar uma ocorrncia para
desenhar formas na tela que no ser continer de outros objetos de exibio, use Shape em vez de Sprite ou MovieClip para melhorar o desempenho significativamente.

MorphShape, StaticText ou SimpleButton para itens criados com a ferramenta de autoria do Flash. No
possvel criar ocorrncias dessas classes de modo programtico, mas voc pode criar variveis com esses tipos de dados para fazer referncia aos itens criados com a ferramenta da autoria do Flash.

Se precisar de uma varivel para fazer referncia ao palco principal, use a classe Stage como tipo de dados.

PROGRAMAO DO ACTIONSCRIPT 3.0 293


Programao de exibio

Se precisar de um continer para carregar um arquivo SWF ou de imagem externo, use uma ocorrncia de Loader.
O contedo carregado ser adicionado lista de exibio como filho da ocorrncia de Loader. O tipo de dados depende da natureza do contedo carregado, do seguinte modo:

Uma imagem carregada ser uma ocorrncia do Bitmap. Um arquivo SWF carregado gravado no ActionScript 3.0 ser uma ocorrncia de Sprite ou MovieClip (ou uma
ocorrncia de uma subclasse dessas classes, conforme especificado pelo criador do contedo).

Um arquivo SWF carregado gravado no ActionScript 1.0 ou no ActionScript 2.0 ser uma ocorrncia de
AVM1Movie.

Se precisar de um objeto para servir como continer de outros objetos de exibio (esteja voc desenhando ou no
no objeto de exibio com o ActionScript), escolha uma das subclasses de DisplayObjectContainer:

Sprite se o objeto for criado apenas com o ActionScript ou como a classe base de um objeto de exibio
personalizado que ser criado e manipulado somente com o ActionScript.

MovieClip se estiver criando uma varivel para fazer referncia a um smbolo de clipe de filme criado na
ferramenta de criao do Flash.

Se estiver criando uma classe que ser associada a um smbolo de clipe de filme na biblioteca do Flash, escolha uma
destas subclasses de DisplayObjectContainer como sua classe base:

MovieClip se o smbolo de clipe de filme associado tiver contedo em mais de um quadro Sprite se o smbolo de clipe de filme associado tiver contedo somente no primeiro quadro

Manipulao de objetos de exibio


Independentemente do objeto de exibio utilizado, existem diversas manipulaes comuns a todos os objetos de exibio que servem como elementos exibidos na tela. Por exemplo, todos podem ser posicionados na tela, movidos para frente ou para trs na ordem de empilhamento dos objetos de exibio, dimensionados, girados e assim por diante. Como todos os objetos de exibio herdam essa funcionalidade da classe base comum (DisplayObject), tal funcionalidade apresenta o mesmo comportamento demonstrado na manipulao de uma ocorrncia de TextField, de Video, de Shape ou de qualquer outro objeto de exibio. As sees a seguir descrevem em detalhes diversas manipulaes comuns de objeto de exibio.

Alterao da posio
A manipulao mais bsica de qualquer objeto de exibio seu posicionamento na tela. Para definir a posio de um objeto de exibio, altere as propriedades x e y do objeto.
myShape.x = 17; myShape.y = 212;

O sistema de posicionamento de objetos de exibio trata o palco como um sistema de coordenadas cartesianas (o sistema de grade comum com um eixo x horizontal e um eixo y vertical). A origem do sistema de coordenadas (a coordenada 0,0 onde os eixos x e y se encontram) est no canto superior esquerdo do palco. A partir desse ponto, os valores de x so positivos para a direita e negativos para a esquerda, enquanto (diferente dos sistemas grficos tpicos) os valores de y so positivos para baixo e negativos para cima. Por exemplo, as linhas anteriores do cdigo movem o objeto myShape at a coordenada 17 do eixo x (17 pixel direita da origem) e a coordenada 212 do eixo y (212 pixels abaixo da origem). Por padro, quando um objeto de exibio criado com o ActionScript, as propriedades x e y so definidas como 0, colocando o objeto no canto superior esquerdo do contedo pai.

PROGRAMAO DO ACTIONSCRIPT 3.0 294


Programao de exibio

Alterao da posio em relao ao palco importante lembrar que as propriedades x e y sempre fazem referncia posio do objeto de exibio em relao coordenada 0,0 dos eixos do objeto de exibio pai. Assim, para uma ocorrncia de Shape (como um crculo) contida em uma ocorrncia de Sprite, se voc definir as propriedades x e y do objeto Shape como 0, o crculo ser colocado no canto superior esquerdo de Sprite, que no necessariamente o canto superior esquerdo do palco. Para posicionar um objeto em relao s coordenadas globais do palco, voc pode usar o mtodo globalToLocal() de qualquer objeto de exibio para converter coordenadas globais (palco) em locais (continer do objeto de exibio), do seguinte modo:
// Position the shape at the top-left corner of the Stage, // regardless of where its parent is located. // Create a Sprite, positioned at x:200 and y:200. var mySprite:Sprite = new Sprite(); mySprite.x = 200; mySprite.y = 200; this.addChild(mySprite); // Draw a dot at the Sprite's 0,0 coordinate, for reference. mySprite.graphics.lineStyle(1, 0x000000); mySprite.graphics.beginFill(0x000000); mySprite.graphics.moveTo(0, 0); mySprite.graphics.lineTo(1, 0); mySprite.graphics.lineTo(1, 1); mySprite.graphics.lineTo(0, 1); mySprite.graphics.endFill(); // Create the circle Shape instance. var circle:Shape = new Shape(); mySprite.addChild(circle); // Draw a circle with radius 50 and center point at x:50, y:50 in the Shape. circle.graphics.lineStyle(1, 0x000000); circle.graphics.beginFill(0xff0000); circle.graphics.drawCircle(50, 50, 50); circle.graphics.endFill(); // Move the Shape so its top-left corner is at the Stage's 0, 0 coordinate. var stagePoint:Point = new Point(0, 0); var targetPoint:Point = mySprite.globalToLocal(stagePoint); circle.x = targetPoint.x; circle.y = targetPoint.y;

Do mesmo modo, voc pode usar o mtodo localToGlobal() da classe DisplayObject para converter coordenadas locais em coordenadas do palco. Criao da interao de arrastar e soltar Um objeto de exibio normalmente movido para criar uma interao de arrastar e soltar para que, quando o usurio clicar, o objeto se mova junto com o movimento do mouse at que o boto do mouse seja solto. A interao de arrastar e soltar pode ser criada de duas formas no ActionScript. Em qualquer uma delas, dois eventos de mouse so usados: quando o boto do mouse pressionado, o objeto acionado para seguir o cursor do mouse e, quando solto, o objeto deve parar de segui-lo. A primeira forma, usando o mtodo startDrag(), mais simples, porm mais limitada. Quando o boto do mouse pressionado, o mtodo startDrag() chamado para arrastar o objeto de exibio. Quando o boto do mouse solto, o mtodo stopDrag() chamado.

PROGRAMAO DO ACTIONSCRIPT 3.0 295


Programao de exibio

// This code creates a drag-and-drop interaction using the startDrag() // technique. // square is a DisplayObject (e.g. a MovieClip or Sprite instance). import flash.events.MouseEvent; // This function is called when the mouse button is pressed. function startDragging(event:MouseEvent):void { square.startDrag(); } // This function is called when the mouse button is released. function stopDragging(event:MouseEvent):void { square.stopDrag(); } square.addEventListener(MouseEvent.MOUSE_DOWN, startDragging); square.addEventListener(MouseEvent.MOUSE_UP, stopDragging);

Essa tcnica tem uma limitao bem significativa: somente um item por vez pode ser arrastado com startDrag(). Se um objeto de exibio estiver sendo arrastado e o mtodo startDrag() for chamado em outro objeto de exibio, o primeiro objeto deixar de seguir o mouse imediatamente. Por exemplo, se a funo startDragging() for alterada conforme mostrado aqui, somente o objeto circle ser arrastado, apesar da chamada do mtodo square.startDrag():
function startDragging(event:MouseEvent):void { square.startDrag(); circle.startDrag(); }

Como apenas um objeto pode ser arrastado por vez com startDrag(), o mtodo stopDrag() pode ser chamado em qualquer objeto de exibio e pra sempre que o objeto est sendo arrastado. Se precisar arrastar mais de um objeto de exibio ou para evitar a possibilidade de conflitos quando houver mais de um objeto que provavelmente use startDrag(), melhor usar a tcnica de acompanhamento do mouse para criar o efeito de desenho. Com essa tcnica, quando o boto do mouse pressionado, uma funo inscrita como ouvinte no evento mouseMove do palco. Essa funo, que chamada sempre que o mouse se move, faz com que o objeto arrastado passe para a coordenada x, y do mouse. Assim que o boto do mouse solto, a funo deixa de ser ouvinte, ou seja, no ser mais chamada quando o mouse se movimentar, e o objeto pra de acompanhar o cursor do mouse. Veja um cdigo que demonstra essa tcnica:

PROGRAMAO DO ACTIONSCRIPT 3.0 296


Programao de exibio

// This code creates a drag-and-drop interaction using the mouse-following // technique. // circle is a DisplayObject (e.g. a MovieClip or Sprite instance). import flash.events.MouseEvent; var offsetX:Number; var offsetY:Number; // This function is called when the mouse button is pressed. function startDragging(event:MouseEvent):void { // Record the difference (offset) between where // the cursor was when the mouse button was pressed and the x, y // coordinate of the circle when the mouse button was pressed. offsetX = event.stageX - circle.x; offsetY = event.stageY - circle.y; // tell Flash Player to start listening for the mouseMove event stage.addEventListener(MouseEvent.MOUSE_MOVE, dragCircle); } // This function is called when the mouse button is released. function stopDragging(event:MouseEvent):void { // Tell Flash Player to stop listening for the mouseMove event. stage.removeEventListener(MouseEvent.MOUSE_MOVE, dragCircle); } // This function is called every time the mouse moves, // as long as the mouse button is pressed down. function dragCircle(event:MouseEvent):void { // Move the circle to the location of the cursor, maintaining // the offset between the cursor's location and the // location of the dragged object. circle.x = event.stageX - offsetX; circle.y = event.stageY - offsetY; // Instruct Flash Player to refresh the screen after this event. event.updateAfterEvent(); } circle.addEventListener(MouseEvent.MOUSE_DOWN, startDragging); circle.addEventListener(MouseEvent.MOUSE_UP, stopDragging);

Alm de fazer com que um objeto de exibio acompanhe o cursor do mouse, uma parte comum da interao de arrastar e soltar inclui a movimentao do objeto arrastado at a frente da exibio para que aparea flutuando acima de todos os outros objetos. Por exemplo, imagine que voc tenha dois objetos, um crculo e um quadrado, e que os dois tm uma interao de arrastar e soltar. Se o crculo ficar abaixo do quadrado na lista de exibio e voc clicar e arrastar o crculo para que o cursor fique por cima do quadrado, ir parecer que o crculo desliza ao lado do quadrado, quebrando a iluso de arrastar e soltar. Em vez disso, voc pode definir que, quando for clicado, o crculo deve se mover para cima da lista de exibio e, assim, sempre aparecer em cima de qualquer outro contedo.

PROGRAMAO DO ACTIONSCRIPT 3.0 297


Programao de exibio

O cdigo a seguir (adaptado do exemplo anterior) cria uma interao de arrastar e soltar para dois objetos de exibio: um crculo e um quadrado. Sempre que o boto do mouse pressionado em um deles, esse item movido para a parte superior da lista de exibio do palco para que o item arrastado sempre aparea por cima. O cdigo novo ou alterado a partir da listagem anterior aparece em negrito.
// // // // This code creates a drag-and-drop interaction using the mouse-following technique. circle and square are DisplayObjects (e.g. MovieClip or Sprite instances).

import flash.display.DisplayObject; import flash.events.MouseEvent; var offsetX:Number; var offsetY:Number; var draggedObject:DisplayObject; // This function is called when the mouse button is pressed. function startDragging(event:MouseEvent):void { // remember which object is being dragged draggedObject = DisplayObject(event.target); // Record the difference (offset) between where the cursor was when // the mouse button was pressed and the x, y coordinate of the // dragged object when the mouse button was pressed. offsetX = event.stageX - draggedObject.x; offsetY = event.stageY - draggedObject.y; // move the selected object to the top of the display list stage.addChild(draggedObject); // Tell Flash Player to start listening for the mouseMove event. stage.addEventListener(MouseEvent.MOUSE_MOVE, dragObject); } // This function is called when the mouse button is released. function stopDragging(event:MouseEvent):void { // Tell Flash Player to stop listening for the mouseMove event. stage.removeEventListener(MouseEvent.MOUSE_MOVE, dragObject); }

PROGRAMAO DO ACTIONSCRIPT 3.0 298


Programao de exibio

// This function is called every time the mouse moves, // as long as the mouse button is pressed down. function dragObject(event:MouseEvent):void { // Move the dragged object to the location of the cursor, maintaining // the offset between the cursor's location and the location // of the dragged object. draggedObject.x = event.stageX - offsetX; draggedObject.y = event.stageY - offsetY; // Instruct Flash Player to refresh the screen after this event. event.updateAfterEvent(); } circle.addEventListener(MouseEvent.MOUSE_DOWN, startDragging); circle.addEventListener(MouseEvent.MOUSE_UP, stopDragging); square.addEventListener(MouseEvent.MOUSE_DOWN, startDragging); square.addEventListener(MouseEvent.MOUSE_UP, stopDragging);

Para estender esse efeito ainda mais, como para um jogo onde pinos ou cartas so movidos entre pilhas, voc pode adicionar o objeto arrastado lista de exibio do palco quando for tirado e adicion-lo a outra lista de exibio (como a pilha onde solto) quando o boto do mouse for liberado. Finalmente, para aprimorar o efeito, voc poderia aplicar um filtro de sombra projetada no objeto de exibio quando for clicado (quando comear a ser arrastado) e remover a sombra projetada quando o objeto for solto. Para obter detalhes sobre como usar o filtro de sombra projetada e outros filtros de objeto de exibio no ActionScript, consulte Filtro de objetos de exibio na pgina 354.

Viso panormica e rolagem de objetos de exibio


Se houver um objeto de exibio muito grande para a rea na qual deseja exibi-lo, voc pode usar a propriedade scrollRect para definir a rea visvel do objeto de exibio. Alm disso, alterando a propriedade scrollRect em resposta entrada do usurio, voc pode obter uma viso panormica do contedo esquerda e direita e percorrer para cima e para baixo. A propriedade scrollRect uma ocorrncia da classe Rectangle, que combina os valores necessrios para definir uma rea retangular como um nico objeto. Para definir inicialmente a rea visvel do objeto de exibio, crie uma nova ocorrncia de Rectangle e a atribua propriedade scrollRect do objeto de exibio. Posteriormente, para percorrer ou obter a viso panormica, leia a propriedade scrollRect em uma varivel separada de Rectangle e altere a propriedade desejada (por exemplo, altere a propriedade x da ocorrncia de Rectangle para obter a viso panormica ou a propriedade y para percorrer). Em seguida, atribua novamente essa ocorrncia de Rectangle propriedade scrollRect para notificar o objeto de exibio do valor alterado. Por exemplo, o cdigo a seguir define a rea visvel de um objeto TextField chamado bigText que muito pequeno para se adaptar nos limites do arquivo SWF. Quando so clicados, os dois botes chamados up e down chamam funes que fazem com que o contedo do objeto TextField se movimente para cima ou para baixo, modificando a propriedade y da ocorrncia scrollRect de Rectangle.

PROGRAMAO DO ACTIONSCRIPT 3.0 299


Programao de exibio

import flash.events.MouseEvent; import flash.geom.Rectangle; // Define the initial viewable area of the TextField instance: // left: 0, top: 0, width: TextField's width, height: 350 pixels. bigText.scrollRect = new Rectangle(0, 0, bigText.width, 350); // Cache the TextField as a bitmap to improve performance. bigText.cacheAsBitmap = true; // called when the "up" button is clicked function scrollUp(event:MouseEvent):void { // Get access to the current scroll rectangle. var rect:Rectangle = bigText.scrollRect; // Decrease the y value of the rectangle by 20, effectively // shifting the rectangle down by 20 pixels. rect.y -= 20; // Reassign the rectangle to the TextField to "apply" the change. bigText.scrollRect = rect; } // called when the "down" button is clicked function scrollDown(event:MouseEvent):void { // Get access to the current scroll rectangle. var rect:Rectangle = bigText.scrollRect; // Increase the y value of the rectangle by 20, effectively // shifting the rectangle up by 20 pixels. rect.y += 20; // Reassign the rectangle to the TextField to "apply" the change. bigText.scrollRect = rect; } up.addEventListener(MouseEvent.CLICK, scrollUp); down.addEventListener(MouseEvent.CLICK, scrollDown);

Como este exemplo ilustra, ao trabalhar com a propriedade scrollRect de um objeto de exibio, melhor especificar que o Flash Player ou o AIR deve armazenar em cache o contedo do objeto de exibio como um bitmap, usando a propriedade cacheAsBitmap. Ao fazer isso, o Flash Player e o AIR no precisam redesenhar o contedo inteiro do objeto de exibio sempre que for movido e, assim, podem usar o bitmap em cache para renderizar a parte necessria diretamente na tela. Para obter detalhes, consulte Armazenamento em cache de objetos de exibio na pgina 302.

Manipulao do tamanho e dimensionamento de objetos


possvel medir e manipular o tamanho de um objeto de exibio de duas formas, usando as propriedades de dimenso (width e height) ou as propriedades de escala (scaleX e scaleY). Todo objeto de exibio tem uma propriedade width e uma propriedade height, que so definidas inicialmente como o tamanho do objeto em pixels. possvel ler os valores dessas propriedades para medir o tamanho do objeto de exibio. Voc tambm pode especificar novos valores para alterar o tamanho do objeto, do seguinte modo:

PROGRAMAO DO ACTIONSCRIPT 3.0 300


Programao de exibio

// Resize a display object. square.width = 420; square.height = 420; // Determine the radius of a circle display object. var radius:Number = circle.width / 2;

Se voc alterar a altura ou a largura de um objeto de exibio, esse objeto ser dimensionado, ampliando ou reduzindo seu contedo para ajust-lo na nova rea. Caso o objeto de exibio tenha apenas formas vetoriais, essas formas sero redesenhadas na nova escala, sem prejudicar a qualidade. Todos os elementos grficos de bitmap do objeto de exibio sero dimensionados, no redesenhados. Assim, por exemplo, uma foto digital cuja largura e altura so aumentadas alm das dimenses reais das informaes de pixels na imagem ser pixelizada, ficando irregular. Quando as propriedades width ou height de um objeto de exibio so alteradas, o Flash Player e o AIR tambm atualizam as propriedades scaleX e scaleY. Nota: Os objetos TextField so uma exceo a este comportamento de dimensionamento. Os campos de texto devem realizar o dimensionamento automtico para suportar textos com quebra e tamanhos de fonte variados, fazendo com que os valores scaleX ou scaleY sejam redefinidos para 1 aps o redimensionamento. No entanto, se ajustar os valores scaleX ou scaleY de um objeto TextField, os valores de largura e altura sero alterados para comportar os valores de dimensionamento fornecidos. Essas propriedades representam o tamanho relativo do objeto de exibio em comparao com o tamanho original. As propriedades scaleX e scaleY usam valores fracionrios (decimais) para representar porcentagens. Por exemplo, se a largura de um objeto de exibio for alterada para ter metade do tamanho original, a propriedade scaleX ter o valor .5, que indica 50%. Se a altura for dobrada, a propriedade scaleY ter o valor 2, que indica 200%.
// circle is a display object whose width and height are 150 pixels. // At original size, scaleX and scaleY are 1 (100%). trace(circle.scaleX); // output: 1 trace(circle.scaleY); // output: 1 // When you change the width and height properties, // Flash Player changes the scaleX and scaleY properties accordingly. circle.width = 100; circle.height = 75; trace(circle.scaleX); // output: 0.6622516556291391 trace(circle.scaleY); // output: 0.4966887417218543

As alteraes de tamanho no so proporcionais. Em outras palavras, e voc alterar a altura de um quadrado, mas no a largura, suas propores no sero mais as mesmas e o resultado ser um retngulo, em vez de um quadrado. Se desejar fazer alteraes relacionadas ao tamanho de um objeto de exibio, defina os valores das propriedades scaleX e scaleY para redimensionar o objeto, em vez de definir as propriedades width ou height. Por exemplo, este cdigo altera a largura do objeto de exibio chamado square e, em seguida, altera a escala vertical (scaleY) para corresponder escala horizontal, mantendo o tamanho proporcional do quadrado.
// Change the width directly. square.width = 150; // Change the vertical scale to match the horizontal scale, // to keep the size proportional. square.scaleY = square.scaleX;

PROGRAMAO DO ACTIONSCRIPT 3.0 301


Programao de exibio

Controle da distoro durante o dimensionamento


Normalmente, quando um objeto de exibio dimensionado (por exemplo, ampliado na horizontal), a distoro resultante distribuda uniformemente no objeto, para que cada parte seja ampliada do mesmo modo. Para elementos grficos e de design, isso provavelmente o que se espera. No entanto, s vezes melhor ter controle sobre as partes do objeto de exibio que so ampliadas e as partes que permanecem inalteradas. Um exemplo comum disso um boto retangular com cantos arredondados. Com o dimensionamento normal, os cantos do boto so ampliados, alterando o raio do canto medida que o boto redimensionado.

No entanto, nesse caso seria melhor ter controle sobre o dimensionamento conseguir designar algumas reas que devem ser dimensionadas (lados retos e o centro) e outras que no devem (os cantos) para que o dimensionamento ocorra sem nenhuma distoro visvel.

Voc pode usar o dimensionamento de 9 fatias (Escala 9) para criar objetos de exibio cujo dimensionamento pode ser controlado. Com o dimensionamento de 9 fatias, o objeto de exibio dividido em 9 retngulos separados (uma grade 3 x 3, como a grade do jogo da velha). Os retngulos no so necessariamente do mesmo tamanho; voc pode desenhar onde as linhas da grade so colocadas. Todo contedo que estiver nos retngulos dos quatro cantos (como os cantos arredondados de um boto) no ser ampliado ou reduzido quando o objeto de exibio for dimensionado. Os retngulos centrais superior e inferior sero dimensionados na horizontal, no na vertical, enquanto os retngulos centrais esquerdo e direito sero dimensionados na vertical, no na horizontal. O retngulo central ser dimensionado tanto na horizontal quanto na vertical.

Com isso em mente, se estiver criando um objeto de exibio e desejar que um determinado contedo nunca seja dimensionado, verifique se as linhas divisrias da grade de dimensionamento de 9 fatias esto colocadas de modo que o contedo fique em um dos retngulos do canto. No ActionScript, definir um valor para a propriedade scale9Grid de um objeto de exibio ativa o dimensionamento de 9 fatias do objeto e define o tamanho dos retngulos na grade de escala 9 do objeto. Use uma ocorrncia da classe Rectangle como valor da propriedade scale9Grid, do seguinte modo:
myButton.scale9Grid = new Rectangle(32, 27, 71, 64);

PROGRAMAO DO ACTIONSCRIPT 3.0 302


Programao de exibio

Os quatro parmetros do construtor de retngulo so a coordenada x, a coordenada y, a largura e a altura. Neste exemplo, o canto superior esquerdo do retngulo colocado no ponto x: 32, y: 27 no objeto de exibio chamado myButton. O retngulo tem 71 pixels de largura e 64 pixels de altura (de modo que a borda direita est na coordenada 103 do eixo x e a borda inferior est na coordenada 92 do eixo y no objeto de exibio).

A rea real contida na regio definida pela ocorrncia de Rectangle representa o retngulo central da grade de escala 9. Os outros retngulos so calculados pelo Flash Player e AIR, estendendo os lados da ocorrncia de Rectangle, conforme mostrado aqui:

Nesse caso, medida que o boto dimensionado para cima ou para baixo, os cantos arredondados no so ampliados ou reduzidos, mas as outras reas se ajustam de acordo com o dimensionamento.

A. myButton.width = 131;myButton.height = 106; B. myButton.width = 73;myButton.height = 69; C. myButton.width = 54;myButton.height = 141;

Armazenamento em cache de objetos de exibio


Sempre que estiver aumentando o tamanho no Flash, seja para criar um aplicativo ou animaes complexas com script, voc precisa levar em conta o desempenho e a otimizao. O Flash Player e o AIR no otimizam contedo que permanece esttico (como uma ocorrncia de Shape retangular). Desse modo, quando voc altera a posio do retngulo, o Flash Player ou o AIR redesenha a ocorrncia de Shape inteira. Voc pode armazenar os objetos de exibio especificados em cache para melhorar o desempenho do arquivo SWF. O objeto de exibio uma superfcie, basicamente uma verso de bitmap dos dados vetoriais da ocorrncia, que so os dados que no devem mudar muito durante o fluxo do arquivo SWF. Portanto, as ocorrncias com o cache ativado no so redesenhadas continuamente medida que o arquivo SWF reproduzido, o que aumenta a velocidade da renderizao. Nota: Voc pode atualizar os dados vetoriais e, quando isso feito, a superfcie recriada. Assim, os dados vetoriais armazenados em cache na superfcie no precisam permanecer iguais para todo o arquivo SWF. Se voc definir a propriedade cacheAsBitmap do objeto de exibio como true, o cache do objeto de exibio ser uma representao em bitmap do prprio objeto. O Flash Player ou o AIR criam um objeto de superfcie para a ocorrncia, que um bitmap armazenado em cache em vez de dados vetoriais. Se os limites do objeto de exibio forem alterados, a superfcie ser recriada em vez de ser redimensionada. As superfcies podem ser aninhadas com outras superfcies. A superfcie filho copia seu bitmap na superfcie pai. Para obter mais informaes, consulte Ativao do armazenamento em cache de bitmaps na pgina 304.

PROGRAMAO DO ACTIONSCRIPT 3.0 303


Programao de exibio

A propriedade opaqueBackground e a propriedade scrollRect da classe DisplayObject esto relacionadas ao armazenamento em cache de bitmaps realizado com a propriedade cacheAsBitmap. Embora essas trs propriedades sejam independentes entre si, as propriedades opaqueBackground e scrollRect funcionam melhor quando um objeto armazenado em cache como um bitmap; voc ver a melhora de desempenho das propriedades opaqueBackground e scrollRect somente quando cacheAsBitmap for definido como true. Para obter mais informaes sobre como percorrer o contedo do objeto de exibio, consulte Viso panormica e rolagem de objetos de exibio na pgina 298. Para obter mais informaes sobre como configurar um plano de fundo opaco, consulte Definio de uma cor de fundo opaca na pgina 304. Para obter informaes sobre o mascaramento do canal alfa, que requer a definio da propriedade cacheAsBitmap como true, consulte Mascaramento de objetos de exibio na pgina 309.

Quando ativar o armazenamento em cache


A ativao do cache para um objeto de exibio cria uma superfcie, o que tem diversas vantagens, como ajudar na renderizao rpida de animaes vetoriais complexas. Existem diversos cenrios nos quais necessrio ativar o cache. Voc talvez pense que sempre que o cache ativado, o desempenho dos arquivos SWF melhora; no entanto, existem situaes nas quais a ativao do cache no melhora o desempenho ou pode inclusive pior-lo. Esta seo descreve cenrios nos quais o cache deve ser usado e quando objetos de exibio regulares devem ser usados. O desempenho global de dados em cache depende da complexidade dos dados vetoriais das ocorrncias, quanto foram mudados os dados e se foi ou no definida a propriedade opaqueBackground. Se voc estiver mudando regies pequenas, a diferena entre o uso de superfcie e o uso de dados vetoriais pode ser desprezvel. Teste o seu trabalho das duas formas, antes de implantar o aplicativo. Quando usar o armazenamento em cache de bitmaps A seguir, alguns casos comuns nos quais podem ser vistos benefcios significativos quando se ativa o armazenamento em cache de bitmaps.

Imagem de fundo complexa: um aplicativo que contm uma imagem de fundo complexa e detalhada dos dados
vetoriais (talvez uma imagem na qual o comando Traar bitmap tenha sido aplicado ou a arte final criada no Adobe Illustrator). Voc pode animar caracteres no plano de fundo, o que deixa a animao mais lenta porque o plano de fundo precisa gerar regularmente os dados vetoriais mais uma vez. Para melhorar o desempenho, voc pode definir a propriedade opaqueBackground do objeto de exibio de fundo como true. O fundo renderizado como um bitmap e pode se redesenhado rapidamente, de modo que a execuo da animao seja muito mais rpida.

Rolagem de campo de texto: um aplicativo que exibe uma grande quantidade de texto na rolagem do campo de
texto. Voc pode colocar o campo de texto em um objeto de exibio definido como rolvel com limites de rolagem (a propriedade scrollRect). Isso agiliza a rolagem de pixel para a ocorrncia especificada. Quando o usurio rola a ocorrncia do objeto de exibio, o Flash Player ou o AIR move os pixels rolados para cima e gera a regio recmexposta, em vez de gerar novamente todo o campo de texto.

Sistema de janelas: um aplicativo com um sistema complexo de janelas sobrepostas. Cada janela pode ser aberta ou
fechada (por exemplo, as janelas de navegador da web). Se voc marcar cada janela como uma superfcie (definindo a propriedade cacheAsBitmap como true), cada janela isolada e colocada em cache. Os usurios podem arrastar as janelas de modo que se sobreponham, e as janelas no precisam gerar novamente o contedo vetorial.

Mascaramento do canal alfa: ao usar o mascaramento do canal alfa, voc deve definir a propriedade
cacheAsBitmap como true. Para obter mais informaes, consulte Mascaramento de objetos de exibio na

pgina 309. A ativao do cache de bitmaps em todos esses cenrios melhora a resposta e a interatividade do aplicativo, otimizando os grficos vetoriais.

PROGRAMAO DO ACTIONSCRIPT 3.0 304


Programao de exibio

Alm disso, sempre que um filtro aplicado em um objeto de exibio, cacheAsBitmap definido automaticamente como true, mesmo que esteja explicitamente definido como false. Se todos os filtros forem desativados do objeto de exibio, a propriedade cacheAsBitmap retornar ao valor definido pela ltima vez. Quando evitar o uso do armazenamento em cache de bitmaps O mau uso desse recurso pode afetar negativamente o arquivo SWF. Ao usar o cache de bitmaps, lembre-se das seguintes orientaes:

No use em exagero superfcies (objetos de exibio com o cache ativado). Cada superfcie usa mais memria do
que um objeto de exibio normal, o que indica que voc deve ativar as superfcies apenas quando precisar melhorar o desempenho da renderizao. Um bitmap em cache pode usar significativamente mais memria do que um objeto de exibio normal. Por exemplo, se uma ocorrncia de Sprite no palco tem 250 pixels por 250 pixels de tamanho, pode usar 250 KB em vez de 1 KB em cache quando for uma ocorrncia normal de Sprite (no armazenada em cache).

Evite o zoom em superfcies em cache. Se usar exageradamente cache de bitmaps, consumida uma grande
quantidade de memria (veja observao anterior) se fizer o zoom do contedo.

Use superfcies para ocorrncias de objeto de exibio em grande parte estticas (sem animao). Voc pode
arrastar ou mover a ocorrncia, mas o contedo da ocorrncia no deve ser animado ou mudado muito. A animao ou alterao do contedo tem maior probabilidade de acontecer com uma ocorrncia de MovieClip que contm animao ou uma ocorrncia de Video. Por exemplo, se voc girar ou transformar uma ocorrncia, ela muda entre a superfcie e os dados vetoriais, o que difcil de processar e afeta negativamente o arquivo SWF.

Se misturar superfcies com dados vetoriais, aumenta a quantidade de processamento a ser feita pelo Flash Player
e pelo AIR (e algumas vezes o computador). Agrupe as superfcies o mximo possvel, por exemplo, quando criar aplicativos em janelas.

Ativao do armazenamento em cache de bitmaps


Para ativar o armazenamento em cache de bitmaps para um objeto de exibio, defina a propriedade cacheAsBitmap como true:
mySprite.cacheAsBitmap = true;

Depois de definir a propriedade cacheAsBitmap como true, voc deve perceber que o objeto de exibio realiza o encaixe de pixels automaticamente em coordenadas inteiras. Ao testar o arquivo SWF, voc ver que qualquer animao executada em uma imagem vetorial complexa processada muito mais rpido. Uma superfcie (bitmap em cache) no ser criada, mesmo que cacheAsBitmap esteja definido como true, se ocorrer uma ou mais das seguintes situaes:

O bitmap muito maior do que 2880 pixels de altura ou largura. O bitmap no consegue ser alocado (produzindo erro de falta de memria).

Definio de uma cor de fundo opaca


Voc pode definir um plano de fundo opaco para um objeto de exibio. Por exemplo, quando o SWF tem um plano de fundo que contm elementos vetoriais complexos, voc pode definir a propriedade opaqueBackground como uma cor especificada (normalmente a mesma cor do palco). A cor especificada como um nmero (em geral, um valor de cor hexadecimal). O plano de fundo tratado como um bitmap, o que ajuda a otimizar o desempenho.

PROGRAMAO DO ACTIONSCRIPT 3.0 305


Programao de exibio

Quando voc define cacheAsBitmap como true e tambm define a propriedade opaqueBackground como uma cor especificada, a propriedade opaqueBackground permite que o bitmap interno seja opaco e renderizado mais rapidamente. Se cacheAsBitmap no for definido como true, a propriedade opaqueBackground adicionar uma forma vetorial quadrada opaca ao plano de fundo do objeto de exibio. Isso no cria um bitmap automaticamente. O exemplo a seguir mostra como definir o plano de fundo de um objeto de exibio para otimizar o desempenho:
myShape.cacheAsBitmap = true; myShape.opaqueBackground = 0xFF0000;

Nesse caso, a cor de fundo da forma chamada myShape definida como vermelha (0xFF0000). Supondo que a ocorrncia de Shape contm um desenho de um tringulo verde, em um palco com fundo branco, seria mostrado um tringulo verde com vermelho no espao vazio da caixa delimitadora da ocorrncia de Shape (o retngulo que envolve a forma por completo).

Obviamente, isso faria mais sentido se fosse usado com um palco com fundo vermelho slido. Em outro fundo colorido, essa cor seria especificada. Por exemplo, em um SWF com fundo branco, a propriedade opaqueBackground provavelmente seria definida como 0xFFFFFF, ou branco puro.

Aplicao de modos de mesclagem


Os modos de mesclagem envolvem a combinao das cores de uma imagem (a imagem base) com as cores de outra imagem (a imagem de mesclagem) para produzir uma terceira imagem; a imagem resultante aquela realmente exibida na tela. Cada valor de pixel em uma imagem processado com o valor de pixel correspondente da outra imagem para produzir um valor de pixel para a mesma posio no resultado. Todos os objetos de exibio tm uma propriedade blendMode que pode ser definida como um dos seguintes modos de mesclagem. Esses modos so constantes definidas na classe BlendMode. Se preferir, voc pode usar os valores de String (entre parnteses) que so os reais valores das constantes.

BlendMode.ADD ("add"): normalmente usado para criar um efeito animado de dissoluo de iluminao entre

duas imagens.
BlendMode.ALPHA ("alpha"): normalmente usado para aplicar a transparncia do primeiro plano no plano de

fundo.
BlendMode.DARKEN ("darken"): normalmente usado para sobrepor tipos. BlendMode.DIFFERENCE ("difference"): normalmente usado para criar cores mais vibrantes. BlendMode.ERASE ("erase"): normalmente usado para cortar (apagar) parte do plano de fundo usando o alfa do

primeiro plano.
BlendMode.HARDLIGHT ("hardlight"): normalmente usado para criar efeitos de sombra. BlendMode.INVERT ("invert"): usado para inverter o plano de fundo. BlendMode.LAYER ("layer"): usado para forar a criao de um buffer temporrio para pr-composio de um

objeto de exibio especfico.


BlendMode.LIGHTEN ("lighten"): normalmente usado para sobrepor tipos. BlendMode.MULTIPLY ("multiply"): normalmente usado para criar sombras e efeitos de profundidade.

PROGRAMAO DO ACTIONSCRIPT 3.0 306


Programao de exibio

BlendMode.NORMAL ("normal"): usado para especificar que os valores de pixel da imagem de mesclagem

substituem os da imagem base.


BlendMode.OVERLAY ("overlay"): normalmente usado para criar efeitos de sombra. BlendMode.SCREEN ("screen"): normalmente usado para criar realces e manchas de luz. BlendMode.SHADER ("shader"): usado para especificar que um sombreador Pixel Bender usado para criar um

efeito de mesclagem personalizado. Para obter mais informaes sobre como usar sombreadores, consulte Trabalho com sombreadores Pixel Bender na pgina 386.

BlendMode.SUBTRACT ("subtract"): normalmente usado para criar um efeito animado de dissoluo de

escurecimento entre duas imagens.

Ajuste das cores de DisplayObject


Voc pode usar os mtodos da classe ColorTransform (flash.geom.ColorTransform) para ajustar a cor de um objeto de exibio. Cada objeto de exibio tem uma propriedade transform, que uma ocorrncia da classe Transform, e contm informaes sobre vrias transformaes que so aplicadas no objeto de exibio (como rotao, alteraes na escala ou posio e assim por diante). Alm de informaes sobre transformaes geomtricas, a classe Transform tambm inclui uma propriedade colorTransform, que uma ocorrncia da classe ColorTransform e fornece acesso para fazer ajustes de cor no objeto de exibio. Para acessar as informaes de transformao de cor de um objeto de exibio, voc pode usar um cdigo como esse:
var colorInfo:ColorTransform = myDisplayObject.transform.colorTransform;

Depois de criar uma ocorrncia de ColorTransform, voc pode ler os valores de propriedade para descobrir quais transformaes de cor j foram aplicadas ou definir esses valores para alterar cores no objeto de exibio. Para atualizar o objeto de exibio depois de fazer alteraes, atribua novamente a ocorrncia de ColorTransform propriedade transform.colorTransform.
var colorInfo:ColorTransform = my DisplayObject.transform.colorTransform; // Make some color transformations here. // Commit the change. myDisplayObject.transform.colorTransform = colorInfo;

Definio de valores de cor com cdigo


A propriedade color da classe ColorTransform pode ser usada para atribuir um valor de cor RGB (vermelho, verde e azul) especfico ao objeto de exibio. O exemplo a seguir usa a propriedade color para alterar a cor do objeto de exibio chamado square como azul quando o usurio clicar no boto blueBtn:

PROGRAMAO DO ACTIONSCRIPT 3.0 307


Programao de exibio

// square is a display object on the Stage. // blueBtn, redBtn, greenBtn, and blackBtn are buttons on the Stage. import flash.events.MouseEvent; import flash.geom.ColorTransform; // Get access to the ColorTransform instance associated with square. var colorInfo:ColorTransform = square.transform.colorTransform; // This function is called when blueBtn is clicked. function makeBlue(event:MouseEvent):void { // Set the color of the ColorTransform object. colorInfo.color = 0x003399; // apply the change to the display object square.transform.colorTransform = colorInfo; } blueBtn.addEventListener(MouseEvent.CLICK, makeBlue);

Observe que, ao alterar a cor de um objeto de exibio usando a propriedade color, a cor do objeto inteiro alterada, independentemente de o objeto ter vrias cores anteriormente. Por exemplo, se houver um objeto de exibio que contm um crculo verde com texto preto na parte superior, definir a propriedade color da ocorrncia de ColorTransform associada desse objeto como uma sombra vermelha faz com que o objeto inteiro, crculo e texto, fique vermelho (de modo que o texto no ser mais diferenciado do restante do objeto).

Alterao de efeitos de brilho e cor com cdigo


Digamos que voc tenha um objeto de exibio com vrias cores (por exemplo, uma foto digital) e no queira colorir o objeto inteiro novamente; voc quer apenas ajustar a cor de um objeto de exibio com base nas cores existentes. Nesse cenrio, a classe ColorTransform inclui uma srie de propriedades de multiplicador e deslocamento que podem ser usadas para fazer esse tipo de ajuste. As propriedades de multiplicador, chamadas redMultiplier, greenMultiplier, blueMultiplier e alphaMultiplier, funcionam como filtros fotogrficos coloridos (ou culos de sol coloridos), intensificando ou ofuscando algumas cores no objeto de exibio. As propriedades de deslocamento (redOffset, greenOffset, blueOffset e alphaOffset) podem ser usadas para aumentar a quantidade de uma determinada cor no objeto ou para especificar o valor mnimo que uma cor especfica pode ter. Essas propriedades de multiplicador e deslocamento so idnticas s configuraes de cor avanadas que esto disponveis para smbolos de clipe de filme na ferramenta de criao do Flash quando voc escolhe Avanado no menu pop-up Cor no Inspetor de propriedades. O cdigo a seguir carrega uma imagem JPEG e aplica uma transformao de cor nela, ajustando os canais vermelho e verde medida que o ponteiro do mouse se move ao longo dos eixos x e y. Nesse caso, como nenhum valor de deslocamento foi especificado, o valor de cada canal de cor exibido na tela ser uma porcentagem do valor de cor original na imagem - a maior parte de vermelho ou verde exibida em um pixel a quantidade original de vermelho ou verde nesse pixel.

PROGRAMAO DO ACTIONSCRIPT 3.0 308


Programao de exibio

import import import import import

flash.display.Loader; flash.events.MouseEvent; flash.geom.Transform; flash.geom.ColorTransform; flash.net.URLRequest;

// Load an image onto the Stage. var loader:Loader = new Loader(); var url:URLRequest = new URLRequest("http://www.helpexamples.com/flash/images/image1.jpg"); loader.load(url); this.addChild(loader); // This function is called when the mouse moves over the loaded image. function adjustColor(event:MouseEvent):void { // Access the ColorTransform object for the Loader (containing the image) var colorTransformer:ColorTransform = loader.transform.colorTransform; // Set the red and green multipliers according to the mouse position. // The red value ranges from 0% (no red) when the cursor is at the left // to 100% red (normal image appearance) when the cursor is at the right. // The same applies to the green channel, except it's controlled by the // position of the mouse in the y axis. colorTransformer.redMultiplier = (loader.mouseX / loader.width) * 1; colorTransformer.greenMultiplier = (loader.mouseY / loader.height) * 1; // Apply the changes to the display object. loader.transform.colorTransform = colorTransformer; } loader.addEventListener(MouseEvent.MOUSE_MOVE, adjustColor);

Rotao de objetos
Os objetos de exibio podem ser girados com a propriedade rotation. Voc pode ler esse valor para saber se um objeto foi girado ou, para girar o objeto, defina essa propriedade como um nmero (em graus) que representa o valor de rotao a ser aplicado no objeto. Por exemplo, essa linha do cdigo gira o objeto chamado square 45 graus (1/8 de uma revoluo completa):
square.rotation = 45;

Se preferir, gire o objeto de exibio usando uma matriz de transformao, conforme descrito em Trabalho com geometria na pgina 342.

Desaparecimento de objetos
Voc pode controlar a transparncia de um objeto de exibio para deix-lo parcial ou completamente transparente ou alterar a transparncia para realar ou ofuscar o objeto. A propriedade alpha da classe DisplayObject define a transparncia (ou, mais precisamente, a opacidade) de um objeto de exibio. A propriedade alpha pode ser definida como qualquer valor entre 0 e 1, onde 0 completamente transparente e 1 completamente opaco. Por exemplo, essas linhas de cdigo deixam o objeto chamado myBall parcialmente transparente (50%) quando clicado com o mouse:

PROGRAMAO DO ACTIONSCRIPT 3.0 309


Programao de exibio

function fadeBall(event:MouseEvent):void { myBall.alpha = .5; } myBall.addEventListener(MouseEvent.CLICK, fadeBall);

Voc tambm pode alterar a transparncia de um objeto de exibio usando os ajustes de cor disponveis pela classe ColorTransform. Para obter mais informaes, consulte Ajuste das cores de DisplayObject na pgina 306.

Mascaramento de objetos de exibio


Voc pode usar um objeto de exibio como uma mscara para criar um orifcio por meio do qual o contedo de outro objeto de exibio visualizado. Definio de uma mscara Para indicar que um objeto de exibio ser a mscara de outro objeto, defina o objeto de mscara como a propriedade mask do objeto de exibio a ser mascarado:
// Make the object maskSprite be a mask for the object mySprite. mySprite.mask = maskSprite;

O objeto de exibio mascarado revelado em todas as reas opacas (no transparentes) do objeto de exibio que age como a mscara. Por exemplo, o cdigo a seguir cria uma ocorrncia de Shape que contm um quadrado vermelho de 100 x 100 pixels e uma ocorrncia de Sprite que contm um crculo azul com raio de 25 pixels. Assim que clicado, o crculo definido como a mscara do quadrado para que a nica parte exibida do quadrado seja a parte coberta pela parte slida do crculo. Em outras palavras, somente um crculo vermelho ficar visvel.
// This code assumes it's being run within a display object container // such as a MovieClip or Sprite instance. import flash.display.Shape; // Draw a square and add it to the display list. var square:Shape = new Shape(); square.graphics.lineStyle(1, 0x000000); square.graphics.beginFill(0xff0000); square.graphics.drawRect(0, 0, 100, 100); square.graphics.endFill(); this.addChild(square); // Draw a circle and add it to the display list. var circle:Sprite = new Sprite(); circle.graphics.lineStyle(1, 0x000000); circle.graphics.beginFill(0x0000ff); circle.graphics.drawCircle(25, 25, 25); circle.graphics.endFill(); this.addChild(circle); function maskSquare(event:MouseEvent):void { square.mask = circle; circle.removeEventListener(MouseEvent.CLICK, maskSquare); } circle.addEventListener(MouseEvent.CLICK, maskSquare);

PROGRAMAO DO ACTIONSCRIPT 3.0 310


Programao de exibio

O objeto de exibio que atua como mscara pode ser arrastado, animado, redimensionado dinamicamente e pode usar formas separadas em uma nica mscara. O objeto de exibio de mscara no precisa ser necessariamente adicionado lista de exibio. No entanto, se desejar que o objeto de mscara seja dimensionado quando o palco for dimensionado ou se desejar permitir a interao do usurio com a mscara (como as operaes de arrastar e redimensionar controladas pelo usurio), o objeto de mscara deve ser adicionado lista de exibio. O ndice z real (ordem da frente para trs) dos objetos de exibio no importam, desde que o objeto de mscara seja adicionado lista de exibio. O objeto de mscara ser exibido na tela apenas como uma mscara. Se o objeto de mscara for uma ocorrncia de MovieClip com vrios quadros, todos os quadros da linha do tempo desse objeto sero reproduzidos, do mesmo modo como se no estivesse agindo como mscara. Para remover uma mscara, defina a propriedade mask como null:
// remove the mask from mySprite mySprite.mask = null;

Voc no pode usar uma mscara para mascarar outra. A propriedade alpha de um objeto de exibio de mscara no pode ser definida. Somente os preenchimentos so usados em um objeto de exibio usado como mscara; os traados so ignorados. Sobre o mascaramento de fontes de dispositivo Voc pode usar um objeto de exibio para mascarar o texto que est definido em uma fonte de dispositivo. Quando um objeto de exibio usado para mascarar o texto definido em uma fonte de dispositivo, a caixa delimitadora retangular da mscara usada como a forma de mascaramento. Isso significa que, se voc criar uma mscara no retangular de objeto de exibio para o texto da fonte de dispositivo, a mscara exibida no arquivo SWF ter a forma da caixa delimitadora retangular da mscara, no a forma da mscara propriamente dita. Mascaramento do canal alfa O mascaramento do canal alfa permitido se a mscara e os objetos de exibio mascarados usarem o cache de bitmaps, conforme mostrado aqui:
// maskShape is a Shape instance which includes a gradient fill. mySprite.cacheAsBitmap = true; maskShape.cacheAsBitmap = true; mySprite.mask = maskShape;

Por exemplo, o mascaramento do canal alfa usa um filtro no objeto de mscara diferente do filtro que aplicado no objeto de exibio mascarado. No exemplo a seguir, um arquivo de imagem externo carregado no palco. Essa imagem (ou, mais precisamente, a ocorrncia de Loader na qual carregada) ser o objeto de exibio mascarado. Um elemento oval de gradiente (centro preto slido que fica transparente nas bordas) desenhado na imagem; esta ser a mscara alfa. Os dois objetos de exibio tm o cache de bitmaps ativado. O elemento oval definido como uma mscara para a imagem e pode ser arrastado.

PROGRAMAO DO ACTIONSCRIPT 3.0 311


Programao de exibio

// This code assumes it's being run within a display object container // such as a MovieClip or Sprite instance. import import import import import flash.display.GradientType; flash.display.Loader; flash.display.Sprite; flash.geom.Matrix; flash.net.URLRequest;

// Load an image and add it to the display list. var loader:Loader = new Loader(); var url:URLRequest = new URLRequest("http://www.helpexamples.com/flash/images/image1.jpg"); loader.load(url); this.addChild(loader); // Create a Sprite. var oval:Sprite = new Sprite(); // Draw a gradient oval. var colors:Array = [0x000000, 0x000000]; var alphas:Array = [1, 0]; var ratios:Array = [0, 255]; var matrix:Matrix = new Matrix(); matrix.createGradientBox(200, 100, 0, -100, -50); oval.graphics.beginGradientFill(GradientType.RADIAL, colors, alphas, ratios, matrix); oval.graphics.drawEllipse(-100, -50, 200, 100); oval.graphics.endFill(); // add the Sprite to the display list this.addChild(oval); // Set cacheAsBitmap = true for both display objects. loader.cacheAsBitmap = true; oval.cacheAsBitmap = true; // Set the oval as the mask for the loader (and its child, the loaded image) loader.mask = oval; // Make the oval draggable. oval.startDrag(true);

Animao de objetos
Animao o processo de fazer algo se movimentar ou, tambm, de fazer algo mudar com o passar do tempo. A animao com script uma parte fundamental dos jogos de vdeo e normalmente usada para adicionar dicas teis de interao a outros aplicativos. A idia bsica por trs da animao por script de que uma alterao deve ocorrer e essa alterao precisa ser dividida em incrementos com o passar do tempo. fcil fazer algo se repetir no ActionScript, usando uma instruo de consulta comum. No entanto, uma consulta ser executada em todas as iteraes antes da atualizao da exibio. Para criar animao com script, voc precisa gravar um ActionScript que execute alguma ao repetidas vezes com o passar do tempo e tambm atualize a tela sempre que essa ao for executada.

PROGRAMAO DO ACTIONSCRIPT 3.0 312


Programao de exibio

Por exemplo, imagine que voc quer criar uma animao simples, como uma bola que percorre a tela. O ActionScript inclui um mecanismo fcil que permite acompanhar a passagem do tempo e atualizar a tela conforme necessrio, ou seja, voc pode gravar o cdigo que move a bola um pouco por vez at atingir o destino. Aps cada movimentao, a tela atualizada e o usurio pode visualizar o movimento no palco. Do ponto de vista prtico, faz sentido sincronizar a animao com script com a taxa de quadros do arquivo SWF (em outras palavras, fazer uma alterao de animao sempre que um novo quadro for exibido), pois tal procedimento define a freqncia de atualizao de tela do Flash Player. Cada objeto de exibio tem um evento enterFrame que enviado de acordo com a taxa de quadros do arquivo SWF - um evento por quadro. A maioria dos desenvolvedores que cria animaes com script usa o evento enterFrame para criar aes que se repetem com o passar do tempo. Voc pode gravar um cdigo que ouve o evento enterFrame, movendo a bola animada um pouco em cada quadro e, medida que a tela atualizada (cada quadro), a bola seria redesenhada em seu novo local, criando o movimento. Nota: Uma ao que se repete com o passar do tempo tambm pode ser criada com a classe Timer. Uma ocorrncia de Timer aciona uma notificao de evento sempre que um perodo especificado passa. Voc poderia gravar um cdigo que executa a animao manipulando os eventos de tempo da classe Timer, definindo um intervalo de tempo pequeno (alguma frao de um segundo). Para obter mais informaes sobre como usar a classe Timer, consulte Controle de intervalos de tempo na pgina 137. No exemplo a seguir, uma ocorrncia circular de Sprite, chamada circle, criada no palco. Quando o usurio clica no crculo, uma seqncia de animao com script iniciada, fazendo com que o crculo desaparea (a propriedade alpha diminuda) at ficar completamente transparente:
import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; // draw a circle and add it to the display list var circle:Sprite = new Sprite(); circle.graphics.beginFill(0x990000); circle.graphics.drawCircle(50, 50, 50); circle.graphics.endFill(); addChild(circle); // When this animation starts, this function is called every frame. // The change made by this function (updated to the screen every // frame) is what causes the animation to occur. function fadeCircle(event:Event):void { circle.alpha -= .05; if (circle.alpha <= 0) { circle.removeEventListener(Event.ENTER_FRAME, fadeCircle); } } function startAnimation(event:MouseEvent):void { circle.addEventListener(Event.ENTER_FRAME, fadeCircle); } circle.addEventListener(MouseEvent.CLICK, startAnimation);

PROGRAMAO DO ACTIONSCRIPT 3.0 313


Programao de exibio

Quando o usurio clica no crculo, a funo fadeCircle() inscrita como ouvinte do evento enterFrame, indicando que comear a ser chamada uma vez por quadro. Essa funo desbota o crculo alterando sua propriedade alpha para que, uma vez por quadro, o alfa do crculo diminua 0,05 (5%) e a tela seja atualizada. Eventualmente, quando o valor de alpha 0 (crculo completamente transparente), a funo fadeCircle() removida como ouvinte de eventos, encerrando a animao. O mesmo cdigo poderia ser usado, por exemplo, para criar um movimento animado em vez de desbotar o objeto. Substituindo uma propriedade diferente para alpha na funo que um ouvinte de eventos enterFrame, essa propriedade ser animada. Por exemplo, alterar esta linha
circle.alpha -= .05;

para este cdigo


circle.x += 5;

animar a propriedade x, fazendo com que o crculo se mova para a direita no palco. A condio que encerra a animao poderia ser alterada para finalizar a animao (isto , cancelar a inscrio do ouvinte enterFrame) quando a coordenada x desejada for atingida.

Carregamento dinmico do contedo da exibio


Voc pode carregar qualquer uma dos seguintes ativos de exibio externos em um aplicativo ActionScript 3.0:

Um arquivo SWF criado no ActionScript 3.0 - Esse arquivo pode ser uma classe Sprite, MovieClip ou qualquer
classe que estende Sprite.

Um arquivo de imagem - Isso inclui arquivos JPG, PNG e GIF. Um arquivo SWF AVM1 - Arquivo SWF gravado no ActionScript 1.0 ou 2.0.
Carregue esses ativos usando a classe Loader.

Carregamento de objetos de exibio


Os objetos Loader so usados para carregar arquivos SWF e de imagem em um aplicativo. A classe Loader uma subclasse de DisplayObjectContainer. Um objeto Loader pode conter apenas um objeto de exibio filho na lista de exibio, o objeto que representa o arquivo SWF ou de imagem carregado. Quando voc adiciona um objeto Loader lista de exibio, como no cdigo a seguir, tambm pode adicionar o objeto filho carregado lista de exibio aps o carregamento:
var pictLdr:Loader = new Loader(); var pictURL:String = "banana.jpg" var pictURLReq:URLRequest = new URLRequest(pictURL); pictLdr.load(pictURLReq); this.addChild(pictLdr);

Assim que o arquivo SWF ou imagem carregado, voc pode mover o objeto de exibio carregado para outro continer, como o objeto container DisplayObjectContainer neste exemplo:

PROGRAMAO DO ACTIONSCRIPT 3.0 314


Programao de exibio

import flash.display.*; import flash.net.URLRequest; import flash.events.Event; var container:Sprite = new Sprite(); addChild(container); var pictLdr:Loader = new Loader(); var pictURL:String = "banana.jpg" var pictURLReq:URLRequest = new URLRequest(pictURL); pictLdr.load(pictURLReq); pictLdr.contentLoaderInfo.addEventListener(Event.COMPLETE, imgLoaded); function imgLoaded(event:Event):void { container.addChild(pictLdr.content); }

Monitoramento do progresso do carregamento


Assim que o arquivo comea a ser carregado, um objeto LoaderInfo criado. Um objeto LoaderInfo fornece informaes como o progresso do carregamento, os URLs do carregador e do contedo carregado, o nmero de bytes totais para a mdia e a altura e largura nominais da mdia. O objeto LoaderInfo tambm envia eventos para o monitoramento do progresso do carregamento. O diagrama a seguir mostra os diferentes usos do objeto LoaderInfo - para a ocorrncia da classe principal do arquivo SWF, para um objeto Loader e para um objeto carregado por Loader:
Palco

Objeto LoaderInfo Ocorrncia da classe principal do arquivo SWF

Propriedade loaderInfo

Objeto Loader

Propriedade contentLoaderInfo Objeto LoaderInfo

contedo

Propriedade loaderInfo

O objeto LoaderInfo pode ser acessado como uma propriedade do objeto Loader e do objeto de exibio carregado. Assim que o carregamento comea, o objeto LoaderInfo pode ser acessado por meio da propriedade contentLoaderInfo do objeto Loader. Quando o carregamento do objeto de exibio termina, o objeto LoaderInfo tambm pode ser acessado como uma propriedade do objeto de exibio carregado pela propriedade loaderInfo. A propriedade loaderInfo do objeto de exibio carregado refere-se ao mesmo objeto LoaderInfo da propriedade contentLoaderInfo do objeto Loader. Em outras palavras, um objeto LoaderInfo compartilhado entre um objeto carregado e o objeto Loader que o carregou (entre o carregador e o carregado). Para acessar as propriedades do contedo carregado, adicione um ouvinte de eventos ao objeto LoaderInfo, assim como no cdigo a seguir:

PROGRAMAO DO ACTIONSCRIPT 3.0 315


Programao de exibio

import flash.display.Loader; import flash.display.Sprite; import flash.events.Event; var ldr:Loader = new Loader(); var urlReq:URLRequest = new URLRequest("Circle.swf"); ldr.load(urlReq); ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, loaded); addChild(ldr); function loaded(event:Event):void { var content:Sprite = event.target.content; content.scaleX = 2; }

Para obter mais informaes, consulte Manipulao de eventos na pgina 251.

Especificao do contexto do carregamento


Quando voc carrega um arquivo externo no Flash Player ou no AIR com o mtodo load() ou loadBytes() da classe Loader, pode especificar, se desejar, um parmetro context. Este parmetros um objeto LoaderContext. A classe LoaderContext inclui trs propriedades que permitem definir o contexto de como o contedo carregado pode ser usado:

checkPolicyFile: Use essa propriedade apenas ao carregar um arquivo de imagem (no um arquivo SWF). Se

voc definir a propriedade como true, o Loader verificar o servidor de origem de um determinado arquivo de poltica (consulte Controles de site (arquivos de poltica) na pgina 711). Isso necessrio apenas para o contedo originado de domnios diferentes dos domnios do arquivo SWF que contm o objeto Loader. Se o servidor conceder permisso ao domnio de Loader, o ActionScript dos arquivos SWF do domnio de Loader poder acessar os dados na imagem carregada; em outras palavras, voc pode usar o comando BitmapData.draw() para acessar os dados na imagem carregada. Observe que um arquivo SWF de outros domnios que no so os do objeto Loader pode chamar Security.allowDomain() para permitir um domnio especfico.

securityDomain: S use essa propriedade ao carregar um arquivo SWF (no uma imagem). Especifique-a para um arquivo SWF de um domnio diferente daquele do arquivo que contm o objeto Loader. Quando essa opo especificada, o Flash Player verifica a existncia de um arquivo de poltica e, se existir algum, os arquivos SWF dos domnios permitidos no arquivo de poltica podero cruzar o script do contedo SWF carregado. Voc pode especificar flash.system.SecurityDomain.currentDomain como este parmetro. applicationDomain: Use essa propriedade apenas ao carregar um arquivo SWF gravado no ActionScript . (no em uma imagem ou arquivo SWF gravado no ActionScript 1.0 ou 2.0). Ao carregar o arquivo, voc pode especificar que o arquivo seja includo no mesmo domnio de aplicativo do objeto Loader, definindo o parmetro applicationDomain como flash.system.ApplicationDomain.currentDomain. Colocando o arquivo SWF carregado no mesmo domnio de aplicativo, possvel acessar suas classes diretamente. Isso pode ser til se estiver carregando um arquivo SWF que contm mdia incorporada, que pode ser acessada por meio dos nomes de classe associados. Para obter mais informaes, consulte Uso da classe ApplicationDomain na pgina 657.

Veja um exemplo de busca de um arquivo de poltica ao carregar um bitmap de outro domnio:

PROGRAMAO DO ACTIONSCRIPT 3.0 316


Programao de exibio

var context:LoaderContext = new LoaderContext(); context.checkPolicyFile = true; var urlReq:URLRequest = new URLRequest("http://www.[your_domain_here].com/photo11.jpg"); var ldr:Loader = new Loader(); ldr.load(urlReq, context);

Veja um exemplo de busca de um arquivo de poltica ao carregar um SWF de outro domnio para colocar o arquivo na mesma caixa de proteo do objeto Loader. Alm disso, o cdigo adiciona as classes do arquivo SWF carregado ao mesmo domnio de aplicativo do objeto Loader:
var context:LoaderContext = new LoaderContext(); context.securityDomain = SecurityDomain.currentDomain; context.applicationDomain = ApplicationDomain.currentDomain; var urlReq:URLRequest = new URLRequest("http://www.[your_domain_here].com/library.swf"); var ldr:Loader = new Loader(); ldr.load(urlReq, context);

Para obter mais informaes, consulte a classe LoaderContext na Referncia dos componentes e da linguagem do ActionScript 3.0.

Exemplo: SpriteArranger
O aplicativo de amostra SpriteArranger criado com base no aplicativo de exemplo Geometric Shapes descrito separadamente (consulte Exemplo: GeometricShapes na pgina 125). O aplicativo de amostra SpriteArranger ilustra diversos conceitos de manipulao de objetos de exibio:

Extenso de classes de objeto de exibio Adio de objetos lista de exibio Disposio em camadas de objetos de exibio e trabalho com contineres de objeto de exibio Resposta a eventos de objeto de exibio Uso de propriedades e mtodos de objetos de exibio
Para obter os arquivos de aplicativo desse exemplo, consulte www.adobe.com/go/learn_programmingAS3samples_flash_br. Os arquivos do aplicativo SpriteArranger esto localizados na pasta Exemplos/SpriteArranger. O aplicativo consiste nos seguintes arquivos:
Arquivo SpriteArranger.mxml ou SpriteArranger.fla com/example/programmingas3/SpriteArranger/CircleSprite.as Uma classe que define um tipo de objeto Sprite que processa um crculo na tela. Uma classe que define a tela, que um continer de objeto de exibio que contm objetos GeometricSprite. Uma classe que define um tipo de objeto Sprite que processa um quadrado na tela. Uma classe que define um tipo de objeto Sprite que processa um tringulo na tela. Descrio O arquivo principal do aplicativo no Flash (FLA) ou no Flex (MXML).

com/example/programmingas3/SpriteArranger/DrawingCanvas.as

com/example/programmingas3/SpriteArranger/SquareSprite.as

com/example/programmingas3/SpriteArranger/TriangleSprite.as

PROGRAMAO DO ACTIONSCRIPT 3.0 317


Programao de exibio

Arquivo com/example/programmingas3/SpriteArranger/GeometricSprite.as

Descrio Uma classe que estende o objeto Sprite, usado para definir uma forma na tela. CircleSprite, SquareSprite e TriangleSprite estendem essa classe. A interface bsica que define os mtodos a serem implementados por todas as classes de forma geomtrica. Uma interface que define os mtodos a serem implementados pelas classes de forma geomtrica que tm vrios lados. Um tipo de forma geomtrica que tem lados com o mesmo comprimento posicionados simetricamente ao redor do centro da forma. Um tipo de forma geomtrica que define um crculo. Uma subclasse de RegularPolygon que define um tringulo com todos os lados com o mesmo comprimento. Uma subclasse de RegularPolygon que define um retngulo com os quatro lados com o mesmo comprimento. Uma classe que contm um mtodo de fbrica para criar formas com tamanho e tipo especificados.

com/example/programmingas3/geometricshapes/IGeometricShape.as

com/example/programmingas3/geometricshapes/IPolygon.as

com/example/programmingas3/geometricshapes/RegularPolygon.as

com/example/programmingas3/geometricshapes/Circle.as

com/example/programmingas3/geometricshapes/EquilateralTriangle.as

com/example/programmingas3/geometricshapes/Square.as

com/example/programmingas3/geometricshapes/GeometricShapeFactory.as

Definio das classes SpriteArranger


O aplicativo SpriteArranger permite que o usurio adicione vrios objetos de exibio tela exibida. A classe DrawingCanvas define uma rea de desenho, um tipo de continer de objeto de exibio ao qual o usurio pode adicionar formas na tela. Essas formas na tela so ocorrncias de uma das subclasses de GeometricSprite. A classe DrawingCanvas A classe DrawingCanvas estende a classe Sprite e sua herana definida na declarao da classe DrawingCanvas, do seguinte modo:
public class DrawingCanvas extends Sprite

A classe Sprite uma subclasse de DisplayObjectContainer e de DisplayObject, e a classe DrawingCanvas usa mtodos e propriedades dessas classes. O mtodo do construtor DrawingCanvas() configura um objeto de Rectangle, bounds, que a propriedade usada posteriormente no desenho do contorno da tela. Em seguida, o mtodo initCanvas() chamado do seguinte modo:
this.bounds = new Rectangle(0, 0, w, h); initCanvas(fillColor, lineColor);

Como mostra o exemplo a seguir, o mtodo initCanvas() define vrias propriedades do objeto DrawingCanvas, que foram transmitidas como argumentos para a funo do construtor:

PROGRAMAO DO ACTIONSCRIPT 3.0 318


Programao de exibio

this.lineColor = lineColor; this.fillColor = fillColor; this.width = 500; this.height = 200;

O mtodo initCanvas() chama o mtodo drawBounds(), que desenha a tela usando a propriedade graphics da classe DrawingCanvas. A propriedade graphics herdada da classe Shape.
this.graphics.clear(); this.graphics.lineStyle(1.0, this.lineColor, 1.0); this.graphics.beginFill(this.fillColor, 1.0); this.graphics.drawRect(bounds.left - 1, bounds.top - 1, bounds.width + 2, bounds.height + 2); this.graphics.endFill();

Os mtodos adicionais a seguir da classe DrawingCanvas so invocados com base nas interaes do usurio com o aplicativo:

Os mtodos addShape() e describeChildren(), que so descritos em Adio de objetos de exibio tela na


pgina 319

Os mtodos moveToBack(), moveDown(), moveToFront() e moveUp(), que so descritos em Reorganizao da


disposio em camadas do objeto de exibio na pgina 321

O mtodo onMouseUp(), que descrito em Clique e arrasto de objetos de exibio na pgina 320
A classe GeometricSprite e suas subclasses Cada objeto de exibio que pode ser adicionado tela pelo usurio uma ocorrncia de uma das seguintes subclasses de GeometricSprite:

CircleSprite SquareSprite TriangleSprite


A classe GeometricSprite estende a classe flash.display.Sprite:
public class GeometricSprite extends Sprite

A classe GeometricSprite inclui diversas propriedades comuns a todos os objetos GeometricSprite. Essas propriedades so definidas na funo do construtor com base nos parmetros transmitidos para a funo. Por exemplo:
this.size = size; this.lineColor = lColor; this.fillColor = fColor;

A propriedade geometricShape da classe GeometricSprite define uma interface IGeometricShape, que define as propriedades matemticas, mas no as visuais, da forma. As classes que implementam a interface IGeometricShape so definidas no aplicativo de amostra GeometricShapes (consulte Exemplo: GeometricShapes na pgina 125). A classe GeometricSprite define o mtodo drawShape(), que refinado ainda mais nas definies de substituio em cada subclasse de GeometricSprite. Para obter mais informaes, consulte a seo "Adio de objetos de exibio tela", apresentada a seguir. A classe GeometricSprite tambm fornece os seguintes mtodos:

Os mtodos onMouseDown() e onMouseUp(), que so descritos em Clique e arrasto de objetos de exibio na


pgina 320

PROGRAMAO DO ACTIONSCRIPT 3.0 319


Programao de exibio

Os mtodos showSelected() e hideSelected(), que so descritos em Clique e arrasto de objetos de exibio


na pgina 320

Adio de objetos de exibio tela


Quando o usurio clica no boto Adicionar forma, o aplicativo chama o mtodo addShape() da classe DrawingCanvas. Esse mtodo percorre um novo GeometricSprite chamando a funo do construtor adequada de uma das subclasses de GeometricSprite, como mostra o exemplo a seguir:
public function addShape(shapeName:String, len:Number):void { var newShape:GeometricSprite; switch (shapeName) { case "Triangle": newShape = new TriangleSprite(len); break; case "Square": newShape = new SquareSprite(len); break; case "Circle": newShape = new CircleSprite(len); break; } newShape.alpha = 0.8; this.addChild(newShape); }

Cada mtodo do construtor chama o mtodo drawShape(), que usa a propriedade graphics da classe (herdada da classe Sprite) para desenhar o grfico vetorial adequado. Por exemplo, o mtodo drawShape() da classe CircleSprite inclui o seguinte cdigo:
this.graphics.clear(); this.graphics.lineStyle(1.0, this.lineColor, 1.0); this.graphics.beginFill(this.fillColor, 1.0); var radius:Number = this.size / 2; this.graphics.drawCircle(radius, radius, radius);

Da segunda ltima linha da funo addShape(), definida a propriedade alpha do objeto de exibio (herdada da classe DisplayObject) para que cada objeto de exibio adicionado tela seja ligeiramente transparente, deixando o usurio ver os objetos que esto por trs. A linha final do mtodo addChild() adiciona o novo objeto de exibio lista de filhos da ocorrncia da classe DrawingCanvas, que j est na lista de exibio. Desse modo, o novo objeto de exibio aparece no palco. A interface do aplicativo inclui dois campos de texto, selectedSpriteTxt e outputTxt. As propriedades de texto desses campos so atualizados com informaes sobre os objetos GeometricSprite que foram adicionados tela ou selecionados pelo usurio. A classe GeometricSprite manipula essa tarefa de registro de informaes substituindo o mtodo toString() da seguinte maneira:
public override function toString():String { return this.shapeType + " of size " + this.size + " at " + this.x + ", " + this.y; }

PROGRAMAO DO ACTIONSCRIPT 3.0 320


Programao de exibio

A propriedade shapeType definida como o valor adequado no mtodo do construtor de cada subclasse de GeometricSprite. Por exemplo, o mtodo toString() poderia retornar o seguinte valor para uma ocorrncia de CircleSprite adicionada recentemente ocorrncia de DrawingCanvas:
Circle of size 50 at 0, 0

O mtodo describeChildren() da classe DrawingCanvas percorre a lista de filhos da tela, usando a propriedade numChildren (herdada da classe DisplayObjectContainer), para definir o limite do loop for. gerada uma string que lista cada filho, do seguinte modo:
var desc:String = ""; var child:DisplayObject; for (var i:int=0; i < this.numChildren; i++) { child = this.getChildAt(i); desc += i + ": " + child + '\n'; }

A string resultante usada para definir a propriedade text do campo de texto outputTxt.

Clique e arrasto de objetos de exibio


Quando o usurio clica em uma ocorrncia de GeometricSprite, o aplicativo chama o manipulador de eventos onMouseDown(). Conforme mostrado a seguir, esse manipulador de eventos definido para ouvir eventos de mouse na funo do construtor da classe GeometricSprite:
this.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);

O mtodo onMouseDown() chama o mtodo showSelected() do objeto GeometricSprite. Se for a primeira vez que esse mtodo foi chamado para o objeto, o mtodo criar um novo objeto Shape chamado selectionIndicator e usar a propriedade graphics do objeto Shape para desenhar um retngulo de realce vermelho, do seguinte modo:
this.selectionIndicator = new Shape(); this.selectionIndicator.graphics.lineStyle(1.0, 0xFF0000, 1.0); this.selectionIndicator.graphics.drawRect(-1, -1, this.size + 1, this.size + 1); this.addChild(this.selectionIndicator);

Se no for a primeira vez que o mtodo onMouseDown() chamado, o mtodo simplesmente definir a propriedade visible da forma selectionIndicator (herdada da classe DisplayObject), do seguinte modo:
this.selectionIndicator.visible = true;

O mtodo hideSelected() oculta a forma selectionIndicator do objeto selecionado anteriormente definindo a propriedade visible como false. O manipulador de eventos onMouseDown() tambm chama o mtodo startDrag() (herdado da classe Sprite), que inclui o seguinte cdigo:
var boundsRect:Rectangle = this.parent.getRect(this.parent); boundsRect.width -= this.size; boundsRect.height -= this.size; this.startDrag(false, boundsRect);

Isso permite que o usurio arraste o objeto selecionado em torno da tela, dentro dos limites definidos pelo retngulo boundsRect. Quando o usurio solta o boto do mouse, o evento mouseUp enviado. O mtodo do construtor de DrawingCanvas configura o seguinte ouvinte de eventos:
this.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);

PROGRAMAO DO ACTIONSCRIPT 3.0 321


Programao de exibio

Esse ouvinte de eventos definido para o objeto DrawingCanvas, no para objetos GeometricSprite individuais. Isso ocorre porque quando o objeto GeometricSprite arrastado, pode terminar atrs de outro objeto de exibio (outro objeto GeometricSprite) assim que o mouse solto. O objeto de exibio em primeiro plano receberia o evento de mouse, mas o objeto de exibio que est sendo arrastado pelo usurio no. A adio do ouvinte ao objeto DrawingCanvas garante que o evento seja sempre manipulado. O mtodo onMouseUp() chama o mtodo onMouseUp() do objeto GeometricSprite, que, por sua vez, chama o mtodo stopDrag() do objeto GeometricSprite.

Reorganizao da disposio em camadas do objeto de exibio


A interface de usurio do aplicativo inclui os botes Mover para trs, Mover para baixo, Mover para cima e Mover para frente. Quando o usurio clica em um desses botes, o aplicativo chama o mtodo correspondente da classe DrawingCanvas: moveToBack(), moveDown(), moveUp() ou moveToFront(). Por exemplo, o mtodo moveToBack() inclui o seguinte cdigo:
public function moveToBack(shape:GeometricSprite):void { var index:int = this.getChildIndex(shape); if (index > 0) { this.setChildIndex(shape, 0); } }

O mtodo setChildIndex() (herdado da classe DisplayObjectContainer) usado para colocar o objeto de exibio na posio de ndice 0 na lista de filhos da ocorrncia de DrawingCanvas (this). O mtodo moveDown() funciona de modo similar, mas diminui a posio de ndice do objeto de exibio em incrementos de 1 na lista de filhos da ocorrncia de DrawingCanvas:
public function moveDown(shape:GeometricSprite):void { var index:int = this.getChildIndex(shape); if (index > 0) { this.setChildIndex(shape, index - 1); } }

Os mtodos moveUp() e moveToFront() funcionam de modo similar aos mtodos moveToBack() e moveDown().

322

Captulo 14: Uso de objetos visuais


Embora as imagens e a arte final importadas sejam importantes, a funcionalidade conhecida como API de desenho, que permite desenhar linhas e formas no ActionScript, d a voc a liberdade de iniciar um aplicativo com o equivalente computacional de uma tela em branco, na qual possvel criar as imagens desejadas. A habilidade de criar seus prprios grficos abre muitas possibilidades para seus aplicativos. Com as tcnicas discutidas neste captulo, voc pode criar um programa de desenho, fazer imagens animadas e interativas ou criar de modo programtico seus prprios elementos de interface do usurio, entre outras possibilidades.

Noes bsicas do uso da API de desenho


Introduo ao uso da API de desenho
API de desenho o nome da funcionalidade incorporada ao ActionScript que permite criar grficos vetoriais (linhas, curvas, formas, preenchimentos e gradientes) e exibi-los na tela usando o ActionScript. A classe flash.display.Graphics oferece esta funcionalidade. possvel desenhar com o ActionScript em qualquer ocorrncia de Shape, Sprite ou MovieClip usando a propriedade graphics definida em cada uma dessas classes. (A propriedade graphics de cada uma dessas classes , na verdade, uma ocorrncia da classe Graphics.) Se voc est apenas comeando a desenhar com cdigo, a classe Graphics inclui diversos mtodos que ajudam a desenhar formas comuns, como crculos, elipses, retngulos e retngulos com cantos arredondados. possvel desenh-las como linhas vazias ou formas preenchidas. Quando voc precisar de funcionalidade mais avanada, a classe Graphics tambm inclui mtodos para desenhar linhas e curvas Bzier quadrticas, que podem ser usadas junto com as funes de trigonometria da classe Math para criar qualquer forma desejada. O Flash Player 10 adiciona mais uma API de desenho, que permite desenhar formas inteiras de modo programtico usando um nico comando. Depois que voc estiver familiarizado com a classe Graphics e as tarefas includas em Noes bsicas do uso da API de desenho, passe para Uso avanado da API de desenho na pgina 334 para saber mais sobre esses recursos da API de desenho.

Tarefas comuns da API de desenho


As seguintes tarefas so operaes que provavelmente voc executar usando a API de desenho do ActionScript e que esto descritas neste captulo:

Definio de estilos de linha e estilos de preenchimento para desenhar formas Desenho de linhas retas e curvas Uso de mtodos para desenhar formas como crculos, elipses e retngulos Desenho com linhas e preenchimentos de gradiente Definio de matrizes para criar gradientes Uso de trigonometria com a API de desenho Incorporao da API de desenho em animaes

PROGRAMAO DO ACTIONSCRIPT 3.0 323


Uso de objetos visuais

Conceitos e termos importantes


A lista de referncia a seguir contm termos importantes usados neste captulo:

Ponto de ancoragem: uma das duas extremidades de uma curva Bzier quadrtica. Ponto de controle: o ponto que define a direo e o grau da curva de uma curva Bzier quadrtica. A linha curva
nunca atinge o ponto de controle, mas a linha faz uma curva como se estivesse sendo desenhada perto do ponto de controle.

Espao de coordenadas: o grfico de coordenadas contido em um objeto de exibio, no qual seus elementos-filho
so posicionados.

Preenchimento: a parte interna slida de uma forma que tem uma linha preenchida com cor ou uma forma inteira
que no tem contorno.

Gradiente: cor que consiste em uma transio gradual de uma cor para uma ou mais cores (ao contrrio de uma cor
slida).

Ponto: um local isolado em um espao de coordenadas. No sistema de coordenadas bidimensional usado no


ActionScript, um ponto definido por seu local no eixo x e no eixo y (as coordenadas do ponto).

Curva Bzier quadrtica: tipo de curva definido por uma frmula matemtica especfica. Neste tipo de curva, a
forma de uma curva calculada com base nas posies dos pontos de ancoragem (as extremidades da curva) e em um ponto de controle que define o grau e a direo da curva.

Escala: o tamanho de um objeto em relao ao seu tamanho original. Quando usado como um verbo, dimensionar
um objeto significa alterar seu tamanho, aumentando ou diminuindo o objeto.

Traado: a parte do contorno de uma forma que tem uma linha preenchida com cor ou as linhas de uma forma sem
preenchimento.

Transpor: alterar as coordenadas de um ponto de um espao de coordenadas para outro. Eixo X: o eixo horizontal no sistema de coordenadas bidimensional usado no ActionScript. Eixo Y: o eixo vertical no sistema de coordenadas bidimensional usado no ActionScript.

Teste dos exemplos do captulo


Talvez voc queira testar algumas das listagens de cdigo de exemplo durante a leitura deste captulo. Como este captulo aborda o desenho de contedo visual, o teste das listagens de cdigo envolve a execuo do cdigo e a visualizao dos resultados no SWF que criado. Para testar as listagens de cdigo:
1 Crie um documento do Flash vazio. 2 Selecione um quadro-chave na Linha de tempo. 3 Abra o painel Aes e copie a listagem de cdigo no painel Script. 4 Execute o programa usando Controlar > Testar filme.

Voc ver os resultados da listagem de cdigo no arquivo SWF que criado.

PROGRAMAO DO ACTIONSCRIPT 3.0 324


Uso de objetos visuais

Compreenso da classe Graphics


Cada objeto Shape, Sprite e MovieClip tem uma propriedade graphics, que uma ocorrncia da classe Graphics. A classe Graphics inclui propriedades e mtodos para desenhar linhas, preenchimentos e formas. Se voc quiser que o objeto display seja usado apenas como uma tela para o contedo do desenho, use uma ocorrncia Shape. Uma ocorrncia Shape ser executada de modo melhor do que outros objetos display para desenho, porque ela no tem a sobrecarga da funcionalidade adicional nas classes Sprite e MovieClip. Se quiser um objeto display no qual seja possvel desenhar contedo grfico e no qual outros objetos display estejam contidos, use uma ocorrncia Sprite. Para obter mais informaes sobre a determinao dos objetos display que sero usados para vrias tarefas, consulte Escolha de uma subclasse de DisplayObject na pgina 292.

Desenho de linhas e curvas


Todos os desenhos feitos com uma ocorrncia Graphics baseiam-se em desenhos bsicos com linhas e curvas. Conseqentemente, todos os desenhos do ActionScript devem ser executados utilizando a mesma srie de etapas:

Definir estilos de linha e preenchimento Definir posio inicial do desenho Desenhar linhas, curvas e formas (opcionalmente movendo o ponto de desenho) Concluir a criao de um preenchimento, se necessrio

Definio de estilos de linha e preenchimento


Para desenhar com a propriedade graphics de uma ocorrncia Shape, Sprite ou MovieClip, defina primeiro o estilo (tamanho e cor da linha, cor do preenchimento) a ser utilizado durante o desenho. Da mesma forma que acontece quando voc usa as ferramentas de desenho do Adobe Flash CS4 Professional ou outro aplicativo de desenho, ao utilizar o ActionScript para desenhar, voc pode desenhar com ou sem traado e com ou sem uma cor de preenchimento. Voc especifica a aparncia do traado utilizando o mtodo lineStyle() ou lineGradientStyle(). Para criar uma linha slida, use o mtodo lineStyle(). Quando voc chamar esse mtodo, os valores mais comuns que voc especificar sero os trs primeiros parmetros: espessura da linha, cor e alfa. Por exemplo, essa linha de cdigo instrui Shape chamada myShape a desenhar linhas com espessura de 2 pixels, vermelhas (0x990000) e 75% opacas:
myShape.graphics.lineStyle(2, 0x990000, .75);

O valor padro para o parmetro alpha 1.0 (100%), ento voc pode deix-lo desativado, se quiser uma linha totalmente opaca. O mtodo lineStyle() tambm aceita dois parmetros adicionais para dica de pixel e modo de escala; para obter mais informaes sobre o uso desses parmetros, consulte a descrio do mtodo Graphics.lineStyle() em Referncia dos componentes e da linguagem do ActionScript 3.0. Para criar uma linha gradiente, use o mtodo lineGradientStyle(). Esse mtodo descrito em Criao de linhas e preenchimentos gradientes na pgina 327. Se voc quiser criar uma forma preenchida, chame os mtodos beginFill(), beginGradientFill(), beginBitmapFill() ou beginShaderFill() antes de iniciar o desenho. O mais bsico deles, o mtodo beginFill(), aceita dois parmetros: a cor de preenchimento e (opcionalmente) um valor alfa para a cor de preenchimento. Por exemplo, se voc quiser desenhar uma forma com um preenchimento verde slido, utilize o seguinte cdigo (considerando que est desenhando em um objeto chamado myShape):
myShape.graphics.beginFill(0x00FF00);

PROGRAMAO DO ACTIONSCRIPT 3.0 325


Uso de objetos visuais

Chamar qualquer mtodo de preenchimento implicitamente encerra qualquer preenchimento anterior antes de iniciar um novo. Chamar qualquer mtodo que especifique um estilo de traado substitui o traado anterior, mas no altera o preenchimento especificado anteriormente e vice-versa. Depois de especificar as propriedades style e fill da linha, a prxima etapa indicar o ponto de incio para o desenho. A ocorrncia Graphics tem um ponto de desenho, como a ponta de uma caneta em um pedao de papel. Sempre que o ponto de desenho for localizado, esse ser o local em que a prxima ao de desenho ser iniciada. Inicialmente um objeto Graphics comea com seu ponto de desenho no ponto 0, 0 no espao de coordenadas do objeto em que est o desenho. Para iniciar o desenho em um ponto diferente, voc pode primeiro chamar o mtodo moveTo() antes de chamar um dos mtodos de desenho. Isso semelhante a tirar do papel a ponta da caneta e mov-la para uma nova posio. Com o ponto de desenho no local, desenhe usando uma srie de chamadas de mtodos de desenho lineTo() (para linhas retas) e curveTo() (para linhas curvas). Enquanto estiver desenhando, chame o mtodo moveTo() a qualquer momento para mover o ponto de desenho para uma nova posio sem desenhar. Enquanto desenha, se voc especificou uma cor de preenchimento, poder orientar o Adobe Flash Player ou o Adobe AIR a encerrar o preenchimento chamando o mtodo endFill(). Se voc no desenhou uma forma fechada (em outras palavras, se no momento em que voc chama endFill(), o ponto de desenho no est no ponto inicial da forma), quando chamou o mtodo endFill(), o Flash Player ou o AIR fecha automaticamente a forma desenhando uma linha reta do ponto de desenho atual at o local especificado na chamada mais recente de moveTo(). Se voc iniciou um preenchimento e no chamou endFill(), chamar beginFill() (ou qualquer um dos outros mtodos de preenchimento) fecha o preenchimento atual e inicia um novo.

Desenho de linhas retas


Quando voc chama o mtodo lineTo(), o objeto Graphics desenha uma linha reta do ponto de desenho atual at as coordenadas especificadas como os dois parmetros na chamada do mtodo, com o estilo de linha tambm especificado. Por exemplo, essa linha de cdigo coloca o ponto de desenho no ponto 100, 100 e desenha uma linha at o ponto 200, 200:
myShape.graphics.moveTo(100, 100); myShape.graphics.lineTo(200, 200);

O exemplo a seguir desenha tringulos vermelho e verde com uma altura de 100 pixels:
var triangleHeight:uint = 100; var triangle:Shape = new Shape(); // red triangle, starting at point 0, 0 triangle.graphics.beginFill(0xFF0000); triangle.graphics.moveTo(triangleHeight / 2, 0); triangle.graphics.lineTo(triangleHeight, triangleHeight); triangle.graphics.lineTo(0, triangleHeight); triangle.graphics.lineTo(triangleHeight / 2, 0); // green triangle, starting at point 200, 0 triangle.graphics.beginFill(0x00FF00); triangle.graphics.moveTo(200 + triangleHeight / 2, 0); triangle.graphics.lineTo(200 + triangleHeight, triangleHeight); triangle.graphics.lineTo(200, triangleHeight); triangle.graphics.lineTo(200 + triangleHeight / 2, 0); this.addChild(triangle);

PROGRAMAO DO ACTIONSCRIPT 3.0 326


Uso de objetos visuais

Desenho de curvas
O mtodo curveTo() desenha uma curva Bzier quadrtica. Isso desenha um arco que conecta dois pontos (chamados pontos de ancoragem, enquanto se curva a um terceiro ponto (chamado ponto de controle). O objeto Graphics usa a posio atual do desenho como o primeiro ponto de ancoragem. Quando voc chama o mtodo curveTo(), passa quatro parmetros: as coordenadas x e y do ponto de controle, seguido pelas coordenadas x e y do segundo ponto de ancoragem. Por exemplo, o seguinte cdigo desenha uma curva comeando no ponto 100, 100 e terminando no ponto 200, 200. Como o ponto de controle est no ponto 175, 125, isso cria uma curva que se move para a direita e para baixo:
myShape.graphics.moveTo(100, 100); myShape.graphics.curveTo(175, 125, 200, 200);

O exemplo a seguir desenha objetos circulares vermelho e verde com uma largura e altura de 100 pixels. Observe que, devido natureza da equao de Bzier de segundo grau, esses crculos no so perfeitos.
var size:uint = 100; var roundObject:Shape = new Shape(); // red circular shape roundObject.graphics.beginFill(0xFF0000); roundObject.graphics.moveTo(size / 2, 0); roundObject.graphics.curveTo(size, 0, size, size / 2); roundObject.graphics.curveTo(size, size, size / 2, size); roundObject.graphics.curveTo(0, size, 0, size / 2); roundObject.graphics.curveTo(0, 0, size / 2, 0); // green circular shape roundObject.graphics.beginFill(0x00FF00); roundObject.graphics.moveTo(200 + size / 2, 0); roundObject.graphics.curveTo(200 + size, 0, 200 + size, size / 2); roundObject.graphics.curveTo(200 + size, size, 200 + size / 2, size); roundObject.graphics.curveTo(200, size, 200, size / 2); roundObject.graphics.curveTo(200, 0, 200 + size / 2, 0); this.addChild(roundObject);

Desenho de formas utilizando os mtodos incorporados


Para sua convenincia, ao desenhar formas comuns como crculo, elipse, retngulos e retngulas com cantos arredondados, o ActionScript 3.0 tem mtodos que desenham essas formas comuns para voc. Esses so os mtodos drawCircle(), drawEllipse(), drawRect(), drawRoundRect() edrawRoundRectComplex() da classe Graphics. Esses mtodos tambm podem ser utilizados no lugar dos mtodos lineTo() e curveTo(). Observe, entretanto, que voc ainda deve especificar os estilos de linha e preenchimento antes de chamar esses mtodos. O exemplo a seguir recria o exemplo de desenho de quadrados vermelho, verde e azul com largura e altura de 100 pixels. Esse cdigo usa o mtodo drawRect() e, alm disso, especifica que a cor de preenchimento tem um alfa de 50% (0,5):

PROGRAMAO DO ACTIONSCRIPT 3.0 327


Uso de objetos visuais

var squareSize:uint = 100; var square:Shape = new Shape(); square.graphics.beginFill(0xFF0000, 0.5); square.graphics.drawRect(0, 0, squareSize, squareSize); square.graphics.beginFill(0x00FF00, 0.5); square.graphics.drawRect(200, 0, squareSize, squareSize); square.graphics.beginFill(0x0000FF, 0.5); square.graphics.drawRect(400, 0, squareSize, squareSize); square.graphics.endFill(); this.addChild(square);

Em um objeto Sprite ou MovieClip, o contedo de desenho criado com a propriedade graphics sempre aparece atrs de todos os objetos display filhos contidos no objeto. Alm disso, o contedo da propriedade graphics no um objeto display separado; portanto ele no aparece na lista de filhos do objeto Sprite ou MovieClip. Por exemplo, o seguinte objeto Sprite tem um crculo desenhado com sua propriedade graphics e um objeto TextField em sua lista de objetos display filhos:
var mySprite:Sprite = new Sprite(); mySprite.graphics.beginFill(0xFFCC00); mySprite.graphics.drawCircle(30, 30, 30); var label:TextField = new TextField(); label.width = 200; label.text = "They call me mellow yellow..."; label.x = 20; label.y = 20; mySprite.addChild(label); this.addChild(mySprite);

Observe que TextField aparece na parte superior do crculo desenhado com o objeto graphics.

Criao de linhas e preenchimentos gradientes


O objeto graphics tambm pode desenhar traados e preenchimentos com gradientes em vez de cores slidas. Um traado gradiente criado com o mtodo lineGradientStyle() e um preenchimento de gradiente criado com o mtodo beginGradientFill(). Os dois mtodos aceitam os mesmos parmetros. Os primeiros quatro so obrigatrios: tipo, cores, alfas e propores. Os outros quatro so opcionais, mas teis para personalizao avanada.

O primeiro parmetro especifica o tipo de gradiente que est criando. Os valores aceitveis so
GradientFill.LINEAR ou GradientFill.RADIAL.

O segundo parmetro especifica a matriz dos valores de cor que sero utilizados. Em um gradiente linear, as cores
sero organizadas da esquerda para a direita. Em um gradiente radial, as cores sero organizadas de dentro para fora. A ordem das cores da matriz representa a ordem em que elas sero desenhadas no gradiente.

O terceiro parmetro especifica os valores de transparncia alfa das cores correspondentes no parmetro anterior. O quarto parmetro especifica as propores ou a nfase que cada cor tem no gradiente. A faixa de valores aceitvel
de 0 a 255. Esses valores no representam a largura ou a altura, mas a posio no gradiente; 0 representa o incio do gradiente e 255 representa o final do gradiente. A matriz de propores deve aumentar seqencialmente e tem o mesmo nmero de entradas que as matrizes de cores e alfa especificadas no segundo e no terceiro parmetros. Embora o quinto parmetro, a matriz de transformao, seja opcional, ele normalmente usado porque fornece um modo fcil e eficiente de controlar a aparncia do gradiente. Esse parmetro aceita uma ocorrncia Matrix. O modo mais fcil de criar um objeto Matrix para um gradiente usar o mtodo createGradientBox() da classe Matrix.

PROGRAMAO DO ACTIONSCRIPT 3.0 328


Uso de objetos visuais

Definio de um objeto Matrix para usar com um gradiente


Voc usa os mtodos beginGradientFill() e lineGradientStyle() da classe flash.display.Graphics para definir gradientes para usar em formas. Ao definir um gradiente, voc fornece uma matriz como um dos parmetros desses mtodos. A maneira mais fcil de definir a matriz utilizando o mtodo createGradientBox() da classe Matrix, que cria uma matriz utilizada para definir o gradiente. Voc define a escala, a rotao e a posio do gradiente utilizando os parmetros passados para o mtodo createGradientBox(). O mtodo createGradientBox() aceita os seguintes parmetros:

Largura da caixa de gradientes: a largura (em pixels) para a qual o gradiente ser ampliado. Altura da caixa de gradientes: a altura (em pixels) para a qual o gradiente ser ampliado. Rotao da caixa de gradientes: a rotao (em radianos) que ser aplicada ao gradiente. Movimentao horizontal: a distncia (em pixels) que o gradiente se deslocar horizontalmente. Movimentao vertical: a distncia (em pixels) que o gradiente se deslocar verticalmente.
Por exemplo, considere um gradiente com as seguintes caractersticas:

GradientType.LINEAR 255].

Duas cores, verde e azul, com a matriz de propores definidas para [0,
SpreadMethod.PAD InterpolationMethod.LINEAR_RGB

Os seguintes exemplos mostram gradientes nos quais o parmetro rotation do mtodo createGradientBox() diferente conforme indicado, mas todas as configuraes permanecem as mesmas:
width = 100; height = 100; rotation = 0; tx = 0; ty = 0; width = 100; height = 100; rotation = Math.PI/4; // 45 tx = 0; ty = 0; width = 100; height = 100; rotation = Math.PI/2; // 90 tx = 0; ty = 0;

Os seguintes exemplos mostram os efeitos de um gradiente linear verde para azul no qual os parmetros rotation, tx e ty do mtodo createGradientBox() so diferentes conforme indicado, mas todas as outras configuraes permanecem as mesmas:

PROGRAMAO DO ACTIONSCRIPT 3.0 329


Uso de objetos visuais

width = 50; height = 100; rotation = 0; tx = 0; ty = 0; width = 50; height = 100; rotation = 0 tx = 50; ty = 0; width = 100; height = 50; rotation = Math.PI/2; // 90 tx = 0; ty = 0; width = 100; height = 50; rotation = Math.PI/2; // 90 tx = 0; ty = 50;

Os parmetros width, height, tx e ty do mtodo createGradientBox() tambm afetam o tamanho e a posio de um preenchimento de gradiente radial, conforme mostram os exemplos a seguir:
width = 50; height = 100; rotation = 0; tx = 25; ty = 0;

O cdigo a seguir produz o ltimo gradiente radial ilustrado:

PROGRAMAO DO ACTIONSCRIPT 3.0 330


Uso de objetos visuais

import flash.display.Shape; import flash.display.GradientType; import flash.geom.Matrix; var var var var var var var type:String = GradientType.RADIAL; colors:Array = [0x00FF00, 0x000088]; alphas:Array = [1, 1]; ratios:Array = [0, 255]; spreadMethod:String = SpreadMethod.PAD; interp:String = InterpolationMethod.LINEAR_RGB; focalPtRatio:Number = 0;

var matrix:Matrix = new Matrix(); var boxWidth:Number = 50; var boxHeight:Number = 100; var boxRotation:Number = Math.PI/2; // 90 var tx:Number = 25; var ty:Number = 0; matrix.createGradientBox(boxWidth, boxHeight, boxRotation, tx, ty); var square:Shape = new Shape; square.graphics.beginGradientFill(type, colors, alphas, ratios, matrix, spreadMethod, interp, focalPtRatio); square.graphics.drawRect(0, 0, 100, 100); addChild(square);

Observe que a largura e a altura do preenchimento de gradiente so determinadas pela largura e altura da matriz de gradientes em vez da largura e altura desenhadas utilizando o objeto Graphics. Ao desenhar com objetos Graphics, voc desenha o que existe naquelas coordenadas na matriz de gradiente. Mesmo que voc use um dos mtodos shape de um objeto Graphics como drawRect(), o gradiente no se amplia para o tamanho da forma que desenhada o tamanho do gradiente deve ser especificado na prpria matrix de gradiente. A seguir est uma ilustrao da diferena visual entre as dimenses da matrix de gradiente e das dimenses do prprio desenho.
var myShape:Shape = new Shape(); var gradientBoxMatrix:Matrix = new Matrix(); gradientBoxMatrix.createGradientBox(100, 40, 0, 0, 0); myShape.graphics.beginGradientFill(GradientType.LINEAR, [0xFF0000, 0x00FF00, 0x0000FF], [1, 1, 1], [0, 128, 255], gradientBoxMatrix); myShape.graphics.drawRect(0, 0, 50, 40); myShape.graphics.drawRect(0, 50, 100, 40); myShape.graphics.drawRect(0, 100, 150, 40); myShape.graphics.endFill(); this.addChild(myShape);

Esse cdigo desenha trs gradientes com o mesmo estilo de preenchimento, especificado com uma distribuio igual de vermelho, verde e azul. Os gradientes so desenhados utilizando o mtodo drawRect() com larguras de pixel de 50, 100 e 150 respectivamente. A matriz de gradiente que especificada no mtodo beginGradientFill() criada com uma largura de 100 pixels. Isso significa que o primeiro gradiente engloba apenas meio espectro de gradiente, o segundo engloba todo ele e o terceiro engloba todo ele e tem 50 pixels adicionais de azul estendidos para a direita.

PROGRAMAO DO ACTIONSCRIPT 3.0 331


Uso de objetos visuais

O mtodo lineGradientStyle() funciona de modo semelhante a beginGradientFill() exceto pelo fato de que ao definir o gradiente, voc deve especificar a espessura do trao utilizando o mtodo lineStyle() antes do desenho. O cdigo a seguir desenha uma caixa com um traado gradiente vermelho, verde e azul:
var myShape:Shape = new Shape(); var gradientBoxMatrix:Matrix = new Matrix(); gradientBoxMatrix.createGradientBox(200, 40, 0, 0, 0); myShape.graphics.lineStyle(5, 0); myShape.graphics.lineGradientStyle(GradientType.LINEAR, [0xFF0000, 0x00FF00, 0x0000FF], [1, 1, 1], [0, 128, 255], gradientBoxMatrix); myShape.graphics.drawRect(0, 0, 200, 40); this.addChild(myShape);

Para obter mais informaes sobre a classe Matrix, consulte Uso de objetos Matrix na pgina 349.

Uso da classe Math com mtodos de desenho


O objeto Graphics desenha crculos e quadrados, mas tambm pode desenhar formas mais complexas, especialmente quando os mtodos de desenho so utilizados junto com as propriedades e os mtodos da classe Math. A classe Math contm constantes matemticas comuns, como Math.PI (aproximadamente 3.14159265...), uma constante para proporo de circunferncia de um crculo em relao ao seu dimetro. Ela tambm contm mtodos para funes de trigonometria, incluindo Math.sin(), Math.cos() e Math.tan() entre outros. Desenhar formas utilizando esses mtodos e constantes cria efeitos visuais mais dinmicos, especialmente quando utilizados com repetio ou recurso. Muitos mtodos da classe Math esperam medidas circulares em unidades de radianos em vez de graus. A converso entre esses dois tipos de unidades um uso comum da classe Math:
var degrees = 121; var radians = degrees * Math.PI / 180; trace(radians) // 2.111848394913139

O exemplo a seguir cria uma onda senoidal e uma cosenoidal entre os mtodos Math.sin() e Math.cos() para um determinado valor.
var var var var var var sinWavePosition = 100; cosWavePosition = 200; sinWaveColor:uint = 0xFF0000; cosWaveColor:uint = 0x00FF00; waveMultiplier:Number = 10; waveStretcher:Number = 5;

var i:uint; for(i = 1; i < stage.stageWidth; i++) { var sinPosY:Number = Math.sin(i / waveStretcher) * waveMultiplier; var cosPosY:Number = Math.cos(i / waveStretcher) * waveMultiplier; graphics.beginFill(sinWaveColor); graphics.drawRect(i, sinWavePosition + sinPosY, 2, 2); graphics.beginFill(cosWaveColor); graphics.drawRect(i, cosWavePosition + cosPosY, 2, 2); }

PROGRAMAO DO ACTIONSCRIPT 3.0 332


Uso de objetos visuais

Animao com a API de desenho


Uma vantagem da criao de contedo com a API de desenho que voc no est limitado a posicionar o contedo apenas uma vez. O que voc desenha pode ser modificado pela manuteno e modificao das variveis que usa ao desenhar. Voc pode transmitir a animao alterando as variveis e redesenhando, em um perodo de quadros ou com um temporizador. Por exemplo, o cdigo a seguir altera a exibio com cada quadro transmitido (atendendo ao evento Event.ENTER_FRAME), incrementando a contagem de graus atual, direciona o objeto graphics para limpar e redesenhar na posio atualizada.
stage.frameRate = 31; var currentDegrees:Number = 0; var radius:Number = 40; var satelliteRadius:Number = 6; var container:Sprite = new Sprite(); container.x = stage.stageWidth / 2; container.y = stage.stageHeight / 2; addChild(container); var satellite:Shape = new Shape(); container.addChild(satellite); addEventListener(Event.ENTER_FRAME, doEveryFrame); function doEveryFrame(event:Event):void { currentDegrees += 4; var radians:Number = getRadians(currentDegrees); var posX:Number = Math.sin(radians) * radius; var posY:Number = Math.cos(radians) * radius; satellite.graphics.clear(); satellite.graphics.beginFill(0); satellite.graphics.drawCircle(posX, posY, satelliteRadius); } function getRadians(degrees:Number):Number { return degrees * Math.PI / 180; }

Para produzir um resultado significativamente diferente, voc pode modificar as variveis base iniciais no incio do cdigo, currentDegrees, radius esatelliteRadius. Por exemplo, tente reduzir a varivel radius e/ou aumentar a varivel totalSatellites. Esse apenas um exemplo de como a API de desenho pode criar uma exibio visual cuja complexidade oculta a simplicidade de sua criao.

Exemplo: Gerador visual algortmico


O exemplo do Gerador visual algortmico desenha dinamicamente no palco vrios "satlites" ou crculos que se movem em uma rbita circular. Entre os recursos explorados esto:

Uso da API de desenho para desenhar uma forma bsica com aparncias dinmicas Conexo da interao do usurio com as propriedades utilizadas em um desenho

PROGRAMAO DO ACTIONSCRIPT 3.0 333


Uso de objetos visuais

Transmisso de animao por meio da limpeza do palco em cada quadro e redesenho


O exemplo na subseo anterior animou um satlite solitrio utilizando o evento Event.ENTER_FRAME. Esse exemplo vai alm disso, criando um painel de controle com sries de controles deslizantes que atualizam imediatamente a exibio visual de vrios satlites. Esse exemplo formaliza o cdigo em classes externas e agrupa o cdigo de criao de satlites em um loop, armazenando uma referncia para cada satlite em uma matriz satellites. Para obter os arquivos de aplicativo deste exemplo, consulte www.adobe.com/go/learn_programmingAS3samples_flash_br. Os arquivos do aplicativo podem ser encontrados na pasta Amostras/AlgorithmicVisualGenerator. Essa pasta contm os seguintes arquivos:
Arquivo AlgorithmicVisualGenerator.fla com/example/programmingas3/algorithmic/AlgorithmicVisualGenerator.as Descrio O arquivo principal do aplicativo no Flash (FLA). A classe que fornece a funcionalidade principal do aplicativo, que inclui desenho de satlites no palco e resposta aos eventos do painel de controle para atualizar as variveis que afetam o desenho dos satlites. A classe que gerencia a interao do usurio com vrios controles deslizantes e eventos de despacho quando eles ocorrem. Uma classe que representa o objeto display que gira em uma rbita ao redor de um ponto central e contm propriedades relacionadas ao estados atual do seu desenho.

com/example/programmingas3/algorithmic/ControlPanel.as

com/example/programmingas3/algorithmic/Satellite.as

Definio de ouvintes
O aplicativo primeiro cria trs ouvintes. O primeiro atende um evento despachado do painel de controle informando que necessrio recriar os satlites. O segundo atende s alteraes de tamanho do palco do arquivo SWF. O terceiro atende a cada transmisso de quadro no arquivo SWF e para redesenhar utilizando a funo doEveryFrame().

Criao de satlites
Assim que os ouvintes estiverem definidos, a funobuild() chamada. Essa funo chama primeiro a funo clear(), que esvazia a matriz satellites e apaga qualquer desenho anterior no palco. Isso necessrio pois a funo build() pode ser chamada novamente sempre que o painel de controle envia um evento para isso, como quando as configuraes de cor so alteradas. Nesse caso, os satlites devem ser removidos e recriados. A funo ento cria os satlites, configurando as propriedades iniciais necessrias para a criao, como a varivel
position, que comea em uma posio aleatria na rbita, e a varivel color, que neste exemplo no alterada pois

o satlite foi criado. Como cada satlite criado, uma referncia a ele includa na matriz satellites. Quando a funo doEveryFrame() chamada, ela ser atualizada para todos os satlites nessa matriz.

Atualizao da posio do satlite


A funo doEveryFrame() o corao do processo de animao do aplicativo. Ela chamada para cada quadro, em uma taxa igual taxa de quadro do arquivo SWF. As pequenas alteraes das variveis do desenho transmitem a aparncia da animao.

PROGRAMAO DO ACTIONSCRIPT 3.0 334


Uso de objetos visuais

A funo primeiro apaga todos os desenhos anteriores e redesenha o plano de fundo. Em seguida, ela percorre cada continer de satlite, incrementa a propriedade position de cada satlite e atualiza as propriedades radius e orbitRadius que podem ter sido alteradas na interao do usurio com o painel de controle. Por fim, o satlite atualiza-se para a sua nova posio chamando o mtodo draw() da classe Satellite. Observe que o contador, i, incrementa apenas at a varivel visibleSatellites. Isso porque se o usurio limitar a quantidade de satlites que so exibidos no painel de controle, os satlites restantes no loop no devero ser redesenhados, mas devero ficar ocultos. Isso ocorre em um loop que segue imediatamente o loop responsvel pelo desenho. Quando a funo doEveryFrame() concluda, o nmero de visibleSatellites atualizado na posio na tela.

Resposta interao do usurio


A interao do usurio ocorre por meio do painel de controle, que gerenciado pela classe ControlPanel. Essa classe define um ouvinte junto com os valores individuais mnimo, mximo e padro de cada controle deslizante. medida que o usurio move esses controles, a funo changeSetting() chamada. Essa funo atualiza as propriedades do painel de controle. Se a alterao exigir a criao da exibio, um evento despachado e ento tratado no arquivo principal do aplicativo. medida que as configuraes do painel de controle so alteradas, a funo doEveryFrame() desenha cada satlite com as variveis atualizadas.

Personalizao posterior
Esse exemplo apenas um esquema bsico de como gerar visuais utilizando a API de desenho. Ele usa relativamente poucas linhas de cdigo para criar uma experincia interativa que parece muito complexa. Apesar disso, esse exemplo pode ser estendido com pequenas alteraes Algumas idias:

A funo doEveryFrame() pode incrementar o valor de cor do satlite. A funo doEveryFrame() pode reduzir ou expandir o raio do satlite com o tempo. O raio do satlite no precisa ser circular; ele pode usar a classe Math para se mover de acordo com uma onda
senoidal, por exemplo.

Os satlites podem usar a deteco de pressionamento com outros satlites.


A API de desenho pode ser utilizada como uma alternativa para criar efeitos visuais no ambiente de autoria do Flash, desenhando formas bsicas no tempo de execuo. Mas ela tambm pode ser utilizada para criar efeitos visuais diversos e com escopo diferente que no podem ser criados manualmente. Com a utilizao da API de desenho e um pouco de matemtica, o autor do ActionScript pode dar vida a vrias criaes inesperadas.

Uso avanado da API de desenho


Introduo ao uso da API de desenho avanada
O Flash Player 10 introduz suporte para um conjunto avanado de recursos de desenho. A nova API de desenho expande os mtodos de desenho de verses anteriores, por isso possvel estabelecer conjuntos de dados para gerar formas, alterar formas em tempo de execuo e criar efeitos tridimensionais. A nova API de desenho consolida mtodos existentes em novos comandos. Os novos comandos utilizam matrizes de vetor e classes de enumerao para fornecer conjuntos de dados aos mtodos de desenho. O uso de matrizes de vetor permite que formas mais complexas sejam renderizadas rapidamente e que os desenvolvedores alterem os valores de matriz de modo programtico para a renderizao dinmica de formas em tempo de execuo.

PROGRAMAO DO ACTIONSCRIPT 3.0 335


Uso de objetos visuais

Os recursos de desenho introduzidos no Flash Player 10 esto descritos nas seguintes sees: Caminhos de desenho na pgina 335, Definio de regras de contorno na pgina 337, Uso de classes de dados grficos na pgina 339 e Sobre o uso de drawTriangles() na pgina 341.

Tarefas comuns da API de desenho avanada


As seguintes tarefas so operaes que provavelmente voc executar usando a API de desenho avanada do ActionScript:

Uso de objetos Vector para armazenar dados para mtodos de desenho Definio de caminhos para desenhar formas de modo programtico Definio de regras de contorno para determinar como preencher formas sobrepostas Uso de classes de dados grficos Uso de tringulos e mtodos de desenho para efeitos tridimensionais

Conceitos e termos importantes


A lista de referncia a seguir contm termos importantes usados nesta seo:

Vector: uma matriz de valores, todos com o mesmo tipo de dados. Um objeto Vector pode armazenar uma matriz
de valores que os mtodos de desenho usam para construir linhas e formas com um nico comando. Para obter mais informaes sobre objetos Vector, consulte Matrizes indexadas na pgina 159.

Caminho: um caminho formado por um ou mais segmentos retos ou curvos. O incio e o final de cada segmento
so marcados por coordenadas, que funcionam como alfinetes que prendem um esboo. Um caminho pode ser fechado (por exemplo, um crculo) ou aberto, com extremidades distintas (como uma linha ondulada).

Contorno: a direo de um caminho conforme interpretada pelo renderizador, seja positiva (sentido horrio) ou
negativa (sentido anti-horrio).

GraphicsStroke: classe usada para definir o estilo da linha. Embora o termo traado no seja novo no
ActionScript, o uso de uma classe para designar um estilo de linha com sua propriedade de preenchimento novo no ActionScript. possvel ajustar o estilo de uma linha dinamicamente usando a classe GraphicsStroke.

Objeto Fill: objetos criados usando novas classes de exibio, como flash.display.GraphicsBitmapFill e
flash.display.GraphicsGradientFill, que so passadas para o comando de desenho Graphics.drawGraphicsData(). Os objetos Fill e os novos comandos de desenho introduzem uma abordagem de programao mais orientada a objetos para replicar Graphics.beginBitmapFill() e Graphics.beginGradientFill().

Caminhos de desenho
A seo sobre como desenhar linhas e curvas (consulteDesenho de linhas e curvas na pgina 324) apresentou os comandos usados para desenhar uma nica linha (Graphics.lineTo()) ou curva (Graphics.curveTo()) e mover a linha at outro ponto (Graphics.moveTo()) para obter uma forma. O Flash Player 10 introduz suporte para novas APIs de desenho do ActionScript, como Graphics.drawPath() e Graphics.drawTriangles(), que utilizam os comandos de desenho existentes como parmetros. Por isso, uma srie de comandos Graphics.lineTo(), Graphics.curveTo() ou Graphics.moveTo() so executados em uma nica instruo.

PROGRAMAO DO ACTIONSCRIPT 3.0 336


Uso de objetos visuais

Duas novas incluses feitas na API de desenho permitem que Graphics.drawPath() e Graphics.drawTriangles() consolidem os comandos existentes:

A classe de enumerao GraphicsPathCommand: a classe GraphicsPathCommand associa vrios comandos de


desenho a valores de constante. Use uma srie desses valores como parmetros para o mtodo
Graphics.drawPath(). Em seguida, com um nico comando, voc pode renderizar a forma inteira ou vrias

formas. Tambm possvel alterar dinamicamente os valores passados para esses mtodos a fim de alterar uma forma existente.

Matrizes de vetor: as matrizes de vetor contm uma srie de valores de um tipo de dados especfico. Assim, voc
pode armazenar um grupo de constantes GraphicsPathCommand em um objeto Vector e uma srie de coordenadas em outro objeto Vector. Graphics.drawPath() ou Graphics.drawTriangles() atribui esses valores juntos para gerar um caminho de desenho ou uma forma. No mais preciso separar comandos para cada segmento de uma forma. Por exemplo, o mtodo Graphics.drawPath() consolida Graphics.moveTo(), Graphics.lineTo() e Graphics.curveTo() em um nico mtodo. Em vez de cada mtodo ser chamado separadamente, eles so abstrados em identificadores numricos, conforme definido na classe GraphicsPathCommand. Uma operao moveTo() representada por um 1, enquanto uma operao lineTo() um 2. Armazene uma matriz desses valores em um objeto Vector.<int> para uso no parmetro commands. Em seguida, crie outra matriz que contenha coordenadas em um objeto Vector.<Number> para o parmetro data. Cada valor GraphicsPathCommand corresponde aos valores de coordenada armazenados no parmetro de dados em que dois nmeros consecutivos definem um local no espao de coordenadas de destino. Nota: Os valores do vetor no so objetos Point; o vetor consiste em uma srie de nmeros em que cada grupo de dois nmeros representa um par de coordenadas x/y. O mtodo Graphics.drawPath() compara cada comando com seus respectivos valores de ponto (uma coleo de dois ou quatro nmeros) para gerar um caminho no objeto Graphics:

PROGRAMAO DO ACTIONSCRIPT 3.0 337


Uso de objetos visuais

package{ import flash.display.*; public class DrawPathExample extends Sprite { public function DrawPathExample(){ var square_commands:Vector.<int> = new Vector.<int>(5,true); square_commands[0] = 1;//moveTo square_commands[1] = 2;//lineTo square_commands[2] = 2; square_commands[3] = 2; square_commands[4] = 2; var square_coord:Vector.<Number> = new Vector.<Number>(10,true); square_coord[0] = 20; //x square_coord[1] = 10; //y square_coord[2] = 50; square_coord[3] = 10; square_coord[4] = 50; square_coord[5] = 40; square_coord[6] = 20; square_coord[7] = 40; square_coord[8] = 20; square_coord[9] = 10; graphics.beginFill(0x442266);//set the color graphics.drawPath(square_commands, square_coord); } } }

Definio de regras de contorno


O Flash Player 10 tambm introduz o conceito de contorno de caminho: a direo de um caminho. O contorno de um caminho tanto positivo (sentido horrio) quanto negativo (sentido anti-horrio). A ordem em que o renderizador interpreta as coordenadas fornecidas pelo vetor para o parmetro de dados determina o contorno.
A

3 B

1 C

Contorno positivo e negativo A. Setas indicam a direo do desenho B. Rotao positiva (sentido horrio) C. Rotao negativa (sentido anti-horrio)

Alm disso, observe que o mtodo Graphics.drawPath() tem um terceiro parmetro opcional, chamado winding:
drawPath(commands:Vector.<int>, data:Vector.<Number>, winding:String = "evenOdd"):void

PROGRAMAO DO ACTIONSCRIPT 3.0 338


Uso de objetos visuais

Neste contexto, o terceiro parmetro uma string ou uma constante que especifica a regra de contorno ou de preenchimento para interseco de caminhos. (Os valores de constante so definidos na classe GraphicsPathWinding como GraphicsPathWinding.EVEN_ODD ou GraphicsPathWinding.NON_ZERO.) A regra de contorno importante quando ocorre interseco de caminhos. A regra par-mpar a regra de contorno padro, sendo utilizada por todas as APIs de desenho anteriores ao Flash Player 10. Par-mpar tambm a regra padro para o mtodo Graphics.drawPath(). Com a regra de contorno parmpar, qualquer caminho de interseco alterna entre preenchimentos abertos e fechados. Se houver interseco de dois quadrados desenhados com o mesmo preenchimento, a rea em que ocorre a interseco ser preenchida. Geralmente, as reas adjacentes no so ambas preenchidas nem ambas no preenchidas. A regra diferente de zero, por outro lado, depende do contorno (direo do desenho) para determinar se reas definidas por caminhos de interseco so preenchidas. Quando caminhos de contorno opostos se cruzam, a rea definida no preenchida, bem parecido com o que ocorre na regra par-mpar. Para caminhos com o mesmo contorno, a rea que no seria preenchida preenchida:

Regras de contorno para reas de interseco A. Regra de contorno par-mpar B. Regra de contorno diferente de zero

Nomes de regras de contorno


Os nomes referem-se a uma regra mais especfica que define como esses preenchimentos so gerenciados. Caminhos de rotao positiva recebem um valor de +1; caminhos de rotao negativa recebem um valor de -1. Comeando em um ponto dentro de uma rea fechada de uma forma, desenhe uma linha a partir desse ponto que se estenda indefinidamente. O nmero de vezes que a linha cruza um caminho e os valores combinados desses caminhos so usados para determinar o preenchimento. Para contorno par-mpar, usado o nmero de vezes em que a linha cruza um caminho. Quando a contagem mpar, a rea preenchida. Para contagens pares, a rea no preenchida. Para contorno diferente de zero, so usados os valores atribudos aos caminhos. Quando os valores combinados do caminho no so 0, a rea preenchida. Quando os valores combinados so 0, a rea no preenchida.

Preenchimentos e contagens de regras de contorno A. Regra de contorno par-mpar B. Regra de contorno diferente de zero

PROGRAMAO DO ACTIONSCRIPT 3.0 339


Uso de objetos visuais

Uso de regras de contorno


Essas regras de preenchimento so complicadas, mas em algumas situaes elas so necessrias. Por exemplo, pense no desenho de uma forma de estrela. Com a regra par-mpar padro, a forma exigiria dez linhas diferentes. Com a regra de contorno diferente de zero, essas dez linhas so reduzidas a cinco. Este o ActionScript de uma estrela com cinco linhas e uma regra de contorno diferente de zero:
fill.graphics.beginFill(0x60A0FF);graphics.drawPath( Vector.<int>([1,2,2,2,2]), Vector.<Number>([66,10, 23,127, 122,50, 10,49, 109,127]), GraphicsPathWinding.NON_ZERO);

E esta a forma de estrela:

Uma forma de estrela usando regras de contorno diferente A. 10 linhas pares-mpares B. 5 linhas pares-mpares C. 5 linhas diferentes de zero

E, medida que imagens so animadas ou usadas como texturas em objetos tridimensionais e se sobrepem, as regras de contorno tornam-se mais importantes.

Uso de classes de dados grficos


O Flash Player 10 introduz uma nova coleo de classes no pacote flash.display do tipo IGraphicsData (uma interface implementada por cada uma das classes). As classes que implementam a interface IGraphicsData funcionam como contineres de dados para os mtodos da API de desenho. As seguintes classes implementam a interface IGraphicsData:

GraphicsBitmapFill GraphicsEndFill GraphicsGradientFill GraphicsPath GraphicsShaderFill GraphicsSolidFill GraphicsStroke GraphicsTrianglePath


Com elas, possvel armazenar desenhos completos em uma matriz de objeto Vector do tipo IGraphicsData (Vector.<IGraphicsData>) que pode ser reutilizada como fonte de dados para outras ocorrncias da forma ou para armazenar informaes para uso posterior. Observe que existem vrias classes de preenchimento para cada estilo de preenchimento, mas somente uma classe de traado. O ActionScript tem apenas uma classe de traado IGraphicsData, pois a classe de traado usa as classes de preenchimento para definir seu estilo. Assim, cada traado , na verdade, a classe de traado e uma classe de preenchimento. Do contrrio, a API dessas classes de dados grficos espelha os mtodos que elas representam na classe flash.display.Graphics:

PROGRAMAO DO ACTIONSCRIPT 3.0 340


Uso de objetos visuais

Mtodo de Graphics beginBitmapFill() beginFill() beginGradientFill() beginShaderFill() lineBitmapStyle() lineGradientStyle() lineShaderStyle() lineStyle() moveTo() lineTo() curveTo() drawPath() drawTriangles()

Classe de dados GraphicsBitmapFill GraphicsSolidFill GraphicsGradientFill GraphicsShaderFill GraphicsStroke + GraphicsBitmapFill GraphicsStroke + GraphicsGradientFill GraphicsStroke + GraphicsShaderFill GraphicsStroke + GraphicsSolidFill GraphicsPath

GraphicsTrianglePath

Alm disso, a classe GraphicsPath tem seus prprios mtodos de utilitrio GraphicsPath.moveTo(), GraphicsPath.lineTo(), GraphicsPath.curveTo(), GraphicsPath.wideLineTo() e GraphicsPath.wideMoveTo() que facilitam a definio desses comandos para uma ocorrncia de GraphicsPath. Esses mtodos de utilitrio facilitam a definio ou a atualizao direta dos comandos e valores de dados. Uma vez que voc tem uma coleo de ocorrncias de IGraphicsData, use o mtodo Graphics.drawGraphicsData() para renderizar os grficos. O mtodo Graphics.drawGraphicsData() executa um vetor de ocorrncias de IGraphicsData atravs da API de desenho em ordem seqencial:
// stroke object var stroke:GraphicsStroke = new GraphicsStroke(3); stroke.joints = JointStyle.MITER; stroke.fill = new GraphicsSolidFill(0x102020);// solid stroke // fill object var fill:GraphicsGradientFill = new GraphicsGradientFill(); fill.colors = [0x0000FF, 0xEEFFEE]; fill.matrix = new Matrix(); fill.matrix.createGradientBox(70,70, Math.PI/2); // path object var path:GraphicsPath = new GraphicsPath(new Vector.<int>(), new Vector.<Number>()); path.commands.push(1,2,2); path.data.push(125,0, 50,100, 175,0); // combine objects for complete drawing var drawing:Vector.<IGraphicsData> = new Vector.<IGraphicsData>(); drawing.push(stroke, fill, path); // draw the drawing graphics.drawGraphicsData(drawing);

Modificando-se um valor no caminho usado pelo desenho do exemplo, possvel redesenhar a forma vrias vezes para uma imagem mais complexa:

PROGRAMAO DO ACTIONSCRIPT 3.0 341


Uso de objetos visuais

// draw the drawing multiple times // change one value to modify each variation graphics.drawGraphicsData(drawing); path.data[2] += 200; graphics.drawGraphicsData(drawing); path.data[2] -= 150; graphics.drawGraphicsData(drawing); path.data[2] += 100; graphics.drawGraphicsData(drawing); path.data[2] -= 50;graphicsS.drawGraphicsData(drawing);

Embora objetos IGraphicsData possam definir estilos de preenchimento e de traado, esses estilos no so obrigatrios. Em outras palavras, os mtodos da classe Graphics podem ser usados para definir estilos, enquanto os objetos IGraphicsData podem ser usados para desenhar uma coleo de caminhos salvos ou vice-versa. Nota: Use o mtodo Graphics.clear() para remover um desenho anterior antes de comear um novo, a menos que voc esteja aumentando o desenho original, como visto no exemplo acima. Quando alterar uma nica parte de um caminho ou de uma coleo de objetos IGraphicsData, redesenhe o desenho inteiro para ver as alteraes. Quando so usadas classes de dados grficos, o preenchimento renderizado sempre que trs ou mais pontos so desenhados porque a forma inerentemente fechada nesse ponto. Embora o preenchimento seja fechado, o traado no , e esse comportamento diferente de quando so usados vrios comandos Graphics.lineTo() ou Graphics.moveTo().

Sobre o uso de drawTriangles()


Outro mtodo avanado includo no Flash Player 10, Graphics.drawTriangles(), parecido com o mtodo Graphics.drawPath(). O mtodo Graphics.drawTriangles() tambm usa um objeto Vector.<Number> para especificar localizaes de pontos para desenhar um caminho. No entanto, a verdadeira finalidade do mtodo Graphics.drawTriangles() facilitar os efeitos tridimensionais atravs do ActionScript. Para obter informaes sobre como usar Graphics.drawTriangles() para produzir efeitos tridimensionais, consulte Uso de tringulos para obter efeitos 3D na pgina 519.

342

Captulo 15: Trabalho com geometria


O pacote flash.geom contm classes que definem objetos geomtricos como pontos, retngulos e matrizes de transformao. Essas classes so usadas para definir as propriedades dos objetos utilizados em outras classes.

Noes bsicas de geometria


Introduo ao trabalho com geometria
A geometria, em geral, uma matria escolar em que as pessoas querem ser aprovadas aprendendo o mnimo possvel, mas um pouco de conhecimento no assunto pode ser muito til durante o uso do ActionScript. O pacote flash.geom contm classes que definem objetos geomtricos como pontos, retngulos e matrizes de transformao. Essas classes necessariamente no fornecem uma funcionalidade em si, mas so usadas para definir as propriedades dos objetos utilizados em outras classes. Todas as classes de geometria giram em torno da noo de que os locais na tela so representados como um plano bidimensional. A tela tratada como um grfico plano com um eixo horizontal (x) e um vertical (y). Qualquer local (ou ponto) da tela pode ser representado como um par de valores x e y as coordenadas desse local. Cada objeto de exibio, incluindo o Palco, possui seu prprio espao de coordenadas basicamente seu prprio grfico para marcar os locais de objetos de exibio-filho, desenhos etc. Em geral, a origem (o local com a coordenada 0, 0 em que os eixos x e y se encontram) colocada no canto esquerdo superior do objeto de exibio. Embora isso seja sempre vlido para o Palco, no necessariamente vlido para qualquer outro objeto de exibio. Assim como nos sistemas de coordenadas bidimensionais, os valores no eixo x aumentam para a direita e diminuem para a esquerda; para os locais esquerda da origem, a coordenada x negativa. Entretanto, diferentemente dos sistemas de coordenadas tradicionais, no ActionScript, os valores no eixo y aumentam para baixo e diminuem para cima (os valores acima da origem tm uma coordenada y negativa). Como o canto esquerdo superior do Palco a origem de seu espao de coordenadas, qualquer objeto nele ter uma coordenada x maior do que 0 e menor do que a largura do Palco, e ter uma coordenada y maior do que 0 e menor do que a altura do Palco. Voc pode usar ocorrncias da classe Point para representar pontos individuais em um espao de coordenadas. possvel criar uma ocorrncia de Rectangle para representar uma regio retangular em um espao de coordenadas. Para usurios avanados, voc pode usar uma ocorrncia de Matrix para aplicar vrias transformaes ou transformaes complexas em um objeto de exibio. Muitas transformaes simples, como rotao, posio e alteraes de escala, podem ser aplicadas diretamente a um objeto de exibio usando as propriedades desse objeto. Para obter informaes sobre como aplicar transformaes usando propriedades de objeto de exibio, consulte Manipulao de objetos de exibio na pgina 293.

Tarefas comuns de geometria


As seguintes tarefas so as mais provveis de ser executadas usando classes de geometria no ActionScript:

Calcular a distncia entre dois pontos Determinar coordenadas de um ponto em espaos de coordenadas diferentes Mover um objeto de exibio usando ngulo e distncia

PROGRAMAO DO ACTIONSCRIPT 3.0 343


Trabalho com geometria

Trabalhar com ocorrncias de Rectangle: Reposicionar uma ocorrncia de Rectangle Redimensionar uma ocorrncia de Rectangle Determinar reas combinadas de tamanho ou sobreposio de ocorrncias de Rectangle Criar objetos Matrix Usar um objeto Matrix para aplicar transformaes em um objeto de exibio

Conceitos e termos importantes


A lista de referncia a seguir contm termos importantes usados neste captulo:

Coordenadas cartesianas: coordenas comumente escritas como um par de nmeros (como 5, 12 ou 17, -23). Os dois
nmeros so as coordenadas x e y, respectivamente.

Espao de coordenadas: o grfico de coordenadas contido em um objeto de exibio, no qual seus elementos-filho
so posicionados.

Origem: o ponto em um espao de coordenadas no qual o eixo x encontra o eixo y. Esse ponto tem a coordenada 0,0. Ponto: um local isolado em um espao de coordenadas. No sistema de coordenadas bidimensional usado no
ActionScript, um ponto definido por seu local no eixo x e no eixo y (as coordenadas do ponto).

Ponto de registro: em um objeto de exibio, a origem (coordenada 0,0) de seu espao coordenado. Escala: o tamanho de um objeto em relao ao seu tamanho original. Quando usado como um verbo, dimensionar
um objeto significa alterar seu tamanho, aumentando ou diminuindo o objeto.

Transpor: alterar as coordenadas de um ponto de um espao de coordenadas para outro. Transformao: ajuste de uma caracterstica visual de um grfico como a rotao do objeto, a alterao da escala, a
inclinao ou distoro da forma ou a alterao da cor.

Eixo X: o eixo horizontal no sistema de coordenadas bidimensional usado no ActionScript. Eixo Y: o eixo vertical no sistema de coordenadas bidimensional usado no ActionScript.

Teste dos exemplos do captulo


Muitos exemplos deste captulo demonstram clculos ou valores de alterao; a maioria deles inclui as chamadas da funo trace() apropriadas para demonstrar os resultados do cdigo. Para testar esses exemplos, faa o seguinte:
1 Crie um documento vazio usando a ferramenta de autoria do Flash. 2 Selecione um quadro-chave na Linha de tempo. 3 Abra o painel Aes e copie a listagem de cdigo no painel Script. 4 Execute o programa usando Controlar > Testar filme.

Voc ver os resultados das funes trace() da listagem de cdigo no painel Sada. Alguns exemplos do captulo demonstram a aplicao de transformaes em objetos de exibio. Para esses exemplos, os resultados do exemplo sero verificados visualmente e no por meio de sada de texto. Para testar esses exemplos de transformaes, faa o seguinte:
1 Crie um documento vazio usando a ferramenta de autoria do Flash. 2 Selecione um quadro-chave na Linha de tempo. 3 Abra o painel Aes e copie a listagem de cdigo no painel Script.

PROGRAMAO DO ACTIONSCRIPT 3.0 344


Trabalho com geometria

4 Crie uma ocorrncia de smbolo de clipe de filme no Palco. Por exemplo, desenhe uma forma, selecione-a, escolha

Modificar > Converter em smbolo e d um nome ao smbolo.


5 Com o clipe de filme do Palco selecionado, no Inspetor de propriedades, d um nome de ocorrncia ocorrncia.

O nome deve corresponder ao nome usado para o objeto de exibio na listagem de cdigo de exemplo por exemplo, se a listagem de cdigo aplicar uma transformao a um objeto chamado myDisplayObject, o nome da ocorrncia do clipe de filme tambm dever ser myDisplayObject.
6 Execute o programa usando Controlar > Testar filme.

Na tela, voc ver os resultados das transformaes aplicadas ao objeto conforme especificado na listagem de cdigo. As tcnicas para testar listagens de cdigo de exemplo so detalhadas em Teste de listagens de cdigo de exemplo dos captulos na pgina 36.

Uso de objetos Point


Um objeto Point define um par cartesiano de coordenadas. Ele representa um local em um sistema de coordenadas bidimensional, em que x representa o eixo horizontal e y, o vertical. Para definir um objeto Point, defina as propriedades de x e y da seguinte forma:
import flash.geom.*; var pt1:Point = new Point(10, 20); // x == 10; y == 20 var pt2:Point = new Point(); pt2.x = 10; pt2.y = 20;

Clculo da distncia entre dois pontos


Voc pode usar o mtodo distance() da classe Point para calcular a distncia entre dois pontos em um espao de coordenadas. Por exemplo, o cdigo a seguir calcula a distncia entre os pontos de registro de dois objetos de exibio, circle1 e circle2, no mesmo continer de objetos de exibio:
import flash.geom.*; var pt1:Point = new Point(circle1.x, circle1.y); var pt2:Point = new Point(circle2.x, circle2.y); var distance:Number = Point.distance(pt1, pt2);

Transposio de espaos de coordenadas


Se dois objetos de exibio estiverem em contineres de objetos de exibio diferentes, talvez estejam em espaos de coordenadas diferentes. Voc pode usar o mtodo localToGlobal() da classe DisplayObject para transpor as coordenadas para o mesmo espao de coordenadas (global) que o Palco. Por exemplo, o cdigo a seguir calcula a distncia entre os pontos de registro de dois objetos de exibio, circle1 e circle2, em contineres de objetos de exibio diferentes:
import flash.geom.*; var pt1:Point = new Point(circle1.x, circle1.y); pt1 = circle1.localToGlobal(pt1); var pt2:Point = new Point(circle2.x, circle2.y); pt2 = circle2.localToGlobal(pt2); var distance:Number = Point.distance(pt1, pt2);

PROGRAMAO DO ACTIONSCRIPT 3.0 345


Trabalho com geometria

Da mesma forma, para calcular a distncia do ponto de registro de um objeto de exibio chamado target a partir de um ponto especfico no Palco, voc pode usar o mtodo localToGlobal() da classe DisplayObject:
import flash.geom.*; var stageCenter:Point = new Point(); stageCenter.x = this.stage.stageWidth / 2; stageCenter.y = this.stage.stageHeight / 2; var targetCenter:Point = new Point(target.x, target.y); targetCenter = target.localToGlobal(targetCenter); var distance:Number = Point.distance(stageCenter, targetCenter);

Mover um objeto de exibio usando um ngulo e uma distncia especificados


Voc pode usar o mtodo polar() da classe Point para mover um objeto de exibio a uma distncia especfica em um ngulo especfico. Por exemplo, o cdigo a seguir move o objeto myDisplayObject 100 pixels em 60 graus:
import flash.geom.*; var distance:Number = 100; var angle:Number = 2 * Math.PI * (90 / 360); var translatePoint:Point = Point.polar(distance, angle); myDisplayObject.x += translatePoint.x; myDisplayObject.y += translatePoint.y;

Outros usos da classe Point


possvel usar os objetos Point com os seguintes mtodos e propriedades:
Classe DisplayObjectContainer Mtodos ou propriedades
areInaccessibleObjectsUnderPoint()getObject sUnderPoint()

Descrio Usada para retornar uma lista de objetos sob um ponto em um continer de objetos de exibio. Usada para definir o pixel no objeto BitmapData bem como o ponto cuja ocorrncia voc est verificando. Usada para definir as posies de retngulos que definem as operaes.

BitmapData

hitTest()

BitmapData

applyFilter() copyChannel() merge() paletteMap() pixelDissolve() threshold()

Matrix

deltaTransformPoint() transformPoint()

Usada para definir os pontos para os quais voc deseja aplicar uma transformao. Usada para definir essas propriedades.

Retngulo

bottomRight size topLeft

PROGRAMAO DO ACTIONSCRIPT 3.0 346


Trabalho com geometria

Uso de objetos Rectangle


Um objeto Rectangle define uma rea retangular. Um objeto Rectangle tem uma posio, definida pelas coordenadas x e y de seu canto superior esquerdo, uma propriedade width e uma propriedade height . Voc pode definir essas propriedades para um novo objeto Rectangle chamando a funo de construtor Rectangle() da seguinte forma:
import flash.geom.Rectangle; var rx:Number = 0; var ry:Number = 0; var rwidth:Number = 100; var rheight:Number = 50; var rect1:Rectangle = new Rectangle(rx, ry, rwidth, rheight);

Redimensionamento e reposicionamento de objetos Rectangle


H vrias formas de redimensionar e reposicionar objetos Rectangle. Voc pode reposicionar o objeto Rectangle alterando suas propriedades x e y. Isso no afeta a largura ou a altura do objeto Rectangle.
import flash.geom.Rectangle; var x1:Number = 0; var y1:Number = 0; var width1:Number = 100; var height1:Number = 50; var rect1:Rectangle = new Rectangle(x1, y1, width1, height1); trace(rect1) // (x=0, y=0, w=100, h=50) rect1.x = 20; rect1.y = 30; trace(rect1); // (x=20, y=30, w=100, h=50)

Como mostra o cdigo a seguir, se voc alterar a propriedade left ou top de um objeto Rectangle, ele tambm reposicionado, com suas propriedades x e y correspondendo s propriedades left e top, respectivamente. Entretanto, a posio do canto inferior esquerdo do objeto Rectangle no alterada, por isso ele redimensionado.
import flash.geom.Rectangle; var x1:Number = 0; var y1:Number = 0; var width1:Number = 100; var height1:Number = 50; var rect1:Rectangle = new Rectangle(x1, y1, width1, height1); trace(rect1) // (x=0, y=0, w=100, h=50) rect1.left = 20; rect1.top = 30; trace(rect1); // (x=20, y=30, w=80, h=20)

Da mesma forma, como mostra o exemplo, se voc alterar a propriedade bottom ou right de um objeto Rectangle, a posio de seu canto superior esquerdo no alterada, por isso ele redimensionado de acordo:

PROGRAMAO DO ACTIONSCRIPT 3.0 347


Trabalho com geometria

import flash.geom.Rectangle; var x1:Number = 0; var y1:Number = 0; var width1:Number = 100; var height1:Number = 50; var rect1:Rectangle = new Rectangle(x1, y1, width1, height1); trace(rect1) // (x=0, y=0, w=100, h=50) rect1.right = 60; trect1.bottom = 20; trace(rect1); // (x=0, y=0, w=60, h=20)

Voc tambm pode reposicionar um objeto Rectangle usando o mtodo offset() da seguinte maneira:
import flash.geom.Rectangle; var x1:Number = 0; var y1:Number = 0; var width1:Number = 100; var height1:Number = 50; var rect1:Rectangle = new Rectangle(x1, y1, width1, height1); trace(rect1) // (x=0, y=0, w=100, h=50) rect1.offset(20, 30); trace(rect1); // (x=20, y=30, w=100, h=50)

O mtodo offsetPt() funciona da mesma forma, exceto que assume um objeto Point como parmetro, em vez dos valores de deslocamento x e y. Voc tambm pode redimensionar um objeto Rectangle usando o mtodo inflate(), que inclui dois parmetros, dx e dy. O parmetro dx representa o nmero de pixels que os lados esquerdo e direito do retngulo movero do centro, e o parmetro dy representa o nmero de pixels que o lado superior e inferior do retngulo movero do centro:
import flash.geom.Rectangle; var x1:Number = 0; var y1:Number = 0; var width1:Number = 100; var height1:Number = 50; var rect1:Rectangle = new Rectangle(x1, y1, width1, height1); trace(rect1) // (x=0, y=0, w=100, h=50) rect1.inflate(6,4); trace(rect1); // (x=-6, y=-4, w=112, h=58)

O mtodo inflatePt() funciona da mesma forma, exceto que assume um objeto Point como parmetro, em vez dos valores de deslocamento dx e dy.

Localizao de unies e intersees de objetos Rectangle


Voc usa o mtodo union() para localizar a regio retangular formada pelos limites de dois retngulos:
import flash.display.*; import flash.geom.Rectangle; var rect1:Rectangle = new Rectangle(0, 0, 100, 100); trace(rect1); // (x=0, y=0, w=100, h=100) var rect2:Rectangle = new Rectangle(120, 60, 100, 100); trace(rect2); // (x=120, y=60, w=100, h=100) trace(rect1.union(rect2)); // (x=0, y=0, w=220, h=160)

Voc usa o mtodo intersection() para localizar a regio retangular formada pela regio sobreposta de dois retngulos:

PROGRAMAO DO ACTIONSCRIPT 3.0 348


Trabalho com geometria

import flash.display.*; import flash.geom.Rectangle; var rect1:Rectangle = new Rectangle(0, 0, 100, 100); trace(rect1); // (x=0, y=0, w=100, h=100) var rect2:Rectangle = new Rectangle(80, 60, 100, 100); trace(rect2); // (x=120, y=60, w=100, h=100) trace(rect1.intersection(rect2)); // (x=80, y=60, w=20, h=40)

O mtodo intersects() usado para descobrir se h interseo de dois retngulos. O mtodo intersects() tambm pode ser usado para descobrir se um objeto de exibio est em uma determinada regio do Palco. Por exemplo, no cdigo a seguir, suponha que o espao de coordenadas do continer de objetos de exibio que inclui o objeto circle seja o mesmo do Palco. O exemplo mostra como usar o mtodo intersects() para determinar se h interseo de um objeto de exibio, circle, com regies especificadas do Palco, definidas pelos objetos Rectangle target1 e target2:
import flash.display.*; import flash.geom.Rectangle; var circle:Shape = new Shape(); circle.graphics.lineStyle(2, 0xFF0000); circle.graphics.drawCircle(250, 250, 100); addChild(circle); var circleBounds:Rectangle = circle.getBounds(stage); var target1:Rectangle = new Rectangle(0, 0, 100, 100); trace(circleBounds.intersects(target1)); // false var target2:Rectangle = new Rectangle(0, 0, 300, 300); trace(circleBounds.intersects(target2)); // true

Da mesma forma, o mtodo intersects() pode ser usado para descobrir se os retngulos delimitadores de dois objetos de exibio se sobrepem. Voc pode usar o mtodo getRect() da classe DisplayObject para incluir qualquer espao adicional que os traados de um objeto de exibio possam adicionar a uma regio delimitadora.

Outros usos de objetos Rectangle


Os objetos Rectangle so usados nos seguintes mtodos e propriedades:
Classe BitmapData Mtodos ou propriedades
applyFilter(), colorTransform(), copyChannel(), copyPixels(), draw(), fillRect(), generateFilterRect(), getColorBoundsRect(), getPixels(), merge(), paletteMap(), pixelDissolve(), setPixels() e threshold() getBounds(), getRect(), scrollRect, scale9Grid addPage() startDrag() getCharBoundaries() pixelBounds

Descrio Usada como o tipo para alguns parmetros a fim de definir uma regio do objeto BitmapData.

DisplayObject

Usada como o tipo de dados para a propriedade ou o tipo de dados retornado. Usada para definir o parmetro printArea. Usada para definir o parmetro bounds. Usada como um tipo de valor de retorno. Usada como o tipo de dados.

PrintJob Sprite TextField Transform

PROGRAMAO DO ACTIONSCRIPT 3.0 349


Trabalho com geometria

Uso de objetos Matrix


A classe Matrix representa uma matriz de transformao que determina como mapear pontos de um espao de coordenadas para outro. possvel realizar vrias transformaes grficas em um objeto de exibio definindo as propriedades de um objeto Matrix, aplicando esse objeto Matrix propriedade matrix de um objeto Transform, e depois aplicando esse objeto Transform como a propriedade transform do objeto de exibio. Essas funes de transformao incluem converso (reposicionamento de x e y), rotao, dimensionamento e inclinao.

Definio de objetos Matrix


Embora seja possvel definir uma matriz ajustando diretamente as propriedades (a, b, c, d, tx, ty) de um objeto Matrix, mais fcil usar o mtodo createBox(). Esse mtodo inclui parmetros que permitem definir diretamente os efeitos de dimensionamento, rotao e transposio da matriz resultante. Por exemplo, o cdigo a seguir cria um objeto Matrix que possui o efeito de dimensionar um objeto horizontalmente em 2,0, verticalmente em 3,0, gir-lo em 45 graus, mover (transpor) 10 pixels para a direita e 20 pixels para baixo:
var matrix:Matrix = new Matrix(); var scaleX:Number = 2.0; var scaleY:Number = 3.0; var rotation:Number = 2 * Math.PI * (45 / 360); var tx:Number = 10; var ty:Number = 20; matrix.createBox(scaleX, scaleY, rotation, tx, ty);

Tambm possvel ajustar os efeitos de dimensionamento, rotao e transposio de um objeto Matrix usando os mtodos scale(), rotate() e translate() . Observe que esses mtodos combinam com os valores do objeto Matrix existente. Por exemplo, o cdigo a seguir define um objeto Matrix que dimensiona um objeto por um fator de 4 e o gira 60 graus, desde que os mtodos scale() e rotate() sejam chamados duas vezes:
var matrix:Matrix = new Matrix(); var rotation:Number = 2 * Math.PI * (30 / 360); // 30 var scaleFactor:Number = 2; matrix.scale(scaleFactor, scaleFactor); matrix.rotate(rotation); matrix.scale(scaleX, scaleY); matrix.rotate(rotation); myDisplayObject.transform.matrix = matrix;

Para aplicar uma transformao de inclinao em um objeto Matrix, ajuste sua propriedade b ou c. O ajuste da propriedade b inclina a matriz verticalmente e o ajuste da propriedadec inclina a matriz horizontalmente. O cdigo a seguir inclina o objeto Matrix myMatrix verticalmente por um fator de 2:
var skewMatrix:Matrix = new Matrix(); skewMatrix.b = Math.tan(2); myMatrix.concat(skewMatrix);

Voc pode aplicar uma transformao de Matrix propriedade transform de um objeto de exibio. Por exemplo, o cdigo a seguir aplica uma transformao de matriz em um objeto de exibio chamado myDisplayObject:

PROGRAMAO DO ACTIONSCRIPT 3.0 350


Trabalho com geometria

var matrix:Matrix = myDisplayObject.transform.matrix; var scaleFactor:Number = 2; var rotation:Number = 2 * Math.PI * (60 / 360); // 60 matrix.scale(scaleFactor, scaleFactor); matrix.rotate(rotation); myDisplayObject.transform.matrix = matrix;

A primeira linha define um objeto Matrix como a matriz de transformao existente usada pelo objeto de exibio myDisplayObject (a propriedade matrix da propriedade transformation do objeto de exibio myDisplayObject). Dessa forma, os mtodos da classe Matrix que voc chama tero um efeito cumulativo na posio, dimenso e rotao existentes do objeto de exibio. Nota: A classe ColorTransform tambm est includa no pacote flash.geometry. Essa classe usada para definir a propriedade colorTransform de um objeto Transform. Como no se aplica a nenhum tipo de transformao geomtrica, ela no ser discutida neste captulo. Para obter mais informaes, consulte a classe ColorTransform na Referncia dos componentes e da linguagem do ActionScript 3.0.

Exemplo: Aplicao de uma transformao de matriz em um objeto de exibio


O aplicativo de exemplo DisplayObjectTransformer mostra vrios recursos de uso da classe Matrix para transformar um objeto de exibio, incluindo o seguinte:

Girar o objeto de exibio Dimensionar o objeto de exibio Transpor (reposicionar) o objeto de exibio Inclinar o objeto de exibio
O aplicativo fornece uma interface para ajustar os parmetros de transformao da matriz, como a seguir:

PROGRAMAO DO ACTIONSCRIPT 3.0 351


Trabalho com geometria

Quando o usurio clica no boto Transformar, o aplicativo aplica a transformao apropriada.

O objeto de exibio original e o objeto de exibio com um giro de - 45 e um dimensionamento de 50%

Para obter os arquivos do aplicativo para este exemplo, consulte www.adobe.com/go/learn_programmingAS3samples_flash_br. Os arquivos do aplicativo DisplayObjectTransformer podem ser encontrados na pasta Samples/DisplayObjectTransformer. O aplicativo consiste nos seguintes arquivos:
Arquivo DisplayObjectTransformer.mxml ou DisplayObjectTransformer.fla com/example/programmingas3/geometry/MatrixTransformer.as Uma classe que contm mtodos para aplicar transformaes de matriz. Um diretrio contendo arquivos de imagem de exemplo usados pelo aplicativo. Descrio O arquivo principal do aplicativo no Flash (FLA) ou no Flex (MXML).

img/

Definio da classe MatrixTransformer


A classe MatrixTransformer inclui mtodos estticos que aplicam transformaes geomtricas de objetos Matrix. O mtodo transform() O mtodo transform() inclui parmetros para cada um dos itens a seguir:

sourceMatrix a matriz de entrada, que o mtodo transforma xScale e yScale o fator de dimensionamento x e y dx e dy os valores de transposio x e y, em pixels rotation o valor de rotao, em graus skew o fator de inclinao, em porcentagem skewType a direo da inclinao "right" ou "left"

O valor de retorno a matriz resultante. O mtodo transform() chama os seguintes mtodos estticos da classe:

skew() scale() translate() rotate()

PROGRAMAO DO ACTIONSCRIPT 3.0 352


Trabalho com geometria

Cada um retorna a matriz de origem com a transformao aplicada. O mtodo skew() O mtodo skew() inclina a matriz, ajustando as propriedades b e c da matriz. Um parmetro opcional, unit, determina as unidades usadas para definir o ngulo de inclinao e, se necessrio, o mtodo converte o valor angle em radianos:
if (unit == { angle = } if (unit == { angle = } "degrees") Math.PI * 2 * angle / 360; "gradients") Math.PI * 2 * angle / 100;

Um objeto Matrix skewMatrix criado e ajustado para aplicar a transformao de inclinao. Inicialmente, a matriz de identidade, como a seguir:
var skewMatrix:Matrix = new Matrix();

O parmetro skewSide determina o lado para o qual a inclinao aplicada. Se for definida como "right", o seguinte cdigo define a propriedade b da matriz:
skewMatrix.b = Math.tan(angle);

Caso contrrio, o lado inferior inclinado ajustando a propriedade c de Matrix, como a seguir:
skewMatrix.c = Math.tan(angle);

A inclinao resultante aplicada matriz existente, concatenando as duas matrizes, como mostra o seguinte exemplo:
sourceMatrix.concat(skewMatrix); return sourceMatrix;

O mtodo scale() Como mostra o exemplo a seguir, o mtodo scale() primeiro ajusta o fator de dimensionamento, caso seja fornecido como uma porcentagem, e depois usa o mtodo scale() do objeto da matriz:
if (percent) { xScale = xScale / 100; yScale = yScale / 100; } sourceMatrix.scale(xScale, yScale); return sourceMatrix;

O mtodo translate() O mtodo translate() apenas aplica os fatores de transposio dx e dy chamando o mtodo translate() do objeto da matriz, como a seguir:
sourceMatrix.translate(dx, dy); return sourceMatrix;

O mtodo rotate() O mtodo rotate() converte o fator de rotao de entrada em radianos (se fornecido em graus ou gradientes) e chama o mtodo rotate() do objeto da matriz:

PROGRAMAO DO ACTIONSCRIPT 3.0 353


Trabalho com geometria

if (unit == "degrees") { angle = Math.PI * 2 * angle / 360; } if (unit == "gradients") { angle = Math.PI * 2 * angle / 100; } sourceMatrix.rotate(angle); return sourceMatrix;

Chamada do mtodo MatrixTransformer.transform() no aplicativo


O aplicativo contm uma interface do usurio para obter os parmetros de transformao do usurio. Ele os transmite, junto com a propriedade matrix da propriedade transform do objeto de exibio, para o mtodo Matrix.transform(), como a seguir:
tempMatrix = MatrixTransformer.transform(tempMatrix, xScaleSlider.value, yScaleSlider.value, dxSlider.value, dySlider.value, rotationSlider.value, skewSlider.value, skewSide );

O aplicativo aplica o valor de retorno propriedade matrix da propriedade transform do objeto de exibio, acionando a transformao:
img.content.transform.matrix = tempMatrix;

354

Captulo 16: Filtro de objetos de exibio


Historicamente, a aplicao de filtros em imagens de bitmap tem sido feita por softwares especiais de edio de imagens como o Adobe Photoshop e o Adobe Fireworks. O ActionScript 3.0 inclui o pacote flash.filters, que contm uma srie de classes de filtro de bitmap que permite aos desenvolvedores aplicar filtros de modo programtico em bitmaps e objetos de exibio para atingir os mesmos efeitos que esto disponveis em aplicativos de manipulao de elementos grficos.

Noes bsicas sobre filtragem de objetos de exibio


Introduo filtragem de objetos de exibio
Uma das maneiras de refinar um aplicativo adicionar efeitos grficos simples, como uma sombra projetada atrs de uma foto para criar a iluso 3D ou um brilho em torno de um boto para mostrar que ele est ativo. O ActionScript 3.0 inclui nove filtros que podem ser aplicados em qualquer objeto de exibio ou em uma ocorrncia de BitmapData. Esses filtros variam desde filtros bsicos, como os de sombra projetada e brilho, at filtros complexos para criar diversos efeitos, como o deslocamento do filtro de mapa e do filtro de convoluo.

Tarefas comuns de filtragem


As tarefas a seguir provavelmente sero realizadas ao utilizar filtros no ActionScript:

Criao de um filtro Aplicao de um filtro em um objeto de exibio Remoo de um filtro de um objeto de exibio Aplicao de um filtro nos dados de imagem em uma ocorrncia de BitmapData Remoo de filtros de um objeto Criao de diversos filtros, como brilho, desfoque, sombra projetada, nitidez, deslocamento, deteco de borda,
entalhe e outros efeitos

Conceitos e termos importantes


A lista de referncia a seguir contm termos importantes usados neste captulo:

Bisel: uma borda criada por meio do clareamento de pixels em dois lados e do escurecimento dos pixels nos dois
lados opostos, criando um efeito de borda tridimensional normalmente usado para botes realados ou recuados e efeitos grficos similares.

Convoluo: distoro de pixels em uma imagem por meio da combinao do valor de cada pixel com os valores
de alguns ou todos os pixels ao redor, usando diversas propores.

Deslocamento: mudana ou movimentao de pixels em uma imagem para uma nova posio. Matriz: uma grade de nmeros usada para realizar alguns clculos matemticos aplicando os nmeros da grade em
diversos valores e combinando os resultados.

PROGRAMAO DO ACTIONSCRIPT 3.0 355


Filtro de objetos de exibio

Teste dos exemplos do captulo


Talvez voc queira testar as listagens de cdigo de exemplo fornecidas durante a leitura deste captulo. Como este captulo trata da criao e da manipulao de contedo visual, o teste do cdigo envolve a execuo do cdigo e a visualizao dos resultados no SWF criado. Quase todos os exemplos criam o contedo usando a API de desenho ou carregam imagens nas quais os filtros so aplicados. Para testar o cdigo deste captulo:
1 Crie um documento vazio usando a ferramenta de autoria do Flash. 2 Selecione um quadro-chave na Linha de tempo. 3 Abra o painel Aes e copie o cdigo no painel Script. 4 Execute o programa usando o comando Controlar > Testar filme.

Voc ver os resultados do cdigo no arquivo SWF criado. Quase todos os exemplos incluem um cdigo que cria uma imagem de bitmap, de modo que voc pode testar apenas o cdigo, sem precisar fornecer nenhum contedo de bitmap. Se preferir, altere as listagens de cdigo para carregar suas prprias imagens e use-as em vez das dos exemplos.

Criao e aplicao de filtros


Os filtros permitem aplicar diversos efeitos em objetos de exibio e bitmap, variando desde sombras projetadas at bisis e desfoques. Cada filtro definido como uma classe, de modo que a aplicao de filtros envolve a criao de ocorrncias de objetos de filtro, o que equivale a criar qualquer outro objeto. Depois de criar uma ocorrncia de um objeto de filtro, possvel aplic-la com facilidade em um objeto de exibio usando a propriedade filters do objeto ou, no caso de um objeto BitmapData, usando o mtodo applyFilter().

Criao de um novo filtro


Para criar um novo objeto de filtro, basta chamar o mtodo de construtor da classe de filtro selecionada. Por exemplo, para criar um novo objeto DropShadowFilter, use o seguinte cdigo:
import flash.filters.DropShadowFilter; var myFilter:DropShadowFilter = new DropShadowFilter();

Embora no seja mostrado aqui, o construtor DropShadowFilter() (como todos os construtores de classes de filtro) aceita vrios parmetros opcionais que podem ser usados para personalizar a aparncia do efeito do filtro.

Aplicao de um filtro
Depois de criar um objeto de filtro, voc pode aplic-lo em um objeto de exibio ou em um objeto BitmapData; o modo de aplicao do filtro depende do objeto no qual ele ser aplicado. Aplicao de um filtro em um objeto de exibio Use a propriedade filters para aplicar efeitos de filtro em um objeto de exibio. A propriedade filters de um objeto de exibio uma ocorrncia de Array, cujos elementos so objetos de filtro aplicados no objeto de exibio. Para aplicar um nico filtro em um objeto de exibio, crie a ocorrncia de filtro, adicione-a a uma ocorrncia de Array e atribua esse objeto Array propriedade filters do objeto de exibio:

PROGRAMAO DO ACTIONSCRIPT 3.0 356


Filtro de objetos de exibio

import flash.display.Bitmap; import flash.display.BitmapData; import flash.filters.DropShadowFilter; // Create a bitmapData object and render it to screen var myBitmapData:BitmapData = new BitmapData(100,100,false,0xFFFF3300); var myDisplayObject:Bitmap = new Bitmap(myBitmapData); addChild(myDisplayObject); // Create a DropShadowFilter instance. var dropShadow:DropShadowFilter = new DropShadowFilter(); // Create the filters array, adding the filter to the array by passing it as // a parameter to the Array() constructor. var filtersArray:Array = new Array(dropShadow); // Assign the filters array to the display object to apply the filter. myDisplayObject.filters = filtersArray;

Se desejar atribuir vrios filtros ao objeto, basta adicionar todos os filtros ocorrncia de Array antes de atribu-la propriedade filters. Para adicionar vrios objetos a uma matriz, transmita-os como parmetros para o construtor. Por exemplo, esse cdigo aplica um filtro de bisel e um filtro de brilho ao objeto de exibio criado anteriormente:
import flash.filters.BevelFilter; import flash.filters.GlowFilter; // Create the filters and add them to an array. var bevel:BevelFilter = new BevelFilter(); var glow:GlowFilter = new GlowFilter(); var filtersArray:Array = new Array(bevel, glow); // Assign the filters array to the display object to apply the filter. myDisplayObject.filters = filtersArray;

Ao criar a matriz que contm os filtros, voc pode usar o construtor new Array() (conforme mostrado nos exemplos anteriores) ou a sintaxe do literal de matriz, colocando os filtros entre colchetes ([]). Por exemplo, esta linha de cdigo:
var filters:Array = new Array(dropShadow, blur);

faz a mesma coisa que esta linha de cdigo:


var filters:Array = [dropShadow, blur];

Se vrios filtros forem aplicados em objetos de exibio, a aplicao ser feita de modo cumulativo e seqencial. Por exemplo, se uma matriz de filtros tiver dois elementos, um filtro de bisel adicionado primeiro e um filtro de sombra projetada adicionado depois, o filtro de sombra projetada ser aplicado no filtro de bisel e no objeto de exibio. Isso ocorre devido posio do filtro de sombra projetada em segundo lugar na matriz de filtros. Se desejar aplicar filtros de modo no cumulativo, aplique cada filtro em uma nova cpia do objeto de exibio. Se estiver atribuindo apenas um ou alguns filtros a um objeto de exibio, crie a ocorrncia do filtro e atribua-a ao objeto em uma nica instruo. Por exemplo, a linha de cdigo a seguir aplica um filtro de desfoque em um objeto de exibio chamado myDisplayObject:
myDisplayObject.filters = [new BlurFilter()];

O cdigo anterior cria uma ocorrncia de Array usando a sintaxe do literal de matriz (entre colchetes), cria uma nova ocorrncia de BlurFilter como um elemento da matriz e atribui a essa matriz a propriedade filters do objeto de exibio chamado myDisplayObject.

PROGRAMAO DO ACTIONSCRIPT 3.0 357


Filtro de objetos de exibio

Remoo de filtros de um objeto de exibio A remoo de todos os filtros de um objeto de exibio to simples quanto atribuir um valor nulo propriedade filters:
myDisplayObject.filters = null;

Se tiver aplicado vrios filtros em um objeto e desejar remover apenas um dos filtros, realize as etapas para alterar a matriz da propriedade filters. Para obter mais informaes, consulte Possveis problemas resultantes do trabalho com filtros na pgina 357. Aplicao de um filtro em um objeto BitmapData A aplicao de um filtro em um objeto BitmapData requer o uso do mtodo applyFilter() do objeto BitmapData:
var rect:Rectangle = new Rectangle(); var origin:Point = new Point(); myBitmapData.applyFilter(sourceBitmapData, rect, origin, new BlurFilter());

O mtodo applyFilter() aplica um filtro em um objeto BitmapData de origem, produzindo uma nova imagem filtrada. Esse mtodo no modifica a imagem de origem inicial; em vez disso, o resultado da aplicao do filtro na imagem de origem armazenado na ocorrncia de BitmapData na qual o mtodo applyFilter() chamado.

Como funcionam os filtros


A filtragem de objetos de exibio funciona armazenando uma cpia do objeto original em cache como um bitmap transparente. Assim que um filtro aplicado em um objeto de exibio, o Adobe Flash Player ou o Adobe AIR armazena o objeto em cache como um bitmap enquanto o objeto tiver uma lista de filtros vlida. O bitmap de origem usado como imagem original para todos os efeitos de filtro aplicados posteriormente. Cada objeto de exibio geralmente contm dois bitmaps: um com o objeto original de exibio de origem e outro para a imagem final, aps a filtragem. A imagem final usada no momento da renderizao. Desde que o objeto de exibio no seja alterado, a imagem final no precisa de atualizao.

Possveis problemas resultantes do trabalho com filtros


Existem vrias fontes de possveis problemas que devem ser consideradas ao trabalhar com filtros. Elas so descritas nas sees a seguir. Cache de bitmaps e filtros Para aplicar um filtro em um objeto de exibio, o cache de bitmaps deve ser ativado para esse objeto. Ao aplicar um filtro em um objeto de exibio cuja propriedade cacheAsBitmap definida como false, o Flash Player ou o AIR define automaticamente o valor da propriedade cacheAsBitmap do objeto como true. Se todos os filtros forem removidos do objeto de exibio posteriormente, o Flash Player ou o AIR redefinir a propriedade cacheAsBitmap como o valor definido pela ltima vez.

PROGRAMAO DO ACTIONSCRIPT 3.0 358


Filtro de objetos de exibio

Alterao de filtros em tempo de execuo Se um objeto de exibio j tiver um ou mais filtros aplicados, no ser possvel alterar o conjunto de filtros adicionando mais filtros ou removendo filtros da matriz da propriedade filters. Em vez disso, para adicionar ou alterar o conjunto de filtros aplicados, faa as alteraes em uma matriz separada e, em seguida, atribua essa matriz propriedade filters do objeto de exibio para que os filters sejam aplicados no objeto. A maneira mais simples de fazer isso ler a matriz da propriedade filters em uma varivel Array e fazer as modificaes nessa matriz temporria. Depois, atribua essa matriz novamente propriedade filters do objeto de exibio. Em casos mais complexos, talvez seja necessrio manter uma matriz de filtros principal separada. Faa as alteraes nessa matriz de filtros principal e atribua-a novamente propriedade filters do objeto de exibio depois de cada alterao. Adio de mais um filtro O cdigo a seguir demonstra o processo de adio de mais um filtro a um objeto de exibio que j tem um ou mais filtros aplicados. Inicialmente, um filtro de brilho aplicado no objeto de exibio chamado myDisplayObject; posteriormente, quando o objeto de exibio clicado, a funo addFilters() chamada. Nesta funo, dois filtros adicionais so aplicados em myDisplayObject:
import flash.events.MouseEvent; import flash.filters.*; myDisplayObject.filters = [new GlowFilter()]; function addFilters(event:MouseEvent):void { // Make a copy of the filters array. var filtersCopy:Array = myDisplayObject.filters; // Make desired changes to the filters (in this case, adding filters). filtersCopy.push(new BlurFilter()); filtersCopy.push(new DropShadowFilter()); // Apply the changes by reassigning the array to the filters property. myDisplayObject.filters = filtersCopy; } myDisplayObject.addEventListener(MouseEvent.CLICK, addFilters);

Remoo de um filtro do conjunto de filtros Se um objeto de exibio tiver vrios filtros aplicados e voc desejar remover um dos filtros enquanto os outros continuam a ser aplicados no objeto, copie os filtros em uma matriz separada, remova o filtro indesejado dessa matriz e atribua a matriz temporria novamente propriedade filters do objeto de exibio. Vrias maneiras de remover um ou mais elementos de qualquer matriz esto descritas em Recuperao de valores e remoo de elementos de matriz na pgina 164. O mais fcil remover o filtro de nvel superior do objeto (o ltimo filtro aplicado no objeto). Use o mtodo pop() da classe Array para remover o filtro da matriz:

PROGRAMAO DO ACTIONSCRIPT 3.0 359


Filtro de objetos de exibio

// Example of removing the top-most filter from a display object // named "filteredObject". var tempFilters:Array = filteredObject.filters; // Remove the last element from the Array (the top-most filter). tempFilters.pop(); // Apply the new set of filters to the display object. filteredObject.filters = tempFilters;

Similarmente, para remover o filtro de nvel inferior (o primeiro aplicado no objeto), use o mesmo cdigo, usando o mtodo shift() da matriz Array em vez do mtodo pop(). Para remover um filtro do meio de uma matriz de filtros (supondo que a matriz tem mais de dois filtros), use o mtodo splice(). Voc deve saber o ndice (a posio na matriz) do filtro que deseja remover. Por exemplo, o cdigo a seguir remove o segundo filtro (no ndice 1) de um objeto de exibio:
// Example of removing a filter from the middle of a stack of filters // applied to a display object named "filteredObject". var tempFilters:Array = filteredObject.filters; // Remove the second filter from the array. It's the item at index 1 // because Array indexes start from 0. // The first "1" indicates the index of the filter to remove; the // second "1" indicates how many elements to remove. tempFilters.splice(1, 1); // Apply the new set of filters to the display object. filteredObject.filters = tempFilters;

Determinao do ndice de um filtro Voc precisa saber qual filtro deve ser removido da matriz para determinar o ndice do filtro. Voc deve saber (em virtude da designao do aplicativo) ou calcular o ndice do filtro a ser removido. A melhor maneira designar o aplicativo de modo que o filtro a ser removido sempre fique na mesma posio no conjunto de filtros. Por exemplo, se houver apenas um objeto de exibio com um filtro de convoluo e um filtro de sombra projetada aplicados (nessa ordem) e voc desejar remover o filtro de sombra projetada, mas manter o outro, o filtro estar em uma posio conhecida (o filtro de nvel superior) para que voc saiba com antecedncia qual mtodo Array deve ser usado (neste caso, Array.pop() para remover o filtro de sombra projetada). Se o filtro que deseja remover for sempre do mesmo tipo, mas no estiver necessariamente na mesma posio do conjunto de filtros todas as vezes, verifique o tipo de dados de cada filtro da matriz para determinar qual deve ser removido. Por exemplo, o cdigo a seguir determina qual o filtro de brilho em um conjunto de filtros e remove esse filtro do conjunto.

PROGRAMAO DO ACTIONSCRIPT 3.0 360


Filtro de objetos de exibio

// Example of removing a glow filter from a set of filters, where the //filter you want to remove is the only GlowFilter instance applied // to the filtered object. var tempFilters:Array = filteredObject.filters; // Loop through the filters to find the index of the GlowFilter instance. var glowIndex:int; var numFilters:int = tempFilters.length; for (var i:int = 0; i < numFilters; i++) { if (tempFilters[i] is GlowFilter) { glowIndex = i; break; } } // Remove the glow filter from the array. tempFilters.splice(glowIndex, 1); // Apply the new set of filters to the display object. filteredObject.filters = tempFilters;

Em um caso mais complexo, como se o filtro a ser removido for selecionado em tempo de execuo, o melhor manter uma cpia separada permanente da matriz de filtros que serve como a lista principal de filtros. Sempre que voc alterar o conjunto de filtros (adicionar ou remover um filtro), altere a lista principal e aplique essa matriz de filtros como a propriedade filters do objeto de exibio. Por exemplo, na listagem de cdigo a seguir, vrios filtros de convoluo so aplicados em um objeto de exibio para criar efeitos visuais diferentes e, posteriormente, um desses filtros removido enquanto os outros so mantidos. Neste caso, o cdigo mantm uma cpia principal da matriz de filtros, bem como uma referncia ao filtro a ser removido. Localizar e remover o filtro especfico similar abordagem anterior, mas, em vez de criar uma cpia temporria da matriz de filtros, a cpia principal manipulada e aplicada no objeto de exibio.

PROGRAMAO DO ACTIONSCRIPT 3.0 361


Filtro de objetos de exibio

// // // //

Example of removing a filter from a set of filters, where there may be more than one of that type of filter applied to the filtered object, and you only want to remove one.

// A master list of filters is stored in a separate, // persistent Array variable. var masterFilterList:Array; // At some point, you store a reference to the filter you // want to remove. var filterToRemove:ConvolutionFilter; // ... assume the filters have been added to masterFilterList, // which is then assigned as the filteredObject.filters: filteredObject.filters = masterFilterList; // ... later, when it's time to remove the filter, this code gets called: // Loop through the filters to find the index of masterFilterList. var removeIndex:int = -1; var numFilters:int = masterFilterList.length; for (var i:int = 0; i < numFilters; i++) { if (masterFilterList[i] == filterToRemove) { removeIndex = i; break; } } if (removeIndex >= 0) { // Remove the filter from the array. masterFilterList.splice(removeIndex, 1); // Apply the new set of filters to the display object. filteredObject.filters = masterFilterList; }

Nesta abordagem (quando estiver comparando uma referncia de filtro armazenada com os itens da matriz de filtros para determinar qual filtro deve ser removido), voc deve manter uma cpia separada da matriz de filtros - o cdigo no funcionar se a referncia de filtro armazenada for comparada com os elementos de uma matriz temporria copiada da propriedade filters do objeto de exibio. Isso ocorre porque internamente, quando uma matriz atribuda propriedade filters, o Flash Player ou o AIR faz uma cpia de cada objeto de filtro na matriz. Essas cpias (no os objetos originais) so aplicadas no objeto de exibio e, quando a propriedade filters lida em uma matriz temporria, a matriz temporria contm referncias aos objetos de filtro copiados, em vez de referncias aos objetos de filtro originais. Conseqentemente, se no exemplo anterior voc tentar determinar o ndice de filterToRemove comparando-o com os filtros de uma matriz temporria, nenhuma correspondncia ser encontrada.

PROGRAMAO DO ACTIONSCRIPT 3.0 362


Filtro de objetos de exibio

Transformaes de objeto e filtros Nenhuma regio filtrada (uma sombra projetada, por exemplo) fora do retngulo delimitador do objeto de exibio considerada como parte da superfcie para fins de deteco de ocorrncias (determinar se uma ocorrncia se sobrepe ou faz interseo com outra). Como os mtodos de deteco de ocorrncias da classe DisplayObject so baseados em vetores, no possvel detectar ocorrncias no resultado de bitmap. Por exemplo, se um filtro de bisel for aplicado em uma ocorrncia de boto, a deteco de ocorrncias no estar disponvel na parte do bisel da ocorrncia. Os filtros no permitem dimensionar, girar e inclinar objetos; se o objeto de exibio filtrado for dimensionado (se scaleX e scaleY no forem 100%), o efeito de filtro no ser dimensionado com a ocorrncia. Isso significa que a forma original da ocorrncia girada, dimensionada ou inclinada; no entanto, o filtro no girado, dimensionado ou inclinado com a ocorrncia. Voc pode animar uma ocorrncia com um filtro para criar efeitos realistas ou aninhar ocorrncias e usar a classe BitmapData para animar os filtros e atingir esse efeito. Objetos de bitmap e filtros Quando algum filtro aplicado em um objeto BitmapData, a propriedade cacheAsBitmap definida automaticamente como true. Desse modo, o filtro realmente aplicado na cpia do objeto, no no original. Em seguida, essa cpia colocada na exibio principal (no objeto original) o mais perto possvel do pixel mais prximo. Se os limites do bitmap original forem alterados, o bitmap de cpia filtrado ser recriado a partir do original, em vez de ser esticado ou distorcido. Se voc apagar todos os filtros de um objeto de exibio, a propriedade cacheAsBitmap ser redefinida como o valor original antes do filtro ser aplicado.

Filtros de exibio disponveis


O ActionScript 3.0 inclui dez classes de filtro que podem ser aplicadas em objetos de exibio e em objetos BitmapData:

Filtro de bisel (classe BevelFilter) Filtro de desfoque (classe BlurFilter) Filtro de sombra projetada (classe DropShadowFilter) Filtro de brilho (classe GlowFilter) Filtro de bisel de gradiente (classe GradientBevelFilter) Filtro de brilho de gradiente (classe GradientGlowFilter) Filtro de matriz de cor (classe ColorMatrixFilter) Filtro de convoluo (classe ConvolutionFilter) Filtro de mapa de deslocamento (classe DisplacementMapFilter) Filtro de sombreador (classe ShaderFilter)
Os seis primeiros filtros so simples e podem ser usados para criar um efeito especfico, com alguns recursos de personalizao disponveis. Esses seis filtros podem ser aplicados usando o ActionScript e tambm em objetos no Adobe Flash CS4 Professional usando o painel Filtros. Conseqentemente, mesmo que os filtros sejam aplicados com ActionScript, se voc tiver a ferramenta de criao do Flash, poder usar a interface visual para experimentar rapidamente filtros e configuraes diferentes para saber como criar o efeito desejado.

PROGRAMAO DO ACTIONSCRIPT 3.0 363


Filtro de objetos de exibio

Os quatro ltimos filtros esto disponveis somente no ActionScript. Esses filtros (matriz de cor, convoluo, mapa de deslocamento e sombreador) so muito mais flexveis nos tipos de efeitos que podem criar. Em vez de serem otimizados para um nico efeito, eles fornecem poder e flexibilidade. Por exemplo, selecionando valores diferentes para sua matriz, o filtro de convoluo pode ser usado para criar efeitos como desfoque, entalhe, nitidez, localizao de bordas de cor, transformaes e muito mais. Cada filtro, simples ou complexo, pode ser personalizado com suas propriedades. Geralmente, existem duas opes para configurar propriedades de filtro. Todos os filtros permitem definir as propriedades por meio da transmisso de valores de parmetro ao construtor do objeto de filtro. Se preferir, independentemente de configurar as propriedades de filtro transmitindo parmetros, voc pode ajustar os filtros posteriormente definindo valores para as propriedades do objeto de filtro. A maioria das listagens de cdigo de exemplo define as propriedades diretamente para facilitar o acompanhamento do exemplo. Entretanto, voc normalmente atinge o mesmo resultado em menos linhas de cdigo transmitindo os valores como parmetros no construtor de objeto de filtro. Para obter mais detalhes sobre as especificidades de cada filtro e suas respectivas propriedades e parmetros de construtor, consulte as listagens do pacote flash.filters na Referncia de componentes e linguagem do ActionScript 3.0.

Filtro de bisel
A classe BevelFilter permite a adio de uma borda 3D chanfrada ao objeto filtrado. Esse filtro deixa os cantos ou bordas pontudos do objeto talhados ou chanfrados. As propriedades da classe BevelFilter permitem personalizar a aparncia do bisel. possvel definir cores de realce e sombra, desfoques de borda chanfrada, ngulos de bisel e colocao da borda chanfrada; voc pode inclusive criar um efeito vazado. O exemplo a seguir carrega uma imagem externa e aplica um filtro de bisel nela.

PROGRAMAO DO ACTIONSCRIPT 3.0 364


Filtro de objetos de exibio

import import import import import

flash.display.*; flash.filters.BevelFilter; flash.filters.BitmapFilterQuality; flash.filters.BitmapFilterType; flash.net.URLRequest;

// Load an image onto the Stage. var imageLoader:Loader = new Loader(); var url:String = "http://www.helpexamples.com/flash/images/image3.jpg"; var urlReq:URLRequest = new URLRequest(url); imageLoader.load(urlReq); addChild(imageLoader); // Create the bevel filter and set filter properties. var bevel:BevelFilter = new BevelFilter(); bevel.distance = 5; bevel.angle = 45; bevel.highlightColor = 0xFFFF00; bevel.highlightAlpha = 0.8; bevel.shadowColor = 0x666666; bevel.shadowAlpha = 0.8; bevel.blurX = 5; bevel.blurY = 5; bevel.strength = 5; bevel.quality = BitmapFilterQuality.HIGH; bevel.type = BitmapFilterType.INNER; bevel.knockout = false; // Apply filter to the image. imageLoader.filters = [bevel];

Filtro de desfoque
A classe BlurFilter mancha ou desfoca objetos de exibio e seu respectivo contedo. Os efeitos de desfoque so teis para dar a impresso de que um objeto est fora do foco ou para simular um deslocamento rpido, como em um desfoque de movimento. Defina a propriedade quality do filtro de desfoque como baixa para simular um efeito de lente ligeiramente fora do foco. Definir a propriedade quality como alta resulta em um efeito de desfoque suave similar a um desfoque de Gauss. O exemplo a seguir cria um objeto circular usando o mtodo drawCircle() da classe Graphics e aplica um filtro de desfoque nele:

PROGRAMAO DO ACTIONSCRIPT 3.0 365


Filtro de objetos de exibio

import flash.display.Sprite; import flash.filters.BitmapFilterQuality; import flash.filters.BlurFilter; // Draw a circle. var redDotCutout:Sprite = new Sprite(); redDotCutout.graphics.lineStyle(); redDotCutout.graphics.beginFill(0xFF0000); redDotCutout.graphics.drawCircle(145, 90, 25); redDotCutout.graphics.endFill(); // Add the circle to the display list. addChild(redDotCutout); // Apply the blur filter to the rectangle. var blur:BlurFilter = new BlurFilter(); blur.blurX = 10; blur.blurY = 10; blur.quality = BitmapFilterQuality.MEDIUM; redDotCutout.filters = [blur];

Filtro de sombra projetada


As sombras projetadas do a impresso de que existe uma fonte de luz separada situada acima do objeto de destino. A posio e a intensidade dessa fonte de luz podem ser modificadas para produzir diversos efeitos de sombra projetada diferentes. A classe DropShadowFilter usa um algoritmo similar ao do filtro de desfoque. A principal diferena que o filtro de sombra projetada tem mais propriedades que podem ser modificadas para simular outros atributos de fonte de luz (como alfa, cor, deslocamento e brilho). O filtro de sombra projetada tambm permite aplicar opes de transformao personalizadas no estilo da sombra projetada, incluindo a sombra interna ou externa e o modo vazado (tambm conhecido como recorte). O cdigo a seguir cria uma caixa quadrada e aplica um filtro de sombra projetada nela:
import flash.display.Sprite; import flash.filters.DropShadowFilter; // Draw a box. var boxShadow:Sprite = new Sprite(); boxShadow.graphics.lineStyle(1); boxShadow.graphics.beginFill(0xFF3300); boxShadow.graphics.drawRect(0, 0, 100, 100); boxShadow.graphics.endFill(); addChild(boxShadow); // Apply the drop shadow filter to the box. var shadow:DropShadowFilter = new DropShadowFilter(); shadow.distance = 10; shadow.angle = 25; // You can also set other properties, such as the shadow color, // alpha, amount of blur, strength, quality, and options for // inner shadows and knockout effects. boxShadow.filters = [shadow];

PROGRAMAO DO ACTIONSCRIPT 3.0 366


Filtro de objetos de exibio

Filtro de brilho
A classe GlowFilter aplica um efeito de iluminao aos objetos de exibio, como se o objeto fosse iluminado por baixo, criando um leve brilho. Assim como o filtro de sombra projetada, o filtro de brilho inclui propriedades para modificar a distncia, o ngulo e a cor da fonte de luz para produzir efeitos variados. O GlowFilter tambm tem vrias opes para modificar o estilo do brilho, incluindo o brilho interno ou externo e o modo vazado. O cdigo a seguir cria uma transversal usando a classe Sprite e aplica um filtro de brilho nela:
import flash.display.Sprite; import flash.filters.BitmapFilterQuality; import flash.filters.GlowFilter; // Create a cross graphic. var crossGraphic:Sprite = new Sprite(); crossGraphic.graphics.lineStyle(); crossGraphic.graphics.beginFill(0xCCCC00); crossGraphic.graphics.drawRect(60, 90, 100, 20); crossGraphic.graphics.drawRect(100, 50, 20, 100); crossGraphic.graphics.endFill(); addChild(crossGraphic); // Apply the glow filter to the cross shape. var glow:GlowFilter = new GlowFilter(); glow.color = 0x009922; glow.alpha = 1; glow.blurX = 25; glow.blurY = 25; glow.quality = BitmapFilterQuality.MEDIUM; crossGraphic.filters = [glow];

Filtro de bisel de gradiente


A classe GradientBevelFilter permite a aplicao de um efeito de bisel aprimorado em objetos de exibio ou objetos BitmapData. Usar uma cor de gradiente no bisel melhora muito a profundidade espacial do bisel, dando s bordas uma aparncia 3D mais realista. O cdigo a seguir cria um objeto retangular usando o mtodo drawRect() da classe Shape e aplica um filtro de bisel de gradiente nele.

PROGRAMAO DO ACTIONSCRIPT 3.0 367


Filtro de objetos de exibio

import flash.display.Shape; import flash.filters.BitmapFilterQuality; import flash.filters.GradientBevelFilter; // Draw a rectangle. var box:Shape = new Shape(); box.graphics.lineStyle(); box.graphics.beginFill(0xFEFE78); box.graphics.drawRect(100, 50, 90, 200); box.graphics.endFill(); // Apply a gradient bevel to the rectangle. var gradientBevel:GradientBevelFilter = new GradientBevelFilter(); gradientBevel.distance = 8; gradientBevel.angle = 225; // opposite of 45 degrees gradientBevel.colors = [0xFFFFCC, 0xFEFE78, 0x8F8E01]; gradientBevel.alphas = [1, 0, 1]; gradientBevel.ratios = [0, 128, 255]; gradientBevel.blurX = 8; gradientBevel.blurY = 8; gradientBevel.quality = BitmapFilterQuality.HIGH; // Other properties let you set the filter strength and set options // for inner bevel and knockout effects. box.filters = [gradientBevel]; // Add the graphic to the display list. addChild(box);

Filtro de brilho de gradiente


A classe GradientGlowFilter permite a aplicao de um efeito de brilho aprimorado em objetos de exibio ou objetos BitmapData. Os efeitos permitem que voc tenha mais controle sobre o brilho e produza um efeito mais realista. Alm disso, o filtro de brilho de gradiente permite aplicar um brilho gradiente nas bordas interna, externa ou superior de um objeto. O exemplo a seguir desenha um crculo no palco e aplica um filtro de brilho de gradiente a ele. medida que voc move o mouse mais para a direita e para baixo, a quantidade de desfoque aumenta nas direes horizontal e vertical, respectivamente. Alm disso, sempre que voc clicar no palco, a intensidade do desfoque aumentar.

PROGRAMAO DO ACTIONSCRIPT 3.0 368


Filtro de objetos de exibio

import import import import

flash.events.MouseEvent; flash.filters.BitmapFilterQuality; flash.filters.BitmapFilterType; flash.filters.GradientGlowFilter;

// Create a new Shape instance. var shape:Shape = new Shape(); // Draw the shape. shape.graphics.beginFill(0xFF0000, 100); shape.graphics.moveTo(0, 0); shape.graphics.lineTo(100, 0); shape.graphics.lineTo(100, 100); shape.graphics.lineTo(0, 100); shape.graphics.lineTo(0, 0); shape.graphics.endFill(); // Position the shape on the Stage. addChild(shape); shape.x = 100; shape.y = 100; // Define a gradient glow. var gradientGlow:GradientGlowFilter = new GradientGlowFilter(); gradientGlow.distance = 0; gradientGlow.angle = 45; gradientGlow.colors = [0x000000, 0xFF0000]; gradientGlow.alphas = [0, 1]; gradientGlow.ratios = [0, 255]; gradientGlow.blurX = 10; gradientGlow.blurY = 10; gradientGlow.strength = 2; gradientGlow.quality = BitmapFilterQuality.HIGH; gradientGlow.type = BitmapFilterType.OUTER; // Define functions to listen for two events. function onClick(event:MouseEvent):void { gradientGlow.strength++; shape.filters = [gradientGlow]; } function onMouseMove(event:MouseEvent):void { gradientGlow.blurX = (stage.mouseX / stage.stageWidth) * 255; gradientGlow.blurY = (stage.mouseY / stage.stageHeight) * 255; shape.filters = [gradientGlow]; } stage.addEventListener(MouseEvent.CLICK, onClick); stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);

Exemplo: combinao de filtros bsicos


O cdigo a seguir usa vrios filtros bsicos, combinados com um cronmetro, para criar aes repetidas e simular um farol animado.

PROGRAMAO DO ACTIONSCRIPT 3.0 369


Filtro de objetos de exibio

import import import import import import import import var var var var var var var var var var var var

flash.display.Shape; flash.events.TimerEvent; flash.filters.BitmapFilterQuality; flash.filters.BitmapFilterType; flash.filters.DropShadowFilter; flash.filters.GlowFilter; flash.filters.GradientBevelFilter; flash.utils.Timer;

count:Number = 1; distance:Number = 8; angleInDegrees:Number = 225; // opposite of 45 degrees colors:Array = [0xFFFFCC, 0xFEFE78, 0x8F8E01]; alphas:Array = [1, 0, 1]; ratios:Array = [0, 128, 255]; blurX:Number = 8; blurY:Number = 8; strength:Number = 1; quality:Number = BitmapFilterQuality.HIGH; type:String = BitmapFilterType.INNER; knockout:Boolean = false;

// Draw the rectangle background for the traffic light. var box:Shape = new Shape(); box.graphics.lineStyle(); box.graphics.beginFill(0xFEFE78); box.graphics.drawRect(100, 50, 90, 200); box.graphics.endFill(); // Draw the 3 circles for the three lights. var stopLight:Shape = new Shape(); stopLight.graphics.lineStyle(); stopLight.graphics.beginFill(0xFF0000); stopLight.graphics.drawCircle(145,90,25); stopLight.graphics.endFill(); var cautionLight:Shape = new Shape(); cautionLight.graphics.lineStyle(); cautionLight.graphics.beginFill(0xFF9900); cautionLight.graphics.drawCircle(145,150,25); cautionLight.graphics.endFill(); var goLight:Shape = new Shape(); goLight.graphics.lineStyle(); goLight.graphics.beginFill(0x00CC00); goLight.graphics.drawCircle(145,210,25); goLight.graphics.endFill(); // Add the graphics to the display list. addChild(box); addChild(stopLight); addChild(cautionLight); addChild(goLight); // Apply a gradient bevel to the traffic light rectangle. var gradientBevel:GradientBevelFilter = new GradientBevelFilter(distance, angleInDegrees, colors, alphas, ratios, blurX, blurY, strength, quality, type, knockout);

PROGRAMAO DO ACTIONSCRIPT 3.0 370


Filtro de objetos de exibio

box.filters = [gradientBevel]; // Create the inner shadow (for lights when off) and glow // (for lights when on). var innerShadow:DropShadowFilter = new DropShadowFilter(5, 45, 0, 0.5, 3, 3, 1, 1, true, false); var redGlow:GlowFilter = new GlowFilter(0xFF0000, 1, 30, 30, 1, 1, false, false); var yellowGlow:GlowFilter = new GlowFilter(0xFF9900, 1, 30, 30, 1, 1, false, false); var greenGlow:GlowFilter = new GlowFilter(0x00CC00, 1, 30, 30, 1, 1, false, false); // Set the starting state of the lights (green on, red/yellow off). stopLight.filters = [innerShadow]; cautionLight.filters = [innerShadow]; goLight.filters = [greenGlow]; // Swap the filters based on the count value. function trafficControl(event:TimerEvent):void { if (count == 4) { count = 1; } switch (count) { case 1: stopLight.filters = [innerShadow]; cautionLight.filters = [yellowGlow]; goLight.filters = [innerShadow]; break; case 2: stopLight.filters = [redGlow]; cautionLight.filters = [innerShadow]; goLight.filters = [innerShadow]; break; case 3: stopLight.filters = [innerShadow]; cautionLight.filters = [innerShadow]; goLight.filters = [greenGlow]; break; } count++; } // Create a timer to swap the filters at a 3 second interval. var timer:Timer = new Timer(3000, 9); timer.addEventListener(TimerEvent.TIMER, trafficControl); timer.start();

Filtro de matriz de cor


A classe ColorMatrixFilter usada para manipular a cor e os valores alfa do objeto filtrado. Isso permite criar alteraes de saturao, rotao de matizes (alterando uma paleta de uma gama de cores para outra), alteraes de luminncia para alfa e outros efeitos de manipulao de cor usando valores de um canal de cor e possivelmente aplicando-os em outros canais.

PROGRAMAO DO ACTIONSCRIPT 3.0 371


Filtro de objetos de exibio

Conceitualmente, o filtro percorre cada pixel da imagem de origem e separa-os nos componentes vermelho, verde, azul e alfa. Em seguida, os valores fornecidos na matriz de cor so multiplicados por cada um desses valores, somando os resultados para determinar o valor de cor resultante que ser exibido na tela para o pixel em questo. A propriedade matrix do filtro uma matriz de 20 nmeros usada no clculo da cor final. Para obter informaes sobre o algoritmo especfico usado para calcular os valores de cor, consulte a entrada que descreve a propriedade de matriz da classe ColorMatrixFilter na Referncia de componentes e linguagem do ActionScript 3.0. Outras informaes e exemplos do filtro de matriz de cor esto disponveis no artigo Uso de matrizes para transformaes, ajustes de cor e efeitos de convoluo no Flash no site do Centro de desenvolvedores da Adobe.

Filtro de convoluo
A classe ConvolutionFilter pode ser usada para aplicar diversas transformaes de imagem em objetos BitmapData e objetos de exibio, como desfoque, deteco de borda, nitidez, entalhe e bisel. Conceitualmente, o filtro de convoluo percorre cada pixel da imagem de origem e determina a cor final desse pixel usando o valor do pixel e dos pixels ao redor. Uma matriz, especificada como uma matriz de valores numricos, indica at que ponto o valor de cada pixel ao redor afeta o valor resultante final. Considere o tipo de matriz utilizado com mais freqncia, que uma matriz 3 x 3. A matriz inclui nove valores:
N N N N P N N N N

Quando o Flash Player ou o AIR est aplicando o filtro de convoluo em um determinado pixel, considerado o valor de cor do pixel propriamente dito (P no exemplo), bem como os valores dos pixels ao redor (N no exemplo). No entanto, definindo valores na matriz, voc especifica a prioridade de determinados pixels na imagem resultante. Por exemplo, a matriz a seguir, que tem um filtro de convoluo aplicado, deixar uma imagem exatamente como era:
0 0 0 0 1 0 0 0 0

A imagem no alterada porque o valor do pixel original tem uma intensidade relativa igual a 1 para determinar a cor final do pixel, enquanto os valores dos pixels ao redor tm a intensidade relativa igual a 0 - suas cores no afetam a imagem final. Similarmente, essa matriz far com que os pixels de uma imagem mudem um pixel para a esquerda:
0 0 0 0 0 0 0 1 0

Observe que, nesse caso, o pixel propriamente dito no afeta o valor final do pixel exibido nesse local na imagem final; apenas o valor do pixel direita usado para determinar o valor resultante do pixel. No ActionScript, voc cria a matriz como uma combinao de uma ocorrncia de Array que contm os valores e as duas propriedades que especificam o nmero de linhas e colunas da matriz. O exemplo a seguir carrega uma imagem e, quando o carregamento termina, aplica um filtro de convoluo na imagem usando a matriz da listagem anterior:

PROGRAMAO DO ACTIONSCRIPT 3.0 372


Filtro de objetos de exibio

// Load an image onto the Stage. var loader:Loader = new Loader(); var url:URLRequest = new URLRequest("http://www.helpexamples.com/flash/images/image1.jpg"); loader.load(url); this.addChild(loader); function applyFilter(event:MouseEvent):void { // Create the convolution matrix. var matrix:Array = [0, 0, 0, 0, 0, 1, 0, 0, 0]; var convolution:ConvolutionFilter = new ConvolutionFilter(); convolution.matrixX = 3; convolution.matrixY = 3; convolution.matrix = matrix; convolution.divisor = 1; loader.filters = [convolution]; } loader.addEventListener(MouseEvent.CLICK, applyFilter);

O que no fica bvio nesse cdigo o efeito do uso de valores diferentes de 1 ou 0 na matriz. Por exemplo, a mesma matriz, com o nmero 8 em vez de 1 na posio direita, executa a mesma ao (movimentando os pixels para a esquerda). Alm disso, ela afeta as cores da imagem, deixando-as oito vezes mais brilhantes. Isso ocorre porque os valores finais de cor do pixel so calculados pela multiplicao dos valores da matriz pelas cores do pixel original, pela soma dos valores e pela diviso pelo valor da propriedade divisor do filtro. Observe que, no cdigo de exemplo, a propriedade divisor definida como 1. Como regra geral, se desejar que o brilho das cores permanea quase igual ao brilho da imagem original, o divisor deve ser igual soma dos valores da matriz. Desse modo, se uma matriz tiver a soma de seus valores igual a 8 e o divisor igual a 1, a imagem resultante ser aproximadamente 8 vezes mais brilhante do que a imagem original. Embora o efeito nessa matriz no seja muito notvel, outros valores de matriz podem ser usados para criar diversos efeitos. Veja alguns conjuntos padro de valores de matriz para diferentes efeitos usando uma matriz 3 x 3:

Desfoque bsico (divisor 5):


0 1 0 1 1 1 0 1 0

Nitidez (divisor 1):


0, -1, 0 -1, 5, -1 0, -1, 0

Deteco de borda (divisor 1):


0, -1, 0 -1, 4, -1 0, -1, 0

Efeito de entalhe (divisor 1):


-2, -1, 0 -1, 1, 1 0, 1, 2

PROGRAMAO DO ACTIONSCRIPT 3.0 373


Filtro de objetos de exibio

Observe que na maioria desses efeitos o divisor igual a 1. Isso ocorre porque a adio de valores de matriz negativos a valores de matriz positivos resulta em 1 (ou 0 no caso da deteco de borda, mas o valor da propriedade divisor no pode ser 0).

Filtro de mapa de deslocamento


A classe DisplacementMapFilter usa valores de pixel de um objeto BitmapData (conhecido como a imagem do mapa de deslocamento) para realizar um efeito de deslocamento em um novo objeto. A imagem do mapa de deslocamento normalmente diferente do objeto de exibio ou da ocorrncia de BitmapData real no qual o filtro est sendo aplicado. Um efeito de deslocamento envolve a movimentao de pixels nas imagem filtrada - em outras palavras, desloc-los do local original para alguma posio. Esse filtro pode ser usado para criar um efeito alterado, distorcido ou matizado. O local e a quantidade de deslocamento aplicados em um determinado pixel so especificados pelo valor de cor da imagem do mapa de deslocamento. Ao trabalhar com o filtro, alm de especificar a imagem do mapa, voc especifica os seguintes valores para controlar como o deslocamento calculado a partir da imagem do mapa:

Ponto do mapa: o local da imagem filtrada na qual o canto superior esquerdo do filtra de deslocamento ser
aplicado. Use esse ponto apenas se desejar aplicar o filtro em parte de uma imagem.

Componente X: canal de cor da imagem do mapa que afeta a posio x dos pixels. Componente Y: canal de cor da imagem do mapa que afeta a posio y dos pixels. Escala X: um valor de multiplicador que especifica a intensidade do deslocamento do eixo x. Escala Y: um valor de multiplicador que especifica a intensidade do deslocamento do eixo y. Modo de filtro: determina o que o Flash Player ou o AIR deve fazer nos espaos vazios criados pelos pixels alterados.
As opes, definidas como constantes na classe DisplacementMapFilterMode, devem exibir os pixels originais (modo de filtro IGNORE), colocar os pixels em torno do outro lado da imagem (modo de filtro WRAP, que o padro), usar o pixel alterado mais prximo (modo de filtro CLAMP) ou preencher os espaos com uma cor (modo de filtro COLOR). Para entender o funcionamento do filtro do mapa de deslocamento, considere um exemplo simples. No cdigo a seguir, uma imagem carregada e, em seguida, centralizada no palco. Um filtro de mapa de deslocamento aplicado, fazendo com que os pixels da imagem inteira mudem horizontalmente para a esquerda.

PROGRAMAO DO ACTIONSCRIPT 3.0 374


Filtro de objetos de exibio

import import import import import import

flash.display.BitmapData; flash.display.Loader; flash.events.MouseEvent; flash.filters.DisplacementMapFilter; flash.geom.Point; flash.net.URLRequest;

// Load an image onto the Stage. var loader:Loader = new Loader(); var url:URLRequest = new URLRequest("http://www.helpexamples.com/flash/images/image3.jpg"); loader.load(url); this.addChild(loader); var mapImage:BitmapData; var displacementMap:DisplacementMapFilter; // This function is called when the image finishes loading. function setupStage(event:Event):void { // Center the loaded image on the Stage. loader.x = (stage.stageWidth - loader.width) / 2; loader.y = (stage.stageHeight - loader.height) / 2; // Create the displacement map image. mapImage = new BitmapData(loader.width, loader.height, false, 0xFF0000); // Create the displacement filter. displacementMap = new DisplacementMapFilter(); displacementMap.mapBitmap = mapImage; displacementMap.mapPoint = new Point(0, 0); displacementMap.componentX = BitmapDataChannel.RED; displacementMap.scaleX = 250; loader.filters = [displacementMap]; } loader.contentLoaderInfo.addEventListener(Event.COMPLETE, setupStage);

As propriedades usadas para definir o deslocamento so as seguintes:

Bitmap de mapa: o bitmap de deslocamento uma nova ocorrncia de BitmapData criada pelo cdigo. Suas
dimenses coincidem com as dimenses da imagem carregada (de modo que o deslocamento aplicado na imagem inteira). Ela preenchida com pixels vermelhos slidos.

Ponto do mapa: esse valor definido como o ponto 0, 0 - mais uma vez, o deslocamento ser aplicado na imagem
inteira.

Componente X: esse valor definido como a constante BitmapDataChannel.RED, o que significa que o valor
vermelho do bitmap de mapa determinar o deslocamento dos pixels (o quanto se movimentam) ao longo do eixo x.

Escala X: esse valor definido como 250. O valor total de deslocamento (a partir da imagem do mapa que est
completamente vermelha) desloca a imagem apenas um pouco (aproximadamente metade de um pixel), de modo que, se esse valor fosse definido como 1, a imagem seria movida apenas 0,5 pixel na horizontal. Se esse valor for definido como 250, a imagem ser deslocada aproximadamente 125 pixels.

PROGRAMAO DO ACTIONSCRIPT 3.0 375


Filtro de objetos de exibio

Essas configuraes fazem com que os pixels da imagem filtrada sejam deslocados 250 pixels para a esquerda. A direo (esquerda ou direita) e o valor do deslocamento baseiam-se no valor de cor dos pixels da imagem do mapa. Conceitualmente, o Flash Player ou o AIR percorre cada pixel da imagem filtrada (pelo menos os pixels da regio onde o filtro aplicado que, nesse caso, so todos os pixels) e faz o seguinte com cada pixel:
1 Localiza o pixel correspondente na imagem do mapa. Por exemplo, quando o Flash Player ou o AIR est calculando

o valor de deslocamento para o pixel no canto superior esquerdo da imagem filtrada, ser observado o pixel no canto superior esquerdo da imagem do mapa.
2 Determina o valor do canal de cor especificado no pixel do mapa. Nesse caso, o canal de cor do componente x o

canal vermelho, de modo que o Flash Player e o AIR observam qual o valor do canal vermelho da imagem do mapa no pixel em questo. Como a imagem do mapa vermelho slido, o canal vermelho do pixel 0xFF ou 255. Esse valor usado como valor de deslocamento.
3 Compara o valor de deslocamento com o valor "central" (127, que o valor mdio entre 0 e 255). Se o valor de

deslocamento for inferior ao valor mdio, o pixel ser deslocado em uma direo positiva (para a direita no deslocamento x; para baixo no deslocamento y). Por outro lado, se o valor de deslocamento for maior do que o valor mdio (como neste exemplo), o pixel ser deslocado em uma direo negativa (para a esquerda no deslocamento x; para cima no deslocamento y). Para ser mais preciso, o Flash Player e o AIR subtraem o valor de deslocamento de 127 e o resultado (positivo ou negativo) o valor relativo do deslocamento que aplicado.
4 Finalmente, ele determina o valor real de deslocamento definindo qual porcentagem de deslocamento completo

representado pelo valor de deslocamento relativo. Nesse caso, vermelho total indica 100% de deslocamento. Essa porcentagem multiplicada pelo valor da escala x ou y para determinar o nmero de pixels do deslocamento que ser aplicado. Neste exemplo, 100% vezes um multiplicador igual a 250 determina o valor de deslocamento aproximadamente 125 pixels para a esquerda. Como nenhum valor foi especificado para o componente e a escala y, os padres (que no provocam nenhum deslocamento) foram usados; por esse motivo que a imagem no alterada na vertical. A configurao padro do modo de filtro, WRAP, usada no exemplo, de modo que os pixels se movem para a esquerda e o espao vazio direita preenchido pelos pixels que se deslocaram da margem esquerda da imagem. Voc pode experimentar esse valor para ver os diferentes efeitos. Por exemplo, se voc adicionar a linha a seguir parte do cdigo onde as propriedades de deslocamento esto sendo definidas (antes da linha loader.filters = [displacementMap]), a imagem parecer ter sido manchada ao longo do palco:
displacementMap.mode = DisplacementMapFilterMode.CLAMP;

Em exemplos mais complexos, a listagem a seguir usa um filtro de mapa de deslocamento para criar um efeito de lupa em uma imagem:

PROGRAMAO DO ACTIONSCRIPT 3.0 376


Filtro de objetos de exibio

import import import import import import import import import import import import

flash.display.Bitmap; flash.display.BitmapData; flash.display.BitmapDataChannel; flash.display.GradientType; flash.display.Loader; flash.display.Shape; flash.events.MouseEvent; flash.filters.DisplacementMapFilter; flash.filters.DisplacementMapFilterMode; flash.geom.Matrix; flash.geom.Point; flash.net.URLRequest;

// Create the gradient circles that will together form the // displacement map image var radius:uint = 50; var type:String = GradientType.LINEAR; var redColors:Array = [0xFF0000, 0x000000]; var blueColors:Array = [0x0000FF, 0x000000]; var alphas:Array = [1, 1]; var ratios:Array = [0, 255]; var xMatrix:Matrix = new Matrix(); xMatrix.createGradientBox(radius * 2, radius * 2); var yMatrix:Matrix = new Matrix(); yMatrix.createGradientBox(radius * 2, radius * 2, Math.PI / 2); var xCircle:Shape = new Shape(); xCircle.graphics.lineStyle(0, 0, 0); xCircle.graphics.beginGradientFill(type, redColors, alphas, ratios, xMatrix); xCircle.graphics.drawCircle(radius, radius, radius); var yCircle:Shape = new Shape(); yCircle.graphics.lineStyle(0, 0, 0); yCircle.graphics.beginGradientFill(type, blueColors, alphas, ratios, yMatrix); yCircle.graphics.drawCircle(radius, radius, radius); // Position the circles at the bottom of the screen, for reference. this.addChild(xCircle); xCircle.y = stage.stageHeight - xCircle.height; this.addChild(yCircle); yCircle.y = stage.stageHeight - yCircle.height; yCircle.x = 200; // Load an image onto the Stage. var loader:Loader = new Loader(); var url:URLRequest = new URLRequest("http://www.helpexamples.com/flash/images/image1.jpg"); loader.load(url); this.addChild(loader); // Create the map image by combining the two gradient circles. var map:BitmapData = new BitmapData(xCircle.width, xCircle.height, false, 0x7F7F7F); map.draw(xCircle); var yMap:BitmapData = new BitmapData(yCircle.width, yCircle.height, false, 0x7F7F7F); yMap.draw(yCircle); map.copyChannel(yMap, yMap.rect, new Point(0, 0), BitmapDataChannel.BLUE, BitmapDataChannel.BLUE);

PROGRAMAO DO ACTIONSCRIPT 3.0 377


Filtro de objetos de exibio

yMap.dispose(); // Display the map image on the Stage, for reference. var mapBitmap:Bitmap = new Bitmap(map); this.addChild(mapBitmap); mapBitmap.x = 400; mapBitmap.y = stage.stageHeight - mapBitmap.height; // This function creates the displacement map filter at the mouse location. function magnify():void { // Position the filter. var filterX:Number = (loader.mouseX) - (map.width / 2); var filterY:Number = (loader.mouseY) - (map.height / 2); var pt:Point = new Point(filterX, filterY); var xyFilter:DisplacementMapFilter = new DisplacementMapFilter(); xyFilter.mapBitmap = map; xyFilter.mapPoint = pt; // The red in the map image will control x displacement. xyFilter.componentX = BitmapDataChannel.RED; // The blue in the map image will control y displacement. xyFilter.componentY = BitmapDataChannel.BLUE; xyFilter.scaleX = 35; xyFilter.scaleY = 35; xyFilter.mode = DisplacementMapFilterMode.IGNORE; loader.filters = [xyFilter]; } // This function is called when the mouse moves. If the mouse is // over the loaded image, it applies the filter. function moveMagnifier(event:MouseEvent):void { if (loader.hitTestPoint(loader.mouseX, loader.mouseY)) { magnify(); } } loader.addEventListener(MouseEvent.MOUSE_MOVE, moveMagnifier);

PROGRAMAO DO ACTIONSCRIPT 3.0 378


Filtro de objetos de exibio

Primeiro, o cdigo gera dois crculos de gradiente, que so combinados para formar a imagem do mapa de deslocamento. O crculo vermelho cria o deslocamento do eixo x (xyFilter.componentX = BitmapDataChannel.RED) e o crculo azul cria o deslocamento do eixo y (xyFilter.componentY = BitmapDataChannel.BLUE). Para ajudar voc a entender como se parece a imagem do mapa de deslocamento, o cdigo adiciona os crculos originais, bem como o crculo combinado que serve como a imagem do mapa, parte inferior da tela.

Em seguida, o cdigo carrega uma imagem e, medida que o mouse se move, aplica o filtro de deslocamento na parte da imagem que est embaixo do mouse. Os crculos de gradiente usados como a imagem do mapa de deslocamento fazem com que a regio deslocada se distancie do ponteiro do mouse. Observe que as regies de cinza da imagem do mapa no provocam nenhum deslocamento. A cor de cinza 0x7F7F7F. Os canais azul e vermelho dessa sombra de cinza correspondem exatamente sombra central desses canais de cor, de modo que no h nenhum deslocamento em uma rea de cinza da imagem do mapa. Do mesmo modo, no h nenhum deslocamento no centro do crculo. Embora a cor no seja cinza, os canais azul e vermelho dessa cor so idnticos aos canais azul e vermelho do cinza mdio e, como azul e vermelho so as cores que provocam o deslocamento, no ocorre nenhum deslocamento aqui.

Filtro de sombreador
A classe ShaderFilter permite o uso de um efeito de filtro personalizado definido como um sombreador Pixel Bender. Como gravado como um sombreador Pixel Bender, o efeito de filtro pode ser completamente personalizado. O contedo filtrado transmitido para o sombreador como uma entrada de imagem e o resultado da operao de shader se transforma no resultado de filtro. Para aplicar um filtro de sombreador em um objeto, crie uma ocorrncia de Shader que representa o sombreador Pixel Bender utilizado. Para obter informaes sobre o procedimento de criao de uma ocorrncia de Shader e sobre como especificar a imagem de entrada e valores de parmetro, consulte Trabalho com sombreadores Pixel Bender na pgina 386. Ao usar um sombreador como filtro, tenha em mente trs coisas importantes:

O sombreador deve ser definido para aceitar pelo menos uma imagem de entrada. O objeto filtrado (o objeto de exibio ou o objeto BitmapData no qual o filtro aplicado) transmitido para o
sombreador como o primeiro valor da imagem de entrada. Devido a isso, voc no deve especificar manualmente um valor para a primeira entrada de imagem.

PROGRAMAO DO ACTIONSCRIPT 3.0 379


Filtro de objetos de exibio

Se o sombreador definir mais de uma imagem de entrada, as entradas adicionais devero ser especificadas
manualmente (isto , ser necessrio definir a propriedade input de todas as ocorrncias de ShaderInput que pertencem ocorrncia de Shader). Assim que um objeto Shader tiver sido definido para o sombreador, crie uma ocorrncia de ShaderFilter. Este o objeto de filtro real usado como qualquer outro filtro. Para criar um ShaderFilter que usa um objeto Shader, chame o construtor ShaderFilter() e transmita o objeto Shader como um argumento, como mostra esta listagem:
var myFilter:ShaderFilter = new ShaderFilter(myShader);

Para obter um exemplo completo de como utilizar um filtro de sombreador, consulte Uso de um sombreador como filtro na pgina 404.

Exemplo: Filter Workbench


O Filter Workbench fornece uma interface de usurio para aplicar filtros diferentes em imagens e outros contedos visuais e para visualizar o cdigo resultante que pode ser usado para gerar o mesmo efeito no ActionScript. Alm de fornecer uma ferramenta para experimentar filtros, esse aplicativo demonstra as seguintes tcnicas:

Criao de ocorrncias de vrios filtros Aplicao de vrios filtros em um objeto de exibio


Para obter os arquivos de aplicativo desse exemplo, consulte www.adobe.com/go/learn_programmingAS3samples_flash_br. Os arquivos do aplicativo Filter Workbench esto localizados na pasta Amostras/FilterWorkbench. O aplicativo consiste nos seguintes arquivos:
Arquivo com/example/programmingas3/filterWorkbench/FilterWorkbenchController.as Descrio Classe que fornece a principal funcionalidade do aplicativo, incluindo a alternncia do contedo para os filtros aplicados e a aplicao de filtros no contedo. Interface que define mtodos comuns que so implementados por cada classe padro de filtro. Essa interface define a funcionalidade comum que a classe FilterWorkbenchController usa para interagir com classes individuais de filtro padro. Conjunto de classes, cada uma delas implementa a interface IFilterFactory. Cada uma dessas classes permite criar e definir valores para um nico tipo de filtro. Os painis de propriedade de filtro do aplicativo usam essas classes padro para criar ocorrncias de filtros especficos, que a classe FilterWorkbenchController recupera e aplica no contedo da imagem.

com/example/programmingas3/filterWorkbench/IFilterFactory.as

Na pasta com/example/programmingas3/filterWorkbench/: BevelFactory.as BlurFactory.as ColorMatrixFactory.as ConvolutionFactory.as DropShadowFactory.as GlowFactory.as GradientBevelFactory.as GradientGlowFactory.as com/example/programmingas3/filterWorkbench/IFilterPanel.as

Interface que define mtodos comuns implementados pelas classes que definem os painis da interface de usurio usados para manipular valores de filtro no aplicativo.

PROGRAMAO DO ACTIONSCRIPT 3.0 380


Filtro de objetos de exibio

Arquivo com/example/programmingas3/filterWorkbench/ColorStringFormatter.as

Descrio Classe de utilitrio que inclui um mtodo para converter um valor de cor numrico em um formato de string hexadecimal Classe que serve como objeto de valor, combinando em um nico objeto os trs valores (cor, alfa e proporo) associados a cada cor em GradientBevelFilter e GradientGlowFilter

com/example/programmingas3/filterWorkbench/GradientColor.as

Interface de usurio (Flash) FilterWorkbench.fla O arquivo principal que define a interface de usurio do aplicativo. Classe que gera a funcionalidade da interface de usurio do aplicativo principal; essa classe usada como a classe document do arquivo FLA do aplicativo. Conjunto de classes que geram a funcionalidade de cada painel usado para definir opes para um nico filtro. Para cada classe, tambm existe um smbolo MovieClip associado na biblioteca do arquivo FLA do aplicativo principal, cujo nome corresponde ao nome da classe (por exemplo, o smbolo BlurPanel est vinculado classe definida em BlurPanel.as). Os componentes que fazem parte da interface de usurio so posicionados e nomeados nesses smbolos.

flashapp/FilterWorkbench.as

Na pasta flashapp/filterPanels: BevelPanel.as BlurPanel.as ColorMatrixPanel.as ConvolutionPanel.as DropShadowPanel.as GlowPanel.as GradientBevelPanel.as GradientGlowPanel.as flashapp/ImageContainer.as

Um objeto de exibio que serve como continer da imagem carregada na tela Renderizador de clula personalizado usado para incluir um componente de boto em uma clula no componente DataGrid

flashapp/ButtonCellRenderer.as

Contedo da imagem filtrada com/example/programmingas3/filterWorkbench/ImageType.as Essa classe serve como um objeto de valor que contm o tipo e a URL de um nico arquivo de imagem no qual o aplicativo pode carregar e aplicar filtros. A classe tambm inclui um conjunto de constantes que representam os arquivos de imagem reais disponveis. Imagens e outros contedos visuais nos quais os filtros so aplicados no aplicativo.

images/sampleAnimation.swf, images/sampleImage1.jpg, images/sampleImage2.jpg

PROGRAMAO DO ACTIONSCRIPT 3.0 381


Filtro de objetos de exibio

Como experimentar filtros do ActionScript


O aplicativo Filter Workbench foi desenvolvido para ajudar voc a experimentar os diversos efeitos de filtro e gerar o cdigo do ActionScript relevante para esse efeito. O aplicativo permite selecionar entre trs arquivos diferentes que possuem contedo visual, incluindo imagens de bitmap e uma animao criada no Flash, alm de permitir aplicar oito filtros diferentes do ActionScript na imagem selecionada, individualmente ou em combinao com outros filtros. O aplicativo inclui estes filtros:

Bisel (flash.filters.BevelFilter) Desfoque (flash.filters.BlurFilter) Matrix de cor (flash.filters.ColorMatrixFilter) Convoluo (flash.filters.ConvolutionFilter) Sombra projetada (flash.filters.DropShadowFilter) Brilho (flash.filters.GlowFilter) Bisel de gradiente (flash.filters.GradientBevelFilter) Brilho de gradiente (flash.filters.GradientGlowFilter)
Depois que o usurio seleciona uma imagem e um filtro a ser aplicado nessa imagem, o aplicativo exibe um painel com controles para definir as propriedades especficas do filtro selecionado. Por exemplo, a imagem a seguir mostra o aplicativo com o filtro de bisel selecionado:

medida que o usurio ajusta as propriedades de filtro, a visualizao atualizada em tempo real. O usurio tambm pode aplicar vrios filtros personalizando um filtro, clicando no boto Aplicar, personalizando outro filtro, clicando no boto Aplicar e assim por diante.

PROGRAMAO DO ACTIONSCRIPT 3.0 382


Filtro de objetos de exibio

Existem alguns recursos e limitaes nos painis de filtro do aplicativo:

O filtro de matriz de cor inclui um conjunto de controles para manipular diretamente propriedades comuns de
imagem, como brilho, contrastes, saturao e matiz. Alm disso, possvel especificar valores personalizados de matriz de cor.

O filtro de convoluo, que est disponvel somente no ActionScript, inclui no conjunto de valores de matriz de
convoluo usados normalmente ou valores personalizados podem ser especificados. No entanto, enquanto a classe ConvolutionFilter aceita qualquer tamanho de matriz, o aplicativo Filter Workbench usa uma matriz 3 x 3 fixa, o tamanho de filtro usado com mais freqncia.

Os filtros de mapa de deslocamento e de sombreador, disponveis somente no ActionScript, no esto presentes no


aplicativo Filter Workbench. Um filtro de mapa de deslocamento requer uma imagem do mapa alm do contedo da imagem filtrada. A imagem do mapa do filtro de mapa de deslocamento a entrada principal que determina o resultado do filtro de modo que, sem poder carregar ou criar uma imagem do mapa, seria extremamente limitado experimentar o filtro do mapa de deslocamento. Do mesmo modo, um filtro de sombreador requer um arquivo Pixel Bender de cdigo de bytes alm do contedo da imagem filtrada. Sem poder carregar o cdigo de bytes de sombreador, impossvel usar um filtro de sombreador.

Criao de ocorrncias de filtro


O aplicativo Filter Workbench inclui um conjunto de classes, uma para cada filtro disponvel, que so usadas por painis individuais para criar os filtros. Quando o usurio seleciona um filtro, o cdigo do ActionScript associado ao painel de filtro cria uma ocorrncia da classe de filtro de fbrica apropriada. Essas classes so conhecidas como classes de fbrica porque sua finalidade criar ocorrncias de outros objetos, assim como uma fbrica real cria produtos individuais. Sempre que o usurio altera um valor de propriedade no painel, o cdigo do painel chama o mtodo adequado na classe de fbrica. Cada classe de fbrica inclui mtodos especficos usados pelo painel para criar a ocorrncia de filtro adequada. Por exemplo, se o usurio selecionar o filtro de desfoque, o aplicativo criar uma ocorrncia de BlurFactory. A classe BlurFactory inclui um mtodo modifyFilter() que aceita trs parmetros: blurX, blurY e quality, que so usados em conjunto para criar a ocorrncia de BlurFilter desejada:
private var _filter:BlurFilter; public function modifyFilter(blurX:Number = 4, blurY:Number = 4, quality:int = 1):void { _filter = new BlurFilter(blurX, blurY, quality); dispatchEvent(new Event(Event.CHANGE)); }

Por outro lado, se o usurio selecionar o filtro de convoluo, esse filtro dar uma flexibilidade muito maior e, conseqentemente, ter um conjunto maior de propriedades para controlar. Na classe ConvolutionFactory, o cdigo a seguir chamado quando o usurio seleciona um valor diferente no painel de filtro:

PROGRAMAO DO ACTIONSCRIPT 3.0 383


Filtro de objetos de exibio

private var _filter:ConvolutionFilter; public function modifyFilter(matrixX:Number = 0, matrixY:Number = 0, matrix:Array = null, divisor:Number = 1.0, bias:Number = 0.0, preserveAlpha:Boolean = true, clamp:Boolean = true, color:uint = 0, alpha:Number = 0.0):void { _filter = new ConvolutionFilter(matrixX, matrixY, matrix, divisor, bias, preserveAlpha, clamp, color, alpha); dispatchEvent(new Event(Event.CHANGE)); }

Observe que, em cada caso, quando os valores de filtro so alterados, o objeto de fbrica envia um evento Event.CHANGE para notificar os ouvintes que os valores do filtro foram alterados. A classe FilterWorkbenchController, que realmente aplica os filtros no contedo filtrado, ouve esse evento para recuperar uma nova cpia do filtro e reaplic-lo no contedo filtrado quando necessrio. A classe FilterWorkbenchController no precisa conhecer os detalhes especficos de cada classe de fbrica de filtro ela s precisa saber que o filtro foi alterado e acessar uma cpia do filtro. Para dar suporte a isso, o aplicativo inclui uma interface, IFilterFactory, que define o comportamento que uma classe de fbrica de filtro precisa fornecer para que a ocorrncia de FilterWorkbenchController do aplicativo possa fazer seu trabalho. A classe IFilterFactory define o mtodo getFilter() que usado na classe FilterWorkbenchController:
function getFilter():BitmapFilter;

Observe que a definio do mtodo da interface getFilter() especifica o retorno de uma ocorrncia de BitmapFilter, em vez de um tipo especfico de filtro. A classe BitmapFilter no define um tipo especfico de filtro. Em vez disso, BitmapFilter a classe bsica a partir da qual todas as classes de filtro so criadas. Cada classe de fbrica de filtro define uma implementao especfica do mtodo getFilter() que retorna uma referncia ao objeto de filtro criado. Por exemplo, veja uma verso abreviada do cdigo-fonte da classe ConvolutionFactory:
public class ConvolutionFactory extends EventDispatcher implements IFilterFactory { // ------- Private vars ------private var _filter:ConvolutionFilter; ... // ------- IFilterFactory implementation ------public function getFilter():BitmapFilter { return _filter; } ... }

Na implementao da classe ConvolutionFactory do mtodo getFilter(), retornada uma ocorrncia de ConvolutionFilter, embora nenhum objeto que chame getFilter() saiba necessariamente disso - de acordo com a definio do mtodo getFilter() seguida por ConvolutionFactory, qualquer ocorrncia de BitmapFilter deve ser retornada, a qual pode ser uma ocorrncia de qualquer classe de filtro do ActionScript.

PROGRAMAO DO ACTIONSCRIPT 3.0 384


Filtro de objetos de exibio

Aplicao de filtros em objetos de exibio


Conforme explicado na seo anterior, o aplicativo Filter Workbench usa uma ocorrncia da classe FilterWorkbenchController (a partir daqui mencionada como ocorrncia do controlador), que realmente aplica os filtros no objeto visual selecionado. Antes de aplicar um filtro, a ocorrncia do controlador precisa saber em qual imagem ou contedo visual o filtro deve ser aplicado. Quando o usurio seleciona uma imagem, o aplicativo chama o mtodo setFilterTarget() na classe FilterWorkbenchController, transmitindo uma das constantes definidas na classe ImageType:
public function setFilterTarget(targetType:ImageType):void { ... _loader = new Loader(); ... _loader.contentLoaderInfo.addEventListener(Event.COMPLETE, targetLoadComplete); ... }

Usando essas informaes, a ocorrncia do controlador carrega o arquivo designado, armazenando-o em uma varivel da ocorrncia chamada _currentTarget assim que o carregamento termina:
private var _currentTarget:DisplayObject; private function targetLoadComplete(event:Event):void { ... _currentTarget = _loader.content; ... }

Quando o usurio seleciona um filtro, o aplicativo chama o mtodo setFilter() da ocorrncia do controlador, dando ao controlador uma referncia ao objeto de fbrica de filtro relevante, armazenado em uma varivel da ocorrncia chamada _filterFactory.
private var _filterFactory:IFilterFactory; public function setFilter(factory:IFilterFactory):void { ... _filterFactory = factory; _filterFactory.addEventListener(Event.CHANGE, filterChange); }

Observe que, conforme descrito anteriormente, a ocorrncia do controlador no sabe o tipo de dados especfico da ocorrncia de fbrica de filtro fornecida; ela s sabe que o objeto implementa a ocorrncia de IFilterFactory, indicando que tem um mtodo getFilter() e envia um evento change (Event.CHANGE) quando o filtro alterado. Quando o usurio altera as propriedades no painel do filtro, a ocorrncia do controlador descobre que o filtro foi alterado por meio do evento change da fbrica de filtro, que chama o mtodo filterChange() da ocorrncia do controlador. Esse mtodo, por sua vez, chama o mtodo applyTemporaryFilter():

PROGRAMAO DO ACTIONSCRIPT 3.0 385


Filtro de objetos de exibio

private function filterChange(event:Event):void { applyTemporaryFilter(); } private function applyTemporaryFilter():void { var currentFilter:BitmapFilter = _filterFactory.getFilter(); // Add the current filter to the set temporarily _currentFilters.push(currentFilter); // Refresh the filter set of the filter target _currentTarget.filters = _currentFilters; // Remove the current filter from the set // (This doesn't remove it from the filter target, since // the target uses a copy of the filters array internally.) _currentFilters.pop(); }

A aplicao do filtro no objeto de exibio ocorre no mtodo applyTemporaryFilter(). Primeiro, o controlador recupera uma referncia ao objeto de filtro chamando o mtodo getFilter() da fbrica de filtro.
var currentFilter:BitmapFilter = _filterFactory.getFilter();

A ocorrncia do controlador tem uma varivel da ocorrncia de Array chamada _currentFilters, na qual so armazenados todos os filtros que foram aplicados no objeto de exibio. A prxima etapa adicionar o filtro recm atualizado a essa matriz:
_currentFilters.push(currentFilter);

Em seguida, o cdigo atribui a matriz dos filtros propriedade filters do objeto de exibio, que realmente aplica os filtros na imagem:
_currentTarget.filters = _currentFilters;

Finalmente, como esse filtro adicionado recentemente ainda o filtro de trabalho, ele no deve ser aplicado permanentemente no objeto de exibio e, por isso, removido da matriz _currentFilters:
_currentFilters.pop();

A remoo desse filtro da matriz no afeta o objeto de exibio filtrado porque um objeto de exibio cria uma cpia da matriz de filtros quando esta atribuda propriedade filters e usa essa matriz interna em vez da original. Desse modo, todas as alteraes feitas na matriz dos filtros no afetam o objeto de exibio at que a matriz seja novamente atribuda propriedade filters do objeto de exibio.

386

Captulo 17: Trabalho com sombreadores Pixel Bender


O Adobe Pixel Bender Toolkit permite que os desenvolvedores gravem sombreadores para criar efeitos grficos e executar outro processamento de imagem e dados. O cdigo de bytes do Pixel Bender pode ser executado no ActionScript para aplicar o efeito aos dados da imagem ou ao contedo visual. O uso de sombreadores Pixel Bender no ActionScript fornece a capacidade de criar efeitos visuais personalizados e de executar processamento de dados alm dos recursos internos do ActionScript.

Noes bsicas de sombreadores Pixel Bender


Introduo ao trabalho com sombreadores Pixel Bender
O Adobe Pixel Bender uma linguagem de programao utilizada para criar ou manipular contedo de imagem. Usando o Pixel Bender voc cria um kernel, tambm chamado de sombreador neste documento. O sombreador define uma nica funo executada individualmente em cada pixel de uma imagem. O resultado de cada chamada funo a cor gerada nessa coordenada de pixel da imagem. possvel especificar valores de imagens e parmetros de entrada para personalizar a operao. Em uma nica execuo de um sombreador, os valores de entrada e parmetro so constantes. A nica coisa varivel a coordenada do pixel cuja cor o resultado da chamada funo. Quando possvel, a funo de sombreador chamada para vrias coordenadas de pixel de sada em paralelo. Isso melhora o desempenho do sombreador e pode oferecer processamento de alto desempenho. No Flash Player e no Adobe AIR, h trs tipos de efeitos que podem ser facilmente criados usando-se um sombreador:

preenchimento de desenho modo de mesclagem filtro


Tambm possvel executar um sombreador no modo autnomo. No modo autnomo, o resultado de um sombreador acessado diretamente, sem a necessidade de especificar previamente seu uso pretendido. possvel acessar o resultado como dados de imagem ou como dados binrios ou numricos. No necessrio que os dados sejam dados de imagem. Dessa forma, voc pode atribuir a um sombreador um conjunto de dados como entrada. O sombreador processa os dados, e voc pode acessar o resultado retornado por ele.

Tarefas comuns do sombreador Pixel Bender


As tarefas a seguir provavelmente sero realizadas ao utilizar filtros no ActionScript:

Carregar um sombreador em um aplicativo SWF em execuo ou incorpor-lo em tempo de compilao e acesslo em tempo de execuo

Acesso aos metadados de sombreador Identificar e especificar valores para entradas de sombreador (normalmente imagens) Identificar e especificar valores para parmetros de sombreador

PROGRAMAO DO ACTIONSCRIPT 3.0 387


Trabalho com sombreadores Pixel Bender

Usar um sombreador das seguintes maneiras: Como preenchimento de desenho Como modo de mesclagem Como filtro No modo autnomo

Conceitos e termos importantes


A lista de referncia a seguir contm termos importantes usados neste captulo:

Kernel: No Pixel Bender, um kernel o mesmo que um sombreador. Usando o Pixel Bender, seu cdigo define um
kernel, que por sua vez define uma nica funo que executada individualmente em cada pixel de uma imagem.

Cdigo de bytes do Pixel Bender: quando compilado, um kernel do Pixel Bender transformado em cdigo de bytes
do Pixel Bender. O cdigo de bytes acessado e executado pelo Flash Player ou Adobe AIR em tempo de execuo.

Linguagem Pixel Bender: a linguagem de programao usada para criar um kernel do Pixel Bender. Pixel Bender Toolkit: o aplicativo usado para criar um arquivo de cdigo de bytes do Pixel Bender com base no
cdigo-fonte do Pixel Bender. O Toolkit permite escrever, testar e compilar o cdigo-fonte do Pixel Bender.

Sombreador: neste documento, um sombreador um conjunto de funcionalidades criado na linguagem Pixel


Bender. O cdigo de um sombreador cria um efeito visual ou executa um clculo. Em qualquer um dos casos, o sombreador retorna um conjunto de dados (normalmente, os pixels de uma imagem). O sombreador executa a mesma operao em cada ponto de dados, a nica diferena so as coordenadas do pixel de sada. O sombreador no criado no ActionScript. Ele criado na linguagem Pixel Bender e compilado no cdigo de bytes do Pixel Bender. Ele pode ser incorporado a um arquivo SWF em tempo de compilao ou carregado como arquivo externo em tempo de execuo. Nos dois casos, ele acessado no ActionScript atravs da criao de um objeto Shader e da vinculao deste ao cdigo de bytes do sombreador.

Entrada do sombreador: uma entrada complexa, geralmente dados de imagem de bitmap, fornecida para um
sombreador para uso em seus clculos. Para cada varivel de entrada definida em um sombreador, usado um nico valor (isto , uma nica imagem ou um conjunto de dados binrios) para a execuo inteira do sombreador.

Parmetro de sombreador: um nico valor (ou conjunto limitado de valores) que fornecido para um sombreador
us-lo em seus clculos. Cada valor de parmetro definido para uma nica execuo do sombreador, e o mesmo valor usado durante toda a execuo.

Teste dos exemplos do captulo


Talvez voc queira testar as listagens de cdigo de exemplo fornecidas durante a leitura deste captulo. Como este captulo trata da criao e da manipulao de contedo visual, o teste do cdigo envolve a execuo do cdigo e a visualizao dos resultados no SWF criado. Todos os exemplos criam contedo usando a API de desenho que utiliza ou modificada pelo efeito de sombreador. A maioria das listagens de cdigo de exemplo tm duas partes. Uma parte o cdigo-fonte do Pixel Bender referente ao sombreador usado no exemplo. Primeiro voc deve usar o Pixel Bender Toolkit para compilar o cdigo-fonte em um arquivo de cdigo de bytes do Pixel Bender. Siga estas etapas para criar o arquivo de cdigo de bytes do Pixel Bender:
1 Abra o Adobe Pixel Bender Toolkit. Se necessrio, no menu Criar, escolha Ativar avisos e erros do Flash Player. 2 Copie a listagem de cdigo do Pixel Bender e cole-a no painel do editor de cdigo do Pixel Bender Toolkit. 3 No menu Arquivo, escolha Exportar filtro de kernel do Flash Player.

PROGRAMAO DO ACTIONSCRIPT 3.0 388


Trabalho com sombreadores Pixel Bender

4 Salve o arquivo do cdigo de bytes do Pixel Bender no mesmo diretrio que o documento do Flash. O nome do

arquivo deve ser igual ao nome especificado na descrio do exemplo. A parte do ActionScript de cada exemplo escrita como arquivo de classe. Para testar o exemplo:
1 Crie um documento Flash vazio e salve-o no seu computador. 2 Crie e salve um novo arquivo do ActionScript no mesmo diretrio do documento Flash. O nome do arquivo deve

corresponder ao nome da classe na listagem de cdigo. Por exemplo, se a listagem de cdigo define uma classe chamada MyApplication, use o nome MyApplication.as para salvar o arquivo do ActionScript.
3 Copie a listagem de cdigo no arquivo do ActionScript e salve o arquivo. 4 No documento Flash, clique em uma parte em branco do Palco ou espao de trabalho para ativar o Inspetor de

propriedades do documento.
5 No Inspetor de propriedades no campo Classe do documento, digite o nome da classe do ActionScript que voc

copiou do texto.
6 Execute o programa usando Controlar > Testar filme.

Voc ver os resultados do exemplo na janela de visualizao. Essas tcnicas para testar listagens de cdigo de exemplo so detalhadas em Teste de listagens de cdigo de exemplo dos captulos na pgina 36.

Carregamento ou incorporao de um sombreador


A primeira etapa do uso de um sombreador Pixel Bender no ActionScript obter acesso ao sombreador no seu cdigo ActionScript. Como um sombreador criado usando o Adobe Pixel Bender Toolkit e gravado na linguagem Pixel Bender, ele no pode ser acessado diretamente no ActionScript. Em vez disso, crie uma ocorrncia da classe Shader que represente o sombreador Pixel Bender para o ActionScript. O objeto Shader permite localizar informaes sobre o sombreador, como por exemplo, se ele espera parmetros ou valores da imagem de entrada. Voc passa o objeto Shader para outros objetos para realmente usar o sombreador. Por exemplo, para usar o sombreador como um filtro, voc atribui o objeto Shader propriedade shader de um objeto ShaderFilter. Como alternativa, para usar o sombreador como um preenchimento de desenho, voc passa o objeto Shader como um argumento para o mtodo Graphics.beginShaderFill(). Seu cdigo ActionScript pode acessar um sombreador criado pelo Adobe Pixel Bender Toolkit (um arquivo .pbj) de duas maneiras:

Carregado em tempo de execuo: o arquivo sombreador pode ser carregado como um ativo externo usando um
objeto URLLoader. Essa tcnica semelhante ao carregamento de um ativo externo, como um arquivo de texto. O exemplo a seguir demonstra o carregamento de um arquivo de cdigo de bytes do sombreador em tempo de execuo e sua vinculao com uma ocorrncia de Shader:

PROGRAMAO DO ACTIONSCRIPT 3.0 389


Trabalho com sombreadores Pixel Bender

var loader:URLLoader = new URLLoader(); loader.dataFormat = URLLoaderDataFormat.BINARY; loader.addEventListener(Event.COMPLETE, onLoadComplete); loader.load(new URLRequest("myShader.pbj")); var shader:Shader; function onLoadComplete(event:Event):void { // Create a new shader and set the loaded data as its bytecode shader = new Shader(); shader.byteCode = loader.data; // You can also pass the bytecode to the Shader() constructor like this: // shader = new Shader(loader.data); // do something with the shader }

Incorporado no arquivo SWF: o arquivo sombreador pode ser incorporado no arquivo SWF em tempo de
compilao usando a tag de metadados [Embed]. A tag de metadados [Embed] estar disponvel apenas se voc usar o SDK do Flex para compilar o arquivo SWF. O parmetro source da tag [Embed] aponta para o arquivo sombreador, e seu parmetro mimeType o "application/octet-stream", como neste exemplo:
[Embed(source="myShader.pbj", mimeType="application/octet-stream)] var MyShaderClass:Class; // ... // create a shader and set the embedded shader as its bytecode var shaderShader = new Shader(); shader.byteCode = new MyShaderClass(); // You can also pass the bytecode to the Shader() constructor like this: // var shader:Shader = new Shader(new MyShaderClass()); // do something with the shader

Nos dois casos, voc vincula o cdigo de bytes brutos do sombreador (a propriedade URLLoader.data ou uma ocorrncia da classe de dados [Embed]) com a ocorrncia de Shader. Como demonstram os exemplos anteriores, voc pode atribuir o cdigo de bytes ocorrncia de Shader de duas maneiras. Voc pode passar o cdigo de bytes do sombreador como um argumento para o construtor Shader(). Voc tambm pode defini-lo como a propriedade byteCode da ocorrncia de Shader. Depois que um sombreador Pixel Bender foi criado e vinculado com um objeto Shader, voc pode us-lo para criar efeitos de vrias maneiras. Pode us-lo como um filtro, um modo de mesclagem, um preenchimento bitmap ou para processamento autnomo de bitmap ou de outros dados. Voc pode usar tambm a propriedade data do objeto Shader para acessar os metadados de sombreador, especificar imagens de entrada e definir valores de parmetros.

Acesso aos metadados do sombreador


Ao criar um kernel de sombreador Pixel Bender, o autor pode especificar metadados sobre o sombreador no cdigo fonte Pixel Bender. Ao usar um sombreador no ActionScript, voc pode examin-lo e extrair seus metadados.

PROGRAMAO DO ACTIONSCRIPT 3.0 390


Trabalho com sombreadores Pixel Bender

Ao criar uma ocorrncia de Shader e vincul-la a um sombreador Pixel Bender, um objeto ShaderData que contm dados sobre o sombreador criado e armazenado na propriedade data do objeto Shader. A classe ShaderData no define nenhuma propriedade prpria. No entanto, em tempo de execuo uma propriedade adicionada dinamicamente ao objeto ShaderData para cada valor de metadados definido no cdigo fonte do sombreador. O nome fornecido a cada propriedade igual ao nome especificado nos metadados. Por exemplo, suponha que o cdigo fonte de um sombreador Pixel Bender inclua a seguinte definio de metadados:
namespace : "Adobe::Example"; vendor : "Bob Jones"; version : 1; description : "Creates a version of the specified image with the specified brightness.";

O objeto ShaderData criado para esse sombreador criado com as seguintes propriedades e valores:

namespace (String): "Adobe::Example" vendor (String): "Bob Jones" version (String): "1" description (String): "Cria uma verso da imagem especificada com o brilho especificado"

Como as propriedades de metadados so adicionadas dinamicamente ao objeto ShaderData, voc pode usar um loop for..in para examinar o objeto ShaderData. Usando essa tcnica possvel descobrir se o sombreador tem algum metadado e quais so os seus valores. Alm das propriedades de metadados, um objeto ShaderData pode ter propriedades que representam entradas e parmetros definidos no sombreador. Ao usar um loop for..in para examinar um objeto ShaderData, verifique o tipo de dados de cada propriedade para determinar se a propriedade uma entrada (uma ocorrncia de ShaderInput), um parmetro (uma ocorrncia de ShaderParameter) ou um valor de metadados (uma ocorrncia de String). O exemplo a seguir mostra como usar um loop for..in para examinar as propriedades dinmicas de uma propriedade data do sombreador. Cada valor de metadados adicionado a uma ocorrncia de Vector denominada metadata. Observe que este exemplo assume que uma ocorrncia de Shader denominada myShader j foi criada:
var shaderData:ShaderData = myShader.data; var metadata:Vector.<String> = new Vector.<String>(); for (var prop:String in shaderData) { if (!(shaderData[prop] is ShaderInput) && !(shaderData[prop] is ShaderParameter)) { metadata[metadata.length] = shaderData[prop]; } } // do something with the metadata

Para obter uma verso desse exemplo que tambm extrai entradas e parmetros de sombreador, consulte Identificao de entradas e parmetros de sombreador na pgina 391. Para obter mais informaes sobre propriedades de entrada e parmetro, consulte Especificao de valores de entrada e de parmetro de sombreador na pgina 391.

PROGRAMAO DO ACTIONSCRIPT 3.0 391


Trabalho com sombreadores Pixel Bender

Especificao de valores de entrada e de parmetro de sombreador


Muitos sombreadores Pixel Bender so definidos para usar uma ou mais imagens de entrada que so usadas no processamento do sombreador. Por exemplo, comum um sombreador aceitar uma imagem de origem e produzi-la com um efeito especfico aplicado a ela. Dependendo de como o sombreador usado, o valor de entrada pode ser especificado automaticamente ou voc pode precisar fornecer um valor explicitamente. De modo semelhante, muitos sombreadores especificam parmetros que so usados para personalizar a sada do sombreador. Voc tambm deve definir explicitamente um valor para cada parmetro antes de usar o sombreador. Voc usa a propriedade data do objeto Shader para definir entradas e parmetros do sombreador e para determinar se um sombreador especfico espera entradas ou parmetros. A propriedade data uma ocorrncia de ShaderData.

Identificao de entradas e parmetros de sombreador


A primeira etapa da especificao de valores de entrada e de parmetro de sombreador descobrir se o sombreador especfico que voc est usando espera qualquer imagem ou parmetro de entrada. Cada ocorrncia de Shader tem uma propriedade data que contm um objeto ShaderData. Se o sombreador definir quaisquer entradas ou parmetros, eles sero acessados como propriedades desse objeto ShaderData. Os nomes de propriedades correspondem aos nomes especificados para as entradas e parmetros no cdigo fonte do sombreador. Por exemplo, se um sombreador definir uma entrada denominada src, o objeto ShaderData ter uma propriedade denominada src que representa essa entrada. Cada propriedade que representa uma entrada uma ocorrncia de ShaderInput, e cada propriedade que representa um parmetro uma ocorrncia de ShaderParameter. O ideal que o autor do sombreador fornea documentao do sombreador, indicando quais valores de imagens de entrada e de parmetros o sombreador espera, o que eles representam, os valores apropriados, e assim por diante. No entanto, se o sombreador no estiver documentado (e voc no tiver seu cdigo fonte), voc poder inspecionar os dados do sombreador para identificar as entradas e parmetros. As propriedades que representam entradas e parmetros so adicionadas dinamicamente ao objeto ShaderData. Conseqentemente, voc pode usar um loop for..in para examinar o objeto ShaderData para descobrir se o sombreador associado define quaisquer entradas ou parmetros. Conforme descrito em Acesso aos metadados do sombreador na pgina 389, qualquer valor de metadados definido para um sombreador tambm acessado como uma propriedade dinmica adicionada propriedade Shader.data. Ao usar essa tcnica para identificar entradas e parmetros de sombreador, verifique o tipo de dados das propriedades dinmicas. Se uma propriedade for uma ocorrncia de ShaderInput, ela representar uma entrada. Se ela for uma ocorrncia de ShaderParameter, ela representar um parmetro. Caso contrrio, ela ser um valor de metadados. O exemplo a seguir mostra como usar um loop for..in para examinar as propriedades dinmicas de uma propriedade data do sombreador. Cada entrada (objeto ShaderInput) adicionada a uma ocorrncia de Vector denominada inputs. Cada parmetro (objeto ShaderParameter) adicionado a uma ocorrncia de Vector denominada parameters. Finalmente, quaisquer propriedades de metadados so adicionadas a uma ocorrncia de Vector denominada metadata. Observe que este exemplo assume que uma ocorrncia de Shader denominada myShader j foi criada:

PROGRAMAO DO ACTIONSCRIPT 3.0 392


Trabalho com sombreadores Pixel Bender

var var var var

shaderData:ShaderData = myShader.data; inputs:Vector.<ShaderInput> = new Vector.<ShaderInput>(); parameters:Vector.<ShaderParameter> = new Vector.<ShaderParameter>(); metadata:Vector.<String> = new Vector.<String>();

for (var prop:String in shaderData) { if (shaderData[prop] is ShaderInput) { inputs[inputs.length] = shaderData[prop]; } else if (shaderData[prop] is ShaderParameter) { parameters[parameters.length] = shaderData[prop]; } else { metadata[metadata.length] = shaderData[prop]; } } // do something with the inputs or properties

Especificao de valores de entrada de sombreador


Muitos sombreadores esperam uma ou mais imagens de entrada que so usadas no processamento do sombreador. No entanto, em muitos casos, uma entrada especificada automaticamente quando o objeto Shader usado. Por exemplo, suponha que um sombreador exija uma entrada e seja usado como um filtro. Quando o filtro aplicado a um objeto de exibio ou a um objeto BitmapData, esse objeto definido automaticamente como a entrada. Nesse caso voc no define explicitamente um valor de entrada. No entanto, em alguns casos, especialmente se um sombreador definir vrias entradas, voc definir explicitamente um valor para uma entrada. Cada entrada definida em um sombreador representada no ActionScript por um objeto ShaderInput. O objeto ShaderInput uma propriedade da ocorrncia de ShaderData na propriedade data do objeto Shader, conforme descrito em Identificao de entradas e parmetros de sombreador na pgina 391. Por exemplo, suponha que um sombreador defina uma entrada denominada src e que o sombreador esteja vinculado a um objeto Shader denominado myShader. Nesse caso, voc acessa o objeto ShaderInput que corresponde entrada src usando o seguinte identificador:
myShader.data.src

Cada objeto ShaderInput tem uma propriedade input usada para definir o valor da entrada. Voc define a propriedade input como uma ocorrncia de BitmapData para especificar dados da imagem. Voc tambm pode definir a propriedade input como uma ocorrncia de BitmapData ou Vector.<Nmero> para especificar dados binrios ou numricos. Para obter detalhes e restries sobre o uso de uma ocorrncia de BitmapData ou Vector.<Nmero> como uma entrada, consulte a listagem ShaderInput.input na referncia de linguagem. Alm da propriedade input, um objeto ShaderInput tem propriedades que podem ser usadas para determinar qual tipo de imagem a entrada espera. Essas propriedades incluem as propriedades width, height e channels. Cada objeto ShaderInput tambm tem uma propriedade index que til para determinar se um valor explcito deve ser fornecido para a entrada. Se um sombreador esperar mais entradas do que o nmero definido automaticamente, defina valores para essas entradas. Para obter detalhes sobre as diferentes maneiras de uso de um sombreador, e se os valores de entrada so definidos automaticamente, consulte Uso de um sombreador na pgina 396.

PROGRAMAO DO ACTIONSCRIPT 3.0 393


Trabalho com sombreadores Pixel Bender

Especificao de valores de parmetros de sombreador


Alguns sombreadores definem valores de parmetros que o sombreador usa para criar seu resultado. Por exemplo, um sombreador que altera o brilho de uma imagem pode especificar um parmetro de brilho que determina o quanto a operao afeta o brilho. Um nico parmetro definido em um sombreador pode esperar um nico valor ou vrios valores, de acordo com a definio do parmetro no sombreador. Cada parmetro definido em um sombreador representado no ActionScript por um objeto ShaderParameter. O objeto ShaderParameter uma propriedade da ocorrncia de ShaderData na propriedade de dados do objeto Shader, conforme descrito em Identificao de entradas e parmetros de sombreador na pgina 391. Por exemplo, suponha que um sombreador defina um parmetro denominado brightness e que o sombreador esteja representado por um objeto Shader denominado myShader. Nesse caso, voc acessa o ShaderParameter que corresponde ao parmetro brightness usando o seguinte identificador:
myShader.data.brightness

Para definir um valor (ou valores) para o parmetro, crie uma matriz do ActionScript que contenha o valor ou valores e atribua essa matriz propriedade value do objeto ShaderParameter. A propriedade value definida como uma ocorrncia de Array porque possvel que um nico parmetro do sombreador exija vrios valores. Mesmo que o parmetro do sombreador espere apenas um nico valor, voc deve delimitar o valor em um objeto Array para atribulo propriedade ShaderParameter.value. A listagem a seguir demonstra como configurar um nico valor como a propriedade value:
myShader.data.brightness.value = [75];

Se o cdigo fonte de Pixel Bender do sombreador definir um valor padro para o parmetro, uma matriz que contm o valor ou valores padro ser criada e atribuda propriedade value do objeto ShaderParameter quando o objeto Shader for criado. Depois que a matriz foi atribuda propriedade value (inclusive se ela for a matriz padro), o valor do parmetro poder ser alterado com a alterao do valor do elemento de matriz. Voc no precisa criar uma nova matriz e atribu-la propriedade value. O exemplo a seguir demonstra a configurao de um valor do parmetro do sombreador no ActionScript. Nesse exemplo o sombreador define um parmetro denominado color. O parmetro color declarado como uma varivel float4 no cdigo fonte do Pixel Bender, o que significa que ela uma matriz de quatro nmeros de ponto flutuante. No exemplo, o valor do parmetro color alterado continuamente e, a cada vez que ele alterado, o sombreador usado para desenhar um retngulo colorido na tela. O resultado uma alterao de cor animada. Nota: O cdigo para este exemplo foi escrito por Ryan Taylor. Obrigado por compartilhar este exemplo, Ryan. Para ver o portflio de Ryan e ler seus artigos, acesse www.boostworthy.com/. O cdigo ActionScript est centralizado em torno de trs mtodos:

init(): No mtodo init(), o cdigo carrega o arquivo de cdigo de bytes do Pixel Bender que contm o

sombreador. Quando o arquivo carregado, o mtodo onLoadComplete() chamado.


onLoadComplete(): No mtodo onLoadComplete(), o cdigo cria o objeto Shader chamado shader. Ele tambm

cria uma ocorrncia de Sprite chamada texture. No mtodo renderShader(), o cdigo desenha o resultado do sombreador em texture uma vez por quadro.

onEnterFrame(): O mtodo onEnterFrame() chamado uma vez por quadro criando o efeito de animao.

Nesse mtodo, o cdigo define o valor do parmetro do sombreador como a nova cor e, em seguida, chama o mtodo renderShader() para desenhar o resultado do sombreador como um retngulo.

renderShader(): No mtodo renderShader(), o cdigo chama o mtodo Graphics.beginShaderFill() para

especificar um preenchimento do sombreador. Em seguida, ele desenha um retngulo cujo preenchimento definido pela sada do sombreador (a cor gerada). Para obter mais informaes sobre como usar um sombreador desta maneira, consulte Uso de um sombreador como um preenchimento de desenho na pgina 396.

PROGRAMAO DO ACTIONSCRIPT 3.0 394


Trabalho com sombreadores Pixel Bender

Veja abaixo o cdigo ActionScript para este exemplo. Use esta classe com a classe de aplicativo principal em um projeto somente ActionScript no Flex ou como a classe do documento para o arquivo FLA na Ferramenta de autoria do Flash:
package { import import import import import import

flash.display.Shader; flash.display.Sprite; flash.events.Event; flash.net.URLLoader; flash.net.URLLoaderDataFormat; flash.net.URLRequest;

public class ColorFilterExample extends Sprite { private const DELTA_OFFSET:Number = Math.PI * 0.5; private var loader:URLLoader; private var shader:Shader; private var texture:Sprite; private var delta:Number = 0; public function ColorFilterExample() { init(); } private function init():void { loader = new URLLoader(); loader.dataFormat = URLLoaderDataFormat.BINARY; loader.addEventListener(Event.COMPLETE, onLoadComplete); loader.load(new URLRequest("ColorFilter.pbj")); } private function onLoadComplete(event:Event):void { shader = new Shader(loader.data); shader.data.point1.value = [topMiddle.x, topMiddle,y]; shader.data.point2.value = [bottomLeft.x, bottomLeft.y]; shader.data.point3.value = [bottomRight.x, bottomRight.y]; texture = new Sprite(); addChild(texture); addEventListener(Event.ENTER_FRAME, onEnterFrame); } private function onEnterFrame(event:Event):void {

PROGRAMAO DO ACTIONSCRIPT 3.0 395


Trabalho com sombreadores Pixel Bender

shader.data.color.value[0] = 0.5 + Math.cos(delta - DELTA_OFFSET) * 0.5; shader.data.color.value[1] = 0.5 + Math.cos(delta) * 0.5; shader.data.color.value[2] = 0.5 + Math.cos(delta + DELTA_OFFSET) * 0.5; // The alpha channel value (index 3) is set to 1 by the kernel's default // value. This value doesn't need to change. delta += 0.1; renderShader(); } private function renderShader():void { texture:graphics.clear(); texture.graphics.beginShaderFill(shader); texture.graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight); texture.graphics.endFill(); } } }

Este o cdigo-fonte para o kernel de sombreador ColorFilter, usado para criar o arquivo de cdigo de bytes do Pixel Bender ColorFilter.pbj:
<languageVersion : 1.0;> kernel ColorFilter < namespace : "boostworthy::Example"; vendor : "Ryan Taylor"; version : 1; description : "Creates an image where every pixel has the specified color value."; > { output pixel4 result; parameter float4 color < minValue:float4(0, 0, 0, 0); maxValue:float4(1, 1, 1, 1); defaultValue:float4(0, 0, 0, 1); >; void evaluatePixel() { result = color; } }

Se voc estiver usando um sombreador cujos parmetros no esto documentados, poder calcular quantos elementos de qual tipo devem ser includos na matriz, marcando a propriedade type do objeto ShaderParameter. A propriedade type indica o tipo de dados do parmetro, conforme definido no prprio sombreador. Para obter uma lista de nmeros e tipos de elementos esperados por cada tipo de parmetro, consulte as listagens de propriedades ShaderParameter.value na referncia de linguagem.

PROGRAMAO DO ACTIONSCRIPT 3.0 396


Trabalho com sombreadores Pixel Bender

Cada objeto ShaderParameter tambm tem uma propriedade index que indica onde o parmetro se ajusta na ordem dos parmetros do sombreador. Alm dessas propriedades, um objeto ShaderParameter pode ter propriedades adicionais que contm valores de metadados fornecidos pelo autor do sombreador. Por exemplo, o autor pode especificar valores de metadados, como valores mnimos, mximos e padro para um parmetro. Todos os valores de metadados especificados pelo autor so adicionados ao objeto ShaderParameter como propriedades dinmicas. Para examinar essas propriedades, use um loop for..in para executar um loop nas propriedades dinmicas do objeto ShaderParameter para identificar seus metadados. O exemplo a seguir mostra como usar um loop for..in para identificar metadados de um objeto ShaderParameter. Cada valor de metadados adicionado a uma ocorrncia de Vector denominada metadata. Observe que este exemplo assume que uma ocorrncia de Shader denominada myShader j foi criada, e que conhecida como tendo um parmetro denominado brightness:
var brightness:ShaderParameter = myShader.data.brightness; var metadata:Vector.<String> = new Vector.<String>(); for (var prop:String in brightness) { if (brightness[prop] is String) { metadata[metadata.length] = brightness[prop]; } } // do something with the metadata

Uso de um sombreador
Depois que o sombreador Pixel Bender est disponvel no ActionScript como um objeto Shader, ele pode ser usado de vrias maneiras:

Preenchimento de desenho do sombreador: O sombreador define a parte de preenchimento de uma forma


desenhada usando a API de desenho

Modo de mesclagem: O sombreador define a mesclagem entre dois objetos de exibio sobrepostos Filtro: O sombreador define um filtro que modifica a aparncia do contedo visual Processamento autnomo do sombreador: O processamento do sombreador executado sem especificar o uso
pretendido da sada. Como opo, o sombreador pode ser executado no plano de fundo, com o resultado disponvel quando o processamento concludo. Essa tcnica pode ser usada para gerar dados de bitmap e tambm para processar dados no visuais.

Uso de um sombreador como um preenchimento de desenho


Ao usar um sombreador para criar um preenchimento de desenho, voc deve utilizar os mtodos de API de desenho para criar uma forma vetorial. A sada do sombreador usada para preencher a forma, da mesma maneira que se pode usar qualquer imagem de bitmap como preenchimento de bitmap com a API de desenho. Para criar um preenchimento de desenho, no ponto do cdigo em que voc deseja comear a desenhar a forma, chame o mtodo beginShaderFill() do objeto Graphics. Passe o objeto Shader como o primeiro argumento para o mtodo beginShaderFill(), conforme mostrado nesta listagem:

PROGRAMAO DO ACTIONSCRIPT 3.0 397


Trabalho com sombreadores Pixel Bender

var canvas:Sprite = new Sprite(); canvas.graphics.beginShaderFill(myShader); canvas.graphics.drawRect(10, 10, 150, 150); canvas.graphics.endFill(); // add canvas to the display list to see the result

Quando voc usa um sombreador como preenchimento de desenho, deve definir quaisquer valores de imagem de entrada e valores de parmetro exigidos pelo sombreador. O exemplo a seguir demonstra o uso de um sombreador como preenchimento de desenho. Neste exemplo, o sombreador cria um gradiente de trs pontas. Esse gradiente tem trs cores, cada uma na ponta de um tringulo, com uma mesclagem de gradiente entre elas. Alm disso, as cores se revezam para criar um efeito animado de cores girando.

Nota: O cdigo deste exemplo foi escrito por Petri Leskinen. Obrigado por compartilhar este exemplo, Petri. Para ver mais exemplos e tutoriais de Petri, acesse http://pixelero.wordpress.com/. O cdigo ActionScript est baseado em trs mtodos:

init(): O mtodo init() chamado quando o aplicativo carregado. Neste mtodo, o cdigo define os valores iniciais para os objetos Point que representam as pontas do tringulo. O cdigo tambm cria uma ocorrncia de Sprite chamada canvas. Posteriormente, no mtodo updateShaderFill(), o cdigo desenha o resultado do sombreador em canvas uma vez por quadro. Por ltimo, o cdigo carrega o arquivo de cdigo de bytes do sombreador. onLoadComplete(): No mtodo onLoadComplete(), o cdigo cria o objeto Shader chamado shader. Ele tambm

define os valores de parmetro iniciais. Para terminar, o cdigo adiciona o mtodo updateShaderFill() como um ouvinte do evento enterFrame, o que significa que ele chamado uma vez por quadro para criar um efeito de animao.

updateShaderFill(): O mtodo updateShaderFill() chamado uma vez por quadro, criando o efeito de

animao. Neste mtodo, o cdigo calcula e define os valores dos parmetros do sombreador. O cdigo ento chama o mtodo beginShaderFill() para criar um preenchimento de sombreador e chama outros mtodos de API de desenho para desenhar o resultado do sombreador em um tringulo. Veja abaixo o cdigo ActionScript para este exemplo. Use esta classe com a classe de aplicativo principal em um projeto somente ActionScript no Flex ou como a classe do documento para o arquivo FLA na Ferramenta de autoria do Flash:

PROGRAMAO DO ACTIONSCRIPT 3.0 398


Trabalho com sombreadores Pixel Bender

package { import import import import import import import

flash.display.Shader; flash.display.Sprite; flash.events.Event; flash.geom.Point; flash.net.URLLoader; flash.net.URLLoaderDataFormat; flash.net.URLRequest;

public class ThreePointGradient extends Sprite { private var canvas:Sprite; private var shader:Shader; private var loader:URLLoader; private var topMiddle:Point; private var bottomLeft:Point; private var bottomRight:Point; private var colorAngle:Number = 0.0; private const d120:Number = 120 / 180 * Math.PI; // 120 degrees in radians

public function ThreePointGradient() { init(); } private function init():void { canvas = new Sprite(); addChild(canvas); var size:int = 400; topMiddle = new Point(size / 2, 10); bottomLeft = new Point(0, size - 10); bottomRight = new Point(size, size - 10); loader = new URLLoader(); loader.dataFormat = URLLoaderDataFormat.BINARY; loader.addEventListener(Event.COMPLETE, onLoadComplete); loader.load(new URLRequest("ThreePointGradient.pbj")); } private function onLoadComplete(event:Event):void { shader = new Shader(loader.data); shader.data.point1.value = [topMiddle.x, topMiddle,y]; shader.data.point2.value = [bottomLeft.x, bottomLeft.y]; shader.data.point3.value = [bottomRight.x, bottomRight.y]; addEventListener.Event.ENTER_FRAME, updateShaderFill); } private function updateShaderFill(event:Event):void

PROGRAMAO DO ACTIONSCRIPT 3.0 399


Trabalho com sombreadores Pixel Bender

{ colorAngle += .06; var c1:Number = 1 / 3 + 2 / 3 * Math.cos(colorAngle); var c2:Number = 1 / 3 + 2 / 3 * Math.cos(colorAngle + d120); var c3:Number = 1 / 3 + 2 / 3 * Math.cos(colorAngle - d120; shader.data.color1.value = [c1, c2, c3, 1.0]; shader.data.color2.value = [c3, c1, c2, 1.0]; shader.data.color3.value = [c2, c3, c1, 1.0]; canvas.graphics.clear(); canvas.graphics.beginShaderFill(shader); canvas.graphics.moveTo(topMiddle.x, topMiddle.y); canvas.graphics.lineTo(bottomLeft.x, bottomLeft.y); canvas.graphics.lineTo(bottomRight.x, bottomLeft.y); canvas.graphics.endFill(); } } }

Este o cdigo-fonte para o kernel de sombreador ThreePointGradient, usado para criar o arquivo de cdigo de bytes do Pixel Bender ThreePointGradient.pbj:
<languageVersion : 1.0;> kernel ThreePointGradient < namespace : "Petri Leskinen::Example"; vendor : "Petri Leskinen"; version : 1; description : "Creates a gradient fill using three specified points and colors."; > { parameter float2 point1 // coordinates of the first point < minValue:float2(0, 0); maxValue:float2(4000, 4000); >; parameter float4 color1 // color at the first point, opaque red by default < defaultValue:float4(1.0, 0.0, 0.0, 1.0); >; parameter float2 point2 // coordinates of the second point < minValue:float2(0, 0); maxValue:float2(4000, 4000); >; parameter float4 color2 // color at the second point, opaque green by default < defaultValue:float4(0.0, 1.0, 0.0, 1.0); >;

PROGRAMAO DO ACTIONSCRIPT 3.0 400


Trabalho com sombreadores Pixel Bender

parameter float2 point3 // coordinates of the third point < minValue:float2(0, 0); maxValue:float2(4000, 4000); >; parameter float4 color3 // color at the third point, opaque blue by default < defaultValue:float4(0.0, 0.0, 1.0, 1.0); >; output pixel4 dst; void evaluatePixel() { float d2 = point2 - point1; float d3 = point3 - point1; // transformation to a new coordinate system // transforms point 1 to origin, point2 to (1, 0), and point3 to (0, 1) float2x2 mtrx = float2x2(d3.y, -d2.y, -d3.x, d2.x) / (d2.x * d3.y - d3.x * d2.y); float2 pNew = mtrx * (outCoord() - point1); // repeat the edge colors on the outside pNex.xy = clamp(pNew.xy, 0.0, 1.0); // set the range to 0.0 ... 1.0 // interpolating the output color or alpha value dst = mix(mix(color1, color2, pNex.x), color3, pNew.y); } }

Para obter mais informaes sobre como desenhar formas usando a API de desenho, consulte Uso de objetos visuais na pgina 322.

Uso de um sombreador como modo de mesclagem


O uso de um sombreador como modo de mesclagem parecido com o uso de outros modos de mesclagem. O sombreador define a aparncia resultante da mesclagem visual de dois objetos de exibio. Para usar um sombreador como modo de mesclagem, atribua o objeto Shader propriedade blendShader do objeto de exibio em primeiro plano. A atribuio de um valor diferente de null propriedade blendShader automaticamente define a propriedade blendMode do objeto de exibio como BlendMode.SHADER. A listagem a seguir demonstra o uso de um sombreador como modo de mesclagem. Observe que este exemplo pressupe a existncia de um objeto de exibio chamado foreground contido no mesmo pai na lista de exibio que outro contedo de exibio, com foreground se sobrepondo ao outro contedo:
foreground.blendShader = myShader;

Quando voc usa um sombreador como modo de mesclagem, ele deve ser definido com pelo menos duas entradas. Como mostra o exemplo, voc no define os valores de entrada no cdigo. Em vez disso, as duas imagens mescladas so usadas automaticamente como entradas do sombreador. A imagem em primeiro plano definida como a segunda imagem. (Este o objeto de exibio ao qual o modo de mesclagem aplicado.) Uma imagem em segundo plano criada colocando-se a composio de todos os pixels atrs da caixa delimitadora da imagem em primeiro plano. Essa imagem em segundo plano definida como a primeira imagem de entrada. Se usar um sombreador que espera mais de duas entradas, especifique um valor para qualquer entrada alm das duas primeiras.

PROGRAMAO DO ACTIONSCRIPT 3.0 401


Trabalho com sombreadores Pixel Bender

O exemplo a seguir demonstra o uso de um sombreador como modo de mesclagem. Este exemplo utiliza um modo de mesclagem de clareamento baseado na luminosidade. O resultado da mesclagem que o valor de pixel mais claro de qualquer um dos objetos mesclados se torna o pixel que exibido. Nota: O cdigo deste exemplo foi escrito por Mario Klingemann. Obrigado por compartilhar este exemplo, Mario. Para conhecer mais sobre o trabalho de Mario e ler seus artigos, acesse www.quasimondo.com/. O cdigo ActionScript importante est nestes dois mtodos:

init(): O mtodo init() chamado quando o aplicativo carregado. Neste mtodo, o cdigo carrega o arquivo

de cdigo de bytes do sombreador.


onLoadComplete(): No mtodo onLoadComplete(), o cdigo cria o objeto Shader chamado shader. Em seguida, ele desenha trs objetos. O primeiro, backdrop, um plano de fundo cinza escuro atrs de objetos mesclados. O segundo, backgroundShape, uma elipse gradiente verde. O terceiro objeto, foregroundShape, uma elipse gradiente cor de laranja.

A elipse foregroundShape o objeto de primeiro plano da mesclagem. A imagem de fundo da mesclagem formada pela parte de backdrop e a parte de backgroundShape que so sobrepostas pela caixa delimitadora do objeto foregroundShape. O objeto foregroundShape o objeto no incio da lista de exibio. Ele sobrepe backgroundShape parcialmente e backdrop completamente. Por causa dessa sobreposio, sem um modo de mesclagem aplicado, a elipse laranja (foregroundShape) exibida por completo e parte da elipse verde (backgroundShape) ocultada por ela:

No entanto, com o modo de mesclagem aplicado, a parte mais brilhante da elipse verde transparece porque mais clara do que a parte de foregroundShape que se sobrepe a ela:

Veja abaixo o cdigo ActionScript para este exemplo. Use esta classe com a classe de aplicativo principal em um projeto somente ActionScript no Flex ou como a classe do documento para o arquivo FLA na Ferramenta de autoria do Flash:

PROGRAMAO DO ACTIONSCRIPT 3.0 402


Trabalho com sombreadores Pixel Bender

package { import import import import import import import import import import import

flash.display.BlendMode; flash.display.GradientType; flash.display.Graphics; flash.display.Shader; flash.display.Shape; flash.display.Sprite; flash.events.Event; flash.geom.Matrix; flash.net.URLLoader; flash.net.URLLoaderDataFormat; flash.net.URLRequest;

public class LumaLighten extends Sprite { private var shader:Shader; private var loader:URLLoader; public function LumaLighten() { init(); } private function init():void { loader = new URLLoader(); loader.dataFormat = URLLoaderDataFormat.BINARY; loader.addEventListener(Event.COMPLETE, onLoadComplete); loader.load(new URLRequest("LumaLighten.pbj")); }

private function onLoadComplete(event:Event):void { shader = new Shader(loader.data); var backdrop:Shape = new Shape(); var g0:Graphics = backdrop.graphics; g0.beginFill(0x303030); g0.drawRect(0, 0, 400, 200); g0.endFill(); addChild(backdrop); var backgroundShape:Shape = new Shape(); var g1:Graphics = backgroundShape.graphics; var c1:Array = [0x336600, 0x80ff00]; var a1:Array = [255, 255]; var r1:Array = [100, 255]; var m1:Matrix = new Matrix(); m1.createGradientBox(300, 200); g1.beginGradientFill(GradientType.LINEAR, c1, a1, r1, m1); g1.drawEllipse(0, 0, 300, 200);

PROGRAMAO DO ACTIONSCRIPT 3.0 403


Trabalho com sombreadores Pixel Bender

g1.endFill(); addChild(backgroundShape); var foregroundShape:Shape = new Shape(); var g2:Graphics = foregroundShape.graphics; var c2:Array = [0xff8000, 0x663300]; var a2:Array = [255, 255]; var r2:Array = [100, 255]; var m2:Matrix = new Matrix(); m2.createGradientBox(300, 200); g2.beginGradientFill(GradientType.LINEAR, c2, a2, r2, m2); g2.drawEllipse(100, 0, 300, 200); g2.endFill(); addChild(foregroundShape); foregroundShape.blendShader = shader; foregroundShape.blendMode = BlendMode.SHADER; } } }

Este o cdigo-fonte para o kernel de sombreador LumaLighten, usado para criar o arquivo de cdigo de bytes do Pixel Bender LumaLighten.pbj:
<languageVersion : 1.0;> kernel LumaLighten < namespace : "com.quasimondo.blendModes"; vendor : "Quasimondo.com"; version : 1; description : "Luminance based lighten blend mode"; > { input image4 background; input image4 foreground; output pixel4 dst; const float3 LUMA = float3(0.212671, 0.715160, 0.072169); void evaluatePixel() { float4 a = sampleNearest(foreground, outCoord()); float4 b = sampleNearest(background, outCoord()); float luma_a = a.r * LUMA.r + a.g * LUMA.g + a.b * LUMA.b; float luma_b = b.r * LUMA.r + b.g * LUMA.g + b.b * LUMA.b; dst = luma_a > luma_b ? a : b; } }

Para obter mais informaes sobre como usar modos de mesclagem, consulte Aplicao de modos de mesclagem na pgina 305.

PROGRAMAO DO ACTIONSCRIPT 3.0 404


Trabalho com sombreadores Pixel Bender

Uso de um sombreador como filtro


Usar um sombreador como filtro parecido com usar qualquer um dos outros filtros do ActionScript. Quando voc utiliza um sombreador como filtro, a imagem filtrada (um objeto de exibio ou objeto BitmapData) passada para ele. O sombreador usa a imagem de entrada para criar a sada do filtro, que geralmente uma verso modificada da imagem original. Se o objeto filtrado um objeto de exibio, a sada do sombreador exibida na tela no lugar do objeto de exibio filtrado. Se o objeto filtrado um objeto BitmapData, a sada do sombreador torna-se o contedo do objeto BitmapData cujo mtodo applyFilter() chamado. Para usar um sombreador como filtro, primeiro voc deve criar o objeto Shader conforme descrito em Carregamento ou incorporao de um sombreador na pgina 388. Em seguida, crie um objeto ShaderFilter vinculado ao objeto Shader. O objeto ShaderFilter o filtro aplicado ao objeto filtrado. Voc deve aplic-lo a um objeto da mesma maneira que aplica qualquer filtro. Passe-o para a propriedade filters de um objeto de exibio ou chame o mtodo applyFilter() em um objeto BitmapData. Por exemplo, o cdigo a seguir cria um objeto ShaderFilter e aplica o filtro a um objeto de exibio chamado homeButton.
var myFilter:ShaderFilter = new ShaderFilter(myShader); homeButton.filters = [myFilter];

Quando voc usa um sombreador como filtro, o filtro deve ser definido com pelo menos uma entrada. Como mostra o exemplo, voc no define o valor de entrada no cdigo. Em vez disso, o objeto de exibio filtrado ou o objeto BitmapData definido como a imagem de entrada. Se usar um sombreador que espera mais de uma entrada, especifique um valor para qualquer entrada alm da primeira. Em alguns casos, um filtro altera as dimenses da imagem original. Por exemplo, um tpico efeito de sombra adiciona pixels extra contendo a sombra que acrescentada imagem. Quando usar um sombreador que altera as dimenses da imagem, defina as propriedades leftExtension, rightExtension, topExtension e bottomExtension para indicar em quanto voc deseja que o tamanho da imagem seja alterado. O exemplo a seguir demonstra o uso de um sombreador como filtro. O filtro deste exemplo inverte os valores de canal de vermelho, verde e azul de uma imagem. O resultado a verso negativa da imagem. Nota: O sombreador usado neste exemplo o kernel do Pixel Bender invertRGB.pbk fornecido com o Pixel Bender Toolkit. possvel carregar o cdigo-fonte do kernel a partir do diretrio de instalao do Pixel Bender Toolkit. Compile o cdigo-fonte e salve o arquivo de cdigo de bytes no mesmo diretrio do cdigo-fonte. O cdigo ActionScript importante est nestes dois mtodos:

init(): O mtodo init() chamado quando o aplicativo carregado. Neste mtodo, o cdigo carrega o arquivo

de cdigo de bytes do sombreador.


onLoadComplete(): No mtodo onLoadComplete(), o cdigo cria o objeto Shader chamado shader. Em seguida, ele cria e desenha o contedo de um objeto chamado target. O objeto target um retngulo preenchido com uma cor gradiente linear que vermelho na esquerda, verde e amarelo no meio e azul claro na direita. O objeto no filtrado semelhante a este:

PROGRAMAO DO ACTIONSCRIPT 3.0 405


Trabalho com sombreadores Pixel Bender

Com o filtro aplicado, as cores so invertidas, e o retngulo fica parecido com o seguinte:

O sombreador usado neste exemplo o kernel do Pixel Bender de exemplo invertRGB.pbk fornecido com o Pixel Bender Toolkit. O cdigo-fonte est disponvel no arquivo invertRGB.pbk localizado no diretrio de instalao do Pixel Bender Toolkit. Compile o cdigo-fonte e salve o arquivo de cdigo de bytes com o nome invertRGB.pbj no mesmo diretrio que o seu cdigo-fonte do ActionScript. Veja abaixo o cdigo ActionScript para este exemplo. Use esta classe com a classe de aplicativo principal em um projeto somente ActionScript no Flex ou como a classe do documento para o arquivo FLA na Ferramenta de autoria do Flash:
package { import import import import import import import import import import import

flash.display.GradientType; flash.display.Graphics; flash.display.Shader; flash.display.Shape; flash.display.Sprite; flash.filters.ShaderFilter; flash.events.Event; flash.geom.Matrix; flash.net.URLLoader; flash.net.URLLoaderDataFormat; flash.net.URLRequest;

public class InvertRGB extends Sprite { private var shader:Shader; private var loader:URLLoader; public function InvertRGB() { init(); } private function init():void { loader = new URLLoader(); loader.dataFormat = URLLoaderDataFormat.BINARY; loader.addEventListener(Event.COMPLETE, onLoadComplete); loader.load(new URLRequest("invertRGB.pbj")); }

private function onLoadComplete(event:Event):void {

PROGRAMAO DO ACTIONSCRIPT 3.0 406


Trabalho com sombreadores Pixel Bender

shader = new Shader(loader.data); var target:Shape = new Shape(); addChild(target); var g:Graphics = target.graphics; var c:Array = [0x990000, 0x445500, 0x007799]; var a:Array = [255, 255, 255]; var r:Array = [0, 127, 255]; var m:Matrix = new Matrix(); m.createGradientBox(w, h); g.beginGradientFill(GradientType.LINEAR, c, a, r, m); g.drawRect(10, 10, w, h); g.endFill(); var invertFilter:ShaderFilter = new ShaderFilter(shader); target.filters = [invertFilter]; } } }

Para obter mais informaes sobre como aplicar filtros, consulte Criao e aplicao de filtros na pgina 355.

Uso de um sombreador no modo autnomo


Quando voc usa um sombreador no modo autnomo, o processamento do sombreador executado independentemente do modo como voc pretende usar a sada. Voc especifica o sombreador a ser executado, define valores de entrada e de parmetro e designa um objeto em que so colocados os dados resultantes. Voc pode usar um sombreador no modo autnomo por dois motivos:

Processamento de dados no de imagem: no modo autnomo, voc pode optar por passar dados binrios ou
numricos arbitrrios para o sombreador em vez de dados de imagem de bitmap. Voc pode determinar que o resultado do sombreador seja retornado como dados binrios ou numricos alm dos dados de imagem de bitmap.

Processamento em segundo plano: Quando voc executa um sombreador no modo autnomo, por padro ele
executado de maneira assncrona. Isso significa que o sombreador executado em segundo plano enquanto o aplicativo continua a executar, e o cdigo recebe uma notificao quando o processamento do sombreador concludo. Voc pode usar um sombreador que demora bastante tempo para ser executado e no congela a interface de usurio do aplicativo ou outro processamento enquanto o sombreador est em execuo. Use um objeto ShaderJob para executar um sombreador no modo autnomo. Primeiro voc deve criar o objeto ShaderJob e vincul-lo ao objeto Shader que representa o sombreador a ser executado:
var job:ShaderJob = new ShaderJob(myShader);

Em seguida, defina quaisquer valores de entrada ou de parmetro esperados pelo sombreador. Se estiver executando o sombreador em segundo plano, voc tambm dever registrar um ouvinte para o evento complete do objeto ShaderJob. O ouvinte ser chamado quando o sombreador concluir seu trabalho:
function completeHandler(event:ShaderEvent):void { // do something with the shader result } job.addEventListener(ShaderEvent.COMPLETE, completeHandler);

PROGRAMAO DO ACTIONSCRIPT 3.0 407


Trabalho com sombreadores Pixel Bender

Em seguida, crie um objeto no qual o resultado da operao do sombreador ser gravado quando a operao for concluda. Atribua esse objeto propriedade target do objeto ShaderJob:
var jobResult:BitmapData = new BitmapData(100, 75); job.target = jobResult;

Atribua uma ocorrncia de BitmapData propriedade target caso voc esteja usando ShaderJob para executar o processamento da imagem. Se estiver processando dados binrios ou numricos, atribua um objeto ByteArray ou uma ocorrncia de Vector.<Number> propriedade target. Nesse caso, voc deve definir as propriedades width e height do objeto ShaderJob para especificar o volume de dados a ser gerado para o objeto target. Nota: possvel definir as propriedades shader, target, width e height do objeto ShaderJob em uma nica etapa passando argumentos para o construtor ShaderJob(), da seguinte forma:var job:ShaderJob = new
ShaderJob(myShader, myTarget, myWidth, myHeight);

Quando estiver pronto para executar o sombreador, chame o mtodo start() do objeto ShaderJob:
job.start();

Por padro, chamar start() faz com que ShaderJob seja executado de maneira assncrona. Nesse caso, a execuo do programa prossegue imediatamente com a prxima linha de cdigo, em vez de esperar a concluso do sombreador. Quando a operao do sombreador concluda, o objeto ShaderJob chama seus ouvintes de evento complete, notificando-os sobre o trmino da execuo. Nesse momento (isto , no corpo do ouvinte de evento complete), o objeto target contm o resultado da operao do sombreador. Nota: Em vez de usar o objeto da propriedade target, voc pode recuperar o resultado do sombreador diretamente do objeto do evento que passado para o mtodo do ouvinte. O objeto do evento uma ocorrncia de ShaderEvent. O objeto ShaderEvent tem trs propriedades que podem ser usadas para acessar o resultado, dependendo do tipo de dados do objeto definido como a propriedade target: ShaderEvent.bitmapData, ShaderEvent.byteArray e ShaderEvent.vector. Se preferir, voc pode passar um argumento true para o mtodo start(). Nesse caso, a operao do sombreador ser executada de maneira sncrona. Todo o cdigo (inclusive a interao com a interface de usurio e quaisquer outros eventos) pausado enquanto o sombreador executado. Quando o sombreador concludo, o objeto target contm o resultado do sombreador e o programa prossegue com a prxima linha de cdigo.
job.start(true);

408

Captulo 18: Trabalho com clipes de filme


MovieClip a principal classe de smbolos de animao e clipe de filme criada no Adobe Flash CS4 Professional. Ela possui todos os comportamentos e funcionalidades dos objetos de exibio, mas com propriedades e mtodos adicionais para controlar a linha de tempo de um clipe de filme. Este captulo explica como usar o ActionScript para controlar a reproduo de clipe de filme e criar um clipe de filme dinamicamente.

Noes bsicas de clipes de filme


Introduo ao trabalho com clipes de filme
Os clipes de filme so elementos essenciais para quem cria contedo animado com a ferramenta de autoria do Flash e deseja controlar esse contedo com o ActionScript. Sempre que voc cria um smbolo de clipe de filme no Flash, o Flash adiciona o smbolo biblioteca desse documento Flash. Por padro, esse smbolo se torna uma ocorrncia da classe MovieClip, que contm as propriedades e mtodos da classe MovieClip. Quando uma ocorrncia de um smbolo de clipe de filme colocada no Palco, o clipe de filme avana automaticamente na linha de tempo (se tiver mais de um quadro), a menos que a reproduo seja alterada usando o ActionScript. essa linha de tempo que distingue a classe MovieClip, permitindo que voc crie a animao por meio de interpolaes de movimento ou forma com a ferramenta de autoria do Flash. Entretanto, com um objeto de exibio que uma ocorrncia da classe Sprite, voc pode criar a animao apenas alterando os valores do objeto de modo programtico. Nas verses anteriores do ActionScript, a classe MovieClip era a base para todas as ocorrncias no Palco. No ActionScript 3.0, um clipe de filme apenas um dos muitos objetos que podem aparecer na tela. Se uma linha de tempo no for necessria para a funo de um objeto de exibio, o uso da classe Shape ou Sprite no lugar da classe MovieClip poder melhorar o desempenho de renderizao. Para obter informaes sobre a escolha do objeto de exibio apropriado para uma tarefa, consulte Escolha de uma subclasse de DisplayObject na pgina 292.

Tarefas de clipe de filme comuns


As seguintes tarefas de clipes de filme comuns so descritas neste captulo:

Fazer com que os clipes de filme sejam reproduzidos e parem Reproduzir clipes de filme no sentido inverso Mover o indicador de reproduo para pontos especficos da linha de tempo de um clipe de filme Trabalhar com rtulos de quadro no ActionScript Acessar informaes de cena no ActionScript Criar ocorrncias de smbolos da biblioteca de clipe de filme usando o ActionScript Carregar e controlar arquivos SWF externos, incluindo arquivos criados para verses anteriores do Flash Player Construir um sistema do ActionScript para criar ativos grficos a serem carregados e usados em tempo de execuo

PROGRAMAO DO ACTIONSCRIPT 3.0 409


Trabalho com clipes de filme

Conceitos e termos importantes


A lista de referncia a seguir contm termos importantes usados neste captulo:

SWF AVM1: um arquivo SWF criado usando o ActionScript 1.0 ou o ActionScript 2.0, em geral, para ser executado
no Flash Player 8 ou anterior.

SWF AVM2: um arquivo SWF criado usando o ActionScript 3.0 para Adobe Flash Player 9 ou posterior ou Adobe AIR. SWF externo: um arquivo SWF que criado separadamente do arquivo SWF de projeto e serve para ser carregado
no arquivo SWF de projeto e reproduzido nesse arquivo SWF.

Quadro: a menor diviso de tempo na linha de tempo. Assim como em um fotograma de filme de cinema, cada
quadro como um instantneo da animao no tempo e, quando os quadros so reproduzidos rapidamente em seqncia, o efeito da animao criado.

Linha de tempo: a representao metafrica da srie de quadros forma a seqncia de animao de um clipe de
filme. A linha de tempo de um objeto MovieClip equivalente da ferramenta de autoria do Flash.

Indicador de reproduo: um marcador identificando o local (quadro) na linha de tempo que est sendo exibido
em um determinado momento.

Teste dos exemplos do captulo


Ao trabalhar em um captulo, talvez voc queira testar algumas listagens de cdigo de exemplo sozinho. Como este captulo descreve como trabalhar com clipes de filme no ActionScript, quase todas as listagens de cdigo foram escritas com a idia de manipular um smbolo de clipe de filme que foi criado e colocado no Palco. O teste da amostra envolver a exibio do resultado no Flash Player ou no AIR para ver os efeitos do cdigo no smbolo. Para testar as listagens de cdigo deste captulo:
1 Crie um documento Flash vazio. 2 Selecione um quadro-chave na linha de tempo. 3 Abra o painel Aes e copie a listagem de cdigo no painel Script. 4 Crie uma ocorrncia de smbolo de clipe de filme no Palco. Por exemplo, desenhe uma forma, selecione-a, escolha

Modificar > Converter em smbolo e d um nome ao smbolo.


5 Com o clipe de filme selecionado, no Inspetor de propriedades, d um nome de ocorrncia a ele. O nome deve

corresponder ao nome usado para o clipe de filme na listagem de cdigo de exemplo por exemplo, se a listagem de cdigo manipular um clipe de filme chamado myMovieClip, o nome da ocorrncia do clipe de filme tambm dever ser myMovieClip.
6 Execute o programa usando Controlar > Testar filme.

Na tela, voc ver os resultados do cdigo manipulando o clipe de filme como especificado na listagem de cdigo. Outras tcnicas para testar listagens de cdigo de exemplo so explicadas mais detalhadamente emTeste de listagens de cdigo de exemplo dos captulos na pgina 36.

PROGRAMAO DO ACTIONSCRIPT 3.0 410


Trabalho com clipes de filme

Trabalho com objetos MovieClip


Ao publicar um arquivo SWF, o Flash converte todas as ocorrncias do smbolo de clipe de filme no Palco para objetos MovieClip. Para disponibilizar um smbolo de clipe de filme para o ActionScript, d a ele um nome de ocorrncia no campo Nome da ocorrncia do Inspetor de propriedades. Quando um arquivo SWF criado, o Flash gera o cdigo que cria a ocorrncia de MovieClip no Palco e declara uma varivel usando o nome da ocorrncia. Se voc nomeou clipes de filme que esto aninhados em outros clipes de filme nomeados, esses clipes de filme filho sero tratados como propriedades do clipe de filme pai (voc pode acessar o clipe de filme filho usando a sintaxe de pontos). Por exemplo, se um clipe de filme com o nome de ocorrncia childClip estiver aninhado em outro clipe com o nome de ocorrncia parentClip, voc poder reproduzir a animao de linha de tempo do clipe filho chamando este cdigo:
parentClip.childClip.play();

Nota: : Ocorrncias-filho inseridas no Palco, na ferramenta de autoria do Flash, no podem ser acessadas pelo cdigo a partir do construtor de uma ocorrncia-pai, j que no foram criadas nesse ponto da execuo do cdigo. Antes de acessar o filho, o pai deve, em vez disso, criar a ocorrncia-filho por cdigo ou atrasar o acesso a uma funo de retorno de chamada que ouve o filho de modo a despachar seu evento Event.ADDED_TO_STAGE. Embora alguns mtodos e propriedades herdados da classe MovieClip do ActionScript 2.0 permaneam os mesmos, outros foram alterados. Todas as propriedades prefixadas com um sublinhado foram renomeadas. Por exemplo, as propriedades _width e _height agora so acessadas como width e height, enquanto que _xscale e _yscale agora so acessadas como scaleX e scaleY. Para obter uma lista completa das propriedades e dos mtodos da classe MovieClip, consulte a Referncia dos componentes e da linguagem do ActionScript 3.0.

Controle de reproduo de clipe de filme


O Flash usa a metfora de uma linha de tempo para transmitir uma animao ou uma alterao de estado. Qualquer elemento visual que empregue uma linha de tempo deve ser um objeto MovieClip ou uma extenso da classe MovieClip. Embora o ActionScript possa instruir qualquer clipe de filme a parar, reproduzir ou ir para outro ponto na linha de tempo, ele no pode ser usado para criar dinamicamente uma linha de tempo ou adicionar contedo a quadros especficos; isso s possvel usando a ferramenta de autoria do Flash. Ao ser reproduzido, o MovieClip avana na linha de tempo em uma velocidade controlada pela velocidade de projeo do arquivo SWF. Se desejar, voc pode substituir essa configurao definindo a propriedade Stage.frameRate no ActionScript.

Reproduzir clipes de filme e parar a reproduo


Os mtodos play() e stop() permitem o controle bsico de um clipe de filme na linha de tempo. Por exemplo, suponha que voc tenha um smbolo de clipe de filme no Palco que contm uma animao de uma bicicleta se movendo pela tela, com o nome de ocorrncia definido como bicycle. Se o seguinte cdigo for anexado a um quadrochave na linha de tempo principal,
bicycle.stop();

a bicicleta no se mover (a animao no ser reproduzida). O movimento da bicicleta pode comear por meio de outra interao do usurio. Por exemplo, se voc tivesse um boto chamado startButton, o seguinte cdigo em um quadro-chave na linha de tempo principal faria a animao ser reproduzida com um clique no boto:

PROGRAMAO DO ACTIONSCRIPT 3.0 411


Trabalho com clipes de filme

// This function will be called when the button is clicked. It causes the // bicycle animation to play. function playAnimation(event:MouseEvent):void { bicycle.play(); } // Register the function as a listener with the button. startButton.addEventListener(MouseEvent.CLICK, playAnimation);

Avanar e retroceder
Os mtodos play() e stop() no so a nica forma de controlar a reproduo em um clipe de filme. Voc tambm pode mover o indicador de reproduo para frente ou para trs na linha de tempo manualmente, usando os mtodos nextFrame() e prevFrame(). Quando qualquer um desses mtodos chamado, a reproduo pra e move o indicador de reproduo um quadro para frente ou para trs, respectivamente. Usar o mtodo play() como chamar nextFrame() sempre que o evento enterFrame do objeto do clipe de filme disparado. Com essas linhas, voc pode fazer a reproduo do clipe de filme bicycle retroceder, criando um ouvinte de eventos para o evento enterFrame e instruindo bicycle a ir para o quadro anterior na funo do ouvinte, desta forma:
// This function is called when the enterFrame event is triggered, meaning // it's called once per frame. function everyFrame(event:Event):void { if (bicycle.currentFrame == 1) { bicycle.gotoAndStop(bicycle.totalFrames); } else { bicycle.prevFrame(); } } bicycle.addEventListener(Event.ENTER_FRAME, everyFrame);

Na reproduo normal, se um clipe de filme tiver mais de um quadro, ele far loop indefinidamente ao ser reproduzido, ou seja, ele retornar ao Quadro 1 quando ultrapassar o quadro final. Ao usar prevFrame() ou nextFrame(), esse comportamento no acontece automaticamente (chamar prevFrame() quando o indicador de reproduo est no Quadro 1 no o move para o ltimo quadro). A condio if no exemplo anterior verifica se o indicador de reproduo retrocedeu para o primeiro quadro e o define frente de seu quadro final, criando assim um loop contnuo do clipe de filme cuja reproduo retrocede.

Salto para um quadro diferente e uso de rtulos de quadro


O envio de um clipe de filme para um novo quadro simples. A chamada de gotoAndPlay() ou gotoAndStop() far o clipe de filme saltar para o nmero de quadro especificado como parmetro. Se preferir, voc pode transmitir uma seqncia de caracteres que corresponda ao nome de um rtulo de quadro. possvel atribuir um rtulo a qualquer quadro na linha de tempo. Para fazer isso, selecione um quadro na linha de tempo e digite um nome no campo Rtulo do quadro no Inspetor de propriedades.

PROGRAMAO DO ACTIONSCRIPT 3.0 412


Trabalho com clipes de filme

As vantagens de usar rtulos de quadro em vez de nmeros ficam mais evidentes ao criar um clipe de filme complexo. Quando o nmero de quadros, camadas e interpolaes em uma animao for grande, considere a rotulagem de quadros importantes com descries explicativas que representem mudanas de comportamento no clipe de filme (por exemplo, "off", "walking", "running"). Isso melhora a confiabilidade do cdigo e tambm fornece flexibilidade, j que as chamadas do ActionScript que vo para um quadro rotulado so ponteiros para uma nica referncia, o rtulo, em vez de um nmero de quadro especfico. Se mais tarde voc decidir mover um segmento especfico da animao para um quadro diferente, no ser necessrio alterar o cdigo do ActionScript contanto que mantenha o mesmo rtulo para os quadros no novo local. Para representar os rtulos de quadro no cdigo, o ActionScript 3.0 inclui a classe FrameLabel. Cada ocorrncia dessa classe representa um nico rtulo de quadro e tem uma propriedade name representando o nome do rtulo de quadro conforme especificado no Inspetor de propriedades e uma propriedadeframe representando o nmero do quadro com rtulo colocado na linha de tempo. Para obter acesso s ocorrncias de FrameLabel associadas a uma ocorrncia de clipe de filme, a classe MovieClip inclui duas propriedades que retornam objetos FrameLabel diretamente. A propriedade currentLabels retorna uma matriz que consiste em todos os objetos FrameLabel na linha de tempo inteira de um clipe de filme. A propriedade currentLabel retorna uma seqncia de caracteres contendo o nome do rtulo de quadro encontrado mais recentemente na linha de tempo. Suponha que voc crie um clipe de filme chamado robot e rotulou os diversos estados dessa animao. Voc pode configurar uma condio que verifica a propriedade currentLabel para acessar o estado atual de robot, como no seguinte cdigo:
if (robot.currentLabel == "walking") { // do something }

Trabalho com cenas


No ambiente de autoria do Flash, voc pode usar cenas para demarcar uma srie de linhas de tempo pelas quais um arquivo SWF pode avanar. Com o uso do segundo parmetro dos mtodos gotoAndPlay() ou gotoAndStop(), possvel especificar uma cena qual enviar o indicador de reproduo. Todos os arquivos FLA comeam apenas com a cena inicial, mas voc pode criar novas cenas. O uso de cenas nem sempre a melhor abordagem porque as cenas apresentam vrias desvantagens. Um documento Flash contendo vrias cenas pode ser difcil de manter, principalmente em ambientes de vrios autores. Vrias cenas tambm podem ser ineficientes em largura de banda, porque o processo de publicao mescla todas as cenas em uma nica linha de tempo. Isso provoca um download progressivo de todas as cenas, mesmo que elas nunca sejam reproduzidas. Por esses motivos, o uso de vrias cenas, muitas vezes, no recomendado para organizar vrias animaes longas baseadas na linha de tempo. A propriedade scenes da classe MovieClip uma matriz de objetos Scene que representa todas as cenas no arquivo SWF. A propriedade currentScene retorna um objeto Scene que representa a cena que est em execuo no momento. A classe Scene possui vrias propriedades que fornecem informaes sobre uma cena. A propriedade labels retorna uma matriz de objetos FrameLabel representando os rtulos de quadro dessa cena. A propriedade name retorna o nome da cena como uma seqncia de caracteres. A propriedade numFrames retorna um int representando o nmero total de quadro na cena.

PROGRAMAO DO ACTIONSCRIPT 3.0 413


Trabalho com clipes de filme

Criao de objetos MovieClip com o ActionScript


Uma maneira de adicionar contedo tela no Flash arrastando ativos da biblioteca para o Palco, mas esse no o nico fluxo de trabalho. Para projetos complexos, os desenvolvedores experientes em geral preferem criar clipes de filme de modo programtico. Essa abordagem apresenta vrias vantagens: facilidade de reutilizao de cdigo, velocidade de tempo de compilao mais rpida e modificaes mais sofisticadas que esto disponveis apenas para o ActionScript. A API da lista de exibio do ActionScript 3.0 simplifica o processo de criar dinamicamente os objetos MovieClip. A capacidade de instanciar uma ocorrncia de MovieClip diretamente, separada do processo de adicion-la lista de exibio, fornece flexibilidade e simplicidade sem sacrificar o controle. No ActionScript 3.0, quando voc cria uma ocorrncia de clipe de filme (ou qualquer outro objeto de exibio) de modo programtico, ela s aparece na tela quando adicionada lista de exibio, chamando addChild() ou o mtodo addChildAt() em um continer de objetos de exibio. Isso permite criar um clipe de filme, definir suas propriedades e at chamar mtodos antes que ele seja renderizado na tela. Para obter informaes sobre como trabalhar com a lista de exibio, consulte Trabalho com contineres de objeto de exibio na pgina 282.

Exportao de smbolos da biblioteca para o ActionScript


Por padro, as ocorrncias de smbolos de clipe de filme em uma biblioteca de documentos Flash no podem ser criadas dinamicamente (ou seja, usando apenas o ActionScript). Isso porque cada smbolo que exportado para ser usado no ActionScript aumenta o tamanho do arquivo SWF, e talvez no haja a inteno de usar alguns smbolos no palco. Por isso, para que um smbolo se torne disponvel, necessrio especificar que ele seja exportado para o ActionScript. Para exportar um smbolo para o ActionScript: 1 Selecione o smbolo no painel Biblioteca e abra a caixa de dilogo Propriedades do smbolo.
2 Se necessrio, ative as Configuraes avanadas. 3 Na seo de ligao, marque a caixa de seleo Exportar para ActionScript.

Isso ativar os campos Classe e Classe base. Por padro, o campo Classe preenchido com o nome do smbolo, com os espaos removidos (por exemplo, um smbolo chamado "Tree House" se tornaria "TreeHouse"). Para especificar que o smbolo use uma classe personalizada para seu comportamento, digite o nome completo da classe incluindo seu pacote neste campo. Se pretende criar ocorrncias do smbolo no ActionScript, mas no precisa adicionar nenhum comportamento adicional, voc pode deixar o nome da classe como est. O valor da Classe base assume flash.display.MovieClip como padro. Se quiser estender a funcionalidade do smbolo para outra classe personalizada, voc poder especificar o nome dessa classe, contanto que ela estenda a classe Sprite (ou MovieClip).
4 Pressione o boto OK para salvar as alteraes.

Neste ponto, se o Flash no puder encontrar um arquivo ActionScript externo com uma definio para a classe especificada (por exemplo, se no for preciso adicionar outro comportamento ao smbolo), ser exibido um aviso: No foi possvel localizar uma definio para esta classe no caminho de classe. Portanto, uma definio ser automaticamente gerada no arquivo SWF aps a exportao.. Desconsidere esse aviso se o smbolo da biblioteca no exigir funcionalidade exclusiva alm daquela da classe MovieClip.

PROGRAMAO DO ACTIONSCRIPT 3.0 414


Trabalho com clipes de filme

Se voc no fornecer uma classe para o smbolo, o Flash criar uma para ele equivalente a esta:
package { import flash.display.MovieClip; public class ExampleMovieClip extends MovieClip { public function ExampleMovieClip() { } } }

Se quiser adicionar outra funcionalidade ActionScript ao smbolo, adicione as propriedades e mtodos adequados estrutura de cdigo abaixo. Por exemplo, suponha que voc tenha um smbolo de clipe de filme contendo um crculo com 50 pixels de largura e 50 de altura, e o smbolo seja especificado para ser exportado para o ActionScript com uma classe chamada Circle. O cdigo a seguir, quando colocado em um arquivo Circle.as, estende a classe MovieClip e fornece ao smbolo os mtodos adicionais getArea() e getCircumference():
package { import flash.display.MovieClip; public class Circle extends MovieClip { public function Circle() { } public function getArea():Number { // The formula is Pi times the radius squared. return Math.PI * Math.pow((width / 2), 2); } public function getCircumference():Number { // The formula is Pi times the diameter. return Math.PI * width; } } }

O seguinte cdigo, colocado em um quadro-chave no Quadro 1 do documento Flash, criar uma ocorrncia do smbolo e a exibir na tela:
var c:Circle = new Circle(); addChild(c); trace(c.width); trace(c.height); trace(c.getArea()); trace(c.getCircumference());

Esse cdigo demonstra a instanciao baseada no ActionScript como uma alternativa para arrastar ativos individuais ao Palco. Isso cria um crculo com todas as propriedades de um clipe de filme e com os mtodos personalizados definidos na classe Circle. Este exemplo bem bsico; o smbolo da biblioteca pode especificar um nmero qualquer de propriedades e mtodos em sua classe.

PROGRAMAO DO ACTIONSCRIPT 3.0 415


Trabalho com clipes de filme

A instanciao baseada no ActionScript muito eficiente, porque permite criar dinamicamente grandes quantidades de ocorrncias, um trabalho que seria cansativo se feito manualmente. Ela tambm flexvel, porque voc pode personalizar as propriedades de cada ocorrncia na sua criao. Para ter uma idia dessas duas vantagens, use um loop para criar dinamicamente vrias ocorrncias de Circle. Com o smbolo e a classe Circle descritos anteriormente na sua biblioteca de documentos Flash, coloque o seguinte cdigo em um quadro-chave do Quadro 1:
import flash.geom.ColorTransform; var totalCircles:uint = 10; var i:uint; for (i = 0; i < totalCircles; i++) { // Create a new Circle instance. var c:Circle = new Circle(); // Place the new Circle at an x coordinate that will space the circles // evenly across the Stage. c.x = (stage.stageWidth / totalCircles) * i; // Place the Circle instance at the vertical center of the Stage. c.y = stage.stageHeight / 2; // Change the Circle instance to a random color c.transform.colorTransform = getRandomColor(); // Add the Circle instance to the current timeline. addChild(c); } function getRandomColor():ColorTransform { // Generate random values for the red, green, and blue color channels. var red:Number = (Math.random() * 512) - 255; var green:Number = (Math.random() * 512) - 255; var blue:Number = (Math.random() * 512) - 255; // Create and return a ColorTransform object with the random colors. return new ColorTransform(1, 1, 1, 1, red, green, blue, 0); }

Isso demonstra como voc pode criar e personalizar vrias ocorrncias de um smbolo com rapidez usando cdigo. Cada ocorrncia posicionada com base na contagem atual dentro do loop e recebe uma cor aleatria definindo sua propriedade transform (que Circle herda ao estender a classe MovieClip).

Carregamento de um arquivo SWF externo


No ActionScript 3.0, os arquivos SWF so carregados usando a classe Loader. Para carregar um arquivo SWF externo, o ActionScript precisa fazer quatro coisas:
1 Criar um novo objeto URLRequest com a url do arquivo. 2 Criar um novo objeto Loader. 3 Chamar o mtodo load() do objeto Loader, transmitindo a ocorrncia de URLRequest como um parmetro. 4 Chame o mtodo addChild() em um continer de objetos de exibio (como a linha de tempo principal de um

documento Flash) para adicionar a ocorrncia de Loader lista de exibio. Por fim, o cdigo fica semelhante a este:

PROGRAMAO DO ACTIONSCRIPT 3.0 416


Trabalho com clipes de filme

var request:URLRequest = new URLRequest("http://www.[yourdomain].com/externalSwf.swf"); var loader:Loader = new Loader() loader.load(request); addChild(loader);

Esse mesmo cdigo pode ser usado para carregar um arquivo de imagem externo, como uma imagem JPEG, GIF ou PNG, especificando a url do arquivo de imagem em vez da url de um arquivo SWF. Um arquivo SWF, diferentemente de um arquivo de imagem, pode conter o ActionScript. Por isso, embora o processo de carregar um arquivo SWF seja idntico ao de carregar uma imagem, no carregamento de um arquivo SWF externo, o arquivo SWF que faz o carregamento e o arquivo SWF que carregado residem na mesma caixa de proteo caso o Flash Player ou o AIR executem o SWF e voc pretenda usar o ActionScript para se comunicar de alguma forma com arquivo SWF. Alm disso, se o arquivo SWF contiver classes que compartilhem o mesmo espao para nomes das classes no arquivo SWF de carregamento, talvez seja necessrio criar um novo domnio de aplicativo para o arquivo SWF carregado a fim de evitar conflitos de espao para nomes. Para obter mais informaes sobre consideraes de segurana e domnios de aplicativo, consulte Uso da classe ApplicationDomain na pgina 657 e Carregamento de arquivos SWF e de imagens na pgina 718. Quando carregado com xito, o arquivo SWF externo pode ser acessado por meio da propriedade Loader.content. Se for publicado no ActionScript 3.0, o arquivo SWF externo ser um clipe de filme ou uma entidade grfica, dependendo da classe que ele estender.

Consideraes sobre o carregamento de um arquivo SWF antigo


Se o arquivo SWF externo for publicado com uma verso mais antiga do ActionScript, h importantes limitaes a serem consideradas. Diferentemente de um arquivo SWF do ActionScript 3.0 que executado com AVM2 (ActionScript Virtual Machine 2), um arquivo SWF publicado para o ActionScript 1.0 ou no 2.0 executado com AVM1 (ActionScript Virtual Machine 1). Quando um arquivo SWF AVM1 carregado com xito, o objeto carregado (a propriedade Loader.content ) um objeto AVM1Movie. Uma ocorrncia de AVM1Movie no igual a uma ocorrncia de MovieClip. um objeto de exibio, mas, diferentemente de um clipe de filme, no inclui mtodos ou propriedades relacionadas linha de tempo. O arquivo SWF AVM2 pai no ter acesso a propriedades, mtodos ou objetos do objeto AVM1Movie carregado. Existem vrias restries adicionais em um arquivo SWF AVM1 carregado por um arquivo SWF AVM2. Para obter detalhes, consulte a listagem da classe AVM1Movie na Referncia dos componentes e da linguagem do ActionScript 3.0.

Exemplo: RuntimeAssetsExplorer
A funcionalidade Exportar para ActionScript pode ser especialmente vantajosa para bibliotecas que podem ser teis em mais de um projeto. Se o Flash Player ou o AIR executar um arquivo SWF, os smbolos exportados para o ActionScript ficaro disponveis para qualquer arquivo SWF dentro da mesma caixa de proteo de segurana que o SWF que o carregar. Dessa forma, um nico documento Flash pode gerar um arquivo SWF exclusivamente designado para manter ativos grficos. Essa tcnica especialmente til para projetos grandes nos quais os designers que lidam com ativos visuais podem trabalhar em paralelo com os desenvolvedores que criam um arquivo SWF "empacotador" que carrega o arquivo SWF de ativos grficos em tempo de execuo. Voc pode usar esse mtodo para manter uma srie de arquivos de verso nos quais os ativos grficos no dependem do progresso do desenvolvimento de programao. O aplicativo RuntimeAssetsExplorer carrega qualquer arquivo SWF que for uma subclasse de RuntimeAsset e permite navegar pelos ativos disponveis desse arquivo SWF. O exemplo ilustra o seguinte:

Carregamento de um arquivo SWF externo usando Loader.load()

PROGRAMAO DO ACTIONSCRIPT 3.0 417


Trabalho com clipes de filme

Criao dinmica de um smbolo de biblioteca exportado para o ActionScript Controle do ActionScript de reproduo de MovieClip
Antes de comear, observe que cada arquivo SWF a ser executado no Flash Player deve estar localizado na mesma caixa de proteo de segurana. Para obter mais informaes, consulte Caixas de proteo de segurana na pgina 706. Para obter os arquivos de aplicativo para esta amostra, consulte www.adobe.com/go/learn_programmingAS3samples_flash_br. Os arquivos de aplicativo RuntimeAssetsExplorer podem ser encontrados na pasta Samples/RuntimeAssetsExplorer. O aplicativo consiste nos seguintes arquivos:
Arquivo RuntimeAssetsExample.mxml ou RuntimeAssetsExample.fla GeometricAssets.as Uma classe de exemplo que implementa a interface RuntimeAsset. Um arquivo FLA vinculado classe GeometricAssets (a classe de documento do FLA) contendo smbolos que so exportados para o ActionScript. Uma interface que define os mtodos necessrios esperados de todos os arquivos SWF de ativos de tempo de execuo que sero carregados no continer do explorador. A classe do smbolo de biblioteca na forma de uma caixa de rotao. A classe do smbolo de biblioteca na forma de uma estrela de rotao. Descrio A interface do usurio do aplicativo para Flex (MXML) ou Flash (FLA).

GeometricAssets.fla

com/example/programmingas3/runtimeassetsexplorer/RuntimeLibrary.as

com/example/programmingas3/runtimeassetsexplorer/AnimatingBox.as

com/example/programmingas3/runtimeassetsexplorer/AnimatingStar.as

Estabelecimento de uma interface de biblioteca de tempo de execuo


Para que o explorador interaja adequadamente com uma biblioteca SWF, a estrutura das bibliotecas de ativos de tempo de execuo deve ser formalizada. Faremos isso criando uma interface, que semelhante a uma classe pois trata-se de um projeto de mtodos que demarca uma estrutura esperada, mas, diferentemente de uma classe, no inclui nenhum corpo de mtodo. A interface fornece um meio de comunicao ente a biblioteca de tempo de execuo e o explorador. Cada SWF de ativos de tempo de execuo que for carregado em nosso navegador implementar essa interface. Para obter informaes sobre interfaces e como elas podem ser teis, consulte Interfaces na pgina 108. A interface RuntimeLibrary ser bem simples: precisamos apenas de uma funo que fornea ao explorador uma matriz de caminhos de classe para os smbolos a serem exportados e disponibilizados na biblioteca de tempo de execuo. Para esse fim, a interface possui um nico mtodo: getAssets().
package com.example.programmingas3.runtimeassetexplorer { public interface RuntimeLibrary { function getAssets():Array; } }

PROGRAMAO DO ACTIONSCRIPT 3.0 418


Trabalho com clipes de filme

Criao do arquivo SWF da biblioteca de ativos


Ao definir a interface RuntimeLibrary, possvel criar vrios arquivos SWF de biblioteca de ativos que podem ser carregados em outro arquivo SWF. A criao de uma biblioteca SWF individual de ativos envolve quatro tarefas:

Criao de uma classe para o arquivo SWF da biblioteca de ativos Criao de classes para ativos individuais contidos na biblioteca Criao dos ativos grficos em si Associao de elementos grficos a classes e publicao do SWF da biblioteca
Criao de uma classe para implementar a interface RuntimeLibrary Em seguida, criaremos a classe GeometricAssets que implementar a interface RuntimeLibrary. Ela ser a classe de documento do FLA. O cdigo para essa classe muito semelhante interface RuntimeLibrary; a diferena entre eles que, na definio da classe, o mtodo getAssets() possui um corpo de mtodo.
package { import flash.display.Sprite; import com.example.programmingas3.runtimeassetexplorer.RuntimeLibrary; public class GeometricAssets extends Sprite implements RuntimeLibrary { public function GeometricAssets() { } public function getAssets():Array { return [ "com.example.programmingas3.runtimeassetexplorer.AnimatingBox", "com.example.programmingas3.runtimeassetexplorer.AnimatingStar" ]; } } }

Se fssemos criar uma segunda biblioteca de tempo de execuo, criaramos outro FLA com base em outra classe (por exemplo, AnimationAssets) que fornece sua prpria implementao de getAssets(). Criao de classes para cada ativo MovieClip Para este exemplo, iremos apenas estender a classe MovieClip sem adicionar nenhuma funcionalidade aos ativos personalizados. O seguinte cdigo para AnimatingStar anlogo ao de AnimatingBox:
package com.example.programmingas3.runtimeassetexplorer { import flash.display.MovieClip; public class AnimatingStar extends MovieClip { public function AnimatingStar() { } } }

PROGRAMAO DO ACTIONSCRIPT 3.0 419


Trabalho com clipes de filme

Publicao da biblioteca Agora, iremos conectar os ativos baseados no MovieClip nova classe, criando um novo FLA e inserindo GeometricAssets no campo Classe do documento do Inspetor de propriedades. Para fins deste exemplo, criaremos duas formas bsicas que suam uma interpolao de linha de tempo para fazer uma rotao no sentido horrio em 360 quadros. Os smbolos animatingBox e animatingStar so definidos para Exportar para ActionScript e o campo Classe definido com os respectivos caminhos de classe especificados na implementao de getAssets(). A classe base padro de flash.display.MovieClip permanece, pois desejamos subclassificar os mtodos MovieClip padro. Depois de definir as configuraes de exportao do smbolo, publique o FLA. Agora, sua primeira biblioteca de tempo de execuo est pronta. Se esse arquivo SWF fosse carregado em outro arquivo SWF AVM2, os smbolos AnimatingBox e AnimatingStar ficariam disponveis para o arquivo SWF.

Carregamento da biblioteca em outro arquivo SWF


A ltima questo funcional a ser resolvida a interface do usurio para o explorador de ativos. Neste exemplo, o caminho para a biblioteca de tempo de execuo codificado como uma varivel chamada ASSETS_PATH. Se preferir, voc pode usar a classe FileReference, por exemplo, para criar uma interface que navegue para um arquivo SWF especfico do seu disco rgido. Quando a biblioteca de tempo de execuo carregada com xito, o Flash Player chama o mtodo
runtimeAssetsLoadComplete(): private function runtimeAssetsLoadComplete(event:Event):void { var rl:* = event.target.content; var assetList:Array = rl.getAssets(); populateDropdown(assetList); stage.frameRate = 60; }

Nesse mtodo, a varivel rl representa o arquivo SWF carregado. O cdigo chama o mtodo getAssets() do arquivo SWF carregado, obtendo uma lista de ativos que esto disponveis e os usa para preencher um componente ComboBox com uma lista de ativos disponveis, chamando o mtodo populateDropDown(). Esse mtodo por sua vez armazena o caminho de classe completo de cada ativo. Ao ser clicado, o boto Adicionar da interface do usurio dispara o mtodo addAsset():
private { var var var ... } function addAsset():void className:String = assetNameCbo.selectedItem.data; AssetClass:Class = getDefinitionByName(className) as Class; mc:MovieClip = new AssetClass();

que obtm o caminho de classe do ativo atualmente selecionado no ComboBox (assetNameCbo.selectedItem.data) e usa a funo getDefinitionByName() (do pacote flash.utils) para obter uma referncia real para a classe do ativo a fim de criar uma nova ocorrncia desse ativo.

420

Captulo 19: Trabalho com interpolaes de movimento


Animao de objetos na pgina 311 descreve como implementar animaes com script no ActionScript. Neste captulo descreveremos uma tcnica diferente de criao de animaes: a interpolao de movimento. Essa tcnica permite a criao de movimento ao configurar o movimento interativamente em um arquivo FLA usando o Adobe Flash CS4 Professional. Voc poder usar o movimento recm-criado em sua animao dinmica com base em ActionScript no tempo de execuo. O Flash CS4 gera automaticamente o cdigo ActionScript que implementa a interpolao de movimento e a disponibiliza para cpia e reutilizao. Para criar interpolaes de movimento, preciso ter a licena do Adobe Flash CS4 Professional.

Noes bsicas de interpolaes de movimento


Introduo a interpolaes de movimento no ActionScript
As interpolaes de movimento facilitam a criao de animaes. Uma interpolao de movimento modifica as propriedades do objeto de exibio, tais como posio ou rotao, eu uma base quadro a quadro. Uma interpolao de movimento tambm pode mudar a aparncia de um objeto de exibio durante a movimentao, ao aplicar vrios filtros e outras propriedades. A interpolao de movimento pode ser criada interativamente com o Flash, que gera o seu respectivo cdigo ActionScript. No Flash, use Copiar movimento como o comando do ActionScript 3.0 para copiar o cdigo que gerou a interpolao de movimento. Em seguida, ser possvel reutilizar o cdigo ActionScript para gerar movimento em sua prpria animao dinmica no tempo de execuo. Consulte a seo Interpolaes de movimento em Uso do Flash CS4 Professional para obter informaes sobre a criao de interpolaes de movimento.

Tarefas comuns de interpolao de movimento


O cdigo ActionScript gerado automaticamente que implementa a interpolao de movimento executa as seguintes operaes:

Cria uma ocorrncia de objeto de movimento para a interpolao de movimento Define a durao da interpolao de movimento Adiciona as propriedades da interpolao de movimento Adiciona filtros interpolao de movimento Associa a interpolao de movimento com seu objeto de exibio ou objetos comuns

PROGRAMAO DO ACTIONSCRIPT 3.0 421


Trabalho com interpolaes de movimento

Termos e conceitos importantes


O termo a seguir importante e usado neste captulo:

Interpolao de movimento: uma construo que gera quadros intermedirios de um objeto de exibio em
diferentes estados e momentos, criando o efeito de que o primeiro estado evolui para o segundo estado suavemente. Ela usada para movimentar um objeto de exibio no palco, alm de faz-lo aumentar, diminuir, rotacionar, atenuar ou mudar de cor no decorrer do tempo.

Cpia de scripts de interpolaes de movimento


Uma interpolao gera quadros intermedirios que mostram um objeto de exibio em diferentes estados em dois quadros diferentes de uma linha do tempo. Ela cria o efeito de que a imagem do primeiro quadro evolui suavemente at se tornar a imagem do segundo. Em uma interpolao de movimento, a mudana de aspecto geralmente envolve a mudana de posio do objeto de exibio, criando assim o movimento. Alm do reposicionamento do objeto de exibio, uma interpolao de movimento tambm pode faz-lo girar, inclinar, redimensionar ou ainda aplicar filtros a ele. Crie uma interpolao de movimento no Flash, movendo um objeto de exibio entre os quadros-chave da linha do tempo. O Flash gera automaticamente o cdigo ActionScript que descreve a interpolao, que pode ser copiado e salvo em um arquivo. Consulte a seo Interpolaes de movimento em Uso do Flash CS4 Professional para obter informaes sobre a criao de interpolaes de movimento. Voc pode acessar Copiar movimento como um comando do ActionScript 3.0 no Flash de duas maneiras. A primeira a partir de um menu de contexto de interpolao no palco:
1 Selecione a interpolao de movimento no palco. 2 Clique sobre ela com o boto direito (Windows) ou mantenha a tecla Ctrl pressionada (Macintosh). 3 Selecione Copiar movimento como o comando do ActionScript 3.0. . .

A segunda maneira selecionar o comando diretamente no menu Editar do Flash:


1 Selecione a interpolao de movimento no palco.

PROGRAMAO DO ACTIONSCRIPT 3.0 422


Trabalho com interpolaes de movimento

2 Selecione Editar > Linha do tempo > Copiar movimento como ActionScript 3.0.

Aps copiar o script, cole-o em um arquivo e salve-o. Aps criar uma interpolao de movimento e copiar e salvar o script, voc pode reutiliz-lo ou modific-lo na animao dinmica com base em ActionScript que criou.

Incorporao de scripts de interpolaes de movimento


O cabealho do cdigo ActionScript copiado do Flash lista todos os mdulos necessrios ao suporte da interpolao de movimento.

Classes de interpolao de movimento


As classes essenciais so: AnimatorFactory, MotionBase e as classes Motion contidas no pacote fl.motion. Talvez voc precise de classes adicionais, dependendo das propriedades manipuladas pela interpolao de movimento. Por exemplo, se a interpolao de movimento transforma ou rotaciona o objeto de exibio, importe as classes flash.geom adequadas. Se ela aplicar filtros, importe as classes flash.filter. No ActionScript, uma interpolao de movimento uma ocorrncia da classe Motion. A classe Motion armazena uma seqncia de animao de quadroschave que pode ser aplicada a um objeto visual. Os dados da animao abrangem posio, escala, rotao, inclinao, cor, filtros e atenuao. O cdigo ActionScript a seguir foi copiado de uma interpolao de movimento criada para animar um objeto de exibio cujo nome de ocorrncia Symbol1_2. Ele declara uma varivel para um objeto MotionBase chamado __motion_Symbol1_2. A classe MotionBase pai da classe Motion.
var __motion_Symbol1_2:MotionBase;

Em seguida, o script cria o objeto Motion:


__motion_Symbol1_2 = new Motion();

nomes de objetos Motion


No caso anterior, o Flash gerou automaticamente o nome __motion_Symbol1_2 para o objeto Motion. O prefixo
__motion_ adicionado ao nome do objeto de exibio. Desse modo, o nome gerado automaticamente baseado no

nome de ocorrncia do objeto de destino da interpolao de movimento na ferramenta de autoria do Flash. A propriedade duration do objeto Motion indica o nmero total de quadros na interpolao de movimento:

PROGRAMAO DO ACTIONSCRIPT 3.0 423


Trabalho com interpolaes de movimento

__motion_Symbol1_2.duration = 200;

Quando voc reutiliza esse cdigo ActionScript na animao que criou, possvel manter o nome que o Flash gera automaticamente para a interpolao ou substituir por um outro de sua preferncia. Por padro, o Flash nomeia automaticamente a ocorrncia do objeto de exibio cuja interpolao de movimento est sendo copiada, caso ainda no tenha um nome de ocorrncia. Se o nome da interpolao for alterado, certifique-se de alter-lo em todo o script. Opcionalmente, possvel atribuir um nome de sua preferncia ao objeto de destino da interpolao de movimento no Flash. Em seguida, crie a interpolao de movimento e copie o script. Independentemente do nome que utilizar, certifique-se de que cada objeto Motion de seu cdigo ActionScript tenha um nome exclusivo.

Descrio da animao
O mtodo addPropertyArray() da classe MotionBase adiciona uma matriz de valores para descrever cada propriedade interpolada. Potencialmente, a matriz contm um item para cada quadro-chave na interpolao de movimento. Em geral, algumas dessas matrizes contm uma quantidade de itens menor do que o nmero total de quadros-chave na interpolao de movimento. Essa situao ocorre quando o ltimo valor da matriz no alterado nos quadros restantes. Se o comprimento do argumento da matriz for maior do que a propriedade duration do objeto Motion,
addPropertyArray() far o ajuste do valor da propriedade duration de modo adequado. Ela no adiciona quadros-

chave s propriedades que foram adicionadas anteriormente. Os quadros-chave recm-adicionados permanecem nos quadros extras da animao. As propriedades x e y do objeto Motion descrevem a mudana de posio do objeto interpolado no decorrer da execuo da animao. Essas coordenadas so os valores que apresentam maior possibilidade de mudana em cada quadro-chave, se a posio do objeto de exibio for alterada. Voc pode adicionar propriedades de movimento adicionais com o mtodo addPropertyArray(). Por exemplo, adicione os valores scaleX e scaleY se o objeto interpolado estiver redimensionado. Adicione os valores cewX e skewY se ele estiver inclinado. Adicione a propriedade rotationConcat se ele estiver em rotao. Use o mtodo addPropertyArray() para definir as seguintes propriedades de interpolao:
x y z scaleX scaleY skewX skewY rotationX rotationY rotationConcat

Posio horizontal do ponto de transformao do objeto no espao coordenado de seu objeto pai. Posio vertical do ponto de transformao do objeto no espao coordenado de seu objeto pai. Posio de profundidade (eixo z) do ponto de transformao do objeto no espao coordenado de seu objeto pai. Escala horizontal como uma porcentagem do objeto, como aplicada a partir do ponto de transformao. Escala vertical como porcentagem do objeto, como aplicada a partir do ponto de transformao. ngulo de inclinao horizontal do objeto em graus, como aplicado a partir do ponto de transformao. ngulo de inclinao vertical do objeto em graus, como aplicado a partir do ponto de transformao. Rotao do objeto ao redor do eixo x, a partir de sua orientao original. Rotao do objeto ao redor do eixo y, a partir de sua orientao original. Valores de rotao (eixo z) do objeto no movimento relacionado orientao anterior, como aplicados a partir do ponto de transformao.

useRotationConcat Se definido, faz com que o objeto de destino gire quando addPropertyArray() fornecer dados de movimento.

PROGRAMAO DO ACTIONSCRIPT 3.0 424


Trabalho com interpolaes de movimento

blendMode matrix3D

Valor da classe BlendMode especificando a mistura de cores de um objeto com grficos abaixo. Propriedade matrix3D, caso haja alguma no quadro-chave (usada em interpolaes em 3D). Se usada, todas as propriedades de transformao anteriores sero ignoradas. Rotao do eixo z do objeto, em graus, a partir da sua orientao original referente ao continer 3D pai. Usado em interpolaes em 3D no lugar de rotationConcat.

rotationZ

As propriedades adicionadas ao script gerado automaticamente dependem das propriedades que foram atribudas interpolao de movimento no Flash. Voc pode adicionar, remover ou modificar algumas dessas propriedades ao personalizar a sua verso do script. O cdigo a seguir atribui valores s propriedades de uma interpolao de movimento chamada __motion_Wheel. Nesse caso, o objeto de exibio interpolado no muda de lugar, mas gira na mesma posio nos 29 quadros da interpolao de movimento. Os valores mltiplos atribudos matriz rotationConcat definem a rotao. Os outros valores de propriedades dessa interpolao de movimento no so alterados.
__motion_Wheel = new Motion(); __motion_Wheel.duration = 29; __motion_Wheel.addPropertyArray("x", [0]); __motion_Wheel.addPropertyArray("y", [0]); __motion_Wheel.addPropertyArray("scaleX", [1.00]); __motion_Wheel.addPropertyArray("scaleY", [1.00]); __motion_Wheel.addPropertyArray("skewX", [0]); __motion_Wheel.addPropertyArray("skewY", [0]); __motion_Wheel.addPropertyArray("rotationConcat", [ 0,-13.2143,-26.4285,-39.6428,-52.8571,-66.0714,-79.2857,-92.4999,-105.714, -118.929,-132.143,-145.357,-158.571,-171.786,-185,-198.214,-211.429,-224.643, -237.857,-251.071,-264.286,-277.5,-290.714,-303.929,-317.143,-330.357, -343.571,-356.786,-370 ] ); __motion_Wheel.addPropertyArray("blendMode", ["normal"]);

No exemplo a seguir, o objeto de exibio chamado Leaf_1 se move no palco. Suas matrizes de propriedade x e y contm valores diferentes para cada um dos 100 quadros da animao. Alm disso, o objeto gira em torno de seu eixo z ao mesmo tempo em que se move pelo palco. Os itens mltiplos da matriz de propriedade rotationZ determinam a rotao.

PROGRAMAO DO ACTIONSCRIPT 3.0 425


Trabalho com interpolaes de movimento

__motion_Leaf_1 = new MotionBase(); __motion_Leaf_1.duration = 100; __motion_Symbol1_4.addPropertyArray("y", [ 0,5.91999,11.84,17.76,23.68,29.6,35.52,41.44,47.36,53.28,59.2,65.12,71.04, 76.96,82.88,88.8,94.72,100.64,106.56,112.48,118.4,124.32,130.24,136.16,142.08, 148,150.455,152.909,155.364,157.818,160.273,162.727,165.182,167.636,170.091, 172.545,175,177.455,179.909,182.364,184.818,187.273,189.727,192.182,194.636, 197.091,199.545,202,207.433,212.865,218.298,223.73,229.163,234.596,240.028, 245.461,250.893,256.326,261.759,267.191,272.624,278.057,283.489, 288.922,294.354,299.787,305.22,310.652,316.085,321.517,326.95,330.475,334, 337.525,341.05,344.575,348.1,351.625,355.15,358.675,362.2,365.725,369.25, 372.775,376.3,379.825,383.35,386.875,390.4,393.925,397.45,400.975,404.5, 407.5,410.5,413.5,416.5,419.5,422.5,425.5 ] ); __motion_Symbol1_4.addPropertyArray("scaleX", [1.00]); __motion_Symbol1_4.addPropertyArray("scaleY", [1.00]); __motion_Symbol1_4.addPropertyArray("skewX", [0]); __motion_Symbol1_4.addPropertyArray("skewY", [0]); __motion_Symbol1_4.addPropertyArray("z", [ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ] ); __motion_Symbol1_4.addPropertyArray("rotationX", [64.0361]); __motion_Symbol1_4.addPropertyArray("rotationY", [41.9578]); __motion_Symbol1_4.addPropertyArray("rotationZ", [ -18.0336,-17.5536,-17.0736,-16.5936,-16.1136,-15.6336,-15.1536,-14.6736, -14.1936,-13.7136,-13.2336,-12.7536,-12.2736,-11.7936,-11.3136,-10.8336, -10.3536,-9.8736,-9.3936,-8.9136,-8.4336,-7.9536,-7.4736,-6.9936,-6.5136, -6.0336,-7.21542,-8.39723,-9.57905,-10.7609,-11.9427,-13.1245,-14.3063, -15.4881,-16.67,-17.8518,-19.0336,-20.2154,-21.3972,-22.5791,-23.7609, -24.9427,-26.1245,-27.3063,-28.4881,-29.67,-30.8518,-32.0336,-31.0771, -30.1206,-29.164,-28.2075,-27.251,-26.2945,-25.338,-24.3814,-23.4249, -22.4684,-21.5119,-20.5553,-19.5988,-18.6423,-17.6858,-16.7293,-15.7727 -14.8162,-13.8597,-12.9032,-11.9466,-10.9901,-10.0336,-10.9427,-11.8518, -12.7609,-13.67,-14.5791,-15.4881,-16.3972,-17.3063,-18.2154,-19.1245, -20.0336,-20.9427,-21.8518,-22.7609,-23.67,-24.5791,-25.4881,-26.3972, -27.3063,-28.2154,-29.1245,-30.0336,-28.3193,-26.605,-24.8907,-23.1765, -21.4622,-19.7479,-18.0336 ] ); __motion_Symbol1_4.addPropertyArray("blendMode", ["normal"]);

Adio de filtros
Se o objeto de destino de uma interpolao de movimento contiver filtros, esses filtros sero adicionados usando os mtodos initFilters() e addFilterPropertyArray() da classe Motion.

PROGRAMAO DO ACTIONSCRIPT 3.0 426


Trabalho com interpolaes de movimento

Inicializao da matriz de filtros


O mtodo initFilters() inicializa os filtros. O seu primeiro argumento uma matriz dos nomes de classe totalmente qualificados de todos os filtros aplicados ao objeto de exibio. Essa matriz de nomes de filtros gerada a partir da lista de filtros da interpolao de movimento no Flash. Em sua cpia do script, possvel remover ou adicionar quaisquer filtros no pacote flash.filters dessa ou a essa matriz. A chamada a seguir inicializa a lista de filtros para o objeto de exibio de destino. Ela aplica os filtros DropShadowFilter, GlowFilter e BevelFilter e copia a lista para cada quadro-chave no objeto Motion.
__motion_Box.initFilters(["flash.filters.DropShadowFilter", "flash.filters.GlowFilter", "flash.filters.BevelFilter"], [0, 0, 0]);

Adio de filtros
O mtodo addFilterPropertyArray() descreve as propriedades de um filtro inicializado com os seguintes argumentos:
1 O primeiro argumento identifica um filtro por ndice. O ndice refere-se posio do nome do filtro na matriz de

nomes de classes de filtro transferidas em uma chamada anterior de initFilters().


2 O segundo argumento a propriedade de filtro para armazenamento desse filtro em cada quadro-chave. 3 O terceiro argumento o valor da propriedade de filtro especificada.

Dada a chamada anterior de initFilters(), as chamadas seguintes de addFilterPropertyArray() atribuem um valor 5 s propriedades blurX e blurY de DropShadowFilter. DropShadowFilter o primeiro (ndice 0) item da matriz dos filtros inicializados:
__motion_Box.addFilterPropertyArray(0, "blurX", [5]); __motion_Box.addFilterPropertyArray(0, "blurY", [5]);

As trs chamadas a seguir atribuem valores s propriedades quality, alpha e color de GlowFilter, o segundo item (ndice 1) da matriz do filtro inicializado:
__motion_Box.addFilterPropertyArray(1, "quality", [BitmapFilterQuality.LOW]); __motion_Box.addFilterPropertyArray(1, "alpha", [1.00]); __motion_Box.addFilterPropertyArray(1, "color", [0xff0000]);

As quatro chamadas a seguir atribuem valores a shadowAlpha, shadowColor, highlightAlpha e highlightColor de BevelFilter, o terceiro (ndice 2) item da matriz de filtros inicializados:
__motion_Box.addFilterPropertyArray(2, __motion_Box.addFilterPropertyArray(2, __motion_Box.addFilterPropertyArray(2, __motion_Box.addFilterPropertyArray(2, "shadowAlpha", [1.00]); "shadowColor", [0x000000]); "highlightAlpha", [1.00]); "highlightColor", [0xffffff]);

Ajuste da cor com ColorMatrixFilter


Aps a inicializao de ColorMatrixFilter, voc poder atribuir as propriedades AdjustColor adequadas para ajustar o brilho, o contraste, a saturao e a matiz do objeto de exibio interpolado. Geralmente aplica-se o filtro AdjustColor no Flash para possibilitar o ajuste de sua cpia do ActionScript. O exemplo a seguir transforma a matiz e a saturao do objeto de exibio medida que ele se movimenta.

PROGRAMAO DO ACTIONSCRIPT 3.0 427


Trabalho com interpolaes de movimento

__motion_Leaf_1.initFilters(["flash.filters.ColorMatrix"], [0], -1, -1); __motion_Leaf_1.addFilterPropertyArray(0, "adjustColorBrightness", [0], -1, -1); __motion_Leaf_1.addFilterPropertyArray(0, "adjustColorContrast", [0], -1, -1); __motion_Leaf_1.addFilterPropertyArray(0, "adjustColorSaturation", [ 0,-0.589039,1.17808,-1.76712,-2.35616,-2.9452,-3.53424,-4.12328, -4.71232,-5.30136,-5.89041, 6.47945,-7.06849,-7.65753,-8.24657, -8.83561,-9.42465,-10.0137,-10.6027,-11.1918,11.7808,-12.3699, -12.9589,-13.5479,-14.137,-14.726,-15.3151,-15.9041,-16.4931, 17.0822,-17.6712,-18.2603,-18.8493,-19.4383,-20.0274,-20.6164, -21.2055,-21.7945,22.3836,-22.9726,-23.5616,-24.1507,-24.7397, -25.3288,-25.9178,-26.5068,-27.0959,27.6849,-28.274,-28.863,-29.452, -30.0411,-30.6301,-31.2192,-31.8082,-32.3973,32.9863,-33.5753, -34.1644,-34.7534,-35.3425,-35.9315,-36.5205,-37.1096,-37.6986, 38.2877,-38.8767,-39.4657,-40.0548,-40.6438,-41.2329,-41.8219, -42.411,-43 ], -1, -1); __motion_Leaf_1.addFilterPropertyArray(0, "adjustColorHue", [ 0,0.677418,1.35484,2.03226,2.70967,3.38709,4.06451,4.74193,5.41935, 6.09677,6.77419,7.45161,8.12903,8.80645,9.48387,10.1613,10.8387,11.5161, 12.1935,12.871,13.5484,14.2258,14.9032,15.5806,16.2581,16.9355,17.6129, 18.2903,18.9677,19.6452,20.3226,21,22.4286,23.8571,25.2857,26.7143,28.1429, 29.5714,31,32.4286,33.8571,35.2857,36.7143,38.1429,39.5714,41,42.4286,43.8571, 45.2857,46.7143,48.1429,49.5714,51,54,57,60,63,66,69,72,75,78,81,84,87, 90,93,96,99,102,105,108,111,114 ], -1, -1);

Associao de uma interpolao de movimento com seus objetos de exibio


A ltima tarefa associar a interpolao de movimento ao objeto de exibio ou aos objetos que ele manipula. A classe AnimatorFactory gerencia a associao entre uma interpolao de movimento e seus objetos de exibio de destino. O argumento para o construtor AnimatorFactory o objeto Motion:
var __animFactory_Wheel:AnimatorFactory = new AnimatorFactory(__motion_Wheel);

Use o mtodo addTarget() da classe AnimatorFactory para associar o objeto de exibio de destino sua interpolao de movimento. O ActionScript copiado do Flash gera um comentrio para a linha addTarget() e no especifica um nome de ocorrncia:
// __animFactory_Wheel.addTarget(<instance name goes here>, 0);

Em sua cpia, especifique o objeto de exibio para associ-lo interpolao de movimento. No exemplo a seguir, os destinos so especificados como greenWheel e redWheel:
__animFactory_Wheel.AnimatorFactory.addTarget(greenWheel, 0); __animFactory_Wheel.AnimationFactory.addTarget(redWheel, 0);

Voc pode associar vrios objetos de exibio com a mesma interpolao de movimento usando vrias chamadas de
addTarget().

428

Captulo 20: Trabalho com cinemtica inversa


A IK (Cinemtica inversa) uma tima tcnica de criao de movimentos realistas. A IK permite a criao de movimentos coordenados dentro de uma cadeia de trechos conectados conhecida como armadura IK, para que as partes apresentem movimentos sincronizados realistas. As partes da armadura so os bones e as junes. Dado o ponto final da armadura, a IK calcula os ngulos das junes que devem alcanar esse ponto. Fazer os clculos de tais ngulos manualmente seria desafiador. O mrito desse recurso que voc pode criar armaduras interativamente usando o Adobe Flash CS4 Professional. Em seguida, s anim-las usando o ActionScript. O mecanismo IK, includo na ferramenta de autoria do Flash, realiza os clculos que descrevem o movimento da armadura. possvel limitar o movimento a determinados parmetros contidos em seu cdigo ActionScript. Para criar armaduras de cinemtica inversa, preciso ter a licena do Adobe Flash CS4 Professional.

Noes bsicas de cinemtica inversa


Introduo IK
A IK permite a criao de animaes realistas por meio da juno de partes que se movimentam entre si. Por exemplo, com o uso da IK voc pode mover uma perna para uma determinada posio ao articular o movimento de suas respectivas junes para alcanar a posio desejada. A IK usa uma estrutura de bones encadeados em uma estrutura chamada armadura IK. O pacote fl.ik ajuda a criar animaes que remetem a movimentos naturais. Ele permite que voc anime vrias armaduras IK diretamente sem precisar saber muito sobre o funcionamento dos algoritmos IK. Crie a armadura IK com seus respectivos bones e junes auxiliares no Flash. Em seguida, acesse as classes IK para anim-las no tempo de execuo. Consulte a seo Uso de cinemtica inversa em Uso do Flash CS4 Professional para obter instrues detalhadas sobre como criar uma armadura IK.

Tarefas comuns de IK
Geralmente, o cdigo ActionScript realiza as operaes a seguir para iniciar e controlar o movimento de uma armadura IK no tempo de execuo:

Declara variveis para as armaduras, bones e junes envolvidas no movimento Recupera as ocorrncias de armaduras, bones e junes Cria ocorrncia do objeto IKMover Define limites para o movimento Move a armadura para um ponto de destino

PROGRAMAO DO ACTIONSCRIPT 3.0 429


Trabalho com cinemtica inversa

Termos e conceitos importantes


A lista de referncia a seguir contm termos importantes usados neste captulo:

Armadura: uma cadeia cinemtica, formada por bones e junes, utilizada em animaes computadorizadas para
simular movimentos reais

Bone: um segmento rgido de uma armadura, que corresponde a um dos ossos de um esqueleto IK (Cinemtica inversa): um processo de determinao dos parmetros de um objeto com junes flexveis, que
pode ser uma cadeia cinemtica ou uma armadura

Juno: o local em que ocorre a unio de dois bones, construda para permitir o movimento dos bones, que
corresponde a uma articulao de um ser vivo

Viso geral da animao de armaduras IK


Aps criar uma armadura IK, use as classes fl.ik para restringir seus movimentos, rastrear seus eventos e anim-la no tempo de execuo. A figura a seguir apresenta um clipe de filme chamado Roda. O eixo uma ocorrncia de uma IKArmature chamada Eixo. A classe IKMover move a armadura de modo sincronizado com a rotao da roda. O IKBone, ikBone2, da armadura anexado roda, como juno de sua parte inferior.
A

A. Roda B. Eixo C. ikBone2

PROGRAMAO DO ACTIONSCRIPT 3.0 430


Trabalho com cinemtica inversa

No tempo de execuo, a roda gira em associao com a interpolao de movimento __motion_Wheel descrita em Descrio da animao na pgina 423, no captulo Trabalho com interpolaes de movimento. Um objeto IKMover inicia e controla o movimento do eixo. A figura a seguir exibe dois instantneos da armadura do eixo fixos roda em diferentes quadros durante o movimento de rotao.

No tempo de execuo, o ActionScript a seguir:

Obtm informaes sobre a armadura e seus componentes Cria ocorrncia de um objeto IKMover Move o eixo de acordo com a rotao da roda
import fl.ik.* var var var var tree:IKArmature = IKManager.getArmatureByName("Axle"); bone:IKBone = tree.getBoneByName("ikBone2"); endEffector:IKJoint = bone.tailJoint; pos:Point = endEffector.position;

var ik:IKMover = new IKMover(endEffector, pos); ik.limitByDistance = true; ik.distanceLimit = 0.1; ik.limitByIteration = true; ik.iterationLimit = 10; Wheel.addEventListener(Event.ENTER_FRAME, frameFunc); function frameFunc(event:Event) { if (Wheel != null) { var mat:Matrix = Wheel.transform.matrix; var pt = new Point(90, 0); pt = mat.transformPoint(pt); ik.moveTo(pt); } }

PROGRAMAO DO ACTIONSCRIPT 3.0 431


Trabalho com cinemtica inversa

As classes IK usadas para mover o eixo so:

IKArmature: descreve a armadura, uma estrutura em rvore formada por bones e junes, que deve ser criada no Flash IKManager: classe de continer para todas as armaduras IK do documento, que deve ser criada no Flash IKBone: um segmento de uma armadura IK IKJoint: uma conexo entre dois bones IK IKMover: inicia e controla o movimento IK das armaduras
Para obter descries completas e detalhadas dessas classes, consulte o pacote IK.

Obteno de informaes sobre uma armadura IK


Primeiro, declare variveis para a armadura, para o bone e para a juno que une as partes que deseja movimentar. O cdigo a seguir usa o mtodo getArmatureByName() da classe IKManager para atribuir o valor da armadura Eixo varivel tree da IKArmature. A armadura Eixo foi criada anteriormente no Flash.
var tree:IKArmature = IKManager.getArmatureByName("Axle");

De modo semelhante, o cdigo a seguir usa o mtodo getBoneByName() da classe IKArmature para atribuir a varivel IKBone ao valor do bone ikBone2.
var bone:IKBone = tree.getBoneByName("ikBone2");

A juno da parte inferior do bone ikBone2 a parte da armadura que a conecta roda. A linha a seguir declara a varivel endEffector e atribui a ela a propriedade tailjoint do bone ikBone2:
var endEffector:IKJoint = home.tailjoint;

A varivel pos um ponto que armazena a posio correta da juno endEffector.


var pos:Point = endEffector.position;

Nesse exemplo, pos a posio da juno na extremidade do eixo conectada roda. O valor original dessa varivel obtida a partir da propriedade position do IKJoint.

Ocorrncia de IKMover e limitao de seu movimento


Uma ocorrncia da classe IKMover movimenta o eixo. A linha a seguir cria ocorrncia do objeto ik do IKMover, transmitindo ao seu construtor o elemento a ser movimentado e o ponto de incio do movimento:
var ik:IKMover = new IKMover(endEffector, pos);

As propriedades da classe IKMover permitem a limitao do movimento de uma armadura. possvel limitar o movimento, tendo como base a distncia, as iteraes e o tempo de durao do movimento. Os pares de propriedades a seguir reforam esses limites. Os pares consistem em um Boolean que indica se o movimento limitado, alm dos nmeros que especificam o limite:

PROGRAMAO DO ACTIONSCRIPT 3.0 432


Trabalho com cinemtica inversa

limitByDistance:Boolean

distanceLimit:int

Define a distncia mxima em pixels que o mecanismo IK se desloca para cada iterao. Define o nmero mximo de iteraes que o mecanismo IK executa para cada movimento. Define o tempo mximo em milissegundos designado para que o mecanismo IK execute o movimento.

limitByIteration:Boolean

iterationLimit:int

limitByTime:Boolean

timeLimit:int

Define a propriedade Boolean apropriada como true para aplicar o limite. Por padro, todas as propriedades Booleans so definidas como false, para que o movimento no seja limitado, a menos que voc as tenha definido de modo explcito. Se voc definir o limite para um valor sem configurar seu Boolean correspondente, o limite ser ignorado. Nesse caso, o mecanismo IK continua a movimentao do objeto at outro limite ou at que a posio de destino do IKMover seja alcanada. No exemplo a seguir, a distncia mxima do movimento da armadura est definido como 0,1 pixels por iterao. O nmero mximo de iteraes para cada movimento est definido como 10.
ik.limitByDistance = true; ik.distanceLimit = 0.1; ik.limitByIteration = true; ik.iterationLimit = 10;

Movimentao de uma armadura IK


O IKMover movimenta o eixo interno do ouvinte de eventos para a roda. Em cada evento enterFrame da roda, uma nova posio de destino para a armadura calculada. Usando seu mtodo moveTo() , o IKMover movimenta a juno da parte inferior para sua respectiva posio de destino ou o mais prximo possvel, dentro dos limites definidos pelas suas propriedades limitByDistance, limitByIteration e limitByTime.
Wheel.addEventListener(Event.ENTER_FRAME, frameFunc); function frameFunc(event:Event) { if (Wheel != null) { var mat:Matrix = Wheel.transform.matrix; var pt = new Point(90,0); pt = mat.transformPoint(pt); ik.moveTo(pt); } }

Uso de eventos IK
A classe IKEvent permite a criao de um objeto de evento que contm informaes sobre eventos IK. As informaes IKEvent descrevem o movimento que foi interrompido porque o tempo especificado, a distncia ou o limite de iterao foi excedido.

PROGRAMAO DO ACTIONSCRIPT 3.0 433


Trabalho com cinemtica inversa

O cdigo a seguir mostra um ouvinte de eventos e um manipulador para rastreamento de eventos de limite de tempo. Esse manipulador de eventos indica o tempo, a distncia, a contagem de iteraes e as propriedades de junes de um evento que dispara quando o limite de tempo do IKMover excedido.
var ikmover:IKMover = new IKMover(endjoint, pos); ikMover.limitByTime = true; ikMover.timeLimit = 1000; ikmover.addEventListener(IKEvent.TIME_LIMIT, timeLimitFunction); function timeLimitFunction(evt:IKEvent):void { trace("timeLimit hit"); trace("time is " + evt.time); trace("distance is " + evt.distance); trace("iterationCount is " + evt.iterationCount); trace("IKJoint is " + evt.joint.name); }

434

Captulo 21: Trabalho com texto


Para exibir texto na tela no Adobe Flash Player ou Adobe AIR, use uma ocorrncia da classe TextField ou use as classes do Mecanismo de texto do Flash. Essas classes permitem criar, exibir e formatar texto. possvel estabelecer contedo especfico para campos de texto ou designar a origem do texto e, em seguida, definir a aparncia desse texto. Tambm possvel responder a eventos do usurio conforme o usurio insere texto ou clica em um link de hipertexto.

Noes bsicas do trabalho com texto


Introduo ao trabalho com texto
Tanto a classe TextField quanto as classes do Mecanismo de texto do Flash permitem exibir e gerenciar texto no Flash Player e no AIR. Voc pode usar a classe TextField para criar objetos de texto para fins de exibio e entrada. A classe TextField funciona como a base para outros componentes baseados em texto, como TextArea e TextInput, disponveis no Flash e no Adobe Flex. Voc pode usar a classe TextFormat para definir a formatao de caracteres e pargrafos para objetos TextField e pode aplicar CSS (Folhas de estilo em cascata) usando a propriedade Textfield.styleSheet e a classe StyleSheet. possvel atribuir texto com formatao HTML, que pode conter mdia incorporada (clipes de filme e arquivos SWF, GIF, PNG e JPEG), diretamente a um campo de texto. O Mecanismo de texto do Flash, disponvel no Flash Player 10, oferece suporte de baixo nvel para controle sofisticado de mtricas de texto, formatao e texto bidirecional. Ele tambm oferece fluxo de texto aprimorado e suporte a idioma avanado. Embora voc possa usar o Mecanismo de texto do Flash para criar e gerenciar elementos de texto, a finalidade principal dele servir de base para a criao de componentes de manipulao de texto e requer maior conhecimento em programao.

Tarefas comuns do trabalho com texto


So abordadas as seguintes tarefas comuns relacionadas classe TextField:

Modificao de contedo de campo de texto Uso de HTML em campos de texto Uso de imagens em campos de texto Seleo de texto e trabalho com texto selecionado pelo usurio Captura da entrada de texto Restrio de entrada de texto Aplicao de formatao e de estilos CSS ao texto Ajuste fino da exibio do texto com nitidez, espessura e suavizao de borda Acesso e trabalho com campos de texto estticos no ActionScript
So abordadas as seguintes tarefas comuns relacionadas s classes do Mecanismo de texto do Flash:

Criao e exibio de texto

PROGRAMAO DO ACTIONSCRIPT 3.0 435


Trabalho com texto

Manipulao de eventos Formatao de texto Trabalho com fontes Controle de texto

Conceitos e termos importantes


A lista de referncias a seguir contm termos importantes usados neste captulo:

Folhas de estilo em cascata: Uma sintaxe padro para especificar estilos e formatao para contedo estruturado
em formato XML (ou HTML).

Fonte do dispositivo: Uma fonte instalada na mquina do usurio. Campo de texto dinmico: Um campo de texto cujo contedo pode ser alterado pelo ActionScript, mas no por
entrada do usurio.

Fonte incorporada: Uma fonte que tem seus dados de contorno de caractere armazenados no arquivo SWF do
aplicativo.

Texto HTML: Contedo de texto inserido em um campo de texto usando o ActionScript, que inclui tags de
formatao HTML juntamente com contedo de texto real.

Campo de texto de entrada: Um campo de texto cujo contedo pode ser alterado pela entrada do usurio ou pelo
ActionScript.

Kerning: um ajuste do espaamento entre pares de caracteres para tornar o espaamento das palavras mais
proporcional e facilitar a leitura do texto.

Campo de texto esttico: um campo de texto criado na Ferramenta de autoria cujo contedo no pode ser alterado
quando o arquivo SWF est em execuo.

Mtricas de linha de texto: Medidas do tamanho de vrias partes do contedo de texto em um campo de texto, como
a linha de base do texto, a altura da parte superior dos caracteres, o tamanho dos descendentes (a parte de algumas letras minsculas que se estende abaixo da linha de base) e assim por diante.

Rastreamento: um ajuste do espaamento entre grupos de letras ou blocos de texto para aumentar ou diminuir a
densidade e tornar o texto mais legvel.

Teste dos exemplos do captulo


Ao trabalhar em um captulo, talvez voc queira testar algumas listagens de cdigo de exemplo sozinho. Basicamente todas as listagens de cdigo envolvem a manipulao de um objeto de texto, seja um objeto criado e colocado no Palco da Ferramenta auditoria do Flash ou um objeto que tenha sido criado no ActionScript. O teste de um exemplo envolve exibir o resultado no Flash Player ou no AIR para verificar os efeitos do cdigo no texto ou no objeto TextField. Os exemplos deste tpico podem ser divididos em dois grupos. Um tipo de exemplo manipula um objeto TextField sem a criao explcita do objeto. Para testar essas listagens de cdigo, siga estas etapas:
1 Crie um documento Flash vazio. 2 Selecione um quadro-chave na linha de tempo. 3 Abra o painel Aes e copie a listagem de cdigo no painel Script. 4 Usando a ferramenta Texto, crie um campo de texto dinmico no Palco.

PROGRAMAO DO ACTIONSCRIPT 3.0 436


Trabalho com texto

5 Com o campo de texto selecionado, no Inspetor de propriedades, d a ele um nome de ocorrncia. O nome deve

corresponder ao nome usado para o campo de texto na listagem de cdigo de exemplo. Por exemplo, se a listagem de cdigo manipular um campo de texto denominadomyTextField, voc dever nomear o campo de texto tambm como myTextField.
6 Execute o programa usando Controlar > Testar filme.

Na tela, voc v os resultados do cdigo manipulando o campo de texto conforme especificado na listagem de cdigo. O outro tipo de listagem de cdigo de exemplo consiste em uma definio de classe que deve ser usada como a classe do documento para o arquivo SWF. Nessas listagens, os objetos de texto so criados pelo cdigo de exemplo, portanto no necessrio cri-los separadamente. Para testar esse tipo de listagem de cdigo:
1 Crie um documento Flash vazio e salve-o no seu computador. 2 Crie e salve um novo arquivo do ActionScript no mesmo diretrio do documento Flash. O nome do arquivo deve

corresponder ao nome da classe na listagem de cdigo. Por exemplo, se a listagem de cdigo definir uma classe denominada TextFieldTest, use o nome TextFieldTest.as para salvar o arquivo ActionScript.
3 Copie a listagem de cdigo no arquivo do ActionScript e salve o arquivo. 4 No documento do Flash, selecione Janela -> Propriedades para ativar o Inspetor de propriedades do documento. 5 No Inspetor de propriedades, no campo Classe, digite o nome da classe ActionScript que voc copiou do texto. 6 Execute o programa usando Controlar > Testar filme.

Veja os resultados do exemplo exibidos na tela. Outras tcnicas para testar listagens de cdigo de exemplo so explicadas mais detalhadamente em Teste de listagens de cdigo de exemplo dos captulos na pgina 36.

Uso da classe TextField


A classe TextField a base de outros componentes baseados em texto, como os componentes TextArea ou TextInput, que so fornecidos na estrutura do Adobe Flex e no ambiente de autoria do Flash. Para obter mais informaes sobre como usar componentes de texto no ambiente de autoria do Flash, consulte Sobre controles de texto em Uso do Flash. O contedo do campo de texto pode ser pr-especificado no arquivo SWF, carregado de um arquivo de texto ou de um banco de dados ou inserido por um usurio em interao com o aplicativo. Dentro de um campo de texto, o texto pode aparecer como contedo HTML renderizado, com imagens incorporadas no HTML renderizado. Depois de criar uma ocorrncia de um campo de texto, possvel usar as classes flash.text, como TextFormat e StyleSheet, para controlar a aparncia do texto. O pacote flash.text contm praticamente todas as classes relacionadas criao, ao gerenciamento e formatao de texto no ActionScript. possvel formatar texto definindo a formatao com um objeto TextFormat e atribuindo esse objeto ao campo de texto. Se o campo de texto contiver texto HTML, possvel aplicar um objeto StyleSheet ao campo de texto para atribuir estilos a partes especficas do contedo do campo de texto. O objeto TextFormat ou StyleSheet contm propriedades que definem a aparncia do texto, como cor, tamanho e peso. O objeto TextFormat atribui as propriedades a todo o contedo dentro de um campo de texto ou a uma faixa de texto. Por exemplo, dentro do mesmo campo de texto, uma sentena pode estar em negrito vermelho e a prxima em itlico azul. Para obter mais informaes sobre formatos de texto, consulte Atribuio de formatos de texto na pgina 443.

PROGRAMAO DO ACTIONSCRIPT 3.0 437


Trabalho com texto

Para obter mais informaes sobre texto HTML em campos de texto, consulte Exibio de texto HTML na pgina 438. Para obter mais informaes sobre folhas de estilo, consulteAplicao de folhas de estilo em cascata na pgina 444. Alm das classes do pacote flash.text, possvel usar a classe flash.events.TextEvent para responder a aes do usurio relacionadas a texto.

Exibio de texto
Apesar das ferramentas de autoria, como o Adobe Flex Builder e a ferramenta de autoria do Flash, fornecerem vrias opes para exibio de texto, incluindo componentes relacionados a texto ou ferramentas de texto, a principal maneira de exibir texto programaticamente por meio de um campo de texto.

Tipos de texto
O tipo de texto dentro de um campo de texto caracterizado por sua origem:

Texto dinmico
O texto dinmico inclui contedo carregado de uma origem externa, como um arquivo de texto, um arquivo XML ou mesmo um servio remoto da Web.

Texto de entrada
Texto de entrada qualquer texto inserido por um usurio ou texto dinmico que pode ser editado pelo usurio. possvel configurar uma folha de estilos para formatar texto de entrada ou usar a classe flash.text.TextFormat para atribuir propriedades ao campo de texto para o contedo de entrada. Para obter mais informaes, consulte Captura da entrada de texto na pgina 441.

Texto esttico
O texto esttico criado somente atravs da Ferramenta de autoria. No possvel criar uma ocorrncia de texto esttico usando o ActionScript 3.0. No entanto, possvel usar as classes ActionScript, como StaticText e TextSnapshot, para manipular uma ocorrncia de texto esttico existente. Para obter mais informaes, consulte Trabalho com texto esttico na pgina 448.

Modificao de contedo de campo de texto


possvel definir texto dinmico atribuindo uma string propriedade flash.text.TextField.text. Voc atribui uma string diretamente propriedade, da seguinte maneira:
myTextField.text = "Hello World";

Tambm possvel atribuir propriedade text um valor de uma varivel definida no script, como no exemplo a seguir:

PROGRAMAO DO ACTIONSCRIPT 3.0 438


Trabalho com texto

package { import flash.display.Sprite; import flash.text.*; public class TextWithImage extends Sprite { private var myTextBox:TextField = new TextField(); private var myText:String = "Hello World"; public function TextWithImage() { addChild(myTextBox); myTextBox.text = myText; } } }

Como alternativa, possvel atribuir propriedade text um valor de uma varivel remota. Voc tem trs opes para carregar valores de texto de origens remotas:

As classes flash.net.URLLoader e flash.net.URLRequest carregam variveis para o texto de uma localizao local ou
remota.

O atributo FlashVars incorporado na pgina HTML que hospeda o arquivo SWF e pode conter valores para
variveis de texto.

A classe flash.net.SharedObject gerencia armazenamento persistente de valores. Para obter mais informaes,
consulteArmazenamento de dados locais na pgina 628.

Exibio de texto HTML


A classe flash.text.TextField tem uma propriedade htmlText que pode ser usada para identificar a string de texto como aquela que contm tags HTML para formatar o contedo. Como no exemplo a seguir, voc deve atribuir o valor da string propriedade htmlText (no propriedade text) para que o Flash Player ou o AIR renderizem o texto como HTML:
var myText:String = "<p>This is <b>some</b> content to <i>render</i> as <u>HTML</u> text.</p>"; myTextBox.htmlText = myText;

O Flash Player e o AIR oferecem suporte a um subconjunto de tags e entidades HTML para a propriedade htmlText. A descrio da propriedade flash.text.TextField.htmlText na Referncia dos componentes e da linguagem do ActionScript 3.0 fornece informaes detalhadas sobre as tags e entidades HTML suportadas. Depois de designar seu contedo usando a propriedade htmlText, possvel usar folhas de estilo ou a tag textformat para gerenciar a formatao do contedo. Para obter mais informaes, consulte Formatao de texto na pgina 443.

Uso de imagens em campos de texto


Outra vantagem da exibio do contedo como texto HTML que voc pode incluir imagens no campo de texto. possvel fazer referncia a uma imagem, local ou remota, usando a tagimg e fazer com que ela aparea dentro do campo de texto associado. O exemplo a seguir cria um campo de texto denominado myTextBox e inclui uma imagem JPG de um olho, armazenada no mesmo diretrio que o arquivo SWF, dentro do texto exibido:

PROGRAMAO DO ACTIONSCRIPT 3.0 439


Trabalho com texto

package { import flash.display.Sprite; import flash.text.*; public class TextWithImage extends Sprite { private var myTextBox:TextField; private var myText:String = "<p>This is <b>some</b> content to <i>test</i> and <i>see</i></p><p><img src='eye.jpg' width='20' height='20'></p><p>what can be rendered.</p><p>You should see an eye image and some <u>HTML</u> text.</p>"; public function TextWithImage() { myTextBox.width = 200; myTextBox.height = 200; myTextBox.multiline = true; myTextBox.wordWrap = true; myTextBox.border = true; addChild(myTextBox); myTextBox.htmlText = myText; } } }

A tag img oferece suporte aos arquivos JPEG, GIF, PNG e SWF.

Rolagem de texto em um campo de texto


Em muitos casos, o texto pode ser mais longo do que o campo de texto que o exibe. Ou voc pode ter um campo de texto que permite que um usurio insira mais texto do que o que pode ser exibido de uma vez. possvel usar as propriedades relacionadas rolagem da classe flash.text.TextField para gerenciar contedo longo, tanto na vertical quanto na horizontal. As propriedades relacionadas a rolagem incluem TextField.scrollV, TextField.scrollH, maxScrollV e maxScrollH. Use essas propriedades para responder a eventos, com um clique do mouse ou um pressionamento de tecla. O exemplo a seguir cria um campo de texto que de um tamanho definido e contm mais texto do que o campo pode exibir de uma vez. Conforme o usurio clica no campo de texto, o texto rola verticalmente.

PROGRAMAO DO ACTIONSCRIPT 3.0 440


Trabalho com texto

package { import flash.display.Sprite; import flash.text.*; import flash.events.MouseEvent; public class TextScrollExample extends Sprite { private var myTextBox:TextField = new TextField(); private var myText:String = "Hello world and welcome to the show. It's really nice to meet you. Take your coat off and stay a while. OK, show is over. Hope you had fun. You can go home now. Don't forget to tip your waiter. There are mints in the bowl by the door. Thank you. Please come again."; public function TextScrollExample() { myTextBox.text = myText; myTextBox.width = 200; myTextBox.height = 50; myTextBox.multiline = true; myTextBox.wordWrap = true; myTextBox.background = true; myTextBox.border = true; var format:TextFormat = new TextFormat(); format.font = "Verdana"; format.color = 0xFF0000; format.size = 10; myTextBox.defaultTextFormat = format; addChild(myTextBox); myTextBox.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownScroll); } public function mouseDownScroll(event:MouseEvent):void { myTextBox.scrollV++; } } }

Seleo e manipulao de texto


possvel selecionar texto dinmico ou de entrada. Como as propriedades e os mtodos de seleo de texto da classe TextField usam posies do ndice para definir a faixa de texto a ser manipulada, possvel selecionar programaticamente texto dinmico ou de entrada mesmo que voc no conhea o contedo. Nota: Na ferramenta de autoria do Flash, se voc escolher a opo selecionvel em um campo de texto esttico, o campo de texto que exportado e colocado na lista de exibio ser um campo de texto dinmico regular.

Seleo de texto
Por padro, a propriedade flash.text.TextField.selectable true, e possvel selecionar texto programaticamente usando o mtodo setSelection().

PROGRAMAO DO ACTIONSCRIPT 3.0 441


Trabalho com texto

Por exemplo, possvel definir texto especfico em um campo de texto a ser selecionado quando o usurio clica no campo de texto:
var myTextField:TextField = new TextField(); myTextField.text = "No matter where you click on this text field the TEXT IN ALL CAPS is selected."; myTextField.autoSize = TextFieldAutoSize.LEFT; addChild(myTextField); addEventListener(MouseEvent.CLICK, selectText); function selectText(event:MouseEvent):void { myTextField.setSelection(49, 65); }

De maneira semelhante, se voc desejar que o texto do campo de texto seja selecionado como o texto exibido inicialmente, crie uma funo de manipulador de eventos que chamada quando o campo de texto adicionado lista de exibio.

Captura de texto selecionado pelo usurio


As propriedades selectionBeginIndex e selectionEndIndex de TextField que so somente leitura e, portanto, no podem ser definidas como texto selecionado programaticamente, podem ser usadas para capturar qualquer coisa que o usurio tenha selecionado no momento. Alm disso, campos de texto de entrada podem usar a propriedade caretIndex. Por exemplo, o cdigo a seguir rastreia os valores do ndice do texto selecionado pelo usurio:
var myTextField:TextField = new TextField(); myTextField.text = "Please select the TEXT IN ALL CAPS to see the index values for the first and last letters."; myTextField.autoSize = TextFieldAutoSize.LEFT; addChild(myTextField); addEventListener(MouseEvent.MOUSE_UP, selectText); function selectText(event:MouseEvent):void { trace("First letter index position: " + myTextField.selectionBeginIndex); trace("Last letter index position: " + myTextField.selectionEndIndex); }

possvel aplicar uma coleo de propriedades do objeto TextFormat seleo para alterar a aparncia do texto. Para obter mais informaes sobre como aplicar uma coleo de propriedades de TextFormat ao texto selecionado, consulte Formatao de faixas de texto em um campo de texto na pgina 446.

Captura da entrada de texto


Por padro, a propriedade type de um campo de texto definida como dynamic. Se voc definir a propriedade type como input usando a classe TextFieldType, poder coletar a entrada do usurio e salvar o valor para uso em outras partes do aplicativo. Os campos de texto de entrada so teis para formulrios e para qualquer aplicativo que queira que o usurio defina um valor de texto para uso em outro lugar do programa. Por exemplo, o cdigo a seguir cria um campo de texto de entrada chamado myTextBox. Conforme o usurio insere texto no campo, o evento textInput acionado. Um manipulador de eventos chamado textInputCapture captura a string de texto inserida e atribui uma varivel a ela. O Flash Player ou o AIR exibe o novo texto em outro campo de texto chamado myOutputBox.

PROGRAMAO DO ACTIONSCRIPT 3.0 442


Trabalho com texto

package { import import import import

flash.display.Sprite; flash.display.Stage; flash.text.*; flash.events.*; Sprite new TextField(); = new TextField(); your text here.";

public class CaptureUserInput extends { private var myTextBox:TextField = private var myOutputBox:TextField private var myText:String = "Type public function CaptureUserInput() { captureText(); }

public function captureText():void { myTextBox.type = TextFieldType.INPUT; myTextBox.background = true; addChild(myTextBox); myTextBox.text = myText; myTextBox.addEventListener(TextEvent.TEXT_INPUT, textInputCapture); } public function textInputCapture(event:TextEvent):void { var str:String = myTextBox.text; createOutputBox(str); } public function createOutputBox(str:String):void { myOutputBox.background = true; myOutputBox.x = 200; addChild(myOutputBox); myOutputBox.text = str; } } }

Restrio de entrada de texto


Como os campos de texto de entrada normalmente so usados para formulrios ou caixas de dilogo, voc pode desejar limitar os tipos de caracteres que um usurio pode inserir em um campo de texto ou mesmo manter o texto oculto, por exemplo, no caso de uma senha. A classe flash.text.TextField tem uma propriedade displayAsPassword e uma propriedade restrict que podem ser definidas para controlar a entrada do usurio. A propriedade displayAsPassword simplesmente oculta o texto (exibindo-o como uma srie de asteriscos) conforme o usurio o digita. Quando displayAsPassword est definida como true, os comandos Recortar e Copiar e seus atalhos de teclado correspondentes no funcionam. Como mostra o exemplo a seguir, voc atribui a propriedade displayAsPassword exatamente como o faz com outras propriedades, como background e color:

PROGRAMAO DO ACTIONSCRIPT 3.0 443


Trabalho com texto

myTextBox.type = TextFieldType.INPUT; myTextBox.background = true; myTextBox.displayAsPassword = true; addChild(myTextBox);

A propriedade restrict um pouco mais complicada, pois voc precisa especificar quais caracteres o usurio pode digitar em um campo de texto de entrada. Voc pode especificar letras, nmeros especficos ou faixas de letras, nmeros e caracteres. O cdigo a seguir permite que o usurio insira apenas letras maisculas (e no nmeros ou caracteres especiais) no campo de texto:
myTextBox.restrict = "A-Z";

O ActionScript 3.0 usa hfens para definir faixas e circunflexos para definir caracteres excludos. Para obter mais informaes sobre como definir o que restringido em um campo de texto de entrada, consulte a entrada da propriedade flash.text.TextField.restrict na Referncia dos componentes e da linguagem do ActionScript 3.0.

Formatao de texto
H vrias opes para formatar a exibio de texto programaticamente. possvel definir propriedades diretamente na ocorrncia TextField, por exemplo, as propriedades TextFIeld.thickness, TextField.textColor e TextField.textHeight .Ou possvel designar o contedo do campo de texto usando a propriedade htmlText e usar tags HTML suportadas, como b, i e u. Mas tambm possvel aplicar objetos TextFormat a campos de texto que contm texto simples ou objetos StyleSheet a campos de texto que contm a propriedade htmlText. O uso dos objetos TextFormat e StyleSheet fornece o mximo em controle e consistncia sobre a aparncia do texto em todo o aplicativo. possvel definir um objeto TextFormat ou StyleSheet e aplic-lo a muitos ou a todos os campos de texto no aplicativo.

Atribuio de formatos de texto


possvel usar a classe TextFormat para definir um nmero de diferentes propriedades de exibio de texto e apliclas a todo o contedo de um objeto TextField ou a uma faixa de texto. O exemplo a seguir aplica um objeto TextFormat a um objeto TextField inteiro e aplica um segundo objeto TextFormat a uma faixa de texto naquele objeto TextField:
var tf:TextField = new TextField(); tf.text = "Hello Hello"; var format1:TextFormat = new TextFormat(); format1.color = 0xFF0000; var format2:TextFormat = new TextFormat(); format2.font = "Courier"; tf.setTextFormat(format1); var startRange:uint = 6; tf.setTextFormat(format2, startRange); addChild(tf);

O mtodo TextField.setTextFormat() afeta apenas texto que j est exibido no campo texto. Se o contedo do TextField for alterado, o aplicativo poder precisar chamar o mtodo TextField.setTextFormat() novamente para reaplicar a formatao. Voc tambm pode definir a propriedade defaultTextFormat de TextField para especificar o formato a ser usado para texto inserido pelo usurio.

PROGRAMAO DO ACTIONSCRIPT 3.0 444


Trabalho com texto

Aplicao de folhas de estilo em cascata


Campos de texto podem conter texto simples ou texto formatado por HTML. Texto simples armazenado na propriedade text da ocorrncia e texto HTML armazenado na propriedade htmlText. possvel usar declaraes de estilo CSS para definir estilos de texto que podem ser aplicados a muitos diferentes campos de texto. Declaraes de estilo CSS podem ser criadas no cdigo do aplicativo ou carregadas em tempo de execuo de um arquivo CSS externo. A classe flash.text.StyleSheet manipula estilos CSS. A classe StyleSheet reconhece um conjunto limitado de propriedades CSS. Para obter uma lista detalhada das propriedades de estilo suportadas pela classe StyleSheet, consulte a entrada flash.textStylesheet na Referncia dos componentes e da linguagem do ActionScript 3.0. Conforme mostrado no exemplo a seguir, possvel criar CSS no cdigo e aplicar esses estilos ao texto HTML usando um objeto StyleSheet:
var style:StyleSheet = new StyleSheet(); var styleObj:Object = new Object(); styleObj.fontSize = "bold"; styleObj.color = "#FF0000"; style.setStyle(".darkRed", styleObj); var tf:TextField = new TextField(); tf.styleSheet = style; tf.htmlText = "<span class = 'darkRed'>Red</span> apple"; addChild(tf);

Depois de criar um objeto StyleSheet, o cdigo de exemplo cria um objeto simples para manter um conjunto de propriedades de declarao de estilo. Em seguida, ele chama o mtodo StyleSheet.setStyle() que adiciona um novo estilo folha de estilos com o nome .darkred. Em seguida, ele aplica a formatao da folha de estilos atribuindo o objeto StyleSheet propriedade styleSheet de TextField. Para que os estilos CSS tenham efeito, a folha de estilos deve ser aplicada ao objeto TextField antes da propriedade htmlText ser definida. Por design, no possvel editar um campo de texto com uma folha de estilos. Se voc tiver um campo de texto de entrada e atribuir uma folha de estilos a ele, o campo de texto mostrar as propriedades da folha de estilos, mas o campo de texto no permitir que os usurios insiram novo texto nela. Alm disso, tambm no possvel usar as seguintes APIs do ActionScript em um campo de texto com uma folha de estilos atribuda.

O mtodo TextField.replaceText() O mtodo TextField.replaceSelectedText() A propriedade TextField.defaultTextFormat O mtodo TextField.setTextFormat()


Se um campo de texto tiver uma folha de estilos atribuda a ele, mas a propriedade TextField.styleSheet for definida posteriormente como null, o contedo das duas propriedades TextField.text e TextField.htmlText adicionar tags e atributos a seu contedo para incorporar a formatao a partir da folha de estilos atribuda anteriormente. Para preservar a propriedade htmlText original, salve-a em uma varivel antes de definir a folha de estilos como null.

PROGRAMAO DO ACTIONSCRIPT 3.0 445


Trabalho com texto

Carregamento de uma arquivo CSS externo


A abordagem CSS para formatao mais poderosa quando voc pode carregar informaes CSS de um arquivo externo em tempo de execuo. Quando os dados CSS so externos ao prprio aplicativo, possvel alterar o estilo visual do texto no aplicativo sem precisar alterar o cdigo-fonte do ActionScript 3.0. Depois da implantao do aplicativo, possvel alterar um arquivo CSS externo para alterar a aparncia do aplicativo, sem precisar implantar novamente o arquivo SWF do aplicativo. O mtodo StyleSheet.parseCSS() converte uma string que contm dados CSS em declaraes de estilo no objeto StyleSheet. O exemplo a seguir mostra como ler um arquivo CSS externo e aplicar suas declaraes de estilo a um objeto TextField. Primeiro, este o contedo do arquivo CSS a ser carregado que denominado example.css:
p { font-family: Times New Roman, Times, _serif; font-size: 14; } h1 { font-family: Arial, Helvetica, _sans; font-size: 20; font-weight: bold; } .bluetext { color: #0000CC; }

Em seguida, est o cdigo ActionScript para uma classe que carrega o arquivo example.css e aplica os estilos ao contedo de TextField:
package { import import import import import import import

flash.display.Sprite; flash.events.Event; flash.net.URLLoader; flash.net.URLRequest; flash.text.StyleSheet; flash.text.TextField; flash.text.TextFieldAutoSize;

public class CSSFormattingExample extends Sprite { var loader:URLLoader; var field:TextField; var exampleText:String = "<h1>This is a headline</h1>" + "<p>This is a line of text. <span class='bluetext'>" + "This line of text is colored blue.</span></p>"; public function CSSFormattingExample():void { field = new TextField(); field.width = 300;

PROGRAMAO DO ACTIONSCRIPT 3.0 446


Trabalho com texto

field.autoSize = TextFieldAutoSize.LEFT; field.wordWrap = true; addChild(field); var req:URLRequest = new URLRequest("example.css"); loader = new URLLoader(); loader.addEventListener(Event.COMPLETE, onCSSFileLoaded); loader.load(req); } public function onCSSFileLoaded(event:Event):void { var sheet:StyleSheet = new StyleSheet(); sheet.parseCSS(loader.data); field.styleSheet = sheet; field.htmlText = exampleText; } } }

Quando os dados CSS so carregados, o mtodo onCSSFileLoaded() executa e chama o mtodo StyleSheet.parseCSS() para transferir as declaraes de estilo para o objeto StyleSheet.

Formatao de faixas de texto em um campo de texto


Um mtodo especialmente til da classe flash.text.TextField o mtodo setTextFormat(). Usando o setTextFormat(), possvel atribuir propriedades especficas ao contedo de uma parte de um campo de texto para responder entrada do usurio, como formulrios que precisam lembrar os usurios de que determinadas entradas so necessrias ou alterar a nfase de uma subseo de uma passagem de texto dentro de um campo de texto conforme o usurio seleciona partes do texto. O exemplo a seguir usa TextField.setTextFormat() em uma faixa de caracteres para alterar a aparncia de parte do contedo de myTextField quando o usurio clica no campo de texto:
var myTextField:TextField = new TextField(); myTextField.text = "No matter where you click on this text field the TEXT IN ALL CAPS changes format."; myTextField.autoSize = TextFieldAutoSize.LEFT; addChild(myTextField); addEventListener(MouseEvent.CLICK, changeText); var myformat:TextFormat = new TextFormat(); myformat.color = 0xFF0000; myformat.size = 18; myformat.underline = true; function changeText(event:MouseEvent):void { myTextField.setTextFormat(myformat, 49, 65); }

PROGRAMAO DO ACTIONSCRIPT 3.0 447


Trabalho com texto

Renderizao avanada de texto


O ActionScript 3.0 fornece vrias classes no pacote flash.text para controlar as propriedades do texto exibido, incluindo fontes incorporadas, configuraes de suavizao de borda, controle de canal alfa e outras configuraes especficas. A Referncia dos componentes e da linguagem do ActionScript 3.0 fornece descries detalhadas dessas classes e propriedades, incluindo as classes CSMSettings, Font e TextRenderer.

Uso de fontes incorporadas


Quando voc especifica uma fonte especfica para um TextField no aplicativo, o Flash Player ou o AIR procuram uma fonte de dispositivo (uma fonte que reside no computador do usurio) com o mesmo nome. Se ele no localizar aquela fonte no sistema, ou se o usurio tiver uma verso levemente diferente de uma fonte com aquele nome, a exibio do texto poder ter uma aparncia muito diferente da pretendida. Para ter certeza de que o usurio v exatamente a fonte correta, possvel incorporar aquela fonte no arquivo SWF do aplicativo. As fontes incorporadas tm vrios benefcios:

As bordas dos caracteres das fontes incorporadas so suavizadas, principalmente para texto grande. possvel girar texto que usa fontes incorporadas. O texto da fonte incorporada pode ser transformado em transparente ou semi-transparente. possvel usar o estilo da CSS kerning com fontes incorporadas.
A maior limitao do uso de fontes incorporadas que elas aumentam o tamanho do arquivo ou o tamanho do download do aplicativo. O mtodo exato a ser usado para incorporar um arquivo de fonte no arquivo SWF do aplicativo varia de acordo com o ambiente de desenvolvimento. Depois de incorporar uma fonte, voc pode verificar se um TextField usa a fonte incorporada correta:

Defina a propriedade embedFonts do TextField como true. Crie um objeto TextFormat, defina sua propriedade fontFamily como o nome da fonte incorporada e aplique o
objeto TextFormat ao TextField. Ao especificar uma fonte incorporada, a propriedadefontFamily deve conter apenas um nico nome. Ela no pode usar uma lista delimitada por vrgulas de vrios nomes de fontes.

Se estiver usando estilos CSS para definir fontes para TextFields ou componentes, defina a propriedade CSS fontfamily como o nome da fonte incorporada. A propriedade font-family deve conter um nico nome e no uma

lista de nomes se voc desejar especificar uma fonte incorporada. Incorporao de uma fonte no Flash A ferramenta de autoria do Flash permite incorporar quase qualquer fonte instalada no sistema, incluindo fontes TrueType e fontes Postscript Tipo 1. possvel incorporar fontes em um aplicativo de muitas maneiras, incluindo:

Definir a fonte e as propriedades de estilo de um TextField no Palco e clicar na caixa de seleo Incorporar fontes. Criar e referenciar um smbolo de fonte. Criar e usar uma biblioteca compartilhada em tempo de execuo contendo smbolos de fontes incorporadas.
Para obter mais detalhes sobre como incorporar fontes em aplicativos, consulte Fontes incorporadas para campos de texto dinmicos ou de entrada emUso do Flash.

PROGRAMAO DO ACTIONSCRIPT 3.0 448


Trabalho com texto

Controle da nitidez, da espessura e da suavizao de borda


Por padro, o Flash Player ou o AIR determina as configuraes dos controles de exibio de texto, como nitidez, espessura e suavizao de borda, conforme o texto redimensionado, muda de cor ou exibido em vrios fundos. Em alguns casos, como quando tem um texto muito pequeno ou muito grande, ou texto em vrios fundos exclusivos, talvez voc queira manter controle sobre essas configuraes. possvel substituir as configuraes do Flash Player ou do AIR usando a classe flash.text.TextRenderer e as classes associadas, como CSMSettings. Essas classes fornecem um controle preciso sobre a qualidade da renderizao de texto incorporado. Para obter mais informaes sobre fontes incorporadas, consulte Uso de fontes incorporadas na pgina 447. Nota: A propriedade flash.text.TextField.antiAliasType deve ter o valor AntiAliasType.ADVANCED para que voc defina a nitidez, a espessura e a propriedade gridFitType ou use o mtodo TextRenderer.setAdvancedAntiAliasingTable(). O exemplo a seguir aplica formatao e propriedades de CSM (Modulao de traado contnua) personalizadas a texto exibido usando uma fonte incorporada chamada myFont. Quando o usurio clica no texto exibido, o Flash Player ou o Adobe AIR aplica as configuraes personalizadas:
var format:TextFormat = new TextFormat(); format.color = 0x336699; format.size = 48; format.font = "myFont"; var myText:TextField = new TextField(); myText.embedFonts = true; myText.autoSize = TextFieldAutoSize.LEFT; myText.antiAliasType = AntiAliasType.ADVANCED; myText.defaultTextFormat = format; myText.selectable = false; myText.mouseEnabled = true; myText.text = "Hello World"; addChild(myText); myText.addEventListener(MouseEvent.CLICK, clickHandler); function clickHandler(event:Event):void { var myAntiAliasSettings = new CSMSettings(48, 0.8, -0.8); var myAliasTable:Array = new Array(myAntiAliasSettings); TextRenderer.setAdvancedAntiAliasingTable("myFont", FontStyle.ITALIC, TextColorType.DARK_COLOR, myAliasTable); }

Trabalho com texto esttico


O texto esttico criado somente na Ferramenta autoria. No possvel instanciar programaticamente texto esttico usando o ActionScript. O texto esttico ser til se o texto for curto e no precisar ser alterado (como possvel no caso de texto dinmico). Considere o texto esttico como sendo semelhante a um elemento grfico, como um crculo ou um quadrado desenhado no Palco na ferramenta de autoria do Flash. Embora o texto esttico seja mais limitado do que o texto dinmico, o ActionScript 3.0 no permite que voc leia os valores das propriedades do texto esttico usando a classe StaticText. possvel usar a classe TextSnapshot para ler valores fora do texto esttico.

PROGRAMAO DO ACTIONSCRIPT 3.0 449


Trabalho com texto

Acesso a campos de texto esttico com a classe StaticText


Normalmente, voc usa a classe flash.text.StaticText no painel Aes da ferramenta de autoria do Flash para interagir com uma ocorrncia de texto esttico posicionada no Palco. Voc tambm pode trabalhar em arquivos ActionScript que interagem com um arquivo SWF que contm texto esttico. Em qualquer um dos casos, no possvel instanciar uma ocorrncia de texto esttico de maneira programtica. O texto esttico criado na Ferramenta de autoria. Para criar uma referncia a um campo de texto esttico existente, repita os itens na lista de exibio e atribua uma varivel. Por exemplo:
for (var i = 0; i < this.numChildren; i++) { var displayitem:DisplayObject = this.getChildAt(i); if (displayitem instanceof StaticText) { trace("a static text field is item " + i + " on the display list"); var myFieldLabel:StaticText = StaticText(displayitem); trace("and contains the text: " + myFieldLabel.text); } }

Quando h uma referncia a um campo de texto esttico, possvel usar as propriedades daquele campo no ActionScript 3.0. O cdigo a seguir anexado a um quadro na linha de tempo e assume que uma varivel denominada myFieldLabel est atribuda a uma referncia de texto esttico. Um campo de texto dinmico denominado myField posicionado prximo aos valores x ey de myFieldLabel e exibe o valor de myFieldLabel novamente.
var myField:TextField = new TextField(); addChild(myField); myField.x = myFieldLabel.x; myField.y = myFieldLabel.y + 20; myField.autoSize = TextFieldAutoSize.LEFT; myField.text = "and " + myFieldLabel.text

Uso da classe TextSnapshot


Para trabalhar programaticamente com uma ocorrncia de texto esttico, possvel usar a classe flash.text.TextSnapshot para trabalhar com a propriedade textSnapshot de um flash.display.DisplayObjectContainer. Ou seja, voc cria uma ocorrncia de TextSnapshot a partir da propriedade DisplayObjectContainer.textSnapshot. Em seguida, possvel aplicar mtodos a essa ocorrncia para recuperar valores ou selecionar partes do texto esttico. Por exemplo, posicionar um campo de texto esttico que contm o texto "TextSnapshot Example" no Palco. Adicionar o seguinte ActionScript ao Quadro 1 da linha de tempo:
var mySnap:TextSnapshot = this.textSnapshot; var count:Number = mySnap.charCount; mySnap.setSelected(0, 4, true); mySnap.setSelected(1, 2, false); var myText:String = mySnap.getSelectedText(false); trace(myText);

A classe TextSnapshot til para remover o texto dos campos de texto esttico em um arquivo SWF carregado, se voc desejar usar o texto como um valor em outra parte de um aplicativo.

PROGRAMAO DO ACTIONSCRIPT 3.0 450


Trabalho com texto

Exemplo de TextField: Formatao de texto em estilo jornal


O exemplo de Layout de jornal formata texto para que tenha a aparncia de um artigo em um jornal impresso. O texto de entrada pode conter um ttulo, um subttulo e o corpo do artigo. Com uma largura e uma altura determinadas, este exemplo de Layout de jornal formata o ttulo e o subttulo para usarem a largura total da rea de exibio. O texto do artigo distribudo em duas ou mais colunas. Este exemplo ilustra as seguintes tcnicas de programao do ActionScript:

Extenso da classe TextField Carregamento e aplicao de um arquivo CSS externo Converso de estilos CSS em objetos TextFormat Uso da classe TextLineMetrics para obter informaes sobre o tamanho da exibio do texto
Para obter os arquivos de aplicativo deste exemplo, consulte www.adobe.com/go/learn_programmingAS3samples_flash_br. Os arquivos do aplicativo Layout de notcias podem ser encontrados na pasta Amostras/NewsLayout. O aplicativo consiste nos seguintes arquivos:
Arquivo NewsLayout.mxml ou NewsLayout.fla StoryLayoutComponent.as StoryLayout.as Uma classe UIComponent do Flex que coloca a ocorrncia StoryLayout. A classe principal do ActionScript que organiza todos os componentes de um artigo de jornal para exibio. Uma subclasse da classe TextField que gerencia seu prprio objeto TextFormat. Uma subclasse da classe FormattedTextField que ajusta tamanhos de fontes a uma largura desejada. Uma classe ActionScript que divide texto em duas ou mais colunas. Um arquivo CSS que define estilos de texto para o layout. Descrio A interface do usurio do aplicativo para Flex (MXML) ou Flash (FLA).

FormattedTextField.as HeadlineTextField.as MultiColumnTextField.as story.css

Leitura do arquivo CSS externo


O aplicativo Layout de jornal comea lendo o texto do artigo de um arquivo XML local. Em seguida, ele l um arquivo CSS externo que fornece as informaes de formatao do ttulo, do subttulo e do texto principal. O arquivo CSS define trs estilos, um estilo de pargrafo padro para o artigo e os estilos h1 e h2 do ttulo e do subttulo respectivamente.

PROGRAMAO DO ACTIONSCRIPT 3.0 451


Trabalho com texto

p { font-family: Georgia, "Times New Roman", Times, _serif; font-size: 12; leading: 2; text-align: justify; indent: 24; } h1 { font-family: Verdana, Arial, Helvetica, _sans; font-size: 20; font-weight: bold; color: #000099; text-align: left; } h2 { font-family: Verdana, Arial, Helvetica, _sans; font-size: 16; font-weight: normal; text-align: left; }

A tcnica usada para ler o arquivo CSS externo a mesma descrita em Carregamento de uma arquivo CSS externo na pgina 445. Quando o arquivo CSS foi carregado, o aplicativo executa o mtodo onCSSFileLoaded() mostrado a seguir.
public function onCSSFileLoaded(event:Event):void { this.sheet = new StyleSheet(); this.sheet.parseCSS(loader.data); h1Format = getTextStyle("h1", this.sheet); if (h1Format == null) { h1Format = getDefaultHeadFormat(); } h2Format = getTextStyle("h2", this.sheet); if (h2Format == null) { h2Format = getDefaultHeadFormat(); h2Format.size = 16; } pFormat = getTextStyle("p", this.sheet); if (pFormat == null) { pFormat = getDefaultTextFormat(); pFormat.size = 12; } displayText(); }

O mtodo onCSSFileLoaded() cria um objeto StyleSheet e faz com que ele analise os dados CSS de entrada. O texto principal do artigo exibido em um objeto MultiColumnTextField que pode usar um objeto StyleSheet diretamente. No entanto, os campos de ttulo usam a classe HeadlineTextField que usa um objeto TextFormat para sua formatao.

PROGRAMAO DO ACTIONSCRIPT 3.0 452


Trabalho com texto

O mtodo onCSSFileLoaded() chama o mtodo getTextStyle() duas vezes para converter uma declarao de estilo CSS em um objeto TextFormat para uso com cada um dos dois objetos HeadlineTextField.
public function getTextStyle(styleName:String, ss:StyleSheet):TextFormat { var format:TextFormat = null; var style:Object = ss.getStyle(styleName); if (style != null) { var colorStr:String = style.color; if (colorStr != null && colorStr.indexOf("#") == 0) { style.color = colorStr.substr(1); } format = new TextFormat(style.fontFamily, style.fontSize, style.color, (style.fontWeight == "bold"), (style.fontStyle == "italic"), (style.textDecoration == "underline"), style.url, style.target, style.textAlign, style.marginLeft, style.marginRight, style.indent, style.leading); if (style.hasOwnProperty("letterSpacing")) { format.letterSpacing = style.letterSpacing; } } return format; }

Os nomes das propriedades e o significado dos valores das propriedades diferem entre declaraes de estilo CSS e objetos TextFormat. O mtodo getTextStyle() converte valores das propriedades CSS em valores esperados pelo objeto TextFormat.

Organizao dos elementos do artigo na pgina


A classe StoryLayout formata e dispe o ttulo, o subttulo e os campos de texto principais em uma organizao em estilo jornal. O mtodo displayText() inicialmente cria e posiciona os vrios campos.

PROGRAMAO DO ACTIONSCRIPT 3.0 453


Trabalho com texto

public function displayText():void { headlineTxt = new HeadlineTextField(h1Format); headlineTxt.wordWrap = true; headlineTxt.x = this.paddingLeft; headlineTxt.y = this.paddingTop; headlineTxt.width = this.preferredWidth; this.addChild(headlineTxt); headlineTxt.fitText(this.headline, 1, true); subtitleTxt = new HeadlineTextField(h2Format); subtitleTxt.wordWrap = true; subtitleTxt.x = this.paddingLeft; subtitleTxt.y = headlineTxt.y + headlineTxt.height; subtitleTxt.width = this.preferredWidth; this.addChild(subtitleTxt); subtitleTxt.fitText(this.subtitle, 2, false); storyTxt = new MultiColumnText(this.numColumns, 20, this.preferredWidth, 400, true, this.pFormat); storyTxt.x = this.paddingLeft; storyTxt.y = subtitleTxt.y + subtitleTxt.height + 10; this.addChild(storyTxt); storyTxt.text = this.content; ...

Cada campo posicionado abaixo do campo anterior configurando sua propriedade y como igual propriedade y do campo anterior mais sua altura. Esse clculo de posicionamento dinmico necessrio porque os objetos HeadlineTextField e MultiColumnTextField podem ter a altura alterada para se ajustarem ao contedo.

Alterao do tamanho da fonte para ajuste ao tamanho do campo


Determinados uma largura em pixels e um nmero mximo de linhas a serem exibidos, o HeadlineTextField altera o tamanho da fonte para ajustar o texto ao campo. Se o texto for curto, o tamanho da fonte ser muito grande, criando um ttulo em estilo tablide. Se o texto for longo, o tamanho da fonte ser menor. O mtodo HeadlineTextField.fitText() mostrado a seguir faz o trabalho de redimensionamento da fonte:

PROGRAMAO DO ACTIONSCRIPT 3.0 454


Trabalho com texto

public function fitText(msg:String, maxLines:uint = 1, toUpper:Boolean = false, targetWidth:Number = -1):uint { this.text = toUpper ? msg.toUpperCase() : msg; if (targetWidth == -1) { targetWidth = this.width; } var pixelsPerChar:Number = targetWidth / msg.length; var pointSize:Number = Math.min(MAX_POINT_SIZE, Math.round(pixelsPerChar * 1.8 * maxLines)); if (pointSize < 6) { // the point size is too small return pointSize; } this.changeSize(pointSize); if (this.numLines > maxLines) { return shrinkText(--pointSize, maxLines); } else { return growText(pointSize, maxLines); } } public function growText(pointSize:Number, maxLines:uint = 1):Number { if (pointSize >= MAX_POINT_SIZE) { return pointSize; } this.changeSize(pointSize + 1); if (this.numLines > maxLines) { // set it back to the last size this.changeSize(pointSize); return pointSize; } else { return growText(pointSize + 1, maxLines); }

PROGRAMAO DO ACTIONSCRIPT 3.0 455


Trabalho com texto

} public function shrinkText(pointSize:Number, maxLines:uint=1):Number { if (pointSize <= MIN_POINT_SIZE) { return pointSize; } this.changeSize(pointSize); if (this.numLines > maxLines) { return shrinkText(pointSize - 1, maxLines); } else { return pointSize; } }

O mtodo HeadlineTextField.fitText() usa uma tcnica recursiva simples para redimensionar a fonte. Primeiro ele estima um nmero mdio de pixels por caractere no texto e a partir da calcula um tamanho de ponto inicial. Em seguida, ele altera o tamanho da fonte e verifica se houve quebra de linha no texto para criar mais do que o nmero mximo de linhas de texto. Se houver linhas em excesso, ele chamar o mtodo shrinkText() para reduzir o tamanho da fonte e tentar novamente. Se no houver muitas linhas, ele chamar o mtodo growText() para aumentar o tamanho da fonte e tentar novamente. O processo pra no ponto em que se o tamanho da fonte for incrementado em mais um ponto, linhas em excesso sero criadas.

Diviso do texto em vrias colunas


A classe MultiColumnTextField propaga texto entre vrios objetos TextField que, em seguida, so organizados como colunas de jornal. O construtor MultiColumnTextField() primeiro cria uma matriz de objetos TextField, um para cada coluna, conforme mostrado aqui:
for (var i:int = 0; i < cols; i++) { var field:TextField = new TextField(); field.multiline = true; field.autoSize = TextFieldAutoSize.NONE; field.wordWrap = true; field.width = this.colWidth; field.setTextFormat(this.format); this.fieldArray.push(field); this.addChild(field); }

Cada objeto TextField adicionado matriz e adicionado lista de exibio com o mtodo addChild(). Sempre que a propriedade text ou a propriedade styleSheet de StoryLayout alterada, ele chama o mtodo layoutColumns() para re-exibir o texto. O mtodo layoutColumns() chama o mtodo getOptimalHeight() para calcular a altura correta do pixel que necessria para ajustar todo o texto largura do layout fornecido.

PROGRAMAO DO ACTIONSCRIPT 3.0 456


Trabalho com texto

public function getOptimalHeight(str:String):int { if (field.text == "" || field.text == null) { return this.preferredHeight; } else { this.linesPerCol = Math.ceil(field.numLines / this.numColumns); var metrics:TextLineMetrics = field.getLineMetrics(0); this.lineHeight = metrics.height; var prefHeight:int = linesPerCol * this.lineHeight; return prefHeight + 4; } }

Primeiro, o mtodo getOptimalHeight() calcula a largura de cada coluna. Em seguida, ele define a largura e a propriedade htmlText do primeiro objeto TextField da matriz. O mtodo getOptimalHeight() usa esse primeiro objeto TextField para descobrir o nmero total de quebras de linha no texto, e a partir da identifica quantas linhas devem estar em cada coluna. Em seguida, ele chama o mtodo TextField.getLineMetrics() para recuperar um objeto TextLineMetrics que contm detalhes sobre o tamanho do texto na primeira linha. A propriedade TextLineMetrics.height representa a altura total de uma linha de texto, em pixels, incluindo a elevao, a descendncia e a entrelinha. A altura ideal do objeto MultiColumnTextField portanto a altura da linha multiplicada pelo nmero de linhas por coluna, mais 4 para considerar a borda de dois pixels na parte superior e inferior do objeto TextField. Este o cdigo do mtodo layoutColumns() completo:
public function layoutColumns():void { if (this._text == "" || this._text == null) { return; } var field:TextField = fieldArray[0] as TextField; field.text = this._text; field.setTextFormat(this.format); this.preferredHeight = this.getOptimalHeight(field); var remainder:String = this._text; var fieldText:String = ""; var lastLineEndedPara:Boolean = true; var indent:Number = this.format.indent as Number; for (var i:int = 0; i < fieldArray.length; i++) { field = this.fieldArray[i] as TextField; field.height = this.preferredHeight; field.text = remainder; field.setTextFormat(this.format);

PROGRAMAO DO ACTIONSCRIPT 3.0 457


Trabalho com texto

var lineLen:int; if (indent > 0 && !lastLineEndedPara && field.numLines > 0) { lineLen = field.getLineLength(0); if (lineLen > 0) { field.setTextFormat(this.firstLineFormat, 0, lineLen); } } field.x = i * (colWidth + gutter); field.y = 0; remainder = ""; fieldText = ""; var linesRemaining:int = field.numLines; var linesVisible:int = Math.min(this.linesPerCol, linesRemaining); for (var j:int = 0; j < linesRemaining; j++) { if (j < linesVisible) { fieldText += field.getLineText(j); } else { remainder +=field.getLineText(j); } } field.text = fieldText; field.setTextFormat(this.format); if (indent > 0 && !lastLineEndedPara) { lineLen = field.getLineLength(0); if (lineLen > 0) { field.setTextFormat(this.firstLineFormat, 0, lineLen); } } var lastLine:String = field.getLineText(field.numLines - 1); var lastCharCode:Number = lastLine.charCodeAt(lastLine.length - 1);

PROGRAMAO DO ACTIONSCRIPT 3.0 458


Trabalho com texto

if (lastCharCode == 10 || lastCharCode == 13) { lastLineEndedPara = true; } else { lastLineEndedPara = false; } if ((this.format.align == TextFormatAlign.JUSTIFY) && (i < fieldArray.length - 1)) { if (!lastLineEndedPara) { justifyLastLine(field, lastLine); } } } }

Aps a propriedade preferredHeight ser definida chamando o mtodo getOptimalHeight(), o mtodo layoutColumns() repete os objetos TextField definindo a altura de cada um como o valor de preferredHeight. Em seguida, o mtodo layoutColumns() distribui apenas linhas de texto suficientes para cada campo, de maneira que nenhuma rolagem ocorra em nenhum campo individual e o texto de cada campo sucessivo comece onde o texto no campo anterior terminou. Se o estilo de alinhamento do texto tiver sido definido como justificar o mtodo justifyLastLine() ser chamado para justificar a linha final do texto em um campo. Caso contrrio, essa ltima linha ser tratada como uma linha de final de pargrafo e no ser justificada.

Uso do Mecanismo de texto do Flash


O FTE (Mecanismo de texto do Flash) oferece suporte de baixo nvel para controle sofisticado de mtricas de texto, formatao e texto bidirecional. Ele oferece fluxo de texto aprimorado e suporte a idioma avanado. Embora possa ser usado para criar e gerenciar elementos de texto simples, o FTE foi desenvolvido principalmente como uma base para os desenvolvedores criarem componentes de manipulao de texto. Como tal, o Mecanismo de texto do Flash assume um nvel mais avanado de experincia de programao. Para exibir elementos de texto simples, consulte as sees anteriores que descrevem o uso do TextField e dos objetos relacionados.

Criao e exibio de texto


As classes que compem o Mecanismo de texto do Flash permitem criar, formatar e controlar texto. As seguintes classes so os blocos bsicos de construo para criar e exibir texto com o Mecanismo de texto do Flash:

TextElement/GraphicElement/GroupElement - incluem o contedo de uma ocorrncia de TextBlock. ElementFormat - especifica atributos de formatao para o contedo de uma ocorrncia de TextBlock. TextBlock - a fbrica para criao de um pargrafo de texto. TextLine - uma linha de texto criada no TextBlock.

PROGRAMAO DO ACTIONSCRIPT 3.0 459


Trabalho com texto

Para exibir texto, crie um objeto TextElement a partir de um String e de um objeto ElementFormat, que especifica as caractersticas de formatao, e atribua o TextElement propriedade content de um objeto TextBlock. Crie as linhas de texto para exibio chamando o mtodo TextBlock.createTextLine(). O cdigo a seguir, por exemplo, usa essas classes FTE para exibir "Hello World! This is Flash Text Engine!" usando o formato e os valores de fonte padro.
package { import flash.text.engine.*; import flash.display.Sprite; public class HelloWorldExample extends Sprite { public function HelloWorldExample() { var str = "Hello World! This is Flash Text Engine!"; var format:ElementFormat = new ElementFormat(); var textElement:TextElement = new TextElement(str, format); var textBlock:TextBlock = new TextBlock(); textBlock.content = textElement; var textLine1:TextLine = textBlock.createTextLine(null, 300); addChild(textLine1); textLine1.x = 30; textLine1.y = 30; } } }

Os parmetros de createTextLine() especificam a linha da qual iniciar a nova linha e a largura da linha em pixels. A linha da qual iniciar a nova linha normalmente a linha anterior, mas, no caso da primeira linha, ela null.

Adio de objetos GraphicElement e GroupElement


possvel atribuir um objeto GraphicElement a um objeto TextBlock para exibir uma imagem ou um elemento grfico. Basta criar uma ocorrncia da classe GraphicElement de um grfico ou de uma imagem e atribuir a ocorrncia propriedade TextBlock.content. Crie a linha de texto chamando TextBlock.createTextline() como normalmente o faz. O seguinte exemplo cria duas linhas de texto, uma com um objeto GraphicElement e uma com um objeto TextElement.

PROGRAMAO DO ACTIONSCRIPT 3.0 460


Trabalho com texto

package { import import import import

flash.text.engine.*; flash.display.Sprite; flash.display.Shape; flash.display.Graphics;

public class GraphicElementExample extends Sprite { public function GraphicElementExample() { var str:String = "Beware of Dog!"; var triangle:Shape = new Shape(); triangle.graphics.beginFill(0xFF0000, 1); triangle.graphics.lineStyle(3); triangle.graphics.moveTo(30, 0); triangle.graphics.lineTo(60, 50); triangle.graphics.lineTo(0, 50); triangle.graphics.lineTo(30, 0); triangle.graphics.endFill(); var format:ElementFormat = new ElementFormat(); format.fontSize = 20; var graphicElement:GraphicElement = new GraphicElement(triangle, triangle.width, triangle.height, format); var textBlock:TextBlock = new TextBlock(); textBlock.content = graphicElement; var textLine1:TextLine = textBlock.createTextLine(null, triangle.width); textLine1.x = 50; textLine1.y = 110; addChild(textLine1); var textElement:TextElement = new TextElement(str, format); textBlock.content = textElement; var textLine2 = textBlock.createTextLine(null, 300); addChild(textLine2); textLine2.x = textLine1.x - 30; textLine2.y = textLine1.y + 15; } } }

Voc pode criar um objeto GroupElement para criar um grupo de objetos TextElement, GraphicElement e outro GroupElement para atribuio propriedade content de um objeto TextBlock. O parmetro para o construtor GroupElement() um Vetor que aponta para o texto, o grfico e os elementos de grupo que compem o grupo. O exemplo a seguir agrupa dois elementos grficos e um elemento de texto e os atribui como uma unidade a um bloco de texto.

PROGRAMAO DO ACTIONSCRIPT 3.0 461


Trabalho com texto

package { import import import import

flash.text.engine.*; flash.display.Sprite; flash.display.Shape; flash.display.Graphics;

public class GroupElementExample extends Sprite { public function GroupElementExample() { var str:String = "Beware of Alligators!"; var triangle1:Shape = new Shape(); triangle1.graphics.beginFill(0xFF0000, 1); triangle1.graphics.lineStyle(3); triangle1.graphics.moveTo(30, 0); triangle1.graphics.lineTo(60, 50); triangle1.graphics.lineTo(0, 50); triangle1.graphics.lineTo(30, 0); triangle1.graphics.endFill(); var triangle2:Shape = new Shape(); triangle2.graphics.beginFill(0xFF0000, 1); triangle2.graphics.lineStyle(3); triangle2.graphics.moveTo(30, 0); triangle2.graphics.lineTo(60, 50); triangle2.graphics.lineTo(0, 50); triangle2.graphics.lineTo(30, 0); triangle2.graphics.endFill(); var format:ElementFormat = new ElementFormat(); format.fontSize = 20; var graphicElement1:GraphicElement = new GraphicElement(triangle1, triangle1.width, triangle1.height, format); var textElement:TextElement = new TextElement(str, format); var graphicElement2:GraphicElement = new GraphicElement(triangle2, triangle2.width, triangle2.height, format); var groupVector:Vector.<ContentElement> = new Vector.<ContentElement>(); groupVector.push(graphicElement1, textElement, graphicElement2); var groupElement = new GroupElement(groupVector); var textBlock:TextBlock = new TextBlock(); textBlock.content = groupElement; var textLine:TextLine = textBlock.createTextLine(null, 800); addChild(textLine); textLine.x = 100; textLine.y = 200; } } }

Substituio de texto
possvel substituir texto em uma ocorrncia de TextBlock chamando TextElement.replaceText() para substituir texto no TextElement atribudo propriedade TextBlock.content. O exemplo a seguir usa repaceText() para inserir texto no incio da linha, acrescentar texto no final da linha e substituir texto no meio da linha.

PROGRAMAO DO ACTIONSCRIPT 3.0 462


Trabalho com texto

package { import flash.text.engine.*; import flash.display.Sprite; public class ReplaceTextExample extends Sprite { public function ReplaceTextExample() { var str:String = "Lorem ipsum dolor sit amet"; var fontDescription:FontDescription = new FontDescription("Arial"); var format:ElementFormat = new ElementFormat(fontDescription); format.fontSize = 14; var textElement:TextElement = new TextElement(str, format); var textBlock:TextBlock = new TextBlock(); textBlock.content = textElement; createLine(textBlock, 10); textElement.replaceText(0, 0, "A text fragment: "); createLine(textBlock, 30); textElement.replaceText(43, 43, "..."); createLine(textBlock, 50); textElement.replaceText(23, 28, "(ipsum)"); createLine(textBlock, 70); } function createLine(textBlock:TextBlock, y:Number):void { var textLine:TextLine = textBlock.createTextLine(null, 300); textLine.x = 10; textLine.y = y; addChild(textLine); } } }

O mtodo replaceText() substitui o texto especificado pelos parmetros beginIndex eendIndex pelo texto especificado pelo parmetro newText. Se os valores dos parmetros beginIndex e endIndex forem iguais, replaceText() inserir o texto especificado naquele local. Caso contrrio, ele substituir os caracteres especificados porbeginIndex e endIndex pelo novo texto.

Manipulao de eventos no FTE


possvel adicionar ouvintes de eventos a uma ocorrncia de TextLine exatamente como em outros objetos de exibio. Por exemplo, possvel detectar quando um usurio rola o mouse sobre uma linha de texto ou clica na linha. O exemplo a seguir detecta esses dois eventos. Quando o mouse rolado sobre a linha, o cursor alterado para um cursor de boto e quando voc clica na linha, ela muda de cor.

PROGRAMAO DO ACTIONSCRIPT 3.0 463


Trabalho com texto

package { import import import import import

flash.text.engine.*; flash.ui.Mouse; flash.display.Sprite flash.events.MouseEvent; flash.events.EventDispatcher;

public class EventHandlerExample extends Sprite { var textBlock:TextBlock = new TextBlock(); public function EventHandlerExample():void { var str:String = "I'll change color if you click me."; var fontDescription:FontDescription = new FontDescription("Arial"); var format:ElementFormat = new ElementFormat(fontDescription, 18); var textElement = new TextElement(str, format); textBlock.content = textElement; createLine(textBlock); } private function createLine(textBlock:TextBlock):void { var textLine:TextLine = textBlock.createTextLine(null, 500); textLine.x = 30; textLine.y = 30; addChild(textLine); textLine.addEventListener("mouseOut", mouseOutHandler); textLine.addEventListener("mouseOver", mouseOverHandler); textLine.addEventListener("click", clickHandler); } private function mouseOverHandler(event:MouseEvent):void { Mouse.cursor = "button"; } private function mouseOutHandler(event:MouseEvent):void { Mouse.cursor = "arrow"; } function clickHandler(event:MouseEvent):void { if(textBlock.firstLine) removeChild(textBlock.firstLine); var newFormat:ElementFormat = textBlock.content.elementFormat.clone();

PROGRAMAO DO ACTIONSCRIPT 3.0 464


Trabalho com texto

switch(newFormat.color) { case 0x000000: newFormat.color = 0xFF0000; break; case 0xFF0000: newFormat.color = 0x00FF00; break; case 0x00FF00: newFormat.color = 0x0000FF; break; case 0x0000FF: newFormat.color = 0x000000; break; } textBlock.content.elementFormat = newFormat; createLine(textBlock); } } }

Espelhamento de eventos
Tambm possvel espelhar eventos em um bloco de texto ou em uma parte de um bloco de texto para um dispatcher de eventos. Primeiro, crie uma ocorrncia de EventDispatcher e, em seguida, atribua-a propriedade eventMirror de uma ocorrncia de TextElement. Se o bloco de texto consistir em um nico elemento de texto, o mecanismo de texto espelhar eventos para todo o bloco de texto. Se o bloco de texto consistir em vrios elementos de texto, o mecanismo de texto espelhar eventos apenas para as ocorrncias de TextElement que tiverem a propriedade eventMirror definida. O texto no exemplo a seguir consiste em trs elementos: a palavra "Click", a palavra "here" e a string "to see me in italic". O exemplo atribui um despachador de eventos ao segundo elemento de texto, a palavra "here", e adiciona um ouvinte de eventos, o mtodo clickHandler(). O mtodo clickHandler() altera o texto para itlico. Ele tambm substitui o contedo do terceiro elemento de texto para que seja "Click here to see me in normal font!".
package { import import import import import

flash.text.engine.*; flash.ui.Mouse; flash.display.Sprite; flash.events.MouseEvent; flash.events.EventDispatcher;

public class EventMirrorExample extends Sprite { var fontDescription:FontDescription = new FontDescription("Helvetica", "bold"); var format:ElementFormat = new ElementFormat(fontDescription, 18); var textElement1 = new TextElement("Click ", format); var textElement2 = new TextElement("here ", format); var textElement3 = new TextElement("to see me in italic! ", format); var textBlock:TextBlock = new TextBlock(); public function EventMirrorExample() { var myEvent:EventDispatcher = new EventDispatcher(); myEvent.addEventListener("click", clickHandler); myEvent.addEventListener("mouseOut", mouseOutHandler);

PROGRAMAO DO ACTIONSCRIPT 3.0 465


Trabalho com texto

myEvent.addEventListener("mouseOver", mouseOverHandler); textElement2.eventMirror=myEvent; var groupVector:Vector.<ContentElement> = new Vector.<ContentElement>; groupVector.push(textElement1, textElement2, textElement3); var groupElement:GroupElement = new GroupElement(groupVector); textBlock.content = groupElement; createLines(textBlock); } private function clickHandler(event:MouseEvent):void { var newFont:FontDescription = new FontDescription(); newFont.fontWeight = "bold"; var newFormat:ElementFormat = new ElementFormat(); newFormat.fontSize = 18; if(textElement3.text == "to see me in italic! ") { newFont.fontPosture = FontPosture.ITALIC; textElement3.replaceText(0,21, "to see me in normal font! "); } else { newFont.fontPosture = FontPosture.NORMAL; textElement3.replaceText(0, 26, "to see me in italic! "); } newFormat.fontDescription = newFont; textElement1.elementFormat = newFormat; textElement2.elementFormat = newFormat; textElement3.elementFormat = newFormat; createLines(textBlock); } private function mouseOverHandler(event:MouseEvent):void { Mouse.cursor = "button"; } private function mouseOutHandler(event:MouseEvent):void { Mouse.cursor = "arrow"; } private function createLines(textBlock:TextBlock):void { if(textBlock.firstLine) removeChild (textBlock.firstLine); var textLine:TextLine = textBlock.createTextLine (null, 300); textLine.x = 15; textLine.y = 20; addChild (textLine); } } }

PROGRAMAO DO ACTIONSCRIPT 3.0 466


Trabalho com texto

As funes mouseOverHandler() e mouseOutHandler() definem o cursor como um cursor de boto quando est sobre a palavra "here" e novamente como uma seta quando no est.

Formatao de texto
Um objeto TextBlock uma fbrica para criao de linhas de texto. O contedo de um TextBlock atribudo por meio do objeto TextElement. Um objeto ElementFormat manipula a formatao do texto. A classe ElementFormat define propriedades, como alinhamento de linha de base, kerning, rastreamento, rotao de texto e tamanho, cor e maisculas e minsculas da fonte. Ela tambm inclui um objeto FontDescription discutido mais detalhadamente em Trabalho com fontes na pgina 469.

Uso do objeto ElementFormat


O construtor do objeto ElementFormat utiliza qualquer parmetro de uma longa lista de parmetros, incluindo um FontDescription. Tambm possvel definir essas propriedades fora do construtor. O exemplo a seguir mostra o relacionamento dos vrios objetos para definir e exibir uma linha de texto simples:
package { import flash.display.Sprite; import flash.text.*; public class ElementFormatExample extends Sprite { private var tb:TextBlock = new TextBlock(); private var te:TextElement; private var ef:ElementFormat; private var fd:FontDescription = new FontDescription(); private var str:String; private var tl:TextLine; public function ElementFormatExample() { fd.fontName = "Garamond"; ef = new ElementFormat(fd); ef.fontSize = 30; ef.color = 0xFF0000; str = "This is flash text"; te = new TextElement(str, ef); tb.content = te; tl = tb.createTextLine(null,600); addChild(tl); } } }

Cor e transparncia da fonte (alfa)


A propriedade color do objeto ElementFormat define a cor da fonte. O valor um inteiro que representa os componentes RGB da cor. Por exemplo, 0xFF0000 para vermelho e 0x00FF00 para verde. O padro preto (0x000000). A propriedade alpha define o valor da transparncia alfa de um elemento (TextElement e GraphicElement). Os valores podem variar de 0 (totalmente transparente) a 1 (totalmente opaco, que o padro). Os elementos com um alpha igual a 0 so invisveis, mas ainda ativos. Esse valor multiplicado por qualquer valor alfa herdado, o que torna o elemento mais transparente.

PROGRAMAO DO ACTIONSCRIPT 3.0 467


Trabalho com texto

var ef:ElementFormat = new ElementFormat(); ef.alpha = 0.8; ef.color = 0x999999;

Alinhamento e deslocamento da linha de base


A fonte e o tamanho do maior texto em uma linha determina sua linha de base dominante. possvel substituir esses valores definindo TextBlock.baselineFontDescription eTextBlock.baselineFontSize. possvel alinhar a linha de base dominante com uma das vrias linhas de base existentes no texto. Essas linhas de base incluem a linha elevada e a linha descendente ou a parte superior, a parte central ou a parte inferior da ideografia.
A

A. Elevao B. Linha de base C. Descida D. altura de x

No objeto ElementFormat, trs propriedades determinam as caractersticas da linha de base e do alinhamento. A propriedade alignmentBaseline define a linha de base principal de umTextElement ou GraphicElement. Essa linha de base a linha de encaixe do elemento e nessa posio que a linha de base dominante de todo o texto se alinha. A propriedade dominantBaseline especifica qual das vrias linhas de base do elemento dever ser usada, o que determina a posio vertical do elemento na linha. O valor padro TextBaseline.ROMAN, mas ele tambm pode ser definido para fazer com que as linhas de base IDEOGRAPHIC_TOP ou IDEOGRAPHIC_BOTTOM sejam dominantes. A propriedade baselineShift move a linha de base em um determinado nmero de pixels no eixo y. Em texto normal (no girado), um valor positivo move a linha de base para baixo e um valor negativo a move para cima.

Maisculas/minsculas tipogrficas
A propriedade TypographicCase de ElementFormat especifica maisculas/minsculas do texto, como maisculas, minsculas ou versalete.
var ef_Upper:ElementFormat = new ElementFormat(); ef_Upper.typographicCase = TypographicCase.UPPERCASE; var ef_SmallCaps:ElementFormat = new ElementFormat(); ef_SmallCaps.typographicCase = TypographicCase.SMALL_CAPS;

Rotao do texto
possvel girar um bloco de texto ou os glifos dentro de um segmento de texto em incrementos de 90 graus. A classe TextRotation define as seguintes constantes para definir a rotao do bloco de texto e do glifo:
Constante AUTO Valor automtico Descrio Especifica rotao de 90 gruas no sentido anti-horrio. Usado normalmente com texto asitico vertical para girar apenas glifos que precisam de rotao. Especifica que no haver rotao.

ROTATE_0

rotate_0

PROGRAMAO DO ACTIONSCRIPT 3.0 468


Trabalho com texto

Constante ROTATE_180 ROTATE_270 ROTATE_90

Valor rotate_180 rotate_270 rotate_90

Descrio Especifica rotao de 180 graus. Especifica rotao de 270 graus. Especifica rotao de 90 graus no sentido horrio.

Para girar as linhas de texto em um bloco de texto, defina a propriedade TextBlock.lineRotation antes de chamar o mtodo TextBlock.createTextLine() para criar a linha de texto. Para girar os glifos dentro de um bloco de texto ou de um segmento, defina a propriedade ElementFormat.textRotation como o nmero de graus desejados para a rotao dos glifos. Um glifo a forma que compe um caractere ou uma parte de um caractere que consiste em vrios glifos. A letra a e o ponto em um i, por exemplo, so glifos. A rotao de glifos relevante em alguns idiomas asiticos em que voc queira girar as linhas na vertical, mas no os caracteres dentro das linhas. Para obter mais informaes sobre rotao de texto asitico, consulte Justificao de texto do Leste Asitico na pgina 473. Este um exemplo de rotao de um bloco de texto e dos glifos constituintes, como em texto asitico. O exemplo tambm usa fonte japonesa:
package { import flash.display.Sprite; import flash.text.*; public class RotationExample extends Sprite { private var tb:TextBlock = new TextBlock(); private var te:TextElement; private var ef:ElementFormat; private var fd:FontDescription = new FontDescription(); private var str:String; private var tl:TextLine; public function RotationExample() { fd.fontName = "MS Mincho"; ef = new ElementFormat(fd); ef.textRotation = TextRotation.AUTO; str = "This is rotated Japanese text"; te = new TextElement(str, ef); tb.lineRotation = TextRotation.ROTATE_90; tb.content = te; tl = tb.createTextLine(null,600); addChild(tl); } } }

PROGRAMAO DO ACTIONSCRIPT 3.0 469


Trabalho com texto

Bloqueio e clonagem de ElementFormat


Quando um objeto ElementFormat atribudo a qualquer tipo de ContentElement, sua propriedade locked automaticamente definida como true. A tentativa de modificar um objeto ElementFormat bloqueado lana um IllegalOperationError. A prtica recomendada definir completamente um objeto desse tipo antes de atribuir-lhe uma ocorrncia de TextElement. Para modificar uma ocorrncia de ElementFormat existente, primeiro verifique sua propriedade locked. Se ela for true, use o mtodo clone() para criar uma cpia no bloqueada do objeto. As propriedades desse objeto desbloqueado podem ser alteradas e, em seguida, ele pode ser atribudo ocorrncia de TextElement. Quaisquer novas linhas criadas a partir dele tero a nova formatao. As linhas anteriores criadas a partir desse mesmo objeto e que usam o formato antigo no sero alteradas.
package { import flash.display.Sprite; import flash.text.*; public class ElementFormatCloneExample extends Sprite { private var tb:TextBlock = new TextBlock(); private var te:TextElement; private var ef1:ElementFormat; private var ef2:ElementFormat; private var fd:FontDescription = new FontDescription(); public function ElementFormatCloneExample() { fd.fontName = "Garamond"; ef1 = new ElementFormat(fd); ef1.fontSize = 24; var str:String = "This is flash text"; te = new TextElement(str, ef); tb.content = te; var tx1:TextLine = tb.createTextLine(null,600); addChild(tx1); ef2 = (ef1.locked) ? ef1.clone() : ef1; ef2.fontSize = 32; tb.content.elementFormat = ef2; var tx2:TextLine = tb.createTextLine(null,600); addChild(tx2); } } }

Trabalho com fontes


O objeto FontDescription usado em conjunto com ElementFormat para identificar um tipo de fonte e definir algumas de suas caractersticas. Essas caractersticas incluem o nome, o peso, a postura e a renderizao da fonte e como localiz-la (de dispositivo versus incorporada). Nota: O FTE no oferece suporte a fontes de Tipo 1 ou fontes de bitmap, como Tipo 3, ATC, sfnt-wrapped CID ou Naked CID.

PROGRAMAO DO ACTIONSCRIPT 3.0 470


Trabalho com texto

Definio de caractersticas de fontes (objeto FontDescription)


A propriedade fontName do objeto FontDescription pode ser um nico nome ou uma lista de nomes separados por vrgula. Por exemplo, em uma lista como Arial, Helvetica, _sans, primeiro o Flash Player ou o AIR procura por Arial, depois por Helvetica e, por ltimo, por _sans se no conseguir encontrar nenhuma das primeiras duas fontes. O conjunto de nomes de fontes inclui trs nomes de fontes de dispositivo genricos: _sans, _serif e _typewriter. Eles mapeiam para fontes de dispositivo especficas, dependendo do sistema de reproduo. uma boa prtica especificar nomes padro, como esses, em todas as descries de fonte que usam fontes de dispositivo. Se nenhum fontName for especificado, _serif ser usado como padro. A propriedade fontPosture pode ser definida como a padro (FontPosture.NORMAL) ou itlico (FontPosture.ITALIC). A propriedade fontWeight pode ser definida como a padro (FontWeight.NORMAL) ou como negrito (FontWeight.BOLD).
var fd1:FontDescription = new FontDescription(); fd1.fontName = "Arial, Helvetica, _sans"; fd1.fontPosture = FontPosture.NORMAL; fd1.fontWeight = FontWeight.BOLD;

Fontes de dispositivo versus incorporadas


A propriedade fontLookup do objeto FontDescription especifica se o Flash Player e o AIR devem procurar uma fonte de dispositivo ou uma fonte incorporada para renderizar texto. Se for especificada uma fonte de dispositivo (FontLookup.DEVICE), o tempo de execuo procurar pela fonte no sistema de reproduo. Especificar uma fonte incorporada (FontLookup.EMBEDDED_CFF) faz com que o tempo de execuo procure uma fonte incorporada com o nome especificado no arquivo SWF. Somente fontes CFF (Formato de fonte compacta) funcionam com essa configurao. Se a fonte especificada no for localizada, uma fonte de dispositivo de fallback ser utilizada. Fontes de dispositivo resultam em um tamanho menor do arquivo SW. Fontes incorporadas conferem maior fidelidade entre plataformas.
var fd1:FontDescription = new FontDescription(); fd1.fontLookup = FontLookup.EMBEDDED_CFF; fd1.fontName = "Garamond, _serif";

Modo de renderizao e referncia


A renderizao do CFF (Formato de fonte compacta) um novo recurso do Flash Player 10. Esse tipo de renderizao de fonte torna o texto mais legvel e permite exibio de melhor qualidade de fontes em tamanhos pequenos. Essa configurao aplica-se apenas a fontes incorporadas. FontDescription padronizada para essa configurao (RenderingMode.CFF) para a propriedade renderingMode. possvel definir essa propriedade como RenderingMode.NORMAL para corresponder ao tipo de renderizao usado pelo Flash Player 7 ou por verses anteriores. Quando a renderizao de CFF selecionada, uma segunda propriedade, cffHinting, controla como os troncos horizontais de uma fonte se ajustam grade de subpixels. O valor padro, CFFHinting.HORIZONTAL_STEM, usa referncia de CFF. A configurao dessa propriedade como CFFHinting.NONE remove a referncia, o que apropriado para animao ou para grandes tamanhos de fonte.
var fd1:FontDescription = new FontDescription(); fd1.renderingMode = RenderingMode.CFF; fd1.cffHinting = CFFHinting.HORIZONTAL_STEM;

PROGRAMAO DO ACTIONSCRIPT 3.0 471


Trabalho com texto

Bloqueio e clonagem de FontDescription


Quando um objeto FontDescription atribudo a um ElementFormat, sua propriedade locked automaticamente definida como true. A tentativa de modificar um objeto FontDescription bloqueado lana um IllegalOperationError. A prtica recomendada definir completamente um objeto desse tipo antes de atribuir-lhe um ElementFormat. Para modificar um FontDescription existente, primeiro verifique sua propriedade locked. Se ela for true, use o mtodo clone() para criar uma cpia no bloqueada do objeto. As propriedades desse objeto desbloqueado podem ser alteradas e, em seguida, ele pode ser atribudo a ElementFormat. Quaisquer novas linhas criadas a partir desse TextElement tero a nova formatao. Linhas anteriores criadas a partir desse mesmo objeto no sero alteradas.
package { import flash.display.Sprite; import flash.text.*; public class FontDescriptionCloneExample extends Sprite { private var tb:TextBlock = new TextBlock(); private var te:TextElement; private var ef1:ElementFormat; private var ef2:ElementFormat; private var fd1:FontDescription = new FontDescription(); private var fd2:FontDescription; public function FontDescriptionCloneExample() { fd1.fontName = "Garamond"; ef1 = new ElementFormat(fd); var str:String = "This is flash text"; te = new TextElement(str, ef); tb.content = te; var tx1:TextLine = tb.createTextLine(null,600); addChild(tx1); fd2 = (fd1.locked) ? fd1.clone() : fd1; fd2.fontName = "Arial"; ef2 = (ef1.locked) ? ef1.clone() : ef1; ef2.fontDescription = fd2; tb.content.elementFormat = ef2; var tx2:TextLine = tb.createTextLine(null,600); addChild(tx2); } } }

Controle de texto
O FTE fornece um novo conjunto de controles de formatao de texto para manipular a justificao e o espaamento de caracteres (kerning e rastreamento). Tambm existem propriedades para controlar a maneira como as linhas so quebradas e para definir paradas de tabulao dentro das linhas.

PROGRAMAO DO ACTIONSCRIPT 3.0 472


Trabalho com texto

Justificao de texto
A justificao de texto faz com que todas as linhas em um pargrafo tenham o mesmo comprimento ajustando o espaamento entre palavras e, algumas vezes, entre letras. O efeito alinhar o texto nos dois lados, enquanto o espaamento entre palavras e letras varia. As colunas de texto em jornais e revistas normalmente so justificadas. A propriedade lineJustfication na classe SpaceJustifier permite controlar a justificao de linhas em um bloco de texto. A classe LineJustification define constantes que podem ser usadas para especificar uma opo de justificao: ALL_BUT_LAST justifica todas, menos a ltima linha de texto; ALL_INCLUDING_LAST justifica todo o texto, inclusive a ltima linha; UNJUSTIFIED, que o padro, deixa o texto sem justificao. Para justificar texto, defina a propriedade lineJustification para uma ocorrncia da classe SpaceJustifier e atribua essa ocorrncia propriedade textJustifier de uma ocorrncia de TextBlock. O exemplo a seguir cria um pargrafo no qual todas as linhas de texto, menos a ltima, so justificadas.
package { import flash.text.engine.*; import flash.display.Sprite; public class JustifyExample extends Sprite { public function JustifyExample() { var str:String = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, " + "sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut " + "enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut " + "aliquip ex ea commodo consequat."; var format:ElementFormat = new ElementFormat(); var textElement:TextElement=new TextElement(str,format); var spaceJustifier:SpaceJustifier=new SpaceJustifier("en",LineJustification.ALL_BUT_LAST); var textBlock:TextBlock = new TextBlock(); textBlock.content=textElement; textBlock.textJustifier=spaceJustifier; createLines(textBlock); } private function createLines(textBlock:TextBlock):void { var yPos=20; var textLine:TextLine=textBlock.createTextLine(null,150); while (textLine) { addChild(textLine); textLine.x=15; yPos+=textLine.textHeight+2; textLine.y=yPos; textLine=textBlock.createTextLine(textLine,150); } } } }

PROGRAMAO DO ACTIONSCRIPT 3.0 473


Trabalho com texto

Para variar o espaamento entre letras, bem como entre palavras, defina a propriedade SpaceJustifier.letterspacing como true. A ativao de letterspacing pode reduzir as ocorrncias de lacunas desagradveis entre palavras, o que pode, algumas vezes, ocorrer com a justificao simples.

Justificao de texto do Leste Asitico


A justificao de texto do Leste Asitico envolve consideraes adicionais. Ele pode ser escrito de cima para baixo e alguns caracteres, conhecidos como kinsoku, no podem aparecer no incio ou no fim de uma linha. A classe JustificationStyle define as seguintes constantes, que especificam as opes para manipulao desses caracteres. PRIORITIZE_LEAST_ADJUSTMENT baseia a justificao na expanso ou na compactao da linha, dependendo de qual delas produz o resultado mais desejado. PUSH_IN_KINSOKUbaseia a justificao na compactao kinsoku ao final da linha ou na expanso caso no ocorra kinsoku ou o espao seja insuficiente.
PUSH_OUT_ONLY baseia a justificao na expanso da linha. Para criar um bloco de texto asitico vertical, defina a

propriedade TextBlock.lineRotation como TextRotation.ROTATE_90 e a propriedade


ElementFormat.textRotation como TextRotation.AUTO, que a padro. A configurao da propriedade textRotation como AUTO faz com que os glifos do texto permaneam verticais em vez girar suas laterais quando a linha girada. A configurao AUTO especifica uma rotao anti-horria de 90 graus apenas para glifos de largura completa e glifos largos, conforme determinado pelas propriedades Unicode do glifo. O exemplo a seguir exibe um bloco vertical de texto japons e o justifica usando a opo PUSH_IN_KINSOKU. i package { import import import import

flash.text.engine.*; flash.display.Stage; flash.display.Sprite; flash.system.Capabilities;

public class EastAsianJustifyExample extends Sprite { public function EastAsianJustifyExample() { var Japanese_txt:String = String.fromCharCode( 0x5185, 0x95A3, 0x5E9C, 0x304C, 0x300C, 0x653F, 0x5E9C, 0x30A4, 0x30F3, 0x30BF, 0x30FC, 0x30CD, 0x30C3, 0x30C8, 0x30C6, 0x30EC, 0x30D3, 0x300D, 0x306E, 0x52D5, 0x753B, 0x914D, 0x4FE1, 0x5411, 0x3051, 0x306B, 0x30A2, 0x30C9, 0x30D3, 0x30B7, 0x30B9, 0x30C6, 0x30E0, 0x30BA, 0x793E, 0x306E) var textBlock:TextBlock = new TextBlock(); var font:FontDescription = new FontDescription(); var format:ElementFormat = new ElementFormat(); format.fontSize = 12; format.color = 0xCC0000; format.textRotation = TextRotation.AUTO; textBlock.baselineZero = TextBaseline.IDEOGRAPHIC_CENTER; var eastAsianJustifier:EastAsianJustifier = new EastAsianJustifier("ja", LineJustification.ALL_BUT_LAST); eastAsianJustifier.justificationStyle = JustificationStyle.PUSH_IN_KINSOKU; textBlock.textJustifier = eastAsianJustifier; textBlock.lineRotation = TextRotation.ROTATE_90; var linePosition:Number = this.stage.stageWidth - 75; if (Capabilities.os.search("Mac OS") > -1) // set fontName: Kozuka Mincho Pro R

PROGRAMAO DO ACTIONSCRIPT 3.0 474


Trabalho com texto

font.fontName = String.fromCharCode(0x5C0F, 0x585A, 0x660E, 0x671D) + " Pro R"; else font.fontName = "Kozuka Mincho Pro R"; textBlock.content = new TextElement(Japanese_txt, format); var previousLine:TextLine = null; while (true) { var textLine:TextLine = textBlock.createTextLine(previousLine, 200); if (textLine == null) break; textLine.y = 20; textLine.x = linePosition; linePosition -= 25; addChild(textLine); previousLine = textLine; } } } }

Kerning e rastreamento
O kerning e o rastreamento afetam a distncia entre pares adjacentes de caracteres em um bloco de texto. O kerning controla como pares de caracteres se ajustam em conjunto, como os pares WA ou Va. O kerning definido no objeto ElementFormat. Ele ativado por padro (Kerning.ON) e pode ser definido como OFF ou AUTO, nesse caso sendo aplicado somente entre caracteres se eles no forem caracteres Kanji, Hiragana ou Katakana. O rastreamento adiciona ou subtrai um nmero definido de pixels entre todos os caracteres em um bloco de texto e tambm definido no objeto ElementFormat. Ele funciona com fontes de dispositivo e incorporadas. O FTE oferece suporte a duas propriedades de rastreamento, trackingLeft, que adiciona/subtrai pixels do lado esquerdo de um caractere, e trackingRight, que adiciona/subtrai do lado direito. Se o kerning estiver sendo usado, o valor do rastreamento ser adicionado ou subtrado dos valores de kerning para cada par de caracteres.
A

VAY VAY VAY

VAY VAY VY A

A. Kerning.OFF B. TrackingRight=5, Kerning.OFF C. TrackingRight=-5, Kerning.OFF D. Kerning.ON E. TrackingRight=-5, Kerning.ON F. TrackingRight=-5, Kerning.ON

PROGRAMAO DO ACTIONSCRIPT 3.0 475


Trabalho com texto

var ef1:ElementFormat = new ElementFormat(); ef1.kerning = Kerning.OFF; var ef2:ElementFormat = new ElementFormat(); ef2.kerning = Kerning.ON; ef2.trackingLeft = 0.8; ef2.trackingRight = 0.8; var ef3:ElementFormat = new ElementFormat(); ef3.trackingRight = -0.2;

Quebras de linha para quebra de texto


A propriedade breakOpportunity do objeto ElementFormat determina quais caracteres podem ser usados para quebra ocorre quebra de texto em vrias linhas. O padro, BreakOpportunity.AUTO, usa propriedades padro do Unicode, como quebra entre palavras e em hfens. O uso de BreakOpportunity.ALL permite que qualquer caractere seja tratado com uma oportunidade de quebra de linha, o que til para criar efeitos como texto ao longo de um caminho.
var ef:ElementFormat = new ElementFormat(); ef.breakOpportunity = BreakOpportunity.ALL;

Paradas de tabulao
Para definir paradas de tabulao em um bloco de texto, defina as paradas de tabulao criando ocorrncias da classe TabStop. Os parmetros para o construtor TabStop() especificam como o texto se alinha com a parada de tabulao. Esses parmetros especificam a posio da parada de tabulao e, para alinhamento decimal, o valor no qual alinhar, expresso como uma string. Normalmente, esse valor um ponto decimal, mas tambm pode ser uma vrgula, um smbolo de dlar ou o smbolo do Iene ou do Euro, por exemplo. A linha de cdigo a seguir cria uma parada de tabulao denominada tab1.
var tab1:TabStop = new TabStop(TabAlignment.DECIMAL, 50, ".");

Depois de criar as paradas de tabulao para um bloco de texto, atribua-as propriedade tabStops da ocorrncia de TextBlock. Mas como a propriedade tabStops requer um Vetor, primeiro crie um Vetor e adicione as paradas de tabulao a ele. O Vetor permite atribuir um conjunto de paradas de tabulao ao bloco de texto. O exemplo a seguir cria uma ocorrncia de Vector<TabStop> e adiciona um conjunto de objetos TabStop a ele. Em seguida, ele atribui as paradas de tabulao propriedade tabStops de uma ocorrncia de TextBlock.
var tabStops:Vector.<TabStop> = new Vector.<TabStop>(); tabStops.push(tab1, tab2, tab3, tab4); textBlock.tabStops = tabStops

Para obter mais informaes sobre vetores, consulte Trabalho com matrizes na pgina 157. O exemplo a seguir mostra o efeito de cada uma das opes de alinhamento de TabStop.

PROGRAMAO DO ACTIONSCRIPT 3.0 476


Trabalho com texto

package { import flash.text.engine.*; import flash.display.Sprite; public class TabStopExample extends Sprite { public function TabStopExample() { var format:ElementFormat = new ElementFormat(); format.fontDescription = new FontDdscription("Arial"); format.fontSize = 16; var tabStops:Vector.<TabStop> = new Vector.<TabStop>(); tabStops.push( new TabStop(TabAlignment.START, 20), new TabStop(TabAlignment.CENTER, 140), new TabStop(TabAlignment.DECIMAL, 260, "."), new TabStop(TabAlignment.END, 380)); var textBlock:TextBlock = new TextBlock(); textBlock.content = new TextElement( "\tt1\tt2\tt3\tt4\n" + "\tThis line aligns on 1st tab\n" + "\t\t\t\tThis is the end\n" + "\tThe following fragment centers on the 2nd tab:\t\t\n" + "\t\tit's on me\t\t\n" + "\tThe following amounts align on the decimal point:\n" + "\t\t\t45.00\t\n" + "\t\t\t75,320.00\t\n" + "\t\t\t6,950.00\t\n" + "\t\t\t7.01\t\n", format); textBlock.tabStops = tabStops; var yPosition:Number = 60; var previousTextLine:TextLine = null; var textLine:TextLine; var i:int; for (i = 0; i < 10; i++) { textLine = textBlock.createTextLine(previousTextLine, 1000, 0); textLine.x = 20; textLine.y = yPosition; addChild(textLine); yPosition += 25; previousTextLine = textLine; } } } }

Exemplo do FTE - Layout de jornal


Este exemplo de programao mostra o Mecanismo de texto do Flash sendo usado no layout de uma pgina de jornal simples. A pgina inclui um ttulo grande, um subttulo e uma seo body de vrias colunas. Primeiro, crie um novo arquivo FLA e acrescente o seguinte cdigo ao quadro 2 da camada padro:

PROGRAMAO DO ACTIONSCRIPT 3.0 477


Trabalho com texto

import com.example.programmingas3.newslayout.StoryLayout ; // frame sc ript - create a 3-columned arti cle layout var story:StoryLayout = new StoryLayout(720, 500, 3, 10); story.x = 20; story.y = 80; addChild(story); stop();

StoryLayout.as o script controlador deste exemplo. Ele define o contedo, l informaes de estilo em uma folha de estilo externa e atribui esses estilos a objetos ElementFormat. Em seguida, ele cria o ttulo, o subttulo e elementos de texto com vrias colunas.
package com.example.programmingas3.newslayout { import flash.display.Sprite; import flash.text.StyleSheet; import flash.text.engine.*; import import import import import flash.events.Event; flash.net.URLRequest; flash.net.URLLoader; flash.display.Sprite; flash.display.Graphics;

public class StoryLayout extends Sprite { public var headlineTxt:HeadlineTextField; public var subtitleTxt:HeadlineTextField; public var storyTxt:MultiColumnText; public var sheet:StyleSheet; public var h1_ElFormat:ElementFormat; public var h2_ElFormat:ElementFormat; public var p_ElFormat:ElementFormat; private var loader:URLLoader; public public public public var var var var paddingLeft:Number; paddingRight:Number; paddingTop:Number; paddingBottom:Number;

public var preferredWidth:Number; public var preferredHeight:Number; public var numColumns:int; public var bgColor:Number = 0xFFFFFF; public var headline:String = "News Layout Example"; public var subtitle:String = "This example formats text like a newspaper page using the Flash Text Engine API. "; public var rawTestData:String = "From the part Mr. Burke took in the American Revolution, it was natural that I should consider him a friend to mankind; and as our acquaintance commenced on that ground, it would have been more agreeable to me to have had cause to continue in that opinion than to change it. " + "At the time Mr. Burke made his violent speech last winter in the English Parliament

PROGRAMAO DO ACTIONSCRIPT 3.0 478


Trabalho com texto

against the French Revolution and the National Assembly, I was in Paris, and had written to him but a short time before to inform him how prosperously matters were going on. Soon after this I saw his advertisement of the Pamphlet he intended to publish: As the attack was to be made in a language but little studied, and less understood in France, and as everything suffers by translation, I promised some of the friends of the Revolution in that country that whenever Mr. Burke's Pamphlet came forth, I would answer it. This appeared to me the more necessary to be done, when I saw the flagrant misrepresentations which Mr. Burke's Pamphlet contains; and that while it is an outrageous abuse on the French Revolution, and the principles of Liberty, it is an imposition on the rest of the world. " + "I am the more astonished and disappointed at this conduct in Mr. Burke, as (from the circumstances I am going to mention) I had formed other expectations. " + "I had seen enough of the miseries of war, to wish it might never more have existence in the world, and that some other mode might be found out to settle the differences that should occasionally arise in the neighbourhood of nations. This certainly might be done if Courts were disposed to set honesty about it, or if countries were enlightened enough not to be made the dupes of Courts. The people of America had been bred up in the same prejudices against France, which at that time characterised the people of England; but experience and an acquaintance with the French Nation have most effectually shown to the Americans the falsehood of those prejudices; and I do not believe that a more cordial and confidential intercourse exists between any two countries than between America and France. "; public function StoryLayout(w:int = 400, h:int = 200, cols:int = 3, padding:int = 10):void { this.preferredWidth = w; this.preferredHeight = h; this.numColumns = cols; this.paddingLeft = padding; this.paddingRight = padding; this.paddingTop = padding; this.paddingBottom = padding; var req:URLRequest = new URLRequest("story.css"); loader = new URLLoader(); loader.addEventListener(Event.COMPLETE, onCSSFileLoaded); loader.load(req); } public function onCSSFileLoaded(event:Event):void { this.sheet = new StyleSheet(); this.sheet.parseCSS(loader.data); // convert headline styles to ElementFormat objects h1_ElFormat = getElFormat("h1", this.sheet); h1_ElFormat.typographicCase = TypographicCase.UPPERCASE; h2_ElFormat = getElFormat("h2", this.sheet); p_ElFormat = getElFormat("p", this.sheet); displayText(); } public function drawBackground():void { var h:Number = this.storyTxt.y + this.storyTxt.height + this.paddingTop + this.paddingBottom;

PROGRAMAO DO ACTIONSCRIPT 3.0 479


Trabalho com texto

var g:Graphics = this.graphics; g.beginFill(this.bgColor); g.drawRect(0, 0, this.width + this.paddingRight + this.paddingLeft, h); g.endFill(); } /** * Reads a set of style properties for a named style and then creates * a TextFormat object that uses the same properties. */ public function getElFormat(styleName:String, ss:StyleSheet):ElementFormat { var style:Object = ss.getStyle(styleName); if (style != null) { var colorStr:String = style.color; if (colorStr != null && colorStr.indexOf("#") == 0) { style.color = colorStr.substr(1); } var fd:FontDescription = new FontDescription( style.fontFamily, style.fontWeight, FontPosture.NORMAL, FontLookup.DEVICE, RenderingMode.NORMAL, CFFHinting.NONE); var format:ElementFormat = new ElementFormat(fd, style.fontSize, style.color, 1, TextRotation.AUTO, TextBaseline.ROMAN, TextBaseline.USE_DOMINANT_BASELINE, 0.0, Kerning.ON, 0.0, 0.0, "en", BreakOpportunity.AUTO, DigitCase.DEFAULT, DigitWidth.DEFAULT, LigatureLevel.NONE, TypographicCase.DEFAULT); if (style.hasOwnProperty("letterSpacing")) { format.trackingRight = style.letterSpacing; } } return format; } public function displayText():void { headlineTxt = new HeadlineTextField(h1_ElFormat,headline,this.preferredWidth); headlineTxt.x = this.paddingLeft;

PROGRAMAO DO ACTIONSCRIPT 3.0 480


Trabalho com texto

headlineTxt.y = 40 + this.paddingTop; headlineTxt.fitText(1); this.addChild(headlineTxt); subtitleTxt = new HeadlineTextField(h2_ElFormat,subtitle,this.preferredWidth); subtitleTxt.x = this.paddingLeft; subtitleTxt.y = headlineTxt.y + headlineTxt.height; subtitleTxt.fitText(2); this.addChild(subtitleTxt); storyTxt = new MultiColumnText(rawTestData, this.numColumns, 20, this.preferredWidth, this.preferredHeight, p_ElFormat); storyTxt.x = this.paddingLeft; storyTxt.y = subtitleTxt.y + subtitleTxt.height + 10; this.addChild(storyTxt); drawBackground(); } } }

FormattedTextBlock.as usado como uma classe de base para a criao de blocos de texto. Ele tambm inclui funes de utilitrio para alterar o tamanho e o uso de maisculas/minsculas nas fontes.
package com.example.programmingas3.newslayout { import flash.text.engine.*; import flash.display.Sprite; public class FormattedTextBlock extends Sprite { public var tb:TextBlock; private var te:TextElement; private var ef1:ElementFormat; private var textWidth:int; public var totalTextLines:int; public var blockText:String; public var leading:Number = 1.25; public var preferredWidth:Number = 720; public var preferredHeight:Number = 100; public function FormattedTextBlock(ef:ElementFormat,txt:String, colW:int = 0) { this.textWidth = (colW==0) ? preferredWidth : colW; blockText = txt; ef1 = ef; tb = new TextBlock(); tb.textJustifier = new SpaceJustifier("en",LineJustification.UNJUSTIFIED,false); te = new TextElement(blockText,this.ef1); tb.content = te; this.breakLines(); } private function breakLines() { var textLine:TextLine = null; var y:Number = 0;

PROGRAMAO DO ACTIONSCRIPT 3.0 481


Trabalho com texto

var lineNum:int = 0; while (textLine = tb.createTextLine(textLine,this.textWidth,0,true)) { textLine.x = 0; textLine.y = y; y += this.leading*textLine.height; this.addChild(textLine); } for (var i:int = 0; i < this.numChildren; i++) { TextLine(this.getChildAt(i)).validity = TextLineValidity.STATIC; } this.totalTextLines = this.numChildren; } private function rebreakLines() { this.clearLines(); this.breakLines(); } private function clearLines() { while(this.numChildren) { this.removeChildAt(0); } } public function changeSize(size:uint=12):void { if (size > 5) { var ef2:ElementFormat = ef1.clone(); ef2.fontSize = size; te.elementFormat = ef2; this.rebreakLines(); } } public function changeCase(newCase:String = "default"):void { var ef2:ElementFormat = ef1.clone(); ef2.typographicCase = newCase; te.elementFormat = ef2; } } }

HeadlineTextBlock.as estende a classe FormattedTextBlock e usado para criar ttulos. Ele inclui uma funo que filtra o texto em um espao da pgina definido.

PROGRAMAO DO ACTIONSCRIPT 3.0 482


Trabalho com texto

package com.example.programmingas3.newslayout { import flash.text.engine.*; public class HeadlineTextField extends FormattedTextBlock { public static var MIN_POINT_SIZE:uint = 6; public static var MAX_POINT_SIZE:uint = 128; public function HeadlineTextField(te:ElementFormat,txt:String,colW:int = 0) { super(te,txt); } public function fitText(maxLines:uint = 1, targetWidth:Number = -1):uint { if (targetWidth == -1) { targetWidth = this.width; } var pixelsPerChar:Number = targetWidth / this.blockText.length; var pointSize:Number = Math.min(MAX_POINT_SIZE, Math.round(pixelsPerChar * 1.8 * maxLines)); if (pointSize < 6) { // the point size is too small return pointSize; } this.changeSize(pointSize); if (this.totalTextLines > maxLines) { return shrinkText(--pointSize, maxLines); } else { return growText(pointSize, maxLines); } } public function growText(pointSize:Number, maxLines:uint = 1):Number { if (pointSize >= MAX_POINT_SIZE) { return pointSize; } this.changeSize(pointSize + 1); if (this.totalTextLines > maxLines) { // set it back to the last size this.changeSize(pointSize); return pointSize; } else

PROGRAMAO DO ACTIONSCRIPT 3.0 483


Trabalho com texto

{ return growText(pointSize + 1, maxLines); } } public function shrinkText(pointSize:Number, maxLines:uint=1):Number { if (pointSize <= MIN_POINT_SIZE) { return pointSize; } this.changeSize(pointSize); if (this.totalTextLines > maxLines) { return shrinkText(pointSize - 1, maxLines); } else { return pointSize; } } } }

MultiColumnText.as manipula a formatao do texto em um design de vrias colunas. Ele demonstra o uso flexvel de um objeto TextBlock como uma fbrica para criar, formatar e colocar linhas de texto.
package com.example.programmingas3.newslayout { import flash.display.Sprite; import flash.text.engine.*; public class MultiColumnText extends Sprite { private var tb:TextBlock; private var te:TextElement; private var numColumns:uint = 2; private var gutter:uint = 10; private var leading:Number = 1.25; private var preferredWidth:Number = 400; private var preferredHeight:Number = 100; private var colWidth:int = 200; public function MultiColumnText(txt:String = "",cols:uint = 2, gutter:uint = 10, w:Number = 400, h:Number = 100, ef:ElementFormat = null):void { this.numColumns = Math.max(1, cols); this.gutter = Math.max(1, gutter); this.preferredWidth = w; this.preferredHeight = h; this.setColumnWidth(); var field:FormattedTextBlock = new FormattedTextBlock(ef,txt,this.colWidth);

PROGRAMAO DO ACTIONSCRIPT 3.0 484


Trabalho com texto

var totLines:int = field.totalTextLines; field = null; var linesPerCol:int = Math.ceil(totLines/cols); tb = new TextBlock(); te = new TextElement(txt,ef); tb.content = te; var textLine:TextLine = null; var x:Number = 0; var y:Number = 0; var i:int = 0; var j:int = 0; while (textLine = tb.createTextLine(textLine,this.colWidth,0,true)) { textLine.x = Math.floor(i/(linesPerCol+1))*(this.colWidth+this.gutter); textLine.y = y; y += this.leading*textLine.height; j++; if(j>linesPerCol) { y = 0; j = 0; } i++; this.addChild(textLine); } } private function setColumnWidth():void { this.colWidth = Math.floor( (this.preferredWidth ((this.numColumns - 1) * this.gutter)) / this.numColumns); } } }

485

Captulo 22: Trabalho com bitmaps


Alm dos recursos de desenho de vetores, o ActionScript 3.0 permite criar imagens de bitmap ou manipular dados em pixels de imagens de bitmap externas carregadas em um arquivo SWF. Com a habilidade de acessar e alterar valores de pixel individuais, voc pode criar seus prprios efeitos de imagem como filtro e usar as funes internas de rudo para criar textura e rudos aleatrios. Todas essas tcnicas so descritas neste captulo.

Noes bsicas do trabalho com bitmaps


Introduo ao trabalho com bitmaps
Quando voc trabalha com imagens digitais, provavelmente encontra dois tipos principais de grficos: bitmap e vetor. Os grficos bitmap, tambm conhecidos como grficos raster, so compostos por pequenos quadrados (pixels) organizados em um formato de grade retangular. Os grficos de vetor so compostos por formas geomtricas geradas matematicamente, como linhas, curvas e polgonos. As imagens de bitmap so definidas pela largura e altura da imagem, medidas em pixels, e pelo nmero de bits contido em cada pixel, que representa o nmero de cores que um pixel pode conter. No caso das imagens de bitmap que utilizam o modelo de cor RGB, os pixels so compostos por trs bytes: vermelho, verde e azul. Cada um desses bytes contm um valor que varia de 0 a 255. Quando os bytes so combinados em pixels, eles produzem uma cor semelhante cor produzida quando um artista mistura cores de pintura. Por exemplo, um pixel que contm valores de byte de vermelho-255, verde-102 e azul-0 produz uma cor laranja vibrante. A qualidade de uma imagem de bitmap determinada pela combinao de resoluo de imagem e o valor de bits da densidade de cor. Resoluo relaciona-se ao nmero de pixels contido dentro de uma imagem. Quanto maior o nmero de pixels, mais alta a resoluo e melhor a imagem aparece. Densidade de cor relaciona-se quantidade de informaes que um pixel pode conter. Por exemplo, uma imagem que tem um valor de densidade de cor de 16 bits por pixel no pode representar o mesmo nmero de cores que uma imagem que tem uma densidade de cor de 48 bits. Conseqentemente, a imagem de 48 bits ter graus de sombreamento mais suaves do que a contraparte de 16 bits. Como os grficos de bitmap dependem da resoluo, eles no so dimensionados muito bem. Isso mais facilmente notado quando imagens de bitmap so aumentadas em tamanho. Aumentar um bitmap normalmente resulta em perda de detalhes e qualidade. Formatos de arquivo bitmap As imagens bitmap so agrupadas em vrios formatos de arquivo comuns. Esses formatos usam tipos diferentes de algoritmos de compactao para reduzir o tamanho do arquivo, bem como otimizar a qualidade da imagem com base no objeto final da imagem. Os formatos de imagem de bitmap suportados pelo Adobe Flash Player e pelo Adobe AIR so BMP, GIF, JPG, PNG e TIFF. BMP O formato BMP (bit mapped) um formato de imagem padro usado pelo sistema operacional Microsoft Windows. Por no utilizar algoritmos de compactao de nenhum tipo, o tamanho dos arquivos BMP maior.

PROGRAMAO DO ACTIONSCRIPT 3.0 486


Trabalho com bitmaps

GIF O GIF (Graphics Interchange Format) foi originalmente desenvolvido pela CompuServe em 1987 como uma forma de transmitir imagem com 256 cores (cor de 8 bits) O formato fornece tamanhos pequenos de arquivo e ideal para imagens com base na Web. Devido a esse palete de cores limitado do formato, as imagens GIF no so normalmente para fotografias, que geralmente exigem mais graus de sombreamento e gradientes de cor. As imagens GIF permitem transparncia de bit nico, possibilitando que as cores sejam mapeadas como claras (ou transparentes). Isso resulta na cor de plano de fundo de uma pgina da Web mostrada atravs da imagem onde a transparncia foi mapeada. JPEG Desenvolvido pelo Joint Photographic Experts Group (JPEG), o formato de imagem JPEG (tambm escrito como JPG) usa um algoritmo de compactao com perdas para permitir densidade de cores de 24 bits com tamanho de arquivo pequeno. Compactao com perdas significa que sempre que a imagem salva, ela perde qualidade de dados, mas resulta em um tamanho de arquivo menor. O formato JPEG ideal para fotografias porque ele capaz de exibir milhes de cores. A habilidade de controlar o grau de compactao aplicada a uma imagem permite manipular a qualidade da imagem e o tamanho do arquivo. PNG O formato PNG (Portable Network Graphics) foi produzido como uma alternativa de fonte aberta para o formato de arquivo GIF patenteado. O formato PNG suporta densidade de cores de at 64 bits, permitindo at 16 milhes de cores. Como o PNG relativamente um novo formato, alguns navegadores antigos no suportam arquivos PNG. Diferentemente dos JPGs, os PNGs usam compactao sem perda, o que significa que nenhum dado da imagem perdido quando a imagem salva. Os arquivos PNG tambm suportam transparncia alfa, que permite at 256 nveis de transparncia. TIFF O TIFF (Tagged Image File Format) foi o formato compatvel com vrias plataformas escolhido antes do surgimento do PNG. A desvantagem desse formato que, devido grande variedade de TIFFs, no h um nico leitor que possa manipular cada verso. Alm disso, no h navegadores da Web que suportam esse formato atualmente. Esse formato usa compactao com ou sem perdas, e pode manipular espaos de cor especficos do dispositivo (como CMYK). Bitmaps transparentes e opacos As imagens de bitmap que usam os formatos GIF ou PNG podem ter um byte extra (canal alfa) adicionado a cada pixel. O byte de pixel extra representa o valor da transparncia do pixel. As images GIF permitem transparncia de nico bit, o que significa que voc pode especificar uma nica cor, de um palete de 256 cores, para ser transparente. As imagens PNG, por outro lado, podem ter at 256 nveis de transparncia. Essa funo traz benefcios especialmente quando imagens ou texto devem ficar mesclados nos planos de fundo. O ActionScript 3.0 replica esse byte de pixel de transparncia extra dentro da classe BitmapData. Semelhante ao modelo de transparncia do PNG, a constante BitmapDataChannel.ALPHA oferece at 256 nveis de transparncia.

Tarefas comuns do trabalho com bitmaps


A lista a seguir descreve vrias tarefas que voc pode executar quando estiver trabalhando com imagens bitmap no ActionScript:

Exibio de bitmaps na tela Recuperao e configurao de valores de cor de pixel

PROGRAMAO DO ACTIONSCRIPT 3.0 487


Trabalho com bitmaps

Cpia de dados de bitmap: Criao de uma cpia exata de um bitmap Cpia de dados de um canal de cor de um bitmap para um canal de cor de outro bitmap Cpia de um snapshot de um objeto de exibio de tela para um bitmap Criao de rudo e texturas nas imagens de bitmap Rolagem de bitmaps

Conceitos e termos importantes


A lista a seguir contm termos importantes usados neste captulo:

Alfa: O nvel de transparncia (ou mais precisamente, de opacidade) em uma cor ou uma imagem. O valor de alfa
freqentemente descrito como o valor do canal alfa.

Cor ARGB: Um esquema de cores em que cada cor de pixel uma mistura de valores das cores vermelho, verde e
azul, e sua transparncia especificada como um valor alfa.

Canal de cores: Normalmente, as cores so representadas como uma mistura de algumas cores bsicas - geralmente
(para grficos de computador) vermelho, verde e azul. Cada cor bsica considerada um canal de cor; a quantidade de cor em cada canal de cor, misturadas juntas, determina a cor final.

Densidade de cores: Tambm conhecido como densidade de bits, isso se refere quantidade de memria do
computador que est atribuda a cada pixel, que por sua vez determina o nmero de cores possveis que podem ser representadas na imagem.

Pixel: A menor unidade de informao em uma imagem de bitmap - essencialmente um ponto de cor. Resoluo: As dimenses em pixel de uma imagem, que determinam o nvel de detalhes granulados contidos na
imagem. A resoluo freqentemente expressa em termos de largura e altura em nmero de pixels.

Cor RGB: Um esquema de cores em que cada cor de pixel representada como uma mistura de valores das cores
vermelho, verde e azul.

Teste dos exemplos do captulo


Talvez voc queira testar o cdigo de exemplo durante a leitura deste captulo. Como esse captulo lida com a criao e a manipulao de contedo visual, o teste de cdigo envolve a execuo de cdigo e a visualizao de resultados no SWF que criado. Para testar os exemplos de cdigo deste captulo:
1 Criar um documento vazio usando a ferramenta de autoria do Flash 2 Selecione um quadro-chave na Linha de tempo. 3 Abra o painel Aes e copie o cdigo no painel Script. 4 Execute o programa usando Controlar > Testar filme.

Voc ver os resultados do cdigo no arquivo SWF criado. Quase todos os exemplos incluem um cdigo que cria uma imagem de bitmap de modo que voc pode testar apenas o cdigo sem precisar fornecer nenhum contedo de bitmap. Como alternativa, se voc quiser testar o cdigo na sua prpria imagem, poder importar aquela imagem no Adobe Flash CS4 Professional ou carregar a imagem externa no SWF de teste e usar os dados de bitmap com o cdigo de exemplo. Para obter mais informaes sobre como carregar imagens externas, consulte Carregamento dinmico do contedo da exibio na pgina 313.

PROGRAMAO DO ACTIONSCRIPT 3.0 488


Trabalho com bitmaps

Classes Bitmap e BitmapData


As classes principais do ActionScript 3.0 para trabalhar com imagens de bitmap so a classe Bitmap, que usada para exibir imagens bitmap na tela e a classe BitmapData, que usada para acessar e manipular os dados de imagem no processados de um bitmap.

Compreenso da classe Bitmap


Como uma subclasse da classe DisplayObject, a classe Bitmap a principal classe do ActionScript 3.0 usada para exibir imagens de bitmap. possvel que essas imagens tenham sido carregadas no Flash Player ou no Adobe AIR por meio da classe flash.display.Loader ou criadas dinamicamente usando o construtor Bitmap(). Durante o carregamento de uma imagem a partir de uma fonte externa, um objeto Bitmap pode usar apenas imagens nos formatos GIF, JPEG ou PNG. Depois de instanciado, a ocorrncia de Bitmap pode ser considerada um wrapper para um objeto BitmapData que precisa ser renderizado no Palco. Como uma ocorrncia de bitmap um objeto de exibio, todos os recursos e funcionalidade dos objetos de exibio tambm podem ser usados para manipular uma ocorrncia de Bitmap. Para obter mais informaes sobre como trabalhar com objetos de exibio, consulte Programao de exibio na pgina 274.

Encaixe e suavizao de pixels


Alm da funcionalidade comum para todos os objetos de exibio, a classe Bitmap fornece alguns recursos adicionais que so especficos para imagens bitmaps. Semelhante ao recurso encaixe de pixel encontrada na ferramenta de autoria do Flash, a propriedade pixelSnapping da classe Bitmap determina se um objeto Bitmap ou no encaixado no seu pixel mais prximo. Essa propriedade aceita uma das trs constantes definidas na classe PixelSnapping: ALWAYS, AUTO eNEVER. A sintaxe para aplicao de encaixe de pixel como se segue:
myBitmap.pixelSnapping = PixelSnapping.ALWAYS;

Freqentemente, quando imagens de bitmap so escalada, elas ficam borradas e distorcidas. Para ajudar a reduzir essa distoro, use a propriedade smoothing da classe BitmapData. Essa propriedade Boolean, quando definida como true, suaviza os pixels dentro da imagem quando ela escalada. Isso d imagem uma aparncia mais clara e natural.

Compreenso da classe BitmapData


A classe BitmapData, que est no pacote flash.display, pode ser comparada a um snapshot fotogrfico de pixels contido em um imagem de bitmap carregada ou criada dinamicamente. Esse snapshot representado por uma matriz de dados de pixel dentro do objeto. A classe BitmapData tambm contm uma srie de mtodos incorporados que so utilizados para a criao e a manipulao de dados de pixel. Para instanciar um objeto BitmapData, use o seguinte cdigo:
var myBitmap:BitmapData = new BitmapData(width:Number, height:Number, transparent:Boolean, fillColor:uinit);

Os parmetros width e height especificam o tamanho do bitmap; o valor mximo de ambos 2880 pixels. O parmetro transparent especifica se os dados de bitmap incluem um canal alfa (true) ou no (false). O parmetro fillColor um valor de cor de 32 bits que especifica a cor de plano de fundo, bem como o valor de transparncia (se ele tiver sido definido como true). O exemplo a seguir cria um objeto BitmapData com plano de fundo laranja que 50% transparente.
var myBitmap:BitmapData = new BitmapData(150, 150, true, 0x80FF3300);

PROGRAMAO DO ACTIONSCRIPT 3.0 489


Trabalho com bitmaps

Para renderizar um objeto BitmapData criado recentemente na tela, atribua-o ou envolva-o em uma ocorrncia de Bitmap. Para fazer isso, voc pode transmitir o objeto BitmapData como um parmetro do construtor de objeto Bitmap ou atribu-lo propriedade bitmapData de uma ocorrncia de Bitmap existente. Voc tambm deve adicionar a ocorrncia de Bitmap lista de exibio chamando os mtodos addChild() ou addChildAt() do continer de objeto de exibio que conter a ocorrncia de Bitmap. Para obter mais informaes sobre como trabalhar com a lista de exibio, consulte Adio de objetos lista de exibio na pgina 282. O exemplo a seguir cria um objeto BitmapData com preenchimento vermelho e exibe-o em uma ocorrncia de Bitmap.
var myBitmapDataObject:BitmapData = new BitmapData(150, 150, false, 0xFF0000); var myImage:Bitmap = new Bitmap(myBitmapDataObject); addChild(myImage);

Manipulao de pixels
A classe BitmapData tambm contm um conjunto de mtodos que permitem manipular valores de dados de pixels.

Manipulao de pixels individuais


Ao alterar a aparncia de uma imagem de bitmap no nvel de pixel, voc primeiro precisa obter os valores de cores dos pixels contidos dentro da rea que deseja manipular. Use o mtodo getPixel() para ler esses valores de pixel. O mtodo getPixel() recupera um valor RGB a partir de um conjunto de coordenadas x, y (pixel) transmitidas como parmetros. Se qualquer um dos pixels que voc deseja manipular incluir informaes sobre transparncia (canal alfa), ser necessrio usar o mtodo getPixel32(). Esse mtodo tambm recupera um valor RGB, mas diferente de getPixel(), o valor retornado por getPixel32() contm dados adicionais que representam o valor do canal alfa (transparncia) do pixel selecionado. Como alternativa, se voc quiser simplesmente alterar a cor ou a transparncia de um pixel contido em um bitmap, poder usar o mtodo setPixel() ou setPixel32(). Para definir uma cor de pixels, transmita simplesmente as coordenadas x, y e o valor da cor para um desses mtodos. O exemplo a seguir usa o mtodo setPixel() para desenhar uma cruz em um plano de fundo BitmapData verde: Ele ento usa getPixel() para recuperar o valor da cor do pixel nas coordenadas 50, 50 e liga o valor retornado.
import flash.display.Bitmap; import flash.display.BitmapData; var myBitmapData:BitmapData = new BitmapData(100, 100, false, 0x009900); for (var i:uint = 0; i < 100; i++) { var red:uint = 0xFF0000; myBitmapData.setPixel(50, i, red); myBitmapData.setPixel(i, 50, red); } var myBitmapImage:Bitmap = new Bitmap(myBitmapData); addChild(myBitmapImage); var pixelValue:uint = myBitmapData.getPixel(50, 50); trace(pixelValue.toString(16));

PROGRAMAO DO ACTIONSCRIPT 3.0 490


Trabalho com bitmaps

Se voc quiser ler o valor de um grupo de pixels, use o mtodo getPixels(). Esse mtodo gera uma matriz de bytes a partir de uma regio retangular dos dados de pixels que so transmitidos como um parmetro. Cada um dos elementos da matriz de bytes (em outra palavras, os valores de pixel) so valores de pixel inteiros no assinados de 32 bits e no multiplicados. Inversamente, para alterar (ou definir) o valor de um grupo de pixels, use o mtodo setPixels(). Esse mtodo espera dois parmetros (rect e inputByteArray), que so combinados para resultar em uma regio retangular (rect) dos dados de pixel (inputByteArray). Como os dados so lidos (e gravados) fora de inputByteArray, o mtodo ByteArray.readUnsignedInt() chamado para cada um dos pixels na matriz. Se, por alguma razo, inputByteArray no contiver pelo menos um retangular inteiro de dados de pixel, o mtodo interromper o processamento dos dados da imagem naquele ponto. importante lembrar que, para obter e configurar dados de pixel, a matriz de byte espera valores de pixel vermelho, verde, azul e alfa de 32 bits (ARGB). O exemplo a seguir usa os mtodos getPixels() e setPixels() para copiar um grupo de pixels de um objeto BitmapData para outro:
import import import import flash.display.Bitmap; flash.display.BitmapData; flash.utils.ByteArray; flash.geom.Rectangle;

var bitmapDataObject1:BitmapData = new BitmapData(100, 100, false, 0x006666FF); var bitmapDataObject2:BitmapData = new BitmapData(100, 100, false, 0x00FF0000); var rect:Rectangle = new Rectangle(0, 0, 100, 100); var bytes:ByteArray = bitmapDataObject1.getPixels(rect); bytes.position = 0; bitmapDataObject2.setPixels(rect, bytes); var bitmapImage1:Bitmap = new Bitmap(bitmapDataObject1); addChild(bitmapImage1); var bitmapImage2:Bitmap = new Bitmap(bitmapDataObject2); addChild(bitmapImage2); bitmapImage2.x = 110;

Deteco de coliso de nvel de pixel


O mtodo BitmapData.hitTest() executa a deteco de coliso no nvel de pixel entre os dados de bitmap e outro objeto ou ponto. O mtodo BitmapData.hitTest() aceita cinco parmetros:

firstPoint (Point): Esse parmetro se refere posio do pixel do canto superior esquerdo do primeiro

BitmapData no qual o teste de ocorrncia est sendo executado.


firstAlphaThreshold (uint): Esse parmetro especifica o valor de canal alfa mais alto que considerado opaco para esse teste de ocorrncia. secondObject (Object): Esse parmetro representa a rea de impacto. O objeto secondObject no pode ser um

objeto Rectangle, Point, Bitmap ou BitmapData. Esse objeto representa a rea de ocorrncia na qual a deteco de coliso est sendo executada.

PROGRAMAO DO ACTIONSCRIPT 3.0 491


Trabalho com bitmaps

secondBitmapDataPoint (Point): Esse parmetro opcional usado para definir uma localizao de pixel no

segundo objeto BitmapData. Use esse parmetro apenas quando o valor de secondObject for um objeto BitmapData. O padro null.

secondAlphaThreshold (uint): Esse parmetro opcional representa o valor de canal alfa mais alto que

considerado opaco no segundo objeto BitmapData. O valor padro 1. Use esse parmetro apenas quando o valor de secondObject for um objeto BitmapData e quando ambos os objetos BitmapData forem transparentes. Ao executar a deteco de coliso em imagens opacas, lembre-se de que o ActionScript trata a imagem como se ela fosse um retngulo totalmente opaco (ou caixa delimitadora). Como alternativa, ao executar teste de ocorrncia em nvel de pixel em imagens transparentes, ambas as imagens devem ser transparentes. Alm disso, o ActionScript usa os parmetros de limitao de alfa para determinar em qual ponto os pixels so alterados de transparente para opaco. O exemplo a seguir cria trs imagens de bitmap e verifica se h coliso de pixel utilizando dois diferentes pontos de coliso (um retorna false e outro true):
import flash.display.Bitmap; import flash.display.BitmapData; import flash.geom.Point; var bmd1:BitmapData = new BitmapData(100, 100, false, 0x000000FF); var bmd2:BitmapData = new BitmapData(20, 20, false, 0x00FF3300); var bm1:Bitmap = new Bitmap(bmd1); this.addChild(bm1); // Create a red square. var redSquare1:Bitmap = new Bitmap(bmd2); this.addChild(redSquare1); redSquare1.x = 0; // Create a second red square. var redSquare2:Bitmap = new Bitmap(bmd2); this.addChild(redSquare2); redSquare2.x = 150; redSquare2.y = 150; // Define the var pt1:Point // Define the var pt2:Point // Define the var pt3:Point point = new point = new point = new at the top-left corner of the bitmap. Point(0, 0); at the center of redSquare1. Point(20, 20); at the center of redSquare2. Point(160, 160);

trace(bmd1.hitTest(pt1, 0xFF, pt2)); // true trace(bmd1.hitTest(pt1, 0xFF, pt3)); // false

Cpia de dados de bitmap


Para copiar dados de bitmap de uma imagem para outra, voc pode usar vrios mtodos: clone(), copyPixels(), copyChannel() edraw().

PROGRAMAO DO ACTIONSCRIPT 3.0 492


Trabalho com bitmaps

Como o nome sugere, o mtodo clone() permite clonar, ou obter uma amostra, dos dados de bitmap de um objeto BitmapData para outro. Quando chamado, o mtodo retorna um novo objeto BitmapData que um clone exato da ocorrncia original do qual foi copiado. O exemplo a seguir clona uma cpia de um quadrado (pai) laranja e coloca o clone ao lado do quadrado pai original:
import flash.display.Bitmap; import flash.display.BitmapData; var myParentSquareBitmap:BitmapData = new BitmapData(100, 100, false, 0x00ff3300); var myClonedChild:BitmapData = myParentSquareBitmap.clone(); var myParentSquareContainer:Bitmap = new Bitmap(myParentSquareBitmap); this.addChild(myParentSquareContainer); var myClonedChildContainer:Bitmap = new Bitmap(myClonedChild); this.addChild(myClonedChildContainer); myClonedChildContainer.x = 110;

O mtodo copyPixels() um modo fcil e rpido de copiar pixels de um objeto BitmapData para outro. O mtodo obtm um snapshot retangular (definido pelo parmetro sourceRect) da imagem de origem e a copia para outra rea retangular (de tamanho igual). O local do retngulo "colado" recentemente definido dentro do parmetro destPoint. O mtodo copyChannel() fornece amostras de um valor de canal de cor predefinido (alfa, vermelho, verde ou azul) de um objeto BitmapData de origem e o copia para um canal de um objeto BitmapData de destino. Chamar esse mtodo no afeta os outros canais no objeto BitmapData de destino. O mtodo draw() desenha, ou processa, o contedo grfico de um sprite de origem, clipe de filme ou outro objeto de exibio em um novo bitmap. Usando matrix, colorTransform, blendMode e os parmetros de destinoclipRect, voc pode modificar a forma na qual o novo bitmap renderizado. Esse mtodo usa o processador de vetor no Flash Player e no AIR para gerar os dados. Quando voc chama draw(), transmite o objeto de origem (sprite, clipe de filme ou outro objeto de exibio) como o primeiro parmetro, como demonstrado aqui:
myBitmap.draw(movieClip);

Se o objeto de origem teve qualquer transformao (cor, matriz etc.) aplicada a ele depois que ele foi originalmente carregado, essas transformaes no sero copiadas para o novo objeto. Se voc quiser copiar as transformaes para o novo bitmap, ser necessrio copiar o valor da propriedade transform do objeto original para a propriedade transform do objeto Bitmap que usa o novo objeto BitmapData.

Texturas com funes de rudo


Para modificar a aparncia de um bitmap, voc pode aplicar um efeito de rudo nele, usando o mtodo noise() ou os mtodos perlinNoise(). Um efeito de rudo pode ser comparado a um esttico que aparece em uma tela de televiso no sintonizada. Para aplicar um efeito de rudo a um bitmap, use o mtodo noise(). Esse mtodo aplica um valor de cor aleatrio para pixels dentro de uma rea especificada de uma imagem de bitmap.

PROGRAMAO DO ACTIONSCRIPT 3.0 493


Trabalho com bitmaps

Esse mtodo aceita cinco parmetros:

randomSeed (int): O nmero base aleatrio que determina o padro. Apesar do nome, esse nmero cria realmente

os mesmos resultados se o mesmo nmero transmitido. Para obter um resultado aleatrio verdadeiro, use o mtodo Math.random() para transmitir um nmero aleatrio para esse parmetro.

low (uint): Esse parmetro se refere ao valor mais baixo a ser gerado para cada pixel (0 a 255). O valor padro 0. A configurao desse valor mais baixo resulta em um padro de rudo mais escuro, enquanto a configurao de um valor mais alto resulta em um padro mais claro. high (uint): Esse parmetro se refere ao valor mais alto a ser gerado para cada pixel (0 a 255). O valor padro 255. A configurao desse valor mais baixo resulta em um padro de rudo mais escuro, enquanto a configurao de um valor mais alto resulta em um padro mais claro. channelOptions (uint): Esse parmetro especifica a qual canal de cores do objeto Bitmap o padro de rudo ser aplicado. O nmero pode ser uma combinao de qualquer um dos quatro valores ARGB do canal de cores. O valor padro 7. grayScale (Boolean): Quando definido para true, esse parmetro aplica o valor randomSeed aos pixels de bitmap,

eliminando efetivamente todas as cores da imagem. O canal alfa no afetado por esse parmetro. O valor padro false. O exemplo a seguir cria uma imagem de bitmap e aplica um padro de rudo azul a ela:
import flash.display.Bitmap; import flash.display.BitmapData; var myBitmap:BitmapData = new BitmapData(250, 250,false, 0xff000000); myBitmap.noise(500, 0, 255, BitmapDataChannel.BLUE,false); var image:Bitmap = new Bitmap(myBitmap); addChild(image);

Se voc quiser criar uma textura com a aparncia mais orgnica, use o mtodo perlinNoise() . O mtodo perlinNoise() produz texturas orgnicas realistas que so ideais para fumaa, nuvens, gua, fogo ou at mesmo exploses. Como isso gerado por um algoritmo, o mtodo perlinNoise() usa menos memria do que as texturas com base em bitmap. Entretanto, ele pode ainda ter um impacto no uso do processador, tornando o contedo desenvolvido no Flash mais lento e fazendo com que a tela seja redesenhada mais lentamente do que a taxa de quadro, especialmente em computadores mais antigos. Isso deve-se principalmente aos clculos de ponto de flutuao que precisam ocorrer para processar os algoritmos de rudo perlin. O mtodo aceita nove parmetros (os primeiro seis so obrigatrio):

baseX (Number): Determina o valor de x (tamanho) dos padres criados. baseY (Number): Determina o valor de y (tamanho) dos padres criados. numOctaves (uint): Nmero de oitavas ou funes de rudo individuais a serem combinadas para criar esse rudo.

Nmeros maiores de oitavas criam imagens com mais detalhes, mas tambm exigem mais tempo de processamento.

randomSeed (int): O nmero base aleatrio funciona exatamente da mesma forma que na funo noise(). Para obter um resultado aleatrio verdadeiro, use o mtodo Math.random() para transmitir um nmero aleatrio para esse parmetro. stitch (Boolean): Se definido para true, esse mtodo tentar suavizar as bordas de transio da imagem para criar

texturas contnuas para colocao lado a lado como um preenchimento de bitmap.

PROGRAMAO DO ACTIONSCRIPT 3.0 494


Trabalho com bitmaps

fractalNoise (Boolean): Esse parmetro relaciona as bordas de gradientes sendo geradas pelo mtodo. Se definido para true, o mtodo gerar rudo fractal que suaviza as bordas do efeito. Se definido como false, ocorre turbulncia. Uma imagem com turbulncia tem descontinuidades visveis no gradiente que podem fazer com que ela aproxime melhor os efeitos visuais mais ntidos, como chamas e ondas do mar. channelOptions (uint): O parmetro channelOptions funciona exatamente da mesma forma que no mtodo noise(). Ele especifica a qual canal de cores (do bitmap) o padro de rudo ser aplicado. O nmero pode ser uma

combinao de qualquer um dos quatro valores ARGB do canal de cores. O valor padro 7.

grayScale (Boolean): O parmetro grayScale funciona exatamente da mesma forma que no mtodo noise().

Quando definido como true, esse parmetro aplica o valor randomSeed aos pixels de bitmap, eliminando todas as cores da imagem de modo eficaz. O valor padro false.

deslocamentos (Matriz): Uma matriz de pontos que corresponde a deslocamentos x e y para cada oitava. Ao

manipular os valores de deslocamento, voc pode rolar suavemente as camadas de uma imagem. Cada ponto na matriz de deslocamento afeta uma funo de rudo de oitava especfica. O valor padro null. O exemplo a seguir cria um objeto BitmapData de 150 x 150 pixels que chama o mtodo perlinNoise() para gerar um efeito de nuvem em verde e azul:
import flash.display.Bitmap; import flash.display.BitmapData; var myBitmapDataObject:BitmapData = new BitmapData(150, 150, false, 0x00FF0000); var seed:Number = Math.floor(Math.random() * 100); var channels:uint = BitmapDataChannel.GREEN | BitmapDataChannel.BLUE myBitmapDataObject.perlinNoise(100, 80, 6, seed, false, true, channels, false, null); var myBitmap:Bitmap = new Bitmap(myBitmapDataObject); addChild(myBitmap);

Rolagem de bitmaps
Imagine que voc criou um aplicativo de mapeamento de ruas em que sempre que o usurio move o mapa voc precisa atualizar a visualizao (mesmo que o mapa tenha sido movido apenas alguns pixels). Uma forma de criar essa funcionalidade seria reprocessar uma nova imagem contendo a visualizao atualizada do mapa sempre que o usurio move o mapa. Como alternativa, voc pode criar uma nica imagem grande e o mtodo scroll(). O mtodo scroll() copia um bitmap na tela e o cola em um local de deslocamento especificado por parmetros (x, y). Se acontecer de uma parte do bitmap ficar fora do palco, o efeito resultante indicar que a imagem foi deslocada. Quando combinado com uma funo de temporizador (ou um evento enterFrame), voc poder fazer com a imagem parea ser animada ou estar em rolagem. O exemplo a seguir pega o exemplo de rudo perlin anterior e gera uma imagem de bitmap maior (trs-quartos dela so renderizados fora do palco). O mtodo scroll() ento aplicado junto com um ouvinte do evento enterFrame que desloca a imagem por um pixel na direo diagonal para baixo. Esse mtodo chamado sempre que o quadro inserido e, conseqentemente, as partes da imagem fora da tela so renderizadas no Palco medida que usamos a rolagem na imagem.

PROGRAMAO DO ACTIONSCRIPT 3.0 495


Trabalho com bitmaps

import flash.display.Bitmap; import flash.display.BitmapData; var myBitmapDataObject:BitmapData = new BitmapData(1000, 1000, false, 0x00FF0000); var seed:Number = Math.floor(Math.random() * 100); var channels:uint = BitmapDataChannel.GREEN | BitmapDataChannel.BLUE; myBitmapDataObject.perlinNoise(100, 80, 6, seed, false, true, channels, false, null); var myBitmap:Bitmap = new Bitmap(myBitmapDataObject); myBitmap.x = -750; myBitmap.y = -750; addChild(myBitmap); addEventListener(Event.ENTER_FRAME, scrollBitmap); function scrollBitmap(event:Event):void { myBitmapDataObject.scroll(1, 1); }

Benefcios do mapeamento mip


Mapas MIP (tambm conhecido como mipmaps), so bitmaps agrupados juntos e associados a uma textura para aumentar a qualidade e o desempenho da renderizao de tempo de execuo. O Flash Player 9.0.115.0, as verses posteriores e o AIR implementam essa tecnologia (o processo chamado mipmapping), por meio da criao de verses otimizadas de escala varivel de cada bitmap (comeando em 50%). O Flash Player e o AIR criam mapas MIP para bitmaps (arquivos JPEG, GIF ou PNG) que voc exibe utilizando a classe Loader do ActionScript 3.0, um bitmap na biblioteca de ferramentas de autoria do Flash ou um objeto BitmapData. O Flash Player cria mapas MIP para os bitmaps que voc exibe utilizando a funo loadMovie() do ActionScript 2.0. Os mapas MIP no so aplicados a objetos filtrados nem a clipes de filme em cache de bitmap. Entretanto, os mapas MIP so aplicados se voc tiver transformaes de bitmap em um objeto de exibio filtrado, mesmo se o bitmap estiver dentro de contedo mascarado. Os mapeamentos mip do Flash Player e do AIR ocorrem automaticamente, mas voc pode seguir algumas orientaes para certificar-se de que suas imagens usam essa otimizao:

Para reproduo de vdeo, defina a propriedade smoothing como true para o objeto Video (consulte a classe
Video).

Para bitmaps, a propriedade smoothing no tem que ser definida como true, mas os aprimoramentos de qualidade
so mais visveis quando os bitmaps usam suavizao.

Use tamanhos de bitmap que so divisveis por 4 ou 8 para imagens bidimensionais (como 640 x 128, que pode ser
reduzida como se segue: 320 x 64 > 160 x 32 > 80 x 16 > 40 x 8 > 20 x 4 > 10 x 2 > 5 x 1) e 2^n para texturas tridimensionais. Os mapas MIP so gerados a partir de bitmaps que tm largura e altura que so 2^n (como 256 x 256, 512 x 512, 1024 x 1024). O mapeamento mip interrompido quando o Flash Player ou o AIR encontra uma largura ou altura mpar.

PROGRAMAO DO ACTIONSCRIPT 3.0 496


Trabalho com bitmaps

Exemplo: Lua giratria animada


O exemplo de lua giratria animada demonstra tcnicas para trabalhar com objetos Bitmap e dados de imagem de bitmap (objetos BitmapData). O exemplo cria uma animao de uma lua giratria e esfrica utilizando uma imagem plana da superfcie da lua como os dados de imagem no processados. As tcnicas a seguir so demonstradas:

Carregamento de uma imagem externa e acesso aos seus dados de imagem no processados Criao de animao por meio de cpia repetida de pixels de diferentes partes de uma imagem de origem Criao de uma imagem de bitmap pela definio de valores de pixel
Para obter os arquivos de aplicativo desse exemplo, consulte www.adobe.com/go/learn_programmingAS3samples_flash_br. Os arquivos de aplicativo da lua giratrio animada podem ser encontrados na pasta Samples/SpinningMoon. O aplicativo consiste nos seguintes arquivos:
Arquivo SpinningMoon.mxml ou SpinningMoon.fla com/example/programmingas3/moon/MoonSphere.as A classe que executa a funcionalidade de carregamento, exibio e animao da lua. O arquivo de imagem que contm uma fotografia da superfcie da lua, que carregado e utilizado para criar a lua giratrio e animada. Descrio O arquivo principal do aplicativo no Flex (MXML) ou Flash (FLA).

moonMap.png

Carregamento de uma imagem externa como dados de bitmap


A primeira tarefa principal que essa amostra executa o carregamento de um arquivo de imagem externa, que uma fotografia da superfcie da lua. A operao de carregamento manipulada por dois mtodos na classe MoonSphere: o construtor MoonSphere(), em que o processo de carregamento iniciado, e o mtodo imageLoadComplete(), que chamado quando a imagem externa est totalmente carregada. O carregamento de uma imagem externa semelhante ao carregamento de um SWF externo; ambos utilizam uma ocorrncia da classe flash.display.Loader para executar essa operao. O cdigo real no mtodo MoonSphere() que inicia o carregamento de uma imagem o seguinte:
var imageLoader:Loader = new Loader(); imageLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, imageLoadComplete); imageLoader.load(new URLRequest("moonMap.png"));

A primeira linha declara que a ocorrncia de Loader chamada imageLoader. A terceira linha inicia realmente o processo de carregamento chamando o mtodo load() do objeto Loader, transmitindo uma ocorrncia de URLRequest que representa a URL da imagem a ser carregada. A segunda linha configura o ouvinte do evento que ser acionado quando a imagem for totalmente carregada. Observe que o mtodo addEventListener() no chamado na prpria ocorrncia de Loader; em vez disso, ele chamado na propriedade contentLoaderInfo do objeto Loader. A prpria ocorrncia de Loader no despacha eventos relacionados ao contedo sendo carregado. A propriedade contentLoaderInfo, entretanto, contm uma referncia ao objeto LoaderInfo que associado ao contedo sendo carregado no objeto Loader (a imagem externa nesse caso). Aquele objeto LoaderInfo fornece vrios eventos relacionados ao progresso e concluso do carregamento de contedo externo, incluindo o evento complete (Event.COMPLETE) que acionar uma chamada para o mtodo imageLoadComplete() quando a imagem for totalmente carregada.

PROGRAMAO DO ACTIONSCRIPT 3.0 497


Trabalho com bitmaps

Embora o incio do carregamento da imagem externa seja uma parte importante do processo, igualmente importante saber o que fazer quando o carregamento for concludo. Como mostrado no cdigo acima, a funo imageLoadComplete() chamada quando a imagem carregada. Aquela funo faz vrias atividades com os dados de imagem carregados, descritas nas sees subseqentes. Contudo, para usar os dados da imagem, necessrio acessar aqueles dados. Quando o objeto Loader for utilizado para carregar uma imagem externa, a imagem carregada torna-se uma ocorrncia de bitmap que anexada a um objeto de exibio filho do objeto Loader. Nesse caso, a ocorrncia de Loader est disponvel para o mtodo do ouvinte do evento como parte do objeto de evento que transmitido para o mtodo como um parmetro. As primeiras linhas do mtodo imageLoadComplete() so como se segue:
private function imageLoadComplete(event:Event):void { textureMap = event.target.content.bitmapData; ... }

Observe que o parmetro do objeto de evento chamado event, e uma ocorrncia da classe Event. Cada ocorrncia da classe Event tem uma propriedade target, que se refere ao objeto que est acionando o evento (nesse caso, a ocorrncia de LoaderInfo na qual o mtodo addEventListener() foi chamado, conforme descrito anteriormente). O objeto LoaderInfo, por sua vez, tem uma propriedade content que (uma vez concludo o processo de carregamento) contm a ocorrncia de Bitmap com a imagem de bitmap carregada. Se voc quiser exibir a imagem diretamente na tela, poder anexar essa ocorrncia de Bitmap (event.target.content) a um continer do objeto de exibio. (Voc tambm pode anexar o objeto Loader a um continer do objeto de exibio). Entretanto, nessa amostra, o contedo carregado utilizado como uma origem dos dados da imagem no processados que esto sendo exibidos na tela. Conseqentemente, a primeira linha do mtodo imageLoadComplete() l a propriedade bitmapData da ocorrncia de Bitmap carregada (event.target.content.bitmapData) e a armazena na varivel de ocorrncia chamada textureMap, que, como descrito na seo a seguir, usada como uma origem de dados de imagem para criar a animao da lua giratria.

Criao da animao pela cpia de pixels


Uma definio bsica da animao a iluso de movimentao, ou alterao, criada pela alterao de uma imagem ao longo do tempo. Nessa amostra, o objetivo criar a iluso de uma lua esfrica girando ao redor de seu eixo vertical. Contudo, para o propsito de animao, voc pode ignorar o aspecto de distoro esfrica da amostra. Considere a imagem real que est carregada e usada como a origem dos dados da imagem de lua:

Como voc pode ver, a imagem no uma nem vrias esferas; ela uma fotografia retangular da superfcie da lua. Como a foto foi tirada exatamente na linha do equador da lua, as partes da imagem prximas parte superior e inferior da imagem so expandidas e distorcidas. Para remover a distoro da imagem e deix-la com uma aparncia esfrica, utilizaremos um filtro de mapa de deslocamento, como descrito posteriormente. Entretanto, como essa imagem de origem um retngulo, para criar a iluso de que a esfera est girando, o cdigo simplesmente precisa deslizar a foto da superfcie da lua horizontalmente, como descrito nos pargrafos a seguir.

PROGRAMAO DO ACTIONSCRIPT 3.0 498


Trabalho com bitmaps

Observe que a imagem realmente contm duas cpias da fotografia da superfcie da lua prximas uma da outra. Essa imagem a imagem de origem da qual os dados de imagem foram copiados repetidas vezes para criar a aparncia de movimento. Tendo duas cpias da imagem prximas uma da outra, um efeito de rolagem contnuo e ininterrupto pode ser criado com mais facilidade. Vamos avanar no processo de animao etapa por etapa para ver como ele funciona. O processo realmente envolve dois objetos separados do ActionScript. Primeiro, existe a imagem de origem carregada, que no cdigo representada pela ocorrncia de BitmapData chamada textureMap. Como descrito anteriormente, textureMap preenchido com os dados de imagem assim que a imagem externa carregada, utilizando este cdigo:
textureMap = event.target.content.bitmapData;

O contedo de textureMap a imagem mostrada anteriormente. Alm disso, para criar a rotao animada, a amostra usa uma ocorrncia de Bitmap chamada sphere, que o objeto de exibio real que mostra a imagem da lua na tela. Como textureMap, o objeto sphere criado e preenchido com seus dados de imagem iniciais no mtodo imageLoadComplete(), utilizando o seguinte cdigo:
sphere = new Bitmap(); sphere.bitmapData = new BitmapData(textureMap.width / 2, textureMap.height); sphere.bitmapData.copyPixels(textureMap, new Rectangle(0, 0, sphere.width, sphere.height), new Point(0, 0));

Como mostra o cdigo, sphere instanciado. Sua propriedade bitmapData (os dados de imagem no processados que so exibidos por sphere) criada com a mesma altura e metade da largura de textureMap. Em outras palavras, o contedo de sphere ser o tamanho de uma foto da lua (desde que a imagem textureMap contenha duas fotos da lua lado a lado). Em seguida, a propriedade bitmapData preenchida com dados de imagem utilizando o mtodo copyPixels(). Os parmetros na chamada do mtodo copyPixels() indicam vrias coisas:

O primeiro parmetro indica que os dados da imagem so copiados de textureMap. O segundo parmetro, uma nova ocorrncia de Rectangle, especifica de qual parte de textureMap o snapshot da
imagem deve ser tirado; nesse caso, o snapshot um retngulo que comea no canto superior esquerdo de textureMap (indicado pelos dois primeiros parmetros Rectangle(): 0, 0) e a largura e a altura do snapshot do retngulo corresponde s propriedades width e height desphere.

O terceiro parmetro, uma nova ocorrncia de Point com os valores x e y de 0, define o destino dos dados de pixel
nesse caso, o canto superior esquerdo (0, 0) de sphere.bitmapData. Representado visualmente, o cdigo copia os pixels de textureMap contornados na imagem a seguir e os cola em sphere. Em outras palavras, o contedo de BitmapData desphere a parte de textureMap em destaque aqui:

Lembre-se, contudo, de que esse apenas o estado inicial de sphere o contedo da primeira imagem que copiada na sphere.

PROGRAMAO DO ACTIONSCRIPT 3.0 499


Trabalho com bitmaps

Com a imagem de origem carregada e sphere criada, a tarefa final executada pelo mtodo imageLoadComplete() a configurao da animao. A animao orientada pela ocorrncia de Timer chamada rotationTimer, que criada e iniciada pelo seguinte cdigo:
var rotationTimer:Timer = new Timer(15); rotationTimer.addEventListener(TimerEvent.TIMER, rotateMoon); rotationTimer.start();

O cdigo cria primeiro a ocorrncia de Timer chamada rotationTimer; o parmetro transmitido para o construtor Timer() indica que rotationTimer deve acionar seu evento timer a cada 15 milissegundos. Em seguida, o mtodo addEventListener() chamado, especificando que, quando o evento timer (TimerEvent.TIMER) ocorre, o mtodo rotateMoon() chamado. Por fim, o temporizado realmente iniciado chamando seu mtodo start(). Devido ao modo com rotationTimer est definido, aproximadamente a cada 15 milissegundos, o Flash Player chama o mtodo rotateMoon() na classe MoonSphere, que onde a animao da lua acontece. O cdigo-fonte do mtodo rotateMoon() o seguinte:
private function rotateMoon(event:TimerEvent):void { sourceX += 1; if (sourceX > textureMap.width / 2) { sourceX = 0; } sphere.bitmapData.copyPixels(textureMap, new Rectangle(sourceX, 0, sphere.width, sphere.height), new Point(0, 0)); event.updateAfterEvent(); }

O cdigo faz trs coisas:


1 O valor da varivel sourceX (inicialmente definido como 0) incrementado em 1.

PROGRAMAO DO ACTIONSCRIPT 3.0 500


Trabalho com bitmaps

sourceX += 1;

Como voc ver, sourceX usado para determinar o local em textureMap do qual os pixels sero copiados para sphere; portanto esse cdigo tem o efeito de mover o retngulo um pixel para a direita em textureMap. Voltando representao visual, depois de vrios ciclos de animao, o retngulo de origem ter se movido vrios pixels para a direita, como se segue:

Depois de vrios outros ciclos, o retngulo ter se movido para mais longe:

Esse deslocamento gradual, uniforme no local do qual os pixels so copiados a chave da animao. Movendo lenta e continuamente o local de origem para a direita, a imagem que exibida na tela em sphere parece deslizar continuamente para a esquerda. Essa a razo pela qual a imagem de origem (textureMap) precisa ter duas cpias da foto da superfcie da lua. Como o retngulo se move continuamente para a direita, a maioria das vezes ele no est sobre uma nica foto da lua, mas sobrepe as duas fotos da lua.
2 Com o retngulo de origem movendo-se lentamente para a direita, h um problema. Finalmente, o retngulo

atingir a borda direita de textureMap e ficar sem os pixels da foto da lua para copiar na sphere:

As linhas de cdigo a seguir solucionam esse problema:


if (sourceX >= textureMap.width / 2) { sourceX = 0; }

PROGRAMAO DO ACTIONSCRIPT 3.0 501


Trabalho com bitmaps

O cdigo verifica se sourceX (a borda esquerda do retngulo) atingiu o meio de textureMap. Em caso afirmativo, ele redefine sourceX para 0, movendo-o para a borda esquerda de textureMap e iniciando o ciclo novamente:

3 Com o valor sourceX apropriado calculado, a etapa final na criao da animao copiar realmente os pixels do

novo retngulo de origem para sphere. O cdigo que faz isso muito semelhante ao cdigo que inicialmente preenche sphere (descrito anteriormente); a nica diferena que nesse caso, na chamada do construtor new Rectangle(), a borda esquerda do retngulo colocada em sourceX:
sphere.bitmapData.copyPixels(textureMap, new Rectangle(sourceX, 0, sphere.width, sphere.height), new Point(0, 0));

Lembre-se de que esse cdigo chamada repetidamente a cada 15 milissegundos. Como o local do retngulo de origem deslocado de forma contnua, e os pixels so copiados em sphere, a aparncia na tela a de que a imagem da foto da lua representada por sphere desliza continuamente. Em outras palavras, a lua parece girar continuamente.

Criao da aparncia esfrica


A lua, claro, uma esfera e no um retngulo. Conseqentemente, a mostra precisa pegar a foto da superfcie da lua retangular, medida que animada continuamente, e convert-la em uma esfera. Isso envolve duas etapas separadas: uma mscara usada para ocultar todo o contedo exceto uma regio circular da foto da superfcie da lua, e um filtro de mapa de deslocamento usado para distorcer a aparncia da foto da lua para que ela parea tridimensional. Primeiro, uma mscara no formato de crculo usada para ocultar todo o contedo do objeto MoonSphere exceto a esfera criada pelo filtro. O cdigo a seguir cria a mscara como uma ocorrncia de Shape e a aplica como a mscara da ocorrncia MoonSphere:
moonMask = new Shape(); moonMask.graphics.beginFill(0); moonMask.graphics.drawCircle(0, 0, radius); this.addChild(moonMask); this.mask = moonMask;

Observe que, como MoonSphere um objeto de exibio (ele baseado na classe Sprite), a mscara pode ser aplicada diretamente ocorrncia de MoonSphere usando sua propriedade mask herdada.

PROGRAMAO DO ACTIONSCRIPT 3.0 502


Trabalho com bitmaps

Ocultar simplesmente partes da foto utilizando uma mscara em forma de crculo no suficiente para criar um efeito de esfera giratria realista. Devido forma como a foto da superfcie da lua foi tirada, suas dimenses no so proporcionais; as partes da imagem que esto mais prximas parte superior ou inferior da imagem so mais distorcidas e expandidas em comparao com as partes na linha do equador. Para distorcer a aparncia da foto da lua e torn-la tridimensional, usaremos um filtro de mapa de deslocamento. Um filtro de mapa de deslocamento um tipo de filtro utilizado para distorcer uma imagem. Nesse caso, a foto da lua ser "distorcida" para torn-la mais realista, comprimindo a parte superior e inferior da imagem horizontalmente, enquanto deixa o meio inalterado. Considerando que o filtro funciona em uma parte em formato de quadrado da foto, comprimir a parte superior e a inferior, mas no o meio, transformar o quadrado em um crculo. Um efeito colateral da animao dessa imagem distorcida que o meio da imagem parece mover-se para mais longe em distncia real de pixels do que as reas prximas parte superior e inferior, o que cria a iluso de que o crculo realmente um objeto tridimensional (uma esfera). O cdigo a seguir usado para criar o filtro do mapa de deslocamento chamado displaceFilter:
var displaceFilter:DisplacementMapFilter; displaceFilter = new DisplacementMapFilter(fisheyeLens, new Point(radius, 0), BitmapDataChannel.RED, BitmapDataChannel.GREEN, radius, 0);

Esse primeiro parmetro, fisheyeLens, conhecido como a imagem de mapa; nesse caso, um objeto BitmapData que criado de modo programtico. A criao daquela imagem descrita abaixo na seo Criao de uma imagem de bitmap pela definio de valores de pixel na pgina 503. Os outros parmetros descrevem a posio na imagem filtrada na qual o filtro deve ser aplicado, os canais de cor que sero utilizados para controlar o efeito do deslocamento e at qual extenso eles afetaro o deslocamento. Depois que o filtro de mapa de deslocamento criado, ele aplicado a sphere, ainda dentro do mtodo imageLoadComplete():
sphere.filters = [displaceFilter];

A imagem final, com a mscara e o filtro de mapa de deslocamento aplicados, se parece com:

Com cada ciclo de animao da lua giratria, o contedo de BitmapData da esfera sobregravado por um novo snapshot dos dados da imagem de origem. Contudo, o filtro no precisa ser reaplicado sempre. Isso porque o filtro aplicado ocorrncia de Bitmap (o objeto de exibio) em vez de aos dados do bitmap (as informaes em pixels no processadas). Lembre-se, a ocorrncia do Bitmap no so os dados reais de bitmap; ela uma objeto de exibio que mostra os dados de bitmap na tela. Para usar uma analogia, uma ocorrncia de Bitmap como o projeto de slides que usado para exibir slides fotogrficos em uma tela; um objeto BitmapData como o slide de fotografia real que pode ser apresentando por de um projetor de slide. Um filtro pode ser aplicado diretamente a um objeto BitmapData, que seria comparvel a desenhar diretamente no slide fotogrfico para alterar a imagem. Um filtro tambm pode ser

PROGRAMAO DO ACTIONSCRIPT 3.0 503


Trabalho com bitmaps

aplicado a qualquer objeto de exibio, inclusive uma ocorrncia de Bitmap; isso seria como colocar um filtro na frente das lentes do projetor de slides para distorcer a sada mostrada na tela (sem alterar o slide original). Como os dados de bitmap no processados esto acessveis por meio da propriedade bitmapData da ocorrncia de Bitmap, o filtro pode ter sido aplicado diretamente nos dados de bitmap no processados. Entretanto, nesse caso, faz sentido aplicar o filtro ao objeto de exibio Bitmap em vez dos dados de bitmap. Para obter informaes detalhadas sobre o uso de filtro de mapas de deslocamento no ActionScript, consulte Filtro de objetos de exibio na pgina 354.

Criao de uma imagem de bitmap pela definio de valores de pixel


Um importante aspecto de um filtro de mapa de deslocamento que ele realmente envolve duas imagens. Uma imagem, a imagem de origem, a imagem que ser realmente alterada pelo filtro. Nessa amostra, a imagem de origem a ocorrncia de Bitmap chamada sphere. A outra imagem usada pelo filtro conhecida como a imagem de mapa. A imagem do mapa no realmente exibida na ela. Em vez disso, a cor de cada um de seus pixels usada como uma entrada para a funo de deslocamento a cor do pixel em uma determinada coordenada x, y na imagem de mapa determina quanto de deslocamento (deslocamento fsico na posio) aplicado ao pixel naquelas coordenadas x, y na imagem de origem. Conseqentemente, para usar o filtro de mapa de deslocamento para criar um efeito de esfera, a amostra precisa de imagem de mapa apropriada aquela que tem um plano de fundo cinza e um crculo que preenchido com um gradiente de uma nica cor (vermelho) indo horizontalmente de escuro para claro, como mostrado aqui:

Como somente uma imagem e um filtro de mapa so utilizados nesta amostra, a imagem do mapa criada apenas uma vez, no mtodo imageLoadComplete() (em outras palavras, quando a imagem externa acabar de ser carregada. A imagem do mapa, chamada fisheyeLens, criada chamando o mtodo createFisheyeMap() da classe MoonSphere:
var fisheyeLens:BitmapData = createFisheyeMap(radius);

Dentro do mtodo createFisheyeMap(), a imagem de mapa desenhada um pixel por vez utilizando o mtodo setPixel() da classe BitmapData. O cdigo completo para o mtodo createFisheyeMap() listado aqui, seguido por uma discusso etapa por etapa de como ele funciona:

PROGRAMAO DO ACTIONSCRIPT 3.0 504


Trabalho com bitmaps

private function createFisheyeMap(radius:int):BitmapData { var diameter:int = 2 * radius; var result:BitmapData = new BitmapData(diameter, diameter, false, 0x808080); // Loop through the pixels in the image one by one for (var i:int = 0; i < diameter; i++) { for (var j:int = 0; j < diameter; j++) { // Calculate the x and y distances of this pixel from // the center of the circle (as a percentage of the radius). var pctX:Number = (i - radius) / radius; var pctY:Number = (j - radius) / radius; // Calculate the linear distance of this pixel from // the center of the circle (as a percentage of the radius). var pctDistance:Number = Math.sqrt(pctX * pctX + pctY * pctY); // If the current pixel is inside the circle, // set its color. if (pctDistance < 1) { // Calculate the appropriate color depending on the // distance of this pixel from the center of the circle. var red:int; var green:int; var blue:int; var rgb:uint; red = 128 * (1 + 0.75 * pctX * pctX * pctX / (1 - pctY * pctY)); green = 0; blue = 0; rgb = (red << 16 | green << 8 | blue); // Set the pixel to the calculated color. result.setPixel(i, j, rgb); } } } return result; }

Primeiro, quando o mtodo chamado, ele recebe um parmetro, radius, indicando o raio da imagem em forma de crculo a ser criado. Em seguida, o cdigo cria o objeto BitmapData no qual o crculo ser desenhado. Aquele objeto, chamado result, por fim transmitido de volta como o valor de retorno do mtodo. Como mostrado no snippet de cdigo a seguir, a ocorrncia de BitmapData de result criada com a largura e a altura to grandes quando o dimetro do crculo, sem transparncia (false para o terceiro parmetro), e preenchida com a cor 0x808080 (cinza mdio):

PROGRAMAO DO ACTIONSCRIPT 3.0 505


Trabalho com bitmaps

var result:BitmapData = new BitmapData(diameter, diameter, false, 0x808080);

Em seguida, o cdigo usa loops para iterar cada pixel da imagem. O loop externo engloba cada coluna da imagem da esquerda para a direita (utilizando a varivel i para representar a posio horizontal do pixel atualmente sendo manipulado), enquanto o loop interno engloba cada pixel da coluna atual de cima para baixo (com a varivel j representando a posio vertical de pixels atual). O cdigo para os loops (com o contedo do loop interno omitido) mostrado aqui:
for (var i:int = 0; i < diameter; i++) { for (var j:int = 0; j < diameter; j++) { ... } }

medida que o loop engloba os pixels um a um, em cada pixel um valor (o valor de cor daquele pixel na imagem de mapa) calculado. Esse processo envolve quatro etapas:
1 O cdigo calcula a distncia do pixel atual do centro do crculo ao longo do eixo x (i - radius). Esse valor

dividido pelo raio para torn-lo um percentual de raio em vez de uma distncia absoluta ((i - radius) /
radius). Esse valor de percentual armazenado em uma varivel chamada pctX, e o valor equivalente para o eixo

y calculado e armazenado na varivel pctY, como mostra este cdigo:


var pctX:Number = (i - radius) / radius; var pctY:Number = (j - radius) / radius;

2 Usando uma frmula trigonomtrica padro, o Teorema de Pitgoras, a distncia linear entre o cento do crculo e

o ponto atual calculado de pctX e pctY. Esse valor armazenado em uma varivel chamada pctDistance, como mostrado aqui:
var pctDistance:Number = Math.sqrt(pctX * pctX + pctY * pctY);

3 Em seguida, o cdigo verifica se o percentual de distncia menor do que 1 (significando 100% do raio, ou em

outras palavras, se o pixel sendo considerado est dentro do raio do crculo). Se o pixel estiver dentro do crculo, ele recebe um valor de cor calculado (omitido aqui, mas descrito na etapa 4); em caso negativo, nada mais acontece com aquele pixel; sua cor deixada como o padro de cinza mdio:
if (pctDistance < 1) { ... }

4 Para aqueles pixels que estiverem dentro do crculo, um valor de cor calculado para o pixel. A cor final ser uma

sombra de vermelho variando de preto (0% de vermelho) na borda esquerda do crculo at vermelho vivo (100%) na borda direita do crculo. O valor da cor inicialmente calculado em trs partes (vermelho, verde e azul), como mostrado aqui:BitmapData
red = 128 * (1 + 0.75 * pctX * pctX * pctX / (1 - pctY * pctY)); green = 0; blue = 0;

PROGRAMAO DO ACTIONSCRIPT 3.0 506


Trabalho com bitmaps

Observe que apenas a parte vermelha da cor (a varivel red) tem realmente um valor. Os valores de verde e azul (as variveis green e blue) so mostrados aqui para fins de explicao, mas podem ser omitidos. Como o propsito desse mtodo criar um crculo que contenha um gradiente vermelho, nenhum valor de verde ou azul necessrio. Depois que os trs valores de cores individuais estiverem determinados, eles sero combinados em um nico valor de cor inteiro utilizando um algoritmo de deslocamento de bits padro, mostrado neste cdigo:
rgb = (red << 16 | green << 8 | blue);

Finalmente, com o valor de cor calculado, aquele valor atribudo ao pixel atual utilizando o mtodo setPixel() do objeto result BitmapData, mostrado aqui:
result.setPixel(i, j, rgb);

507

Captulo 23: Trabalho em 3D (trs dimenses)


Noes bsicas de 3D
Introduo a 3D no ActionScript
A principal diferena entre um objeto bidimensional (2D) e um objeto tridimensional (3D) projetados em uma tela bidimensional a adio de uma terceira dimenso ao objeto. A terceira dimenso permite que o objeto se aproxime ou se afaste do ponto de viso do usurio. Quando voc define explicitamente a propriedade z de um objeto de exibio com um valor numrico, o objeto automaticamente cria uma matriz de transformao 3D. possvel alterar essa matriz para modificar as configuraes de transformao 3D do objeto. Alm disso, a rotao 3D diferente da rotao 2D. Em 2D, o eixo de rotao est sempre perpendicular ao plano x/y - em outras palavras, ele est no eixo z. Em 3D, o eixo de rotao pode estar em torno de qualquer um dos eixos x, y ou z. Definir as propriedades de rotao e dimensionamento de um objeto de exibio permite que ele se mova no espao 3D.

Tarefas comuns de 3D
As seguintes tarefas comuns relacionadas a 3D so exploradas neste captulo:

Criao de um objeto 3D Movimentao de um objeto no espao 3D Rotao de um objeto no espao 3D Representao da profundidade usando projeo em perspectiva Reordenao da lista de exibio para corresponder aos eixos z relacionados, de modo que os objetos apaream na
frente um dos outros corretamente para o usurio

Transformao de objetos 3D usando matrizes 3D Uso de vetores para manipular objetos no espao 3D Uso do mtodo Graphics.drawTriangles() para criar perspectiva Uso de mapeamento UV para adicionar texturas de bitmap a um objeto 3D Definir o parmetro de remoo do mtodo Graphics.drawTriangles() para agilizar a renderizao e ocultar
partes de um objeto 3D opostas ao ponto de viso atual

Termos e conceitos importantes


A lista de referncia a seguir contm termos importantes usados neste captulo:

perspectiva: em um plano 2D, a representao de linhas paralelas como convergentes em um ponto de fuga para
dar a iluso de profundidade e distncia

PROGRAMAO DO ACTIONSCRIPT 3.0 508


Trabalho em 3D (trs dimenses)

projeo: a produo de uma imagem 2D de um objeto de dimenses maiores; a projeo 3D mapeia pontos 3D
para um plano 2D

rotao: alterar a orientao (e, muitas vezes, a posio) de um objeto movendo cada ponto includo nele em
movimento circular

transformao: alterar pontos 3D ou conjuntos de pontos por translao, rotao, escala, inclinao ou uma
combinao destas aes

translao: alterar a posio de um objeto movendo cada ponto includo nele da mesma forma e na mesma direo ponto de fuga: ponto em que linhas paralelas recuadas parecem se encontrar quando representadas em perspectiva
linear

vetor: um vetor 3D representa um ponto ou um local no espao tridimensional com as coordenadas cartesianas x,
y e z.

vrtice: um ponto de canto malha com textura: qualquer ponto que define um objeto no espao 3D mapeamento UV: uma forma de aplicar textura ou bitmap a uma superfcie 3D. O mapeamento UV atribui valores
a coordenadas de uma imagem como porcentagens dos eixos horizontal (U) e vertical (V).

valor T: o fator de dimensionamento para determinar o tamanho de um objeto 3D medida que ele se aproxima,
ou se afasta, do ponto de viso atual

remoo: renderizao, ou no, de superfcies com contorno especfico. O uso da remoo pode ocultar superfcies
que no esto visveis para o ponto de viso atual.

Noes bsicas sobre os recursos 3D do Flash Player e o runtime do AIR


Nas verses do Flash Player anteriores ao Flash Player 10, os objetos de exibio tm duas propriedades, x e y, para posicion-los em um plano 2D. A partir do Flash Player 10, todo objeto de exibio do ActionScript tem uma propriedade z que permite posicion-lo ao longo do eixo z, normalmente usado para indicar profundidade ou distncia. O Flash Player 10 introduz o suporte para efeitos 3D. No entanto, os objetos de exibio so inerentemente planos. Cada objeto de exibio, como MovieClip ou Sprite, basicamente renderiza-se em duas dimenses em um nico plano. Os recursos 3D permitem colocar, movimentar, girar e transformar todos esses objetos planos em tridimensionais. Eles tambm permitem gerenciar pontos 3D e convert-los em coordenadas x, y 2D para que voc possa projetar objetos 3D em uma exibio 2D. possvel simular muitos tipos de experincias 3D usando esses recursos. O sistema de coordenadas 3D usado pelo ActionScript difere do de outros sistemas. Quando so usadas coordenadas 2D no ActionScript, o valor de x aumenta medida que voc vai para a direita no eixo x, e o valor de y aumenta conforme voc percorre o eixo y. O sistema de coordenadas 3D retm essas convenes e adiciona um eixo z cujo valor aumenta medida que voc se afasta do ponto de viso.

PROGRAMAO DO ACTIONSCRIPT 3.0 509


Trabalho em 3D (trs dimenses)

(0,0,0)
C B

As direes positivas dos eixos x, y e z no sistema de coordenadas 3D do ActionScript. A. Eixo +Z B. Origem C. Eixo +X D. Eixo +Y

Nota: O Flash Player e o AIR sempre representam 3D em camadas. Isso significa que, se o objeto A est na frente do objeto B na lista de exibio, o Flash Player ou o AIR sempre renderiza A na frente de B, independentemente dos valores do eixo z dos dois objetos. Para resolver este conflito entre a ordem na lista de exibio e a ordem no eixo z, use o mtodo transform.getRelativeMatrix3D() para salvar e reordenar as camadas de objetos de exibio 3D. Para obter mais informaes, consulte Uso de objetos Matrix3D para reordenar a exibio na pgina 518. As seguintes classes do ActionScript do suporte aos novos recursos relacionados a 3D:
1 A classe flash.display.DisplayObject contm a propriedade z e novas propriedades de rotao e dimensionamento

para manipular objetos de exibio no espao 3D. O mtodo DisplayObject.local3DToGlobal() oferece uma maneira simples de projetar geometria 3D em um plano 2D.
2 A classe flash.geom.Vector3D pode ser usada como estrutura de dados para gerenciar pontos 3D. Ela tambm

oferece suporte para matemtica de vetores.


3 A classe flash.geom.Matrix3D d suporte a transformaes complexas de geometria 3D, como rotao,

dimensionamento e translao.
4 A classe flash.geom.PerspectiveProjection controla os parmetros para mapear geometria 3D em uma exibio 2D.

Existem duas abordagens distintas para simular imagens 3D no ActionScript:


1 Organizar e animar objetos planos no espao 3D. Esta abordagem envolve animar objetos de exibio usando as

propriedades x, y e z de objetos de exibio ou definir propriedades de rotao e dimensionamento utilizando a classe DisplayObject. possvel obter movimentos mais complexos usando o objeto DisplayObject.transform.matrix3D. O objeto DisplayObject.transform.perspectiveProjection personaliza a forma como os objetos de exibio so desenhados em perspectiva 3D. Use esta abordagem quando quiser animar objetos 3D formados principalmente por planos. Exemplos desta abordagem incluem galerias de imagens 3D ou objetos de animao 2D organizados no espao 3D.
2 Gerar tringulos 2D a partir de geometria 3D e renderiz-los com texturas. Para usar esta abordagem, primeiro voc

deve definir e gerenciar dados sobre objetos 3D e, em seguida, converter esses dados em tringulos 2D para fins de renderizao. possvel mapear texturas de bitmap para esses tringulos, e depois eles so desenhados em um objeto grfico atravs do mtodo Graphics.drawTriangles(). Exemplos desta abordagem incluem carregar dados de modelo 3D a partir de um arquivo e renderizar o modelo na tela ou gerar e desenhar um terreno 3D como malhas de tringulo.

PROGRAMAO DO ACTIONSCRIPT 3.0 510


Trabalho em 3D (trs dimenses)

Criao e movimentao de objetos 3D


Para converter um objeto de exibio 2D em um objeto de exibio 3D, voc pode definir explicitamente a propriedade z correspondente com um valor numrico. Quando voc atribui um valor para a propriedade z, criado um novo objeto Transform para o objeto de exibio. Definir as propriedades DisplayObject.rotationX ou DisplayObject.rotationY tambm cria um novo objeto Transform. O objeto Transform contm uma propriedade Matrix3D que determina como o objeto de exibio representado no espao 3D. O seguinte cdigo define as coordenadas para um objeto de exibio chamado leaf (folha):
leaf.x = 100; leaf.y = 50; leaf.z = -30;

Voc pode ver estes valores, bem como as propriedades derivadas deles, na propriedade matrix3D do objeto Transform da folha:
var leafMatrix:Matrix3D = leaf.transform.matrix3D;

trace(leafMatrix.position.x); trace(leafMatrix.position.y); trace(leafMatrix.position.z); trace(leafMatrix.position.length); trace(leafMatrix.position.lengthSquared);

Para obter informaes sobre as propriedades do objeto Transform, consulte a classe Transform. Para obter informaes sobre as propriedades do objeto Matrix3D, consulte a classe Matrix3D.

Movimentao de um objeto no espao 3D


possvel movimentar um objeto no espao 3D alterando os valores de suas propriedades x, y ou z. Quando voc altera o valor da propriedade z, o objeto parece aproximar-se ou afastar-se do visualizador. O cdigo a seguir movimenta duas elipses para frente e para trs ao longo dos eixos z alterando o valor das respectivas propriedades z em resposta a um evento. ellipse2 movimenta-se mais rpido do que ellipse1: sua propriedade z aumentada por um mltiplo de 20 em cada evento Frame, enquanto a propriedade z de ellipse1 aumentada por um mltiplo de 10:

PROGRAMAO DO ACTIONSCRIPT 3.0 511


Trabalho em 3D (trs dimenses)

var depth:int = 1000; function ellipse1FrameHandler(e:Event):void { ellipse1Back = setDepth(e, ellipse1Back); e.currentTarget.z += ellipse1Back * 10; } function ellipse2FrameHandler(e:Event):void { ellipse2Back = setDepth(e, ellipse1Back); e.currentTarget.z += ellipse1Back * 20; } function setDepth(e:Event, d:int):int { if(e.currentTarget.z > depth) { e.currentTarget.z = depth; d = -1; } else if (e.currentTarget.z < 0) { e.currentTarget.z = 0; d = 1; } }

Rotao de um objeto no espao 3D


possvel girar um objeto de trs formas diferentes, dependendo de como voc definir as propriedades de rotao do objeto: rotationX, rotationY e rotationZ. A figura abaixo mostra dois quadrados que no so girados:

A prxima figura mostra os dois quadrados quando voc incrementa a propriedade rotationY do continer dos quadrados para gir-los no eixo y. Girar o continer, ou o objeto de exibio pai, dos dois quadrados gira ambos os quadrados:
container.rotationY += 10;

PROGRAMAO DO ACTIONSCRIPT 3.0 512


Trabalho em 3D (trs dimenses)

A prxima figura mostra o que acontece quando voc define a propriedade rotationX do continer dos quadrados. Isso gira os quadrados no eixo x.

A prxima figura mostra o que acontece quando voc incrementa a propriedade rotationZ do continer dos quadrados. Isso gira os quadrados no eixo z.

Um objeto de exibio pode, ao mesmo tempo, se movimentar e girar no espao 3D.

Projeo de objetos 3D em uma exibio 2D


A classe PerspectiveProjection do pacote flash.geom oferece uma maneira simples de aplicar perspectiva rudimentar quando voc movimenta objetos de exibio pelo espao 3D. Caso voc no crie uma projeo em perspectiva para o espao 3D explicitamente, o mecanismo 3D usar um objeto PerspectiveProjection padro que existe na raiz e propagado para todos os seus filhos. As trs propriedades que definem como um objeto PerspectiveProjection exibe o espao 3D so:

fieldOfView projectionCenter focalLength

Modificar o valor de fieldOfView modifica automaticamente o valor de focalLength e vice-versa, uma vez que elas so interdependentes. A frmula usada para calcular a propriedade focalLength considerando-se o valor de fieldOfView a seguinte:
focalLength = stageWidth/2 * (cos(fieldOfView/2) / sin(fieldOfView/2)

Normalmente voc modificaria a propriedade fieldOfView de maneira explcita.

Campo de viso
Manipulando a propriedade fieldOfView da classe PerspectiveProjection, possvel fazer com que um objeto de exibio 3D que est se aproximando do visualizador parea maior e com que um objeto que est se afastando do visualizador parea menor.

PROGRAMAO DO ACTIONSCRIPT 3.0 513


Trabalho em 3D (trs dimenses)

A propriedade fieldOfView especifica um ngulo entre 0 e 180 graus que determina a intensidade da projeo em perspectiva. Quanto maior o valor, mais intensa a distoro aplicada a um objeto de exibio que se movimenta em seu eixo z. Um valor baixo de fieldOfView resulta em um dimensionamento muito pequeno e faz com que os objetos paream se movimentar apenas um pouco para trs no espao. Um valor alto de fieldOfView gera mais distoro e o aspecto de maior movimento. O valor mximo de 180 graus gera um efeito de lente de cmera olho de peixe exagerado.

Centro da projeo
A propriedade projectionCenter representa o ponto de fuga na projeo em perspectiva. Ela aplicada como um deslocamento at o ponto de registro padro (0,0) no canto superior esquerdo do palco. Conforme um objeto parece se afastar do visualizador, ele se movimenta em direo ao ponto de fuga e, por fim, desaparece. Imagine um corredor infinitamente longo. Quando voc olha para o final dele, as extremidades das paredes se convergem em um ponto de fuga no final do corredor. Se o ponto de fuga est no centro do palco, o corredor desaparece em direo a um ponto no centro. O valor padro da propriedade projectionCenter o centro do palco. Se, por exemplo, voc quiser que os elementos apaream no lado esquerdo do palco e que uma rea 3D aparea no lado direito, defina projectionCenter como um ponto no lado direito do palco para torn-lo o ponto de fuga da sua rea de exibio 3D.

Distncia focal
A propriedade focalLength representa a distncia entre a origem do ponto de viso (0,0,0) e a localizao do objeto de exibio em seu eixo z. Uma distncia focal longa como uma teleobjetiva com uma visualizao limitada e distncias reduzidas entre objetos. Uma distncia focal curta como uma lente com grande abertura angular, com a qual voc tem uma visualizao ampla com muita distoro. Uma distncia focal mdia assemelha-se ao que os olhos humanos vem. Normalmente, a propriedade focalLength recalculada dinamicamente durante a transformao de perspectiva medida que o objeto de exibio se movimenta, mas possvel defini-la de forma explcita.

Valores padro da projeo em perspectiva


O objeto PerspectiveProjection padro criado na raiz tem os seguintes valores:

fieldOfView: 55 perspectiveCenter: stagewidth/2, stageHeight/2 focalLength: stageWidth/ 2 * ( cos(fieldOfView/2) / sin(fieldOfView/2) )

Esses so os valores que sero utilizados se voc no criar seu prprio objeto PerspectiveProjection. possvel instanciar seu prprio objeto PerspectiveProjection com a inteno de voc mesmo modificar projectionCenter e fieldOfView. Nesse caso, os valores padro do objeto recm-criado so os seguintes, de acordo com um tamanho de palco padro de 500 por 500:

fieldOfView: 55 perspectiveCenter: 250,250 focalLength: 480.24554443359375

PROGRAMAO DO ACTIONSCRIPT 3.0 514


Trabalho em 3D (trs dimenses)

Exemplo: Projeo em perspectiva


O exemplo a seguir demonstra o uso da projeo em perspectiva para criar o espao 3D. Ele mostra como voc pode modificar o ponto de fuga e alterar a projeo em perspectiva do espao atravs da propriedade projectionCenter. Essa modificao fora o reclculo das propriedades focalLength e fieldOfView com a distoro concomitante do espao 3D. Este exemplo:
1 Cria uma entidade grfica chamada center, como um crculo com cruzes 2 Atribui as coordenadas da entidade grfica center propriedade projectionCenter da

propriedadeperspectiveProjection da propriedade transform da raiz


3 Adiciona ouvintes de eventos para eventos de mouse que chamam manipuladores que modificam a propriedade
projectionCenter para que ela siga a localizao do objeto center

4 Cria quatro caixas com o estilo acordeo que formam as paredes do espao em perspectiva

Quando voc testar este exemplo, ProjectionDragger.swf, arraste o crculo para diferentes locais. O ponto de fuga segue o crculo, parando no lugar em que voc solt-lo. Observe as caixas que circundam o espao se alongam e se tornam distorcidas quando voc afasta o centro de projeo do centro do palco. Para obter os arquivos de aplicativo deste exemplo, consulte www.adobe.com/go/learn_programmingAS3samples_flash_br. Os arquivos do aplicativo ProjectionDragger esto na pasta Samples/ProjectionDragger.
package { import flash.display.Sprite; import flash.display.Shape; import flash.geom.Point; import flash.events.*; public class ProjectionDragger extends Sprite { private var center : Sprite; private var boxPanel:Shape; private var inDrag:Boolean = false; public function ProjectionDragger():void { createBoxes(); createCenter(); } public function createCenter():void { var centerRadius:int = 20; center = new Sprite(); // circle center.graphics.lineStyle(1, 0x000099); center.graphics.beginFill(0xCCCCCC, 0.5); center.graphics.drawCircle(0, 0, centerRadius); center.graphics.endFill(); // cross hairs center.graphics.moveTo(0, centerRadius); center.graphics.lineTo(0, -centerRadius); center.graphics.moveTo(centerRadius, 0);

PROGRAMAO DO ACTIONSCRIPT 3.0 515


Trabalho em 3D (trs dimenses)

center.graphics.lineTo(-centerRadius, 0); center.x = 175; center.y = 175; center.z = 0; this.addChild(center); center.addEventListener(MouseEvent.MOUSE_DOWN, startDragProjectionCenter); center.addEventListener(MouseEvent.MOUSE_UP, stopDragProjectionCenter); center.addEventListener( MouseEvent.MOUSE_MOVE, doDragProjectionCenter); root.transform.perspectiveProjection.projectionCenter = new Point(center.x, center.y); } public function createBoxes():void { // createBoxPanel(); var boxWidth:int = 50; var boxHeight:int = 50; var numLayers:int = 12; var depthPerLayer:int = 50; // var boxVec:Vector.<Shape> = new Vector.<Shape>(numLayers); for (var i:int = 0; i < numLayers; i++) { this.addChild(createBox(150, 50, (numLayers - i) * depthPerLayer, boxWidth, 0xCCCCFF)); this.addChild(createBox(50, 150, (numLayers - i) * depthPerLayer, boxWidth, 0xFFCCCC)); this.addChild(createBox(250, 150, (numLayers - i) * depthPerLayer, boxWidth, 0xCCFFCC)); this.addChild(createBox(150, 250, (numLayers - i) * depthPerLayer, boxWidth, 0xDDDDDD)); }

boxHeight, boxHeight, boxHeight, boxHeight, }

public function createBox(xPos:int = 0, yPos:int = 0, zPos:int = 100, w:int = 50, h:int = 50, color:int = 0xDDDDDD):Shape { var box:Shape = new Shape(); box.graphics.lineStyle(2, 0x666666); box.graphics.beginFill(color, 1.0); box.graphics.drawRect(0, 0, w, h); box.graphics.endFill(); box.x = xPos; box.y = yPos; box.z = zPos; return box; } public function startDragProjectionCenter(e:Event) { center.startDrag(); inDrag = true;

PROGRAMAO DO ACTIONSCRIPT 3.0 516


Trabalho em 3D (trs dimenses)

} public function doDragProjectionCenter(e:Event) { if (inDrag) { root.transform.perspectiveProjection.projectionCenter = new Point(center.x, center.y); } } public function stopDragProjectionCenter(e:Event) { center.stopDrag(); root.transform.perspectiveProjection.projectionCenter = new Point(center.x, center.y); inDrag = false; } } }

Para projeo em perspectiva mais complexa, use a classe Matrix3D.

Execuo de transformaes 3D complexas


A classe Matrix3D permite transformar pontos 3D dentro de um espao de coordenadas ou mapear pontos 3D de um espao de coordenadas para outro. Voc no precisa conhecer a matemtica de matrizes para usar a classe Matrix3D. A maior parte das operaes de transformao comuns pode ser feita usando-se os mtodos da classe. Voc no precisa se preocupar em definir ou calcular explicitamente os valores de cada elemento da matriz. Depois de definir a propriedade z de um objeto de exibio como um valor numrico, voc pode recuperar a matriz de transformao dele usando a propriedade Matrix3D do objeto Transform do objeto de exibio:
var leafMatrix:Matrix3D = this.transform.matrix3D;

Voc pode usar os mtodos do objeto Matrix3D para executar translao, rotao, dimensionamento e projeo em perspectiva no objeto de exibio. Use a classe Vector3D com suas propriedades x, y e z para gerenciar pontos 3D. Ela tambm pode representar um vetor espacial na fsica, que tem uma direo e uma magnitude. Os mtodos da classe Vector3D permitem executar clculos comuns com vetores espaciais, como clculos de adio, produto escalar e produto complementar. Nota: A classe Vector3D no est relacionada classe Vector do ActionScript. A classe Vector3D contm propriedades e mtodos para definir e manipular pontos 3D, enquanto a classe Vector oferece suporte a matrizes de objetos com tipo.

Criao de objetos Matrix3D


H trs principais maneiras de criar ou recuperar objetos Matrix3D:
1 Use o mtodo do construtor Matrix3D() para instanciar uma nova matriz. O construtor Matrix3D() toma um

objeto Vector que contm 16 valores numricos e coloca cada valor em uma clula da matriz. Por exemplo:
var rotateMatrix:Matrix3D = new Matrix3D(1,0,0,1, 0,1,0,1, 0,0,1,1, 0,0,0,1);

PROGRAMAO DO ACTIONSCRIPT 3.0 517


Trabalho em 3D (trs dimenses)

2 Defina o valor da propriedade z de um objeto de exibio. Em seguida, recupere a matriz de transformao da

propriedade transform.matrix3D desse objeto.


3 Recupere o objeto Matrix3D que controla a exibio de objetos 3D no palco obtendo o valor da propriedade
perspectiveProjection.matrix3D do objeto de exibio raiz.

Aplicao de vrias transformaes 3D


possvel aplicar muitas transformaes 3D de uma s vez usando um objeto Matrix3D. Por exemplo, para girar, dimensionar e, depois, movimentar um cubo, voc pode aplicar trs transformaes separadas a cada ponta do cubo. No entanto, muito mais eficiente pr-calcular vrias transformaes em um objeto Matrix3D e, em seguida, executar uma transformao de matriz em cada uma das pontas. Nota: A ordem em que as transformaes de matriz so aplicadas importante. Os clculos de matriz no so comutativos. Por exemplo, o resultado de aplicar uma rotao seguida de uma translao diferente do resultado de aplicar a mesma translao seguida da mesma rotao. O exemplo a seguir mostra duas maneiras de executar vrias transformaes 3D.
package { import import import import flash.display.Sprite; flash.display.Shape; flash.display.Graphics; flash.geom.*;

public class Matrix3DTransformsExample extends Sprite { private var rect1:Shape; private var rect2:Shape; public function Matrix3DTransformsExample():void { var pp:PerspectiveProjection = this.transform.perspectiveProjection; pp.projectionCenter = new Point(275,200); this.transform.perspectiveProjection = pp; rect1 = new Shape(); rect1.x = -70; rect1.y = -40; rect1.z = 0; rect1.graphics.beginFill(0xFF8800); rect1.graphics.drawRect(0,0,50,80); rect1.graphics.endFill(); addChild(rect1); rect2 = new Shape(); rect2.x = 20; rect2.y = -40; rect2.z = 0; rect2.graphics.beginFill(0xFF0088); rect2.graphics.drawRect(0,0,50,80); rect2.graphics.endFill(); addChild(rect2);

PROGRAMAO DO ACTIONSCRIPT 3.0 518


Trabalho em 3D (trs dimenses)

doTransforms(); } private function doTransforms():void { rect1.rotationX = 15; rect1.scaleX = 1.2; rect1.x += 100; rect1.y += 50; rect1.rotationZ = 10; var matrix:Matrix3D = rect2.transform.matrix3D; matrix.appendRotation(15, Vector3D.X_AXIS); matrix.appendScale(1.2, 1, 1); matrix.appendTranslation(100, 50, 0); matrix.appendRotation(10, Vector3D.Z_AXIS); rect2.transform.matrix3D = matrix; } } }

No mtodo doTransforms(), o primeiro bloco de cdigo usa as propriedades DisplayObject para alterar a rotao, o dimensionamento e a posio de uma forma de retngulo. O segundo bloco de cdigo usa os mtodos da classe Matrix3D para fazer as mesmas transformaes. A principal vantagem de usar os mtodos Matrix3D que todos os clculos so realizados primeiro na matriz. Em seguida, eles so aplicados ao objeto de exibio apenas uma vez, quando sua propriedade transform.matrix3D definida. Configurar propriedades DisplayObject torna a leitura do cdigo-fonte um pouco mais simples. Todavia, sempre que definida uma propriedade de rotao ou dimensionamento, ela gera vrios clculos e altera diversas propriedades do objeto de exibio. Se o seu cdigo aplicar as mesmas transformaes complexas a objetos de exibio mais de uma vez, salve o objeto Matrix3D como uma varivel e, em seguida, aplique-o de novo repetidas vezes.

Uso de objetos Matrix3D para reordenar a exibio


Conforme mencionado anteriormente, a ordem em camadas dos objetos de exibio na lista de exibio determina a ordem em camadas da exibio, independentemente dos eixos x relacionados. Se a sua animao transforma as propriedades de objetos de exibio em uma ordem diferente da ordem da lista de exibio, o visualizador poder ver os objetos de exibio em uma disposio em camadas que no corresponde disposio em camadas no eixo z. Por isso, um objeto que deve parecer mais distante do visualizador pode aparecer na frente de um objeto que est mais perto do visualizador. Para assegurar que a disposio em camadas dos objetos de exibio 3D corresponda s profundidades relativas dos objetos, use uma abordagem como a seguinte:
1 Use o mtodo getRelativeMatrix3D() do objeto Transform para obter os eixos z relacionados dos objetos de

exibio 3D filho.
2 Use o mtodo removeChild() para remover os objetos da lista de exibio. 3 Classifique os objetos de exibio com base nos valores do eixo z relacionado. 4 Use o mtodo addChild() para adicionar os filhos de volta lista de exibio na ordem inversa.

Essa reordenao assegura que seus objetos sero exibidos de acordo com os eixos z relacionados.

PROGRAMAO DO ACTIONSCRIPT 3.0 519


Trabalho em 3D (trs dimenses)

O cdigo a seguir fora a exibio correta das seis faces de uma caixa 3D. Ele reordena as faces da caixa depois que rotaes foram aplicadas a ela:
public var faces:Array; . . . public function ReorderChildren() { for(var ind:uint = 0; ind < 6; ind++) { faces[ind].z = faces[ind].child.transform.getRelativeMatrix3D(root).position.z; this.removeChild(faces[ind].child); } faces.sortOn("z", Array.NUMERIC | Array.DESCENDING); for (ind = 0; ind < 6; ind++) { this.addChild(faces[ind].child); } }

Para obter os arquivos de aplicativo deste exemplo, consulte www.adobe.com/go/learn_programmingAS3samples_flash_br. Os arquivos do aplicativo esto na pasta Samples/ReorderByZ.

Uso de tringulos para obter efeitos 3D


No ActionScript, voc executa transformaes de bitmap usando o mtodo Graphics.drawTriangles(), pois os modelos 3D so representados por um conjunto de tringulos no espao. (Contudo, o Flash Player e o AIR no do suporte a um buffer de profundidade, por isso os objetos de exibio so inerentemente planos, ou 2D. Isto descrito em Noes bsicas sobre os recursos 3D do Flash Player e o runtime do AIR na pgina 508.) O mtodo Graphics.drawTriangles() parecido com o mtodo Graphics.drawPath() no sentido de que usa um conjunto de coordenadas para desenhar um caminho de tringulo. Para se familiarizar com o uso de Graphics.drawPath(), consulte Caminhos de desenho na pgina 335. O mtodo Graphics.drawTriangles() usa um Vector.<Number> para especificar as localizaes das pontas para o caminho do tringulo:
drawTriangles(vertices:Vector.<Number>, indices:Vector.<int> = null, uvtData:Vector.<Number> = null, culling:String = "none"):void

O primeiro parmetro de drawTriangles() o nico necessrio: o parmetro vertices. Este parmetro um vetor de nmeros que define as coordenadas atravs das quais os seus tringulos so desenhados. Cada trs conjuntos de coordenadas (seis nmeros) representa um caminho de tringulo. Sem o parmetro indices, o comprimento do vetor deve sempre ser um fator de seis, uma vez que cada tringulo requer trs pares de coordenadas (trs conjuntos de dois valores x/y). Por exemplo:
graphics.beginFill(0xFF8000); graphics.drawTriangles( Vector.<Number>([ 10,10, 100,10, 10,100, 110,10, 110,100, 20,100]));

Nenhum desses tringulos compartilham pontas, mas, se compartilhassem, o segundo parmetro de drawTriangles(), indices, poderia ser usado para reutilizar valores do vetor vertices para mais de um tringulo.

PROGRAMAO DO ACTIONSCRIPT 3.0 520


Trabalho em 3D (trs dimenses)

Quando usar o parmetro indices, importante que voc saiba que os valores de indices so ndices de pontos e no ndices relacionados diretamente aos elementos de matriz vertices. Em outras palavras, um ndice no vetor vertices conforme definido por indices , na verdade, o ndice real dividido por 2. Para a terceira ponta de um vetor vertices, por exemplo, use um valor de 2 para indices, mesmo que o primeiro valor numrico dessa ponta comece no ndice de vetor de 4. Por exemplo, mescle dois tringulos para que compartilhem a aresta diagonal usando o parmetro indices:
graphics.beginFill(0xFF8000); graphics.drawTriangles( Vector.<Number>([10,10, 100,10, 10,100, 100,100]), Vector.<int>([0,1,2, 1,3,2]));

Observe que, apesar de agora ter sido desenhado um quadrado usando-se dois tringulos, somente quatro pontas foram especificadas no vetor vertices. Usando indices, as duas pontas compartilhadas pelos dois tringulos so reutilizadas para cada tringulo. Isso diminui a contagem geral de vrtices de 6 (12 nmeros) para 4 (8 nmeros):

Um quadrado desenhado com dois tringulos usando o parmetro vertices

Esta tcnica torna-se til com malhas de tringulos maiores, onde a maioria das pontas so compartilhadas por vrios tringulos. Todos os preenchimentos podem ser aplicados a tringulos. Os preenchimentos so aplicados malha de tringulos resultante, assim como ocorre com qualquer outra forma.

Transformao de bitmaps
As transformaes de bitmap do a iluso de perspectiva ou "textura" em um objeto tridimensional. Especificamente, voc pode distorcer um bitmap em direo a um ponto de fuga de modo que a imagem parea diminuir medida que se aproxima do ponto de fuga. Se preferir, voc pode usar um bitmap bidimensional para criar uma superfcie para um objeto tridimensional, dando a iluso de textura ou wrapping nesse objeto 3D.

Uma superfcie bidimensional usando um ponto de fuga e um objeto tridimensional delimitado com um bitmap.

PROGRAMAO DO ACTIONSCRIPT 3.0 521


Trabalho em 3D (trs dimenses)

Mapeamento UV
Depois que comear a trabalhar com texturas, voc desejar usar o parmetro uvtData de drawTriangles(). Esse parmetro permite configurar o mapeamento UV para preenchimentos de bitmap. O mapeamento UV um mtodo de aplicar textura a objetos. Ele se baseia em dois valores: um valor horizontal U (x) e um valor vertical V (y). Em vez de serem baseados em valores de pixel, eles so baseados em porcentagens. 0 U e 0 V o canto superior esquerdo de uma imagem, e 1 U e 1 V o canto inferior direito:

As localizaes UV 0 e 1 em uma imagem de bitmap

Os vetores de um tringulo podem receber coordenadas UV para se associarem s respectivas localizaes em uma imagem:

As coordenadas UV de uma rea triangular de uma imagem de bitmap

Os valores UV permanecem consistentes com as pontas do tringulo:

Os vrtices do tringulo so movimentados e o bitmap distorcido para manter iguais os valores UV de uma ponta individual

Conforme transformaes 3D do ActionScript so aplicadas ao tringulo associado ao bitmap, a imagem do bitmap aplicada ao tringulo com base nos valores UV. Portanto, em vez de usar clculos de matriz, defina ou ajuste os valores UV para criar um efeito tridimensional.

PROGRAMAO DO ACTIONSCRIPT 3.0 522


Trabalho em 3D (trs dimenses)

O mtodo Graphics.drawTriangles() tambm aceita uma informao opcional para transformaes tridimensionais: o valor T. O valor T em uvtData representa a perspectiva 3D ou, mais especificamente, o fator de escala do vrtice associado. O mapeamento UVT adiciona correo de perspectiva ao mapeamento UV. Por exemplo, se um objeto estiver posicionado no espao 3D longe do ponto de viso, de modo que parea ter 50% de seu tamanho original, o valor T desse objeto ser 0,5. Uma vez que tringulos so desenhados para representar objetos no espao 3D, sua localizao no eixo z determina seus valores T. A equao que determina o valor T a seguinte:
T = focalLength/(focalLength + z);

Nesta equao, focalLength representa uma distncia focal ou uma localizao "na tela" calculada, que determina o grau da perspectiva observado na exibio.
A B C

A distncia focal e o valor z A. ponto de viso B. tela C. Objeto 3D D. valor de focalLength E. valor z

O valor de T usado para dimensionar formas bsicas para fazer com que paream mais distantes. Normalmente o valor usado para converter pontos 3D em pontos 2D. No caso de dados UVT, tambm usado para dimensionar um bitmap entre as pontas de um tringulo com perspectiva. Quando voc define valores UVT, o valor T segue diretamente os valores UV definidos para um vrtice. Com a incluso de T, cada trs valores no parmetro uvtData (U, V e T) correspondem a cada dois valores no parmetro vertices (x e y). Com valores UV apenas, uvtData.length == vertices.length. Com a incluso de um valor T, uvtData.length = 1,5*vertices.length.

Exemplo: Um bitmap girando com perspectiva


O exemplo a seguir mostra um plano sendo girado no espao 3D usando dados UVT. Este exemplo usa uma imagem chamada ocean.jpg e uma classe auxiliar (ImageLoader) para carregar a imagem de maneira que ela possa ser atribuda ao objeto BitmapData. Este o cdigo-fonte da classe ImageLoader (salve-o em um arquivo chamado ImageLoader.as):

PROGRAMAO DO ACTIONSCRIPT 3.0 523


Trabalho em 3D (trs dimenses)

package { import flash.display.* import flash.events.*; import flash.net.URLRequest; public class ImageLoader extends Sprite { public var url:String; public var bitmap:Bitmap; public function ImageLoader(loc:String = null) { if (loc != null){ url = loc; loadImage(); } } public function loadImage():void{ if (url != null){ var loader:Loader = new Loader(); loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete); loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, onIoError); var req:URLRequest = new URLRequest(url); loader.load(req); } } private function onComplete(event:Event):void { var loader:Loader = Loader(event.target.loader); var info:LoaderInfo = LoaderInfo(loader.contentLoaderInfo); this.bitmap = info.content as Bitmap; this.dispatchEvent(new Event(Event.COMPLETE)); } private function onIoError(event:IOErrorEvent):void { trace("onIoError: " + event); } } }

E este o ActionScript que usa tringulos, mapeamento UV e valores T para fazer com que a imagem parea estar diminuindo medida que se aproxima de um ponto de fuga e girando. Salve este cdigo em um arquivo denominado Spinning3dOcean.as:

PROGRAMAO DO ACTIONSCRIPT 3.0 524


Trabalho em 3D (trs dimenses)

package { import flash.display.* import flash.events.*; import flash.utils.getTimer; public class Spinning3dOcean extends Sprite { // plane vertex coordinates (and t values) var x1:Number = -100,y1:Number = -100,z1:Number = 0,t1:Number = 0; var x2:Number = 100,y2:Number = -100,z2:Number = 0,t2:Number = 0; var x3:Number = 100,y3:Number = 100,z3:Number = 0,t3:Number = 0; var x4:Number = -100,y4:Number = 100,z4:Number = 0,t4:Number = 0; var focalLength:Number = 200; // 2 triangles for 1 plane, indices will always be the same var indices:Vector.<int>; var container:Sprite; var bitmapData:BitmapData; // texture var imageLoader:ImageLoader; public function Spinning3dOcean():void { indices = new Vector.<int>(); indices.push(0,1,3, 1,2,3); container = new Sprite(); // container to draw triangles in container.x = 200; container.y = 200; addChild(container); imageLoader = new ImageLoader("ocean.jpg"); imageLoader.addEventListener(Event.COMPLETE, onImageLoaded); } function onImageLoaded(event:Event):void { bitmapData = imageLoader.bitmap.bitmapData; // animate every frame addEventListener(Event.ENTER_FRAME, rotatePlane); } function rotatePlane(event:Event):void { // rotate vertices over time var ticker = getTimer()/400; z2 = z3 = -(z1 = z4 = 100*Math.sin(ticker)); x2 = x3 = -(x1 = x4 = 100*Math.cos(ticker)); // calculate t values

PROGRAMAO DO ACTIONSCRIPT 3.0 525


Trabalho em 3D (trs dimenses)

t1 t2 t3 t4

= = = =

focalLength/(focalLength focalLength/(focalLength focalLength/(focalLength focalLength/(focalLength

+ + + +

z1); z2); z3); z4);

// determine triangle vertices based on t values var vertices:Vector.<Number> = new Vector.<Number>(); vertices.push(x1*t1,y1*t1, x2*t2,y2*t2, x3*t3,y3*t3, x4*t4,y4*t4); // set T values allowing perspective to change // as each vertex moves around in z space var uvtData:Vector.<Number> = new Vector.<Number>(); uvtData.push(0,0,t1, 1,0,t2, 1,1,t3, 0,1,t4); // draw container.graphics.clear(); container.graphics.beginBitmapFill(bitmapData); container.graphics.drawTriangles(vertices, indices, uvtData); } } }

Salve esses dois arquivos de classe no mesmo diretrio de uma imagem chamada ocean.jpg. Voc pode ver como o bitmap original transformado para dar a impresso de que ele est desaparecendo conforme aumenta a distncia e girando no espao 3D.

Remoo
Remoo o processo que determina quais superfcies de um objeto tridimensional o renderizador no deve renderizar pelo fato de estarem ocultas do ponto de viso atual. No espao 3D, a superfcie na parte de trs de um objeto tridimensional fica oculta do ponto de viso:
A B

A parte de trs de um objeto 3D fica oculta do ponto de viso. A. ponto de viso B. objeto 3D C. a parte de trs de um objeto tridimensional

Inerentemente, todos os tringulos sempre so renderizados, seja qual for o tamanho, a forma ou a posio. A remoo assegura que o Flash Player ou o AIR renderize o objeto 3D corretamente. Alm disso, para ganhar tempo nos ciclos de renderizao, s vezes voc deseja que alguns tringulos sejam ignorados pelo renderizador. Pense em um cubo girando no espao. Em um determinado momento, voc no ver mais do que trs lados desse cubo, uma vez que os lados que no aparecem na exibio estariam voltados para a outra direo no outro lado do cubo. Como esses lados no sero vistos, o renderizados no deve desenh-los. Sem a remoo, o Flash Player ou o AIR renderiza os lados da frente e de trs.

PROGRAMAO DO ACTIONSCRIPT 3.0 526


Trabalho em 3D (trs dimenses)

Um cubo tem lados que no ficam visveis no ponto de viso atual

Por isso, o mtodo Graphics.drawTriangles() tem um quarto parmetro para estabelecer um valor de remoo:
public function drawTriangles(vertices:Vector.<Number>, indices:Vector.<int> = null, uvtData:Vector.<Number> = null, culling:String = "none"):void

O parmetro de remoo um valor da classe de enumerao TriangleCulling: TriangleCulling.NONE, TriangleCulling.POSITIVE e TriangleCulling.NEGATIVE. Esses valores dependem da direo do caminho do tringulo que define a superfcie do objeto. A API do ActionScript para determinar a remoo pressupe que todos os tringulos voltados para fora de uma forma 3D sejam desenhados com a mesma direo de caminho. Uma vez que uma face do tringulo virada, a direo do caminho tambm muda. Nesse ponto, o tringulo pode ser removido (excludo da renderizao). Portanto, um valor POSITIVE deTriangleCulling remove tringulos com direo de caminho positiva (no sentido horrio). Um valor NEGATIVE de TriangleCulling remove tringulos com uma direo de caminho negativa (no sentido anti-horrio). No caso de um cubo, enquanto as superfcies voltadas para frente tm uma direo de caminho positiva, as superfcies traseiras tm uma direo de caminho negativa:

Um cubo aberto para mostrar a direo do caminho. Quando o cubo est fechado, a direo do caminho da parte traseira invertida.

Para ver como funciona a remoo, comece com o exemplo anterior de Mapeamento UV na pgina 521, defina o parmetro de remoo do mtodo drawTriangles() como TriangleCulling.NEGATIVE:
container.graphics.drawTriangles(vertices, indices, uvtData, TriangleCulling.NEGATIVE);

Observe que o lado de trs da imagem no renderizado porque o objeto gira.

527

Captulo 24: Trabalho com vdeo


Os vdeos criados com o Adobe Flash so uma das tecnologias de destaque na Internet. No entanto, a apresentao tradicional do vdeo, em uma tela retangular com uma barra de progresso e botes de controle na parte inferior, apenas um dos usos possveis do vdeo. Por meio do ActionScript, voc tem acesso e controle ajustados sobre o carregamento, a apresentao e a reproduo de vdeos.

Noes bsicas sobre vdeo


Introduo ao trabalho com vdeo
Um recurso importante do Adobe Flash Player e do Adobe AIR a capacidade de exibir e manipular informaes de vdeo com o ActionScript da mesma forma que voc pode manipular outros contedos visuais, como imagens, animao, texto e assim por diante. Ao criar um arquivo FLV (Flash Video) no Adobe Flash CS4 Professional, voc tem a opo de selecionar uma capa que inclui controles de reproduo comuns. Todavia, no h motivo para se limitar s opes disponveis. Usando o ActionScript, voc tem controle ajustado sobre o carregamento, a exibio e a reproduo de vdeo, o que significa que possvel criar sua prpria capa de player de vdeo ou usar o vdeo de qualquer maneira menos tradicional que voc queira. O trabalho com vdeo no ActionScript envolve o trabalho com uma combinao de vrias classes:

Classe Video: a caixa de contedo em vdeo propriamente dita no Palco uma ocorrncia da classe Video. A classe
Video um objeto de exibio, por isso pode ser manipulada usando as mesmas tcnicas aplicveis a outros objetos de exibio, como posicionamento, aplicao de transformaes, aplicao de filtros e modos de mesclagem, entre outras.

Classe NetStream: quando voc est carregando um arquivo de vdeo a ser controlado pelo ActionScript, uma
ocorrncia de NetStream representa a origem do contedo do vdeo neste caso, um fluxo de dados de vdeo. O uso de uma ocorrncia de NetStream tambm inclui o uso de um objeto NetConnection, que a conexo com o arquivo de vdeo como o tnel pelo qual carregado o contedo do vdeo.

Classe Camera: quando voc est trabalhando com dados de vdeo de uma cmera conectada ao computador do
usurio, uma ocorrncia de Camera representa a origem do contedo do vdeo a cmera do usurio e os dados de vdeo disponibilizados por ela. Quando voc carrega vdeo externo, pode carregar o arquivo de um servidor Web padro para download progressivo ou trabalhar com vdeo de fluxo contnuo entregue por um servidor especializado, como o Flash Media Server da Adobe.

Tarefas comuns de vdeo


Este captulo descreve as seguintes tarefas relacionadas a vdeo que provavelmente voc desejar executar:

Exibio e controle de vdeo na tela Carregamento de arquivos de vdeo externos Controle da reproduo de vdeo Uso de tela cheia

PROGRAMAO DO ACTIONSCRIPT 3.0 528


Trabalho com vdeo

Manipulao de metadados e informaes de ponto de sinalizao em um arquivo de vdeo Captura e exibio da entrada de vdeo da cmera de um usurio

Conceitos e termos importantes


Ponto de sinalizao: um marcador que pode ser colocado em um momento especfico de um arquivo de vdeo, por
exemplo, para funcionar como um marcador que localiza esse ponto no tempo ou para fornecer dados adicionais associados ao momento em questo.

Codificao: o processo de pegar dados de vdeo em um formato e convert-los em outro formato de dados de
vdeo; por exemplo, voc pode pegar um vdeo de uma origem de alta resoluo e convert-lo em um formato adequado para disponibilizao na Internet.

Quadro: um nico segmento de informaes de vdeo; cada quadro como uma imagem esttica que representa
um instantneo de um momento. A execuo de quadros em seqncia em alta velocidade cria a iluso de movimento.

Quadro-chave: um quadro de vdeo que contm todas as informaes do quadro. Outros quadros que vm aps
um quadro-chave contm apenas informaes sobre no qu eles so diferentes do quadro-chave, e no todas as informaes do quadro inteiro.

Metadados: informaes sobre um arquivo de vdeo que so incorporadas a ele e recuperadas quando o vdeo
carregado.

Download progressivo: quando um arquivo de vdeo disponibilizado de um servidor Web padro, os dados de
vdeo so carregados por meio de download progressivo, o que significa que as informaes sobre o vdeo so carregadas em seqncia. Isso tem a vantagem de que a reproduo do vdeo pode comear antes de terminar o download do arquivo inteiro; no entanto, o download progressivo impede de voc avanar para uma parte do vdeo que ainda no foi carregada.

Streaming: como alternativa ao download progressivo, pode-se usar um servidor de vdeo especial para
disponibilizar vdeo pela Internet usando uma tcnica conhecida como streaming (tambm chamada de true streaming). Com o streaming, o computador do visualizador nunca baixa todo o vdeo de uma s vez. Para agilizar os tempos de download, em qualquer momento o computador s precisa de uma parte de todas as informaes do vdeo. Como um servidor especial controla a entrega do contedo do vdeo, qualquer parte do vdeo pode ser acessada a qualquer momento, e no necessrio aguardar o trmino do download para acess-lo.

Teste dos exemplos do captulo


Ao trabalhar em um captulo, talvez voc queira testar algumas listagens de cdigo de exemplo sozinho. Como este captulo aborda o trabalho com vdeo no ActionScript, muitas das listagens de cdigo aqui mencionadas envolvem o trabalho com um objeto de vdeo, que pode ser um objeto criado e colocado no Palco do Flash ou um objeto que tenha sido criado usando o ActionScript. O teste de uma amostra envolver a exibio do resultado no Flash Player ou no AIR para ver os efeitos do cdigo no vdeo. A maioria das listagens de cdigo de exemplo manipulam um objeto Video sem cri-lo explicitamente. Para testar essas listagens de cdigo deste captulo:
1 Crie um documento do Flash vazio. 2 Selecione um quadro-chave na Linha de tempo. 3 Abra o painel Aes e copie a listagem de cdigo no painel Script. 4 Se necessrio, abra o painel Biblioteca. 5 No menu do painel Biblioteca, clique em Novo vdeo.

PROGRAMAO DO ACTIONSCRIPT 3.0 529


Trabalho com vdeo

6 Na caixa de dilogo Propriedades do vdeo, digite um nome para o smbolo do novo vdeo e clique em Vdeo

(controlado pelo ActionScript) no campo Tipo. Clique em OK para criar o smbolo Video.
7 Arraste uma ocorrncia do smbolo do seu vdeo do painel Biblioteca at o Palco. 8 Com a ocorrncia do vdeo selecionada, no Inspetor de propriedades, d a ela um nome de ocorrncia. O nome

deve corresponder ao nome usado para a ocorrncia de Video na listagem de cdigo de exemplo. Por exemplo, se a listagem de cdigo manipula um objeto Video chamado vid, voc deve nomear a ocorrncia de Palco igualmente como vid.
9 Execute o programa usando Controlar > Testar filme.

Na tela, voc ver os resultados do cdigo manipulando o vdeo conforme especificado na listagem de cdigo. Algumas listagens de cdigo de exemplo deste captulo incluem uma definio de classe alm do cdigo de exemplo. Nessas listagens, alm das etapas anteriores e antes de testar o SWF, voc precisar criar a classe usada no exemplo. Para criar uma classe definida em uma listagem de cdigo de exemplo:
1 Verifique se voc salvou o arquivo FLA que ser utilizado no teste. 2 No menu principal, clique em Arquivo > Novo. 3 Na seo Tipo da caixa de dilogo Novo documento, clique em Arquivo do ActionScript. Clique em OK para criar

o novo arquivo do ActionScript.


4 Copie o cdigo da definio de classe do exemplo para o documento do ActionScript. 5 No menu principal, clique em Arquivo > Salvar. Salve o arquivo no mesmo diretrio que o documento do Flash. O

nome do arquivo deve corresponder ao nome da classe na listagem de cdigo. Por exemplo, se a listagem de cdigo define uma classe chamada VideoTest, salve o arquivo do ActionScript como VideoTest.as.
6 Volte ao documento do Flash. 7 Execute o programa usando Controlar > Testar filme.

Os resultados do exemplo sero exibidos na tela. Outras tcnicas para testar listagens de cdigo de exemplo so explicadas mais detalhadamente em Teste de listagens de cdigo de exemplo dos captulos na pgina 36.

Noes bsicas sobre formatos de vdeo


Alm do formato de vdeo Adobe FLV, o Flash Player e o Adobe AIR do suporte a vdeo e udio codificados em H.264 e HE-AAC a partir de formatos de arquivo com o padro MPEG-4. Esses formatos transmitem vdeos de alta qualidade com taxas de bits mais baixas. Os desenvolvedores podem utilizar ferramentas padro do setor, como o Adobe Premiere Pro e o Adobe After Effects, para criar e disponibilizar contedos em vdeo interessantes.
Tipo Vdeo Vdeo Vdeo udio Formato H.264 Arquivo FLV Arquivo FLV AAC+ / HE-AAC / AAC v1 / AAC v2 Recipiente MPEG-4: MP4, M4V, F4V, 3GPP Sorenson Spark ON2 VP6 MPEG-4:MP4, M4V, F4V, 3GPP

PROGRAMAO DO ACTIONSCRIPT 3.0 530


Trabalho com vdeo

Tipo udio udio udio

Formato Mp3 Nellymoser Speex

Recipiente Mp3 Arquivo FLV Arquivo FLV

Compatibilidade do Flash Player e do AIR com arquivos de vdeo codificados


O Flash Player 7 oferece suporte a arquivos FLV codificados com o codec de vdeo Sorenson Spark. O Flash Player 8 d suporte a arquivos FLV codificados com o codificador Sorenson Spark ou On2 VP6 no Flash Professional 8. O codec de vdeo On2 VP6 oferece suporte a um canal alfa. O Flash Player 9.0.115.0 e verses posteriores do suporte a arquivos derivados do formato de recipiente MPEG-4 padro. Esses arquivos incluem F4V, MP4, M4A, MOV, MP4V, 3GP e 3G2, se contm vdeo H.264 ou udio codificado em HE-AAC v2 ou ambos. O H.264 oferece vdeo de qualidade superior com taxas de bits inferiores se comparadas com o mesmo perfil de codificao no Sorenson ou On2. O HE-AAC v2 uma extenso do AAC, um formato de udio padro definido no padro de vdeo MPEG-4. O HE-AAC v2 usa as tcnicas SBR (Spectral Band Replication) e PS (Parametric Stereo) para aumentar a eficincia da codificao em taxas de bits baixas. A tabela a seguir lista os codecs suportados. Ela tambm mostra o formato de arquivo SWF correspondente e as verses do Flash Player e do AIR necessrias para reproduzi-los:
Codec Verso do formato de arquivo SWF (verso de publicao mais antiga suportada) 6 6 Flash Player e AIR (verso mais antiga necessria para reproduo)

Sorenson Spark On2 VP6

FP 6, Flash Lite 3 FP 8, Flash Lite 3. Apenas o Flash Player 8 e verses posteriores oferecem suporte publicao e reproduo de vdeo On2 VP6.

H.264 (MPEG-4 Parte 10) ADPCM Mp3 AAC (MPEG-4 Parte 3) Speex (udio) Nellymoser

9 6 6 9 10 6

FP 9 atualizao 3, AIR 1.0 FP 6, Flash Lite 3 FP 6, Flash Lite 3 FP 9 atualizao 3, AIR 1.0 FP 10, AIR 1.5 FP 6

Noes bsicas sobre os formatos de arquivo de vdeo Adobe F4V e FLV


A Adobe oferece os formatos de arquivo de vdeo F4V e FLV para transmitir contedo para o Flash Player e o AIR. Para ver uma descrio completa desses formatos de arquivo de vdeo, consulte www.adobe.com/go/video_file_format_br.

PROGRAMAO DO ACTIONSCRIPT 3.0 531


Trabalho com vdeo

O formato de arquivo de vdeo F4V


A partir da atualizao 3 do Flash Player (9.0.115.0) e do AIR 1.0, o Flash Player e o AIR do suporte ao formato de vdeo Adobe F4V, que baseado no formato ISO MP4. Subconjuntos do formato do suporte a diferentes recursos. O Flash Player espera que um arquivo F4V vlido comece com uma das seguintes caixas de nvel superior:

ftyp
A caixa ftyp identifica os recursos para os quais um programa deve oferecer suporte para executar um determinado formato de arquivo.

moov
A caixa moov o cabealho de um arquivo F4V. Ela contm uma ou mais outras caixas que, por sua vez, contm outras caixas que definem a estrutura dos dados F4V. Um arquivo F4V deve conter somente uma caixa moov.

mdat
Uma caixa mdat contm a carga de dados do arquivo F4V. Um arquivo FV contm apenas uma caixa mdat. Tambm deve haver uma caixa moov no arquivo porque a caixa mdat no pode ser compreendida por si s. Os arquivos F4V do suporte a inteiros multibyte na ordem de bytes big-endian, pela qual o byte mais importante ocorre primeiro, no endereo mais baixo.

O formato de arquivo de vdeo FLV


O formato de arquivo Adobe FLV contm dados de udio e vdeo codificados para entrega pelo Flash Player. possvel usar um codificador, como o Adobe Media Encoder ou o Sorenson Squeeze, para converter um arquivo de vdeo do QuickTime ou do Windows Media em um arquivo FLV. Nota: Voc pode criar arquivos FLV importando vdeo para o Flash e o exportando como um arquivo FLV. Voc pode usar o plug-in de exportao de FLV para exportar arquivos FLV de aplicativos de edio de vdeos suportados. Para carregar arquivos FLV de um servidor Web, registre a extenso do nome de arquivo e o tipo MIME no servidor Web. Consulte a documentao do seu servidor Web. O tipo MIME de arquivos FLV video/x-flv. Para obter mais informaes, consulte Sobre a configurao de arquivos FLV para hospedagem em um servidor na pgina 562. Para obter mais informaes sobre arquivos FLV, consulte Tpicos avanados sobre arquivos FLV na pgina 562.

Vdeo externo versus incorporado


O uso de arquivos de vdeo externos oferece determinados recursos que no esto disponveis quando voc usa vdeo importado:

Clipes de vdeo mais longos podem ser usados no seu aplicativo sem diminuir a velocidade da reproduo.
Arquivos de vdeo externos usam a memria cache, o que significa que arquivos grandes so armazenados em pequenas partes e acessados dinamicamente. Por esse motivo, os arquivos F4V e FLV externos exigem menos memria do que os arquivos de vdeo incorporados.

Um arquivo de vdeo externo pode ter uma taxa de quadros diferente do que o arquivo SWF no qual ele
reproduzido. Por exemplo, voc pode definir a taxa de quadros do arquivo SWF como 30 quadros por segundo (fps) e a taxa de quadros de vdeo como 21 fps. Esta configurao lhe d mais controle sobre o vdeo do que o vdeo incorporado e assegura a reproduo contnua. Ela tambm permite reproduzir arquivos de vdeo com taxas de quadro diferentes sem precisar alterar o contedo do arquivo SWF existente.

Com arquivos de vdeo externos, a reproduo do contedo SWF no interrompida enquanto o arquivo de vdeo
est sendo carregado. s vezes, os arquivos de vdeo importados podem interromper a reproduo de documentos para executar certas funes, como acessar uma unidade de CD-ROM. Os arquivos de vdeo podem executar funes independentemente do contedo SWF sem interromper a reproduo.

PROGRAMAO DO ACTIONSCRIPT 3.0 532


Trabalho com vdeo

mais fcil legendar o contedo em vdeo com arquivos FLV externos porque voc pode acessar os metadados do
vdeo usando manipuladores de eventos.

Noes bsicas sobre a classe Video


A classe Video permite exibir vdeo de fluxo contnuo ao vivo em um aplicativo sem incorpor-lo ao seu arquivo SWF. possvel capturar e reproduzir vdeo ao vivo usando o mtodo Camera.getCamera(). Voc tambm pode usar a classe Video para reproduzir arquivos de vdeo por HTTP ou a partir do sistema de arquivos local. H vrias maneiras diferentes de usar a classe Video em seus projetos:

Carregue um arquivo de vdeo dinamicamente usando as classes NetConnection e NetStream e exiba o vdeo em
um objeto Video.

Capture a entrada da cmera do usurio. Para obter mais informaes, consulte Captura da entrada da cmera
na pgina 556.

Use o componente FLVPlayback.


Nota: As ocorrncias de um objeto Video no Palco so ocorrncias da classe Video. Embora a classe Video esteja no pacote flash.media, ela herda da classe flash.display.DisplayObject. Portanto, toda a funcionalidade do objeto de exibio, como transformaes de matriz e filtros, tambm se aplica a ocorrncias de Video. Para obter mais informaes, consulte Manipulao de objetos de exibio na pgina 293, Trabalho com geometria na pgina 342 e Filtro de objetos de exibio na pgina 354.

Carregamento de arquivos de vdeo


O processo de carregar vdeos usando as classes NetStream e NetConnection inclui vrias etapas:
1 Crie um objeto NetConnection. Se voc estiver se conectando a um arquivo de vdeo local ou a um arquivo que no

est usando um servidor, como o Flash Media Server 2 da Adobe, passe null para o mtodo connect() para reproduzir arquivos de vdeo de um endereo HTTP ou de uma unidade local. Se voc estiver se conectando a um servidor, defina o parmetro como o URI do aplicativo que contm o arquivo de vdeo no servidor.
var nc:NetConnection = new NetConnection(); nc.connect(null);

2 Crie um objeto NetStream que use um objeto NetConnection como parmetro e especifique o arquivo de vdeo que

voc deseja carregar. O seguinte snippet conecta um objeto NetStream ocorrncia especificada de NetConnection e carrega um arquivo de vdeo chamado video.mp4 no mesmo diretrio do arquivo SWF:
var ns:NetStream = new NetStream(nc); ns.addEventListener(AsyncErrorEvent.ASYNC_ERROR, asyncErrorHandler); ns.play("video.mp4"); function asyncErrorHandler(event:AsyncErrorEvent):void { // ignore error }

3 Crie um novo objeto Video e anexe o objeto NetStream criado anteriormente usando o mtodo
attachNetStream() da classe Video. Em seguida, adicione o objeto de vdeo lista de exibio usando o mtodo addChild(), como visto neste snippet:

PROGRAMAO DO ACTIONSCRIPT 3.0 533


Trabalho com vdeo

var vid:Video = new Video(); vid.attachNetStream(ns); addChild(vid);

medida que o Flash Player executa esse cdigo, ele tenta carregar o arquivo de vdeo video.mp4 do mesmo diretrio em que est o seu arquivo SWF.

Controle da reproduo de vdeo


A classe NetStream oferece quatro principais mtodos para controlar a reproduo de vdeos:
pause(): Pausa a reproduo de um fluxo de vdeo. Se o vdeo j estiver pausado, chamar este mtodo no ter efeito.

resume(): Reinicia a reproduo de um fluxo de vdeo pausado. Se o vdeo j estiver em reproduo, chamar este mtodo no ter efeito. seek(): Busca o quadro-chave mais prximo do local especificado (um deslocamento, em segundos, a partir do incio do fluxo). togglePause(): Pausa ou reinicia a reproduo de um fluxo. Nota: No h um mtodo stop(). Para interromper um fluxo, voc deve pausar a reproduo e fazer a busca at o incio do fluxo de vdeo. Nota: O mtodo play() no reinicia a reproduo; ele usado para carregar arquivos de vdeo. O exemplo a seguir demonstra como controlar um vdeo usando vrios botes diferentes. Para executar o exemplo, crie um novo documento e adicione quatro ocorrncias de boto ao seu espao de trabalho (pauseBtn, playBtn, stopBtn e togglePauseBtn):

PROGRAMAO DO ACTIONSCRIPT 3.0 534


Trabalho com vdeo

var nc:NetConnection = new NetConnection(); nc.connect(null); var ns:NetStream = new NetStream(nc); ns.addEventListener(AsyncErrorEvent.ASYNC_ERROR, asyncErrorHandler); ns.play("video.flv"); function asyncErrorHandler(event:AsyncErrorEvent):void { // ignore error } var vid:Video = new Video(); vid.attachNetStream(ns); addChild(vid); pauseBtn.addEventListener(MouseEvent.CLICK, pauseHandler); playBtn.addEventListener(MouseEvent.CLICK, playHandler); stopBtn.addEventListener(MouseEvent.CLICK, stopHandler); togglePauseBtn.addEventListener(MouseEvent.CLICK, togglePauseHandler); function pauseHandler(event:MouseEvent):void { ns.pause(); } function playHandler(event:MouseEvent):void { ns.resume(); } function stopHandler(event:MouseEvent):void { // Pause the stream and move the playhead back to // the beginning of the stream. ns.pause(); ns.seek(0); } function togglePauseHandler(event:MouseEvent):void { ns.togglePause(); }

Quando voc clica na ocorrncia do boto pauseBtn durante a reproduo do vdeo, o arquivo de vdeo pausado. Se o vdeo j estiver pausado, clicar neste boto no ter efeito. Clicar na ocorrncia do boto playBtn reinicia a reproduo do vdeo se a reproduo foi pausada anteriormente; caso contrrio, o boto no ter efeito se o vdeo j estiver sendo reproduzido.

Deteco do final de um fluxo de vdeo


Para monitorar o comeo ou o final de um fluxo de vdeo, voc precisa adicionar um ouvinte de eventos ocorrncia de NetStream para monitorar o evento netStatus. O seguinte cdigo demonstra como monitorar os diversos cdigos durante a reproduo do vdeo:
ns.addEventListener(NetStatusEvent.NET_STATUS, statusHandler); function statusHandler(event:NetStatusEvent):void { trace(event.info.code) }

PROGRAMAO DO ACTIONSCRIPT 3.0 535


Trabalho com vdeo

O cdigo anterior gera a seguinte sada:


NetStream.Play.Start NetStream.Buffer.Empty NetStream.Buffer.Full NetStream.Buffer.Empty NetStream.Buffer.Full NetStream.Buffer.Empty NetStream.Buffer.Full NetStream.Buffer.Flush NetStream.Play.Stop NetStream.Buffer.Empty NetStream.Buffer.Flush

Os dois cdigos que voc deseja monitorar especificamente so NetStream.Play.Start e NetStream.Play.Stop, que sinalizam o incio e o fim da reproduo do vdeo. O seguinte snippet usa uma instruo de opo para filtrar esses dois cdigos e rastrear uma mensagem:
function statusHandler(event:NetStatusEvent):void { switch (event.info.code) { case "NetStream.Play.Start": trace("Start [" + ns.time.toFixed(3) + " seconds]"); break; case "NetStream.Play.Stop": trace("Stop [" + ns.time.toFixed(3) + " seconds]"); break; } }

Ao monitorar o evento netStatus (NetStatusEvent.NET_STATUS), voc pode criar um player de vdeo que carregue o prximo vdeo de uma lista de exibio depois que a reproduo do vdeo atual for concluda.

Uso de tela cheia


O Flash Player e o AIR permitem dimensionar o vdeo em tela cheia atravs do ActionScript 3.0. As seguintes restries so aplicveis quando o Flash Player reproduz contedo em uma pgina HTML:

As tags object e embed da pgina HTML que contm o arquivo SWF devem incluir o parmetro
allowFullScreen definido como true

O modo de tela cheia iniciado em resposta a um clique do mouse ou a um pressionamento de tecla Se voc definir o Modo de janela (wmode no HTML) como Opaco sem janela (opaco) ou Transparente sem janela
(transparente), a janela da tela cheia ser sempre opaca Essas restries no se aplicam a contedo SWF em execuo no Flash Player independente ou no AIR. O AIR d suporte a um modo de tela cheia interativa que permite entrada do teclado. Para contedo do AIR executado no modo de tela cheia, as opes de protetor de tela e de economia de energia do sistema so desativadas durante a reproduo at que a entrada de vdeo seja interrompida ou que o usurio saia do modo de tela cheia.

PROGRAMAO DO ACTIONSCRIPT 3.0 536


Trabalho com vdeo

Ativao do modo de tela cheia do Flash Player em um navegador


Para que voc possa implementar o modo de tela cheia do Flash Player em um navegador, ative-o atravs do modelo Publish do seu aplicativo. Os modelos que permitem o modo de tela cheia incluem as tags <object> e <embed> que contm um parmetro allowFullScreen. O exemplo a seguir mostra o parmetro allowFullScreen em uma tag <embed>.
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="fullScreen" width="100%" height="100%" codebase="http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab"> ... <param name="allowFullScreen" value="true" /> <embed src="fullScreen.swf" allowFullScreen="true" quality="high" bgcolor="#869ca7" width="100%" height="100%" name="fullScreen" align="middle" play="true" loop="false" quality="high" allowScriptAccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.adobe.com/go/getflashplayer"> </embed> ... </object>

No Flash, selecione Arquivo -> Configuraes de publicao e, na aba HTML da caixa de dilogo Configuraes de publicao, selecione o modelo Somente Flash - Permitir tela cheia. No Flex, verifique se o modelo HTML inclui as tags <object> e <embed> que do suporte a tela cheia.

Inicializao do modo de tela cheia


Para o Flash Player em um navegador, voc inicia o modo de tela cheia para vdeo em resposta a um clique do mouse ou a um pressionamento de tecla. Por exemplo, voc pode iniciar o modo de tela cheia quando o usurio clica em um boto chamado Tela cheia ou seleciona um comando Tela cheia em um menu de contexto. Para responder ao usurio, adicione um ouvinte de eventos ao objeto no qual ocorre a ao. O seguinte cdigo adiciona um ouvinte de eventos a um boto no qual o usurio clica para entrar no modo de tela cheia:
var fullScreenButton:Button = new Button(); fullScreenButton.label = "Full Screen"; addChild(fullScreenButton); fullScreenButton.addEventListener(MouseEvent.CLICK, fullScreenButtonHandler); function fullScreenButtonHandler(event:MouseEvent) { // add code here to enter full-screen mode }

Inicie o modo de tela cheia definindo a propriedade Stage.displayState como StageDisplayState.FULL_SCREEN. O exemplo a seguir inicia o modo de tela cheia.
function fullScreenButtonHandler(event:MouseEvent) { stage.displayState = StageDisplayState.FULL_SCREEN; }

Este cdigo dimensiona todo o palco em tela cheia, sendo que o vdeo dimensionado proporcionalmente ao espao que ocupa no palco.

PROGRAMAO DO ACTIONSCRIPT 3.0 537


Trabalho com vdeo

A propriedade fullScreenSourceRect permite especificar uma determinada rea do palco a ser dimensionada para tela cheia. Primeiro, defina o retngulo que voc deseja dimensionar para tela cheia. Depois, atribua-o propriedade Stage.fullScreenSourceRect. Esta verso da funo fullScreenButtonHandler() adiciona duas linhas a mais de cdigo que dimensionam somente o vdeo para tela cheia.
private function fullScreenButtonHandler(event:MouseEvent) { var screenRectangle:Rectangle = new Rectangle(video.x, video.y, video.width, video.height); stage.fullScreenSourceRect = screenRectangle; stage.displayState = StageDisplayState.FULL_SCREEN; }

Embora este exemplo chame um manipulador de eventos em resposta a um clique do mouse, a tcnica de usar a tela cheia a mesma para o Flash Player e o AIR. Defina o retngulo que voc deseja dimensionar e configure a propriedade Stage.displayState. Para obter mais informaes, consulte a Referncia de componentes e linguagem do ActionScript 3.0. O exemplo completo, mostrado a seguir, adiciona um cdigo que cria a conexo e o objeto NetStream para o vdeo e comea a reproduzi-lo.
package { import import import import import import import import import

flash.net.NetConnection; flash.net.NetStream; flash.media.Video; flash.display.StageDisplayState; fl.controls.Button; flash.display.Sprite; flash.events.MouseEvent; flash.events.FullScreenEvent; flash.geom.Rectangle;

public class FullScreenVideoExample extends Sprite { var fullScreenButton:Button = new Button(); var video:Video = new Video(); public function FullScreenVideoExample() { var videoConnection:NetConnection = new NetConnection(); videoConnection.connect(null); var videoStream:NetStream = new NetStream(videoConnection); videoStream.client = this; addChild(video); video.attachNetStream(videoStream); videoStream.play("http://www.helpexamples.com/flash/video/water.flv"); fullScreenButton.x = 100;

PROGRAMAO DO ACTIONSCRIPT 3.0 538


Trabalho com vdeo

fullScreenButton.y = 270; fullScreenButton.label = "Full Screen"; addChild(fullScreenButton); fullScreenButton.addEventListener(MouseEvent.CLICK, fullScreenButtonHandler); } private function fullScreenButtonHandler(event:MouseEvent) { var screenRectangle:Rectangle = new Rectangle(video.x, video.y, video.width, video.height); stage.fullScreenSourceRect = screenRectangle; stage.displayState = StageDisplayState.FULL_SCREEN; } public function onMetaData(infoObject:Object):void { // stub for callback function } } }

A funo onMetaData() uma funo de retorno de chamada que manipula os metadados do vdeo, se houver. Uma funo de retorno de chamada a funo que o tempo de execuo chama em resposta a algum tipo de ocorrncia ou evento. Neste exemplo, a funo onMetaData() um stub que atende ao requisito de fornecer a funo. Para obter mais informaes, consulte Criao de mtodos de retorno de chamada para metadados e pontos de sinalizao na pgina 542

fullScreenHeight e fullScreenWidth
As propriedades Stage.fullScreenHeight e Stage.fullScreenWidth retornam a altura e a largura do monitor que utilizado quando se passa para o tamanho de tela cheia, caso a entrada nesse estado ocorra imediatamente. Esses valores podero estar incorretos se o usurio tiver a oportunidade de mudar o navegador de um monitor para outro depois que voc recuper-los, mas antes de passar para o modo de tela cheia. Se voc recuperar esses valores em um manipulador de eventos que define Stage.displayState como StageDisplayState.FULL_SCREEN, os valores estaro corretos. Se o usurio tiver vrios monitores, o monitor que essas propriedades refletiro ser aquele que contm a maior parte do palco no momento. Para obter mais informaes, consulte Stage.fullScreenHeight e Stage.fullScreenWidth na Referncia de componentes e linguagem do ActionScript 3.0.

Suporte para teclado


Quando o Flash Player executado em um navegador, ele restringe a entrada por teclado no modo de tela cheia. As teclas aceitveis incluem atalhos de teclado que encerram o modo de tela cheia e teclas que no so impressas, como as teclas de seta, espao, Shift e Tab. Os atalhos de teclado que encerram o modo de tela cheia so os seguintes: Escape (Windows e Mac), Ctrl+W (Windows), Command+W (Mac) e Alt+F4.

PROGRAMAO DO ACTIONSCRIPT 3.0 539


Trabalho com vdeo

Encerramento do modo de tela cheia


Um usurio pode encerrar o modo de tela cheia usando um dos atalhos de teclado, como a tecla Escape. Para obter mais informaes sobre esses atalhos de teclado, consulte Suporte para teclado na pgina 538. possvel encerrar o modo de tela cheia no ActionScript configurando a propriedade Stage.diplayState como StageDisplayState.NORMAL. O cdigo do exemplo a seguir encerra o modo de tela cheia quando ocorre o evento de status de rede NetStream.Play.Stop.
videoStream.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); private function netStatusHandler(event:NetStatusEvent) { if(event.info.code == "NetStream.Play.Stop") stage.displayState = StageDisplayState.NORMAL; }

Desativao do modo de tela cheia do Flash Player


possvel desativar o suporte de tela cheia para todos os arquivos de vdeo adicionando-se um parmetro ao arquivo de configurao do Flash Player (mms.cfg). Este tipo de operao costuma ser reservado para um administrador de TI. O arquivo mms.cfg pode ser encontrado nos seguintes locais:

Windows XP, Vista -- C:\WINDOWS\System32\Macromed\Flash Mac -- \Application Support\Macromedia


O arquivo mms.cfg consiste em um arquivo de texto UTF-8 cujo formato uma srie de pares nome=valor separados por retornos de carro. O Flash Player assume o valor padro para um parmetro se ele no est definido no arquivo. Para desativar o modo de tela cheia do Flash Player, adicione o seguinte parmetro ao arquivo mms.cfg:
FullScreenDisable=1

Nota: As configuraes contidas no arquivo mms.cfg substituem as configuraes do usurio e este no pode alter-las atravs do Gerenciador de configuraes. Alm disso, o modo de exibio do usurio do Gerenciador de configuraes no reflete as configuraes do arquivo mms.cfg.

Acelerao de hardware
Quando voc define a propriedade Stage.fullScreenSourceRect para dimensionar um segmento retangular do palco para o modo de tela cheia, o Flash Player ou o AIR usa acelerao de hardware caso ela esteja disponvel e ativada. O tempo de execuo usa o adaptador de vdeo do computador para acelerar o dimensionamento do vdeo ou uma parte do palco para o tamanho de tela cheia. A acelerao de hardware exige o Microsoft DirectX 9 com 128 MB de VRAM no Windows e OpenGL para Apple Macintosh, Mac OS X v10.2 ou superior. Para aproveitar as vantagens de todos os recursos da acelerao de hardware no Flash Player, ative-a na caixa de dilogo Configuraes do Flash Player. Para carregar a caixa de dilogo, clique com o boto direito do mouse (Windows) ou pressione a tecla Ctrl enquanto clica (Mac) dentro do contedo Flash Player no navegador. Selecione a aba Exibir, que a primeira, e clique na caixa de seleo: Habilitar acelerao de hardware.

Modos de janela direto e de composio GPU


O Flash Player 10 traz dois novos modos de janela, direto e composio GPU, que voc pode implementar atravs das configuraes de publicao do Flash. Esses modos no so suportados no AIR. Para aproveitar as vantagens desses modos, voc deve ativar a acelerao de hardware para o Flash Player.

PROGRAMAO DO ACTIONSCRIPT 3.0 540


Trabalho com vdeo

O modo direto usa o caminho mais rpido e direto para enviar grficos para a tela, o que vantajoso para a reproduo de vdeos. A Composio GPU usa a unidade de processamento grfico da placa de vdeo para acelerar a composio. A composio de vdeo o processo de dispor vrias imagens em camadas para criar uma nica imagem de vdeo. Quando a composio acelerada com a GPU, ela pode melhorar o desempenho de converso YUV, correo de cores, rotao ou dimensionamento e mesclagem. Converso YUV refere-se converso de cores de sinais analgicos compostos, que so usados para transmisso, no modelo de cores RGB (vermelho, verde, azul) usado por monitores e cmeras de vdeo. O uso da GPU para acelerar a composio reduz as demandas de memria e de computao que, de outro modo, seriam atribudas CPU. Ele tambm resulta em uma reproduo mais contnua para vdeo com definio padro. Seja cauteloso na implementao desses modos de janela. O uso da composio GPU pode ser dispendioso para a memria e os recursos da CPU. Se no for possvel executar algumas operaes (como modos de mesclagem, filtragem, corte ou mascaramento) na GPU, elas sero feitas pelo software. A Adobe recomenda que voc se restrinja a um arquivo SWF por pgina HTML quando usar esses modos e que no ative esses modos para banners. O recurso Testar filme do Flash no utiliza acelerao de hardware, mas voc pode us-la atravs da opo Publicar visualizao. intil configurar uma taxa de quadros superior a 60 no arquivo SWF, que a taxa mxima de atualizao da tela. Configurar a taxa de quadros com um valor entre 50 e 55 viabiliza quadros descartados, que podem ocorrer por vrios motivos de tempos em tempos. O uso do modo direto exige o Microsoft DirectX 9 com 128 MB de VRAM no Windows e OpenGL para Apple Macintosh, Mac OS X v10.2 ou superior. A composio GPU exige o Microsoft DirectX 9 e suporte para Pixel Shader 2.0 no Windows com 128 MB de VRAM. No Apple Macintosh e no Linux, a composio GPU exige o OpenGL 1.5 e vrias extenses OpenGL (objeto framebuffer, multitextura, objetos Shader, linguagem de sombreamento, sombreador de fragmentos). possvel ativar os modos de acelerao direto e gpu por arquivo SWF na caixa de dilogo Configuraes de publicao do Flash usando o menu Acelerao de hardware da aba Flash. Se voc clicar em Nenhum, o modo de janela voltar para padro, transparente ou opaco, conforme especificado pela configurao Modo de janela na aba HTML. O efeito da configurao Acelerao de hardware definir o bit de cabealho estendido SWF, como segue:
swfFlagsUseAcceleratedBlit = 0x00000020, // this SWF enables direct acceleration swfFlagsUseHardwareGPU = 0x00000040, // this SWF enables hardware gpu acceleration

Esta configurao afeta apenas a reproduo em projetores Windows e Mac e no Flash Player autnomo. Se o destino do player uma pgina HTML, o Flash define o parmetro HTML wmode como direto ou gpu.

Arquivos de vdeo em fluxo contnuo


Para reproduzir arquivos em fluxo contnuo no Flash Media Server, voc pode usar as classes NetConnection e NetStream para se conectar a uma ocorrncia do servidor remoto e reproduzir um fluxo especificado. Para especificar um servidor RTMP (Real-Time Messaging Protocol), passe a URL RTMP desejada, como rtmp://localhost/appName/appInstance, para o mtodo NetConnection.connect() em vez de passar null. Para reproduzir um determinado fluxo ao vivo ou gravado do Flash Media Server, passe um nome de identificao referente aos dados ao vivo publicados por NetStream.publish() ou um nome de arquivo gravado para reproduo ao mtodo NetStream.play(). Para obter mais informaes, consulte a documentao do Flash Media Server.

PROGRAMAO DO ACTIONSCRIPT 3.0 541


Trabalho com vdeo

Noes bsicas sobre pontos de sinalizao


possvel incorporar pontos de sinalizao a um arquivo de vdeo Adobe F4V ou FLV durante a codificao. Historicamente, os pontos de sinalizao eram incorporados a filmes para dar ao projetista um sinal visual que indicava que o rolo de filme estava perto do fim. Nos formatos de vdeo Adobe F4V e FLV, um ponto de sinalizao permite que voc d incio a uma ou mais aes no aplicativo quando ele ocorrer no fluxo de vdeo. Voc pode usar vrios tipos diferentes de pontos de sinalizao com vdeos criados no Flash. Voc pode usar o ActionScript para interagir com pontos de sinalizao que incorpora a um arquivo de vdeo ao cri-lo.

Pontos de sinalizao de navegao: incorpore pontos de sinalizao de navegao ao pacote de metadados e fluxo
de vdeo quando codificar o arquivo de vdeo. Use pontos de sinalizao de navegao para que os usurios possam fazer a busca at uma determinada parte de um arquivo.

Pontos de sinalizao de evento: incorpore pontos de sinalizao de evento ao pacote de metadados e fluxo de vdeo
quando codificar o arquivo de vdeo. Voc pode criar um cdigo para manipular os eventos que so acionados em pontos especficos durante a reproduo do vdeo.

Pontos de sinalizao do ActionScript: os pontos de sinalizao do ActionScript s esto disponveis para o


componente FLVPlayback do Flash. Eles so pontos de sinalizao externos criados e acessados com cdigo ActionScript. Voc pode criar um cdigo para acionar esses pontos de sinalizao em relao reproduo do vdeo. Eles so menos precisos do que os pontos de sinalizao incorporados (at um dcimo de segundo), porque o player de vdeo os rastreia separadamente. Se voc pretende criar um aplicativo em que os usurios podero navegar at um ponto de sinalizao, deve criar e incorporar pontos de sinalizao quando codificar o arquivo em vez de usar pontos de sinalizao do ActionScript. Voc deve incorporar os pontos de sinalizao ao arquivo FLV porque eles so mais precisos. Os pontos de sinalizao de navegao criam um quadro-chave no local especificado do ponto de sinalizao, por isso voc pode usar um cdigo para deslocar o indicador de reproduo de um player de vdeo at esse local. possvel definir pontos especficos em um arquivo de vdeo no qual voc deseja que os usurios faam uma busca. Por exemplo, o seu vdeo pode ter vrios captulos ou segmentos, e voc pode control-lo incorporando pontos de sinalizao de navegao ao arquivo de vdeo. Para obter mais informaes sobre como codificar arquivos de vdeo Adobe com pontos de sinalizao, consulte Incorporao de pontos de sinalizao em Uso do Flash. possvel acessar parmetros de ponto de sinalizao criando cdigo ActionScript. Os parmetros de ponto de sinalizao fazem parte do objeto de evento recebido pelo manipulador de retorno de chamada. Para iniciar certas aes no seu cdigo quando um arquivo FLV atingir um ponto de sinalizao especfico, use o manipulador de eventos NetStream.onCuePoint. Para sincronizar uma ao para um ponto de sinalizao em um arquivo de vdeo F4V, recupere os dados do ponto de sinalizao usando as funes de retorno de chamada onMetaData() ou onXMPData() e acione o ponto de sinalizao usando a classe Timer do ActionScript 3.0. Para obter mais informaes sobre pontos de sinalizao F4V, consulte Uso de onXMPData() na pgina 553. Para obter mais informaes sobre como manipular pontos de sinalizao e metadados, consulte Criao de mtodos de retorno de chamada para metadados e pontos de sinalizao na pgina 542.

PROGRAMAO DO ACTIONSCRIPT 3.0 542


Trabalho com vdeo

Criao de mtodos de retorno de chamada para metadados e pontos de sinalizao


possvel iniciar aes no seu aplicativo quando metadados especficos so recebidos pelo player ou quando se atingem determinados pontos de sinalizao. Quando esses eventos ocorrem, voc deve usar mtodos de retorno de chamada especficos como manipuladores de eventos. A classe NetStream especifica os seguintes eventos de metadados, que podem ocorrer durante a reproduo: onCuePoint (somente em arquivos FLV), onImageData, onMetaData, onPlayStatus, onTextData e onXMPData. Voc deve criar mtodos de retorno de chamada para esses manipuladores, caso contrrio o Flash Player poder gerar erros. Por exemplo, o cdigo a seguir reproduz um arquivo FLV chamado video.flv na mesma pasta em que reside o arquivo SWF:
var nc:NetConnection = new NetConnection(); nc.connect(null); var ns:NetStream = new NetStream(nc); ns.addEventListener(AsyncErrorEvent.ASYNC_ERROR, asyncErrorHandler); ns.play("video.flv"); function asyncErrorHandler(event:AsyncErrorEvent):void { trace(event.text); } var vid:Video = new Video(); vid.attachNetStream(ns); addChild(vid);

O cdigo anterior carrega um arquivo de vdeo local chamado video.flv e monitora o evento asyncError (AsyncErrorEvent.ASYNC_ERROR) a ser despachado. Esse evento despachado quando o cdigo assncrono nativo gera uma exceo. Nesse caso, ele despachado quando o arquivo de vdeo contm informaes de metadados ou de ponto de sinalizao e os ouvintes apropriados no foram definidos. O cdigo anterior manipula o evento asyncError e ignora o erro se voc no est interessado nas informaes de metadados ou de ponto de sinalizao do arquivo de vdeo. Se voc tivesse um arquivo FLV com metadados e vrios pontos de sinalizao, a funo trace() exibiria as seguintes mensagens de erro:
Error Error Error Error #2095: #2095: #2095: #2095: flash.net.NetStream flash.net.NetStream flash.net.NetStream flash.net.NetStream was was was was unable unable unable unable to to to to invoke invoke invoke invoke callback callback callback callback onMetaData. onCuePoint. onCuePoint. onCuePoint.

Os erros ocorrem porque o objeto NetStream no conseguiu encontrar um mtodo de retorno de chamada onMetaData ou onCuePoint. Existem diversas maneiras de definir esses mtodos de retorno de chamada nos seus aplicativos:

Definir a propriedade client do objeto NetStream como Object


Ao definir a propriedade client como Object ou uma subclasse de NetStream, voc pode redirecionar os mtodos de retorno de chamada onMetaData e onCuePoint ou ignor-los completamente. O exemplo a seguir demonstra como usar um Object vazio para ignorar os mtodos de retorno de chamada sem monitorar o evento asyncError:

PROGRAMAO DO ACTIONSCRIPT 3.0 543


Trabalho com vdeo

var nc:NetConnection = new NetConnection(); nc.connect(null); var customClient:Object = new Object(); var ns:NetStream = new NetStream(nc); ns.client = customClient; ns.play("video.flv"); var vid:Video = new Video(); vid.attachNetStream(ns); addChild(vid);

Para monitorar os mtodos de retorno de chamada onMetaData ou onCuePoint, seria preciso definir mtodos para manipular esses mtodos de retorno de chamada, conforme mostrado no seguinte snippet:
var customClient:Object = new Object(); customClient.onMetaData = metaDataHandler; function metaDataHandler(infoObject:Object):void { trace("metadata"); }

O cdigo anterior monitora o mtodo de retorno de chamada onMetaData e chama o mtodo metaDataHandler(), que rastreia uma string. Se o Flash Player encontrasse um ponto de sinalizao, nenhum erro seria gerado, mesmo que no tenha sido definido um mtodo de retorno de chamada onCuePoint.

Criar uma classe personalizada e definir mtodos para manipular os mtodos de retorno de chamada
O seguinte cdigo define a propriedade client do objeto NetStream como uma classe personalizada, CustomClient, que define manipuladores para os mtodos de retorno de chamada:
var nc:NetConnection = new NetConnection(); nc.connect(null); var ns:NetStream = new NetStream(nc); ns.client = new CustomClient(); ns.play("video.flv"); var vid:Video = new Video(); vid.attachNetStream(ns); addChild(vid);

Esta a classe CustomClient:


package { public class CustomClient { public function onMetaData(infoObject:Object):void { trace("metadata"); } } }

PROGRAMAO DO ACTIONSCRIPT 3.0 544


Trabalho com vdeo

A classe CustomClient define um manipulador para o manipulador de retorno de chamada onMetaData. Se fosse encontrado um ponto de sinalizao e o manipulador de retorno de chamada onCuePoint fosse chamado, seria despachado um evento asyncError (AsyncErrorEvent.ASYNC_ERROR) informando que flash.net.NetStream no pde chamar o manipulador de retorno de chamada onCuePoint. Para evitar esse erro, seria necessrio definir um mtodo de retorno de chamada onCuePoint na classe CustomClient ou definir um manipulador de eventos para o evento asyncError.

Estender a classe NetStream e adicionar mtodos para manipular os mtodos de retorno de chamada
O cdigo abaixo cria uma ocorrncia da classe CustomNetStream, que definida em uma listagem de cdigo mais adiante:
var ns:CustomNetStream = new CustomNetStream(); ns.play("video.flv"); var vid:Video = new Video(); vid.attachNetStream(ns); addChild(vid);

A seguinte listagem de cdigo define a classe CustomNetStream que estende a classe NetStream, manipula a criao do objeto NetConnection necessrio e manipula os mtodos de manipulador de retorno de chamada onMetaData e onCuePoint:
package { import flash.net.NetConnection; import flash.net.NetStream; public class CustomNetStream extends NetStream { private var nc:NetConnection; public function CustomNetStream() { nc = new NetConnection(); nc.connect(null); super(nc); } public function onMetaData(infoObject:Object):void { trace("metadata"); } public function onCuePoint(infoObject:Object):void { trace("cue point"); } } }

Para renomear os mtodos onMetaData() e onCuePoint() na classe CustomNetStream, use o seguinte cdigo:

PROGRAMAO DO ACTIONSCRIPT 3.0 545


Trabalho com vdeo

package { import flash.net.NetConnection; import flash.net.NetStream; public class CustomNetStream extends NetStream { private var nc:NetConnection; public var onMetaData:Function; public var onCuePoint:Function; public function CustomNetStream() { onMetaData = metaDataHandler; onCuePoint = cuePointHandler; nc = new NetConnection(); nc.connect(null); super(nc); } private function metaDataHandler(infoObject:Object):void { trace("metadata"); } private function cuePointHandler(infoObject:Object):void { trace("cue point"); } } }

Estender a classe NetStream e torn-la dinmica


possvel estender a classe NetStream e tornar a subclasse dinmica para que os manipuladores de retorno de chamada onCuePoint e onMetaData possam ser adicionados dinamicamente. Isso demonstrado na listagem a seguir:
var ns:DynamicCustomNetStream = new DynamicCustomNetStream(); ns.play("video.flv"); var vid:Video = new Video(); vid.attachNetStream(ns); addChild(vid);

Esta a classe DynamicCustomNetStream:

PROGRAMAO DO ACTIONSCRIPT 3.0 546


Trabalho com vdeo

package { import flash.net.NetConnection; import flash.net.NetStream; public dynamic class DynamicCustomNetStream extends NetStream { private var nc:NetConnection; public function DynamicCustomNetStream() { nc = new NetConnection(); nc.connect(null); super(nc); } } }

Mesmo sem manipuladores para os manipuladores de retorno de chamada onMetaData e onCuePoint, no so gerados erros porque a classe DynamicCustomNetStream dinmica. Para definir mtodos para os manipuladores de retorno de chamada onMetaData e onCuePoint, use o seguinte cdigo:
var ns:DynamicCustomNetStream = new DynamicCustomNetStream(); ns.onMetaData = metaDataHandler; ns.onCuePoint = cuePointHandler; ns.play("http://www.helpexamples.com/flash/video/cuepoints.flv"); var vid:Video = new Video(); vid.attachNetStream(ns); addChild(vid); function metaDataHandler(infoObject:Object):void { trace("metadata"); } function cuePointHandler(infoObject:Object):void { trace("cue point"); }

Definir a propriedade client do objeto NetStream como this


Quando se define a propriedade client como this, o aplicativo procura os mtodos onMetaData() e onCuePoint() no escopo atual. Este exemplo demonstra isso:
var nc:NetConnection = new NetConnection(); nc.connect(null); var ns:NetStream = new NetStream(nc); ns.client = this; ns.play("video.flv"); var vid:Video = new Video(); vid.attachNetStream(ns); addChild(vid);

Se os manipuladores de retorno de chamada onMetaData ou onCuePoint so chamados e no existem mtodos para manipular o retorno de chamada, nenhum erro gerado. Para manipular esses manipuladores de retorno de chamada, crie um mtodo onMetaData() e onCuePoint() no seu cdigo, como visto no snippet abaixo:

PROGRAMAO DO ACTIONSCRIPT 3.0 547


Trabalho com vdeo

function onMetaData(infoObject:Object):void { trace("metadata"); } function onCuePoint(infoObject:Object):void { trace("cue point"); }

Uso de pontos de sinalizao e metadados


Use os mtodos de retorno de chamada NetStream para capturar e processar eventos de metadados e de ponto de sinalizao durante a reproduo do vdeo.

Uso de pontos de sinalizao


A tabela a seguir descreve os mtodos de retorno de chamada que voc pode usar para capturar pontos de sinalizao F4V e FLV no Flash Player e no AIR.
Tempo de execuo Flash Player 9/AIR1.0 F4V FLV OnCuePoint OnMetaData Flash Player 10 OnMetaData OnXMPData OnCuePoint OnMetaData OnXMPData

O exemplo a seguir usa um loop for..in simples para se repetir em cada uma das propriedades do parmetro infoObject que a funo onCuePoint() recebe. Ele chama a funo trace() para exibir uma mensagem quando recebe dados de ponto de sinalizao:
var nc:NetConnection = new NetConnection(); nc.connect(null); var ns:NetStream = new NetStream(nc); ns.client = this; ns.play("video.flv"); var vid:Video = new Video(); vid.attachNetStream(ns); addChild(vid); function onCuePoint(infoObject:Object):void { var key:String; for (key in infoObject) { trace(key + ": " + infoObject[key]); } }

Aparece a seguinte sada:

PROGRAMAO DO ACTIONSCRIPT 3.0 548


Trabalho com vdeo

parameters: name: point1 time: 0.418 type: navigation

Este cdigo usa uma das vrias tcnicas para definir o objeto no qual executado o mtodo de retorno de chamada. Voc pode usar outras tcnicas; para obter mais informaes, consulte Criao de mtodos de retorno de chamada para metadados e pontos de sinalizao na pgina 542.

Uso de metadados de vdeo


possvel usar as funes OnMetaData() e OnXMPData() para acessar as informaes de metadados do arquivo de vdeo, inclusive pontos de sinalizao.

Uso de OnMetaData()
Os metadados incluem informaes sobre o arquivo de vdeo, como durao, largura, altura e taxa de quadros. As informaes dos metadados que so adicionadas ao arquivo de vdeo dependem do software utilizado para codificar o arquivo.
var nc:NetConnection = new NetConnection(); nc.connect(null); var ns:NetStream = new NetStream(nc); ns.client = this; ns.play("video.flv"); var vid:Video = new Video(); vid.attachNetStream(ns); addChild(vid); function onMetaData(infoObject:Object):void { var key:String; for (key in infoObject) { trace(key + ": " + infoObject[key]); } }

O cdigo anterior gera uma sada parecida com esta:


width: 320 audiodelay: 0.038 canSeekToEnd: true height: 213 cuePoints: ,, audiodatarate: 96 duration: 16.334 videodatarate: 400 framerate: 15 videocodecid: 4 audiocodecid: 2

Se o seu vdeo no tem udio, as informaes de metadados relacionadas a udio (como audiodatarate) retornam undefined, pois nenhuma informao de udio adicionada aos metadados durante a codificao.

PROGRAMAO DO ACTIONSCRIPT 3.0 549


Trabalho com vdeo

No cdigo anterior, as informaes de ponto de sinalizao no eram exibidas. Para exibir os metadados de ponto de sinalizao, use esta funo, que exibe os itens recursivamente em um Object:
function traceObject(obj:Object, indent:uint = 0):void { var indentString:String = ""; var i:uint; var prop:String; var val:*; for (i = 0; i < indent; i++) { indentString += "\t"; } for (prop in obj) { val = obj[prop]; if (typeof(val) == "object") { trace(indentString + " " + prop + ": [Object]"); traceObject(val, indent + 1); } else { trace(indentString + " " + prop + ": " + val); } } }

O uso do snippet de cdigo anterior para rastrear o parmetro infoObject no mtodo onMetaData() gera a seguinte sada:

PROGRAMAO DO ACTIONSCRIPT 3.0 550


Trabalho com vdeo

width: 320 audiodatarate: 96 audiocodecid: 2 videocodecid: 4 videodatarate: 400 canSeekToEnd: true duration: 16.334 audiodelay: 0.038 height: 213 framerate: 15 cuePoints: [Object] 0: [Object] parameters: [Object] lights: beginning name: point1 time: 0.418 type: navigation 1: [Object] parameters: [Object] lights: middle name: point2 time: 7.748 type: navigation 2: [Object] parameters: [Object] lights: end name: point3 time: 16.02 type: navigation

O exemplo a seguir exibe os metadados de um vdeo MP4. Ele pressupe que existe um objeto TextArea chamado metaDataOut, no qual grava os metadados.
package { import import import import import import import import

flash.net.NetConnection; flash.net.NetStream; flash.events.NetStatusEvent; flash.media.Video; flash.display.StageDisplayState; flash.display.Loader; flash.display.Sprite; flash.events.MouseEvent;

public class onMetaDataExample extends Sprite { var video:Video = new Video(); public function onMetaDataExample():void { var videoConnection:NetConnection = new NetConnection(); videoConnection.connect(null); var videoStream:NetStream = new NetStream(videoConnection); videoStream.client = this; addChild(video);

PROGRAMAO DO ACTIONSCRIPT 3.0 551


Trabalho com vdeo

video.x = 185; video.y = 5; video.attachNetStream(videoStream); videoStream.play("video.mp4"); videoStream.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); } public function onMetaData(infoObject:Object):void { for(var propName:String in infoObject) { metaDataOut.appendText(propName + "=" + infoObject[propName] + "\n"); } } private function netStatusHandler(event:NetStatusEvent):void { if(event.info.code == "NetStream.Play.Stop") stage.displayState = StageDisplayState.NORMAL; } } }

A funo onMetaData() gerou a seguinte sada para esse vdeo:


moovposition=731965 height=352 avclevel=21 videocodecid=avc1 duration=2.36 width=704 videoframerate=25 avcprofile=88 trackinfo=[object Object]

Uso do objeto de informao A tabela a seguir mostra os possveis valores para os metadados de vdeo que so passados funo de retorno de chamada onMetaData() no Object por eles recebido:
Parmetro aacaot avclevel avcprofile audiocodecid Descrio Tipo de objeto de udio AAC; so suportados os valores 0, 1 ou 2. Nmero de nvel AVC IDC, como 10, 11, 20, 21 e assim por diante. Nmero de perfil AVC, como 55, 77, 100 e assim por diante. String que indica o codec de udio (tcnica de codificao/decodificao) que foi usado; por exemplo .Mp3 ou mp4a Nmero que indica a taxa de codificao de udio, em KB por segundo. Nmero que indica em que tempo do arquivo FLV est "time 0" do arquivo FLV original. O contedo do vdeo precisa ter um pequeno atraso para que o udio seja sincronizado corretamente.

audiodatarate audiodelay

PROGRAMAO DO ACTIONSCRIPT 3.0 552


Trabalho com vdeo

Parmetro canSeekToEnd

Descrio Um valor booleano que true se o arquivo FLV est codificado com um quadro-chave no ltimo quadro, o que permite fazer a busca at o final de um arquivo de vdeo com download progressivo. falso se o arquivo FLV no est codificado com um quadro-chave no ltimo quadro. Uma matriz de objetos, uma para cada ponto de sinalizao incorporado no arquivo FLV. O valor indefinido se o arquivo FLV no contiver pontos de sinalizao. Cada objeto tem as seguintes propriedades:

cuePoints


duration framerate height seekpoints

type: string que especifica o tipo do ponto de sinalizao como "navegao" ou "evento". name: string que o nome do ponto de sinalizao. time: nmero que a hora do ponto de sinalizao em segundos, com uma preciso de trs casas decimais (milsimos de segundo). parameters: objeto opcional que tem pares de nome/valor que o usurio designa ao criar os pontos de

sinalizao. Um nmero que representa a durao do arquivo de vdeo em segundos. Um nmero que representa a taxa de quadros do arquivo FLV. Um nmero que representa a altura do arquivo FLV em pixels. Uma matriz que lista os quadros-chave disponveis como carimbos de data/hora em milsimos de segundo. Opcional. Uma matriz de pares chave/valor que representam as informaes no ncleo ilst, que o equivalente de tags ID3 para arquivos MP4. O iTunes usa essas tags. Pode ser usado para exibir arte-final, se disponvel. Objeto que fornece informaes sobre todas as faixas do arquivo MP4, inclusive o ID de descrio da amostra. Uma string que representa a verso de codec que foi usada para codificar o vdeo. - por exemplo, avc1 ou VP6F Um nmero que representa a taxa de dados do vdeo do arquivo FLV. Taxa de quadros do vdeo MP4. Um nmero que representa a largura do arquivo FLV em pixels.

tags

trackinfo videocodecid

videodatarate videoframerate width

A tabela a seguir mostra os valores possveis para o parmetro videocodecid:


videocodecid 2 3 4 5 Nome do codec Sorenson H.263 Vdeo de tela (somente SWF verso 7 e posteriores) VP6 (somente SWF verso 8 e posteriores) Vdeo VP6 com canal alfa (somente SWF verso 8 e posteriores)

A tabela a seguir mostra os valores possveis para o parmetro audiocodecid:


audiocodecid 0 1 2 4 Nome do codec no compactado ADPCM Mp3 Nellymoser @ 16 kHz mono

PROGRAMAO DO ACTIONSCRIPT 3.0 553


Trabalho com vdeo

audiocodecid 5 6 10 11

Nome do codec Nellymoser, 8 kHz mono Nellymoser AAC Speex

Uso de onXMPData()
A funo de retorno de chamada onXMPData() recebe informaes especficas da plataforma XMP (Extensible Metadata Platform) da Adobe que so incorporadas ao arquivo de vdeo Adobe F4V ou FLV. Os metadados XMP incluem pontos de sinalizao e outros metadados de vdeo. Os metadados XMP foram introduzidos no Flash Player 10 e so suportados pelas verses subseqentes do Flash Player e do Adobe AIR. Este exemplo processa dados de ponto de sinalizao nos metadados XMP:
package { import import import import

flash.display.*; flash.net.*; flash.events.NetStatusEvent; flash.media.Video;

public class onXMPDataExample extends Sprite { public function onXMPDataExample():void { var videoConnection:NetConnection = new NetConnection(); videoConnection.connect(null); var videoStream:NetStream = new NetStream(videoConnection); videoStream.client = this; var video:Video = new Video(); addChild(video); video.attachNetStream(videoStream); videoStream.play("video.f4v"); } public function onMetaData(info:Object):void { trace("onMetaData fired"); } public function onXMPData(infoObject:Object):void { trace("onXMPData Fired\n"); //trace("raw XMP =\n"); //trace(infoObject.data); var cuePoints:Array = new Array(); var cuePoint:Object; var strFrameRate:String; var nTracksFrameRate:Number; var strTracks:String = "";

PROGRAMAO DO ACTIONSCRIPT 3.0 554


Trabalho com vdeo

var onXMPXML = new XML(infoObject.data); // Set up namespaces to make referencing easier var xmpDM:Namespace = new Namespace("http://ns.adobe.com/xmp/1.0/DynamicMedia/"); var rdf:Namespace = new Namespace("http://www.w3.org/1999/02/22-rdf-syntax-ns#"); for each (var it:XML in onXMPXML..xmpDM::Tracks) { var strTrackName:String = it.rdf::Bag.rdf::li.rdf::Description.@xmpDM::trackName; var strFrameRateXML:String = it.rdf::Bag.rdf::li.rdf::Description.@xmpDM::frameRate; strFrameRate = strFrameRateXML.substr(1,strFrameRateXML.length); nTracksFrameRate = Number(strFrameRate); strTracks += it; } var onXMPTracksXML:XML = new XML(strTracks); var strCuepoints:String = ""; for each (var item:XML in onXMPTracksXML..xmpDM::markers) { strCuepoints += item; } trace(strCuepoints); } } }

No caso de um arquivo de vdeo curto chamado startrekintro.f4v, este exemplo produz as linhas de rastreamento a seguir. As linhas mostram os dados de ponto de sinalizao referentes a pontos de sinalizao de navegao e de eventos nos metadados XMP:

PROGRAMAO DO ACTIONSCRIPT 3.0 555


Trabalho com vdeo

onMetaData fired onXMPData Fired <xmpDM:markers xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpDM="http://ns.adobe.com/xmp/1.0/DynamicMedia/" xmlns:stDim="http://ns.adobe.com/xap/1.0/sType/Dimensions#" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdfsyntax-ns#" xmlns:x="adobe:ns:meta/"> <rdf:Seq> <rdf:li> <rdf:Description xmpDM:startTime="7695905817600" xmpDM:name="Title1" xmpDM:type="FLVCuePoint" xmpDM:cuePointType="Navigation"> <xmpDM:cuePointParams> <rdf:Seq> <rdf:li xmpDM:key="Title" xmpDM:value="Star Trek"/> <rdf:li xmpDM:key="Color" xmpDM:value="Blue"/> </rdf:Seq> </xmpDM:cuePointParams> </rdf:Description> </rdf:li> <rdf:li> <rdf:Description xmpDM:startTime="10289459980800" xmpDM:name="Title2" xmpDM:type="FLVCuePoint" xmpDM:cuePointType="Event"> <xmpDM:cuePointParams> <rdf:Seq> <rdf:li xmpDM:key="William Shatner" xmpDM:value="First Star"/> <rdf:li xmpDM:key="Color" xmpDM:value="Light Blue"/> </rdf:Seq> </xmpDM:cuePointParams> </rdf:Description> </rdf:li> </rdf:Seq> </xmpDM:markers> onMetaData fired

Nota: Nos dados XMP, o tempo armazenado como Tiques DVA e no como segundos. Para calcular o tempo do ponto de sinalizao, divida a hora inicial pela taxa de quadros. Por exemplo, a hora inicial de 7695905817600 dividida por uma taxa de quadros de 254016000000 igual a 30:30. Para ver os metadados XMP brutos completos, que incluem a taxa de quadros, remova os identificadores de comentrio (//s) que precedem a segunda e a terceira instrues trace() no incio da funo onXMPData(). Para obter mais informaes sobre a XMP, consulte:

http://partners.adobe.com/public/developer/xmp/topic.html http://www.adobe.com/devnet/xmp/

Uso de metadados de imagem


O evento onImageData envia dados de imagem como uma matriz de bytes por um canal de dados AMF0. Os dados podem estar nos formatos JPEG, PNG ou GIF. Defina um mtodo de retorno de chamada onImageData() para processar essas informaes, da mesma forma que voc definiria mtodos de retorno de chamada para onCuePoint e onMetaData. Este exemplo acessa e exibe dados de imagem usando um mtodo de retorno de chamada onImageData():

PROGRAMAO DO ACTIONSCRIPT 3.0 556


Trabalho com vdeo

public function onImageData(imageData:Object):void { // display track number trace(imageData.trackid); var loader:Loader = new Loader(); //imageData.data is a ByteArray object loader.loadBytes(imageData.data); addChild(loader); }

Uso de metadados de texto


O evento onTextData envia dados de texto por meio de um canal de dados AMF0. Os dados de texto esto no formato UTF-8 e contm informaes adicionais sobre formatao com base na especificao de texto com tempo 3GP. Essa especificao define um formato de legenda padronizado. Defina um mtodo de retorno de chamada onTextData() para processar essas informaes, da mesma forma que voc definiria mtodos de retorno de chamada para onCuePoint ou onMetaData. No prximo exemplo, o mtodo onTextData() exibe o nmero de identificao da faixa e o texto da faixa correspondente.
public function onTextData(textData:Object):void { // display the track number trace(textData.trackid); // displays the text, which can be a null string, indicating old text // that should be erased trace(textData.text); }

Captura da entrada da cmera


Alm de arquivos de vdeo externos, uma cmera conectada ao computador de um usurio pode funcionar como fonte de dados de vdeo, que voc pode exibir e manipular usando o ActionScript. A classe Camera o mecanismo que foi incorporado ao ActionScript para trabalhar com uma cmera de computador.

Noes bsicas sobre a classe Camera


O objeto Camera permite que voc se conecte cmera local do usurio e transmita o vdeo localmente (para o usurio) ou remotamente para um servidor (como o Flash Media Server). Usando a classe Camera, possvel acessar os seguintes tipos de informaes sobre a cmera do usurio:

Quais cmeras instaladas no computador do usurio esto disponveis para o Flash Player Se h uma cmera instalada Se o Flash Player tem acesso cmera do usurio ou no Qual cmera est ativa A largura e a altura do vdeo que est sendo capturado
A classe Camera inclui vrios mtodos e propriedades teis para trabalhar com objetos Camera. Por exemplo, a propriedade esttica Camera.names contm uma matriz de nomes de cmeras que esto instaladas no computador do usurio. Voc tambm pode usar a propriedade name para exibir o nome da cmera que est ativa.

PROGRAMAO DO ACTIONSCRIPT 3.0 557


Trabalho com vdeo

Exibio do contedo da cmera na tela


A conexo a uma cmera pode exigir menos cdigo do que usar as classes NetConnection e NetStream para carregar um vdeo. A classe Camera tambm pode rapidamente se tornar complicada porque, com o Flash Player, voc precisa da permisso do usurio para se conectar cmera dele antes de acess-la. Este cdigo demonstra como usar a classe Camera para se conectar cmera local de um usurio:
var cam:Camera = Camera.getCamera(); var vid:Video = new Video(); vid.attachCamera(cam); addChild(vid);

Nota: A classe Camera no tem um mtodo construtor. Para criar uma nova ocorrncia de Camera, use o mtodo esttico Camera.getCamera().

Desenvolvimento do aplicativo de cmera


Ao criar um aplicativo que se conecta cmera de um usurio, considere os seguintes aspectos no seu cdigo:

Verifique se o usurio tem uma cmera instalada. Somente no Flash Player, verifique se o usurio permitiu acesso cmera explicitamente. Por motivo de segurana,
o player exibe a caixa de dilogo Configuraes do Flash Player, onde o usurio pode conceder ou negar acesso sua cmera. Isso impede que o Flash Player se conecte cmera de um usurio e transmita um fluxo de vdeo sem a devida permisso. Se um usurio clicar em permitir, o aplicativo poder se conectar cmera. Se ele clicar em negar, o aplicativo no conseguir ter acesso cmera do usurio. Seus aplicativos sempre devem manipular os dois casos normalmente.

Conexo cmera de um usurio


A primeira etapa para se conectar cmera de um usurio criar uma nova ocorrncia de Camera criando uma varivel do tipo Camera e a inicializando com o valor de retorno do mtodo esttico Camera.getCamera(). A prxima etapa criar um novo objeto de vdeo e conectar o objeto Camera a ele. A terceira etapa adicionar o objeto de vdeo lista de exibio. Voc precisa executar as etapas 2 e 3 porque a classe Camera no estende a classe DisplayObject, por isso no possvel adicion-la diretamente lista de exibio. Para exibir o vdeo capturado da cmera, crie um novo objeto de vdeo e chame o mtodo attachCamera(). O seguinte cdigo mostra estas trs etapas:
var cam:Camera = Camera.getCamera(); var vid:Video = new Video(); vid.attachCamera(cam); addChild(vid);

Observe que, se o usurio no tiver uma cmera instalada, o aplicativo no exibir nada. Na prtica, voc precisa executar outras etapas que envolvem o seu aplicativo. Para obter mais informaes, consulte Verificao da instalao das cmeras na pgina 558 e Deteco de permisses de acesso cmera na pgina 558.

PROGRAMAO DO ACTIONSCRIPT 3.0 558


Trabalho com vdeo

Verificao da instalao das cmeras


Antes de tentar usar qualquer um dos mtodos ou propriedades em uma ocorrncia de Camera, recomendvel verificar se o usurio tem uma cmera instalada. H duas maneiras de fazer essa verificao:

Verifique a propriedade esttica Camera.names que contm uma matriz de nomes de cmeras que esto
disponveis. Normalmente, essa matriz ter no mximo 1 string, porque provvel que a maioria dos usurios no tenha mais de uma cmera instalada. Este cdigo demonstra como verificar a propriedade Camera.names para saber se o usurio tem alguma cmera disponvel:
if (Camera.names.length > 0) { trace("User has at least one camera installed."); var cam:Camera = Camera.getCamera(); // Get default camera. } else { trace("User has no cameras installed."); }

Verifique o valor de retorno do mtodo esttico Camera.getCamera(). Se no houver nenhuma cmera disponvel
ou instalada, o mtodo retornar null; caso contrrio, ele retornar uma referncia a um objeto Camera. Este cdigo demonstra como verificar o mtodo Camera.getCamera() para saber se o usurio tem alguma cmera disponvel:
var cam:Camera = Camera.getCamera(); if (cam == null) { trace("User has no cameras installed."); } else { trace("User has at least 1 camera installed."); }

Como a classe Camera no estende a classe DisplayObject, no pode ser adicionada diretamente lista de exibio usando o mtodo addChild(). Para exibir o vdeo capturado da cmera, preciso criar um novo objeto Video e chamar o mtodo attachCamera() na ocorrncia de Video. Este snippet mostra como conectar a cmera, se disponvel; se no houver uma cmera, o aplicativo no exibir nada:
var cam:Camera = Camera.getCamera(); if (cam != null) { var vid:Video = new Video(); vid.attachCamera(cam); addChild(vid); }

Deteco de permisses de acesso cmera


Na caixa de proteo do aplicativo AIR, o aplicativo pode acessar qualquer cmera sem a permisso do usurio. Para que o Flash Player possa exibir a sada de uma cmera, o usurio deve permitir o acesso do Flash Player cmera explicitamente. Quando o mtodo attachCamera() chamado, o Flash Player exibe a caixa de dilogo Configuraes do Flash Player, que pede para o usurio conceder ou negar acesso cmera e ao microfone para o Flash Player. Se o usurio clicar no boto Permitir, o Flash Player exibir a sada da cmera na ocorrncia de Video no Palco. Se o usurio clicar no boto Negar, o Flash Player no conseguir se conectar cmera, e o objeto Video no exibir nada.

PROGRAMAO DO ACTIONSCRIPT 3.0 559


Trabalho com vdeo

Para detectar se o usurio concedeu acesso cmera para o Flash Player, voc pode monitorar o evento status da cmera (StatusEvent.STATUS), como visto neste cdigo:
var cam:Camera = Camera.getCamera(); if (cam != null) { cam.addEventListener(StatusEvent.STATUS, statusHandler); var vid:Video = new Video(); vid.attachCamera(cam); addChild(vid); } function statusHandler(event:StatusEvent):void { // This event gets dispatched when the user clicks the "Allow" or "Deny" // button in the Flash Player Settings dialog box. trace(event.code); // "Camera.Muted" or "Camera.Unmuted" }

A funo statusHandler() chamada assim que o usurio clica em Permitir ou Negar. Voc pode detectar em qual boto o usurio clicou usando um destes dois mtodos:

O parmetro event da funo statusHandler() contm uma propriedade de cdigo que inclui a string
Camera.Muted ou Camera.Unmuted. Se o valor Camera.Muted, isso significa que o usurio clicou no boto Negar e o Flash Player no pode acessar a cmera. Este snippet mostra um exemplo disso:
function statusHandler(event:StatusEvent):void { switch (event.code) { case "Camera.Muted": trace("User clicked Deny."); break; case "Camera.Unmuted": trace("User clicked Accept."); break; } }

A classe Camera contm uma propriedade somente leitura chamada muted que especifica se o usurio negou acesso
cmera (true) ou se permitiu acesso a ela (false) no painel Privacidade do Flash Player. Este snippet mostra um exemplo disso:
function statusHandler(event:StatusEvent):void { if (cam.muted) { trace("User clicked Deny."); } else { trace("User clicked Accept."); } }

Verificando o eventos de status a ser despachado, voc pode criar um cdigo que lide com a aceitao ou a negao do acesso cmera pelo usurio e fazer as devidas excluses. Por exemplo, se o usurio clicar no boto Negar, voc poder exibir uma mensagem informando que ele deve clicar em Permitir se deseja participar de um bate-papo com vdeo, ou voc poder verificar se o objeto Video da lista de exibio foi excludo para liberar recursos do sistema.

PROGRAMAO DO ACTIONSCRIPT 3.0 560


Trabalho com vdeo

Maximizao da qualidade do vdeo


Por padro, as novas ocorrncias da classe Video tm 320 pixels de largura por 240 pixels de altura. Para maximizar a qualidade dos vdeos, sempre verifique se o objeto de vdeo tem as mesmas dimenses do vdeo retornado pelo objeto de cmera. Para obter a largura e a altura do objeto de cmera, use as propriedades width e height da classe Camera; em seguida, voc pode definir as propriedades width e height do objeto de vdeo de modo que correspondam s dimenses dos objetos de cmera, ou pode passar a largura e a altura da cmera para o mtodo construtor da classe Video, como visto neste snippet:
var cam:Camera = Camera.getCamera(); if (cam != null) { var vid:Video = new Video(cam.width, cam.height); vid.attachCamera(cam); addChild(vid); }

Uma vez que o mtodo getCamera() retorna uma referncia a um objeto de cmera (ou null se no houver cmeras disponveis), voc poder acessar os mtodos e as propriedades da cmera mesmo que o usurio negue acesso a ela. Isso permite que voc defina o tamanho da ocorrncia de vdeo usando a altura e a largura nativas da cmera.
var vid:Video; var cam:Camera = Camera.getCamera(); if (cam == null) { trace("Unable to locate available cameras."); } else { trace("Found camera: " + cam.name); cam.addEventListener(StatusEvent.STATUS, statusHandler); vid = new Video(); vid.attachCamera(cam); } function statusHandler(event:StatusEvent):void { if (cam.muted) { trace("Unable to connect to active camera."); } else { // Resize Video object to match camera settings and // add the video to the display list. vid.width = cam.width; vid.height = cam.height; addChild(vid); } // Remove the status event listener. cam.removeEventListener(StatusEvent.STATUS, statusHandler); }

Para obter informaes sobre o modo de tela cheia, consulte a seo Modo de tela cheia em Configurao de propriedades do palco na pgina 287.

PROGRAMAO DO ACTIONSCRIPT 3.0 561


Trabalho com vdeo

Monitoramento das condies de reproduo


A classe Camera contm vrias propriedades que permitem monitorar o status atual do objeto Camera. Por exemplo, este cdigo exibe diversas propriedades da cmera usando um objeto Timer e uma ocorrncia de campo de texto na lista de exibio:
var vid:Video; var cam:Camera = Camera.getCamera(); var tf:TextField = new TextField(); tf.x = 300; tf.autoSize = TextFieldAutoSize.LEFT; addChild(tf); if (cam != null) { cam.addEventListener(StatusEvent.STATUS, statusHandler); vid = new Video(); vid.attachCamera(cam); } function statusHandler(event:StatusEvent):void { if (!cam.muted) { vid.width = cam.width; vid.height = cam.height; addChild(vid); t.start(); } cam.removeEventListener(StatusEvent.STATUS, statusHandler); } var t:Timer = new Timer(100); t.addEventListener(TimerEvent.TIMER, timerHandler); function timerHandler(event:TimerEvent):void { tf.text = ""; tf.appendText("activityLevel: " + cam.activityLevel + "\n"); tf.appendText("bandwidth: " + cam.bandwidth + "\n"); tf.appendText("currentFPS: " + cam.currentFPS + "\n"); tf.appendText("fps: " + cam.fps + "\n"); tf.appendText("keyFrameInterval: " + cam.keyFrameInterval + "\n"); tf.appendText("loopback: " + cam.loopback + "\n"); tf.appendText("motionLevel: " + cam.motionLevel + "\n"); tf.appendText("motionTimeout: " + cam.motionTimeout + "\n"); tf.appendText("quality: " + cam.quality + "\n"); }

A cada 1/10 de segundo (100 milissegundos) o evento timer do objeto Timer despachado, e a funo timerHandler() atualiza o campo de texto na lista de exibio.

PROGRAMAO DO ACTIONSCRIPT 3.0 562


Trabalho com vdeo

Envio de vdeo para um servidor


Se voc deseja criar aplicativos mais complexos que envolvam objetos de vdeo ou cmera, o Flash Media Server oferece uma combinao de recursos de fluxo de mdia e um ambiente de desenvolvimento para criar e disponibilizar aplicativos de mdia para um grande pblico. Esta combinao permite que os desenvolvedores criem aplicativos como Vdeo sob Demanda, transmisses ao vivo de eventos pela Web e streaming Mp3, alm de publicao de vdeos em blogs, envio de vdeos via mensagens instantneas e ambientes de bate-papo com recursos multimdia. Para obter mais informaes, consulte a documentao on-line do Flash Media Server em www.adobe.com/go/learn_fms_docs_br.

Tpicos avanados sobre arquivos FLV


Os tpicos a seguir abordam algumas questes especiais sobre o trabalho com arquivos FLV.

Sobre a configurao de arquivos FLV para hospedagem em um servidor


Quando voc trabalha com arquivos FLV, pode ser necessrio configurar o servidor para trabalhar com o formato de arquivo FLV. MIME (Multipurpose Internet Mail Extensions) uma especificao de dados padronizada que permite enviar arquivos no-ASCII por conexes de Internet. Navegadores da Web e clientes de e-mail so configurados para interpretar inmeros tipos MIME de maneira que possam enviar e receber vdeo, udio, grficos e texto formatado. Para carregar arquivos FLV de um servidor Web, talvez voc precise registrar a extenso de arquivo e o tipo MIME no servidor Web; para isso, consulte a documentao do servidor Web. O tipo MIME de arquivos FLV video/x-flv. As informaes completas sobre o tipo de arquivo FLV so as seguintes:

Tipo MIME: video/x-flv Extenso de arquivo: .flv Parmetros necessrios: nenhum Parmetros opcionais: nenhum Consideraes de codificao: os arquivos FLV so binrios; alguns aplicativos podem exigir que o subtipo
application/octet-stream seja definido

Problemas de segurana: nenhum Especificao publicada: www.adobe.com/go/video_file_format_br


A Microsoft mudou a forma de tratamento de fluxos de mdia no servidor Web Microsoft Internet Information Services (IIS) 6.0 em relao a verses anteriores. As verses anteriores do IIS no exigem modificaes para transmitir vdeo Flash em fluxo. No IIS 6.0, o servidor Web padro fornecido com o Windows 2003, o servidor requer um tipo MIME para reconhecer que os arquivos FLV so fluxo de mdia. Quando arquivos SWF que transmitem arquivos FLV externos em fluxo contnuo so colocados no Microsoft Windows Server 2003 e visualizados em um navegador, o arquivo SWF reproduzido corretamente, mas o vdeo FLV no transmitido em fluxo contnuo. Este problema afeta todos os arquivos FLV colocados no Windows Server 2003, inclusive os arquivos criados com verses anteriores da Ferramenta de autoria do Flash e com o Macromedia Flash Video Kit para Dreamweaver MX 2004 da Adobe. Esses arquivos funcionaro corretamente se voc test-los em outros sistemas operacionais. Para obter informaes sobre como configurar o Microsoft Windows 2003 e o Microsoft IIS Server 6.0 para transmisso de vdeos FLV em fluxo contnuo, consulte www.adobe.com/go/tn_19439_br.

PROGRAMAO DO ACTIONSCRIPT 3.0 563


Trabalho com vdeo

Sobre direcionamento de arquivos FLV locais no Macintosh


Se voc tentar reproduzir um arquivo FLV local de uma unidade que no do sistema em um computador com o Apple Macintosh usando um caminho que contm uma barra relativa (/), o vdeo no ser reproduzido. Unidades que no so do sistema incluem mas no se limitam a CD-ROMs, discos rgidos particionados, mdia de armazenamento removveis e dispositivos de armazenamento conectados. Nota: O motivo desta falha uma limitao do sistema operacional e no do Flash Player ou do AIR. Para que um arquivo FLV seja reproduzido de uma unidade que no do sistema em um Macintosh, faa referncia a ela com um caminho absoluto usando uma notao baseada em dois pontos (:) em vez de barra (/). A lista a seguir mostra a diferena entre os dois tipos de notao:

Notao baseada em barra: myDrive/myFolder/myFLV.flv Notao baseada em dois pontos: (Mac OS) myDrive:myFolder:myFLV.flv
Tambm possvel criar um arquivo de projetor para um CD-ROM que voc pretende usar para reproduo no Macintosh. Para obter informaes mais recentes sobre CD-ROMs do Mac OS e arquivos FLV, consulte www.adobe.com/go/3121b301_br.

Exemplo: Jukebox de vdeo


O exemplo a seguir cria uma jukebox de vdeo simples que carrega uma lista de vdeos dinamicamente para reproduo em seqncia. Isso permite que voc crie um aplicativo com o qual um usurio pode navegar por uma srie de tutoriais em vdeo ou talvez especificar quais anncios devem ser reproduzidos antes de reproduzir o vdeo solicitado pelo usurio. Este exemplo mostra os seguintes recursos do ActionScript 3.0:

Atualizao de um indicador de reproduo com base no progresso da reproduo de um arquivo de vdeo Monitoramento e anlise dos metadados de um arquivo de vdeo Manipulao de cdigos especficos em um fluxo de rede Carregamento, reproduo, pausa e interrupo de um FLV carregado dinamicamente Redimensionamento de um objeto de vdeo na lista de exibio com base nos metadados do fluxo de rede
Para obter os arquivos de aplicativo deste exemplo, consulte www.adobe.com/go/learn_programmingAS3samples_flash_br. Os arquivos do aplicativo Jukebox de vdeo podem ser encontrados na pasta Samples/VideoJukebox. O aplicativo consiste nos seguintes arquivos:
Arquivo VideoJukebox.as VideoJukebox.fla playlist.xml Descrio A classe que fornece a funcionalidade principal do aplicativo. O arquivo de aplicativo principal para Flash. Um arquivo que lista quais arquivos de vdeo sero carregados na jukebox de vdeo.

Carregamento de um arquivo externo de lista de reproduo de vdeo


O arquivo externo playlist.xml especifica os vdeos que devem ser carregados e a ordem em que sero reproduzidos. Para carregar o arquivo XML, voc precisa usar um objeto URLLoader e um objeto URLRequest, como visto neste cdigo:

PROGRAMAO DO ACTIONSCRIPT 3.0 564


Trabalho com vdeo

uldr = new URLLoader(); uldr.addEventListener(Event.COMPLETE, xmlCompleteHandler); uldr.load(new URLRequest(PLAYLIST_XML_URL));

Este cdigo colocado no construtor da classe VideoJukebox para que o arquivo seja carregado antes da execuo de qualquer outro cdigo. Assim que termina o carregamento do arquivo XML, chamado o mtodo xmlCompleteHandler(), que analisa o arquivo externo em um objeto XML, como visto neste cdigo:
private function xmlCompleteHandler(event:Event):void { playlist = XML(event.target.data); videosXML = playlist.video; main(); }

O objeto XML playlist contm o XML bruto do arquivo externo, enquanto videosXML um objeto XMLList que contm apenas os ns de vdeo. Um arquivo playlist.xml de exemplo pode ser visto no seguinte snippet:
<videos> <video url="video/caption_video.flv" /> <video url="video/cuepoints.flv" /> <video url="video/water.flv" /> </videos>

Para finalizar, o mtodo xmlCompleteHandler() chama o mtodo main(), que configura as vrias ocorrncias de componente na lista de exibio, bem como os objetos NetConnection e NetStream que so usados para carregar os arquivos FLV externos.

Criao da interface de usurio


Para criar a interface de usurio, voc precisa arrastar cinco ocorrncias de Button at a lista de exibio e dar a elas os seguintes nomes de ocorrncia: playButton, pauseButton, stopButton, backButton e forwardButton. Para cada uma dessas ocorrncias de Button, voc ter de atribuir um manipulador para o evento click, como visto no seguinte snippet:
playButton.addEventListener(MouseEvent.CLICK, buttonClickHandler); pauseButton.addEventListener(MouseEvent.CLICK, buttonClickHandler); stopButton.addEventListener(MouseEvent.CLICK, buttonClickHandler); backButton.addEventListener(MouseEvent.CLICK, buttonClickHandler); forwardButton.addEventListener(MouseEvent.CLICK, buttonClickHandler);

O mtodo buttonClickHandler() usa uma instruo de opo para determinar qual ocorrncia de Button foi clicada, como visto neste cdigo:

PROGRAMAO DO ACTIONSCRIPT 3.0 565


Trabalho com vdeo

private function buttonClickHandler(event:MouseEvent):void { switch (event.currentTarget) { case playButton: ns.resume(); break; case pauseButton: ns.togglePause(); break; case stopButton: ns.pause(); ns.seek(0); break; case backButton: playPreviousVideo(); break; case forwardButton: playNextVideo(); break; } }

Em seguida, adicione uma ocorrncia de Slider lista de exibio e d a ela um nome de ocorrncia de volumeSlider. O seguinte cdigo define a propriedade liveDragging da ocorrncia de Slider como true e um ouvinte de eventos para o evento change da ocorrncia de Slider:
volumeSlider.value = volumeTransform.volume; volumeSlider.minimum = 0; volumeSlider.maximum = 1; volumeSlider.snapInterval = 0.1; volumeSlider.tickInterval = volumeSlider.snapInterval; volumeSlider.liveDragging = true; volumeSlider.addEventListener(SliderEvent.CHANGE, volumeChangeHandler);

Adicione uma ocorrncia de ProgressBar lista de exibio e d a ela um nome de ocorrncia de positionBar. Defina a propriedade mode como manual, conforme visto no seguinte snippet:
positionBar.mode = ProgressBarMode.MANUAL;

Para terminar, adicione uma ocorrncia de Label lista de exibio e d a ela um nome de ocorrncia de positionLabel. O valor dessa ocorrncia de Label ser definido pela ocorrncia de Timer.

Monitoramento dos metadados de um objeto de vdeo


Quando o Flash Player encontra metadados de cada um dos vdeos carregados, o manipulador de retorno de chamada onMetaData() chamado na propriedade client do objeto NetStream. O seguinte cdigo inicializa um Object e configura o manipulador de retorno de chamada especificado:
client = new Object(); client.onMetaData = metadataHandler;

O mtodo metadataHandler() copia seus dados para a propriedade meta definida anteriormente no cdigo. Isso permite que voc acesse os metadados do vdeo atual a qualquer momento em todo o aplicativo. Em seguida, o objeto de vdeo no Palco redimensionado para corresponder s dimenses retornadas nos metadados. Por ltimo, a ocorrncia da barra de progresso positionBar movida e redimensionada com base no tamanho do vdeo que est sendo reproduzido. O seguinte cdigo contm o mtodo metadataHandler() inteiro:

PROGRAMAO DO ACTIONSCRIPT 3.0 566


Trabalho com vdeo

private function metadataHandler(metadataObj:Object):void { meta = metadataObj; vid.width = meta.width; vid.height = meta.height; positionBar.move(vid.x, vid.y + vid.height); positionBar.width = vid.width; }

Carregamento dinmico de um vdeo Flash


Para carregar cada um dos vdeos Flash dinamicamente, o aplicativo usa um objeto NetConnection e NetStream. O cdigo a seguir cria um objeto NetConnection e passa null para o mtodo connect(). Especificando null, o Flash Player se conecta a um vdeo do servidor local em vez de se conectar a um servidor, como o Flash Media Server. O seguinte cdigo cria ocorrncias de NetConnection e de NetStream, define um ouvinte de eventos para o evento netStatus e atribui Object client propriedade client:
nc = new NetConnection(); nc.connect(null); ns = new NetStream(nc); ns.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); ns.client = client;

O mtodo netStatusHandler() chamado sempre que o status do vdeo alterado. Isso inclui as ocasies em que a reproduo de um vdeo iniciada ou interrompida, quando o vdeo armazenado em buffer ou quando um fluxo de vdeo no encontrado. O seguinte cdigo lista o evento netStatusHandler():
private function netStatusHandler(event:NetStatusEvent):void { try { switch (event.info.code) { case "NetStream.Play.Start": t.start(); break; case "NetStream.Play.StreamNotFound": case "NetStream.Play.Stop": t.stop(); playNextVideo(); break; } } catch (error:TypeError) { // Ignore any errors. } }

O cdigo anterior avalia a propriedade de cdigo do objeto de informaes e filtra se o cdigo NetStream.Play.Start, NetStream.Play.StreamNotFound ou NetStream.Play.Stop. Todos os demais cdigos sero ignorados. Se o fluxo de rede estiver iniciando, o cdigo iniciar a ocorrncia de Timer que atualiza o indicador de reproduo. Se o fluxo de rede no for encontrado ou se for interrompido, a ocorrncia de Timer ser interrompida e o aplicativo tentar reproduzir o prximo vdeo da lista de reproduo.

PROGRAMAO DO ACTIONSCRIPT 3.0 567


Trabalho com vdeo

Sempre que Timer executado, a ocorrncia da barra de progresso positionBar atualiza sua posio atual chamando o mtodo setProgress() da classe ProgressBar, e a ocorrncia de Label positionLabel atualizada com o tempo decorrido e o total de tempo do vdeo atual.
private function timerHandler(event:TimerEvent):void { try { positionBar.setProgress(ns.time, meta.duration); positionLabel.text = ns.time.toFixed(1) + " of " meta.duration.toFixed(1) + " seconds"; } catch (error:Error) { // Ignore this error. } }

Controle do volume do vdeo


possvel controlar o volume do vdeo carregado dinamicamente definindo a propriedade soundTransform no objeto NetStream. O aplicativo de jukebox de vdeo permite modificar o nvel de volume alterando o valor da ocorrncia de Slider volumeSlider. Este cdigo mostra como alterar o nvel de volume atribuindo o valor do componente Slider a um objeto SoundTransform, que definido com a propriedade soundTransform no objeto NetStream:
private function volumeChangeHandler(event:SliderEvent):void { volumeTransform.volume = event.value; ns.soundTransform = volumeTransform; }

Controle da reproduo de vdeo


O restante do aplicativo controla a reproduo de vdeos quando o vdeo chega ao final do fluxo ou quando o usurio acessa o vdeo anterior ou o prximo. O seguinte mtodo recupera a URL do vdeo no objeto XMLList relativo ao ndice que est selecionado:
private function getVideo():String { return videosXML[idx].@url; }

O mtodo playVideo() chama o mtodo play() no objeto NetStream para carregar o vdeo que est selecionado:
private function playVideo():void { var url:String = getVideo(); ns.play(url); }

O mtodo playPreviousVideo() reduz o ndice de vdeos atual, chama o mtodo playVideo() para carregar o novo arquivo de vdeo e define a barra de progresso como visvel:

PROGRAMAO DO ACTIONSCRIPT 3.0 568


Trabalho com vdeo

private function playPreviousVideo():void { if (idx > 0) { idx--; playVideo(); positionBar.visible = true; } }

O ltimo mtodo, playNextVideo(), aumenta o ndice de vdeos e chama o mtodo playVideo(). Se o vdeo atual o ltimo da lista de reproduo, o mtodo clear() chamado no objeto Video, e a propriedade visible da ocorrncia da barra de progresso definida como false:
private function playNextVideo():void { if (idx < (videosXML.length() - 1)) { idx++; playVideo(); positionBar.visible = true; } else { idx++; vid.clear(); positionBar.visible = false; } }

569

Captulo 25: Trabalho com som


O ActionScript foi desenvolvido para aplicativos interativos de imerso, e um dos elementos muitas vezes negligenciado nesses aplicativos o som. possvel adicionar efeitos de som a um video game, feedback de udio para a interface do usurio de um aplicativo ou mesmo criar um programa que analisa arquivos MP3 carregados pela Internet, com som na base do aplicativo. Neste captulo, voc aprender como carregar arquivos de udio externos e trabalhar com udio incorporado em um SWF. Aprender a controlar o udio, a criar representaes visuais das informaes de som e a capturar som de um microfone do usurio.

Noes bsicas do trabalho com som


Introduo ao trabalho com som
Os computadores podem capturar e codificar udio digital, que a representao das informaes de som no computador, bem como armazen-lo e recuper-lo para reproduo pelos alto-falantes. possvel reproduzir som usando o Adobe Flash Player ou Adobe AIR e o ActionScript. Quando dados de som so convertidos em formato digital, eles tm vrias caractersticas, como o volume e se o som estreo ou mono. Quando voc reproduz um som no ActionScript, tambm pode ajustar essas caractersticas; por exemplo, voc pode aumentar o som ou fazer parecer que ele est vindo de uma certa direo. Para controlar um som no ActionScript, voc precisa ter as informaes do som carregadas no Flash Player ou no AIR. H cinco maneiras de inserir dados de udio no Flash Player ou AIR para que voc possa trabalhar com eles no ActionScript. possvel carregar um arquivo de som externo, como um mp3, no SWF; incorporar as informaes de som no arquivo SWF diretamente quando ele est sendo criado, obter entrada de udio usando um microfone conectado ao computador do usurio, acessar dados de som transmitidos de um servidor e trabalhar com dados de som gerados de maneira dinmica. Quando voc carrega dados de som a partir de um arquivo de som externo, pode comear a reproduzir o incio do arquivo enquanto o restante dos dados ainda esto sendo carregados. Embora existam vrios formatos de arquivo de som usados para codificar udio digital, o ActionScript 3.0, o Flash Player e o AIR do suporte a arquivos de som armazenados no formato mp3. Eles no podem carregar ou reproduzir arquivos de som diretamente em outros formatos, como WAV ou AIFF. Enquanto estiver trabalhando com som no ActionScript, provavelmente voc desejar trabalhar com vrias classes do pacote flash.media. A classe Sound a classe que voc usa para obter acesso a informaes de udio carregando um arquivo de som ou atribuindo uma funo a um evento que tira amostras de dados de som e, em seguida, inicia a reproduo. Depois que voc comea a reproduzir um som, o Flash Player e o AIR lhe do acesso a um objeto SoundChannel. Como um arquivo de udio carregado s pode ser um dos vrios sons que voc reproduz no computador de um usurio, cada som especfico reproduzido usa seu prprio objeto SoundChannel; a sada combinada de todos os objetos SoundChannel misturados na verdade consiste no que reproduzido pelos altofalantes do computador. Use esta ocorrncia de SoundChannel para controlar as propriedades do som e interromper a reproduo. Por ltimo, se voc deseja controlar o udio combinado, a classe SoundMixer lhe d controle sobre a sada combinada.

PROGRAMAO DO ACTIONSCRIPT 3.0 570


Trabalho com som

Tambm possvel usar vrias outras classes para executar tarefas mais especficas quando voc estiver trabalhando com som no ActionScript; para obter mais informaes sobre todas as classes relacionadas a som, consulte Compreenso da arquitetura do som na pgina 571.

Tarefas comuns do trabalho com som


Este captulo descreve as seguintes tarefas relacionadas a som que provavelmente voc desejar executar:

Carregamento de arquivos mp3 externos e controle do progresso da operao Reproduo, pausa, reincio e interrupo de sons Reproduo de fluxos de som durante seu carregamento Manipulao do volume e da panormica do som Recuperao de metadados ID3 de um arquivo mp3 Uso de dados de onda de som brutos Gerao dinmica de som Captura e reproduo de entrada de som a partir do microfone de um usurio

Conceitos e termos importantes


A lista de referncia a seguir contm termos importantes usados neste captulo:

Amplitude: a distncia de um ponto na forma de onda de som a partir da linha zero ou de equilbrio. Taxa de bits: a quantidade de dados que codificada ou transmitida em fluxo para cada segundo de um arquivo de
som. No caso de arquivos mp3, a taxa de bits normalmente informada em milhares de bits por segundo (kbps). Uma taxa de bits mais alta geralmente significa uma onda de som de melhor qualidade.

Armazenamento em buffer: o recebimento e o armazenamento de dados de som antes de eles serem reproduzidos. mp3: MPEG-1 Audio Layer 3, ou mp3, um formato popular de compactao de som. Panormica: o posicionamento de um sinal de udio entre os canais esquerdo e direito em um campo de som
estreo.

Pico: o ponto mais alto em uma forma de onda. Taxa de amostragem: define o nmero de amostras por segundo extradas de um sinal de udio analgico para criar
um sinal digital. A taxa de amostragem de udio de um CD padro de 44,1 kHz ou 44.100 amostras por segundo.

Streaming: o processo de reproduzir as partes iniciais de um arquivo de som ou de vdeo enquanto as partes finais
ainda esto sendo carregadas de um servidor.

Volume: o volume de um som. Forma de onda: a forma de um grfico das variadas amplitudes de um sinal de som ao longo do tempo.

Teste dos exemplos do captulo


Talvez voc queira testar algumas das listagens de cdigo de exemplo durante a leitura deste captulo. Como este captulo aborda o trabalho com som no ActionScript, muitos dos exemplos fazem algo que envolve o trabalho com um arquivo de som reproduzi-lo, interromper a reproduo ou ajustar o som de alguma maneira. Para testar os exemplos deste captulo:
1 Crie um novo documento do Flash e salve-o no seu computador.

PROGRAMAO DO ACTIONSCRIPT 3.0 571


Trabalho com som

2 Na Linha do tempo, selecione o primeiro quadro-chave e abra o painel Aes. 3 Copie a listagem de cdigo de exemplo no painel Script. 4 Se o cdigo envolver o carregamento de um arquivo de som externo, ele ter uma linha de cdigo parecida com esta:
var req:URLRequest = new URLRequest("click.mp3"); var s:Sound = new Sound(req); s.play();

onde click.mp3 o nome do arquivo de som que est sendo carregado. Para testar estes exemplos, voc precisar de um arquivo mp3 para us-lo. Coloque o arquivo mp3 na mesma pasta em que est o documento do Flash. Em seguida, altere o cdigo para usar o nome do seu arquivo mp3 em vez do nome especificado na listagem de cdigo (por exemplo, no cdigo acima, voc mudaria click.mp3 para o nome do seu arquivo mp3).
5 No menu principal, selecione Controle > Testar filme para criar o arquivo SWF e visualizar (e ouvir) a sada do

exemplo. Alm de reproduzir o udio, alguns dos exemplos exibem valores usando a funo trace(); quando estiver testando esses exemplos, voc ver os resultados desses valores no painel Sada. Alguns exemplos tambm desenham contedo na tela, por isso, nesses exemplos, voc tambm ver o contedo em uma janela do Flash Player ou do AIR. Para obter mais informaes sobre como testar as listagens de cdigo de exemplo deste manual, consulte Teste de listagens de cdigo de exemplo dos captulos na pgina 36.

Compreenso da arquitetura do som


Seus aplicativos podem carregar dados de som de cinco origens principais:

Arquivos de som externos carregados em tempo de execuo Recursos de som incorporados no arquivo SWF do aplicativo Dados de som de um microfone conectado ao sistema do usurio Dados de som transmitidos de um servidor de mdia remoto, como o Flash Media Server Dados de som gerados dinamicamente por meio do uso do manipulador de eventos sampleData
Dados de som podem ser carregados completamente antes de o som ser reproduzido ou podem ser transmitidos em fluxo, o que significa que o som reproduzido enquanto ainda est sendo carregado. As classes de som do ActionScript 3.0 do suporte a arquivos de som armazenados no formato mp3. Elas no podem carregar ou reproduzir arquivos de som diretamente em outros formatos, como WAV ou AIFF. No entanto, a partir do Flash Player 9.0.115.0, possvel carregar e reproduzir arquivos de udio AAC usando a classe NetStream. Esta tcnica a mesma utilizada para carregar e reproduzir contedo de vdeo. Para obter mais informaes sobre ela, consulte Trabalho com vdeo na pgina 527. Com o Adobe Flash CS4 Professional, possvel importar arquivos de som WAV ou AIFF e incorpor-los aos arquivos SWF do aplicativo no formato mp3. A ferramenta de autoria do Flash tambm permite compactar arquivos de som incorporados para reduzir o tamanho do arquivo, embora essa reduo de tamanho represente perda da qualidade do som. Para obter mais informaes, consulte Importao de sons em Uso do Flash. A arquitetura de som do ActionScript 3.0 usa as seguintes classes no pacote flash.media.

PROGRAMAO DO ACTIONSCRIPT 3.0 572


Trabalho com som

Classe flash.media.Sound

Descrio A classe Sound manipula o carregamento do som, gerencia propriedades bsicas de som e inicia uma reproduo de som. Quando um aplicativo reproduz um objeto Sound, um novo objeto SoundChannel criado para controlar a reproduo. O objeto SoundChannel controla o volume dos canais de reproduo direito e esquerdo do som. Cada som reproduzido tem seu prprio objeto SoundChannel. A classe SoundLoaderContext especifica o nmero de segundos de buffer a ser usado ao carregar um som e se o Flash Player ou o AIR deve procurar um arquivo de poltica no servidor quando carregar um arquivo. Um objeto SoundLoaderContext usado como um parmetro para o mtodo Sound.load(). A classe SoundMixer controla as propriedades de reproduo e de segurana relativas a todos os sons em um aplicativo. Em vigor, vrios canais de som so misturados por meio de um objeto SoundMixer comum, portanto valores de propriedades no objeto SoundMixer afetaro todos os objetos SoundChannel em execuo no momento. A classe SoundTransform contm valores que controlam o volume e o panorama do som. Um objeto SoundTransform pode ser aplicado a um objeto SoundChannel individual, ao objeto SoundMixer global ou a um objeto Microphone, entre outros. Um objeto ID3Info contm propriedades que representam informaes de metadados ID3 que normalmente so armazenados em arquivos de som mp3. A classe Microphone representa um microfone ou outro dispositivo de entrada de som conectado ao computador do usurio. A entrada de udio de um microfone pode ser roteada para alto-falantes locais ou enviada a um servidor remoto. O objeto Microphone controla o ganho, a taxa de amostragem e outras caractersticas de seu prprio fluxo de som.

flash.media.SoundChannel

flash.media.SoundLoaderContext

flash.media.SoundMixer

flash.media.SoundTransform

flash.media.ID3Info

flash.media.Microphone

Cada som carregado e reproduzido precisa de sua prpria ocorrncia das classes Sound e SoundChannel. A sada das vrias ocorrncias de SoundChannel ento misturada pela classe global SoundMixer durante a reproduo. As classes Sound, SoundChannel e SoundMixer no so usadas para dados de som obtidos de um microfone ou de um servidor de fluxo de mdia, como o Flash Media Server.

Carregamento de arquivos de som externos


Cada ocorrncia da classe Sound existe para carregar e disparar a reproduo de um recurso de som especfico. Um aplicativo no pode reutilizar um objeto Sound para carregar mais de um som. Para carregar um novo recurso de som, ele deve criar um novo objeto Sound. Se estiver carregando um arquivo de som pequeno, como um som de clique a ser conectado a um boto, o aplicativo poder criar um novo Sound e fazer com que ele carregue automaticamente o arquivo de som, conforme mostrado a seguir:
var req:URLRequest = new URLRequest("click.mp3"); var s:Sound = new Sound(req);

O construtor Sound() aceita um objeto URLRequest como seu primeiro parmetro. Quando um valor fornecido ao parmetro URLRequest, o novo objeto Sound comea a carregar o recurso de som especificado automaticamente. Em todos, menos nos casos mais simples, o aplicativo deve verificar se ocorrem erros durante o carregamento do som. Por exemplo, se o som de clique for razoavelmente grande, ele talvez no esteja completamente carregado quando o usurio clicar no boto que dispara o som. A tentativa de reproduzir um som no carregado pode provocar um erro em tempo de execuo. mais seguro aguardar que o carregamento do som seja concludo antes de permitir que os usurios executem aes que podem iniciar a reproduo de sons.

PROGRAMAO DO ACTIONSCRIPT 3.0 573


Trabalho com som

Um objeto Sound despacha vrios eventos diferentes durante o processo de carregamento do som. O aplicativo pode ouvir esses eventos para controlar o progresso de carregamento e verificar se o som foi completamente carregado antes da reproduo. A tabela a seguir lista os eventos que podem ser despachados por um objeto Sound.
Evento abertura (Event.OPEN) progresso (ProgressEvent.PROGRESS) id3 (Event.ID3) concludo (Event.COMPLETE) ioError (IOErrorEvent.IO_ERROR) Descrio Despachado imediatamente antes do incio da operao de carregamento do som. Despachado periodicamente durante o processo de carregamento do som quando os dados so recebidos do arquivo ou do fluxo. Despachado quando dados ID3 esto disponveis para um som mp3. Despachado quando todos os dados do recurso de som foram carregados. Despachado quando um arquivo de som no pode ser localizado ou quando o processo de carregamento interrompido antes dos dados serem recebidos.

O cdigo a seguir ilustra como reproduzir um som aps a concluso do carregamento:


import flash.events.Event; import flash.media.Sound; import flash.net.URLRequest; var s:Sound = new Sound(); s.addEventListener(Event.COMPLETE, onSoundLoaded); var req:URLRequest = new URLRequest("bigSound.mp3"); s.load(req); function onSoundLoaded(event:Event):void { var localSound:Sound = event.target as Sound; localSound.play(); }

Primeiro, o cdigo de amostra cria um novo objeto Sound sem dar a ele um valor inicial para o parmetro URLRequest. Em seguida, ele ouve o evento Event.COMPLETE do objeto Sound, o que faz com que o mtodo onSoundLoaded() seja executado quando todos os dados do som esto carregados. Em seguida, ele chama o mtodo Sound.load() com um novo valor de URLRequest para o arquivo de som. O mtodo onSoundLoaded() executado quando o carregamento do som concludo. A propriedade target do objeto Event uma referncia ao objeto Sound. A chamada do mtodo play() do objeto Sound inicia a reproduo do som.

Monitoramento do processo de carregamento do som


Arquivos de som podem ser muito grandes e levar muito tempo para serem carregados. Embora o Flash Player e o AIR permitam que o aplicativo reproduza sons mesmo antes de eles serem completamente carregados, talvez voc queira dar ao usurio uma indicao da quantidade de dados de som carregada e da quantidade de som que j foi reproduzida. A classe Sound despacha dois eventos que facilitam relativamente a exibio do progresso de carregamento de um som: ProgressEvent.PROGRESS e Event.COMPLETE. O exemplo a seguir mostra como usar esses eventos para exibir informaes de progresso sobre o som que est sendo carregado:

PROGRAMAO DO ACTIONSCRIPT 3.0 574


Trabalho com som

import import import import

flash.events.Event; flash.events.ProgressEvent; flash.media.Sound; flash.net.URLRequest;

var s:Sound = new Sound(); s.addEventListener(ProgressEvent.PROGRESS, onLoadProgress); s.addEventListener(Event.COMPLETE, onLoadComplete); s.addEventListener(IOErrorEvent.IO_ERROR, onIOError); var req:URLRequest = new URLRequest("bigSound.mp3"); s.load(req); function onLoadProgress(event:ProgressEvent):void { var loadedPct:uint = Math.round(100 * (event.bytesLoaded / event.bytesTotal)); trace("The sound is " + loadedPct + "% loaded."); } function onLoadComplete(event:Event):void { var localSound:Sound = event.target as Sound; localSound.play(); } function onIOError(event:IOErrorEvent) { trace("The sound could not be loaded: " + event.text); }

Esse cdigo primeiro cria um objeto Sound e, em seguida, adiciona ouvintes para esse objeto para os eventos ProgressEvent.PROGRESS e Event.COMPLETE. Aps o mtodo Sound.load() ter sido chamado e os primeiros dados terem sido recebidos do arquivo de som, ocorre um evento ProgressEvent.PROGRESS que dispara o mtodo onSoundLoadProgress(). A porcentagem dos dados de som que foi carregada igual ao valor da propriedade bytesLoaded do objeto gressEvent dividido pelo valor da propriedade bytesTotal. As mesmas propriedades bytesLoaded e bytesTotal esto disponveis no objeto Sound tambm. O exemplo acima simplesmente mostra mensagens sobre o progresso do carregamento do som, mas possvel usar facilmente os valores de bytesLoaded e bytesTotal para atualizar os componentes da barra de progresso, como os provenientes da estrutura do Adobe Flex 3 ou da Ferramenta de autoria do Flash. Esse exemplo tambm mostra como um aplicativo pode reconhecer e responder a um erro ao carregar arquivos de som. Por exemplo, se um arquivo de som com o nome fornecido no puder ser localizado, um evento Event.IO_ERROR ser despachado pelo objeto Sound. No cdigo anterior, o mtodo onIOError() executa e exibe uma breve mensagem de erro quando ocorre um erro.

Trabalho com sons incorporados


O uso de sons incorporados, em vez do carregamento de som de um arquivo externo, mais til para pequenos sons que so usados como indicadores dentro da interface do usurio do aplicativo, como sons que so reproduzidos quando botes so clicados.

PROGRAMAO DO ACTIONSCRIPT 3.0 575


Trabalho com som

Quando um arquivo de som incorporado no aplicativo, o tamanho do arquivo SWF resultante aumenta pelo tamanho do arquivo de som. Em outras palavras, a incorporao de arquivos de som grandes no aplicativo pode aumentar o tamanho do arquivo SWF para um tamanho indesejado. O mtodo exato a ser usado para incorporar um arquivo de som no arquivo SWF do aplicativo varia de acordo com o ambiente de desenvolvimento.

Uso de um arquivo de som incorporado no Flash


A ferramenta de autoria do Flash permite importar sons de vrios formatos e armazen-los como smbolos na Biblioteca. Em seguida, possvel atribu-los a quadros na linha do tempo ou a quadros de um estado de boto, uslos com Comportamentos ou us-los diretamente no cdigo do ActionScript. Esta seo descreve como usar sons incorporados no cdigo ActionScript com a ferramenta de autoria do Flash. Para obter informaes sobre as outras maneiras de usar sons incorporados no Flash, consulte Importao de sons em Uso do Flash. Para incorporar um arquivo de som usando a Ferramenta de autoria do Flash: 1 Selecione Arquivo > Importar > Importar para biblioteca e, em seguida, selecione e importe um arquivo de som.
2 Clique com o boto direito do mouse no nome do arquivo importado no painel Biblioteca e selecione Propriedades.

Clique na caixa de seleo Exportar para ActionScript.


3 No campo Classe, digite um nome a ser usado ao fazer referncia a esse som incorporado no ActionScript. Por

padro, ele usar o nome do arquivo de som nesse campo. Se o nome do arquivo incluir um ponto, como no nome DrumSound.mp3, voc dever alter-lo para algo como DrumSound. O ActionScript no permite um caractere ponto em um nome de classe. O campo Classe base ainda deve mostrar flash.media.Sound.
4 Clique em OK. Talvez voc veja uma caixa de dilogo informando que uma definio dessa classe no pde ser

localizada no caminho de classe. Clique em OK e continue. Se voc inseriu um nome de classe que no corresponde ao nome de qualquer uma das classes no caminho de classe do aplicativo, uma nova classe que herda da classe flash.media.Sound ser gerada automaticamente para voc.
5 Para usar o som incorporado, voc faz referncia ao nome da classe para aquele som no ActionScript. Por exemplo,

o cdigo a seguir comea criando uma nova ocorrncia da classe DrumSound gerada automaticamente:
var drum:DrumSound = new DrumSound(); var channel:SoundChannel = drum.play();

DrumSound uma subclasse da classe flash.media.Sound portanto ela herda os mtodos e as propriedades da classe Sound, incluindo o mtodo play() conforme mostrado acima.

Trabalho com arquivos de fluxo de som


A reproduo de um arquivo de som ou de vdeo enquanto seus dados ainda esto sendo carregados conhecida como streaming. Arquivos de som externos que so carregados de um servidor remoto normalmente so transmitidos em fluxo para que o usurio no precise aguardar at que todos os dados do som sejam carregados para ouvir o som. A propriedade SoundMixer.bufferTime representa o nmero de milissegundos de dados de som que o Flash Player ou o AIR deve coletar antes de permitir a reproduo do som. Em outras palavras, se a propriedade bufferTime estiver definida como 5000, o Flash Player ou o AIR carregaro pelo menos 5000 milissegundos de dados do arquivo de som antes de iniciar a reproduo do som. O valor padro SoundMixer.bufferTime 1000.

PROGRAMAO DO ACTIONSCRIPT 3.0 576


Trabalho com som

O aplicativo pode substituir o valor global SoundMixer.bufferTime de um som individual especificando explicitamente um novo valor de bufferTime ao carregar o som. Para substituir o tempo de buffer padro, primeiro crie uma nova ocorrncia da classe SoundLoaderContext, defina sua propriedade bufferTime e, em seguida, passe-a como um parmetro para o mtodo Sound.load(), conforme mostrado a seguir:
import flash.media.Sound; import flash.media.SoundLoaderContext; import flash.net.URLRequest; var s:Sound = new Sound(); var req:URLRequest = new URLRequest("bigSound.mp3"); var context:SoundLoaderContext = new SoundLoaderContext(8000, true); s.load(req, context); s.play();

Conforme a reproduo continua, o Flash Player e o AIR tentam manter o buffer de som do mesmo tamanho ou maior. Se os dados do som forem carregados mais rapidamente do que a velocidade de reproduo, a reproduo continuar sem interrupo. No entanto, se a taxa de carregamento de dados for reduzida devido a limitaes da rede, o indicador de reproduo poder atingir o final do buffer de som. Nesse caso, a reproduo ser suspensa, embora ela seja reiniciada automaticamente quando mais dados de som forem carregados. Para descobrir se a reproduo est suspensa porque o Flash Player ou o AIR esto aguardando o carregamento dos dados, use a propriedade Sound.isBuffering.

Trabalho com udio gerado dinamicamente


Em vez de carregar ou transmitir em fluxo um som existente, possvel gerar dados de udio dinamicamente. Voc pode gerar dados de udio quando estiver atribuindo um ouvinte de eventos ao evento sampleData de um objeto Sound. (O evento sampleData definido na classe SampleDataEvent do pacote flash.events.) Neste ambiente, o objeto Sound no carrega dados de som de um arquivo. Em vez disso, ele funciona como um soquete para dados de som que esto sendo transmitidos em fluxo atravs do uso da funo que voc atribui a esse evento. Quando voc adiciona um ouvinte de eventos sampleData a um objeto Sound, o objeto periodicamente solicita dados para adicion-los ao buffer de som. Esse buffer contm dados para o objeto Sound reproduzir. Quando voc chama o mtodo play() do objeto Sound, ele despacha o evento sampleData ao solicitar novos dados de som. (Isto s se aplica quando o objeto Sound no carregou dados mp3 de um arquivo.) O objeto SampleDataEvent inclui uma propriedade data. No ouvinte de eventos, voc grava objetos ByteArray neste objeto data. As matrizes de bytes gravadas neste objeto somam-se aos dados de som em buffer reproduzidos pelo objeto Sound. A matriz de bytes no buffer um fluxo de valores de ponto flutuante que variam de -1 a 1. Cada valor de ponto flutuante representa a amplitude de um canal (esquerdo ou direito) de uma amostra de som. A amostragem do som ocorre a 44.100 amostras por segundo. Cada amostra contm um canal esquerdo e direito, intercalados como dados de ponto flutuante na matriz de bytes. Na funo do manipulador, use o mtodo ByteArray.writeFloat() para gravar na propriedade data do evento sampleData. Por exemplo, o seguinte cdigo gera uma onda senoidal:

PROGRAMAO DO ACTIONSCRIPT 3.0 577


Trabalho com som

var mySound:Sound = new Sound(); mySound.addEventListener(SampleDataEvent.SAMPLE_DATA, sineWaveGenerator); mySound.play(); function sineWaveGenerator(event:SampleDataEvent):void { for (var i:int = 0; i < 8192; i++) { var n:Number = Math.sin((i + event.position) / Math.PI / 4); event.data.writeFloat(n); event.data.writeFloat(n); } }

Quando voc chama Sound.play(), o aplicativo comea a chamar seu manipulador de eventos, solicitando dados de amostra de som. O aplicativo continua enviando eventos medida que o som reproduzido, at voc parar de fornecer dados ou chamar SoundChannel.stop(). A latncia do evento varia de uma plataforma para outra e pode mudar em verses futuras do Flash Player e do AIR. No dependa de uma latncia especfica; em vez disso, voc deve calcul-la. Para fazer esse clculo, use a seguinte frmula:
(SampleDataEvent.position / 44.1) - SoundChannelObject.position

Fornea de 2048 a 8192 amostras para a propriedade data do objeto SampleDataEvent (para cada chamada ao ouvinte de eventos). Para obter o melhor desempenho, fornea o mximo possvel de amostras (at 8192). Quanto menos amostras forem fornecidas, maior ser a probabilidade de ocorrerem cliques e estalos durante a reproduo. Esse comportamento pode diferir em vrias plataformas e pode ocorrer em diversas situaes; por exemplo, no redimensionamento do navegador. O cdigo que funciona em uma plataforma quando voc fornece apenas 2048 amostras pode no funcionar to bem quando executado em outra plataforma. Se precisar da menor latncia possvel, pense na possibilidade de tornar o volume de dados selecionvel pelo usurio. Se voc fornecer menos de 2048 amostras (por chamada ao ouvinte de eventos sampleData), o aplicativo ser interrompido depois de reproduzir as amostras restantes. Em seguida, ele despachar um evento SoundComplete.

Modificao do som de dados mp3


Use o mtodo Sound.extract() para extrair dados de um objeto Sound. Voc pode usar (e modificar) esses dados para grav-los no fluxo dinmico de outro objeto Sound para fins de reproduo. Por exemplo, o cdigo a seguir usa os bytes de um arquivo MP3 carregado e os passa usando uma funo de filtro, upOctave():

PROGRAMAO DO ACTIONSCRIPT 3.0 578


Trabalho com som

var mySound:Sound = new Sound(); var sourceSnd:Sound = new Sound(); var urlReq:URLRequest = new URLRequest("test.mp3"); sourceSnd.load(urlReq); sourceSnd.addEventListener(Event.COMPLETE, loaded); function loaded(event:Event):void { mySound.addEventListener(SampleDataEvent.SAMPLE_DATA, processSound); mySound.play(); } function processSound(event:SampleDataEvent):void { var bytes:ByteArray = new ByteArray(); sourceSnd.extract(bytes, 8192); event.data.writeBytes(upOctave(bytes)); } function upOctave(bytes:ByteArray):ByteArray { var returnBytes:ByteArray = new ByteArray(); bytes.position = 0; while(bytes.bytesAvailable > 0) { returnBytes.writeFloat(bytes.readFloat()); returnBytes.writeFloat(bytes.readFloat()); if (bytes.bytesAvailable > 0) { bytes.position += 8; } } return returnBytes; }

Limitaes quanto aos sons gerados


Quando voc usa um ouvinte de eventos sampleData com um objeto Sound, os outros nicos mtodos Sound ativados so Sound.extract() e Sound.play(). Chamar qualquer outro mtodo ou propriedade resultar em uma exceo. Todos os mtodos e propriedades do objeto SoundChannel continuam ativados.

Reproduo de sons
A reproduo de um som carregado pode ser to simples quanto chamar o mtodo Sound.play() para um objeto Sound, da seguinte maneira:
var snd:Sound = new Sound(new URLRequest("smallSound.mp3")); snd.play();

Ao reproduzir sons usando o ActionScript 3.0, possvel executar as seguintes operaes:

Reproduzir um som a partir de uma posio inicial especfica. Pausar um som e reiniciar a reproduo a partir da mesma posio mais tarde. Saber exatamente quando a reproduo de um som concluda. Rastrear o progresso da reproduo de um som.

PROGRAMAO DO ACTIONSCRIPT 3.0 579


Trabalho com som

Alterar o volume ou a panormica enquanto o som reproduzido.


Para executar essas operaes durante a reproduo, use as classes SoundChannel, SoundMixer e SoundTransform. A classe SoundChannel controle a reproduo de um nico som. A propriedade SoundChannel.position pode ser considerada como um indicador de reproduo, indicando o ponto atual nos dados do som que est sendo reproduzido. Quando um aplicativo chama o mtodo Sound.play(), uma nova ocorrncia da classe SoundChannel criada para controlar a reproduo. O aplicativo pode reproduzir um som a partir de uma posio inicial especfica passando aquela posio, em termos de milissegundos, como o parmetro startTime do mtodo Sound.play(). Ele tambm pode especificar o nmero de vezes para repetio do som em sucesso rpida passando um valor numrico no parmetro loops do mtodo Sound.play(). Quando o mtodo Sound.play() chamado com um parmetro startTime e um parmetro loops, o som reproduzido repetidamente a partir do mesmo ponto inicial, conforme mostrado no cdigo a seguir:
var snd:Sound = new Sound(new URLRequest("repeatingSound.mp3")); snd.play(1000, 3);

Neste exemplo, o som reproduzido a partir de um ponto um segundo aps o incio do som, trs vezes em sucesso.

Pausa e reincio de um som


Se o aplicativo reproduzir sons longos, como canes ou podcasts, talvez voc queira permitir que os usurios pausem e reiniciem a reproduo desses sons. Um som no pode ser pausado literalmente durante a reproduo no ActionScript. Ele pode apenas ser interrompido. No entanto um som pode ser reproduzido a partir de um ponto qualquer. possvel registrar a posio do som na hora em que foi interrompido e, em seguida, reproduzir o som mais tarde a partir daquela posio. Por exemplo, suponha que o cdigo carrega e reproduz um arquivo de som como este:
var snd:Sound = new Sound(new URLRequest("bigSound.mp3")); var channel:SoundChannel = snd.play();

Enquanto o som reproduzido, a propriedade SoundChannel.position indica o ponto no arquivo de som que est em reproduo no momento. O aplicativo pode armazenar o valor da posio antes de interromper a reproduo do som, da seguinte maneira:
var pausePosition:int = channel.position; channel.stop();

Para reiniciar a reproduo do som, passe o valor da posio armazenado anteriormente para reiniciar o som a partir do mesmo ponto em que foi interrompido anteriormente.
channel = snd.play(pausePosition);

Monitoramento da reproduo
O aplicativo talvez queira saber quando a reproduo de um som interrompida para que possa iniciar a reproduo de outro som ou limpar alguns recursos usados durante a reproduo anterior. A classe SoundChannel despacha um evento Event.SOUND_COMPLETE quando a reproduo do som concluda. O aplicativo pode ouvir esse evento e tomar a ao apropriada, conforme mostrado a seguir:

PROGRAMAO DO ACTIONSCRIPT 3.0 580


Trabalho com som

import flash.events.Event; import flash.media.Sound; import flash.net.URLRequest; var snd:Sound = new Sound(); var req:URLRequest = new URLRequest("smallSound.mp3"); snd.load(req); var channel:SoundChannel = snd.play(); channel.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete); public function onPlaybackComplete(event:Event) { trace("The sound has finished playing."); }

A classe SoundChannel no despacha eventos de progresso durante a reproduo. Para relatar o progresso da reproduo, o aplicativo pode configurar seu prprio mecanismo de controle de tempo e rastrear a posio do indicador de reproduo do som. Para calcular qual porcentagem de um som foi reproduzida, possvel dividir o valor da propriedade SoundChannel.position pelo comprimento dos dados do som que est sendo reproduzido:
var playbackPercent:uint = 100 * (channel.position / snd.length);

No entanto esse cdigo relatar porcentagens exatas da reproduo apenas se os dados do som foram carregados completamente antes do incio da reproduo. A propriedade Sound.length mostra o tamanho dos dados do som que esto sendo carregados no momento, no o tamanho eventual do arquivo de som inteiro. Para rastrear o progresso da reproduo de um fluxo de som que ainda est sendo carregado, o aplicativo deve estimar o tamanho eventual do arquivo de som inteiro e usar esse valor em seus clculos. possvel estimar o comprimento eventual dos dados do som usando as propriedades bytesLoaded e bytesTotal do objeto Sound, da seguinte maneira:
var estimatedLength:int = Math.ceil(snd.length / (snd.bytesLoaded / snd.bytesTotal)); var playbackPercent:uint = 100 * (channel.position / estimatedLength);

O cdigo a seguir carrega um arquivo de som maior e usa o evento Event.ENTER_FRAME como seu mecanismo de controle de tempo para mostrar o progresso da reproduo. Ele relata periodicamente a porcentagem de reproduo que calculada como o valor da posio inicial dividido pelo comprimento total dos dados do som:

PROGRAMAO DO ACTIONSCRIPT 3.0 581


Trabalho com som

import flash.events.Event; import flash.media.Sound; import flash.net.URLRequest; var snd:Sound = new Sound(); var req:URLRequest = new URLRequest("http://av.adobe.com/podcast/csbu_dev_podcast_epi_2.mp3"); snd.load(req); var channel:SoundChannel; channel = snd.play(); addEventListener(Event.ENTER_FRAME, onEnterFrame); channel.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete); function onEnterFrame(event:Event):void { var estimatedLength:int = Math.ceil(snd.length / (snd.bytesLoaded / snd.bytesTotal)); var playbackPercent:uint = Math.round(100 * (channel.position / estimatedLength)); trace("Sound playback is " + playbackPercent + "% complete."); } function onPlaybackComplete(event:Event) { trace("The sound has finished playing."); removeEventListener(Event.ENTER_FRAME, onEnterFrame); }

Aps o incio do carregamento dos dados do som, esse cdigo chama o mtodo snd.play() e armazena o objeto SoundChannel resultante na varivel channel. Em seguida, ele adiciona um ouvinte de eventos ao aplicativo principal para o evento Event.ENTER_FRAME e outro ouvinte de eventos ao objeto SoundChannel para o evento Event.SOUND_COMPLETE que ocorre quando a reproduo concluda. A cada vez que o aplicativo atinge um novo quadro em sua animao, o mtodo onEnterFrame() chamado. O mtodo onEnterFrame() estima o comprimento total do arquivo de som com base na quantidade de dados que j foi carregada e, em seguida, calcula e exibe a porcentagem de reproduo atual. Quando todo o som foi reproduzido, o mtodo onPlaybackComplete() executado, removendo o ouvinte do evento
Event.ENTER_FRAME de forma que ele no tente exibir atualizaes do progresso aps a concluso da reproduo.

O evento Event.ENTER_FRAME pode ser despachado muitas vezes por segundo. Em alguns casos, no conveniente exibir o progresso da reproduo com tanta freqncia. Nesses casos, o aplicativo pode configurar seu prprio mecanismo de controle do tempo usando a classe flash.util.Timer. Consulte Trabalho com datas e horas na pgina 134.

Interrupo de fluxos de som


H uma peculiaridade no processo de reproduo de sons que esto sendo transmitidos em fluxo, isto , sons que ainda esto sendo carregados enquanto esto sendo reproduzidos. Quando o aplicativo chama o mtodo SoundChannel.stop() em uma ocorrncia de SoundChannel que est reproduzindo um fluxo de som, a reproduo do som pra em um quadro e, em seguida, no prximo quadro, ela reinicia a partir do incio do som. Isso ocorre porque o processo de carregamento do som ainda est em execuo. Para interromper o carregamento e a reproduo de um fluxo de som, chame a o mtodo Sound.close().

PROGRAMAO DO ACTIONSCRIPT 3.0 582


Trabalho com som

Consideraes sobre segurana ao carregar e reproduzir sons


A capacidade do aplicativo de acessar dados de som podem ser limitadas de acordo com o modelo de segurana do Flash Player ou do AIR. Cada som est sujeito a restries de duas caixas de proteo de segurana, a caixa de proteo do prprio contedo (a caixa de proteo do contedo) e a caixa de proteo do aplicativo ou do objeto que carrega e reproduz o som (a caixa de proteo do proprietrio). Para contedo de aplicativo AIR na caixa de proteo do aplicativo, todos os sons, inclusive aqueles carregados de outros domnios, so acessveis ao contedo na caixa de proteo de segurana do aplicativo. No entanto contedo em outras caixas de proteo de segurana observam as mesmas regras que o contedo em execuo no Flash Player. Para obter mais informaes sobre o modelo de segurana do Flash Player em geral e sobre a definio de caixas de proteo, consulte Segurana do Flash Player na pgina 704. A caixa de proteo do contedo controla se dados de som detalhados podem ser extrados do som usando a propriedade id3 ou o mtodo SoundMixer.computeSpectrum(). Ele no restringe o carregamento ou a reproduo do prprio arquivo de som. O domnio de origem do arquivo de som define as limitaes de segurana da caixa de proteo do contedo. Geralmente, se um arquivo de som est localizado no mesmo domnio ou pasta que o arquivo SWF do aplicativo ou do objeto que o carrega, o aplicativo ou o objeto ter acesso total quele arquivo de som. Se o som for proveniente de um domnio diferente do domnio do aplicativo, ele ainda poder ser trazido para a caixa de proteo do contedo usando um arquivo de poltica. O aplicativo pode passar um objeto SoundLoaderContext com uma propriedade checkPolicyFile como parmetro para o mtodo Sound.load(). A configurao da propriedade checkPolicyFile como true instrui o Flash Player ou o AIR a procurar um arquivo de poltica no servidor onde o som carregado. Se existir um arquivo de poltica e ele conceder acesso ao domnio do arquivo SWF que est sendo carregado, o arquivo SWF poder carregar o arquivo de som, acessar a propriedade id3 do objeto Sound e chamar o mtodo SoundMixer.computeSpectrum() de sons carregados. A caixa de proteo do proprietrio controla a reproduo local dos sons. O aplicativo ou o objeto que inicia a reproduo de um som define a caixa de proteo do proprietrio. O mtodo SoundMixer.stopAll() silencia os sons em todos os objetos SoundChannel que esto sendo reproduzidos no momento, desde que atendam aos seguintes critrios:

Os sons foram iniciados por objetos dentro da mesma caixa de proteo do proprietrio. Os sons so provenientes de uma origem com um arquivo de poltica que concede acesso ao domnio do aplicativo
ou objeto que chama o mtodo SoundMixer.stopAll(). Contudo, em um aplicativo AIR, o contedo na caixa de proteo de segurana do aplicativo (contedo instalado com o aplicativo AIR) no restringido por essas limitaes de segurana. Para descobrir se o mtodo SoundMixer.stopAll() realmente interromper todas os sons em reproduo, o aplicativo pode chamar o mtodo SoundMixer.areSoundsInaccessible(). Se esse mtodo retornar um valor de true, alguns dos sons que esto sendo reproduzidos estaro fora do controle da caixa de proteo do proprietrio atual e no sero interrompidos pelo mtodo SoundMixer.stopAll(). O mtodo SoundMixer.stopAll() tambm interrompe a continuao do indicador da reproduo para todos os sons que foram carregados de arquivos externos. No entanto sons que foram incorporados em arquivos FLA e anexados a quadros na linha do tempo usando a ferramenta de autoria do Flash talvez iniciem a reproduo novamente se a animao mover para um novo quadro.

PROGRAMAO DO ACTIONSCRIPT 3.0 583


Trabalho com som

Controle do volume e do panorama do som


Um objeto SoundChannel individual controla os canais estreos esquerdo e direito para um som. Se um som mp3 for um som monofnico, os canais estreos esquerdo e direito do objeto SoundChannel contero formas de onda idnticas. possvel descobrir a amplitude de cada canal estreo do som que est sendo reproduzido usando as propriedades leftPeak e rightPeak do objeto SoundChannel. Essas propriedades mostram a amplitude de pico da prpria forma de onda do som. Elas no representam o volume de reproduo real. O volume de reproduo real uma funo da amplitude da onda do som e dos valores de volume definidos no objeto SoundChannel e na classe SoundMixer. A propriedade pan de um objeto SoundChannel pode ser usada para especificar um nvel diferente de volume para cada um dos canais esquerdo e direito durante a reproduo. A propriedade pan pode ter um valor variando de -1 a 1, em que -1 significa que o canal esquerdo reproduz no volume mximo enquanto o canal direito est silencioso e 1 significa que o canal direito reproduz no volume mximo enquanto o canal esquerdo est silencioso. Valores numricos entre -1 e 1 definem valores proporcionais para os valores dos canais esquerdo e direito e um valor igual a 0 significa que os dois canais so reproduzidos em um nvel equilibrado de nvel de volume mdio. O cdigo de exemplo a seguir cria um objeto SoundTransform com um valor de volume de 0,6 e um valor de pan de -1 (volume mximo no canal esquerdo e nenhum volume no canal direito). Ele passa o objeto SoundTransform como um parmetro para o mtodo play() que aplica esse objeto SoundTransform ao novo objeto SoundChannel que criado para controlar a reproduo.
var snd:Sound = new Sound(new URLRequest("bigSound.mp3")); var trans:SoundTransform = new SoundTransform(0.6, -1); var channel:SoundChannel = snd.play(0, 1, trans);

possvel alterar o volume e a panormica enquanto um som est sendo reproduzido definindo as propriedades pan ou volume de um objeto SoundTransform e aplicando esse objeto como a propriedade soundTransform de um objeto SoundChannel. Tambm possvel definir os valores globais de volume e de pan para todos os sons de uma vez usando a propriedade
soundTransform da classe SoundMixer, conforme mostrado no exemplo a seguir: SoundMixer.soundTransform = new SoundTransform(1, -1);

Tambm possvel usar um objeto SoundTransform para definir os valores de volume e panormica para um objeto Microphone (consulte Captura de entrada do som na pgina 589) e para objetos Sprite e SimpleButton. O exemplo a seguir alterna a panormica do som do canal esquerdo para o canal direito e vice-versa enquanto o som reproduzido.

PROGRAMAO DO ACTIONSCRIPT 3.0 584


Trabalho com som

import import import import import

flash.events.Event; flash.media.Sound; flash.media.SoundChannel; flash.media.SoundMixer; flash.net.URLRequest;

var snd:Sound = new Sound(); var req:URLRequest = new URLRequest("bigSound.mp3"); snd.load(req); var panCounter:Number = 0; var trans:SoundTransform; trans = new SoundTransform(1, 0); var channel:SoundChannel = snd.play(0, 1, trans); channel.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete); addEventListener(Event.ENTER_FRAME, onEnterFrame); function onEnterFrame(event:Event):void { trans.pan = Math.sin(panCounter); channel.soundTransform = trans; // or SoundMixer.soundTransform = trans; panCounter += 0.05; } function onPlaybackComplete(event:Event):void { removeEventListener(Event.ENTER_FRAME, onEnterFrame); }

Esse cdigo iniciado carregando um arquivo de som e criando um novo objeto SoundTransform com o volume definido como 1 (volume total) e panormica definida como 0 (equilibrada igualmente entre a esquerda e a direita). Em seguida, ele chama o mtodo snd.play(), passando o objeto SoundTransform como um parmetro. Enquanto o som reproduzido, o mtodo onEnterFrame() executado repetidamente. O mtodo onEnterFrame() usa a funo Math.sin() para gerar um valor entre -1 e 1, uma faixa que corresponde aos valores aceitveis da propriedade SoundTransform.pan. A propriedade pan do objeto SoundTransform definida como o novo valor e, em seguida, a propriedade soundTransform do canal definida para usar o objeto SoundTransform alterado. Para executar esse exemplo, substitua o nome do arquivo bigSound.mp3 pelo nome de um arquivo mp3 local. Em seguida, execute o exemplo. Voc deve ouvir o volume do canal esquerdo se tornando mais alto enquanto o volume do canal direito se torna mais suave e vice-versa. Nesse exemplo, o mesmo efeito pode ser obtido definindo a propriedade soundTransform da classe SoundMixer. No entanto isso afetar a panormica de todos os sons que esto sendo reproduzidos no momento, no apenas o nico som que est sendo reproduzido pelo objeto SoundChannel.

Trabalho com metadados de som


Arquivos de som que usam o formato mp3 podem conter dados adicionais sobre o som na forma de tags ID3.

PROGRAMAO DO ACTIONSCRIPT 3.0 585


Trabalho com som

Nem todo arquivo mp3 contm metadados ID3. Quando um objeto Sound carrega um arquivo de som mp3, ele despachar um evento Event.ID3 se o arquivo de som contiver metadados ID3. Para evitar erros em tempo de execuo, o aplicativo deve aguardar at receber o evento Event.ID3 antes de acessar a propriedade Sound.id3 de um som carregado. O cdigo a seguir mostra como reconhecer quando os metadados ID3 de um arquivo de som foram carregados:
import flash.events.Event; import flash.media.ID3Info; import flash.media.Sound; var s:Sound = new Sound(); s.addEventListener(Event.ID3, onID3InfoReceived); s.load("mySound.mp3"); function onID3InfoReceived(event:Event) { var id3:ID3Info = event.target.id3; trace("Received ID3 Info:"); for (var propName:String in id3) { trace(propName + " = " + id3[propName]); } }

Esse cdigo comea criando um objeto Sound e indicando que ele oua o evento Event.ID3. Quando os metadados ID3 do arquivo de som so carregados, o mtodo onID3InfoReceived() chamado. O destino do objeto Event que passado para o mtodo onID3InfoReceived() o objeto Sound original, portanto o mtodo obtm a propriedade id3 do objeto Sound e percorre todas as suas propriedades nomeadas para rastrear seus valores.

Acesso a dados de som brutos


O mtodo SoundMixer.computeSpectrum() permite que um aplicativo leia os dados de som brutos para a forma de onda que est sendo reproduzida no momento. Se mais de um objeto SoundChannel estiver sendo reproduzido, o mtodo SoundMixer.computeSpectrum() mostrar os dados de som combinados de cada objeto SoundChannel misturado. Os dados de som so retornados como um objeto ByteArray que contm 512 bytes de dados, cada um deles contendo um valor de ponto flutuante entre -1 e 1. Esses valores representam a amplitude dos pontos na forma de onda do som que est sendo reproduzido. Os valores so entregues em dois grupos de 256, o primeiro grupo do canal estreo esquerdo e o segundo grupo do canal estreo direito. O mtodo SoundMixer.computeSpectrum() retornar os dados do espectro da freqncia em vez dos dados da forma de onda se o parmetro FFTMode estiver definido como true. O espectro da freqncia mostra a amplitude organizada pela freqncia do som, da freqncia mais baixa para a mais alta. Uma FFT (Transformao rpida de Fourier) usada para converter os dados da forma de onda nos dados do espectro da freqncia. Os valores do espectro da freqncia resultantes variam de 0 a aproximadamente 1,414 (a raiz quadrada de 2). O diagrama a seguir compara os dados retornados do mtodo computeSpectrum() quando o parmetro FFTMode est definido como true e quando est definido como false. O som cujos dados foram usados para esse diagrama contm um som grave alto no canal esquerdo e um som de toque de tambor no canal direito.

PROGRAMAO DO ACTIONSCRIPT 3.0 586


Trabalho com som

Canal esquerdo

Canal direito

Canal esquerdo

Canal direito

Valores retornados pelo mtodo SoundMixer.computeSpectrum() A. fftMode=true B. fftMode=false

O mtodo computeSpectrum() tambm pode retornar dados que foram amostrados novamente em uma taxa de bits mais baixa. Geralmente, isso resulta em dados de forma de onda mais suaves ou em dados de freqncia em detrimento de detalhes. O parmetro stretchFactor controla a taxa na qual os dados do mtodo computeSpectrum() so amostrados. Quando o parmetro stretchFactor est definido como 0, o padro, os dados do som so amostrados a uma taxa de 44,1 kHz. A taxa dividida em dois em cada valor sucessivo do parmetro stretchFactor, portanto um valor de 1 especifica uma taxa de 22,05 kHz, um valor de 2 especifica uma taxa de 11,025 kHz e assim por diante. O mtodo computeSpectrum() ainda retorna 256 bytes por canal estreo quando um valor de stretchFactor mais alto usado. O mtodo SoundMixer.computeSpectrum() tem algumas limitaes:

Como os dados do som de um microfone ou de fluxos RTMP no passam pelo objeto global SoundMixer, o mtodo
SoundMixer.computeSpectrum() no retorna dados dessas origens.

Se um ou mais dos sons que esto sendo reproduzidos de origens externas caixa de proteo do contedo atual,
restries de segurana faro com que o mtodo SoundMixer.computeSpectrum() emita um erro. Para obter mais detalhes sobre limitaes de segurana do mtodo SoundMixer.computeSpectrum() consulte Consideraes sobre segurana ao carregar e reproduzir sons na pgina 582 eAcesso mdia carregada como dados na pgina 724. Contudo, em um aplicativo AIR, o contedo na caixa de proteo de segurana do aplicativo (contedo instalado com o aplicativo AIR) no restringido por essas limitaes de segurana.

Criao de um nico visualizador de som


O exemplo a seguir usa o mtodo SoundMixer.computeSpectrum() para mostrar um grfico da forma de onda do som que animado com cada quadro:

PROGRAMAO DO ACTIONSCRIPT 3.0 587


Trabalho com som

import import import import import import

flash.display.Graphics; flash.events.Event; flash.media.Sound; flash.media.SoundChannel; flash.media.SoundMixer; flash.net.URLRequest;

const PLOT_HEIGHT:int = 200; const CHANNEL_LENGTH:int = 256; var snd:Sound = new Sound(); var req:URLRequest = new URLRequest("bigSound.mp3"); snd.load(req); var channel:SoundChannel; channel = snd.play(); addEventListener(Event.ENTER_FRAME, onEnterFrame); snd.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete); var bytes:ByteArray = new ByteArray(); function onEnterFrame(event:Event):void { SoundMixer.computeSpectrum(bytes, false, 0); var g:Graphics = this.graphics; g.clear(); g.lineStyle(0, 0x6600CC); g.beginFill(0x6600CC); g.moveTo(0, PLOT_HEIGHT); var n:Number = 0; // left channel for (var i:int = 0; i < CHANNEL_LENGTH; i++) { n = (bytes.readFloat() * PLOT_HEIGHT); g.lineTo(i * 2, PLOT_HEIGHT - n); } g.lineTo(CHANNEL_LENGTH * 2, PLOT_HEIGHT);

PROGRAMAO DO ACTIONSCRIPT 3.0 588


Trabalho com som

g.endFill(); // right channel g.lineStyle(0, 0xCC0066); g.beginFill(0xCC0066, 0.5); g.moveTo(CHANNEL_LENGTH * 2, PLOT_HEIGHT); for (i = CHANNEL_LENGTH; i > 0; i--) { n = (bytes.readFloat() * PLOT_HEIGHT); g.lineTo(i * 2, PLOT_HEIGHT - n); } g.lineTo(0, PLOT_HEIGHT); g.endFill(); } function onPlaybackComplete(event:Event) { removeEventListener(Event.ENTER_FRAME, onEnterFrame); }

Esse exemplo primeiro carrega e reproduz um arquivo de som e, em seguida, ouve o evento Event.ENTER_FRAME que disparar o mtodo onEnterFrame() enquanto o som reproduzido. O mtodo onEnterFrame() iniciado chamando o mtodo SoundMixer.computeSpectrum() que armazena dos dados da onda do som no objeto ByteArray de bytes. A forma de onda do som plotada usando a API de desenho do vetor. Um loop for percorre os primeiros 256 valores de dados que representam o canal estreo esquerdo e desenha uma linha de cada ponto at o prximo usando o mtodo Graphics.lineTo(). Um segundo loop for percorre o prximo conjunto de 256 valores, plotando-os na ordem reversa desta vez, da direita para a esquerda. Os desenhos da forma de onda resultantes podem produzir um efeito interessante de imagem espelhada, conforme mostrado na imagem a seguir.

PROGRAMAO DO ACTIONSCRIPT 3.0 589


Trabalho com som

Captura de entrada do som


A classe Microphone permite que o aplicativo se conecte a um microfone ou a outro dispositivo de entrada de som no sistema do usurio e transmita o udio de entrada para os alto-falantes daquele sistema ou envie os dados de udio a um servidor remoto, como o Flash Media Server. No possvel acessar dados de udio brutos do microfone; voc s pode enviar udio para os alto-falantes do sistema ou enviar dados de udio compactados para um servidor remoto. possvel usar o codec Speex ou Nellymoser para os dados enviados a um servidor remoto. (O Flash Player 10 vem com suporte para o codec Speex.)

Acesso a um microfone
A classe Microphone no tem um mtodo construtor. Em vez disso, voc usa o mtodo esttico Microphone.getMicrophone() para obter uma nova ocorrncia de Microphone, conforme mostrado a seguir:
var mic:Microphone = Microphone.getMicrophone();

A chamada do mtodo Microphone.getMicrophone() sem um parmetro retorna o primeiro dispositivo de entrada de som descoberto no sistema do usurio. Um sistema pode ter mais de um dispositivo de entrada de som conectado a ele. O aplicativo pode usar a propriedade Microphone.names para obter uma matriz dos nomes de todos os dispositivos de entrada de som disponveis. Em seguida, ele pode chamar o mtodo Microphone.getMicrophone() com um parmetro index que corresponde ao valor de ndice de um nome de dispositivo na matriz. Um sistema talvez no tenha um microfone ou outro dispositivo de entrada de som conectado a ele. possvel usar a propriedade Microphone.names ou o mtodo Microphone.getMicrophone() para verificar se o usurio tem um dispositivo de entrada de som instalado. Se o usurio no tiver um dispositivo de entrada de som instalado, a matriz names ter um comprimento de zero e o mtodo getMicrophone() retornar um valor null. Quando o aplicativo chama o mtodo Microphone.getMicrophone(), o Flash Player exibe a caixa de dilogo Configuraes do Flash Player que solicita que o usurio permita ou negue acesso do Flash Player cmara e ao microfone no sistema. Depois que o usurio clicar no boto Permitir ou Negar neste dilogo, um StatusEvent ser despachado. A propriedade code dessa ocorrncia de StatusEvent indica se o acesso ao microfone foi permitido ou negado, conforme mostrado neste exemplo:
import flash.media.Microphone; var mic:Microphone = Microphone.getMicrophone(); mic.addEventListener(StatusEvent.STATUS, this.onMicStatus); function onMicStatus(event:StatusEvent):void { if (event.code == "Microphone.Unmuted") { trace("Microphone access was allowed."); } else if (event.code == "Microphone.Muted") { trace("Microphone access was denied."); } }

A propriedade StatusEvent.code conter Microphone.Unmuted, se o acesso for permitido, ou Microphone.Muted, se o acesso for negado.

PROGRAMAO DO ACTIONSCRIPT 3.0 590


Trabalho com som

Nota: A propriedade Microphone.muted definida como true ou false quando o usurio permite ou nega acesso ao microfone, respectivamente. No entanto a propriedade muted no definida na ocorrncia de Microphone at que o StatusEvent tenha sido despachado, portanto o aplicativo tambm deve aguardar que o evento StatusEvent.STATUS seja despachado antes de verificar a propriedade Microphone.muted.

Roteamento de udio do microfone para alto-falantes locais


A entrada de udio de um microfone pode ser roteada para os alto-falantes do sistema local chamando o mtodo Microphone.setLoopback() com um valor de parmetro de true. Quando o som de um microfone local roteado para alto-falantes locais, h um risco de criar um loop de feedback de udio, o que pode provocar sons estridentes e danificar o hardware de som. A chamada do mtodo Microphone.setUseEchoSuppression() com um valor de parmetro true reduz, mas no elimina completamente, o risco de ocorrncia de feedback de udio. A Adobe recomenda sempre chamar Microphone.setUseEchoSuppression(true) antes de chamar Microphone.setLoopback(true), a menos que voc tenha certeza de que o usurio esteja reproduzindo o som usando fones de ouvido ou outra coisa que no seja um alto-falante. O cdigo a seguir mostra como rotear o udio de um microfone local para os alto-falantes do sistema local:
var mic:Microphone = Microphone.getMicrophone(); mic.setUseEchoSuppression(true); mic.setLoopBack(true);

Alterao do udio do microfone


O aplicativo pode alterar os dados de udio de um microfone de duas maneiras. Primeiro, ele pode alterar o ganho do som de entrada, o que efetivamente multiplica os valores de entrada por um valor especificado para criar um som mais baixo ou mais silencioso. A propriedade Microphone.gain aceita valores numricos entre 0 e 100 inclusive. Um valor de 50 funciona como um multiplicador de um e especifica o volume normal. Um valor de zero funciona como um multiplicador de zero e silencia efetivamente o udio de entrada. Valores acima de 50 especificam um volume mais alto do que o normal. O aplicativo tambm pode alterar a taxa de amostragem do udio de entrada. Taxas de amostragem mais altas aumentam a qualidade do som, mas elas tambm criam fluxos de dados mais densos que usam mais recursos para transmisso e armazenamento. A propriedade Microphone.rate representa a taxa de amostragem de udio medida em quilohertz (kHz). A taxa de amostragem padro de 8 kHz. possvel definir a propriedade Microphone.rate como um valor mais alto do que 8 kHz se o microfone oferecer suporte taxa mais alta. Por exemplo, configurar a propriedade Microphone.rate com um valor de 11 define a taxa de amostragem como 11 kHz. Configur-la como 22 define a taxa de amostragem como 22 kHz e assim por diante. As taxas de amostra disponveis dependem do codec selecionado. Quando voc usa o codec Nellymoser, pode especificar 5, 8, 11, 16, 22 e 44 kHz como taxa de amostra. Quando voc usa o codec Speex (adicionado ao Flash Player 10), s pode usar 16 kHz.

Deteco de atividade do microfone


Para conservar a largura de banda e os recursos de processamento, o Flash Player tenta detectar quando nenhum som est sendo transmitido por um microfone. Quando o nvel de atividade do microfone permanece abaixo do limite do nvel de silncio por um certo perodo, o Flash Player pra de transmitir a entrada de udio e despacha um simples ActivityEvent. Se voc usar o codec Speex (adicionado ao Flash Player 10), defina o nvel de silncio como 0 para assegurar que o aplicativo transmita dados de udio continuamente. A deteco da atividade de voz do Speex automaticamente reduz a largura de banda.

PROGRAMAO DO ACTIONSCRIPT 3.0 591


Trabalho com som

Trs propriedades da classe Microphone monitoram e controlam a deteco de atividade:

A propriedade somente leitura activityLevel indica a quantidade de som que o microfone est detectando em
uma escala de 0 a 100.

A propriedade silenceLevel especifica a quantidade de som necessria para ativar o microfone e despachar um
evento ActivityEvent.ACTIVITY. A propriedade silenceLevel tambm usa uma escala de 0 a 100, e o valor padro 10.

A propriedade silenceTimeout descreve o nmero de milissegundos que o nvel de atividade deve permanecer
abaixo do nvel de silncio, at que um evento ActivityEvent.ACTIVITY seja despachado para indicar que o microfone est silencioso. O valor padro de silenceTimeout 2000. As propriedades Microphone.silenceLevel e Microphone.silenceTimeout so somente leitura, mas seus valores podem ser alterados usando o mtodo Microphone.setSilenceLevel(). Em alguns casos, o processo de ativao do microfone quando nova atividade detectada pode provocar um pequeno atraso. Manter o microfone ativo durante todo o tempo pode remover esses atrasos na ativao. O aplicativo pode chamar o mtodo Microphone.setSilenceLevel() com o parmetro silenceLevel definido como zero para indicar ao Flash Player para manter o microfone ativo e continuar a coletar dados de udio, mesmo quando nenhum som est sendo detectado. De modo oposto, a configurao do parmetro silenceLevel como 100 impede que o microfone seja ativado de qualquer modo. O exemplo a seguir exibe informaes sobre o microfone e relata eventos de atividade e eventos de status despachados por um objeto Microphone:
import flash,events.ActivityEvent; import flash,events.StatusEvent; import flash.media.Microphone; var deviceArray:Array = Microphone.names; trace("Available sound input devices:"); for (var i:int = 0; i < deviceArray.length; i++) { trace(" " + deviceArray[i]); } var mic:Microphone = Microphone.getMicrophone(); mic.gain = 60; mic.rate = 11; mic.setUseEchoSuppression(true); mic.setLoopBack(true); mic.setSilenceLevel(5, 1000); mic.addEventListener(ActivityEvent.ACTIVITY, this.onMicActivity); mic.addEventListener(StatusEvent.STATUS, this.onMicStatus);

PROGRAMAO DO ACTIONSCRIPT 3.0 592


Trabalho com som

var micDetails:String = "Sound input device name: " + mic.name + '\n'; micDetails += "Gain: " + mic.gain + '\n'; micDetails += "Rate: " + mic.rate + " kHz" + '\n'; micDetails += "Muted: " + mic.muted + '\n'; micDetails += "Silence level: " + mic.silenceLevel + '\n'; micDetails += "Silence timeout: " + mic.silenceTimeout + '\n'; micDetails += "Echo suppression: " + mic.useEchoSuppression + '\n'; trace(micDetails); function onMicActivity(event:ActivityEvent):void { trace("activating=" + event.activating + ", activityLevel=" + mic.activityLevel); } function onMicStatus(event:StatusEvent):void { trace("status: level=" + event.level + ", code=" + event.code); }

Ao executar o exemplo acima, fale ou faa rudos no microfone do sistema e observe as instrues de rastreamento resultantes serem exibidas em um console ou janela de depurao.

Envio e recebimento de udio de um servidor de mdia


Recursos adicionais de udio tambm esto disponveis ao usar o ActionScript com um servidor de mdia de fluxo contnuo, como o Flash Media Server. Em particular, seu aplicativo pode conectar um objeto Microphone a um objeto NetStream e transmitir dados diretamente do microfone do usurio para o servidor. Os dados de udio tambm podem ser transmitidos em fluxo do servidor para um aplicativo criado com o Flash ou o Flex e reproduzidos como parte de um MovieClip ou usando um objeto Video. O Flash Player 10 introduz o suporte para o codec Speex. Para definir o codec usado para udio compactado enviado ao servidor de mdia, defina a propriedade codec do objeto Microphone. Esta propriedade pode ter dois valores, que so enumerados na classe SoundCodec. Definir a propriedade do codec como SoundCodec.SPEEX seleciona o codec Speex para compactao de udio. Definir a propriedade como SoundCodec.NELLYMOSER (o padro) seleciona o codec Nellymoser para compactao de udio. Para obter mais informaes, consulte a documentao do Flash Media Server online em http://livedocs.adobe.com.

Exemplo: Podcast Player


Um podcast um arquivo de som distribudo pela Internet sob demanda ou por assinatura. Podcasts normalmente so publicados como parte de uma srie, o que tambm chamado de canal de podcast. Como episdios de podcast podem durar de um minuto a muitas horas, eles normalmente so transmitidos enquanto esto sendo carregados. Episdios de podcast, que tambm so chamados de itens, normalmente so entregues no formato de arquivo mp3. Os podcasts de vdeo tambm so populares, mas esse aplicativo de amostra reproduz apenas podcasts de udio que usam arquivos mp3.

PROGRAMAO DO ACTIONSCRIPT 3.0 593


Trabalho com som

Este exemplo no de um aplicativo agregador de podcast completo. Por exemplo, ele no gerencia assinaturas para podcasts especficos ou lembra quais podcasts foram ouvidos pelo usurio na prxima vez que o aplicativo executado. Ele pode funcionar como um ponto de partida para um agregador de podcast mais completo. Este exemplo de Podcast Player ilustra as seguintes tcnicas de programao do ActionScript:

Leitura de um RSS feed externo e anlise de seu contedo XML Criao de uma classe SoundFacade para simplificar o carregamento e a reproduo de arquivos de som. Exibio do progresso da reproduo do som. Pausa e reincio da reproduo do som.
Para obter os arquivos de aplicativo deste exemplo, consulte www.adobe.com/go/learn_programmingAS3samples_flash_br. Os arquivos do aplicativo Podcast Player podem ser encontrados na pasta Amostras/PodcastPlayer. O aplicativo consiste nos seguintes arquivos:
Arquivo PodcastPlayer.mxml ou PodcastPlayer.fla SoundPlayer.mxml Um componente MXML que exibe botes de reproduo e barras de progresso e controla a reproduo de som, apenas para Flex. A classe base que fornece propriedades e mtodos comuns para a classe RSSChannel e a classe RSSItem. Uma classe ActionScript que mantm dados sobre um canal RSS. Uma classe ActionScript que mantm dados sobre um item RSS. A classe principal do ActionScript para o aplicativo. Ela encapsula os mtodos e eventos da classe Sound e da classe SoundChannel e adiciona suporte para pausar e reiniciar a reproduo. Uma classe ActionScript que recupera dados de uma URL remota. Um arquivo XML que contm uma lista de RSS feeds que representam canais de podcast. Descrio A interface do usurio do aplicativo para Flex (MXML) ou Flash (FLA).

RSSBase.as RSSChannel.as RSSItem.as SoundFacade.as

URLService.as playerconfig.xml

Leitura de dados RSS para um canal de podcast


O aplicativo Podcast Player comea lendo informaes sobre vrios canais de podcast e seus episdios: 1. Primeiro, o aplicativo l um arquivo de configurao XML que contm uma lista de canais de podcast e exibe a lista de canais para o usurio. 2. Quando o usurio seleciona um dos canais de podcast, ele l o RSS feed do canal e exibe uma lista de episdios de canal. Este exemplo usa a classe do utilitrio URLLoader para recuperar dados com base em texto de um local remoto ou de um arquivo local. O Podcast Player primeiro cria um objeto URLLoader para obter uma lista de RSS feeds em formato XML do arquivo playerconfig.xml. Em seguida, quando o usurio seleciona um feed especfico da lista, um novo objeto URLLoader criado para ler os dados RSS daquela URL do feed.

PROGRAMAO DO ACTIONSCRIPT 3.0 594


Trabalho com som

Simplificao do carregamento e da reproduo de som usando a classe SoundFacade


A arquitetura de som do ActionScript 3.0 poderosa, mas complexa. Aplicativos que precisam apenas de recursos bsicos de carregamento e reproduo de som podem usar uma classe que oculte um pouco da complexidade fornecendo um conjunto mais simples de chamadas e eventos de mtodos. No mundo de padres de design de software, essa classe chamada de facade. A classe SoundFacade apresenta uma nica interface para executar as seguintes tarefas:

Carregamento de arquivos de som usando um objeto Sound, um objeto SoundLoaderContext e uma classe
SoundMixer.

Reproduo de arquivos de som usando os objetos Sound e SoundChannel. Despacho de eventos de progresso da reproduo. Pausa e reincio da reproduo do som usando os objetos Sound e SoundChannel.
A classe SoundFacade tenta oferecer mais da funcionalidade das classes de som do ActionScript com menos complexidade. O cdigo a seguir mostra a declarao da classe, as propriedades da classe e o mtodo construtor SoundFacade():
public class SoundFacade extends EventDispatcher { public var s:Sound; public var sc:SoundChannel; public var url:String; public var bufferTime:int = 1000; public public public public public public var var var var var var isLoaded:Boolean = false; isReadyToPlay:Boolean = false; isPlaying:Boolean = false; isStreaming:Boolean = true; autoLoad:Boolean = true; autoPlay:Boolean = true;

public var pausePosition:int = 0; public static const PLAY_PROGRESS:String = "playProgress"; public var progressInterval:int = 1000; public var playTimer:Timer; public function SoundFacade(soundUrl:String, autoLoad:Boolean = true, autoPlay:Boolean = true, streaming:Boolean = true, bufferTime:int = -1):void { this.url = soundUrl;

PROGRAMAO DO ACTIONSCRIPT 3.0 595


Trabalho com som

// Sets Boolean values that determine the behavior of this object this.autoLoad = autoLoad; this.autoPlay = autoPlay; this.isStreaming = streaming; // Defaults to the global bufferTime value if (bufferTime < 0) { bufferTime = SoundMixer.bufferTime; } // Keeps buffer time reasonable, between 0 and 30 seconds this.bufferTime = Math.min(Math.max(0, bufferTime), 30000); if (autoLoad) { load(); } }

A classe SoundFacade estende a classe EventDispatcher para poder despachar seus prprios eventos. O cdigo da classe primeiro declara propriedades de um objeto Sound e de um objeto SoundChannel. A classe tambm armazena o valor da URL do arquivo de som e uma propriedade bufferTime a ser usada ao transmitir o som em fluxo. Alm disso, ele aceita alguns valores de parmetros booleanos que afetam o comportamento do carregamento e da reproduo:

O parmetro autoLoad indica ao objeto que o carregamento do som deve iniciar assim que esse objeto criado. O parmetro autoPlay indica que a reproduo do som deve iniciar assim que dados de som suficientes estiverem
carregados. Se esse for um fluxo de som, a reproduo ser iniciada assim que dados suficientes, conforme especificado pela propriedade bufferTime, estiverem carregados.

O parmetro streaming indica que a reproduo desse arquivo pode ser iniciada antes do carregamento ser
concludo. O parmetro bufferTime padronizado como um valor de -1. Se o mtodo construtor detectar um valor negativo no parmetro bufferTime, ele definir a propriedade bufferTime como o valor de SoundMixer.bufferTime. Isso permite que o aplicativo seja padronizado para o valor global SoundMixer.bufferTime conforme desejado. Se o parmetro autoLoad for definido como true, o mtodo construtor chamar imediatamente o mtodo load() seguinte para iniciar o carregamento do arquivo de som:

PROGRAMAO DO ACTIONSCRIPT 3.0 596


Trabalho com som

public function load():void { if (this.isPlaying) { this.stop(); this.s.close(); } this.isLoaded = false; this.s = new Sound(); this.s.addEventListener(ProgressEvent.PROGRESS, onLoadProgress); this.s.addEventListener(Event.OPEN, onLoadOpen); this.s.addEventListener(Event.COMPLETE, onLoadComplete); this.s.addEventListener(Event.ID3, onID3); this.s.addEventListener(IOErrorEvent.IO_ERROR, onIOError); this.s.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onIOError); var req:URLRequest = new URLRequest(this.url); var context:SoundLoaderContext = new SoundLoaderContext(this.bufferTime, true); this.s.load(req, context); }

O mtodo load() cria um novo objeto Sound e adiciona ouvintes para todos os eventos de som importantes. Em seguida, ele indica ao objeto Sound para carregar o arquivo de som usando um objeto SoundLoaderContext para passar o valor de bufferTime. Como a propriedade url pode ser alterada, uma ocorrncia de SoundFacade pode ser usada para reproduzir arquivos de som diferentes em sucesso: simplesmente altere a propriedade url e chame o mtodo load() e o novo arquivo de som ser carregado. Os trs mtodos ouvintes de eventos a seguir mostram como o objeto SoundFacade rastreia o progresso do carregamento e decide quando iniciar a reproduo do som:

PROGRAMAO DO ACTIONSCRIPT 3.0 597


Trabalho com som

public function onLoadOpen(event:Event):void { if (this.isStreaming) { this.isReadyToPlay = true; if (autoPlay) { this.play(); } } this.dispatchEvent(event.clone()); } public function onLoadProgress(event:ProgressEvent):void { this.dispatchEvent(event.clone()); } public function onLoadComplete(event:Event):void { this.isReadyToPlay = true; this.isLoaded = true; this.dispatchEvent(evt.clone()); if (autoPlay && !isPlaying) { play(); } }

O mtodo onLoadOpen() executado quando o carregamento do som iniciado. Se o som puder ser reproduzido em modo de streaming, o mtodo onLoadComplete() definir o sinalizador isReadyToPlay como true imediatamente. O sinalizador isReadyToPlay determina se o aplicativo pode iniciar a reproduo do som, talvez em resposta a uma ao do usurio, como um clique em um boto de reproduo. A classe SoundChannel gerencia o buffer de dados de som, portanto no h necessidade de verificar explicitamente se dados suficientes foram carregados antes de chamar o mtodo play(). O mtodo onLoadProgress() executado periodicamente durante o processo de carregamento. Ele simplesmente despacha um clone de seu objeto ProgressEvent para uso pelo cdigo que usa esse objeto SoundFacade. Quando os dados do som estiverem totalmente carregados, o mtodo onLoadComplete() executado, chamando o mtodo play() para sons que no sejam de fluxo, se necessrio. O prprio mtodo play() mostrado a seguir.

PROGRAMAO DO ACTIONSCRIPT 3.0 598


Trabalho com som

public function play(pos:int = 0):void { if (!this.isPlaying) { if (this.isReadyToPlay) { this.sc = this.s.play(pos); this.sc.addEventListener(Event.SOUND_COMPLETE, onPlayComplete); this.isPlaying = true; this.playTimer = new Timer(this.progressInterval); this.playTimer.addEventListener(TimerEvent.TIMER, onPlayTimer); this.playTimer.start(); } } }

O mtodo play() chamar o mtodo Sound.play() se o som estiver pronto para execuo. O objeto SoundChannel resultante armazenado na propriedade sc. Em seguida, o mtodo play() cria um objeto Timer que ser utilizado para despachar eventos de progresso da reproduo em intervalos regulares.

Exibio do progresso da reproduo


A criao de um objeto Timer para acionar o monitoramento da reproduo uma operao complexa que voc deve codificar apenas uma vez. O encapsulamento dessa lgica de Timer em uma classe reutilizvel, como a classe SoundFacade, permite que os aplicativos ouam alguns tipos de eventos de progresso quando um som est sendo carregado e quando ele est sendo reproduzido. O objeto Timer criado pelo mtodo SoundFacade.play() despacha uma ocorrncia de TimerEvent a cada segundo. O mtodo onPlayTimer() a seguir executado sempre que um novo TimerEvent recebido:
public function onPlayTimer(event:TimerEvent):void { var estimatedLength:int = Math.ceil(this.s.length / (this.s.bytesLoaded / this.s.bytesTotal)); var progEvent:ProgressEvent = new ProgressEvent(PLAY_PROGRESS, false, false, this.sc.position, estimatedLength); this.dispatchEvent(progEvent); }

O mtodo onPlayTimer() implementa a tcnica de estimativa de tamanho descrita na seo Monitoramento da reproduo na pgina 579. Em seguida, ele cria uma nova ocorrncia de ProgressEvent com um tipo de evento de SoundFacade.PLAY_PROGRESS, com a propriedade bytesLoaded definida como a posio atual do objeto SoundChannel e a propriedade bytesTotal definida como o comprimento estimado dos dados do som.

Pausa e reincio da reproduo


O mtodo SoundFacade.play() mostrado anteriormente aceita um parmetro pos correspondente a uma posio inicial nos dados de som. Se o valor pos for zero, a reproduo do som ser executada do incio. O mtodo SoundFacade.stop() tambm aceita um parmetro pos conforme mostrado aqui:

PROGRAMAO DO ACTIONSCRIPT 3.0 599


Trabalho com som

public function stop(pos:int = 0):void { if (this.isPlaying) { this.pausePosition = pos; this.sc.stop(); this.playTimer.stop(); this.isPlaying = false; } }

Sempre que o mtodo SoundFacade.stop() chamado, ele define a propriedade pausePosition de forma que o aplicativo saiba onde posicionar o indicador de reproduo se o usurio desejar retomar a reproduo do mesmo som. Os mtodos SoundFacade.pause() e SoundFacade.resume() mostrados a seguir chamam os mtodos SoundFacade.stop() e SoundFacade.play() respectivamente, passando um valor de parmetro pos a cada vez.
public function pause():void { stop(this.sc.position); } public function resume():void { play(this.pausePosition); }

O mtodo pause() passa o valor atual de SoundChannel.position para o mtodo play() que armazena o valor na propriedade pausePosition. O mtodo resume()inicia a reproduo do mesmo som novamente usando o valor de pausePosition como o ponto de incio.

Extenso do exemplo do Podcast Player


Este exemplo apresenta um Podcast Player reduzido ao essencial que demonstra o uso da classe SoundFacade reutilizvel. possvel adicionar outros recursos para aprimorar a utilidade deste aplicativo, incluindo o seguinte:

Armazenar a lista de feeds e informaes de uso sobre cada episdio em uma ocorrncia de SharedObject que pode
ser usada na prxima vez que o usurio executar o aplicativo.

Permitir que o usurio adicione seus prprios RSS feeds lista de canais de podcast. Memorizar a posio do indicador de reproduo quando o usurio interromper ou sair de um episdio, para que
ele possa ser reiniciado daquele ponto na prxima vez que o usurio executar o aplicativo.

Baixar arquivos mp3 de episdios para ouvir offline, quando o usurio no estiver conectado Internet. Adicionar recursos de assinatura que verificam periodicamente novos episdios em um canal de podcast e atualizar
a lista de episdios automaticamente.

Adicionar funcionalidade de pesquisa e de procura de podcast usando uma API de um servio de host de podcast,
como o Odeo.com.

600

Captulo 26: Captura da entrada do usurio


Este captulo descreve como criar interatividade usando o ActionScript 3.0 para responder atividade do usurio. So discutidos eventos de teclado e de mouse e, em seguida, h tpicos mais avanados, incluindo a personalizao do menu de contexto e o gerenciamento do foco. Este captulo encerra com o WordSearch, exemplo de um aplicativo que responde entrada do mouse. Esse captulo supe que voc j est familiarizado com o modelo de eventos do ActionScript 3.0. Para obter mais informaes, consulte Manipulao de eventos na pgina 251.

Noes bsicas sobre a entrada do usurio


Introduo captura da entrada do usurio
A interao do usurio, por meio do teclado, do mouse, da cmera ou de uma combinao desses dispositivos, a base da interatividade. No ActionScript 3.0, identificar e responder interao do usurio envolve principalmente ouvir eventos. A classe InteractiveObject, uma subclasse de DisplayObject, fornece a estrutura comum dos eventos e a funcionalidade necessria para manipular a interao do usurio. Voc no cria diretamente uma ocorrncia da classe InteractiveObject. Em vez disso, objetos de exibio como SimpleButton, Sprite, TextField e vrios componentes da ferramenta de autoria do Flash e do Flex herdam o modelo de interao do usurio dessa classe e, desse modo, compartilham uma estrutura comum. Isso significa que as tcnicas aprendidas e o cdigo que voc grava para manipular a interao do usurio em um objeto derivado de InteractiveObject so aplicveis a todos os outros usurios. As seguintes tarefas tpicas de interao do usurio so descritas neste captulo:

Captura da entrada do teclado no mbito do aplicativo Captura da entrada do teclado para um objeto de exibio especfico Captura de aes do mouse no mbito do aplicativo Captura da entrada do mouse para um objeto de exibio especfico Criao da interatividade de arrastar e soltar Criao de um cursor personalizado (ponteiro do mouse) Adio de novos comportamentos ao menu de contexto Gerenciamento do foco

Conceitos e termos importantes


importante que voc se familiarize com os seguintes termos-chave de interao do usurio antes de continuar:

Cdigo de caractere: cdigo numrico que representa um caractere no conjunto de caracteres atual (associado a
uma tecla que est sendo pressionada no teclado). Por exemplo, D e d tm cdigos de caractere diferentes embora tenham sido criados pela mesma tecla do teclado do alfabeto ingls.

PROGRAMAO DO ACTIONSCRIPT 3.0 601


Captura da entrada do usurio

Menu de contexto: o menu que aparece quando um usurio clica com o boto direito do mouse ou usa uma
combinao especfica do teclado-mouse. Os comandos do menu de contexto em geral so aplicados diretamente no que foi clicado. Por exemplo, um menu de contexto de uma imagem pode conter um comando para mostrar a imagem em uma janela separada e um comando para fazer download dessa imagem.

Foco: indicao de que um elemento selecionado est ativo e o destino da interao do teclado ou do mouse. Cdigo de tecla: cdigo numrico que corresponde a uma tecla fsica no teclado.

Teste dos exemplos do captulo


medida que l este captulo, voc talvez queira testar algumas listagens de cdigo de amostra por conta prpria. Como este captulo trata da entrada do usurio no ActionScript, todas as listagens de cdigo de exemplo envolvem basicamente a manipulao de algum tipo de objeto de exibio em geral um campo de texto ou qualquer subclasse de InteractiveObject. Nos exemplos, o objeto de exibio pode ser um objeto criado e colocado no Palco no Adobe Flash CS4 Professional ou pode ser um objeto criado com o ActionScript. Testar um exemplo envolve visualizar o resultado no Flash Player ou no Adobe AIR e interagir com o exemplo para ver os efeitos do cdigo. Para testar as listagens de cdigo deste captulo: 1 Criar um documento vazio usando a ferramenta de autoria do Flash
2 Selecione um quadro-chave na Linha de tempo. 3 Abra o painel Aes e copie a listagem de cdigo no painel Script. 4 Crie uma ocorrncia no palco:

Se o cdigo fizer referncia a um campo de texto, use a ferramenta Texto para criar um campo de texto dinmico
no palco.

Caso contrrio, crie uma ocorrncia de smbolo de boto ou clipe de filme no palco.
5 Selecione o campo de texto, o boto ou o clipe de filme e d um nome de ocorrncia no Inspetor de propriedades.

O nome deve coincidir com o nome do objeto de exibio no cdigo de exemplo; se o cdigo manipular, por exemplo, um objeto chamado myDisplayObject, seu objeto de palco tambm dever ser chamado de myDisplayObject.
6 Execute o programa usando o comando Controlar > Testar filme.

Na tela, o objeto de exibio manipulado conforme especificado no cdigo.

Captura da entrada do teclado


Os objetos de exibio que herdam o modelo de interao da classe InteractiveObject podem responder aos eventos de teclado usando ouvintes de eventos. Voc pode colocar, por exemplo, um ouvinte de eventos no palco para ouvir e responder entrada do teclado. No exemplo a seguir, um ouvinte de eventos captura um pressionamento de tecla e as propriedades de cdigo e nome da tecla so exibidos:
function reportKeyDown(event:KeyboardEvent):void { trace("Key Pressed: " + String.fromCharCode(event.charCode) + " (character code: " + event.charCode + ")"); } stage.addEventListener(KeyboardEvent.KEY_DOWN, reportKeyDown);

Algumas teclas, como a tecla Ctrl, geram eventos embora no tenha nenhuma representao de glifo.

PROGRAMAO DO ACTIONSCRIPT 3.0 602


Captura da entrada do usurio

No exemplo de cdigo anterior, o ouvinte de eventos de teclado capturou a entrada do teclado para todo o palco. Voc tambm pode gravar um ouvinte de eventos para um objeto de exibio especfico no palco; esse ouvinte de eventos acionado quando o objeto est em foco. No exemplo a seguir, os pressionamentos de tecla so refletidos no painel Sada somente quando o usurio digita dentro da ocorrncia TextField. Manter a tecla Shift temporariamente pressionada faz com que a cor da borda de TextField mude para vermelho. Esse cdigo supe a existncia de uma ocorrncia TextField chamada tf no palco.
tf.border = true; tf.type = "input"; tf.addEventListener(KeyboardEvent.KEY_DOWN,reportKeyDown); tf.addEventListener(KeyboardEvent.KEY_UP,reportKeyUp); function reportKeyDown(event:KeyboardEvent):void { trace("Key Pressed: " + String.fromCharCode(event.charCode) + " (key code: " + event.keyCode + " character code: " + event.charCode + ")"); if (event.keyCode == Keyboard.SHIFT) tf.borderColor = 0xFF0000; } function reportKeyUp(event:KeyboardEvent):void { trace("Key Released: " + String.fromCharCode(event.charCode) + " (key code: " + event.keyCode + " character code: " + event.charCode + ")"); if (event.keyCode == Keyboard.SHIFT) { tf.borderColor = 0x000000; } }

A classe TextField tambm registra um evento textInput que pode ser ouvido quando um usurio insere algum texto. Para obter mais informaes, consulte Captura da entrada de texto na pgina 441.

Identificao de cdigos de tecla e de cdigos de caractere


Voc pode acessar as propriedades keyCode e charCode de um evento de teclado para determinar qual tecla foi pressionada e, em seguida, acionar outras aes. A propriedade keyCode um valor numrico que corresponde ao valor de uma tecla no teclado. A propriedade charCode o valor numrico dessa tecla no conjunto de caracteres atual. O conjunto de caracteres padro UTF-8, que oferece suporte para ASCII. A principal diferena entre o cdigo de tecla e os valores de caractere est no fato de o cdigo de tecla representar uma tecla especfica do teclado (o valor 1 de um teclado diferente do valor 1 na linha superior, mas a tecla que gera 1 e a que gera ! so iguais), enquanto o valor de caractere representa um caractere especfico (os caracteres R e r so diferentes). Nota: Em caso de mapeamentos entre teclas e seus respectivos valores de cdigo de caracteres em ASCII, consulte a classe flash.ui.Keyboard na referncia de linguagem do ActionScript. O mapeamento entre as teclas e os cdigos de tecla dependem do dispositivo e do sistema operacional. Devido a isso, no use mapeamentos de tecla para acionar comandos. Em vez disso, use os valores de constantes predefinidos fornecidos pela classe Keyboard para fazer referncia s propriedades keyCode adequadas. Por exemplo, em vez de usar o mapeamento para a tecla Shift, use a constante Keyboard.SHIFT (como mostra o cdigo de exemplo anterior).

PROGRAMAO DO ACTIONSCRIPT 3.0 603


Captura da entrada do usurio

Compreenso da precedncia de KeyboardEvent


Assim como outros eventos, a seqncia de eventos de teclado determinada pela hierarquia de objetos de exibio, no pela ordem em que os mtodos addEventListener() so atribudos no cdigo. Suponha, por exemplo, que voc coloque um campo de texto chamado tf em um clipe de filme chamado container e adicione um ouvinte de eventos para um evento de teclado nas duas ocorrncias, como mostra o exemplo a seguir:
container.addEventListener(KeyboardEvent.KEY_DOWN,reportKeyDown); container.tf.border = true; container.tf.type = "input"; container.tf.addEventListener(KeyboardEvent.KEY_DOWN,reportKeyDown); function reportKeyDown(event:KeyboardEvent):void { trace(event.currentTarget.name + " hears key press: " + String.fromCharCode(event.charCode) + " (key code: " + event.keyCode + " character code: " + event.charCode + ")"); }

Como h um ouvinte no campo de texto e no recipiente pai, a funo reportKeyDown() chamada duas vezes para cada pressionamento de tecla em TextField. Para cada tecla pressionada, o campo de texto envia um evento antes que o clipe de filme container faa isso. O sistema operacional e o navegador da Web processam eventos de teclado antes do Adobe Flash Player ou AIR. No Microsoft Internet Explorer, por exemplo, pressionar Ctrl+W fecha a janela do navegador antes que qualquer arquivo SWF contido envie um evento de teclado.

Captura da entrada do mouse


Os cliques criam eventos de mouse que podem ser usados para acionar funes interativas. Voc pode adicionar um ouvinte de eventos ao palco para ouvir eventos de mouse que ocorrem em qualquer lugar no arquivo SWF. Tambm possvel adicionar ouvintes de eventos a objetos no palco que herdam modelos de InteractiveObject (por exemplo, Sprite ou MovieClip); esses ouvintes so acionados quando o objeto clicado. Assim como os eventos de teclado, os eventos de mouse aparecem em bales. No exemplo a seguir, como square filho de Stage, o evento enviado a partir do objeto square da entidade grfica, bem como do objeto Stage quando se clica em square:
var square:Sprite = new Sprite(); square.graphics.beginFill(0xFF0000); square.graphics.drawRect(0,0,100,100); square.graphics.endFill(); square.addEventListener(MouseEvent.CLICK, reportClick); square.x = square.y = 50; addChild(square); stage.addEventListener(MouseEvent.CLICK, reportClick); function reportClick(event:MouseEvent):void { trace(event.currentTarget.toString() + " dispatches MouseEvent. Local coords [" + event.localX + "," + event.localY + "] Stage coords [" + event.stageX + "," + event.stageY + "]"); }

PROGRAMAO DO ACTIONSCRIPT 3.0 604


Captura da entrada do usurio

No exemplo anterior, observe que o evento de mouse contm informaes de posio sobre o clique. As propriedades localX e localY contm o local do clique no filho mais inferior da cadeia de exibio. Por exemplo, clicar no canto superior esquerdo de square registra as coordenadas de local [0,0] porque este o ponto de registro de square. Como alternativo, as propriedades stageX e stageY referem-se s coordenadas globais do clique no palco. O mesmo clique registra [50,50] para essas coordenadas, pois square foi movido at elas. Esses dois pares de coordenadas podem ser teis dependendo do modo como deseja responder interao do usurio. O objeto MouseEvent tambm contm as propriedades booleanas altKey, ctrlKey e shiftKey. Voc pode usar essas propriedades para verificar se a tecla Alt, Ctrl ou Shift tambm est sendo pressionada ao mesmo tempo em que o clique do mouse.

Criao da funcionalidade arrastar e soltar


A funcionalidade arrastar e soltar permite que os usurios selecionem um objeto enquanto pressionam o boto esquerdo do mouse, movam o objeto at um novo local na tela e soltem-no nesse novo local soltando o boto esquerdo do mouse. O cdigo a seguir mostra um exemplo disso:
import flash.display.Sprite; import flash.events.MouseEvent; var circle:Sprite = new Sprite(); circle.graphics.beginFill(0xFFCC00); circle.graphics.drawCircle(0, 0, 40); var target1:Sprite = new Sprite(); target1.graphics.beginFill(0xCCFF00); target1.graphics.drawRect(0, 0, 100, 100); target1.name = "target1"; var target2:Sprite = new Sprite(); target2.graphics.beginFill(0xCCFF00); target2.graphics.drawRect(0, 200, 100, 100); target2.name = "target2"; addChild(target1); addChild(target2); addChild(circle); circle.addEventListener(MouseEvent.MOUSE_DOWN, mouseDown) function mouseDown(event:MouseEvent):void { circle.startDrag(); } circle.addEventListener(MouseEvent.MOUSE_UP, mouseReleased); function mouseReleased(event:MouseEvent):void { circle.stopDrag(); trace(circle.dropTarget.name); }

Para obter mais detalhes, consulte a seo sobre a criao da interao de arrastar e soltar em Alterao da posio na pgina 293.

PROGRAMAO DO ACTIONSCRIPT 3.0 605


Captura da entrada do usurio

Personalizao do cursor do mouse


O cursor do mouse (ponteiro) pode ser ocultado ou alternado para qualquer objeto de exibio no palco. Para ocultar o cursor do mouse, chame o mtodo Mouse.hide(). Personalize o cursor chamando Mouse.hide(), ouvindo o evento MouseEvent.MOUSE_MOVE no palco e definindo as coordenadas de um objeto de exibio (seu cursor personalizado) com as propriedades stageX e stageY do evento. O exemplo a seguir ilustra uma execuo bsica dessa tarefa:
var cursor:Sprite = new Sprite(); cursor.graphics.beginFill(0x000000); cursor.graphics.drawCircle(0,0,20); cursor.graphics.endFill(); addChild(cursor); stage.addEventListener(MouseEvent.MOUSE_MOVE,redrawCursor); Mouse.hide(); function redrawCursor(event:MouseEvent):void { cursor.x = event.stageX; cursor.y = event.stageY; }

Personalizao do menu de contexto


Cada objeto herdado a partir da classe InteractiveObject pode ter um menu de contexto exclusivo, que exibido quando o usurio clica com o boto direito do mouse no arquivo SWF. Vrios comandos so includos por padro, como Avanar, Voltar, Imprimir, Qualidade e Zoom. Voc pode remover todos os comandos padro do menu, exceto Configuraes e Sobre. Configurar a propriedade showDefaultContextMenu do palco como false remove esses comandos do menu de contexto. Para criar um menu de contexto personalizado para um objeto de exibio especfico, crie uma nova ocorrncia da classe ContextMenu, chame o mtodo hideBuiltInItems() e atribua essa ocorrncia propriedade contextMenu dessa instncia DisplayObject. O exemplo a seguir fornece um quadrado desenhado dinamicamente com um comando de menu de contexto para alter-lo para uma cor aleatria:

PROGRAMAO DO ACTIONSCRIPT 3.0 606


Captura da entrada do usurio

var square:Sprite = new Sprite(); square.graphics.beginFill(0x000000); square.graphics.drawRect(0,0,100,100); square.graphics.endFill(); square.x = square.y = 10; addChild(square); var menuItem:ContextMenuItem = new ContextMenuItem("Change Color"); menuItem.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT,changeColor); var customContextMenu:ContextMenu = new ContextMenu(); customContextMenu.hideBuiltInItems(); customContextMenu.customItems.push(menuItem); square.contextMenu = customContextMenu; function changeColor(event:ContextMenuEvent):void { square.transform.colorTransform = getRandomColor(); } function getRandomColor():ColorTransform { return new ColorTransform(Math.random(), Math.random(), Math.random(),1,(Math.random() * 512) - 255, (Math.random() * 512) -255, (Math.random() * 512) - 255, 0); }

Gerenciamento do foco
Um objeto interativo pode receber o foco, programaticamente ou por meio de uma ao do usurio. Nos dois casos, definir o foco altera a propriedade focus do objeto para true. Alm disso, se a propriedade tabEnabled estiver definida como true, o usurio poder passar o foco de um objeto para outro pressionando a tecla Tab. Observe que o valor de tabEnabled false por padro, exceto nos seguintes casos:

Para um objeto SimpleButton, o valor true. Para um campo de texto de entrada, o valor true. Para um objeto Sprite ou MovieClip com buttonMode definido como true, o valor true.
Em cada uma dessas situaes, voc pode adicionar um ouvinte para FocusEvent.FOCUS_IN ou FocusEvent.FOCUS_OUT a fim de fornecer outros comportamentos quando o foco for alterado. Isso til especialmente para campos de texto e formulrios, mas tambm pode ser usado em entidades grficas, clipes de filme ou qualquer objeto herdado da classe InteractiveObject. O exemplo a seguir mostra como ativar o ciclo do foco com a tecla Tab e como responder ao evento de foco subseqente. Nesse caso, cada quadrado muda de cor assim que recebe o foco. Nota: A ferramenta de criao do Flash usa atalhos do teclado para gerenciar o foco; desse modo, para simular o gerenciamento do foco corretamente, os arquivos SWF devem ser testados em um navegador ou AIR, no no Flash.

PROGRAMAO DO ACTIONSCRIPT 3.0 607


Captura da entrada do usurio

var var var var var var for {

rows:uint = 10; cols:uint = 10; rowSpacing:uint = 25; colSpacing:uint = 25; i:uint; j:uint; (i = 0; i < rows; i++) for (j = 0; j < cols; j++) { createSquare(j * colSpacing, i * rowSpacing, (i * cols) + j); }

} function createSquare(startX:Number, startY:Number, tabNumber:uint):void { var square:Sprite = new Sprite(); square.graphics.beginFill(0x000000); square.graphics.drawRect(0, 0, colSpacing, rowSpacing); square.graphics.endFill(); square.x = startX; square.y = startY; square.tabEnabled = true; square.tabIndex = tabNumber; square.addEventListener(FocusEvent.FOCUS_IN, changeColor); addChild(square); } function changeColor(event:FocusEvent):void { event.target.transform.colorTransform = getRandomColor(); } function getRandomColor():ColorTransform { // Generate random values for the red, green, and blue color channels. var red:Number = (Math.random() * 512) - 255; var green:Number = (Math.random() * 512) - 255; var blue:Number = (Math.random() * 512) - 255; // Create and return a ColorTransform object with the random colors. return new ColorTransform(1, 1, 1, 1, red, green, blue, 0); }

Exemplo: WordSearch
Este exemplo demonstra a interao do usurio por meio da manipulao de eventos de mouse. Os usurios criam o mximo de palavras possvel a partir de uma grade aleatria de letras, movendo-se na horizontal ou vertical na grade, mas nunca usando a mesma letra duas vezes. Este exemplo demonstra os seguintes recursos do ActionScript 3.0:

Criao dinmica de uma grade de componentes Resposta a eventos de mouse Manuteno da pontuao com base na interao do usurio

PROGRAMAO DO ACTIONSCRIPT 3.0 608


Captura da entrada do usurio

Para obter os arquivos de aplicativo desse exemplo, consulte www.adobe.com/go/learn_programmingAS3samples_flash_br. Os arquivos do aplicativo WordSearch esto localizados na pasta Amostras/WordSearch. O aplicativo consiste nos seguintes arquivos:
Arquivo WordSearch.as WordSearch.fla dictionary.txt Descrio A classe que fornece a funcionalidade principal do aplicativo. O arquivo de aplicativo principal para Flash. Um arquivo usado para determinar se as palavras criadas podem ser pontuadas e foram escritas corretamente.

Carregamento de um dicionrio
Para criar um jogo que envolve a busca de palavras, um dicionrio necessrio. O exemplo inclui um arquivo de texto chamado dictionary.txt que contm uma lista de palavras separadas por retornos de carro. Depois que uma matriz chamada words criada, a funo loadDictionary() solicita esse arquivo que, ao ser carregado com xito, se transforma em uma longa string. possvel analisar essa string em uma matriz de palavras usando o mtodo split(), quebrando-a em cada ocorrncia de um retorno de carro (cdigo de caractere 10) ou de uma nova linha (cdigo de caractere 13). Essa anlise ocorre na funo dictionaryLoaded():
words = dictionaryText.split(String.fromCharCode(13, 10));

Criao da interface de usurio


Depois de armazenar as palavras, voc pode configurar a interface de usurio. Crie duas ocorrncias de boto: uma para enviar uma palavra e outra para apagar uma palavra que esteja com erros ortogrficos no momento. Em cada caso, responda entrada do usurio ouvindo o evento MouseEvent.CLICK que o boto transmite e, em seguida, chamando uma funo. Na funo setupUI(), esse cdigo cria os ouvintes nos dois botes:
submitWordButton.addEventListener(MouseEvent.CLICK,submitWord); clearWordButton.addEventListener(MouseEvent.CLICK,clearWord);

Gerao de uma placa de jogo


A placa de jogo uma grade de letras aleatrias. Na funo generateBoard(), uma grade bidimensional criada, aninhando um loop em outro. O primeiro loop aumenta as linhas e o segundo aumenta o nmero total de colunas por linha. Cada clula criada por essas linhas e colunas contm um boto que representa uma letra na placa.

PROGRAMAO DO ACTIONSCRIPT 3.0 609


Captura da entrada do usurio

private function generateBoard(startX:Number, startY:Number, totalRows:Number, totalCols:Number, buttonSize:Number):void { buttons = new Array(); var colCounter:uint; var rowCounter:uint; for (rowCounter = 0; rowCounter < totalRows; rowCounter++) { for (colCounter = 0; colCounter < totalCols; colCounter++) { var b:Button = new Button(); b.x = startX + (colCounter*buttonSize); b.y = startY + (rowCounter*buttonSize); b.addEventListener(MouseEvent.CLICK, letterClicked); b.label = getRandomLetter().toUpperCase(); b.setSize(buttonSize,buttonSize); b.name = "buttonRow"+rowCounter+"Col"+colCounter; addChild(b); buttons.push(b); } } }

Embora um ouvinte seja adicionado para um evento MouseEvent.CLICK apenas em uma linha, por estar em um loop for, ele atribudo a cada ocorrncia de boto. Alm disso, cada boto recebe um nome derivado de sua posio de linha e coluna, o que facilita a referncia linha e coluna de cada boto posteriormente no cdigo.

Criao de palavras a partir da entrada do usurio


Para criar palavras, possvel selecionar letras que esto prximas na vertical ou na horizontal, mas nunca se deve usar a mesma letra duas vezes. Cada clique gera um evento de mouse e, nesse momento, a palavra fornecida pelo usurio deve ser verificada para assegurar que esteja sendo corretamente formada a partir das letras clicadas antes. Em caso negativo, a palavra anterior removida e uma nova iniciada. Essa verificao ocorre no mtodo isLegalContinuation().
private { var 3)); var 3)); var 3)); var 3)); function isLegalContinuation(prevButton:Button, currButton:Button):Boolean currButtonRow:Number = Number(currButton.name.charAt(currButton.name. indexOf("Row") + currButtonCol:Number = Number(currButton.name.charAt(currButton.name.indexOf("Col") + prevButtonRow:Number = Number(prevButton.name.charAt(prevButton.name.indexOf("Row") + prevButtonCol:Number = Number(prevButton.name.charAt(prevButton.name.indexOf("Col") +

return ((prevButtonCol == currButtonCol && Math.abs(prevButtonRow - currButtonRow) <= 1) || (prevButtonRow == currButtonRow && Math.abs(prevButtonCol - currButtonCol) <= 1)); }

Os mtodos charAt() e indexOf() da classe String recuperam as linhas e colunas apropriadas do boto clicado atualmente e do boto clicado anteriormente. O mtodo isLegalContinuation() retornar true se a linha ou coluna estiver inalterada e se a linha ou coluna que foi alterada estiver em um nico incremento da anterior. Se desejar alterar as regras do jogo e permitir a formao de palavras na diagonal, remova as verificaes de linhas ou colunas inalteradas; a linha final similar a:

PROGRAMAO DO ACTIONSCRIPT 3.0 610


Captura da entrada do usurio

return (Math.abs(prevButtonRow - currButtonRow) <= 1) && Math.abs(prevButtonCol currButtonCol) <= 1));

Verificao do envio de palavras


Para concluir o cdigo do jogo, os mecanismos de verificao do envio de palavras e de clculo da pontuao so necessrios. O mtodo searchForWord() contm os dois:
private function searchForWord(str:String):Number { if (words && str) { var i:uint = 0 for (i = 0; i < words.length; i++) { var thisWord:String = words[i]; if (str == words[i]) { return i; } } return -1; } else { trace("WARNING: cannot find words, or string supplied is null"); } return -1; }

Essa funo percorre todas as palavras do dicionrio. Se a palavra do usurio coincidir com a do dicionrio, sua posio no dicionrio ser retornada. O mtodo submitWord() verifica a resposta e atualiza a pontuao se a posio for vlida.

Personalizao
No incio da classe, existem vrias constantes. Voc pode modificar esse jogo modificando essas variveis. possvel, por exemplo, alterar a quantidade de tempo disponvel para jogar aumentando a varivel TOTAL_TIME. Voc tambm pode aumentar ligeiramente a varivel PERCENT_VOWELS para aumentar a probabilidade de busca das palavras.

611

Captulo 27: Rede e comunicao


Este captulo explica como ativar o arquivo SWF para se comunicar com arquivos externos e outras ocorrncias do Adobe Flash Player 9 e do Adobe AIR. Ele tambm explica como carregar dados de fontes externas, enviar mensagens entre um servidor Java e o Flash Player e fazer uploads e downloads de arquivos usando as classes FileReference e FileReferenceList.

Noes bsicas de rede e comunicao


Introduo rede e comunicao
Freqentemente, ao criar aplicativos do ActionScript mais complexos, voc necessita fazer a comunicao com scripts de servidor ou carregar dados de arquivos XML ou de texto externos. O pacote flash.net contm classes para enviar e receber dados pela Internet (por exemplo, para carregar contedo de URLs remotas, comunicar-se com outras ocorrncias do Flash Player ou do AIR, alm de conectar-se a sites remotos. No ActionScript 3.0, voc pode carregar arquivos externos com as classes URLLoader e URLRequest. Assim, voc pode usar uma classe especfica para acessar os dados, dependendo do tipo de dados carregado. Por exemplo, se o contedo remoto formatado como pares de nome e valor, use a classe URLVariables para analisar os resultados do servidor. Opcionalmente, se o arquivo carregado por meio das classes URLLoader e URLRequest for um documento XML remoto, voc poder analis-lo usando o construtor de classes XML, o construtor de classe XMLDocument ou o mtodo XMLDocument.parseXML(). Isso permite simplificar o cdigo ActionScript, pois o cdigo para carregar arquivos externos o mesmo, independentemente de voc usar URLVariables, XML ou alguma outra classe para analisar e trabalhar com os dados remotos. O pacote flash.net tambm contm classes para outros tipos de comunicao remota. Entre elas esto a classe FileReference, para carregar e baixar arquivos de um servidor, as classes Socket e XMLSocket, que permitem a comunicao direta com computadores remotos via conexes de soquete e as classes NetConnection e NetStream, utilizadas para comunicao com um servidor de recursos especficos do Flash, como o Flash Media Server e servidores Flash Remoting, bem como para o carregamento de arquivos de vdeo. Por fim, o pacote flash.net inclui classes para comunicao no computador local dos usurios. Entre elas est a classe LocalConnection, que permite a comunicao entre dois ou mais arquivos SWF em execuo em um nico computador, e a classe SharedObject, que permite o armazenamento de dados no computador do usurio e os recupera no momento em que forem retornados para o aplicativo.

Tarefas comuns de comunicao e rede


A lista a seguir descreve as tarefas mais comuns, que talvez voc queira realizar, relacionadas comunicao externa do ActionScript; estas tarefas so descritas neste captulo:

Carregar dados a partir de um arquivo externo ou um script de servidor Enviar dados para um script de servidor Estabelecer a comunicao com outros arquivos SWF locais Trabalhar com conexes de soquete binrio Estabelecer a comunicao com soquetes XML

PROGRAMAO DO ACTIONSCRIPT 3.0 612


Rede e comunicao

Armazenar dados locais persistentes Upload de arquivos em um servidor Baixar arquivos de um servidor para a mquina do usurio

Conceitos e termos importantes


A lista de referncia a seguir contm termos importantes usados neste captulo:

Dados externos: so dados armazenados de algum modo fora do arquivo SWF e carregados nesse mesmo arquivo
quando necessrio. Esses dados podem ser armazenados em um arquivo que carregado diretamente, em um banco de dados ou de algum modo que permita recuper-los ao chamar scripts ou programas em execuo no servidor.

Variveis codificadas por URL: o formato codificado por URL permite representar diversas variveis (pares de
nomes e valores de variveis) em uma nica string de texto. Variveis individuais so escritas no formato nome=valor. Cada varivel (ou seja, cada par de nome e valor) separada por caracteres E comercial, desta maneira: varivel1=valor1&varivel2=valor2. Desse modo, possvel enviar um nmero indefinido de variveis como uma s mensagem.

Tipo MIME: um cdigo padro usado para identificar o tipo de um determinado arquivo em comunicao via
Internet. Qualquer tipo de arquivo possui um cdigo especfico, usado para identific-lo. Ao enviar um arquivo ou uma mensagem, um computador (como um servidor Web ou uma ocorrncia do Flash Player ou do AIR de usurio) especificar o tipo de arquivo que est sendo enviado.

HTTP: forma abreviada do termo em ingls Hypertext Transfer Protocol, um formato padro para apresentao de
pginas da Web e vrios outros tipos de contedo enviados pela Internet.

Mtodo de solicitao: quando um programa como o Flash Player ou um navegador da Web envia uma mensagem
(chamada de solicitao HTTP) para um servidor Web, qualquer dado que est sendo enviado pode ser incorporado solicitao de duas maneiras, por meio dos mtodos de solicitao GET e POST. No servidor, o programa que recebe a solicitao precisar localizar os dados no trecho adequado da solicitao, por isso o mtodo de solicitao usado para enviar dados do ActionScript deve corresponder ao mtodo de solicitao usado para ler esses dados no servidor.

Conexo de soquete: uma conexo persistente para comunicao entre dois computadores. Upload: o envio de arquivos para outro computador. Download: usado para recuperar um arquivo contido em outro computador.

Trabalho com endereos IPv6


O Flash Player 9.0.115.0 e suas verses posteriores oferecem suporte a IPv6 (Internet Protocol verso 6). O IPv6 uma verso do Internet Protocol que oferece suporte a endereos de 128 bits (um aprimoramento do protocolo IPv4 anterior, que oferece suporte a endereos de 32 bits). Talvez seja necessrio ativar o IPv6 nas suas interfaces de rede. Para obter mais informaes, consulte a Ajuda do sistema operacional que est hospedando os dados. Se o IPv6 for suportado no sistema de host, ser possvel especificar endereos literais IPv6 numricos em URLs, contidos entre parnteses ([]), como apresentado seguir:
rtmp://[2001:db8:ccc3:ffff:0:444d:555e:666f]:1935/test

O Flash Player retorna valores IPv6 literais, de acordo com as regras a seguir:

O Flash Player retorna o formato longo da string para endereos IPv6. O valor de IP no possui abreviaes com dois pontos.

PROGRAMAO DO ACTIONSCRIPT 3.0 613


Rede e comunicao

Os dgitos hexadecimais so expressos apenas em letras minsculas. Os endereos IPv6 so apresentados entre parnteses ([]). Cada quarteto de endereo transformado em dgitos hexadecimais de 0 a 4, com os zeros esquerda omitidos. Um quarteto de endereo composto por zeros transformado em um nico zero (e no em dois-pontos duplos),
exceto se mencionado na lista de excees a seguir. Os valores IPv6 retornados pelo Flash Player tm as seguintes excees:

Um endereo IPv6 no especificado (somente zeros) transformado em [::]. O endereo IPv6 de retorno ou de host local transformado em [::1]. Os endereos IPv4 mapeados (convertido para IPv6) so transformados em [::ffff:a.b.c.d], em que a.b.c.d
corresponde a um tpico valor decimal IPv4 separado por pontos.

Os endereos IPv4 compatveis so transformados em [::a.b.c.d], em que a.b.c.d corresponde a um tpico valor
decimal IPv4 separado por pontos.

Teste dos exemplos do captulo


Talvez voc queira testar as listagens de cdigo de exemplo durante a leitura deste captulo. Muitas das listagens de cdigos desse captulo carregam dados externos ou realizam algum tipo de comunicao. Entre esses exemplos, em geral, esto includas as chamadas da funo trace(), para que os resultados da execuo do exemplo sejam exibidos no Painel de sada. Outros exemplos executam determinadas funes, como o upload de um arquivo para um servidor. O teste desses exemplos envolver a interao com o arquivo SWF e a confirmao da ao que eles esto incumbidos de executar. Os exemplos de cdigo so classificados em duas categorias. Algumas das listagens de exemplo so escritas considerando que o cdigo esteja em um script autnimo, que pode estar anexado a um quadro-chave de um documento Flash, por exemplo. Para testar os exemplos:
1 Crie um novo documento Flash. 2 Selecione o quadro-chave no Quadro 1 da Linha de tempo e abra o painel Aes. 3 Copie a listagem de cdigo no painel Script. 4 No menu principal, selecione Controle > Testar filme para criar o arquivo SWF e testar o exemplo.

Outras listagens de cdigos de exemplo so escritas como uma classe; espera-se que a classe de exemplo sirva como a classe do documento para o documento Flash. Para testar os exemplos:
1 Crie um documento Flash vazio e salve-o no seu computador. 2 Crie e salve um novo arquivo do ActionScript no mesmo diretrio do documento Flash. O nome do arquivo deve

corresponder ao nome da classe na listagem de cdigo. Por exemplo, se a listagem de cdigo define uma classe chamada UploadTest, salve o arquivo ActionScript como UploadTest.as.
3 Copie a listagem de cdigo no arquivo do ActionScript e salve o arquivo. 4 No documento Flash, clique em uma parte em branco do Palco ou da rea de trabalho para ativar o Inspetor de

propriedades do documento.
5 No Inspetor de propriedades, no campo Classe do documento, digite o nome da classe ActionScript que voc

copiou do texto.
6 Execute o programa usando o comando Controlar > Testar filme e teste o exemplo.

PROGRAMAO DO ACTIONSCRIPT 3.0 614


Rede e comunicao

Por fim, alguns dos exemplos deste captulo envolvem a interao com um programa em execuo em um servidor. Esses exemplos incluem um cdigo que pode ser usado para criar o programa de servidor necessrio para testar o exemplo. Para isso, ser necessrio configurar os aplicativos apropriados em um computador definido como servidor Web para testar os exemplos.

Trabalho com dados externos


O ActionScript 3.0 inclui mecanismos para carregamento de dados de fontes externas. Essas fontes podem ser contedo esttico, como arquivos de texto ou contedo dinmico, como um script da Web que recupera dados de um banco de dados. Os dados podem ser formatados de vrias maneiras, e o ActionScript fornece funcionalidade para decodificao e acesso aos dados. Voc tambm pode enviar dados ao servidor externo como parte do processo de recuperao de dados.

Uso das classes URLLoader e URLVariables


O ActionScript 3.0 usa as classes URLLoader e URLVariables para carregar dados externos. A classe URLLoader baixa dados de uma URL como texto, dados binrios ou variveis codificadas de URL. Ela til para download de arquivos de texto, XML ou outras informaes a serem usadas em aplicativos ActionScript dinmicos controlados por dados. A classe URLLoader beneficia-se do modelo de tratamento de eventos avanado do ActionScript 3.0 que permite monitorar esses eventos como complete, httpStatus, ioError, open, progress e securityError. O novo modelo de tratamento de eventos representa uma melhoria significativa no suporte do ActionScript 2.0 para os manipuladores de eventos LoadVars.onData, LoadVars.onHTTPStatus e LoadVars.onLoad porque permite tratar erros e eventos de maneira mais eficiente. Para obter mais informaes sobre como tratar eventos, consulte Manipulao de eventos na pgina 251 Muito semelhante s classes XML e LoadVars em verses anteriores do ActionScript, os dados da URL da URLLoader no esto disponveis at que o download seja concludo. Voc pode monitorar o andamento do download (bytes carregados e total de bytes) monitorando o evento flash.events.ProgressEvent.PROGRESS a ser despachado, se bem que se o arquivo for carregado muito rapidamente, um evento ProgressEvent.PROGRESS talvez no seja despachado. Quando um arquivo baixado com xito, o evento flash.events.Event.COMPLETE despachado. Os dados carregados so decodificados da codificao UTF-8 ou UTF-16 em uma string. Nota: Se nenhum valor estiver definido para URLRequest.contentType, os valores sero enviados como aplicativo/x-www-form-urlencoded. O mtodo URLLoader.load() (e opcionalmente o construtor da classe URLLoader) utiliza um nico parmetro,
request, que uma ocorrncia de URLRequest. Uma ocorrncia de URLRequest contm todas as informaes para

uma nica solicitao HTTP, como a URL de destino, mtodo de solicitao (GET ou POST), informaes de cabealho adicionais e do tipo MIME (por exemplo, quando voc carrega o contedo XML). Por exemplo, para carregar um pacote XML em um script do lado do servidor, use o seguinte cdigo do ActionScript 3.0:

PROGRAMAO DO ACTIONSCRIPT 3.0 615


Rede e comunicao

var secondsUTC:Number = new Date().time; var dataXML:XML = <login> <time>{secondsUTC}</time> <username>Ernie</username> <password>guru</password> </login>; var request:URLRequest = new URLRequest("http://www.yourdomain.com/login.cfm"); request.contentType = "text/xml"; request.data = dataXML.toXMLString(); request.method = URLRequestMethod.POST; var loader:URLLoader = new URLLoader(); try { loader.load(request); } catch (error:ArgumentError) { trace("An ArgumentError has occurred."); } catch (error:SecurityError) { trace("A SecurityError has occurred."); }

O snippet anterior cria uma ocorrncia XML denominada dataXML que contm um pacote XML a ser enviado ao servidor. Em seguida, voc define a propriedade contentType de URLRequest como "text/xml" e define a propriedade data de URLRequest como o contedo do pacote XML, que so convertidas em uma string usando o mtodo XML.toXMLString(). Finalmente, voc cria uma nova ocorrncia de URLLoader e envia a solicitao ao script remoto usando o mtodo URLLoader.load(). H trs maneiras possveis para especificar parmetros a serem transmitidos em uma solicitao de URL:

De dentro do construtor URLVariables De dentro do mtodo URLVariables.decode() Como propriedades especficas dentro do prprio objeto URLVariables
Quando voc define variveis dentro do construtor URLVariables ou de dentro do mtodo URLVariables.decode(), necessrio verificar se codificou o caractere E comercial em URL porque ele tem um significado especial e funciona como um delimitador. Por exemplo, ao transmitir um E comercial, voc precisa codific-lo em URL alterando-o de & para %26 porque o E comercial funciona como um delimitador de parmetros.

Carregamento de dados de documentos externos


Ao criar aplicativos dinmicos com o ActionScript 3.0, bom carregar os dados de arquivos externos ou de scripts do lado do servidor. Isso permite criar aplicativos dinmicos sem precisar editar ou recompilar os arquivos ActionScript. Por exemplo, se voc criar um aplicativo tip of the day, poder gravar um script do lado do servidor que recupera uma dica aleatria de um banco de dados e salva-a em um arquivo de texto uma vez por dia. Em seguida, o aplicativo ActionScript pode carregar o contedo de um arquivo de texto esttico em vez de consultar o banco de dados a cada vez. O seguinte snippet cria um objeto URLRequest e URLLoader que carrega o contedo de um arquivo de texto externo, params.txt:
var request:URLRequest = new URLRequest("params.txt"); var loader:URLLoader = new URLLoader(); loader.load(request);

PROGRAMAO DO ACTIONSCRIPT 3.0 616


Rede e comunicao

possvel simplificar o snippet anterior para o seguinte:


var loader:URLLoader = new URLLoader(new URLRequest("params.txt"));

Por padro, se voc no definir um mtodo de solicitao, o Flash Player e o Adobe AIR carregaro o contedo usando o mtodo GET HTTP. Para enviar os dados usando o mtodo POST, necessrio definir a propriedade request.method como POST usando a constante esttica URLRequestMethod.POST, conforme mostrado pelo cdigo a seguir:
var request:URLRequest = new URLRequest("sendfeedback.cfm"); request.method = URLRequestMethod.POST;

O documento externo, params.txt, que carregado no tempo de execuo, contm os seguintes dados:
monthNames=January,February,March,April,May,June,July,August,September,October,November,Dece mber&dayNames=Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday

O arquivo contm dois parmetros, monthNames e dayNames. Cada parmetro contm uma lista separada por vrgula que analisada como strings. possvel dividir essa lista em uma matriz usando o mtodo String.split(). Evite usar palavras reservadas ou construes de linguagem como nomes de variveis em arquivos de dados externos, porque isso dificulta a leitura e a depurao do cdigo. Depois que os dados so carregados, o evento Event.COMPLETE despachado e o contedo do documento externo est disponvel para uso na propriedade data do URLLoader, conforme mostrado no cdigo a seguir:
private function completeHandler(event:Event):void { var loader2:URLLoader = URLLoader(event.target); trace(loader2.data); }

Se o documento remoto contiver pares de nome e valor, voc poder analisar os dados usando a classe URLVariables transmitindo o contedo do arquivo carregado, da seguinte maneira:
private function completeHandler(event:Event):void { var loader2:URLLoader = URLLoader(event.target); var variables:URLVariables = new URLVariables(loader2.data); trace(variables.dayNames); }

Cada par de nome e valor do arquivo externo criado como uma propriedade no objeto URLVariables. Cada propriedade dentro do objeto de variveis na amostra do cdigo anterior tratada como uma string. Se o valor do par de nome e valor for uma lista de itens, voc poder converter a string em uma matriz chamando o mtodo String.split(), da seguinte maneira:
var dayNameArray:Array = variables.dayNames.split(",");

Se voc estiver carregando dados numricos de arquivos de texto externos, ser necessrio converter os valores em valores numricos usando a funo de nvel superior, como int(), uint() ou Number(). Em vez de carregar o contedo do arquivo remoto como uma string e criar um novo objeto URLVariables, voc pode definir a propriedade URLLoader.dataFormat como uma das propriedades estticas encontradas na classe URLLoaderDataFormat. Os trs valores possveis para a propriedade URLLoader.dataFormat so os seguintes:

URLLoaderDataFormat.BINARY a propriedade URLLoader.data contm dados binrios armazenados em um

objeto ByteArray.
URLLoaderDataFormat.TEXT a propriedade URLLoader.data contm texto em um objeto String.

PROGRAMAO DO ACTIONSCRIPT 3.0 617


Rede e comunicao

URLLoaderDataFormat.VARIABLES a propriedade URLLoader.data contm variveis codificadas em URL armazenadas em um objeto URLVariables.

O cdigo a seguir demonstra como a configurao da propriedade URLLoader.dataFormat como URLLoaderDataFormat.VARIABLES permite analisar automaticamente dados carregados em um objeto URLVariables:
package { import import import import import

flash.display.Sprite; flash.events.*; flash.net.URLLoader; flash.net.URLLoaderDataFormat; flash.net.URLRequest;

public class URLLoaderDataFormatExample extends Sprite { public function URLLoaderDataFormatExample() { var request:URLRequest = new URLRequest("http://www.[yourdomain].com/params.txt"); var variables:URLLoader = new URLLoader(); variables.dataFormat = URLLoaderDataFormat.VARIABLES; variables.addEventListener(Event.COMPLETE, completeHandler); try { variables.load(request); } catch (error:Error) { trace("Unable to load URL: " + error); } } private function completeHandler(event:Event):void { var loader:URLLoader = URLLoader(event.target); trace(loader.data.dayNames); } } }

Nota: O valor padro de URLLoader.dataFormat URLLoaderDataFormat.TEXT. Conforme mostrado no exemplo a seguir, carregar XML de um arquivo externo o mesmo que carregar URLVariables. possvel criar uma ocorrncia de URLRequest e uma de URLLoader e us-las para baixar um documento XML remoto. Quando o arquivo baixado completamente, o evento Event.COMPLETE despachado e o contedo do arquivo externo convertido para uma ocorrncia XML, que pode ser analisada usando mtodos e propriedades XML.

PROGRAMAO DO ACTIONSCRIPT 3.0 618


Rede e comunicao

package { import import import import import

flash.display.Sprite; flash.errors.*; flash.events.*; flash.net.URLLoader; flash.net.URLRequest;

public class ExternalDocs extends Sprite { public function ExternalDocs() { var request:URLRequest = new URLRequest("http://www.[yourdomain].com/data.xml"); var loader:URLLoader = new URLLoader(); loader.addEventListener(Event.COMPLETE, completeHandler); try { loader.load(request); } catch (error:ArgumentError) { trace("An ArgumentError has occurred."); } catch (error:SecurityError) { trace("A SecurityError has occurred."); } } private function completeHandler(event:Event):void { var dataXML:XML = XML(event.target.data); trace(dataXML.toXMLString()); } } }

Comunicao com scripts externos


Alm de carregar arquivos de dados externos, voc pode usar tambm a classe URLVariables para enviar variveis a um script do lado do servidor e processar a resposta do servidor. Isso ser til, por exemplo, se voc estiver programando um jogo e desejar enviar a pontuao do usurio a um servidor para calcular se ela deve ser adicionada lista de pontuaes altas ou mesmo enviar informaes de logon do usurio a um servidor para validao. Um script do lado do servidor pode processar o nome do usurio e a senha, valid-la em relao ao banco de dados e retornar a confirmao de que as credenciais fornecidas pelo usurio so vlidas. O seguinte snippet cria um objeto URLVariables denominado variables que cria uma nova varivel chamada name. Em seguida, criado um objeto URLRequest que especifica a URL do script do lado do servidor para o qual as variveis so enviadas. Em seguida, voc define a propriedade method do objeto URLRequest para enviar as variveis como uma solicitao POST HTTP. Para adicionar o objeto URLVariables solicitao de URL, defina a propriedade data do objeto URLRequest como o objeto URLVariables criado anteriormente. Finalmente, a ocorrncia de URLLoader criada e o mtodo URLLoader.load() chamado, o que inicia a solicitao.

PROGRAMAO DO ACTIONSCRIPT 3.0 619


Rede e comunicao

var variables:URLVariables = new URLVariables("name=Franklin"); var request:URLRequest = new URLRequest(); request.url = "http://www.[yourdomain].com/greeting.cfm"; request.method = URLRequestMethod.POST; request.data = variables; var loader:URLLoader = new URLLoader(); loader.dataFormat = URLLoaderDataFormat.VARIABLES; loader.addEventListener(Event.COMPLETE, completeHandler); try { loader.load(request); } catch (error:Error) { trace("Unable to load URL"); } function completeHandler(event:Event):void { trace(event.target.data.welcomeMessage); }

O cdigo a seguir contm o contedo do documento greeting.cfm do Adobe ColdFusion usado no exemplo anterior:
<cfif NOT IsDefined("Form.name") OR Len(Trim(Form.Name)) EQ 0> <cfset Form.Name = "Stranger" /> </cfif> <cfoutput>welcomeMessage=#UrlEncodedFormat("Welcome, " & Form.name)# </cfoutput>

Conexo com outras ocorrncias do Flash Player e AIR


A classe LocalConnection permite que voc se comunique entre diferentes ocorrncias do Flash Player e do AIR, como um SWF em um continer HTML ou em um player autnomo ou incorporado. Isso permite criar aplicativos muito versteis que podem compartilhar dados entre ocorrncias do Flash Player e do AIR, como arquivos SWF executados em um navegador da Web ou incorporados em aplicativos da rea de trabalho.

Classe LocalConnection
A classe LocalConnection permite desenvolver arquivos SWF que podem enviar instrues a outros arquivos SWF sem o uso do mtodo fscommand() ou do JavaScript. Objetos LocalConnection podem se comunicar apenas entre arquivos SWF que esto em execuo no mesmo computador cliente, mas podem ser executados em diferentes aplicativos. Por exemplo, um arquivo SWF em execuo em um navegador e um arquivo SWF em execuo em um projetor podem compartilhar informaes, com o projetor mantendo informaes locais e o SWF com base em navegador conectado remotamente. (Um projetor um arquivo SWF salvo em um formato que pode ser executado como um aplicativo autnomo, isto , o projetor no requer que o Flash Player seja instalado porque est incorporado dentro do executvel.) Objetos LocalConnection podem ser usados para comunicao entre SWFs usando diferentes verses do ActionScript:

Objetos LocalConnection do ActionScript 3.0 podem se comunicar com objetos LocalConnection criados no
ActionScript 1.0 ou 2.0.

PROGRAMAO DO ACTIONSCRIPT 3.0 620


Rede e comunicao

Objetos LocalConnection do ActionScript 1.0 ou 2.0 podem se comunicar com objetos LocalConnection criados
no ActionScript 3.0. O Flash Player manipula automaticamente essa comunicao entre objetos LocalConnection de diferentes verses. A maneira mais simples de usar um objeto LocalConnection permitir a comunicao apenas entre objetos LocalConnection localizados no mesmo domnio. Desse modo, no necessrio se preocupar com problemas de segurana. No entanto, se for necessrio permitir a comunicao entre domnios, h vrias maneiras de implementar medidas de segurana. Para obter mais informaes, consulte a discusso do parmetro connectionName do mtodo send() e das entradas allowDomain() e domain na listagem de classes LocalConnection na Referncia dos componentes e da linguagem do ActionScript 3.0. possvel usar objetos LocalConnection para enviar e receber dados dentro de um arquivo SWF nico, mas a Adobe no recomenda esse procedimento. Em vez disso, voc deve usar objetos compartilhados. H trs maneiras de adicionar mtodos de retorno de chamada aos objetos LocalConnection:

Criar subclasse da classe LocalConnection e adicionar mtodos. Definir a propriedade LocalConnection.client como um objeto que implementa os mtodos. Criar uma classe dinmica que estende o LocalConnection e anexar mtodos dinamicamente.
A primeira maneira de adicionar mtodos de retorno de chamada estender a classe LocalConnection. Voc define os mtodos dentro da classe personalizada em vez de adicion-los dinamicamente ocorrncia de LocalConnection. Essa abordagem demonstrada no cdigo a seguir:
package { import flash.net.LocalConnection; public class CustomLocalConnection extends LocalConnection { public function CustomLocalConnection(connectionName:String) { try { connect(connectionName); } catch (error:ArgumentError) { // server already created/connected } } public function onMethod(timeString:String):void { trace("onMethod called at: " + timeString); } } }

Para criar uma nova ocorrncia da classe DynamicLocalConnection, use o seguinte cdigo:
var serverLC:CustomLocalConnection; serverLC = new CustomLocalConnection("serverName");

A segunda maneira de adicionar mtodos de retorno de chamada usar a propriedade LocalConnection.client. Isso envolve a criao de uma classe personalizada e a atribuio de uma nova ocorrncia para a propriedade cliente, conforme mostrado no cdigo a seguir:

PROGRAMAO DO ACTIONSCRIPT 3.0 621


Rede e comunicao

var lc:LocalConnection = new LocalConnection(); lc.client = new CustomClient();

A propriedade LocalConnection.client indica os mtodos de retorno de chamada do objeto que devem ser chamados. No cdigo anterior, a propriedade client foi definida como uma nova ocorrncia de uma classe personalizada, CustomClient. O valor padro da propriedade client a ocorrncia LocalConnection atual. Voc poder usar a propriedade client, se tiver dois manipuladores de dados que tenham o mesmo conjunto de mtodos, mas funcionam de modo diferente, por exemplo, em um aplicativo em que um boto em uma janela alterna a exibio em uma segunda janela. Para criar a classe CustomClient, voc pode usar o seguinte cdigo:
package { public class CustomClient extends Object { public function onMethod(timeString:String):void { trace("onMethod called at: " + timeString); } } }

A terceira maneira de adicionar mtodos de retorno de chamada criando uma classe dinmica e anexando os mtodos dinamicamente, muito semelhante ao uso da classe LocalConnection em verses anteriores do ActionScript, conforme mostrado no cdigo a seguir:
import flash.net.LocalConnection; dynamic class DynamicLocalConnection extends LocalConnection {}

Os mtodos de retorno de chamada podem ser adicionados dinamicamente a essa classe usando o seguinte cdigo:
var connection:DynamicLocalConnection = new DynamicLocalConnection(); connection.onMethod = this.onMethod; // Add your code here. public function onMethod(timeString:String):void { trace("onMethod called at: " + timeString); }

A maneira anterior de adicionar mtodos de retorno de chamada no recomendada porque o cdigo no muito porttil. Alm disso, o uso desse mtodo de criao de conexes locais pode criar problemas de desempenho, porque o acesso a propriedades dinmicas drasticamente mais lento do que o acesso a propriedades seladas.

Envio de mensagens entre duas ocorrncias do Flash Player


Voc usa a classe LocalConnection para se comunicar entre diferentes ocorrncias do Flash Player e do Adobe AIR. Por exemplo, voc pode ter vrias ocorrncias do Flash Player em uma pgina da Web ou fazer com que uma ocorrncia do Flash Player recupere dados de uma ocorrncia do Flash Player em uma janela pop-up. O cdigo a seguir define um objeto de conexo local que funciona como um servidor e aceita chamadas de entrada de outras ocorrncias do Flash Player:

PROGRAMAO DO ACTIONSCRIPT 3.0 622


Rede e comunicao

package { import flash.net.LocalConnection; import flash.display.Sprite; public class ServerLC extends Sprite { public function ServerLC() { var lc:LocalConnection = new LocalConnection(); lc.client = new CustomClient1(); try { lc.connect("conn1"); } catch (error:Error) { trace("error:: already connected"); } } } }

Esse cdigo cria primeiro um objeto LocalConnection denominado lc e define a propriedade client como uma classe personalizada, CustomClient1. Quando outra ocorrncia do Flash Player chama um mtodo nessa ocorrncia de conexo local, o Flash Player procura esse mtodo na classe CustomClient1. Sempre que uma ocorrncia do Flash Player se conecta a esse arquivo SWF e tenta chamar qualquer mtodo para a conexo local especificada, a solicitao enviada para a classe especificada pela propriedade client, definida como classe CustomClient1:
package { import flash.events.*; import flash.system.fscommand; import flash.utils.Timer; public class CustomClient1 extends Object { public function doMessage(value:String = ""):void { trace(value); } public function doQuit():void { trace("quitting in 5 seconds"); this.close(); var quitTimer:Timer = new Timer(5000, 1); quitTimer.addEventListener(TimerEvent.TIMER, closeHandler); } public function closeHandler(event:TimerEvent):void { fscommand("quit"); } } }

PROGRAMAO DO ACTIONSCRIPT 3.0 623


Rede e comunicao

Para criar um servidor LocalConnection, chame o mtodo LocalConnection.connect() e fornea um nome de conexo exclusivo. Se voc j tiver uma conexo com o nome especificado, um erro ArgumentError ser gerado, indicando que houve falha durante a tentativa de conexo, porque o objeto j est conectado. O seguinte snippet demonstra como criar uma nova conexo de soquete com o nome conn1:
try { connection.connect("conn1"); } catch (error:ArgumentError) { trace("Error! Server already exists\n"); }

Nota: A conexo com o arquivo SWF primrio a partir de um arquivo SWF secundrio requer que voc crie um novo objeto LocalConnection no objeto LocalConnection de envio e chame o mtodo LocalConnection.send() com o nome da conexo e o nome do mtodo a ser executado. Por exemplo, para conectar-se ao objeto LocalConnection criado anteriormente, use o seguinte cdigo:
sendingConnection.send("conn1", "doQuit");

Esse cdigo conecta-se a um objeto LocalConnection existente com o nome de conexo conn1 e chama o mtodo doQuit() no arquivo SWF remoto. Para enviar parmetros ao arquivo SWF remoto, especifique argumentos adicionais aps o nome do mtodo no mtodo send(), conforme mostrado no seguinte snippet:
sendingConnection.send("conn1", "doMessage", "Hello world");

Conexo a documentos SWF em domnios diferentes


Para permitir comunicaes apenas de domnios especficos, chame o mtodo allowDomain() ou allowInsecureDomain() da classe LocalConnection e transmita uma lista de um ou mais domnios que tm permisso para acessar esse objeto LocalConnection. Em verses anteriores do ActionScript, LocalConnection.allowDomain() e
LocalConnection.allowInsecureDomain() eram mtodos de retorno de chamada que precisavam ser

implementados por desenvolvedores e retornar um valor booleano. No ActionScript 3.0,


LocalConnection.allowDomain() e LocalConnection.allowInsecureDomain() so mtodos internos que os

desenvolvedores podem chamar exatamente como Security.allowDomain() e


Security.allowInsecureDomain(), transmitindo um ou mais nomes de domnios a serem permitidos.

H dois valores especiais que voc pode transmitir para os mtodos LocalConnection.allowDomain() e LocalConnection.allowInsecureDomain(): * e host local. O valor de asterisco (*) permite o acesso de todos os domnios. A string localhost permite chamadas para o arquivo SWF de arquivos SWF que esto instalados localmente. O Flash Player 8 introduziu restries de segurana em arquivos SWF locais. Um arquivo SWF com acesso permitido Internet no pode ter acesso tambm ao sistema de arquivos local. Se voc especificar localhost, qualquer arquivo SWF local poder acessar o arquivo SWF. Se o mtodo LocalConnection.send() tentar se comunicar com um arquivo SWF a partir de uma caixa de proteo de segurana qual o cdigo de chamada no possui acesso, um evento securityError (SecurityErrorEvent.SECURITY_ERROR) ser despachado. Para solucionar esse erro, especifique o domnio do chamador no mtodo LocalConnection.allowDomain() do receptor.

PROGRAMAO DO ACTIONSCRIPT 3.0 624


Rede e comunicao

Se voc implementar a comunicao apenas entre arquivos SWF no mesmo domnio, poder especificar um parmetro connectionName que no comece com um sublinhado (_) e que no especifique um nome de domnio (por exemplo, myDomain:connectionName). Use a mesma string no comando LocalConnection.connect(connectionName). Se voc implementar a comunicao entre arquivos SWF em domnios diferentes, especifique um parmetro connectionName que comece com um sublinhado. Especificar um sublinhado faz com que o arquivo SWF com o objeto LocalConnection recebido seja mais porttil entre domnios. Estes so os dois casos possveis:

Se a string de connectionName no comear com um sublinhado, o Flash Player adicionar um prefixo com o
nome do superdomnio e um sinal de dois pontos (por exemplo, myDomain:connectionName). Embora isso garanta que a conexo no entre em conflito com as conexes de nome idntico em outros domnios, todos os objetos LocalConnection de envio devem especificar esse superdomnio (por exemplo, myDomain:connectionName). Se voc mover o arquivo SWF com o objeto LocalConnection de recebimento para outro domnio, o Flash Player alterar o prefixo para refletir o novo superdomnio (por exemplo, anotherDomain:connectionName). Todos os objetos LocalConnection de envio precisam ser editados manualmente para apontar para o novo superdomnio.

Se a string do connectionName comear com um sublinhado (por exemplo, _connectionName), o Flash Player
no adicionar um prefixo string. Isso significa que os objetos LocalConnection de recebimento e envio usam strings idnticas para connectionName. Se o objeto de recebimento usar LocalConnection.allowDomain() para especificar que as conexes de qualquer domnio so aceitas, voc poder mover o arquivo SWF com o objeto LocalConnection de recebimento para outro domnio sem alterar nenhum objeto LocalConnection de envio.

conexes de soquete
H dois tipos diferentes de conexes de soquete possveis no ActionScript 3.0: Conexes de soquete XML e conexes de soquete binrio. Um soquete XML permite que voc se conecte com um servidor remoto e crie uma conexo de servidor que permanea aberta at que seja fechada explicitamente. Isso permite a troca de dados XML entre um servidor e um cliente sem necessidade de abrir continuamente novas conexes de servidor. Outro benefcio do uso de um servidor de soquete XML que o usurio no precisa solicitar dados explicitamente. possvel enviar dados do servidor sem solicitaes e enviar dados a cada cliente conectado com o servidor de soquete XML. As conexes de soquete XML requerem a presena de uma poltica de soquete no servidor de destino. Para obter mais informaes, consulte Controles de site (arquivos de poltica) na pgina 711 eConexo a soquetes na pgina 727. Uma conexo de soquete binrio semelhante a um soquete XML, exceto que o cliente e o servidor no precisam trocar pacotes XML especificamente. Em vez disso, a conexo pode transferir dados como informaes binrias. Isso permite conectar-se a uma ampla faixa de servios, incluindo servidores de email (POP3, SMTP e IMAP) e novos servidores (NNTP).

classe Socket
Introduzida no ActionScript 3.0, a classe Socket permite que o ActionScript faa conexes de soquete e leia e grave dados binrios brutos. Ela semelhante classe XMLSocket, mas no determina o formato dos dados recebidos ou transmitidos. A classe Socket til para interoperar com servidores que usam protocolos binrios. Usando conexes de soquete binrio, voc pode gravar cdigo que permite a interao com vrios protocolos de Internet diferentes, como POP3, SMTP, IMAP e NNTP. Isso, por sua vez, permite que o Flash Player se conecte com servidores de email e de notcias.

PROGRAMAO DO ACTIONSCRIPT 3.0 625


Rede e comunicao

O Flash Player pode fazer interface com um servidor usando o protocolo binrio desse servidor diretamente. Alguns servidores usam a ordem de bytes big-endian e alguns usam a ordem de bytes little-endian. A maioria dos servidores na Internet usa a ordem de bytes big-endian, porque a "ordem de bytes da rede" big-endian. A ordem de bytes littleendian popular porque a usada pela arquitetura Intel x86. Voc deve usar a ordem de bytes endian que corresponde ordem de bytes do servidor que est enviando ou recebendo dados. Todas as operaes executadas pelas interfaces IDataInput e IDataOutput, e as classes que implementam essas interfaces (ByteArray, Socket e URLStream), por padro, so codificadas no formato big-endian, isto , com o byte mais significativo primeiro. Isso feito para corresponder a ordem de bytes Java e a da rede oficial. Para alterar se a ordem de bytes big-endian ou a little-endian usada, voc pode definir a propriedade endian como Endian.BIG_ENDIAN ou Endian.LITTLE_ENDIAN. A classe Socket herda todos os mtodos implementados pelas interfaces IDataInput e IDataOutput (localizadas no pacote flash.utils), e esses mtodos devem ser usados para gravar e ler a partir do Socket.

classe XMLSocket
O ActionScript fornece uma classe XMLSocket embutida, que permite abrir uma conexo contnua com um servidor. Essa conexo aberta remove problemas de latncia e usada normalmente para aplicativos em tempo real, como aplicativos de bate-papo ou jogos para vrios jogadores. Uma soluo tradicional de bate-papo com base em HTTP freqentemente faz o polling do servidor e baixa novas mensagens usando uma solicitao HTTP. Em contraste, uma soluo de bate-papo XMLSocket mantm uma conexo aberta com o servidor, o que permite que esse servidor envie automaticamente mensagens sem uma solicitao do cliente. Para criar uma conexo de soquete, voc deve criar um aplicativo do lado do servidor para aguardar a solicitao de conexo do soquete e enviar uma resposta ao arquivo SWF. Esse tipo de aplicativo do lado do servidor pode ser gravado em uma linguagem de programao, como Java, Python ou Perl. Para usar a classe XMLSocket, o computador servidor precisa executar um daemon que compreenda o protocolo usado pela classe XMLSocket. O protocolo descrito na lista a seguir:

Mensagens XML so enviadas por meio de uma conexo de soquete de fluxo TCP/IP full-duplex. Cada mensagem XML um documento XML completo, terminado por um byte zero (0). Um nmero ilimitado de mensagens XML pode ser enviado e recebido por meio de uma nica conexo
XMLSocket. A classe XMLSocket no pode ser encapsulada automaticamente por meio de firewalls porque, ao contrrio do protocolo RTMP, a XMLSocket no tem nenhum recurso de encapsulamento HTTP. Se voc precisar usar o encapsulamento HTTP, considere o uso do Flash Remoting ou do Flash Media Server (que oferece suporte a RTMP). Nota: Configurar um servidor para se comunicar com o objeto XMLSocket pode ser um desafio. Se o seu aplicativo no exigir interatividade em tempo real, use a classe URLLoader em vez da classe XMLSocket. Voc pode usar os mtodos XMLSocket.connect() e XMLSocket.send() da classe XMLSocket para transferir XML para o servidor e vice-versa por uma conexo de soquete. O mtodo XMLSocket.connect() estabelece uma conexo de soquete com a porta do servidor da Web. O mtodo XMLSocket.send() transmite um objeto XML para o servidor especificado na conexo de soquete. Ao chamar o mtodo XMLSocket.connect(), o Flash Player abre uma conexo TCP/IP com o servidor e mantm essa conexo aberta at que ocorra uma das seguintes aes:

O mtodo XMLSocket.close() da classe XMLSocket chamado. No existe mais nenhuma referncia ao objeto XMLSocket. O Flash Player encerrado. A conexo interrompida (por exemplo, o modem se desconecta).

PROGRAMAO DO ACTIONSCRIPT 3.0 626


Rede e comunicao

Criao e conexo a um servidor de soquete Java XML


O cdigo a seguir demonstra um servidor XMLSocket simples escrito em Java que aceita conexes de entrada e exibe as mensagens recebidas na janela de prompt de comando. Por padro, um novo servidor criado na porta 8080 da mquina local, embora seja possvel especificar um nmero de porta diferente ao iniciar o servidor na linha de comando. Crie um novo documento de texto e adicione o seguinte cdigo:
import java.io.*; import java.net.*; class SimpleServer { private static SimpleServer server; ServerSocket socket; Socket incoming; BufferedReader readerIn; PrintStream printOut; public static void main(String[] args) { int port = 8080; try { port = Integer.parseInt(args[0]); } catch (ArrayIndexOutOfBoundsException e) { // Catch exception and keep going. } server = new SimpleServer(port); } private SimpleServer(int port) { System.out.println(">> Starting SimpleServer"); try { socket = new ServerSocket(port); incoming = socket.accept(); readerIn = new BufferedReader(new InputStreamReader(incoming.getInputStream())); printOut = new PrintStream(incoming.getOutputStream()); printOut.println("Enter EXIT to exit.\r"); out("Enter EXIT to exit.\r"); boolean done = false; while (!done) { String str = readerIn.readLine(); if (str == null) { done = true; } else {

PROGRAMAO DO ACTIONSCRIPT 3.0 627


Rede e comunicao

out("Echo: " + str + "\r"); if(str.trim().equals("EXIT")) { done = true; } } incoming.close(); } } catch (Exception e) { System.out.println(e); } } private void out(String str) { printOut.println(str); System.out.println(str); } }

Salve o documento no disco rgido como SimpleServer.java e compile-o usando um compilador Java que cria um arquivo de classe Java denominado SimpleServer.class. Voc pode iniciar o servidor XMLSocket abrindo um prompt de comando e digitando java SimpleServer. O arquivo SimpleServer.class pode estar localizado em qualquer lugar no computador local ou na rede. Ele no precisa ser colocado no diretrio raiz do servidor da Web. Se voc no puder iniciar o servidor porque os arquivos no esto localizados dentro do caminho de classe Java, tente iniciar o servidor com java -classpath. SimpleServer. Para se conectar ao XMLSocket do aplicativo ActionScript, necessrio criar uma nova ocorrncia da classe XMLSocket, e chamar o mtodo XMLSocket.connect() ao transmitir um nome do host e um nmero de porta, da seguinte maneira:
var xmlsock:XMLSocket = new XMLSocket(); xmlsock.connect("127.0.0.1", 8080);

Sempre que voc receber dados do servidor, o evento data (flash.events.DataEvent.DATA) despachado:
xmlsock.addEventListener(DataEvent.DATA, onData); private function onData(event:DataEvent):void { trace("[" + event.type + "] " + event.data); }

Para enviar dados ao servidor XMLSocket, use o mtodo XMLSocket.send() e transmita um objeto ou string XML. O Flash Player converte o parmetro fornecido em um objeto String e envia o contedo ao servidor XMLSocket seguido de um byte zero (0):
xmlsock.send(xmlFormattedData);

O mtodo XMLSocket.send() no retorna um valor que indica se os dados foram transmitidos com xito. Se ocorrer um erro ao tentar enviar dados, um erro IOError ser emitido. Cada mensagem enviada ao servidor de soquete XML deve ser terminada por uma nova linha (caractere \n).

PROGRAMAO DO ACTIONSCRIPT 3.0 628


Rede e comunicao

Armazenamento de dados locais


Um objeto compartilhado, s vezes referenciado como um cookie Flash. um arquivo de dados que pode ser criado no computador pelos sites visitados. Objetos compartilhados so usados com maior freqncia para aprimorar sua experincia de navegao na Web, por exemplo, permitindo personalizar a aparncia de um site visitado com freqncia. Objetos compartilhados, por si s, no podem fazer nada em relao aos dados no computador. O mais importante que os objetos compartilhados nunca podem acessar ou lembrar seu endereo de email ou outras informaes pessoais, a no ser que voc fornea essas informaes voluntariamente. Novas ocorrncias de objetos compartilhados podem ser criadas usando os mtodos estticos SharedObject.getLocal() ou SharedObject.getRemote(). O mtodo getLocal() tenta carregar um objeto persistente compartilhado localmente que est disponvel apenas para o cliente atual, enquanto que o mtodo getRemote() tenta carregar um objeto compartilhado remoto que pode ser compartilhado entre vrios clientes por meio de um servidor, como o Flash Media Server. Se o objeto compartilhado local ou remoto no existir, os mtodos getLocal() e getRemote() criaro uma nova ocorrncia de SharedObject. O cdigo a seguir tenta carregar um objeto compartilhado local denominado test. Se esse objeto compartilhado no existir, um novo objeto compartilhado com esse nome ser criado.
var so:SharedObject = SharedObject.getLocal("test"); trace("SharedObject is " + so.size + " bytes");

Se um objeto compartilhado denominado teste no puder ser encontrado, um novo ser criado com um tamanho de 0 bytes. Se o objeto compartilhado existia anteriormente, seu tamanho atual (em bytes) ser retornado. possvel armazenar dados em um objeto compartilhado atribuindo valores ao objeto de dados, como mostrado no exemplo a seguir:
var so:SharedObject = SharedObject.getLocal("test"); so.data.now = new Date().time; trace(so.data.now); trace("SharedObject is " + so.size + " bytes");

Se um objeto compartilhado j existir com o nome test e o parmetro now, o valor existente ser substitudo. Voc pode usar a propriedade SharedObject.size para determinar se um objeto compartilhado j existe, conforme mostrado no exemplo a seguir:
var so:SharedObject = SharedObject.getLocal("test"); if (so.size == 0) { // Shared object doesn't exist. trace("created..."); so.data.now = new Date().time; } trace(so.data.now); trace("SharedObject is " + so.size + " bytes");

O cdigo anterior usa o parmetro size para determinar se a ocorrncia do objeto compartilhado com o nome especificado j existe. Se voc testar o cdigo a seguir, observar que cada vez que o cdigo executado, o objeto compartilhado ser criado novamente. Para que um objeto compartilhado seja salvo na unidade de disco rgido do usurio, voc deve chamar explicitamente o mtodo SharedObject.flush(), conforme mostrado no exemplo a seguir:

PROGRAMAO DO ACTIONSCRIPT 3.0 629


Rede e comunicao

var so:SharedObject = SharedObject.getLocal("test"); if (so.size == 0) { // Shared object doesn't exist. trace("created..."); so.data.now = new Date().time; } trace(so.data.now); trace("SharedObject is " + so.size + " bytes"); so.flush();

Ao usar o mtodo flush() para gravar objetos compartilhados em uma unidade de disco rgido do usurio, verifique atentamente se o usurio desativou explicitamente o armazenamento local usando o Gerenciador de configuraes do Flash Player (www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager07.html), conforme mostrado no exemplo a seguir:
var so:SharedObject = SharedObject.getLocal("test"); trace("Current SharedObject size is " + so.size + " bytes."); so.flush();

Os valores podem ser recuperados de um objeto compartilhado especificando o nome da propriedade data do objeto compartilhado. Por exemplo, se voc executar o cdigo a seguir, o Flash Player exibir o nmero de minutos em que a ocorrncia do SharedObject foi criada:
var so:SharedObject = SharedObject.getLocal("test"); if (so.size == 0) { // Shared object doesn't exist. trace("created..."); so.data.now = new Date().time; } var ageMS:Number = new Date().time - so.data.now; trace("SharedObject was created " + Number(ageMS / 1000 / 60).toPrecision(2) + " minutes ago"); trace("SharedObject is " + so.size + " bytes"); so.flush();

Na primeira vez que o cdigo anterior for executado, uma nova ocorrncia de SharedObject denominada test ser criada e ter um tamanho inicial de 0 bytes. Como o tamanho inicial 0 bytes, a instruo if avaliada como true e uma nova propriedade denominada now adicionada ao objeto compartilhado local. A idade do objeto compartilhado calculada subtraindo o valor da propriedade now da hora atual. A cada vez subseqente em que o cdigo anterior for executado, o tamanho do objeto compartilhado dever ser superior a 0, e o cdigo rastrear h quantos minutos o objeto compartilhado foi criado.

Exibio de contedo de um objeto compartilhado


Os valores so armazenados em objetos compartilhados dentro da propriedade data. Voc pode executar um loop em cada valor dentro de uma ocorrncia do objeto compartilhado usando um loop for..in, conforme mostrado no exemplo a seguir:
var so:SharedObject = SharedObject.getLocal("test"); so.data.hello = "world"; so.data.foo = "bar"; so.data.timezone = new Date().timezoneOffset; for (var i:String in so.data) { trace(i + ":\t" + so.data[i]); }

PROGRAMAO DO ACTIONSCRIPT 3.0 630


Rede e comunicao

Criao de um SharedObject seguro


Ao criar um SharedObject remoto ou local usando getLocal() ou getRemote(), h um parmetro opcional denominado secure que determina se o acesso a esse objeto compartilhado restrito para arquivos SWF que so entregues por uma conexo HTTPS. Se esse parmetro estiver definido como true e o arquivo SWF for entregue por HTTPS, o Flash Player criar um novo objeto compartilhado protegido ou obter uma referncia a um objeto compartilhado protegido existente. Esse objeto compartilhado protegido pode ser lido ou gravado apenas por arquivos SWF entregues por HTTPS que chamam SharedObject.getLocal() com o parmetro secure definido como true. Se esse parmetro estiver definido como false e o arquivo SWF for entregue por HTTPS, o Flash Player criar um novo objeto compartilhado ou obter uma referncia a um objeto compartilhado existente. Esse objeto compartilhado pode ser lido ou gravado por arquivos SWF entregues por conexes no-HTTPS. Se o arquivo SWF for entregue por uma conexo no-HTTPS e voc tentar definir esse parmetro como true, haver uma falha na criao de um novo objeto compartilhado (ou o acesso de um objeto compartilhado protegido criado anteriormente), um erro ser emitido e o objeto compartilhado ser definido como null. Se voc tentar executar o seguinte snippet em uma conexo no-HTTPS, o mtodo SharedObject.getLocal() emitir um erro:
try { var so:SharedObject = SharedObject.getLocal("contactManager", null, true); } catch (error:Error) { trace("Unable to create SharedObject."); }

Independentemente do valor desse parmetro, os objetos compartilhados criados sero levados em considerao na contagem da quantidade total de espao em disco permitida para um domnio.

Trabalho com arquivos de dados


Um objeto FileReference representa um arquivo de dados em um computador cliente ou servidor. Os mtodos da classe FileReference permitem que o seu aplicativo carregue e salve os arquivos de dados localmente, alm de transferir dados de arquivos para ou de servidores remotos. A classe FileReference agora oferece duas abordagens diferentes para carregamento, transferncia e gravao de arquivos de dados. A abordagem original usa o mtodo browse() para permitir ao usurio selecionar um arquivo, o mtodo upload() para transferir os dados do arquivo para um servidor remoto e o mtodo download() para recuperar os dados do servidor e salv-los em um arquivo local. As verses recentes de tempo de execuo do Flash Player e do AIR simplificam esse processo com os novos mtodos FileReference load() e save(), similares aos usados nas classes URLLoader e Loader. Essa seo discute as duas abordagens. Nota: O tempo de execuo do AIR fornece classes adicionais (no pacote flash.filesystem) para trabalho com os arquivos e com o sistema de arquivos local. As classes flash.filesystem oferecem mais recursos do que a classe FileReference, mas so apenas suportadas no tempo de execuo do AIR e no no Flash Player.

classe FileReference
Cada objeto FileReference refere-se a um arquivo de dados nico no computador local. As propriedades da classe FileReference contm informaes sobre as seguintes caractersticas do arquivo: tamanho, tipo, nome, extenso, criador, data de criao e data de modificao. Nota: H suporte para a propriedade creator apenas no Mac OS. Todas as outras plataformas retornam null.

PROGRAMAO DO ACTIONSCRIPT 3.0 631


Rede e comunicao

Nota: A propriedade extension suportada somente no tempo de execuo do AIR. Voc pode criar uma ocorrncia da classe FileReference de duas maneiras:
1 Use o operador new, conforme apresentado no cdigo a seguir:
import flash.net.FileReference; var fileRef:FileReference = new FileReference();

2 Chame o mtodo FileReferenceList.browse(), que abre uma caixa de dilogo que solicita ao usurio

selecionar um ou mais arquivos para carregar. Ele pode criar uma matriz de objetos FileReference se o usurio conseguir selecionar um ou mais arquivos. Aps criar um objeto FileReference, voc pode proceder da seguinte maneira:
1 Chame o mtodo FileReference.browse(), que abre uma caixa de dilogo que solicita ao usurio selecionar um

ou mais arquivos no sistema de arquivos local. Geralmente, isso feito antes de uma chamada subseqente para o mtodo FileReference.upload() para carregar o arquivo em um servidor remoto.
2 Chame o mtodo FileReference.download(). Uma caixa de dilogo ser aberta para possibilitar a seleo de um

local para gravao de um novo arquivo. Em seguida, os dados do servidor sero baixados e armazenados no novo arquivo.
3 Chame o mtodo FileReference.load(), que abre uma caixa de dilogo e solicita ao usurio selecionar um nico

arquivo do sistema de arquivos local e, em seguida, inicia o carregamento dos dados do arquivo selecionado.
4 Chame o mtodo FileReference.save(), que abre uma caixa de dilogo e solicita ao usurio selecionar um nico

arquivo do sistema de arquivos local e, em seguida, inicia o carregamento dos dados do arquivo selecionado. Nota: Voc pode executar apenas uma ao browse() ou download() de cada vez, porque apenas uma caixa de dilogo pode ser aberta em qualquer ponto. As propriedades do objeto FileReference, como name, size ou modificationDate no sero preenchidas at que ocorra um dos eventos a seguir:

O mtodo FileReference.browse() ou o mtodo FileReferenceList.browse() foi chamado e o usurio


selecionou um arquivo usando a caixa de dilogo.

O mtodo FileReference.download() foi chamado e o usurio especificou um novo local para os arquivos
usando a caixa de dilogo.

O mtodo FileReference.load() foi chamado e o usurio selecionou um arquivo usando a caixa de dilogo.
Nota: Ao fazer um download, apenas a propriedade FileReference.name preenchida antes do download ser concludo. Aps o download do arquivo, todas as propriedades esto disponveis. Enquanto as chamadas dos mtodos FileReference.browse(), FileReferenceList.browse(),
FileReference.download(), FileReference.load() ou FileReference.save() so executadas, a maioria dos

players continua a reproduzir o arquivo SWF. Para operaes de upload e download, um arquivo SWF pode acessar arquivos apenas em seu prprio domnio, incluindo todos os domnios especificados por um arquivo de poltica. Ser necessrio colocar um arquivo de poltica no servidor de arquivos, se o arquivo SWF que estiver iniciando o upload ou o download no for proveniente do mesmo domnio que o servidor de arquivos.

Carregamento de dados de arquivos


O mtodo FileReference.load() lhe permite carregar dados na memria a partir de um arquivo local. O seu cdigo deve chamar primeiro o mtodo FileReference.browse() para permitir que o usurio selecione um arquivo a ser carregado.

PROGRAMAO DO ACTIONSCRIPT 3.0 632


Rede e comunicao

O mtodo FileReference.load() retornado imediatamente aps a chamada. Em seguida, o objeto FileReference despacha eventos para chamar mtodos de ouvintes a cada etapa do processo de carregamento. O objeto FileReference pode despachar os eventos a seguir durante o processo de carregamento.

Event.OPEN: despachado quando uma operao de carregamento iniciada. ProgressEvent.PROGRESS: despachado periodicamente na medida em que os dados do arquivo so lidos. Event.COMPLETE: despachado quando a operao de carregamento concluda com sucesso. IOErrorEvent.IO_ERROR: despachado se o processo de carregamento falhar devido a um erro de entrada/sada

durante a abertura ou leitura de dados do arquivo. O exemplo a seguir mostra como solicitar ao usurio a seleo de um arquivo e como carregar os dados do arquivo na memria:
package { import import import import import import

flash.display.Sprite; flash.events.*; flash.net.FileFilter; flash.net.FileReference; flash.net.URLRequest; flash.utils.ByteArray;

public class FileReferenceExample1 extends Sprite { private var fileRef:FileReference; public function FileReferenceExample1() { fileRef = new FileReference(); fileRef.addEventListener(Event.SELECT, onFileSelected); fileRef.addEventListener(Event.CANCEL, onCancel); fileRef.addEventListener(IOErrorEvent.IO_ERROR, onIOError); fileRef.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError); var textTypeFilter:FileFilter = new FileFilter("Text Files (*.txt, *.rtf)", "*.txt;*.rtf"); fileRef.browse([textTypeFilter]); } public function onFileSelected(evt:Event):void { fileRef.addEventListener(ProgressEvent.PROGRESS, onProgress); fileRef.addEventListener(Event.COMPLETE, onComplete); fileRef.load(); } public function onProgress(evt:ProgressEvent):void { trace("Loaded " + evt.bytesLoaded + " of " + evt.bytesTotal + " bytes."); } public function onComplete(evt:Event):void { trace("File was successfully loaded."); trace(fileRef.data); }

PROGRAMAO DO ACTIONSCRIPT 3.0 633


Rede e comunicao

public function onCancel(evt:Event):void { trace("The browse request was canceled by the user."); } public function onSaveCancel(evt:Event):void { trace("The save request was canceled by the user."); } public function onIOError(evt:IOErrorEvent):void { trace("There was an IO Error."); } public function onSecurityError(evt:Event):void { trace("There was a security error."); } } }

O cdigo de exemplo cria o objeto FileReference primeiro e, em seguida, chama o mtodo FileReference.browse(), que abre uma caixa de dilogo que solicita ao usurio selecionar um arquivo. Quando um arquivo selecionado, o mtodo onFileSelected() chamado. Esses mtodos adicionam ouvintes para os eventos Event.PROGRESS e Event.COMPLETE e, em seguida, chamam o mtodo FileReference.load(). Os outros mtodos do manipulador do exemplo rastreiam strings de sada para o relatrio em execuo para a operao de carregamento. Quando a carga estiver completa, o contedo do arquivo carregado ser exibido por meio do mtodo trace().

Gravao de dados em arquivos locais


O mtodo FileReference.save() lhe permite salvar dados em um arquivo local. Ele iniciado ao abrir uma caixa de dilogo para permitir ao usurio digitar um novo nome para o arquivo e definir um local onde o arquivo ser salvo. Aps a seleo do nome do arquivo e do local, os dados so gravados no novo arquivo. Quando o arquivo salvo com sucesso, as propriedades do objeto FileReference so substitudas pelas do arquivo local. Nota: O cdigo dever chamar apenas o mtodo FileReference.save() em resposta ao evento de usurio, como um manipulador de eventos para um evento de clique de mouse ou de pressionamento de tecla. Caso contrrio, um erro ser gerado. O mtodo FileReference.save() retornado imediatamente aps a chamada. Em seguida, o objeto FileReference despacha eventos para chamar mtodos de ouvintes em cada etapa do processo de gravao do arquivo. O objeto FileReference despacha os eventos a seguir durante o processo de gravao do arquivo:

Event.SELECT: despachado quando o usurio especifica o local e o nome do arquivo para o novo arquivo a ser

salvo.
Event.CANCEL: despachado quando o usurio clica no boto Cancelar da caixa de dilogo. Event.OPEN: despachado quando uma operao de gravao iniciada. ProgressEvent.PROGRESS: despachado periodicamente na medida em que os dados so gravados no arquivo. Event.COMPLETE: despachado quando a operao de gravao concluda com sucesso. IOErrorEvent.IO_ERROR: despachado se o processo de carregamento falhar devido a um erro de entrada/sada

durante a abertura ou leitura de dados do arquivo.

PROGRAMAO DO ACTIONSCRIPT 3.0 634


Rede e comunicao

O tipo de objeto transmitido no parmetro de dados do mtodo FileReference.save() determinar como os dados sero gravados no arquivo:

Se for um valor String, eles sero salvos como um arquivo de texto usando a codificao UTF-8. Se for um objeto XML, eles sero gravados em um arquivo no formato XML com todas as formataes originais. Se for um objeto ByteArray, seu contedo ser gravado diretamente no arquivo, sem converso. Se for outro tipo de objeto, o mtodo FileReference.save() chamar o mtodo toString() para o objeto e salvar o
valor String resultante em um arquivo de texto UTF-8. Se o mtodo toString() do objeto no puder ser chamado, um erro ser gerado. Se o valor do parmetro de dados for null, um erro ser gerado. O cdigo a seguir tambm se aplica ao exemplo apresentado acima para o mtodo FileReference.load(). Aps a leitura dos dados do arquivo, esse exemplo solicita ao usurio um nome de arquivo e, em seguida, salva os dados em um novo arquivo:
package { import import import import import import

flash.display.Sprite; flash.events.*; flash.net.FileFilter; flash.net.FileReference; flash.net.URLRequest; flash.utils.ByteArray;

public class FileReferenceExample2 extends Sprite { private var fileRef:FileReference; public function FileReferenceExample2() { fileRef = new FileReference(); fileRef.addEventListener(Event.SELECT, onFileSelected); fileRef.addEventListener(Event.CANCEL, onCancel); fileRef.addEventListener(IOErrorEvent.IO_ERROR, onIOError); fileRef.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError); var textTypeFilter:FileFilter = new FileFilter("Text Files (*.txt, *.rtf)", "*.txt;*.rtf"); fileRef.browse([textTypeFilter]); } public function onFileSelected(evt:Event):void { fileRef.addEventListener(ProgressEvent.PROGRESS, onProgress); fileRef.addEventListener(Event.COMPLETE, onComplete); fileRef.load(); } public function onProgress(evt:ProgressEvent):void { trace("Loaded " + evt.bytesLoaded + " of " + evt.bytesTotal + " bytes."); } public function onCancel(evt:Event):void { trace("The browse request was canceled by the user."); } public function onComplete(evt:Event):void

PROGRAMAO DO ACTIONSCRIPT 3.0 635


Rede e comunicao

{ trace("File was successfully loaded."); fileRef.removeEventListener(Event.SELECT, onFileSelected); fileRef.removeEventListener(ProgressEvent.PROGRESS, onProgress); fileRef.removeEventListener(Event.COMPLETE, onComplete); fileRef.removeEventListener(Event.CANCEL, onCancel); saveFile(); } public function saveFile():void { fileRef.addEventListener(Event.SELECT, onSaveFileSelected); fileRef.save(fileRef.data,"NewFileName.txt"); } public function onSaveFileSelected(evt:Event):void { fileRef.addEventListener(ProgressEvent.PROGRESS, onSaveProgress); fileRef.addEventListener(Event.COMPLETE, onSaveComplete); fileRef.addEventListener(Event.CANCEL, onSaveCancel); } public function onSaveProgress(evt:ProgressEvent):void { trace("Saved " + evt.bytesLoaded + " of " + evt.bytesTotal + " bytes."); } public function onSaveComplete(evt:Event):void { trace("File saved."); fileRef.removeEventListener(Event.SELECT, onSaveFileSelected); fileRef.removeEventListener(ProgressEvent.PROGRESS, onSaveProgress); fileRef.removeEventListener(Event.COMPLETE, onSaveComplete); fileRef.removeEventListener(Event.CANCEL, onSaveCancel); } public function onSaveCancel(evt:Event):void { trace("The save request was canceled by the user."); } public function onIOError(evt:IOErrorEvent):void { trace("There was an IO Error."); } public function onSecurityError(evt:Event):void { trace("There was a security error."); } } }

Quando todos os dados do arquivo so carregados, o mtodo onComplete() chamado. O mtodo onComplete() removeu os ouvintes para os eventos de carregamento e, em seguida, chamou o mtodo saveFile(). O mtodo saveFile() chama o mtodo FileReference.save(), que abre uma nova caixa de dilogo que permite ao usurio digitar um novo nome para o arquivo, alm de seu local de gravao. Os mtodos restantes do ouvinte de eventos rastreiam o andamento do processo de gravao do arquivo at que seja concludo.

PROGRAMAO DO ACTIONSCRIPT 3.0 636


Rede e comunicao

Upload de arquivos em um servidor


Para carregar arquivos para um servidor, chame primeiro o mtodo browse() para permitir que um usurio selecione um ou mais arquivos. Em seguida, quando o mtodo FileReference.upload() for chamado, o arquivo selecionado ser transferido para o servidor. Se o usurio selecionou vrios arquivos usando o mtodo FileReferenceList.browse(), o Flash Player criar uma matriz dos arquivos selecionados chamada FileReferenceList.fileList. Em seguida, voc pode usar o mtodo FileReference.upload() para carregar cada arquivo individualmente. Nota: O uso do mtodo FileReference.browse() permite carregar apenas arquivos nicos. Para permitir que um usurio carregue vrios arquivos, voc deve usar o mtodo FileReferenceList.browse(). Por padro, a caixa de dilogo de seletor de arquivos do sistema permite que os usurios selecionem qualquer tipo de arquivo do computador local, embora os desenvolvedores possam especificar um ou mais filtros do tipo de arquivo personalizado usando a classe FileFilter e transmitindo uma matriz de ocorrncias de filtros de arquivo para o mtodo browse():
var imageTypes:FileFilter = new FileFilter("Images (*.jpg, *.jpeg, *.gif, *.png)", "*.jpg; *.jpeg; *.gif; *.png"); var textTypes:FileFilter = new FileFilter("Text Files (*.txt, *.rtf)", "*.txt; *.rtf"); var allTypes:Array = new Array(imageTypes, textTypes); var fileRef:FileReference = new FileReference(); fileRef.browse(allTypes);

Quando o usurio seleciona os arquivos e clica no boto Abrir no seletor de arquivos do sistema, o evento Event.SELECT despachado. Se o mtodo FileReference.browse() for usado para selecionar um arquivo a ser carregado, o seguinte cdigo ser necessrio para enviar o arquivo a um servidor da Web:
var fileRef:FileReference = new FileReference(); fileRef.addEventListener(Event.SELECT, selectHandler); fileRef.addEventListener(Event.COMPLETE, completeHandler); try { var success:Boolean = fileRef.browse(); } catch (error:Error) { trace("Unable to browse for files."); } function selectHandler(event:Event):void { var request:URLRequest = new URLRequest("http://www.[yourdomain].com/fileUploadScript.cfm") try { fileRef.upload(request); } catch (error:Error) { trace("Unable to upload file."); } } function completeHandler(event:Event):void { trace("uploaded"); }

PROGRAMAO DO ACTIONSCRIPT 3.0 637


Rede e comunicao

Voc pode enviar dados ao servidor com o mtodo FileReference.upload() usando as propriedades URLRequest.method e URLRequest.data para enviar variveis que usam os mtodos POST ou GET. Ao tentar carregar um arquivo usando o mtodo FileReference.upload(), qualquer um dos seguintes eventos pode ser despachado.

Event.OPEN: despachado quando uma operao de upload iniciada. ProgressEvent.PROGRESS: despachado periodicamente na medida em que os dados do arquivo so carregados. Event.COMPLETE: despachado quando a operao de upload concluda com sucesso. HTTPStatusEvent.HTTP_STATUS: despachado quando h uma falha no processo de upload devido a um erro HTTP.

HTTPStatusEvent.HTTP_RESPONSE_STATUS: despachado se uma chamada do mtodo upload() ou


uploadUnencoded() tentar acessar os dados via HTTP e o Adobe AIR puder detectar e retornar o cdigo de status para a solicitao.

SecurityErrorEvent.SECURITY_ERROR: despachado quando h uma falha na operao de upload devido a uma

violao de segurana.

DataEvent.UPLOAD_COMPLETE_DATA: despachado quando os dados so recebidos do servidor aps um


upload bem-sucedido.

IOErrorEvent.IO_ERROR: despachado se houver falha no processo de upload por causa de qualquer um dos

seguintes motivos:

Ocorreu um erro de entrada/sada enquanto o Flash Player estava lendo, gravando ou transmitindo o arquivo. O SWF tentou carregar um arquivo para um servidor que requer autenticao (como um nome de usurio e
senha). Durante o upload, o Flash Player no fornece um meio para os usurios inserirem senhas.

O parmetro url contm um protocolo invlido. O mtodo FileReference.upload() deve usar HTTP ou
HTTPS. O Flash Player no oferece suporte completo para servidores que requerem autenticao. Apenas arquivos SWF que esto em execuo em um navegador que usa o plug-in do navegador ou o controle Microsoft ActiveX podem fornecer uma caixa de dilogo para solicitar que o usurio digite um nome de usurio e senha para autenticao e apenas para downloads. Ocorre falha na transferncia de arquivos, para uploads que usam o plug-in ou o controle ActiveX, ou upload/download que usa player autnomo ou externo. Se voc criar um script de servidor no ColdFusion para aceitar um upload de arquivo do Flash Player, poder usar cdigo semelhante para o seguinte:
<cffile action="upload" filefield="Filedata" destination="#ExpandPath('./')#" nameconflict="OVERWRITE" />

Esse cdigo ColdFusion carrega o arquivo enviado pelo Flash Player e salva-o no mesmo diretrio que o modelo ColdFusion, substituindo qualquer arquivo com o mesmo nome. O cdigo anterior mostra a quantidade mnima bsica de cdigo necessria para aceitar um upload de arquivo. Esse script no deve ser usado em um ambiente de produo. Em condies ideais, voc deve adicionar validao de dados para garantir que os usurios carreguem apenas tipos de arquivo aceitos, como uma imagem, em vez de um script do lado do servidor potencialmente perigoso. O cdigo a seguir demonstra uploads de arquivo usando PHP e inclui validao de dados. O script limita o nmero de arquivos carregados no diretrio de upload at 10, garante que o arquivo tenha menos do que 200 KB e permite que apenas arquivos JPEG, GIF ou PNG sejam carregados e salvos no sistema de arquivos.

PROGRAMAO DO ACTIONSCRIPT 3.0 638


Rede e comunicao

<?php $MAXIMUM_FILESIZE = 1024 * 200; // 200KB $MAXIMUM_FILE_COUNT = 10; // keep maximum 10 files on server echo exif_imagetype($_FILES['Filedata']); if ($_FILES['Filedata']['size'] <= $MAXIMUM_FILESIZE) { move_uploaded_file($_FILES['Filedata']['tmp_name'], "./temporary/".$_FILES['Filedata']['name']); $type = exif_imagetype("./temporary/".$_FILES['Filedata']['name']); if ($type == 1 || $type == 2 || $type == 3) { rename("./temporary/".$_FILES['Filedata']['name'], "./images/".$_FILES['Filedata']['name']); } else { unlink("./temporary/".$_FILES['Filedata']['name']); } } $directory = opendir('./images/'); $files = array(); while ($file = readdir($directory)) { array_push($files, array('./images/'.$file, filectime('./images/'.$file))); } usort($files, sorter); if (count($files) > $MAXIMUM_FILE_COUNT) { $files_to_delete = array_splice($files, 0, count($files) - $MAXIMUM_FILE_COUNT); for ($i = 0; $i < count($files_to_delete); $i++) { unlink($files_to_delete[$i][0]); } } print_r($files); closedir($directory); function sorter($a, $b) { if ($a[1] == $b[1]) { return 0; } else { return ($a[1] < $b[1]) ? -1 : 1; } } ?>

Voc pode transmitir variveis adicionais para o script de upload usando o mtodo de solicitao POST ou oGET. Para enviar variveis POST adicionais ao script de upload, use o seguinte cdigo:

PROGRAMAO DO ACTIONSCRIPT 3.0 639


Rede e comunicao

var fileRef:FileReference = new FileReference(); fileRef.addEventListener(Event.SELECT, selectHandler); fileRef.addEventListener(Event.COMPLETE, completeHandler); fileRef.browse(); function selectHandler(event:Event):void { var params:URLVariables = new URLVariables(); params.date = new Date(); params.ssid = "94103-1394-2345"; var request:URLRequest = new URLRequest("http://www.yourdomain.com/FileReferenceUpload/fileupload.cfm"); request.method = URLRequestMethod.POST; request.data = params; fileRef.upload(request, "Custom1"); } function completeHandler(event:Event):void { trace("uploaded"); }

O exemplo anterior cria um novo objeto URLVariables que voc transmite para o script do lado do servidor remoto. Em verses anteriores do ActionScript, era possvel transmitir variveis para o script de upload de servidor transmitindo valores na string da consulta. O ActionScript 3.0 permite transmitir variveis para o script remoto usando um objeto URLRequest, o que permite que voc transmita dados usando o mtodo POST ou o GET. Isso, por sua vez, faz com que a transmisso de conjuntos de dados maiores seja mais fcil e mais limpa. Para especificar se a variveis so transmitidas usando o mtodo de solicitao GET ou POST, defina a propriedade URLRequest.method como URLRequestMethod.GET ou URLRequestMethod.POST, respectivamente. O ActionScript 3.0 tambm permite substituir o nome do campo do arquivo de upload Filedata padro fornecendo um segundo parmetro para o mtodo upload(), conforme demonstrado no exemplo anterior (que substituiu o valor padro Filedata por Custom1). Por padro, o Flash Player no tenta enviar um upload de teste, embora seja possvel substituir isso transmitindo um valor true como o terceiro parmetro para o mtodo upload(). A finalidade do upload de teste verificar se o upload do arquivo real ser bem-sucedido e se a autenticao do servidor, se necessria, ter xito. Nota: No momento, um upload de teste ocorre apenas em Flash Players com base no Windows. O script de servidor que manipula o upload do arquivo deve esperar uma solicitao POST HTTP com os seguintes elementos:

Content-Type com um valor de multipart/form-data. Content-Disposition com um atributo name definido como Filedata e um atributo filename definido como

o nome do arquivo original. possvel especificar um atributo name personalizado, transmitindo um valor para o parmetro uploadDataFieldName no mtodo FileReference.upload().

O contedo binrio do arquivo.


Esta uma solicitao POST HTTP de amostra:

PROGRAMAO DO ACTIONSCRIPT 3.0 640


Rede e comunicao

POST /handler.asp HTTP/1.1 Accept: text/* Content-Type: multipart/form-data; boundary=----------Ij5ae0ae0KM7GI3KM7ei4cH2ei4gL6 User-Agent: Shockwave Flash Host: www.mydomain.com Content-Length: 421 Connection: Keep-Alive Cache-Control: no-cache ------------Ij5ae0ae0KM7GI3KM7ei4cH2ei4gL6 Content-Disposition: form-data; name="Filename" sushi.jpg ------------Ij5ae0ae0KM7GI3KM7ei4cH2ei4gL6 Content-Disposition: form-data; name="Filedata"; filename="sushi.jpg" Content-Type: application/octet-stream Test File ------------Ij5ae0ae0KM7GI3KM7ei4cH2ei4gL6 Content-Disposition: form-data; name="Upload" Submit Query ------------Ij5ae0ae0KM7GI3KM7ei4cH2ei4gL6 (actual file data,,,)

A seguinte solicitao POST HTTP de amostra envia trs variveis POST: api_sig, api_key e auth_token e usa um valor de nome de campo de dados de upload personalizado de "photo":

PROGRAMAO DO ACTIONSCRIPT 3.0 641


Rede e comunicao

POST /handler.asp HTTP/1.1 Accept: text/* Content-Type: multipart/form-data; boundary=----------Ij5ae0ae0KM7GI3KM7ei4cH2ei4gL6 User-Agent: Shockwave Flash Host: www.mydomain.com Content-Length: 421 Connection: Keep-Alive Cache-Control: no-cache ------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7 Content-Disposition: form-data; name="Filename" sushi.jpg ------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7 Content-Disposition: form-data; name="api_sig" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7 Content-Disposition: form-data; name="api_key" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7 Content-Disposition: form-data; name="auth_token" XXXXXXXXXXXXXXXXXXXXXXX ------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7 Content-Disposition: form-data; name="photo"; filename="sushi.jpg" Content-Type: application/octet-stream (actual file data,,,) ------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7 Content-Disposition: form-data; name="Upload" Submit Query ------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7--

Download de arquivos de um servidor


possvel permitir que os usurios baixem arquivos de um servidor usando o mtodo FileReference.download() que utiliza dois parmetros: request e defaultFileName. O primeiro parmetro o objeto URLRequest que contm a URL do arquivo a ser baixado. O segundo parmetro opcional, ele permite especificar um nome de arquivo padro que aparece na caixa de dilogo do arquivo de download. Se voc omitir o segundo parmetro, defaultFileName, o nome de arquivo da URL especificada ser usado. O cdigo a seguir baixa um arquivo denominado index.xml do mesmo diretrio que o documento SWF:
var request:URLRequest = new URLRequest("index.xml"); var fileRef:FileReference = new FileReference(); fileRef.download(request);

Para definir o nome padro como currentnews.xml, em vez de index.xml, especifique o parmetro defaultFileName, conforme mostrado no seguinte snippet:
var request:URLRequest = new URLRequest("index.xml"); var fileToDownload:FileReference = new FileReference(); fileToDownload.download(request, "currentnews.xml");

PROGRAMAO DO ACTIONSCRIPT 3.0 642


Rede e comunicao

Renomear um arquivo poder ser muito til, se o nome de arquivo do servidor no for intuitivo ou gerado pelo servidor. Tambm bom especificar explicitamente o parmetro defaultFileName ao baixar um arquivo usando um script do lado do servidor, em vez de baixar o arquivo diretamente. Por exemplo, voc precisa especificar o parmetro defaultFileName, se tiver um script do lado do servidor que baixe arquivos especficos com base em variveis de URL transmitidas para ele. Caso contrrio, o nome padro do arquivo baixado ser o nome do script do lado do servidor. Os dados podem ser enviados ao servidor usando o mtodo download() anexando parmetros URL para anlise pelo script do servidor. O seguinte snippet do ActionScript 3.0 baixa um documento com base em quais parmetros so transmitidos para um script ColdFusion:
package { import import import import import

flash.display.Sprite; flash.net.FileReference; flash.net.URLRequest; flash.net.URLRequestMethod; flash.net.URLVariables;

public class DownloadFileExample extends Sprite { private var fileToDownload:FileReference; public function DownloadFileExample() { var request:URLRequest = new URLRequest(); request.url = "http://www.[yourdomain].com/downloadfile.cfm"; request.method = URLRequestMethod.GET; request.data = new URLVariables("id=2"); fileToDownload = new FileReference(); try { fileToDownload.download(request, "file2.txt"); } catch (error:Error) { trace("Unable to download file."); } } } }

O cdigo a seguir demonstra o script ColdFusion, download.cfm, que baixa um de dois arquivos do servidor, dependendo do valor de uma varivel de URL:
<cfparam name="URL.id" default="1" /> <cfswitch expression="#URL.id#"> <cfcase value="2"> <cfcontent type="text/plain" file="#ExpandPath('two.txt')#" deletefile="No" /> </cfcase> <cfdefaultcase> <cfcontent type="text/plain" file="#ExpandPath('one.txt')#" deletefile="No" /> </cfdefaultcase> </cfswitch>

PROGRAMAO DO ACTIONSCRIPT 3.0 643


Rede e comunicao

classe FileReferenceList
A classe FileReferenceList permite que o usurio selecione um ou mais arquivos a serem carregados para um script do lado do servidor. O upload de arquivo manipulado pelo mtodo FileReference.upload() que deve ser chamado em cada arquivo selecionado pelo usurio. O cdigo a seguir cria dois objetos FileFilter (imageFilter e textFilter) e transmite-os em uma matriz para o mtodo FileReferenceList.browse(). Isso faz com que a caixa de dilogo de arquivo do sistema operacional exiba dois filtros possveis para tipos de arquivos.
var imageFilter:FileFilter = new FileFilter("Image Files (*.jpg, *.jpeg, *.gif, *.png)", "*.jpg; *.jpeg; *.gif; *.png"); var textFilter:FileFilter = new FileFilter("Text Files (*.txt, *.rtf)", "*.txt; *.rtf"); var fileRefList:FileReferenceList = new FileReferenceList(); try { var success:Boolean = fileRefList.browse(new Array(imageFilter, textFilter)); } catch (error:Error) { trace("Unable to browse for files."); }

Permitir que o usurio selecione e carregue um ou mais arquivos usando a classe FileReferenceList o mesmo que usar FileReference.browse() para selecionar arquivos, embora o FileReferenceList permita selecionar mais de um arquivo. O upload de vrios arquivos requer que voc carregue cada um dos arquivos selecionados usando FileReference.upload(), conforme mostrado no cdigo a seguir:
var fileRefList:FileReferenceList = new FileReferenceList(); fileRefList.addEventListener(Event.SELECT, selectHandler); fileRefList.browse(); function selectHandler(event:Event):void { var request:URLRequest = new URLRequest("http://www.[yourdomain].com/fileUploadScript.cfm"); var file:FileReference; var files:FileReferenceList = FileReferenceList(event.target); var selectedFileArray:Array = files.fileList; for (var i:uint = 0; i < selectedFileArray.length; i++) { file = FileReference(selectedFileArray[i]); file.addEventListener(Event.COMPLETE, completeHandler); try { file.upload(request); } catch (error:Error) { trace("Unable to upload files."); } } } function completeHandler(event:Event):void { trace("uploaded"); }

PROGRAMAO DO ACTIONSCRIPT 3.0 644


Rede e comunicao

Como o evento Event.COMPLETE adicionado a cada objeto FileReference individual na matriz, o Flash Player chama o mtodo completeHandler() quando o upload de cada arquivo individual concludo.

Exemplo: Criao de um cliente Telnet


O exemplo de Telnet demonstra tcnicas de conexo com um servidor remoto e transmisso de dados usando a classe Socket. O exemplo demonstra as seguintes tcnicas:

Criao de um cliente Telnet personalizado usando a classe Socket Envio de texto ao servidor remoto usando um objeto ByteArray Tratamento de dados recebidos de um servidor remoto
Para obter os arquivos do aplicativo deste exemplo, consulte www.adobe.com/go/learn_programmingAS3samples_flash_br. Os arquivos do aplicativo Telnet podem ser encontrados na pasta Amostras/Telnet. O aplicativo consiste nos seguintes arquivos:
Arquivo TelnetSocket.mxml com/example/programmingas3/Telnet/Telnet.as Descrio O arquivo do aplicativo principal que consiste na interface do usurio MXML. Fornece a funcionalidade de cliente Telnet para o aplicativo, como conectar-se a um servidor remoto e enviar, receber e exibir dados.

Viso geral do aplicativo de soquete Telnet


O arquivo TelnetSocket.mxml principal responsvel por criar a interface do usurio (UI) para o aplicativo inteiro. Alm da UI, esse arquivo tambm define dois mtodos, login() e sendCommand(), para conectar o usurio ao servidor especificado. O cdigo a seguir lista o ActionScript no arquivo principal do aplicativo:
import com.example.programmingas3.socket.Telnet; private var telnetClient:Telnet; private function connect():void { telnetClient = new Telnet(serverName.text, int(portNumber.text), output); console.title = "Connecting to " + serverName.text + ":" + portNumber.text; console.enabled = true; } private function sendCommand():void { var ba:ByteArray = new ByteArray(); ba.writeMultiByte(command.text + "\n", "UTF-8"); telnetClient.writeBytesToSocket(ba); command.text = ""; }

PROGRAMAO DO ACTIONSCRIPT 3.0 645


Rede e comunicao

A primeira linha de cdigo importa a classe Telnet do pacote com.example.programmingas.socket personalizado. A segunda linha de cdigo declara uma ocorrncia da classe Telnet, telnetClient, que ser inicializada posteriormente pelo mtodo connect(). Em seguida, o mtodo connect() declarado e inicializa a varivel telnetClient declarada anteriormente. Esse mtodo transmite o nome do servidor telnet especificado pelo usurio, a porta do servidor telnet e uma referncia a um componente TextArea na lista de exibio que usada para exibir as respostas de texto do servidor de soquete. As duas linhas finais do mtodo connect() definem a propriedade title do Painel e ativam o componente Painel, o que permite que o usurio envie dados ao servidor remoto. O mtodo final no arquivo principal do aplicativo, sendCommand(), usado para enviar os comandos do usurio ao servidor remoto como um objeto ByteArray.

Viso geral da classe Telnet


A classe Telnet responsvel por conectar-se ao servidor Telnet remoto e enviar/receber dados. A classe Telnet declara as seguintes variveis particulares:
private private private private private var var var var var serverURL:String; portNumber:int; socket:Socket; ta:TextArea; state:int = 0;

A primeira varivel, serverURL, contm o endereo do servidor especificado pelo usurio ao qual conectar-se. A segunda varivel, portNumber, o nmero da porta na qual o servidor Telnet est em execuo atualmente. Por padro, o servio Telnet executado na porta 23. A terceira varivel, socket, uma ocorrncia de Socket que tenta conectar-se ao servidor definido pelas variveis serverURL e portNumber. A quarta varivel, ta, uma referncia a uma ocorrncia do componente TextArea no Palco. Esse componente usado para exibir respostas do servidor Telnet remoto ou qualquer mensagem de erro possvel. A varivel final, state, um valor numrico usado para determinar quais opes so suportadas pelo cliente Telnet. Conforme visto anteriormente, a funo do construtor da classe Telnet chamada pelo mtodo connect() no arquivo principal do aplicativo. O construtor Telnet utiliza trs parmetros: server, port e output. Os parmetros server e port especificam o nome do servidor e o nmero da porta em que o servidor Telnet est executando. O parmetro final, output, uma referncia a uma ocorrncia do componente TextArea no Palco onde a sada do servidor ser exibida aos usurios.

PROGRAMAO DO ACTIONSCRIPT 3.0 646


Rede e comunicao

public function Telnet(server:String, port:int, output:TextArea) { serverURL = server; portNumber = port; ta = output; socket = new Socket(); socket.addEventListener(Event.CONNECT, connectHandler); socket.addEventListener(Event.CLOSE, closeHandler); socket.addEventListener(ErrorEvent.ERROR, errorHandler); socket.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler); socket.addEventListener(ProgressEvent.SOCKET_DATA, dataHandler); Security.loadPolicyFile("http://" + serverURL + "/crossdomain.xml"); try { msg("Trying to connect to " + serverURL + ":" + portNumber + "\n"); socket.connect(serverURL, portNumber); } catch (error:Error) { msg(error.message + "\n"); socket.close(); } }

Gravao de dados em um soquete


Para gravar dados em uma conexo de soquete, chame qualquer um dos mtodos de gravao na classe Socket (como writeBoolean(), writeByte(), writeBytes() ou writeDouble()) e libere os dados no buffer de sada usando o mtodo flush(). No servidor Telnet, os dados so gravados na conexo de soquete usando o mtodo writeBytes() que utiliza a matriz de bytes como um parmetro e envia-a ao buffer de sada. O mtodo writeBytesToSocket() o seguinte:
public function writeBytesToSocket(ba:ByteArray):void { socket.writeBytes(ba); socket.flush(); }

Esse mtodo chamado pelo mtodo sendCommand() do arquivo principal do aplicativo.

Exibio de mensagens do servidor de soquete


Sempre que uma mensagem recebida do servidor de soquete, ou ocorre um evento, o mtodo msg() personalizado chamado. Esse mtodo anexa uma string ao TextArea no Palco e chama um mtodo setScroll() personalizado, o que faz com que o componente TextArea role para a parte mais inferior. O mtodo msg() o seguinte:
private function msg(value:String):void { ta.text += value; setScroll(); }

Se voc no rolou automaticamente o contedo do componente TextArea, os usurios precisaro arrastar manualmente as barras de rolagem na rea de texto para ver a resposta mais recente do servidor.

PROGRAMAO DO ACTIONSCRIPT 3.0 647


Rede e comunicao

Rolagem de um componente TextArea


O mtodo setScroll() contm uma nica linha do ActionScript que rola o contedo do componente TextArea verticalmente de forma que o usurio possa ver a ltima linha do texto retornado. O seguinte snippet mostra o mtodo setScroll():
public function setScroll():void { ta.verticalScrollPosition = ta.maxVerticalScrollPosition; }

Esse mtodo define a propriedade verticalScrollPosition, que o nmero da linha superior de caracteres exibida atualmente, e define-a como o valor da propriedade maxVerticalScrollPosition.

Exemplo: Upload e download de arquivos


O exemplo de FileIO demonstra tcnicas para baixar e carregar arquivos no Flash Player. Estas tcnicas so:

Download de arquivos em um computador do usurio Upload de arquivos de um computador do usurio para um servidor Cancelamento de um download em andamento Cancelamento de um upload em andamento
Para obter os arquivos do aplicativo desta amostra, consulte www.adobe.com/go/learn_programmingAS3samples_flash_br. Os arquivos do aplicativo FileIO esto localizados na pasta Amostras/FileIO. O aplicativo consiste nos seguintes arquivos:
Arquivo FileIO.fla ou FileIO.mxml com/example/programmingas3/fileio/FileDownload.as com/example/programmingas3/fileio/FileUpload.as Uma classe que inclui mtodos para baixar arquivos de um servidor. Uma classe que inclui mtodos para carregar arquivos em um servidor. Descrio O arquivo principal do aplicativo no Flash (FLA) ou no Flex (MXML).

Viso geral do aplicativo FileIO


O aplicativo FileIO contm a interface do usurio que permite que um usurio carregue ou baixe arquivos usando o Flash Player. O aplicativo define primeiro um par de componentes personalizados, FileUpload e FileDownload, que podem ser encontrados no pacote com.example.programmingas3.fileio. Depois que cada componente personalizado despacha seu evento contentComplete, o mtodo init() do componente chamado e transmite referncias a uma ocorrncia do componente ProgressBar e Button, o que permite que os usurios vejam o andamento do upload ou do download do arquivo ou cancelem a transferncia de arquivo em andamento. O cdigo relevante do arquivo FileIO.mxml o seguinte (observe que na verso do Flash, o arquivo FLA contm componentes colocados na palco, cujos nomes correspondem ao nomes dos componentes Flex descritos nesta etapa):
<example:FileUpload id="fileUpload" creationComplete="fileUpload.init(uploadProgress, cancelUpload);" /> <example:FileDownload id="fileDownload" creationComplete="fileDownload.init(downloadProgress, cancelDownload);" />

PROGRAMAO DO ACTIONSCRIPT 3.0 648


Rede e comunicao

O cdigo a seguir mostra o painel Upload File que contm uma barra de progresso e dois botes. O primeiro boto, startUpload, chama o mtodo FileUpload.startUpload(), que chama o mtodo FileReference.browse(). O trecho a seguir mostra o cdigo para o painel Upload File:
<mx:Panel title="Upload File" paddingTop="10" paddingBottom="10" paddingLeft="10" paddingRight="10"> <mx:ProgressBar id="uploadProgress" label="" mode="manual" /> <mx:ControlBar horizontalAlign="right"> <mx:Button id="startUpload" label="Upload..." click="fileUpload.startUpload();" /> <mx:Button id="cancelUpload" label="Cancel" click="fileUpload.cancelUpload();" enabled="false" /> </mx:ControlBar> </mx:Panel>

Esse cdigo coloca uma ocorrncia do componente ProgressBar e duas ocorrncias do boto do componente Button no Palco. Quando o usurio clica no boto Upload (startUpload), iniciada uma caixa de dilogo do sistema operacional que permite que o usurio selecione um arquivo a ser carregado em um servidor remoto. O outro boto, cancelUpload, por padro, est desativado, mas quando um usurio inicia um upload de arquivo, o boto ativado e permite que o usurio anule a transferncia do arquivo a qualquer momento. O cdigo para o painel Download File o seguinte:
<mx:Panel title="Download File" paddingTop="10" paddingBottom="10" paddingLeft="10" paddingRight="10"> <mx:ProgressBar id="downloadProgress" label="" mode="manual" /> <mx:ControlBar horizontalAlign="right"> <mx:Button id="startDownload" label="Download..." click="fileDownload.startDownload();" /> <mx:Button id="cancelDownload" label="Cancel" click="fileDownload.cancelDownload();" enabled="false" /> </mx:ControlBar> </mx:Panel>

Esse cdigo muito semelhante ao cdigo de upload de arquivo. Quando o usurio clica no boto Download, (startDownload), o mtodo FileDownload.startDownload() chamado, o que inicia o download do arquivo especificado na varivel FileDownload.DOWNLOAD_URL. Conforme o arquivo baixado, a barra de progresso atualizada, mostrando a porcentagem do arquivo que foi baixada. O usurio pode cancelar o download a qualquer momento clicando no boto cancelDownload que pra imediatamente o download do arquivo em andamento.

Download de arquivos de um servidor remoto


O download de arquivos de um servidor remoto manipulado pela classe flash.net.FileReference e a classe com.example.programmingas3.fileio.FileDownload personalizada. Quando o usurio clica no boto Download, o Flash Player comea a baixar o arquivo especificado na varivel DOWNLOAD_URL da classe FileDownload. A classe FileDownload comea definindo quatro variveis dentro do pacote com.example.programmingas3.fileio, conforme mostrado no cdigo a seguir:

PROGRAMAO DO ACTIONSCRIPT 3.0 649


Rede e comunicao

/** * Hard-code the URL of file to download to user's computer. */ private const DOWNLOAD_URL:String = "http://www.yourdomain.com/file_to_download.zip"; /** * Create a FileReference instance to handle the file download. */ private var fr:FileReference; /** * Define reference to the download ProgressBar component. */ private var pb:ProgressBar; /** * Define reference to the "Cancel" button which will immediately stop * the current download in progress. */ private var btn:Button;

A primeira varivel, DOWNLOAD_URL, contm o caminho para o arquivo, que baixado no computador do usurio quando ele clica no boto Download no arquivo principal do aplicativo. A segunda varivel, fr, um objeto FileReference que inicializado dentro do mtodo FileDownload.init() e manipula o download do arquivo remoto no computador do usurio. As duas ltimas variveis, pb e btn, contm referncias s ocorrncias dos componentes ProgressBar e Button no Palco, inicializadas pelo mtodo FileDownload.init().

Inicializao do componente FileDownload


O componente FileDownload inicializado chamando o mtodo init() na classe FileDownload. Esse mtodo utiliza dois parmetros, pb e btn, que so ocorrncias dos componentes ProgressBar e Button, respectivamente. O cdigo para o mtodo init() o seguinte:
/** * Set references to the components, and add listeners for the OPEN, * PROGRESS, and COMPLETE events. */ public function init(pb:ProgressBar, btn:Button):void { // Set up the references to the progress bar and cancel button, // which are passed from the calling script. this.pb = pb; this.btn = btn; fr = new FileReference(); fr.addEventListener(Event.OPEN, openHandler); fr.addEventListener(ProgressEvent.PROGRESS, progressHandler); fr.addEventListener(Event.COMPLETE, completeHandler); }

PROGRAMAO DO ACTIONSCRIPT 3.0 650


Rede e comunicao

Incio do download do arquivo


Quando o usurio clica na ocorrncia do componente Download Button no Palco, o mtodo startDownload() inicia o processo de download do arquivo. O seguinte trecho mostra o mtodo startDownload():
/** * Begin downloading the file specified in the DOWNLOAD_URL constant. */ public function startDownload():void { var request:URLRequest = new URLRequest(); request.url = DOWNLOAD_URL; fr.download(request); }

Primeiro, o mtodo startDownload() cria um novo objeto URLRequest e define a URL de destino como o valor especificado pela varivel DOWNLOAD_URL. Em seguida, o mtodo FileReference.download() chamado e o objeto URLRequest recm-criado transmitido como um parmetro. Isso faz com que o sistema operacional exiba uma caixa de dilogo no computador do usurio solicitando que ele selecione um local para salvar o documento solicitado. Depois que o usurio seleciona um local, o evento open (Event.OPEN) despachado e o mtodo openHandler() chamado. O mtodo openHandler() define o formato do texto para a propriedade label do componente ProgressBar e ativa o boto Cancelar, o que permite que o usurio pare imediatamente o download em andamento. O mtodo openHandler() o seguinte:
/** * When the OPEN event has dispatched, change the progress bar's label * and enable the "Cancel" button, which allows the user to abort the * download operation. */ private function openHandler(event:Event):void { pb.label = "DOWNLOADING %3%%"; btn.enabled = true; }

Monitoramento do andamento do download de um arquivo


Conforme um arquivo baixado de um servidor remoto para o computador do usurio, o evento progress (ProgressEvent.PROGRESS) despachado em intervalos regulares. Sempre que o evento progress despachado, o mtodo progressHandler() chamado e a ocorrncia do componente ProgressBar no Palco atualizada. O cdigo para o mtodo progressHandler() o seguinte:
/** * While the file is downloading, update the progress bar's status. */ private function progressHandler(event:ProgressEvent):void { pb.setProgress(event.bytesLoaded, event.bytesTotal); }

O evento de progresso contm duas propriedades, bytesLoaded e bytesTotal, que so usadas para atualizar o componente ProgressBar no Palco. Isso d ao usurio uma idia da quantidade de download do arquivo que j foi concluda e da quantidade que resta. O usurio pode anular a transferncia do arquivo a qualquer momento clicando no boto Cancelar abaixo da barra de progresso.

PROGRAMAO DO ACTIONSCRIPT 3.0 651


Rede e comunicao

Se o arquivo for baixado com xito, o evento complete (Event.COMPLETE) chamar o mtodo completeHandler(), que notificar o usurio que o download do arquivo foi concludo e desativar o boto Cancelar. O cdigo para o mtodo completeHandler() o seguinte:
/** * Once the download has completed, change the progress bar's label one * last time and disable the "Cancel" button since the download is * already completed. */ private function completeHandler(event:Event):void { pb.label = "DOWNLOAD COMPLETE"; btn.enabled = false; }

Cancelamento do download de um arquivo


Um usurio pode anular a transferncia de um arquivo e parar o download de qualquer byte adicional a qualquer momento, clicando no boto Cancelar no Palco. O trecho a seguir mostra o cdigo para cancelar um download:
/** * Cancel the current file download. */ public function cancelDownload():void { fr.cancel(); pb.label = "DOWNLOAD CANCELLED"; btn.enabled = false; }

Primeiro, o cdigo pra a transferncia do arquivo imediatamente, impedindo o download de qualquer dado adicional. Em seguida, a propriedade de rtulo da barra de progresso atualizada para notificar o usurio que o download foi cancelado com xito. Finalmente, o boto Cancelar desativado, o que evita que o usurio clique no boto novamente at que o download do arquivo seja tentado novamente.

Upload de arquivos em um servidor remoto


O processo de upload de arquivo muito semelhante ao processo de download de arquivo. A classe FileUpload declara as mesmas quatro variveis, conforme mostrado no cdigo a seguir:
private private private private const UPLOAD_URL:String = "http://www.yourdomain.com/your_upload_script.cfm"; var fr:FileReference; var pb:ProgressBar; var btn:Button;

Ao contrrio da varivel FileDownload.DOWNLOAD_URL, a varivel UPLOAD_URL contm a URL para o script do lado do servidor que carrega o arquivo do computador do usurio. As trs variveis restantes comportam-se da mesma maneira que suas contrapartes na classe FileDownload.

Inicializao do componente FileUpload


O componente FileUpload contm um mtodo init() que chamado do aplicativo principal. Esse mtodo utiliza dois parmetros, pb e btn, que so referncias a uma ocorrncia dos componentes ProgressBar e Button no Palco. Em seguida, o mtodo init() inicializa o objeto FileReference definido anteriormente na classe FileUpload. Finalmente, o mtodo atribui quatro ouvintes de eventos ao objeto FileReference. O cdigo para o mtodo init() o seguinte:

PROGRAMAO DO ACTIONSCRIPT 3.0 652


Rede e comunicao

public function init(pb:ProgressBar, btn:Button):void { this.pb = pb; this.btn = btn; fr = new FileReference(); fr.addEventListener(Event.SELECT, selectHandler); fr.addEventListener(Event.OPEN, openHandler); fr.addEventListener(ProgressEvent.PROGRESS, progressHandler); fr.addEventListener(Event.COMPLETE, completeHandler); }

Incio de um upload de arquivo


O upload do arquivo iniciado quando o usurio clica no boto Upload no Palco, o que chama o mtodo FileUpload.startUpload(). Esse mtodo chama o mtodo browse() da classe FileReference que faz com que o sistema operacional exiba uma caixa de dilogo do sistema solicitando que o usurio selecione um arquivo a ser carregado no servidor remoto. O trecho a seguir mostra o cdigo para o mtodo startUpload():
public function startUpload():void { fr.browse(); }

Depois que o usurio seleciona um arquivo para upload, o evento select (Event.SELECT) despachado, fazendo com que o mtodo selectHandler() seja chamado. O mtodo selectHandler() cria um novo objeto URLRequest e define a propriedade URLRequest.url como o valor da constante UPLOAD_URL definida anteriormente no cdigo. Finalmente, o objeto FileReference carrega o arquivo selecionado no script do lado do servidor especificado. O cdigo para o mtodo selectHandler() o seguinte:
private function selectHandler(event:Event):void { var request:URLRequest = new URLRequest(); request.url = UPLOAD_URL; fr.upload(request); }

O cdigo restante na classe FileUpload o mesmo que o cdigo definido na classe FileDownload. Se um usurio desejar encerrar o upload a qualquer momento, poder clicar no boto Cancelar, o que define o rtulo na barra de progresso e pra a transferncia do arquivo imediatamente. A barra de progresso atualizada sempre que o evento progress (ProgressEvent.PROGRESS) despachado. De modo semelhante, depois que o upload foi concludo, a barra de progresso atualizada para notificar o usurio que o arquivo foi carregado com xito. Em seguida, o boto Cancelar desativado at que o usurio inicie uma nova transferncia de arquivo.

653

Captulo 28: Ambiente do sistema cliente


Este captulo explica como interagir com o sistema do usurio. Ele mostra como determinar quais recursos so suportados e como criar arquivos SWF multilnges usando o IME (editor de mtodo de entrada) instalado do usurio, se disponvel. Ele tambm mostra usurios tpicos para domnios de aplicativo.

Noes bsicas do ambiente do sistema cliente


Introduo ao ambiente do sistema cliente
Conforme voc cria aplicativos ActionScript mais avanados, talvez ache necessrio conhecer detalhes e funes de acesso dos sistemas operacionais dos usurios. O ambiente do sistema cliente uma coleo de classes no pacote flash.system que permitem acessar funcionalidades em nvel do sistema, como as seguintes:

Determinar em qual aplicativo e domnio de segurana um SWF est em execuo. Determinar as capacidades da ocorrncia do Flash Player ou do Adobe AIR do usurio, como o tamanho da tela
(resoluo), e se determinadas funcionalidades esto disponveis, como udio mp3.

Criar sites multilnges usando o IME. Interagir com o continer do Flash Player (que pode ser uma pgina HTML ou um aplicativo de continer) ou com
um continer do AIR.

Salvar informaes na rea de transferncia do usurio.


O pacote flash.system tambm inclui as classes IMEConversionMode e SecurityPanel. Essas classes contm constantes estticas que so usadas com as classes IME e Security, respectivamente.

Tarefas comuns do ambiente do sistema cliente.


As seguintes tarefas comuns para trabalho com o sistema cliente usando o ActionScript so descritas neste captulo:

Determinar quanto de memria o aplicativo est usando. Copiar texto na rea de transferncia do usurio. Determinar capacidades do computador do usurio, como: Resoluo, cor, DPI e proporo de pixels da tela Sistema operacional Suporte para fluxo de udio, fluxo de vdeo e reproduo de mp3 Se o Flash Player instalado uma verso de depurador Trabalhar com domnios de aplicativo: Definir um domnio de aplicativo. Separar cdigo de arquivos SWF em domnios de aplicativo. Trabalhar com um IME no aplicativo: Determinar se o IME est instalado. Determinar e definir o modo de converso do IME.

PROGRAMAO DO ACTIONSCRIPT 3.0 654


Ambiente do sistema cliente

Desativar o IME para campos de texto. Detectar quando ocorre a converso do IME.

Conceitos e termos importantes


A lista de referncia a seguir contm termos importantes usados neste captulo:

Sistema operacional: O programa principal executado em um computador, dentro do qual todos os outros
aplicativos so executados, como o Microsoft Windows, o Mac OS X ou o Linux.

rea de transferncia: O continer do sistema operacional onde manter texto ou itens que so copiados ou
recortados e do qual os itens so colados nos aplicativos.

Domnio do aplicativo: Um mecanismo para separao de classes usadas em diferentes arquivos SWF, de forma que
os arquivos SWF incluam diferentes classes com o mesmo nome, as classes no so substitudas umas pelas outras.

IME (editor de mtodo de entrada): Um programa (ou ferramenta do sistema operacional) usado para inserir
caracteres ou smbolos complexos usando um teclado padro.

Sistema cliente: Em termos de programao, um cliente a parte de um aplicativo (ou todo o aplicativo) que
executado no computador individual e usada por um nico usurio. O sistema cliente o sistema operacional subjacente no computador do usurio.

Teste dos exemplos do captulo


Talvez voc queira testar algumas das listagens de cdigo de exemplo por si prprio, durante a leitura deste captulo. Todas as listagens de cdigo deste captulo incluem a chamada da funo trace() apropriada para anotar os valores que esto sendo testados. Para testar as listagens de cdigo deste captulo:
1 Crie um documento do Flash vazio. 2 Selecione um quadro-chave na linha de tempo. 3 Abra o painel Aes e copie a listagem de cdigo no painel Script. 4 Execute o programa usando Controlar > Testar filme.

Voc ver os resultados das funes trace() da listagem de cdigo no painel Sada. Algumas das ltimas listagens de cdigo so mais complexas e so escritas como uma classe. Para testar esses exemplos:
1 Crie um documento Flash vazio e salve-o no seu computador. 2 Crie e salve um novo arquivo do ActionScript no mesmo diretrio do documento Flash. O nome do arquivo deve

corresponder ao nome da classe na listagem de cdigo. Por exemplo, se a listagem de cdigo definir uma classe denominada SystemTest, use o nome SystemTest.as para salvar o arquivo ActionScript.
3 Copie a listagem de cdigo no arquivo do ActionScript e salve o arquivo. 4 No documento Flash, clique em uma parte em branco do Palco ou do espao de trabalho para ativar o Inspetor de

propriedades do documento.
5 No Inspetor de propriedades, no campo Classe do documento, digite o nome da classe ActionScript que voc

copiou do texto.
6 Execute o programa usando Controlar > Testar filme.

Voc ver os resultados do exemplo no painel Sada.

PROGRAMAO DO ACTIONSCRIPT 3.0 655


Ambiente do sistema cliente

Tcnicas para testar listagens de cdigo de exemplo so descritas em mais detalhes em Teste de listagens de cdigo de exemplo dos captulos na pgina 36.

Uso da classe System


A classe System contm mtodos e propriedades que permitem interagir com o sistema operacional do usurio e recuperar o uso da memria atual para o Flash Player ou o AIR. Os mtodos e propriedades da classe System tambm permitem ouvir eventos imeComposition, instruir o Flash Player ou o AIR a carregar arquivos de texto externos usando a pgina de cdigo atual do usurio ou carreg-las como Unicode ou definir o contedo da rea de transferncia do usurio.

Obteno de dados sobre o sistema do usurio em tempo de execuo


Com a verificao da propriedade System.totalMemory, possvel determinar a quantidade de memria (em bytes) que o Flash Player ou o AIR esto usando no momento. Essa propriedade permite monitorar o uso de memria do monitor e otimizar os aplicativos com base em como o nvel de memria alterado. Por exemplo, se um efeito visual especfico provocar um grande aumento no uso de memria, voc poder desejar considerar modificar ou eliminar o efeito completamente. A propriedade System.ime uma referncia ao IME (Editor de mtodo de entrada) instalado. Essa propriedade permite ouvir eventos imeComposition (flash.events.IMEEvent.IME_COMPOSITION) usando o mtodo addEventListener(). A terceira propriedade na classe System useCodePage. Quando useCodePage est definido como true, o Flash Player e o AIR usam a pgina de cdigo tradicional do sistema operacional que est executando o player para carregar arquivos de texto externos. Se definir essa propriedade como false, voc indicar ao Flash Player ou ao AIR para interpretar o arquivo externo como Unicode. Se voc definir System.useCodePage como true, lembre-se de que a pgina de cdigo tradicional do sistema operacional que executa o player deve incluir os caracteres usados no arquivo de texto externo para que o texto seja exibido. Por exemplo, se voc carregar um arquivo de texto externo com caracteres chineses, esses caracteres no podero ser exibidos em um sistema que use a pgina de cdigo do Windows em ingls, pois essa pgina de cdigo no inclui caracteres chineses. Para garantir que os usurios de todas as plataformas possam exibir arquivos de texto externos usados em arquivos SWF, voc deve codificar todos os arquivos de texto externos como Unicode e deixar System.useCodePage definido como false como padro. Dessa maneira, o Flash Player e o AIR interpretaro o texto como Unicode.

Salvamento de texto na rea de transferncia


A classe System inclui um mtodo chamado setClipboard() que permite que o Flash Player e o AIR definam o contedo da rea de transferncia do usurio com uma string especificada. Por motivos de segurana, no existe nenhum mtodo Security.getClipboard(), pois esse mtodo pode potencialmente permitir que sites malintencionados acessem os dados copiados recentemente na rea de transferncia do usurio. O cdigo a seguir ilustra como uma mensagem de erro pode ser copiada na rea de transferncia do usurio quando ocorre um erro de segurana. A mensagem de erro poder ser til se o usurio desejar relatar um bug potencial com um aplicativo.

PROGRAMAO DO ACTIONSCRIPT 3.0 656


Ambiente do sistema cliente

private function securityErrorHandler(event:SecurityErrorEvent):void { var errorString:String = "[" + event.type + "] " + event.text; trace(errorString); System.setClipboard(errorString); }

Uso da classe Capabilities


A classe Capabilities permite que os desenvolvedores determinem o ambiente no qual um arquivo SWF est em execuo. Com o uso de vrias propriedades da classe Capabilities, possvel descobrir a resoluo do sistema do usurio, se o sistema do usurio oferece suporte a software de acessibilidade, o idioma do sistema operacional do usurio, bem como a verso do Flash Player ou do AIR instalada atualmente. Verificando as propriedade da classe Capabilities, possvel personalizar o aplicativo para trabalhar melhor com o ambiente especfico do usurio. Por exemplo, verificando as propriedades Capabilities.screenResolutionX e Capabilities.screenResolutionY, possvel determinar a resoluo de vdeo que o sistema do usurio est usando e decidir qual tamanho de vdeo pode ser mais apropriado. Ou possvel verificar a propriedade Capabilities.hasMP3 para verificar se o sistema do usurio oferece suporte reproduo de mp3 antes de tentar carregar um arquivo mp3 externo. O cdigo a seguir usa uma expresso regular para analisar a verso do Flash Player que est sendo usada pelo cliente:
var versionString:String = Capabilities.version; var pattern:RegExp = /^(\w*) (\d*),(\d*),(\d*),(\d*)$/; var result:Object = pattern.exec(versionString); if (result != null) { trace("input: " + result.input); trace("platform: " + result[1]); trace("majorVersion: " + result[2]); trace("minorVersion: " + result[3]); trace("buildNumber: " + result[4]); trace("internalBuildNumber: " + result[5]); } else { trace("Unable to match RegExp."); }

Para enviar as capacidades do sistema do usurio para um script do lado do servidor de forma que as informaes sejam armazenadas em um banco de dados, possvel usar o seguinte cdigo ActionScript:
var url:String = "log_visitor.cfm"; var request:URLRequest = new URLRequest(url); request.method = URLRequestMethod.POST; request.data = new URLVariables(Capabilities.serverString); var loader:URLLoader = new URLLoader(request);

PROGRAMAO DO ACTIONSCRIPT 3.0 657


Ambiente do sistema cliente

Uso da classe ApplicationDomain


O objetivo da classe ApplicationDomain armazenar uma tabela de definies do ActionScript 3.0. Todo cdigo em um arquivo SWF definido para estar presente em um domnio de aplicativo. Domnios de aplicativo so usados para particionar classes que esto no mesmo domnio de segurana. Eles permitem que haja vrias definies da mesma classe e permitem que filhos reutilizem definies de pai. possvel usar domnios de aplicativo carregando um arquivo SWF externo escrito no ActionScript 3.0 usando a API da classe Loader. (Observe que no possvel usar domnios de aplicativo ao carregar uma imagem ou arquivo SWF no ActionScript 1.0 ou no ActionScript 2.0.) Todas as definies do ActionScript 3.0 contidas na classe carregada so armazenadas no domnio do aplicativo. Ao carregar o arquivo SWF, possvel especificar que o arquivo seja includo no mesmo domnio do aplicativo que o objeto Loader, definindo o parmetro applicationDomain do objeto LoaderContext como ApplicationDomain.currentDomain. Colocando o arquivo SWF carregado no mesmo domnio de aplicativo, possvel acessar suas classes diretamente. Isso pode ser til se voc estiver carregando um arquivo SWF que contm mdia incorporada que voc pode acessar por meio de seus nomes de classes associadas ou para acessar os mtodos do arquivo SWF carregado, conforme mostrado no exemplo a seguir:
package { import import import import import import

flash.display.Loader; flash.display.Sprite; flash.events.*; flash.net.URLRequest; flash.system.ApplicationDomain; flash.system.LoaderContext;

public class ApplicationDomainExample extends Sprite { private var ldr:Loader; public function ApplicationDomainExample() { ldr = new Loader(); var req:URLRequest = new URLRequest("Greeter.swf"); var ldrContext:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain); ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler); ldr.load(req, ldrContext); } private function completeHandler(event:Event):void { ApplicationDomain.currentDomain.getDefinition("Greeter"); var myGreeter:Greeter = Greeter(event.target.content); var message:String = myGreeter.welcome("Tommy"); trace(message); // Hello, Tommy } } }

Outras coisas que devem ser lembradas ao trabalhar com domnios de aplicativos incluem:

Todo cdigo em um arquivo SWF definido para estar presente em um domnio de aplicativo. O domnio atual
onde seu aplicativo principal executado. O domnio do sistema contm todos os domnios de aplicativos, incluindo o domnio atual, o que significa que ele contm todas as classes do Flash Player.

PROGRAMAO DO ACTIONSCRIPT 3.0 658


Ambiente do sistema cliente

Todos os domnios de aplicativos, exceto o domnio do sistema, tm um domnio-pai associado. O domnio-pai do


domnio do aplicativo principal o domnio do sistema. As classes carregadas s so definidas quando o pai ainda no as definiu. Voc no pode substituir uma definio de classe loaded por uma definio mais recente. O diagrama a seguir mostra um aplicativo que carrega contedo de vrios arquivos SWF dentro de um nico domnio, domain1.com. Dependendo do contedo carregado, diferentes domnios de aplicativos podem ser usados. O texto a seguir descreve a lgica usada para definir o domnio apropriado do aplicativo para cada arquivo SWF no aplicativo.
Palco Domnio de segurana: domain1.com

Domnio de aplicativo 1 application1.swf mx.core.Application module1.swf Loader Aplicativo Loader Loader Loader Mdulo Mdulo Domnio de aplicativo 3 module3.swf
C B

Domnio de aplicativo 2 mx.core.Application application2.swf Mdulo

A. Uso A B. Uso B C. Uso C

O arquivo do aplicativo principal application1.swf. Ele contm objetos Loader que carregam contedo de outros arquivos SWF. Neste cenrio, o domnio atual o Domnio do aplicativo 1. Uso A, uso B e uso C ilustram diferentes tcnicas para configurar o domnio do aplicativo apropriado para cada arquivo SWF em um aplicativo.
Uso A Particionar o arquivo SWF filho criando um filho do domnio do sistema. No diagrama, o Domnio do aplicativo 2 criado como um filho do domnio do sistema. O arquivo application2.swf carregado no Domnio do aplicativo 2 e suas definies de classe so portanto particionadas a partir das classes definidas no application1.swf.

Um dos usos dessa tcnica fazer com que um aplicativo antigo carregue uma verso mais nova do mesmo aplicativo sem conflito. No h conflito porque, embora os mesmos nomes de classes sejam usados, elas so particionadas em diferentes domnios de aplicativo. O cdigo a seguir cria um domnio de aplicativo que filho do domnio do sistema, e comea carregando um SWF usando esse domnio de aplicativo:
var appDomainA:ApplicationDomain = new ApplicationDomain(); var contextA:LoaderContext = new LoaderContext(false, appDomainA); var loaderA:Loader = new Loader(); loaderA.load(new URLRequest("application2.swf"), contextA);

Uso B: Adicionar novas definies de classes s definies de classes atuais. O domnio do aplicativo do module1.swf

definido como o domnio atual (Domnio do aplicativo 1). Isso permite adicionar o conjunto atual de aplicativos das

PROGRAMAO DO ACTIONSCRIPT 3.0 659


Ambiente do sistema cliente

definies de classes com novas definies de classes. Isso pode ser usado para uma biblioteca de tempo de execuo do aplicativo principal. O SWF carregado tratado como uma RSL (biblioteca remota compartilhada). Use essa tcnica para carregar RSLs por meio de um pr-carregador antes do incio do aplicativo. O cdigo a seguir carrega um SWF definindo seu domnio de aplicativo para o domnio atual:
var appDomainB:ApplicationDomain = ApplicationDomain.currentDomain; var contextB:LoaderContext = new LoaderContext(false, appDomainB); var loaderB:Loader = new Loader(); loaderB.load(new URLRequest("module1.swf"), contextB);

Uso C: Usar as definies de classes pai criando um novo domnio filho do domnio atual. O domnio do aplicativo do module3.swf filho do domnio atual, e o filho usa as verses de todas as classes do pai. Um uso dessa tcnica pode ser um mdulo de um RIA (aplicativo de Internet avanado) de vrias telas, carregado como um filho do aplicativo principal que usa os tipos do aplicativo principal. Se voc puder garantir que todas as classes so sempre atualizadas para serem compatveis com verses anteriores e que o aplicativo carregado sempre mais novo do que as coisas que ele carrega, os filhos usaro as verses do pai. Ter um novo domnio de aplicativo tambm permite descarregar todas as definies de classe para coleta de lixo, se voc puder garantir que referncias ao SWF filho no continuam a existir.

Essa tcnica permite que mdulos carregados compartilhem os objetos singleton do carregador e membros da classe esttica. O cdigo a seguir cria um novo domnio filho do domnio atual e inicia o carregamento de um SWF usando aquele domnio de aplicativo:
var appDomainC:ApplicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain); var contextC:LoaderContext = new LoaderContext(false, appDomainC); var loaderC:Loader = new Loader(); loaderC.load(new URLRequest("module3.swf"), contextC);

Uso da classe IME


A classe IME permite manipular o IME do sistema operacional de dentro do Flash Player ou do Adobe AIR. Usando o ActionScript, possvel determinar o seguinte:

Se um IME est instalado no computador do usurio (Capabilities.hasIME) Se o IME est ativado ou desativado no computador do usurio (IME.enabled) O modo de converso do IME atual est usando (IME.conversionMode)
possvel associar um campo de texto de entrada a um contexto de IME especfico. Ao alternar entre campos de texto, tambm possvel alternar o IME entre Hiragana (japons), nmeros de largura total, nmeros de meia largura, entrada direta e assim por diante. Um IME permite que os usurios digitem caracteres de texto no-ASCII em idiomas com vrios bytes, como chins, japons e coreano. Para obter mais informaes sobre como trabalhar com IMEs, consulte a documentao do sistema operacional no qual voc est desenvolvendo o aplicativo. Para obter recursos adicionais, consulte os seguintes sites:

http://www.msdn.microsoft.com/goglobal/ http://developer.apple.com/documentation/

PROGRAMAO DO ACTIONSCRIPT 3.0 660


Ambiente do sistema cliente

http://www.java.sun.com/
Nota: Se o IME no estiver ativo no computador do usurio, chamadas para mtodos ou propriedades do IME, que no sejam Capabilities.hasIME, falharo. Depois de ativar manualmente o IME, chamadas subseqentes do ActionScript para mtodos e propriedades do IME funcionaro conforme o esperado. Por exemplo, se estiver usando um IME japons, voc dever ativ-lo para poder chamar qualquer mtodo ou propriedade do IME.

Verificao da instalao e ativao do IME


Antes de chamar qualquer um dos mtodos ou propriedades do IME, voc deve sempre verificar se o computador do usurio tem um IME instalado e ativado. O cdigo a seguir ilustra como verificar se o usurio tem um IME instalado e ativo antes de chamar qualquer mtodo:
if (Capabilities.hasIME) { if (IME.enabled) { trace("IME is installed and enabled."); } else { trace("IME is installed but not enabled. Please enable your IME and try again."); } } else { trace("IME is not installed. Please install an IME and try again."); }

O cdigo anterior primeiro verifica se o usurio tem um IME instalado usando a propriedade Capabilities.hasIME. Se essa propriedade estiver definida como true, o cdigo verificar se o IME do usurio est ativado usando a propriedade IME.enabled.

Determinao de qual modo de converso do IME est ativado


Ao criar aplicativos multilnge, talvez seja necessrio determinar qual modo de converso est ativo para o usurio. O cdigo a seguir demonstra como verificar se o usurio tem um IME instalado e, nesse caso, qual modo de converso do IME est ativo no momento:

PROGRAMAO DO ACTIONSCRIPT 3.0 661


Ambiente do sistema cliente

if (Capabilities.hasIME) { switch (IME.conversionMode) { case IMEConversionMode.ALPHANUMERIC_FULL: tf.text = "Current conversion mode is alphanumeric (full-width)."; break; case IMEConversionMode.ALPHANUMERIC_HALF: tf.text = "Current conversion mode is alphanumeric (half-width)."; break; case IMEConversionMode.CHINESE: tf.text = "Current conversion mode is Chinese."; break; case IMEConversionMode.JAPANESE_HIRAGANA: tf.text = "Current conversion mode is Japananese Hiragana."; break; case IMEConversionMode.JAPANESE_KATAKANA_FULL: tf.text = "Current conversion mode is Japanese Katakana (full-width)."; break; case IMEConversionMode.JAPANESE_KATAKANA_HALF: tf.text = "Current conversion mode is Japanese Katakana (half-width)."; break; case IMEConversionMode.KOREAN: tf.text = "Current conversion mode is Korean."; break; default: tf.text = "Current conversion mode is " + IME.conversionMode + "."; break; } } else { tf.text = "Please install an IME and try again."; }

O cdigo anterior primeiro verifica se o usurio tem um IME instalado. Em seguida, ele verifica qual modo de converso o IME atual est usando, comparando a propriedade IME.conversionMode com cada uma das constantes na classe IMEConversionMode.

Configurao do modo de converso do IME


Quando voc altera o modo de converso do IME do usurio, necessrio verificar se o cdigo est inserido em um bloco try..catch, porque a configurao de um modo de converso usando a propriedade conversionMode poder emitir um erro, se o IME no puder definir o modo de converso. O cdigo a seguir demonstra como usar um bloco try..catch ao definir a propriedade IME.conversionMode:

PROGRAMAO DO ACTIONSCRIPT 3.0 662


Ambiente do sistema cliente

var statusText:TextField = new TextField; statusText.autoSize = TextFieldAutoSize.LEFT; addChild(statusText); if (Capabilities.hasIME) { try { IME.enabled = true; IME.conversionMode = IMEConversionMode.KOREAN; statusText.text = "Conversion mode is " + IME.conversionMode + "."; } catch (error:Error) { statusText.text = "Unable to set conversion mode.\n" + error.message; } }

O cdigo anterior primeiro cria um campo de texto que usado para exibir uma mensagem de status para o usurio. Em seguida, se o IME estiver instalado, o cdigo ativar o IME e definir o modo de converso como coreano. Se o computador do usurio no tiver um IME coreano instalado, o Flash Player ou o AIR emitir um erro que ser capturado pelo bloco try..catch. O bloco try..catch exibe a mensagem de erro no campo de texto criado anteriormente.

Desativao do IME para determinados campos de texto


Em alguns casos, convm desativar o IME do usurio enquanto ele digita caracteres. Por exemplo, se voc tiver um campo de texto que aceita apenas entrada numrica, conveniente ativar o IME e diminuir a velocidade da entrada de dados. O exemplo a seguir demonstra como possvel ouvir os eventos FocusEvent.FOCUS_IN e FocusEvent.FOCUS_OUT e desativar o IME do usurio de maneira correspondente:

PROGRAMAO DO ACTIONSCRIPT 3.0 663


Ambiente do sistema cliente

var phoneTxt:TextField = new TextField(); var nameTxt:TextField = new TextField(); phoneTxt.type = TextFieldType.INPUT; phoneTxt.addEventListener(FocusEvent.FOCUS_IN, focusInHandler); phoneTxt.addEventListener(FocusEvent.FOCUS_OUT, focusOutHandler); phoneTxt.restrict = "0-9"; phoneTxt.width = 100; phoneTxt.height = 18; phoneTxt.background = true; phoneTxt.border = true; addChild(phoneTxt); nameField.type = TextFieldType.INPUT; nameField.x = 120; nameField.width = 100; nameField.height = 18; nameField.background = true; nameField.border = true; addChild(nameField); function focusInHandler(event:FocusEvent):void { if (Capabilities.hasIME) { IME.enabled = false; } } function focusOutHandler(event:FocusEvent):void { if (Capabilities.hasIME) { IME.enabled = true; } }

Esse exemplo cria dois campos de texto de entrada, phoneTxt e nameTxt e, em seguida, adiciona dois ouvintes de eventos ao campo de texto phoneTxt. Quando o usurio define o foco para o campo de texto phoneTxtum evento FocusEvent.FOCUS_IN despachado e o IME desativado. Quando o campo de texto phoneTxt perde o foco, o evento FocusEvent.FOCUS_OUT despachado para reativar o IME.

Ouvir eventos de composio do IME


Os eventos de composio do IME so despachados quando uma string de composio est sendo definida. Por exemplo, se o usurio tiver o IME habilitado e ativo e digitar uma string em japons, o evento IMEEvent.IME_COMPOSITION despachar assim que o usurio selecionar a string da composio. Para ouvir o evento IMEEvent.IME_COMPOSITION, necessrio adicionar um ouvinte de eventos propriedade esttica ime na classe System (flash.system.System.ime.addEventListener(...)), conforme mostrado no exemplo a seguir:

PROGRAMAO DO ACTIONSCRIPT 3.0 664


Ambiente do sistema cliente

var inputTxt:TextField; var outputTxt:TextField; inputTxt = new TextField(); inputTxt.type = TextFieldType.INPUT; inputTxt.width = 200; inputTxt.height = 18; inputTxt.border = true; inputTxt.background = true; addChild(inputTxt); outputTxt = new TextField(); outputTxt.autoSize = TextFieldAutoSize.LEFT; outputTxt.y = 20; addChild(outputTxt); if (Capabilities.hasIME) { IME.enabled = true; try { IME.conversionMode = IMEConversionMode.JAPANESE_HIRAGANA; } catch (error:Error) { outputTxt.text = "Unable to change IME."; } System.ime.addEventListener(IMEEvent.IME_COMPOSITION, imeCompositionHandler); } else { outputTxt.text = "Please install IME and try again."; } function imeCompositionHandler(event:IMEEvent):void { outputTxt.text = "you typed: " + event.text; }

O cdigo anterior cria dois campos de texto e os adiciona lista de exibio. O primeiro campo de texto, inputTxt, um campo de texto de entrada que permite que o usurio digite texto japons. O segundo campo de texto, outputTxt, um campo de texto dinmico que exibe mensagens de erro para o usurio ou ecoa a string em japons que o usurio digita no campo de texto inputTxt.

Exemplo: Deteco de capacidades do sistema


O exemplo CapabilitiesExplorer demonstra como usar a classe flash.system.Capabilities para determinar quais recursos so suportados pela verso do usurio do Flash Player ou do AIR. Este exemplo ensina as seguintes tcnicas:

Deteco das capacidades suportadas pela verso do usurio do Flash Player ou do AIR usando a classe Capabilities. Uso da classe ExternalInterface para detectar quais configuraes de navegador so suportadas pelo navegador do
usurio.

PROGRAMAO DO ACTIONSCRIPT 3.0 665


Ambiente do sistema cliente

Para obter os arquivos de aplicativo deste exemplo, consulte www.adobe.com/go/learn_programmingAS3samples_flash_br. Os arquivos do aplicativo CapabilitiesExplorer podem ser encontrados na pasta Amostras/CapabilitiesExplorer. O aplicativo consiste nos seguintes arquivos:
Arquivo CapabilitiesExplorer.fla ou CapabilitiesExplorer.mxml com/example/programmingas3/capabilities/CapabilitiesGrabber.as A classe que fornece a funcionalidade principal do aplicativo, incluindo a adio das capacidades do sistema a uma matriz, a classificao dos itens e o uso da classe ExternalInterface para recuperar as capacidades do navegador. Um continer HTML que contm o JavaScript necessrio para se comunicar com a API externa. Descrio O arquivo principal do aplicativo no Flash (FLA) ou no Flex (MXML).

capabilities.html

Viso geral de CapabilitiesExplorer


O arquivo CapabilitiesExplorer.mxml responsvel por configurar a interface do usurio para o aplicativo CapabilitiesExplorer. As capacidades da verso do usurio do Flash Player ou do AIR sero exibidas dentro de uma ocorrncia do componente DataGrid no Palco. As capacidades do navegador tambm sero exibidas se eles estiverem executando o aplicativo em um continer HTML e se a API externa estiver disponvel. Quando o evento creationComplete do arquivo do aplicativo principal despachado, o mtodo initApp() chamado. O mtodo initApp() chama o mtodo getCapabilities() de dentro da classe com.example.programmingas3.capabilities.CapabilitiesGrabber. O cdigo do mtodo initApp() o seguinte:
private function initApp():void { var dp:Array = CapabilitiesGrabber.getCapabilities(); capabilitiesGrid.dataProvider = dp; }

O mtodo CapabilitiesGrabber.getCapabilities() retorna uma matriz classificada do AIR ou do Flash Player e as capacidades do navegador que, em seguida, so definidas para a propriedade dataProvider da ocorrncia do componente DataGrid capabilitiesGrid no Palco.

Viso geral da classe CapabilitiesGrabber


O mtodo esttico getCapabilities() da classe CapabilitiesGrabber adiciona cada propriedade da classe flash.system.Capabilities a uma matriz (capDP). Em seguida, ele chama o mtodo esttico getBrowserObjects() na classe CapabilitiesGrabber. O mtodo getBrowserObjects() usa a API externa para loop sobre o objeto navigator do navegador que contm as capacidades do navegador. O mtodo getCapabilities() o seguinte:

PROGRAMAO DO ACTIONSCRIPT 3.0 666


Ambiente do sistema cliente

public static function getCapabilities():Array { var capDP:Array = new Array(); capDP.push({name:"Capabilities.avHardwareDisable", value:Capabilities.avHardwareDisable}); capDP.push({name:"Capabilities.hasAccessibility", value:Capabilities.hasAccessibility}); capDP.push({name:"Capabilities.hasAudio", value:Capabilities.hasAudio}); ... capDP.push({name:"Capabilities.version", value:Capabilities.version}); var navArr:Array = CapabilitiesGrabber.getBrowserObjects(); if (navArr.length > 0) { capDP = capDP.concat(navArr); } capDP.sortOn("name", Array.CASEINSENSITIVE); return capDP; }

O mtodo getBrowserObjects() retorna uma matriz de cada uma das propriedades do objeto navigator no navegador. Se essa matriz tiver um comprimento de um ou mais itens, a matriz de capacidades do navegador (navArr) ser anexada matriz de capacidades do Flash Player (capDP) e a matriz inteira ser classificada alfabeticamente. Finalmente, a matriz classificada ser retornada ao arquivo do aplicativo principal que, em seguida preencher a grade de dados. O cdigo para o mtodo getBrowserObjects() o seguinte:
private static function getBrowserObjects():Array { var itemArr:Array = new Array(); var itemVars:URLVariables; if (ExternalInterface.available) { try { var tempStr:String = ExternalInterface.call("JS_getBrowserObjects"); itemVars = new URLVariables(tempStr); for (var i:String in itemVars) { itemArr.push({name:i, value:itemVars[i]}); } } catch (error:SecurityError) { // ignore } } return itemArr; }

Se a API externa estiver disponvel no ambiente atual do usurio, o Flash Player chamar o mtodo JS_getBrowserObjects() do JavaScript que executa loop sobre o objeto navigator do navegador e retorna uma string de valores codificados de URL ao ActionScript. Em seguida, essa string convertida em um objeto URLVariables (itemVars) e adicionada matriz itemArr que retornada para o script de chamada.

Comunicao com o JavaScript


A parte final da criao do aplicativo CapabilitiesExplorer a escrita do JavaScript necessrio para executar loop sobre cada um dos itens no objeto navigator do navegador e anexar um par de nome e valor a uma matriz temporria. O cdigo do mtodo JS_getBrowserObjects() do JavaScript no container.html o seguinte:

PROGRAMAO DO ACTIONSCRIPT 3.0 667


Ambiente do sistema cliente

<script language="JavaScript"> function JS_getBrowserObjects() { // Create an array to hold each of the browser's items. var tempArr = new Array(); // Loop over each item in the browser's navigator object. for (var name in navigator) { var value = navigator[name]; // If the current value is a string or Boolean object, add it to the // array, otherwise ignore the item. switch (typeof(value)) { case "string": case "boolean": // Create a temporary string which will be added to the array. // Make sure that we URL-encode the values using JavaScript's // escape() function. var tempStr = "navigator." + name + "=" + escape(value); // Push the URL-encoded name/value pair onto the array. tempArr.push(tempStr); break; } } // Loop over each item in the browser's screen object. for (var name in screen) { var value = screen[name]; // If the current value is a number, add it to the array, otherwise // ignore the item. switch (typeof(value)) { case "number": var tempStr = "screen." + name + "=" + escape(value); tempArr.push(tempStr); break; } } // Return the array as a URL-encoded string of name-value pairs. return tempArr.join("&"); } </script>

O cdigo comea com a criao de uma matriz temporria que conter todos os pares de nome e valor no objeto navigator. Em seguida, um loop executado no objeto navigator usando um loopfor..in e o tipo de dados do valor atual avaliado para filtrar valores indesejados. Neste aplicativo, estamos interessados somente nos valores de string ou booleanos e outros tipos de dados (como funes ou matrizes) so ignorados. Cada valor de string ou booleano no objeto navigator anexado matriz tempArr. Em seguida, executado um loop no objeto da tela do navegador usando um loop for..in e cada valor numrico adicionado matriz tempArr. Finalmente, a matriz temporria convertida em uma string usando o mtodo Array.join(). A matriz usa um e comercial (&) como um delimitador, o que permite que o ActionScript analise os dados facilmente usando a classe URLVariables.

668

Captulo 29: Copiar e colar


Use as classes na API da rea de transferncia para copiar informaes para e da rea de transferncia do sistema. Os formatos de dados que podem ser transferidos para ou a partir de um aplicativo em execuo no Adobe AIR e no Adobe Flash Player incluem:

Bitmaps (somente AIR) Arquivos (somente AIR) Texto Texto formatado em HTML Dados em RTF Strings de URLs (somente AIR) Objetos serializados Referncias de objetos (vlido somente dentro do aplicativo originador)

Noes bsicas de copiar e colar


A API de copiar e colar contm as seguintes classes:
Pacote flash.desktop Classes

Clipboard ClipboardFormats ClipboardTransferMode

A propriedade esttica Clipboard.generalClipboard representa a rea de transferncia do sistema operacional. A classe Clipboard fornece mtodos para a leitura e a gravao de dados em objetos da rea de transferncia. As classes HTMLLoader (no AIR) e TextField implementam um comportamento padro para os atalhos comuns do teclado para copiar e colar. Para implementar o comportamento do atalho de copiar e colar para componentes personalizados, voc pode ouvir esses pressionamentos de tecla diretamente. Voc tambm pode usar comandos de menu nativos juntamente com equivalentes de teclas para responder aos pressionamentos de tecla indiretamente. Diferentes representaes das mesmas informaes podem ser disponibilizadas em um nico objeto Clipboard para aumentar a capacidade de interpretao e utilizao de dados por outros aplicativos. Por exemplo, uma imagem pode ser includa como dados de imagem, um objeto Bitmap serializado ou um arquivo. A renderizao dos dados em um determinado formato pode ser adiada para que o formato no seja gerado antes da leitura de seus respectivos dados.

Leitura e gravao na rea de transferncia do sistema


Para ler a rea de transferncia do sistema operacional, chame o mtodo getData() do objeto Clipboard.generalClipbooard, transmitindo o nome do formato a ser lido:

PROGRAMAO DO ACTIONSCRIPT 3.0 669


Copiar e colar

import flash.desktop.Clipboard; import flash.desktop.ClipboardFormats; if(Clipboard.generalClipboard.hasFormat(ClipboardFormats.TEXT_FORMAT)){ var text:String = Clipboard.generalClipboard.getData(ClipboardFormats.TEXT_FORMAT); }

Nota: O contedo em execuo no Flash Player ou em uma caixa de proteo "no aplicativo" no AIR pode chamar apenas o mtodo getData() em um manipulador de eventos para um evento paste. Somente cdigos em execuo na caixa de proteo do aplicativo AIR podem chamar o mtodo getData() fora de um manipulador de eventos paste. Para gravar na rea de transferncia, adicione os dados ao objeto Clipboard.generalClipboard em um ou mais formatos. Qualquer dado existente no mesmo formato sobregravado automaticamente. No entanto, limpar a rea de transferncia do sistema antes de fazer a gravao de novos dados uma boa prtica para garantir que os dados no relacionados em quaisquer outros formatos tambm sejam excludos.
import flash.desktop.Clipboard; import flash.desktop.ClipboardFormats; var textToCopy:String = "Copy to clipboard."; Clipboard.generalClipboard.clear(); Clipboard.generalClipboard.setData(ClipboardFormats.TEXT_FORMAT, textToCopy, false);

Nota: O contedo em execuo no Flash Player ou em uma caixa de proteo "no aplicao" no AIR pode chamar apenas o mtodo setData() em um manipulador de eventos para um evento de usurio, como eventos de teclado ou do mouse, alm de um evento copy ou cut. Somente cdigos em execuo na caixa de proteo do aplicativo AIR podem chamar o mtodo setData() fora de um manipulador de eventos de usurios.

Formatos de dados da rea de transferncia


Os formatos da rea de transferncia descrevem os dados inseridos em um objeto Clipboard. O Flash Player ou o AIR traduz automaticamente os formatos de dados padro entre tipos de dados do ActionScript e formatos da rea de transferncia do sistema. Alm disso, os objetos do aplicativo podem ser transferidos internamente em ou entre aplicativos com base no ActionScript, usando formatos definidos pelo aplicativo. Um objeto Clipboard pode conter representaes das mesmas informaes em diferentes formatos. Por exemplo, um objeto Clipboard representando um Sprite poderia incluir um formato de referncia para ser usado no mesmo aplicativo, um formato serializado para ser usado por outro aplicativo em execuo no Flash Player ou no AIR, um formato bitmap para ser usado por um editor de imagens e um formato de lista de arquivo, talvez com renderizao adiada para codificar um arquivo PNG, para copiar ou arrastar uma representao do Sprite para o sistema de arquivos.

Formatos de dados padro


As constantes que definem os nomes de formato padro so fornecidas na classe ClipboardFormats:
Constante TEXT_FORMAT HTML_FORMAT RICH_TEXT_FORMAT Descrio Dados em formato de texto so traduzidos para e a partir da classe String do ActionScript. Texto com marcao HTML. Dados em RTF so traduzidos para e a partir da classe ByteArray do ActionScript. O markup RTF no interpretado ou traduzido.

PROGRAMAO DO ACTIONSCRIPT 3.0 670


Copiar e colar

Constante BITMAP_FORMAT FILE_LIST_FORMAT

Descrio (somente AIR) Dados em formato bitmap so traduzidos para e da classe BitmapData do ActionScript. (somente AIR) Dados em formato de lista de arquivo so traduzidos para e de uma matriz de objetos File do ActionScript. (somente AIR) Dados em formato de URL so traduzidos para e a partir da classe String do ActionScript.

URL_FORMAT

Formatos de dados personalizados


Voc pode usar formatos personalizados definidos por aplicativo para transferir objetos como referncias ou cpias serializadas. As referncias so vlidas apenas dentro do aplicativo em execuo no AIR ou no Flash Player. Objetos serializados podem ser transferidos entre aplicativos em execuo no AIR ou no Flash Player, mas podem ser usados somente com objetos que permanecem vlidos quando serializados e desserializados. Objetos podem normalmente ser serializados se suas propriedades forem tipos simples ou objetos serializveis. Para adicionar um objeto serializado a um objeto Clipboard, defina o parmetro serializvel como true ao chamar o mtodo Clipboard.setData(). O nome do formato pode ser um dos formatos padro ou uma string arbitrria definida pelo seu aplicativo.

Modos de transferncia
Quando um objeto gravado na rea de transferncia usando um formato de dados personalizado, os dados do objeto podem ser lidos da rea de transferncia como referncia ou uma cpia serializada do objeto original. O AIR define quatro modos de transferncia que determinam se os objetos so transferidos como referncias ou como cpias serializadas:
Modo de transferncia ClipboardTransferModes.ORIGINAL_ONLY Descrio Apenas uma referncia retornada. Se nenhuma referncia estiver disponvel, um valor null ser retornado. Uma referncia retornada, se disponvel. Caso contrrio, uma cpia serializada retornada. Apenas uma cpia serializada retornada. Se nenhuma cpia serializada estiver disponvel, um valor null ser retornado. Uma cpia serializada retornada, se disponvel. Caso contrrio, uma referncia retornada.

ClipboardTransferModes.ORIGINAL_PREFFERED

ClipboardTransferModes.CLONE_ONLY

ClipboardTransferModes.CLONE_PREFFERED

Leitura e gravao de formatos de dados personalizados


Voc pode usar qualquer string que no comece com os prefixos reservados air: ou flash: para o parmetro de formato ao gravar um objeto na rea de transferncia. Use a mesma seqncia de caracteres do formato para ler o objeto. Os exemplos a seguir ilustram como ler e gravar objetos na rea de transferncia:
public function createClipboardObject(object:Object):Clipboard{ var transfer:Clipboard = Clipboard.generalClipboard; transfer.setData("object", object, true); }

Para extrair um objeto serializado do objeto da rea de transferncia (aps uma operao de soltar ou colar), use o mesmo nome de formato e os modos de transferncia cloneOnly ou clonePreferred.
var transfer:Object = clipboard.getData("object", ClipboardTransferMode.CLONE_ONLY);

PROGRAMAO DO ACTIONSCRIPT 3.0 671


Copiar e colar

Uma referncia sempre adicionada ao objeto Clipboard. Para extrair a referncia do objeto da rea de transferncia (aps uma operao de soltar ou colar), em vez da cpia serializada, use os modos de transferncia originalOnly ou originalPreferred:
var transferredObject:Object = clipboard.getData("object", ClipboardTransferMode.ORIGINAL_ONLY);

As referncias so vlidas apenas se o objeto Clipboard se originar do aplicativo atual em execuo no AIR ou no Flash Player. Use o modo de transferncia originalPreferred para acessar a referncia quando ela estiver disponvel e o clone serializado quando a referncia no estiver disponvel.

Renderizao adiada
Se criar um formato de dados for computacionalmente caro, voc poder usar a renderizao adiada fornecendo uma funo que fornea os dados sob demanda. A funo chamada apenas se um receptor da operao de soltar ou colar solicitar dados no formato adiado. A funo de renderizao adicionada a um objeto Clipboard usando o mtodo setDataHandler(). A funo deve retornar os dados no formato apropriado. Por exemplo, se voc chamou setDataHandler(ClipboardFormat.TEXT_FORMAT, writeText), a funo writeText() dever retornar uma string. Se um formato de dados do mesmo tipo for adicionado a um objeto Clipboard com o mtodo setData(), esses dados tero precedncia sobre a verso adiada (a funo de renderizao nunca chamada). A funo de renderizao pode ou no ser chamada novamente se os mesmos dados da rea de transferncia forem acessados novamente. Nota: No Mac OS X, a renderizao adiada funciona somente com formatos de dados personalizados. No caso de formatos de dados padro, a funo de renderizao chamada imediatamente.

Colagem de texto usando uma funo de renderizao adiada


O exemplo a seguir ilustra como implementar uma funo de renderizao adiada. Quando um usurio pressiona o boto Copiar, o aplicativo limpa a rea de transferncia para garantir que nenhum dado de operaes anteriores seja mantido. Em seguida, o mtodo setDataHandler() define a funo renderData() como renderizador da rea de transferncia. Quando um usurio seleciona o comando Colar no menu de contexto do campo de texto de destino, o aplicativo acessa a rea de transferncia e define o texto de destino. Como o formato de dados de texto na rea de transferncia foi definido com uma funo em vez de uma string, a rea de transferncia chama a funo renderData(). A funo renderData() retorna o texto no texto de origem, que ento atribudo ao texto de destino. Observe que se voc editar o texto de origem antes de pressionar o boto Colar, a edio ser refletida no texto colado, mesmo quando a edio ocorrer aps o acionamento do boto Copiar. Isso porque a funo de renderizao no copia o texto de origem at que o boto Colar seja pressionado. (Ao usar a renderizao adiada em um aplicativo real, talvez voc queira armazenar ou proteger os dados de origem de alguma maneira para evitar esse problema.)

PROGRAMAO DO ACTIONSCRIPT 3.0 672


Copiar e colar

package { import flash.desktop.Clipboard; import flash.desktop.ClipboardFormats; import flash.desktop.ClipboardTransferMode; import flash.display.Sprite; import flash.text.TextField; import flash.text.TextFormat; import flash.text.TextFieldType; import flash.events.MouseEvent; import flash.events.Event; public class DeferredRenderingExample extends Sprite { private var sourceTextField:TextField; private var destination:TextField; private var copyText:TextField; public function DeferredRenderingExample():void { sourceTextField = createTextField(10, 10, 380, 90); sourceTextField.text = "Neque porro quisquam est qui dolorem " + "ipsum quia dolor sit amet, consectetur, adipisci velit."; copyText = createTextField(10, 110, 35, 20); copyText.htmlText = "<a href='#'>Copy</a>"; copyText.addEventListener(MouseEvent.CLICK, onCopy); destination = createTextField(10, 145, 380, 90); destination.addEventListener(Event.PASTE, onPaste); } private function createTextField(x:Number, y:Number, width:Number, height:Number):TextField { var newTxt:TextField = new TextField(); newTxt.x = x; newTxt.y = y; newTxt.height = height; newTxt.width = width; newTxt.border = true; newTxt.multiline = true; newTxt.wordWrap = true; newTxt.type = TextFieldType.INPUT; addChild(newTxt); return newTxt; } public function onCopy(event:MouseEvent):void { Clipboard.generalClipboard.clear(); Clipboard.generalClipboard.setDataHandler(ClipboardFormats.TEXT_FORMAT, renderData); } public function onPaste(event:Event):void {

PROGRAMAO DO ACTIONSCRIPT 3.0 673


Copiar e colar

sourceTextField.text = Clipboard.generalClipboard.getData(ClipboardFormats.TEXT_FORMAT).toString; } public function renderData():String { trace("Rendering data"); var sourceStr:String = sourceTextField.text; if (sourceTextField.selectionEndIndex > sourceTextField.selectionBeginIndex) { return sourceStr.substring(sourceTextField.selectionBeginIndex, sourceTextField.selectionEndIndex); } else { return sourceStr; } } } }

674

Captulo 30: Impresso


O Adobe Flash Player e o Adobe AIR podem se comunicar com a interface de impresso de um sistema operacional para que voc possa enviar pginas para o spooler de impresso. Cada pgina enviada pelo Flash Player ou pelo AIR ao spooler pode ter contedo visvel, dinmico ou fora da tela para o usurio, inclusive valores de banco de dados e texto dinmico. Alm disso, o Flash Player e o AIR definem as propriedades da classe flash.printing.PrintJob com base nas configuraes da impressora do usurio, para que voc possa formatar as pginas adequadamente. Este captulo detalha estratgias para uso dos mtodos e propriedades da classe flash.printing.PrintJob para criar um trabalho de impresso, ler as configuraes de impresso de um usurio e fazer ajustes em um trabalho de impresso com base no comentrio do Flash Player ou do AIR e no sistema operacional do usurio.

Noes bsicas de impresso


Introduo impresso
No ActionScript 3.0, voc usa a classe PrintJob para criar instantneos de contedo de exibio a serem convertidos em uma representao de tinta e papel em uma impresso. Sob alguns aspectos, configurar o contedo para impresso o mesmo que configur-lo para exibio na tela: voc posiciona e classifica os elementos por tamanho para criar o layout desejado. No entanto a impresso tem algumas particularidades que a tornam diferente do layout da tela. Por exemplo, a resoluo usada por impressoras diferente da resoluo de monitores de computador. O contedo de uma tela do computador dinmico e pode ser alterado, enquanto o contedo impresso basicamente esttico, e no planejamento da impresso, as restries de tamanho da pgina fixa e a possibilidade de impresso de vrias pginas precisam ser consideradas. Embora essas diferenas paream bvias, importante t-las em mente ao configurar a impresso com o ActionScript. Como a impresso exata depende de uma combinao dos valores especificados por voc e das caractersticas da impressora do usurio, a classe PrintJob inclui propriedades que permitem determinar as caractersticas importantes da impressora do usurio que precisam ser consideradas.

Tarefas comuns de impresso


As seguintes tarefas comuns de impresso so descritas neste captulo:

Iniciar um trabalho de impresso Incluir pginas em um trabalho de impresso Determinar se o usurio cancela um trabalho de impresso Especificar se a renderizao de vetores ou de bitmaps deve ser usada Configurar tamanho de pgina, escala e orientao Especificar a rea de contedo imprimvel Converter o tamanho da tela para o tamanho da pgina Imprimir trabalhos de impresso de vrias pginas

PROGRAMAO DO ACTIONSCRIPT 3.0 675


Impresso

Conceitos e termos importantes


A lista de referncia a seguir contm termos importantes usados neste captulo:

Spooler: Uma parte do sistema operacional ou do software do driver da impressora que mantm o controle das
pginas que esto aguardando para serem impressas e as envia para a impressora quando ela estiver disponvel.

Orientao da pgina: A rotao do contedo impresso em relao ao papel, horizontal (paisagem) ou vertical
(retrato).

Trabalho de impresso: A pgina ou o conjunto de pginas que compem uma nica impresso.

Teste dos exemplos do captulo


Talvez voc queira testar as listagens de cdigo de exemplo durante a leitura deste captulo. Muitas das listagens de cdigo do captulo so pequenas partes de cdigo, em vez de exemplos completos de trabalhos de impresso ou de cdigo que verifica valores. O teste dos exemplos envolve a criao de elementos a serem impressos e o uso de listagens de cdigo com esses elementos. Os dois exemplos finais do captulo so exemplos de impresso completos. Eles incluem o cdigo que define o contedo a ser impresso, bem como a execuo de tarefas de impresso. Para testar as listagens de cdigo de exemplo:
1 Crie um novo documento Flash. 2 Selecione o quadro-chave no Quadro 1 da Linha de tempo e abra o painel Aes. 3 Copie a listagem de cdigo no painel Script. 4 No menu principal, selecione Controle > Testar filme para criar o arquivo SWF e testar o exemplo.

Impresso de uma pgina


Voc usa uma ocorrncia da classe PrintJob para manipular a impresso. Para imprimir uma pgina bsica por meio do Flash Player ou do AIR, use estas quatro instrues em seqncia:

new PrintJob(): Cria uma nova ocorrncia do trabalho de impresso com o nome especificado. PrintJob.start(): Inicia o processo de impresso do sistema operacional chamando a caixa de dilogo de

impresso do usurio e preenche as propriedades somente leitura do trabalho de impresso.


PrintJob.addPage(): Contm os detalhes sobre o contedo do trabalho de impresso, incluindo o objeto Sprite

(e todos os filhos que ele contm), o tamanho da rea de impresso e se a impressora deve imprimir a imagem como um vetor ou um bitmap. Voc pode usar chamadas sucessivas para addPage() para imprimir vrias entidades grficas em vrias pginas.

PrintJob.send(): Envia as pginas para a impressora do sistema operacional.

Portanto, por exemplo, um script de trabalho de impresso muito simples pode ser semelhante ao seguinte (incluindo as instrues package, import e class de compilao):

PROGRAMAO DO ACTIONSCRIPT 3.0 676


Impresso

package { import flash.printing.PrintJob; import flash.display.Sprite; public class BasicPrintExample extends Sprite { var myPrintJob:PrintJob = new PrintJob(); var mySprite:Sprite = new Sprite(); public function BasicPrintExample() { myPrintJob.start(); myPrintJob.addPage(mySprite); myPrintJob.send(); } } }

Nota: Esse exemplo tem o objetivo de mostrar os elementos bsicos de um script de trabalho de impresso e no contm nenhuma manipulao de erros. Para criar um script que responda corretamente a um usurio que cancela um trabalho de impresso, consulte Trabalho com excees e retornos na pgina 676. Para limpar as propriedades de um objeto PrintJob por qualquer motivo, defina a varivel PrintJob como null (como em myPrintJob = null).

Tarefas do Flash Player e do AIR e impresso do sistema


Como o Flash Player e o AIR despacham pginas para a interface de impresso do sistema operacional, voc deve compreender o escopo das tarefas gerenciadas pelo Flash Player e pelo AIR e as tarefas gerenciadas pela prpria interface de impresso do sistema operacional. O Flash Player e o AIR podem iniciar um trabalho de impresso, ler algumas configuraes de pgina de uma impressora, transmitir o contedo de um trabalho de impresso para o sistema operacional e verificar se o usurio ou o sistema cancelou um trabalho de impresso. Outros processos, como exibir caixas de dilogo especficas impressora, cancelar um trabalho de impresso no spool ou relatar o status da impressora, so todos manipulados pelo sistema operacional. O Flash Player e o AIR podem responder se h um problema ao iniciar ou formatar um trabalho de impresso, mas podem relatar apenas determinadas propriedades ou condies da interface de impresso do sistema operacional. Como desenvolvedor, seu cdigo deve ter a capacidade de responder a essas propriedades ou condies.

Trabalho com excees e retornos


Voc deve verificar se o mtodo PrintJob.start() retorna true antes de executar as chamadas addPage() e send(), no caso do usurio ter cancelado o trabalho de impresso. Uma maneira simples de verificar se esses mtodos foram cancelados antes de continuar, delimit-los em uma instruo if, da seguinte maneira:
if (myPrintJob.start()) { // addPage() and send() statements here }

Se PrintJob.start() for true, indicando que o usurio selecionou Print (ou o Flash Player ou o AIR iniciou um comando Print), os mtodos addPage() e send() podero ser chamados.

PROGRAMAO DO ACTIONSCRIPT 3.0 677


Impresso

Alm disso, para ajudar a gerenciar o processo de impresso, o Flash Player e o AIR emitem excees para o mtodo PrintJob.addPage() para que seja possvel capturar os erros e fornecer informaes e opes ao usurio. Se um mtodo PrintJob.addPage() falhar, voc tambm poder chamar outra funo ou parar o trabalho de impresso atual. Voc captura essas excees incorporando as chamadas de addPage() dentro de uma instruo try..catch, conforme no exemplo a seguir. No exemplo, [params] um alocador de espao para os parmetros que especificam o contedo real a ser impresso:
if (myPrintJob.start()) { try { myPrintJob.addPage([params]); } catch (error:Error) { // Handle error, } myPrintJob.send(); }

Depois que o trabalho de impresso iniciado, voc pode adicionar o contedo usando PrintJob.addPage() e verificar se isso gera uma exceo (por exemplo, se o usurio cancelou o trabalho de impresso). Se uma exceo for gerada, voc poder adicionar lgica instruo catch para fornecer informaes e opes ao usurio (ou ao Flash Player ou ao AIR) ou poder parar o trabalho de impresso atual. Se voc adicionar a pgina com xito, poder continuar a enviar as pginas impressora usando PrintJob.send(). Se o Flash Player ou o AIR encontrar um problema quando enviar o trabalho de impresso para a impressora (por exemplo, se a impressora estiver offline), voc tambm poder capturar essa exceo e apresentar informaes ou mais opes (por exemplo, exibir o texto da mensagem ou fornecer um alerta dentro de uma animao) ao usurio (ou ao Flash Player ou ao AIR). Por exemplo, voc pode atribuir texto novo a um campo de texto em uma instruo if..else, conforme mostrado no cdigo a seguir:
if (myPrintJob.start()) { try { myPrintJob.addPage([params]); } catch (error:Error) { // Handle error. } myPrintJob.send(); } else { myAlert.text = "Print job canceled"; }

Para obter um exemplo que funciona, consulte Exemplo: Escala, corte e resposta na pgina 682.

PROGRAMAO DO ACTIONSCRIPT 3.0 678


Impresso

Trabalho com propriedades da pgina


Quando o usurio clica em OK na caixa de dilogo Imprimir e PrintJob.start() retorna true, ele pode acessar as propriedades definidas pelas configuraes da impressora. Isso inclui a largura e a altura do papel (pageHeight e pageWidth), e a orientao do contedo no papel. Como essas so configuraes da impressora, no controladas pelo Flash Player ou pelo AIR, voc no pode alter-las. Mas pode us-las para alinhar o contedo enviado para a impressora para que corresponda s configuraes atuais. Para obter mais informaes, consulte Configurao de tamanho, escala e orientao na pgina 679.

Configurao da renderizao de vetores ou de bitmaps


Voc pode definir manualmente o trabalho de impresso para armazenar no spool cada pgina, como grficos de vetor ou uma imagem de bitmap. Em alguns casos, a impresso de vetores produz um arquivo de spool menor e uma imagem melhor do que a impresso de bitmap. No entanto, se o contedo incluir uma imagem de bitmap, e voc desejar preservar qualquer transparncia alfa ou efeitos de cor, dever imprimir a pgina como uma imagem de bitmap. Alm disso, uma impressora no-PostScript converte automaticamente todos os grficos de vetor em imagens de bitmap. Nota: O Adobe AIR no oferece suporte impresso de vetores no Mac OS. Voc especifica a impresso de bitmap no terceiro parmetro de PrintJob.addPage(), passando um objeto PrintJobOptions com o parmetro printAsBitmap definido como true, da seguinte maneira:
var options:PrintJobOptions = new PrintJobOptions(); options.printAsBitmap = true; myPrintJob.addPage(mySprite, null, options);

Se voc no especificar um valor para o terceiro parmetro, o trabalho de impresso usar o padro, que a impresso de vetor. Nota: Se voc no desejar especificar um valor para printArea (o segundo parmetro), mas desejar especificar um valor para impresso de bitmap, use null para printArea.

Controle de tempo de instrues de trabalho de impresso


O ActionScript 3.0 no restringe o objeto PrintJob a um nico quadro (como faziam as verses anteriores do ActionScript). No entanto, como o sistema operacional exibe informaes do status de impresso para o usurio depois que ele clicou no boto OK na caixa de dilogo Imprimir, voc deve chamar PrintJob.addPage() e PrintJob.send() assim que possvel para enviar as pginas para o spooler. Um atraso que atinja o quadro que contm a chamada do PrintJob.send() atrasar o processo de impresso. No ActionScript 3.0, h um tempo limite de script de 15 segundos. Portanto, o tempo entre cada instruo principal em uma seqncia de trabalho de impresso no pode exceder 15 segundos. Em outras palavras, o tempo limite de 15 segundos de script se aplica aos seguintes intervalos:

Entre PrintJob.start() e o primeiro PrintJob.addPage() Entre


PrintJob.addPage() e o prximo PrintJob.addPage()

Entre o ltimo PrintJob.addPage() e PrintJob.send()


Se qualquer um desses intervalos se estender por mais de 15 segundos, a chamada seguinte para o PrintJob.start(), na ocorrncia PrintJob, retornar false e o seguinte PrintJob.addPage() na ocorrncia PrintJob far com que o Flash Player ou o AIR emitam uma exceo de tempo de execuo.

PROGRAMAO DO ACTIONSCRIPT 3.0 679


Impresso

Configurao de tamanho, escala e orientao


A seo Impresso de uma pgina na pgina 675 fornece detalhes das etapas de um trabalho de impresso bsico, em que a sada reflete diretamente o equivalente impresso do tamanho e posio da tela da entidade grfica especificada. No entanto as impressoras usam resolues diferentes para impresso e podem ter configuraes que afetam contrariamente a aparncia da entidade grfica impressa. O Flash Player e o AIR podem ler configuraes de impresso de um sistema operacional, mas observe que essas propriedades so somente leitura: embora voc possa responder a seus valores, no pode defini-los. Portanto, por exemplo, voc pode localizar a configurao de tamanho da pgina da impressora e ajustar seu contedo para se adequar ao tamanho. Tambm possvel determinar as configuraes de margem e de orientao da pgina da impressora. Para responder s configuraes da impressora, voc pode precisar especificar uma rea de impresso, ajustar a diferena entre a resoluo da tela e as medidas de ponto da impressora ou transformar o contedo para atender s configuraes de tamanho ou de orientao da impressora do usurio.

Uso de retngulos para a rea de impresso


O mtodo PrintJob.addPage() permite especificar a regio de uma entidade grfica que voc deseja que seja impressa. O segundo parmetro, printArea, est na forma de um objeto Rectangle. H trs opes para fornecer um valor para esse parmetro:

Crie um objeto Rectangle com propriedades especficas e, em seguida, use esse retngulo na chamada de
addPage(), conforme no exemplo a seguir: private var rect1:Rectangle = new Rectangle(0, 0, 400, 200); myPrintJob.addPage(sheet, rect1);

Se voc ainda no tiver especificado um objeto Rectangle, poder fazer isso dentro da prpria chamada, como no
exemplo a seguir:
myPrintJob.addPage(sheet, new Rectangle(0, 0, 100, 100));

Se voc planejar fornecer valores para o terceiro parmetro na chamada de addPage(), mas no desejar especificar
um retngulo, poder usar null para o segundo parmetro, como no exemplo a seguir:
myPrintJob.addPage(sheet, null, options);

Nota: Se voc planejar especificar um retngulo para as dimenses de impresso, lembre-se de importar a classe flash.display.Rectangle.

Comparao de pontos e pixels


A largura e a altura do retngulo so valores em pixels. Uma impressora usa pontos como unidades de medida de impresso. Os pontos tm tamanho fsico fixo (1/72 polegadas), mas o tamanho de um pixel na tela depende da resoluo da tela especfica. A taxa de converso entre pixels e pontos depende das configuraes da impressora e se a entidade grfica est dimensionada. Um sprite no dimensionado, com 72 pixels de largura, ter uma polegada de largura na impresso, com um ponto igual a um pixel, independentemente da resoluo da tela. Voc pode usar as equivalncias a seguir para converter polegadas ou centmetros em twips (1/20 de um ponto) ou pontos:

1 ponto = 1/72 pol = 20 twips 1 pol = 72 pontos = 1440 twips 1 centmetro = 567 twips

PROGRAMAO DO ACTIONSCRIPT 3.0 680


Impresso

Se voc omitir o parmetro printArea, ou se ele for passado incorretamente, a rea total da entidade grfica ser impressa.

Escala
Para dimensionar um objeto Sprite antes de imprimi-lo, defina as propriedades da escala (consulte Manipulao do tamanho e dimensionamento de objetos na pgina 299) antes de chamar o mtodo PrintJob.addPage() e definaas novamente como seus valores originais aps a impresso. A escala de um objeto Sprite no tem nenhuma relao com a propriedade printArea. Em outras palavras, se voc especificar uma rea de impresso de 50 x 50 pixels, sero impressos 2500 pixels. Se voc dimensionar o objeto Sprite, sero impressos os mesmos 2500 pixels, mas o objeto Sprite ser impresso no tamanho dimensionado. Para obter um exemplo, consulte Exemplo: Escala, corte e resposta na pgina 682.

Impresso de orientao paisagem ou retrato


Como o Flash Player e o AIR podem detectar as configuraes de orientao, voc pode criar lgica no ActionScript para ajustar o tamanho ou a rotao do contedo em resposta s configuraes da impressora, conforme ilustrado no exemplo a seguir:
if (myPrintJob.orientation == PrintJobOrientation.LANDSCAPE) { mySprite.rotation = 90; }

Nota: Se voc planeja ler a configurao do sistema para obter a orientao do contedo no papel, lembre-se de importar a classe PrintJobOrientation. A classe PrintJobOrientation fornece valores de constante que definem a orientao do contedo na pgina. Importe a classe usando a seguinte instruo:
import flash.printing.PrintJobOrientation;

Resposta altura e largura da pgina


Usando uma estratgia semelhante manipulao das configuraes de orientao da impressora, voc pode ler as configuraes de altura e largura da pgina e responder a elas incorporando alguma lgica em uma instruo if. O cdigo a seguir mostra um exemplo:
if (mySprite.height > myPrintJob.pageHeight) { mySprite.scaleY = .75; }

Alm disso, as configuraes da margem de uma pgina podem ser determinadas comparando as dimenses da pgina e do papel, conforme ilustrado no exemplo a seguir:
margin_height = (myPrintJob.paperHeight - myPrintJob.pageHeight) / 2; margin_width = (myPrintJob.paperWidth - myPrintJob.pageWidth) / 2;

Exemplo: Impresso de vrias pginas


Ao imprimir mais de uma pgina de contedo, voc pode associar cada pgina de contedo a uma entidade grfica diferente (neste caso, sheet1 e sheet2) e usar PrintJob.addPage() para cada entidade grfica. O cdigo a seguir ilustra esta tcnica:

PROGRAMAO DO ACTIONSCRIPT 3.0 681


Impresso

package { import import import import import import import

flash.display.MovieClip; flash.printing.PrintJob; flash.printing.PrintJobOrientation; flash.display.Stage; flash.display.Sprite; flash.text.TextField; flash.geom.Rectangle;

public class PrintMultiplePages extends MovieClip { private var sheet1:Sprite; private var sheet2:Sprite; public function PrintMultiplePages():void { init(); printPages(); } private function init():void { sheet1 = new Sprite(); createSheet(sheet1, "Once upon a time...", {x:10, y:50, width:80, height:130}); sheet2 = new Sprite(); createSheet(sheet2, "There was a great story to tell, and it ended quickly.\n\nThe end.", null); } private function createSheet(sheet:Sprite, str:String, imgValue:Object):void { sheet.graphics.beginFill(0xEEEEEE); sheet.graphics.lineStyle(1, 0x000000); sheet.graphics.drawRect(0, 0, 100, 200); sheet.graphics.endFill(); var txt:TextField = new TextField(); txt.height = 200; txt.width = 100; txt.wordWrap = true; txt.text = str; if (imgValue != null) { var img:Sprite = new Sprite(); img.graphics.beginFill(0xFFFFFF); img.graphics.drawRect(imgValue.x, imgValue.y, imgValue.width, imgValue.height); img.graphics.endFill(); sheet.addChild(img); } sheet.addChild(txt); } private function printPages():void { var pj:PrintJob = new PrintJob();

PROGRAMAO DO ACTIONSCRIPT 3.0 682


Impresso

var pagesToPrint:uint = 0; if (pj.start()) { if (pj.orientation == PrintJobOrientation.LANDSCAPE) { throw new Error("Page is not set to an orientation of portrait."); } sheet1.height = pj.pageHeight; sheet1.width = pj.pageWidth; sheet2.height = pj.pageHeight; sheet2.width = pj.pageWidth; try { pj.addPage(sheet1); pagesToPrint++; } catch (error:Error) { // Respond to error. } try { pj.addPage(sheet2); pagesToPrint++; } catch (error:Error) { // Respond to error. } if (pagesToPrint > 0) { pj.send(); } } } } }

Exemplo: Escala, corte e resposta


Em alguns casos, talvez voc queira ajustar o tamanho (ou outras propriedades) de um objeto de exibio ao imprimilo para acomodar as diferenas entre a maneira como ele aparece na tela e a maneira como aparece impresso no papel. Quando voc ajusta as propriedades de um objeto de exibio antes da impresso (por exemplo, usando as propriedades scaleX e scaleY), lembre-se de que, se o objeto tiver a escala maior do que o retngulo definido para a rea de impresso, ele ser cortado. Talvez voc tambm queira redefinir as propriedades depois que as pginas foram impressas.

PROGRAMAO DO ACTIONSCRIPT 3.0 683


Impresso

O cdigo a seguir escala as dimenses do objeto de exibio txt (mas no o plano de fundo da caixa verde) e o campo de texto acaba sendo cortado pelas dimenses do retngulo especificado. Aps a impresso, o campo de texto volta ao seu tamanho original para exibio na tela. Se o usurio cancelar o trabalho de impresso da caixa de dilogo Imprimir do sistema operacional, o contedo no Flash Player ou no AIR ser alterado para alertar o usurio de que o trabalho foi cancelado.
package { import import import import import

flash.printing.PrintJob; flash.display.Sprite; flash.text.TextField; flash.display.Stage; flash.geom.Rectangle;

public class PrintScaleExample extends Sprite { private var bg:Sprite; private var txt:TextField; public function PrintScaleExample():void { init(); draw(); printPage(); } private function printPage():void { var pj:PrintJob = new PrintJob(); txt.scaleX = 3; txt.scaleY = 2; if (pj.start()) { trace(">> pj.orientation: " + pj.orientation); trace(">> pj.pageWidth: " + pj.pageWidth); trace(">> pj.pageHeight: " + pj.pageHeight); trace(">> pj.paperWidth: " + pj.paperWidth); trace(">> pj.paperHeight: " + pj.paperHeight); try { pj.addPage(this, new Rectangle(0, 0, 100, 100)); } catch (error:Error) { // Do nothing. } pj.send(); } else { txt.text } // Reset the txt.scaleX = txt.scaleY =

= "Print job canceled"; txt scale properties. 1; 1;

PROGRAMAO DO ACTIONSCRIPT 3.0 684


Impresso

} private function init():void { bg = new Sprite(); bg.graphics.beginFill(0x00FF00); bg.graphics.drawRect(0, 0, 100, 200); bg.graphics.endFill(); txt = new TextField(); txt.border = true; txt.text = "Hello World"; } private function draw():void { addChild(bg); addChild(txt); txt.x = 50; txt.y = 50; } } }

685

Captulo 31: Uso da API externa


A API externa do ActionScript 3.0 permite a comunicao direta entre o ActionScript e o aplicativo de continer interno no qual Adobe Flash Player est em execuo. Existem diversas situaes nas quais voc poder optar por usar a API externa; por exemplo, ao criar a interao entre um documento SWF e o JavaScript em uma pgina HTML ou ao criar um aplicativo de rea de trabalho que usa o Flash Player para exibir um arquivo SWF. Este captulo descreve como usar a API externa para interagir com um aplicativo de continer, como transmitir dados entre o ActionScript e o JavaScript em uma pgina HTML e como estabelecer a comunicao e fazer o intercmbio de dados entre o ActionScript e um aplicativo de rea de trabalho. Nota: Este captulo abrange apenas a comunicao entre o ActionScript em um SWF e o aplicativo de continer que inclui uma referncia ao Flash Player ou ocorrncia na qual o SWF est carregado. Qualquer outro uso do Flash Player em um aplicativo est fora do escopo desta documentao. O Flash Player foi desenvolvido para ser usado como um plugin de navegador ou como um projetor (aplicativo dedicado). Outros ambientes de uso podem ter suporte limitado.

Noes bsicas de uso da API externa


Introduo ao uso da API externa
Embora em alguns casos um arquivo SWF possa ser executado automaticamente (por exemplo, se voc criar um projetor SWF), na maioria dos casos, um aplicativo SWF executado como um elemento dentro de outro aplicativo. Normalmente, o continer que inclui o SWF um arquivo HTML; um arquivo SWF usado, com menos freqncia, em toda ou parte da interface de usurio de um aplicativo de rea de trabalho. medida que voc trabalha em aplicativos mais avanados, talvez precise configurar a comunicao entre o arquivo SWF e o aplicativo de continer. Por exemplo, uma pgina da Web normalmente exibe texto ou outras informaes em HTML e inclui um arquivo SWF para exibir contedo visual dinmico, como um grfico ou vdeo. Nesse caso, talvez seja til especificar que, quando os usurios clicam em um boto na pgina da Web, alguma coisa deve mudar no arquivo SWF. O ActionScript contm um mecanismo, conhecido como API externa, que facilita esse tipo de comunicao entre o ActionScript em um arquivo SWF e outro cdigo no aplicativo de continer.

Tarefas comuns da API externa


As seguintes tarefas comuns da API externa so explicadas neste captulo:

Obteno de informaes sobre o aplicativo de continer Uso do ActionScript para chamar o cdigo em um aplicativo de continer, incluindo uma pgina da Web ou um
aplicativo de rea de trabalho

Chamada do cdigo do ActionScript a partir do cdigo de um aplicativo de continer Criao de um proxy para simplificar a chamada do cdigo do ActionScript a partir de um aplicativo de continer

Conceitos e termos importantes


A lista de referncia a seguir contm termos importantes usados neste captulo:

Continer ActiveX: um aplicativo de continer (no um navegador da Web) que inclui uma ocorrncia do controle
ActiveX do Flash Player para exibir o contedo do SWF no aplicativo.

PROGRAMAO DO ACTIONSCRIPT 3.0 686


Uso da API externa

Aplicativo de continer: o aplicativo no qual o Flash Player est executando o arquivo SWF, como um navegador
da Web e a pgina HTML que inclui o contedo do Flash Player.

Projetor: um arquivo SWF que foi convertido em um arquivo executvel dedicado que inclui o contedo do Flash
Player e do arquivo SWF. Um projetor pode ser criado no Adobe Flash CS4 Professional ou com o Flash Player independente. Os projetores normalmente so usados para distribuir arquivos SWF por CD-ROM ou em situaes similares onde o tamanho do download no um problema e o autor do SWF quer garantir que o usurio possa executar o arquivo SWF, independentemente da instalao do Flash Player no computador do usurio.

Proxy: um aplicativo ou cdigo go-between que chama o cdigo de um aplicativo (o aplicativo externo) em favor
de outro aplicativo (o aplicativo de chamada), e retorna valores para o aplicativo de chamada. Um proxy pode ser usado por vrios motivos, como:

Para simplificar o processo de chamada de funes externas, convertendo as chamadas de funes nativas do
aplicativo de chamada no formato reconhecido pelo aplicativo externo

Para solucionar problemas de segurana ou outras restries que impedem a comunicao direta do chamador
com o aplicativo externo

Serializar: converter valores de objetos ou dados em um formato que pode ser usado para transmitir os valores em
mensagens entre dois sistemas de programao, como via Internet ou entre dois aplicativos diferentes em execuo em um nico computador.

Teste dos exemplos do captulo


Talvez voc queira testar as listagens de cdigo de exemplo durante a leitura deste captulo. Muitas listagens de cdigo do captulo so pequenas listagens apenas para demonstrao, no exemplos de trabalho completos ou cdigo que verifica valores. Como o uso da API externa requer (por definio) a gravao do cdigo do ActionScript, bem como do cdigo de um aplicativo de continer, o teste dos exemplos envolve a criao de um continer (por exemplo, uma pgina da Web que contm o SWF) e o uso das listagens de cdigo para interagir com o continer. Para testar um exemplo de comunicao entre ActionScript e JavaScript: 1 Crie um novo documento usando a ferramenta de autoria do Flash e salve-o no computador.
2 No menu principal, escolha Arquivo > Configuraes de publicao. 3 Na caixa de dilogo Configuraes de publicao, na aba Formatos, verifique se as caixas de seleo Flash e HTML

esto marcadas.
4 Clique no boto Publicar. Isso gera um arquivo SWF e um arquivo HTML na mesma pasta, com o mesmo nome

usado para salvar o documento. Clique em OK para fechar a caixa de dilogo Configuraes de publicao.
5 Desmarque a caixa de seleo HTML. Agora que a pgina HTML foi gerada, voc ir modific-la para adicionar o

cdigo do JavaScript apropriado. Desmarcar a caixa de seleo HTML garante que, aps a modificao da pgina HTML, o Flash no substituir as alteraes por uma nova pgina HTML ao publicar o arquivo SWF.
6 Clique em OK para fechar a caixa de dilogo Configuraes de publicao. 7 Com um aplicativo de editor de texto ou HTML, abra o arquivo HTML criado pelo Flash ao publicar o SWF. No

cdigo-fonte HTML, adicione as tags script de abertura e fechamento e copie-as no cdigo do JavaScript na listagem de cdigo de exemplo:
<script> // add the sample JavaScript code here </script>

8 Salve o arquivo HTML e volte ao Flash. 9 Selecione o quadro-chave no Quadro 1 da Linha de tempo e abra o painel Aes.

PROGRAMAO DO ACTIONSCRIPT 3.0 687


Uso da API externa

10 Copie a listagem de cdigo do ActionScript no painel Script. 11 No menu principal, escolha Arquivo > Publicar para atualizar o arquivo SWF com as alteraes feitas. 12 Usando um navegador da Web, abra a pgina HTML editada para visualiz-la e testar a comunicao entre o

ActionScript e a pgina HTML. Para testar um exemplo de comunicao de continer entre ActionScript e ActiveX: 1 Crie um novo documento usando a ferramenta de autoria do Flash e salve-o no computador. Salve-o na pasta onde o aplicativo de continer dever localizar o arquivo SWF.
2 No menu principal, escolha Arquivo > Configuraes de publicao. 3 Na caixa de dilogo Configuraes de publicao, na aba Formatos, verifique se apenas a caixa de seleo Flash est

marcada.
4 No campo Arquivo prximo caixa de seleo Flash, clique no cone de pasta para selecionar a pasta na qual o

arquivo SWF ser publicado. Uma vez definido o local do arquivo SWF, voc pode, por exemplo, manter o documento de autoria em uma determinada pasta e colocar o arquivo SWF publicado em outra pasta, como a que contm o cdigo-fonte do aplicativo de continer.
5 Selecione o quadro-chave no Quadro 1 da Linha de tempo e abra o painel Aes. 6 Copie o cdigo do ActionScript do exemplo no painel Script. 7 No menu principal, escolha Arquivo > Publicar para republicar o arquivo SWF. 8 Crie e execute o aplicativo de continer para testar a comunicao entre o ActionScript e o aplicativo de continer.

Os dois exemplos do final deste captulo so exemplos completos de uso da API externa para comunicao com uma pgina HTML e um aplicativo de rea de trabalho C#, respectivamente. Esses exemplos incluem o cdigo completo, com o cdigo de verificao de erro do ActionScript e do continer, que deve ser usado ao gravar o cdigo com a API externa. Para obter outro exemplo completo de uso da API externa, consulte o exemplo da classe ExternalInterface na Referncia dos componentes e da linguagem do ActionScript 3.0.

Requisitos e vantagens da API externa


A API externa a parte do ActionScript que fornece um mecanismo para comunicao entre o ActionScript e o cdigo em execuo em um aplicativo externo que est agindo como continer para o Flash Player (normalmente um navegador da Web ou aplicativo de projetor dedicado). No ActionScript 3.0, a funcionalidade da API externa fornecida pela classe ExternalInterface. Nas verses do Flash Player anteriores ao Flash Player 8, a ao fscommand() era usada para estabelecer a comunicao com o aplicativo de continer. A classe ExternalInterface uma substituio de fscommand(), e seu uso recomendado para todas as comunicaes entre JavaScript e ActionScript. Nota: Se precisar usar a funo fscommand() antiga (por exemplo, para manter a compatibilidade com aplicativos mais antigos ou para interagir com um aplicativo de continer SWF de terceiros ou o Flash Player), ela ainda est disponvel como uma funo no pacote flash.system. A classe ExternalInterface um subsistema que permite a comunicao fcil entre ActionScript e Flash Player com JavaScript em uma pgina HTML ou com qualquer aplicativo de rea de trabalho que inclui uma ocorrncia do Flash Player. A classe ExternalInterface s est disponvel nas seguintes condies:

Em todas as verses compatveis do Internet Explorer para Windows (5.0 e posterior)

PROGRAMAO DO ACTIONSCRIPT 3.0 688


Uso da API externa

Em um aplicativo de continer como um aplicativo de rea de trabalho que usa uma ocorrncia do controle ActiveX
do Flash Player

Em qualquer navegador compatvel com a interface NPRuntime, que no momento inclui o Firefox 1.0 e posterior,
o Mozilla 1.7.5 e posterior, o Netscape 8.0 e posterior e o Safari 1.3 e posterior. Em todas as outras situaes (como a execuo em um player dedicado), a propriedade ExternalInterface.available retorna false. No ActionScript, possvel chamar uma funo JavaScript na pgina HTML. A API externa tem uma funcionalidade aprimorada em comparao com fscommand():

possvel usar qualquer funo JavaScript, no apenas as funes que podem ser usadas com a funo
fscommand().

possvel transmitir qualquer nmero de argumentos, com qualquer nome; voc no fica limitado a transmitir um
comando e um nico argumento de string. Desse modo, a API externa tem muito mais flexibilidade do que fscommand().

possvel transmitir vrios tipos de dados (como booleano, nmero e string); voc no est mais limitado aos
parmetros String.

Voc pode receber o valor de uma chamada e esse valor retorna imediatamente para o ActionScript (como o valor
de retorno da chamada feita). Importante: Se o nome dado ocorrncia do Flash Player em uma pgina HTML (atributo id da tag object) incluir um hfen (-) ou outros caracteres que so definidos como operadores no JavaScript (como +, *, /, \, . e assim por diante), as chamadas de ExternalInterface a partir do ActionScript no funcionaro quando a pgina da Web do continer for visualizada no Internet Explorer.Alm disso, se as tags HTML que definem a ocorrncia do Flash Player (as tags object e embed) estiverem aninhadas em uma tag HTML form, as chamadas de ExternalInterface a partir do ActionScript no funcionaro.

Uso da classe ExternalInterface


A comunicao entre o ActionScript e o aplicativo de continer pode ser realizada de duas formas: o ActionScript pode chamar o cdigo (como uma funo do JavaScript) definido no continer ou o cdigo do continer pode chamar uma funo do ActionScript que foi designada como chamvel. De qualquer modo, as informaes podem ser enviadas para o cdigo que est sendo chamado e os resultados podem ser retornados para o cdigo que est fazendo a chamada. Para facilitar essa comunicao, a classe ExternalInterface inclui duas propriedades estticas e dois mtodos estticos. Esses mtodos e propriedades so usados para obter informaes sobre a conexo da interface externa, para executar o cdigo no continer do ActionScript e para disponibilizar as funes do ActionScript para serem chamadas pelo continer.

Obteno de informaes sobre o continer externo


A propriedade ExternalInterface.available indica se o Flash Player atual est em um continer que oferece uma interface externa. Se a interface externa estiver disponvel, esta propriedade ser true; caso contrrio, ela ser false. Antes de usar qualquer outra funcionalidade na classe ExternalInterface, sempre verifique se o continer atual oferece suporte comunicao da interface externa do seguinte modo:
if (ExternalInterface.available) { // Perform ExternalInterface method calls here. }

PROGRAMAO DO ACTIONSCRIPT 3.0 689


Uso da API externa

Nota: A propriedade ExternalInterface.available informa se o continer atual um tipo compatvel com a conectividade de ExternalInterface. Ela no informa se o JavaScript est ativado no navegador atual. A propriedade ExternalInterface.objectID permite determinar o identificador exclusivo da ocorrncia do Flash Player (especificamente, o atributo id da tag object no Internet Explorer ou o atributo name da tag embed nos navegadores que usam a interface NPRuntime). Essa ID exclusiva representa o documenta SWF atual no navegador e pode ser usada para fazer referncia ao documento SWF (por exemplo, ao chamar uma funo do JavaScript em uma pgina HTML de continer). Quando o continer do Flash Player no um navegador da Web, essa propriedade null.

Chamada do cdigo externo a partir do ActionScript


O mtodo ExternalInterface.call() executa o cdigo no aplicativo de continer. Ele requer pelo menos um parmetro, uma string que contm o nome da funo a ser chamada no aplicativo de continer. Quaisquer parmetros adicionais transmitidos para o mtodo ExternalInterface.call() so transmitidos ao longo do continer como parmetros da chamada de funo.
// calls the external function "addNumbers" // passing two parameters, and assigning that function's result // to the variable "result" var param1:uint = 3; var param2:uint = 7; var result:uint = ExternalInterface.call("addNumbers", param1, param2);

Se o continer for uma pgina HTML, esse mtodo invocar a funo do JavaScript com o nome especificado, que deve ser definido em um elemento script na pgina HTML de continer. O valor de retorno da funo do JavaScript transmitido novamente para o ActionScript.
<script language="JavaScript"> // adds two numbers, and sends the result back to ActionScript function addNumbers(num1, num2) { return (num1 + num2); } </script>

Se o continer for algum outro continer ActiveX, esse mtodo far com que o controle ActiveX do Flash Player envie o evento FlashCall. O nome da funo e os parmetros especificados so serializados em uma string XML pelo Flash Player. O continer pode acessar essas informaes na propriedade request do objeto de evento e us-las para determinar como seu prprio cdigo deve ser executado. Para retornar um valor para o ActionScript, o cdigo do continer chama o mtodo SetReturnValue() do objeto ActiveX, transmitindo o resultado (serializado em uma string XML) como um parmetro desse mtodo. Para obter mais informaes sobre o formato XML usado para essa comunicao, consulte O formato XML da API externa na pgina 691. Independentemente de o continer ser um navegador da Web ou outro continer ActiveX, se a chamada falhar ou o mtodo do continer no especificar um valor de retorno, null ser retornado. O mtodo ExternalInterface.call() lanar uma exceo SecurityError se o ambiente includo pertencer a uma caixa de proteo de segurana para a qual o cdigo de chamada no tem acesso. Para solucionar isso temporariamente, defina um valor apropriado para allowScriptAccess no ambiente includo. Por exemplo, para alterar o valor de allowScriptAccess em uma pgina HTML, edite o atributo adequado nas tags object e embed.

PROGRAMAO DO ACTIONSCRIPT 3.0 690


Uso da API externa

Chamada do cdigo do ActionScript a partir do continer


Um continer s pode chamar o cdigo do ActionScript que esteja em uma funo - nenhum outro cdigo do ActionScript pode ser chamado por um continer. Para chamar um funo do ActionScript a partir do aplicativo de continer, voc deve fazer duas coisas: registrar a funo com a classe ExternalInterface e cham-la a partir do cdigo do continer. Primeiro, voc deve registrar a funo do ActionScript para indicar se ela deve ser disponibilizada para o continer. Use o mtodo ExternalInterface.addCallback() do seguinte modo:
function callMe(name:String):String { return "busy signal"; } ExternalInterface.addCallback("myFunction", callMe);

O mtodo addCallback() tem dois parmetros. O primeiro, um nome de funo como String, o nome pelo qual a funo ser reconhecida pelo continer. O segundo parmetro a funo real do ActionScript que ser executada quando o continer chamar o nome de funo definido. Como esses nomes so diferentes, voc pode especificar um nome de funo que ser usado pelo continer, mesmo se a funo real do ActionScript tiver um nome diferente. Isso especialmente til se o nome da funo no for conhecido - por exemplo, se uma funo annima for especificada ou se a funo a ser chamada for determinada em tempo de execuo. Depois que uma funo do ActionScript registrada com a classe ExternalInterface, o continer pode realmente chamar a funo. O modo como isso feito varia de acordo com o tipo de continer. Por exemplo, no cdigo do JavaScript em um navegador da Web, a funo do ActionScript chamada com o nome de funo registrado, visto que este um mtodo do objeto de navegador do Flash Player (isto , um mtodo do objeto JavaScript que representa a tag object ou embed). Em outras palavras, os parmetros so transmitidos e um resultado retornado como uma funo local que est sendo chamada.
<script language="JavaScript"> // callResult gets the value "busy signal" var callResult = flashObject.myFunction("my name"); </script> ... <object id="flashObject"...> ... <embed name="flashObject".../> </object>

Como alternativa, ao chamar uma funo do ActionScript em um arquivo SWF em execuo em um aplicativo de rea de trabalho, o nome de funo registrado e os parmetros devem ser serializados em uma string XML. Em seguida, a chamada realmente feita para o mtodo CallFunction() do controle ActiveX com a string XML como parmetro. Para obter mais informaes sobre o formato XML usado para essa comunicao, consulte O formato XML da API externa na pgina 691. De qualquer modo, o valor de retorno da funo do ActionScript transmitido novamente para o cdigo do continer, diretamente como um valor quando o chamador o cdigo JavaScript em um navegador ou serializado com uma string XML quando o chamador um continer ActiveX.

PROGRAMAO DO ACTIONSCRIPT 3.0 691


Uso da API externa

O formato XML da API externa


A comunicao entre o ActionScript e um aplicativo que hospeda o controle ActiveX do Shockwave Flash usa um formato XML especfico para codificar chamadas e valores de funo. Duas partes do formato XML so usadas pela API externa. Um formato usado para representar chamadas de funo. Outro formato usado para representar valores individuais; esse formato usado para parmetros em funes e em valores de retorno de funo. O formato XML das chamadas de funo usado para chamadas feitas e recebidas pelo ActionScript. Para uma chamada de funo a partir do ActionScript, o Flash Player transmite o XML para o continer; para uma chamada a partir do continer, o Flash Player espera que o aplicativo de continer o transmita como uma string XML nesse formato. O fragmento XML a seguir mostra o exemplo de uma chamada de funo em formato XML:
<invoke name="functionName" returntype="xml"> <arguments> ... (individual argument values) </arguments> </invoke>

O n raiz o n invoke. Ele tem dois atributos: name indica o nome da funo a ser chamada e returntype sempre xml. Se a chamada de funo incluir parmetros, o n invoke ter um n filho arguments, cujos ns filho sero os valores de parmetro formatados que usam o formato de valor individual explicado a seguir. Os valores individuais, incluindo parmetros de funo e valores de retorno de funo, usam um esquema de formatao que inclui informaes sobre o tipo de dados alm dos valores reais. A tabela a seguir lista as classes do ActionScript e o formato XML usado para codificar valores desse tipo de dados:
Classe/valor do ActionScript nulo Booleano true Booleano false String Nmero, int, uint Classe/valor do C# Formato Comentrios

nulo bool true bool false string nico, duplo, int, uint

<nulo/> <true/> <false/> <string>valor da string</string>


<number>27.5</number> <number>-12</number>

PROGRAMAO DO ACTIONSCRIPT 3.0 692


Uso da API externa

Classe/valor do ActionScript Array (os elementos podem ser de tipos diferentes)

Classe/valor do C#

Formato

Comentrios

Uma coleo que permite elementos de tipos diferentes, como ArrayList ou object[]

<array> <property id="0"> <number>27.5</number> </property> <property id="1"> <string>Hello there!</string> </property> ... </array> <object> <property id="name"> <string>John Doe</string> </property> <property id="age"> <string>33</string> </property> ... </object> <null/> or <object></object>

O n property define elementos individuais e o atributo id o ndice numrico baseado em zero.

Object

Um dicionrio com chaves de string e valores de objeto, como HashTable com chaves de string

O n property define propriedades individuais e o atributo id o nome da propriedade (uma string).

Outras classes internas ou personalizadas

O ActionScript codifica outros objetos como nulos ou como um objeto vazio. De qualquer modo, os valores de propriedade so perdidos.

Nota: Por exemplo, esta tabela mostra as classes C# equivalentes alm das classes do ActionScript; no entanto, a API externa pode ser usada para comunicao com qualquer linguagem de programao ou tempo de execuo compatvel com os controles ActiveX, no se limitando aos aplicativos C#. Quando est criando seus prprios aplicativos usando a API externa com um aplicativo de continer ActiveX, voc provavelmente achar til gravar um proxy que ir converter as chamadas de funo nativas no formato XML serializado. Para obter um exemplo de uma classe de proxy gravada em C#, consulte Dentro da classe ExternalInterfaceProxy na pgina 702.

Exemplo: uso da API externa em um continer de pgina da Web


Este aplicativo de amostra demonstra tcnicas adequadas de comunicao entre o ActionScript e o JavaScript em um navegador da Web, no mbito de um aplicativo de mensagem instantnea que permite que uma pessoa converse consigo mesma (da o nome do aplicativo: Introvert IM). As mensagens so enviadas entre um formulrio HTML na pgina da Web e uma interface SWF usando a API externa. As tcnicas demonstradas neste exemplo incluem as seguintes:

Incio adequado da comunicao, verificando se o navegador est preparado para se comunicar antes de estabelecer
uma comunicao

Verificao da compatibilidade entre o continer e a API externa Chamada das funes do JavaScript a partir do ActionScript, transmitindo parmetros e recebendo valores em
resposta

Disponibilizao dos mtodos do ActionScript para serem chamados pelo JavaScript, e realizao dessas chamadas

PROGRAMAO DO ACTIONSCRIPT 3.0 693


Uso da API externa

Para obter os arquivos de aplicativo desse exemplo, consulte www.adobe.com/go/learn_programmingAS3samples_flash_br. Os arquivos do aplicativo Introvert IM esto localizados na pasta Amostras/IntrovertIM_HTML. O aplicativo consiste nos seguintes arquivos:
Arquivo IntrovertIMApp.fla ou IntrovertIMApp.mxml com/example/programmingas3/introvertIM/IMManager.as A classe que estabelece e gerencia a comunicao entre o ActionScript e o continer. Tipo de evento personalizado, enviado pela classe IMManager quando uma mensagem recebida do continer. Enumerao cujos valores representam diferentes status de "disponibilidade" que podem ser selecionados no aplicativo. A pgina HTML do aplicativo para Flash (html-flash/IntrovertIMApp.html) ou o modelo usado para criar a pgina HTML do continer do aplicativo para Adobe Flex (html-template/index.template.html). Esse arquivo contm todas as funes do JavaScript que fazem parte do continer do aplicativo. Descrio O arquivo de aplicativo principal no Flash (FLA) ou Flex (MXML).

com/example/programmingas3/introvertIM/IMMessageEvent.as

com/example/programmingas3/introvertIM/IMStatus.as

html-flash/IntrovertIMApp.html ou html-template/index.template.html

Preparao da comunicao entre o ActionScript e o navegador


A API externa normalmente usada para permitir a comunicao dos aplicativos do ActionScript com um navegador da Web. Usando a API externa, os mtodos do ActionScript podem chamar o cdigo gravado em JavaScript e viceversa. Devido complexidade dos navegadores e ao modo de renderizao interna das pginas, no possvel garantir que um documento SWF registrar seus retornos de chamada antes da execuo do primeiro JavaScript na pgina HTML. Por esse motivo, antes de chamar funes no documento SWF a partir do JavaScript, o documento SWF sempre deve chamar a pgina HTML para notificar se o documento SWF est pronto para aceitar conexes. Por exemplo, por meio de uma srie de etapas realizadas pela classe IMManager, o Introvert IM determina se o navegador est pronto para comunicao e prepara o arquivo SWF para comunicao. A primeira etapa, determinar quando o navegador est pronto para comunicao, acontece no construtor IMManager do seguinte modo:

PROGRAMAO DO ACTIONSCRIPT 3.0 694


Uso da API externa

public function IMManager(initialStatus:IMStatus) { _status = initialStatus; // Check if the container is able to use the external API. if (ExternalInterface.available) { try { // This calls the isContainerReady() method, which in turn calls // the container to see if Flash Player has loaded and the container // is ready to receive calls from the SWF. var containerReady:Boolean = isContainerReady(); if (containerReady) { // If the container is ready, register the SWF's functions. setupCallbacks(); } else { // If the container is not ready, set up a Timer to call the // container at 100ms intervals. Once the container responds that // it's ready, the timer will be stopped. var readyTimer:Timer = new Timer(100); readyTimer.addEventListener(TimerEvent.TIMER, timerHandler); readyTimer.start(); } } ... } else { trace("External interface is not available for this container."); } }

Primeiro, o cdigo verifica se a API externa est realmente disponvel no continer atual usando a propriedade ExternalInterface.available. Se estiver, o processo de configurao da comunicao iniciado. Como excees de segurana e outros erros podem ocorrer ao tentar se comunicar com um aplicativo externo, o cdigo fica entre um bloco try (os blocos catch correspondentes foram omitidos da listagem para facilitar). O cdigo a seguir chama o mtodo isContainerReady(), listado aqui:
private function isContainerReady():Boolean { var result:Boolean = ExternalInterface.call("isReady"); return result; }

O mtodo isContainerReady(), por sua vez, usa o mtodo ExternalInterface.call() para chamar a funo isReady() do JavaScript do seguinte modo:

PROGRAMAO DO ACTIONSCRIPT 3.0 695


Uso da API externa

<script language="JavaScript"> <!-// ------- Private vars ------var jsReady = false; ... // ------- functions called by ActionScript ------// called to check if the page has initialized and JavaScript is available function isReady() { return jsReady; } ... // called by the onload event of the <body> tag function pageInit() { // Record that JavaScript is ready to go. jsReady = true; } ... //--> </script>

A funo isReady() simplesmente retorna o valor da varivel jsReady. Essa varivel inicialmente false; assim que o evento onload da pgina da Web acionado, o valor da varivel muda para true. Em outras palavras, se o ActionScript chamar a funo isReady() antes que a pgina seja carregada, o JavaScript retornar false para ExternalInterface.call("isReady") e, conseqentemente, o mtodo isContainerReady() do ActionScript retornar false. Assim que a pgina for carregada, a funo isReady() do JavaScript retornar true, de modo que o mtodo isContainerReady() do ActionScript tambm retornar true. De volta ao construtor IMManager, uma de duas coisas acontecem dependendo da disponibilidade do continer. Se isContainerReady() retornar true, o cdigo simplesmente chamar o mtodo setupCallbacks(), que concluir o processo de configurao da comunicao com o JavaScript. Por outro lado, se isContainerReady() retornar false, o processo ser basicamente suspenso. Um objeto Timer criado e suspenso para chamar o mtodo timerHandler() a cada 100 milissegundos do seguinte modo:
private function timerHandler(event:TimerEvent):void { // Check if the container is now ready. var isReady:Boolean = isContainerReady(); if (isReady) { // If the container has become ready, we don't need to check anymore, // so stop the timer. Timer(event.target).stop(); // Set up the ActionScript methods that will be available to be // called by the container. setupCallbacks(); } }

Sempre que chamado, o mtodo timerHandler() verifica mais uma vez o resultado do mtodo isContainerReady(). Assim que o continer inicializado, esse mtodo retorna true. Em seguida, o cdigo pra o objeto Timer e chama o mtodo setupCallbacks() para finalizar o processo de configurao da comunicao com o navegador.

PROGRAMAO DO ACTIONSCRIPT 3.0 696


Uso da API externa

Exposio dos mtodos do ActionScript ao JavaScript


Conforme mostrou o exemplo anterior, assim que o cdigo determina que o navegador est pronto, o mtodo setupCallbacks() chamado. Esse mtodo prepara o ActionScript para receber chamadas do JavaScript, conforme mostrado a seguir:
private function setupCallbacks():void { // Register the SWF client functions with the container ExternalInterface.addCallback("newMessage", newMessage); ExternalInterface.addCallback("getStatus", getStatus); // Notify the container that the SWF is ready to be called. ExternalInterface.call("setSWFIsReady"); }

O mtodo setCallBacks() termina a tarefa de preparao de comunicao com o continer chamando ExternalInterface.addCallback() para registrar os dois mtodos que estaro disponveis para serem chamados a partir do JavaScript. Neste cdigo, o primeiro parmetro - o nome pelo qual o mtodo conhecido pelo JavaScript ("newMessage" e "getStatus") - igual ao nome do mtodo no ActionScript. Neste caso, no seria til usar nomes diferentes, de modo que o mesmo nome foi reutilizado para simplificar. Finalmente, o mtodo ExternalInterface.call() usado para chamar a funo setSWFIsReady() do JavaScript, que avisa ao continer que as funes do ActionScript foram registradas.

Comunicao do ActionScript com o navegador


O aplicativo Introvert IM demonstra diversos exemplos de chamada das funes do JavaScript na pgina do continer. No caso mais simples (um exemplo do mtodo setupCallbacks()), a funo setSWFIsReady() do JavaScript chamada sem transmitir nenhum parmetro nem receber um valor de retorno:
ExternalInterface.call("setSWFIsReady");

Em outro exemplo do mtodo isContainerReady(), o ActionScript chama a funo isReady() e recebe um valor booleano em resposta:
var result:Boolean = ExternalInterface.call("isReady");

Tambm possvel transmitir parmetros para as funes do JavaScript usando a API externa. Por exemplo, considere o mtodo sendMessage() da classe IMManager, que chamado quando o usurio est enviando uma nova mensagem para seu "parceiro de conversa":
public function sendMessage(message:String):void { ExternalInterface.call("newMessage", message); }

Novamente, ExternalInterface.call() usado para chamar a funo designada do JavaScript, notificando o navegador sobre a nova mensagem. Alm disso, a mensagem propriamente dita transmitida como um parmetro adicional para ExternalInterface.call() e, conseqentemente, transmitida como parmetro para a funo newMessage() do JavaScript.

PROGRAMAO DO ACTIONSCRIPT 3.0 697


Uso da API externa

Chamada do cdigo do ActionScript a partir do JavaScript


A comunicao uma rua de mo dupla e o aplicativo Introvert IM no foge regra. O cliente IM do Flash Player no s chama o JavaScript para enviar mensagens, mas o formulrio HTML chama o cdigo do JavaScript para enviar mensagens e solicitar informaes do arquivo SWF tambm. Por exemplo, quando o arquivo SWF avisa o continer que terminou de estabelecer o contato e est pronto para se comunicar, a primeira coisa que o navegador faz chamar o mtodo getStatus() da classe IMManager para recuperar o status de disponibilidade inicial do usurio a partir do cliente IM do SWF. Isso feito na pgina da Web, na funo updateStatus(), do seguinte modo:
<script language="JavaScript"> ... function updateStatus() { if (swfReady) { var currentStatus = getSWF("IntrovertIMApp").getStatus(); document.forms["imForm"].status.value = currentStatus; } } ... </script>

O cdigo verifica o valor da varivel swfReady, que controla se o arquivo SWF notificou o navegador sobre o registro dos mtodos com a classe ExternalInterface. Se o arquivo SWF estiver pronto para receber comunicao, a prxima linha (var currentStatus = ...) realmente chamar o mtodo getStatus() na classe IMManager. Trs coisas acontecem nesta linha de cdigo:

A funo getSWF() do JavaScript chamada, retornando uma referncia ao objeto do JavaScript que representa o
arquivo SWF. O parmetro transmitido para getSWF() determina qual objeto de navegador retornado caso haja mais de um arquivo SWF em uma pgina HTML. O valor transmitido para esse parmetro deve corresponder ao atributo id da tag object e ao atributo name da tag embed usados para incluir o arquivo SWF.

Usando a referncia ao arquivo SWF, o mtodo getStatus() chamado embora seja um mtodo do objeto SWF.
Nesse caso, o nome da funo getStatus usado porque esse o nome com o qual a funo do ActionScript foi registrada com ExternalInterface.addCallback().

O mtodo getStatus() do ActionScript retorna um valor e esse valor atribudo varivel currentStatus, que
atribuda como contedo (a propriedade value) do campo de texto status. Nota: Se estiver seguindo o cdigo, voc provavelmente percebeu que, no cdigo-fonte da funo updateStatus(), a linha de cdigo que chama a funo getSWF() realmente escrita do seguinte modo: var currentStatus = getSWF("${application}").getStatus(). O texto ${application} um alocador de espao contido no modelo da pgina HTML. Quando o Adobe Flex Builder 3 gera a pgina HTML real para o aplicativo, esse alocador substitudo pelo mesmo texto usado como o atributo id da tag object e o atributo name da tag embed (que corresponde a IntrovertIMApp no exemplo). Este o valor esperado pela funo getSWF(). A funo sendMessage() do JavaScript demonstra a transmisso de um parmetro como uma funo do ActionScript. (sendMessage() afuno que foi chamada quando o usurio pressionou o boto Enviar na pgina HTML.

PROGRAMAO DO ACTIONSCRIPT 3.0 698


Uso da API externa

<script language="JavaScript"> ... function sendMessage(message) { if (swfReady) { ... getSWF("IntrovertIMApp").newMessage(message); } } ... </script>

O mtodo newMessage() do ActionScript espera um parmetro, de modo que a varivel message do JavaScript transmitida para o ActionScript como um parmetro na chamada do mtodo newMessage() no cdigo do JavaScript.

Deteco do tipo de navegador


Devido s diferenas de acesso ao contedo dos navegadores, importante sempre usar o JavaScript para detectar qual navegados est sendo executado pelo usurio e para acessar o filme de acordo com a sintaxe especfica do navegador, usando o objeto de janela ou documento, como mostra a funo getSWF() do JavaScript neste exemplo:
<script language="JavaScript"> ... function getSWF(movieName) { if (navigator.appName.indexOf("Microsoft") != -1) { return window[movieName]; } else { return document[movieName]; } } ... </script>

Se o seu script no detectar o tipo de navegador do usurio, o usurio poder observar um comportamento inesperado ao reproduzir arquivos SWF em um continer HTML.

Exemplo: uso da API externa em um continer ActiveX


Este exemplo demonstra o uso da API externa para comunicao entre o ActionScript e um aplicativo de rea de trabalho que usa o controle ActiveX. O exemplo reutiliza o aplicativo Introvert IM, incluindo o cdigo do ActionScript e o mesmo arquivo SWF, e, assim, no descreve o uso da API externa no ActionScript. Para entender esse exemplo, til estar familiarizado com o exemplo anterior. O aplicativo de rea de trabalho desse exemplo gravado em C# com o Microsoft Visual Studio .NET. O foco da discusso so as tcnicas especficas para trabalhar com a API externa usando o controle ActiveX. Este exemplo demonstra o seguinte:

Chamada das funes do ActionScript a partir de um aplicativo de rea de trabalho que hospeda o controle ActiveX
do Flash Player

PROGRAMAO DO ACTIONSCRIPT 3.0 699


Uso da API externa

Recebimento das chamadas de funo do ActionScript e processamento dessas chamadas em um continer ActiveX Uso de uma classe de proxy para ocultar os detalhes do formato XML usado pelo Flash Player para as mensagens
enviadas para um continer ActiveX Para obter os arquivos de aplicativo desse exemplo, consulte www.adobe.com/go/learn_programmingAS3samples_flash_br. Os arquivos do aplicativo Introvert IM em C# esto localizados na pasta Amostras/IntrovertIM_CSharp. O aplicativo consiste nos seguintes arquivos:
Arquivo AppForm.cs bin/Debug/IntrovertIMApp.swf ExternalInterfaceProxy/ExternalInterfaceProxy.cs Descrio O arquivo de aplicativo principal com a interface do Windows Forms em C#. O arquivo SWF carregado pelo aplicativo. A classe que serve como envoltrio no controle ActiveX para comunicao da interface externa. Ela fornece mecanismos para chamar e receber chamadas a partir do ActionScript. A classe que converte as mensagens em formato XML do Flash Player em objetos do .NET. Esse arquivo define dois tipos de C# (classes): um delegado personalizado e uma classe de argumentos de evento, que so usados pela classe ExternalInterfaceProxy para notificar o ouvinte sobre uma chamada de funo do ActionScript. Essa classe um objeto de valor que representa uma chamada de funo do ActionScript para o continer ActiveX, com propriedades para o nome da funo e os parmetros. O arquivo SWF carregado pelo aplicativo. Assemblies envoltrios criados pelo Visual Studio .NET que so necessrios para acessar o controle ActiveX do Flash Player (Adobe Shockwave Flash) a partir do cdigo gerenciado.

ExternalInterfaceProxy/ExternalInterfaceSerializer.cs

ExternalInterfaceProxy/ExternalInterfaceEventArgs.cs

ExternalInterfaceProxy/ExternalInterfaceCall.cs

bin/Debug/IntrovertIMApp.swf obj/AxInterop.ShockwaveFlashObjects.dll, obj/Interop.ShockwaveFlashObjects.dll

Viso geral do aplicativo Introvert IM em C#


Este aplicativo de exemplo representa dois programas cliente de mensagem instantnea (um no arquivo SWF e outro incorporado no Windows Forms) que se comunicam. A interface de usurio inclui uma ocorrncia do controle ActiveX do Shockwave Flash, na qual carregado o arquivo SWF que contm o cliente IM do ActionScript. A interface tambm inclui diversos campos de texto que fazem parte do cliente IM do Windows Forms: um campo para inserir mensagens (MessageText), outro que exibe a transcrio das mensagens enviadas entre os clientes (Transcript) e um terceiro (Status) que exibe o status de disponibilidade definido no cliente IM do SWF.

Incluso do controle ActiveX do Shockwave Flash


Para incluir o controle ActiveX do Shockwave Flash no seu prprio aplicativo Windows Forms, adicione-o primeiro caixa de ferramentas do Microsoft Visual Studio. Para adicionar o controle caixa de ferramentas: 1 Abra a caixa de ferramentas do Visual Studio.
2 Clique com o boto direito do mouse na seo Windows Forms no Visual Studio 2003 ou em qualquer seo no

Visual Studio 2005. No menu de contexto, selecione Adicionar/Remover Itens no Visual Studio 2003 (Escolher Itens... no Visual Studio 2005). A caixa de dilogo Personalizar caixa de ferramentas (2003)/Escolher itens da caixa de ferramentas (2005) exibida.

PROGRAMAO DO ACTIONSCRIPT 3.0 700


Uso da API externa

3 Selecione a aba Componentes COM, que lista todos os componentes COM disponveis no seu computador,

incluindo o controle ActiveX do Flash Player.


4 Navegue at Objeto do Shockwave Flash e selecione-o.

Se esse item no estiver listado, verifique se o controle ActiveX do Flash Player est instalado no seu sistema.

Noes bsicas sobre a comunicao do ActionScript com o continer ActiveX


A comunicao feita com a API externa e um aplicativo de continer ActiveX funciona como a comunicao com um navegador da Web, com uma diferena importante. Conforme descrito anteriormente, quando o ActionScript se comunica com um navegador da Web, contanto que o navegador queira, as funes so chamadas diretamente; os detalhes de como as chamadas e respostas de funo so formatadas para serem transmitidas entre o player e o navegador so ocultos. No entanto, quando a API externa usada para se comunicar com um aplicativo de continer ActiveX, o Flash Player envia mensagens (chamadas de funo e valores de retorno) ao aplicativo em um formato XML especfico e espera chamadas de funo e valores de retorno do aplicativo de continer para usar o mesmo formato XML. O desenvolvedor do aplicativo de continer ActiveX deve gravar o cdigo entendido e pode criar chamadas de funo e respostas no formato apropriado. O exemplo do Introvert IM em C# inclui um conjunto de classes que permitem evitar mensagens de formatao; em vez disso, voc pode trabalhar com tipos de dados padro ao chamar funes do ActionScript e receber chamadas de funo do ActionScript. A classe ExternalInterfaceProxy, junto com outras classes auxiliares, fornece essa funcionalidade e pode ser reutilizada em qualquer projeto .NET para facilitar a comunicao da API externa. As sees de cdigo a seguir, extradas do formulrio do aplicativo principal (AppForm.cs), demonstram a interao simplificada que atingida com a classe ExternalInterfaceProxy:
public class AppForm : System.Windows.Forms.Form { ... private ExternalInterfaceProxy proxy; ... public AppForm() { ... // Register this app to receive notification when the proxy receives // a call from ActionScript. proxy = new ExternalInterfaceProxy(IntrovertIMApp); proxy.ExternalInterfaceCall += new ExternalInterfaceCallEventHandler(proxy_ExternalInterfaceCall); ... } ...

O aplicativo declara e cria uma ocorrncia de ExternalInterfaceProxy chamada proxy, transmitindo uma referncia ao controle ActiveX do Shockwave Flash que est na interface de usurio (IntrovertIMApp). Em seguida, o cdigo registra o mtodo proxy_ExternalInterfaceCall() para receber o evento ExternalInterfaceCall do proxy. Esse evento enviado pela classe ExternalInterfaceProxy quando uma chamada de funo vem do Flash Player. A inscrio nesse evento o modo como o cdigo C# recebe e responde s chamadas de funo do ActionScript. Quando uma chamada de funo vem do ActionScript, a ocorrncia de ExternalInterfaceProxy (proxy) recebe a chamada, a converte em formato XML e notifica os objetos que so ouvintes do evento ExternalInterfaceCall do proxy. No caso da classe AppForm, o mtodo proxy_ExternalInterfaceCall() manipula esse evento da seguinte forma:

PROGRAMAO DO ACTIONSCRIPT 3.0 701


Uso da API externa

/// <summary> /// Called by the proxy when an ActionScript ExternalInterface call /// is made by the SWF /// </summary> private object proxy_ExternalInterfaceCall(object sender, ExternalInterfaceCallEventArgs e) { switch (e.FunctionCall.FunctionName) { case "isReady": return isReady(); case "setSWFIsReady": setSWFIsReady(); return null; case "newMessage": newMessage((string)e.FunctionCall.Arguments[0]); return null; case "statusChange": statusChange(); return null; default: return null; } } ...

O mtodo transmitido como uma ocorrncia de ExternalInterfaceCallEventArgs, chamada e neste exemplo. Esse objeto tem uma propriedade FunctionCall que uma ocorrncia da classe ExternalInterfaceCall. Uma ocorrncia de ExternalInterfaceCall um simples objeto de valor com duas propriedades. A propriedade
FunctionName contm o nome de funo especificado na instruo ExternalInterface.Call() do ActionScript.

Se algum parmetro for adicionado ao ActionScript, esses parmetros sero includos na propriedade Arguments do objeto ExternalInterfaceCall. Nesse caso, o mtodo que manipula o evento simplesmente uma instruo switch que age como um gerenciador de trfego. O valor da propriedade FunctionName (e.FunctionCall.FunctionName) determina qual mtodo da classe AppForm chamado. As ramificaes da instruo switch na listagem de cdigo anterior demonstram cenrios comuns de chamada de mtodo. Por exemplo, qualquer mtodo deve retornar um valor para o ActionScript (como a chamada do mtodo isReady()) ou deve retornar null (conforme visto nas outras chamadas de mtodo). O acesso aos parmetros transmitidos do ActionScript demonstrado na chamada do mtodo newMessage() (que transmitido como o parmetro e.FunctionCall.Arguments[0], o primeiro elemento da matriz Arguments). Chamar uma funo do ActionScript em C# usando a classe ExternalInterfaceProxy ainda mais simples do que receber uma chamada de funo a partir do ActionScript. Para chamar uma funo do ActionScript, use o mtodo Call() da ocorrncia de ExternalInterfaceProxy do seguinte modo:

PROGRAMAO DO ACTIONSCRIPT 3.0 702


Uso da API externa

/// <summary> /// Called when the "Send" button is pressed; the value in the /// MessageText text field is passed in as a parameter. /// </summary> /// <param name="message">The message to send.</param> private void sendMessage(string message) { if (swfReady) { ... // Call the newMessage function in ActionScript. proxy.Call("newMessage", message); } } ... /// <summary> /// Call the ActionScript function to get the current "availability" /// status and write it into the text field. /// </summary> private void updateStatus() { Status.Text = (string)proxy.Call("getStatus"); } ... }

Como mostra este exemplo, o mtodo Call() da classe ExternalInterfaceProxy muito parecido com seu correspondente no ActionScript, ExternalInterface.Call(). O primeiro parmetro uma string, o nome da funo a ser chamada. Todos os parmetros adicionais (no mostrados aqui) so transmitidos junto com a funo do ActionScript. Se a funo do ActionScript retornar um valor, esse valor ser retornado pelo mtodo Call() (conforme visto no exemplo anterior).

Dentro da classe ExternalInterfaceProxy


Usar um envoltrio de proxy em torno do controle ActiveX talvez nem sempre seja prtico ou voc talvez queira gravar sua prpria classe de proxy (por exemplo, em uma linguagem de programao diferente ou visando uma plataforma diferente). Embora nem todos os detalhes da criao do proxy sejam explicados aqui, til entender o funcionamento da classe de proxy desse exemplo. Use o mtodo CallFunction() do controle ActiveX do Shockwave Flash para chamar uma funo do ActionScript a partir do continer ActiveX usando a API externa. Isso mostrado no trecho do mtodo Call() da classe ExternalInterfaceProxy:
// Call an ActionScript function on the SWF in "_flashControl", // which is a Shockwave Flash ActiveX control. string response = _flashControl.CallFunction(request);

Neste trecho de cdigo, _flashControl o controle ActiveX do Shockwave Flash. As chamadas de funo do ActionScript so feitas com o mtodo CallFunction(). Esse mtodo assume um parmetro (request no exemplo), que uma string que contm as instrues em formato XML, incluindo o nome da funo do ActionScript a ser chamada e os parmetros. Todos os valores retornados do ActionScript so codificados como uma string XML e enviados de volta como o valor de retorno da chamada CallFunction(). Neste exemplo, essa string XML armazenada na varivel response.

PROGRAMAO DO ACTIONSCRIPT 3.0 703


Uso da API externa

O recebimento de uma chamada de funo do ActionScript um processo de vrias etapas. As chamadas de funo do ActionScript fazem com que o controle ActiveX do Shockwave Flash envie o evento FlashCall, de modo que a classe (como a classe ExternalInterfaceProxy) que deve receber as chamadas de um arquivo SWF precisa definir um manipulador para esse evento. Na classe ExternalInterfaceProxy, a funo do manipulador de eventos chamada de _flashControl_FlashCall(), e registrada para ouvir o evento no construtor da classe do seguinte modo:
private AxShockwaveFlash _flashControl; public ExternalInterfaceProxy(AxShockwaveFlash flashControl) { _flashControl = flashControl; _flashControl.FlashCall += new _IShockwaveFlashEvents_FlashCallEventHandler(_flashControl_FlashCall); } ... private void _flashControl_FlashCall(object sender, _IShockwaveFlashEvents_FlashCallEvent e) { // Use the event object's request property ("e.request") // to execute some action. ... // Return a value to ActionScript; // the returned value must first be encoded as an XML-formatted string. _flashControl.SetReturnValue(encodedResponse); }

O objeto de evento (e) tem uma propriedade request (e.request) que uma string que contm informaes sobre a chamada de funo, como o nome da funo e os parmetros, em formato XML. Essas informaes podem ser usadas pelo continer para determinar o cdigo a ser executado. Na classe ExternalInterfaceProxy, a solicitao convertida do formato XML em um objeto ExternalInterfaceCall, que fornece as mesmas informaes de forma mais acessvel. O mtodo SetReturnValue() do controle ActiveX usado para retornar um resultado de funo para o chamador do ActionScript; novamente, o parmetro resultante deve ser codificado no formato XML usado pela API externa. A comunicao entre o ActionScript e um aplicativo que hospeda o controle ActiveX do Shockwave Flash usa um formato XML especfico para codificar chamadas e valores de funo. No exemplo do Introvert IM em C#, a classe ExternalInterfaceProxy possibilita isso para o cdigo no formulrio do aplicativo a ser aplicado diretamente nos valores enviados ou recebidos do ActionScript, e ignora os detalhes do formato XML usado pelo Flash Player. Para fazer isso, a classe ExternalInterfaceProxy usa os mtodos da classe ExternalInterfaceSerializer para realmente converter as mensagens XML em objetos .NET. A classe ExternalInterfaceSerializer tem quatro mtodos pblicos:

EncodeInvoke(): codifica um nome de funo e um C# ArrayList de argumentos no formato XML apropriado. EncodeResult(): codifica um valor de resultado no formato XML apropriado. DecodeInvoke(): decodifica uma chamada de funo do ActionScript. A propriedade request do objeto de evento FlashCall transmitida para o mtodo DecodeInvoke() e converte a chamada em um objeto ExternalInterfaceCall. DecodeResult(): decodifica o XML recebido em resultado da chamada de uma funo do ActionScript.

Esses mtodos codificam valores C# no formato XML da API externa e decodificam o XML em objetos C#. Para obter informaes sobre o formato XML usado pelo Flash Player, consulte O formato XML da API externa na pgina 691.

704

Captulo 32: Segurana do Flash Player


Segurana uma preocupao principal da Adobe, dos usurios, dos proprietrios de site e dos desenvolvedores de contedo. Por esse motivo, o Adobe Flash Player inclui um conjunto de regras de segurana e controles para proteger o usurio, o proprietrio de site e o desenvolvedor de contedo. Este captulo discute como trabalhar com o modelo de segurana do Flash Player ao desenvolver aplicativos. Neste captulo, presume-se que todos os arquivos SWF discutidos so publicados com o ActionScript 3.0 e executados no Flash Player 9.0.124.0 ou posterior, a menos que indicado de outra forma. Este captulo apenas uma viso geral de segurana; ele no tenta explicar de maneira abrangente todos os detalhes de implementao, cenrios de uso ou ramificaes do uso de determinadas APIs. Para obter uma discusso mais detalhada sobre conceitos de segurana do Flash Player, consulte o tpico Segurana do Centro de desenvolvedores do Flash Player, em www.adobe.com/go/devnet_security_br. Para obter informaes sobre problemas de segurana do Adobe AIR, consulte o captulo Segurana do AIR, em http://www.adobe.com/go/learn_air_flash_br.

Viso geral da segurana do Flash Player


Grande parte da segurana do Flash Player baseada no domnio de origem dos arquivos SWF, mdia e outros ativos carregados. Um arquivo SWF de um domnio especfico da Internet, como www.example.com, sempre pode acessar todos os dados daquele domnio. Esses ativos so colocados no mesmo agrupamento de segurana, conhecido como uma caixa de proteo de segurana. (Para obter mais informaes, consulte Caixas de proteo de segurana na pgina 706.) Por exemplo, um arquivo SWF pode carregar arquivos SWF, bitmaps, udio, arquivos de texto e qualquer outro ativo de seu prprio domnio. Alm disso, cross-scripting entre dois arquivos SWF do mesmo domnio sempre permitido, desde que os dois arquivos sejam escritos usando o ActionScript 3.0. Cross-scripting a capacidade de um arquivo SWF de usar o ActionScript para acessar propriedades, mtodos e objetos em outro arquivo SWF. O cross-scripting no suportado entre arquivos SWF escritos usando o ActionScript 3.0 e verses anteriores do ActionScript. No entanto esses arquivos podem se comunicar usando a classe LocalConnection. Alm disso, a capacidade de um arquivo SWF de executar cross-script de arquivos SWF do ActionScript 3.0 de outros domnios e de carregar dados de outros domnios proibida por padro. No entanto esse acesso pode ser concedido com uma chamada para o mtodo Security.allowDomain() no arquivo SWF carregado. Para obter mais informaes, consulte Cross-scripting na pgina 721. Por padro, as seguintes regras bsicas de segurana sempre se aplicam:

Recursos na mesma caixa de proteo de segurana sempre podem acessar um ao outro. Arquivos SWF em uma caixa de proteo remota nunca acessam arquivos e dados locais.
O Flash Player considera os seguintes domnios como sendo domnios individuais e configura caixas de proteo de segurana individuais para cada um:

http://example.com http://www.example.com http://store.example.com https://www.example.com

PROGRAMAO DO ACTIONSCRIPT 3.0 705


Segurana do Flash Player

http://192.0.34.166

Mesmo que um domnio nomeado, como http://example.com, mapeie para um endereo IP especfico, como http://192.0.34.166, o Flash Player configurar caixas de proteo de segurana separadas para cada um. Existem dois mtodos bsicos que podem ser usados por um desenvolvedor para conceder acesso a um arquivo SWF a ativos das caixas de proteo diferente daquela do arquivo SWF:

O mtodo Security.allowDomain() (consulte Controles de autor (desenvolvedor) na pgina 714) O arquivo de poltica da URL (consulte Controles de site (arquivos de poltica) na pgina 711)
No modelo de segurana do Flash Player, h uma distino entre carregamento de contedo e extrao ou acesso a dados. Contedo definido como mdia, incluindo mdia visual que o Flash Player pode exibir, udio, vdeo ou um arquivo SWF que inclui mdia exibida. Dados so definidos como algo que acessvel apenas ao cdigo ActionScript. Contedo e dados so carregados de maneiras diferentes.

Carregamento de contedo possvel carregar contedo usando classes, como as classes Loader, Sound e
NetStream.

Extrao de dados possvel extrair dados de contedo de mdia carregada usando objetos Bitmap, o mtodo
BitmapData.draw(), a propriedade Sound.id3 ou o mtodo SoundMixer.computeSpectrum().

Acesso a dados possvel acessar dados diretamente carregando-os de um arquivo externo (como um arquivo
XML) usando classes, como as classes URLStream, URLLoader, Socket e XMLSocket. O modelo de segurana do Flash Player define diferentes regras para carregamento de contedo e acesso a dados. Em geral, h menos restries no carregamento de contedo do que no acesso a dados. Em geral, o contedo (arquivos SWF, bitmaps, arquivos mp3 e vdeos) pode ser carregado de qualquer lugar, mas se o contedo for de um domnio diferente daquele do arquivo SWF carregado, ele ser particionado em uma caixa de proteo de segurana separada. H algumas barreiras no que diz respeito ao carregamento de contedo:

Por padro, arquivos SWF locais (carregados de um endereo que no seja da rede, como do disco rgido de um
usurio) so classificados na caixa de proteo local com sistema de arquivos. Esses arquivos no podem carregar contedo da rede. Para obter mais informaes, consulte Caixas de proteo locais na pgina 706.

Servidores de protocolo RTMP podem limitar o acesso ao contedo. Para obter mais informaes,
consulteContedo entregue usando servidores RMTP na pgina 721. Se a mdia carregada for uma imagem, udio ou vdeo, seus dados, como dados de pixel e dados de som, podero ser acessados por um arquivo SWF fora de sua caixa de proteo de segurana apenas se o domnio daquele arquivo SWF tiver sido includo em um arquivo de poltica de URL no domnio de origem da mdia. Para obter detalhes, consulte Acesso mdia carregada como dados na pgina 724. Outras formas de dados carregados incluem arquivos de texto ou XML que so carregados com um objeto URLLoader. Novamente nesse caso, para acessar quaisquer dados de outra caixa de proteo de segurana, permisso deve ser concedida por meio de um arquivo de poltica de URL no domnio de origem. Para obter detalhes, consulte Uso de URLLoader e URLStream na pgina 727.

PROGRAMAO DO ACTIONSCRIPT 3.0 706


Segurana do Flash Player

Caixas de proteo de segurana


Computadores clientes podem obter arquivos SWF individuais de vrias origens, como de sites externos ou de um sistema de arquivos local. O Flash Player atribui arquivos SWF e outros recursos individualmente, como objetos compartilhados, bitmaps, sons, vdeos e arquivos de dados, a caixas de proteo de segurana com base em sua origem quando eles so carregadas no Flash Player. As sees a seguir descrevem as regras reforadas pelo Flash Player que controlam o que um arquivo SWF dentro de uma determinada caixa de proteo pode acessar. Para obter mais informaes sobre a segurana do Flash Player, consulte o tpico Segurana do Centro de desenvolvedores do Flash Player, em www.adobe.com/go/devnet_security_br.

Caixas de proteo remotas


O Flash Player classifica ativos (incluindo arquivos SWF) da Internet em caixas de proteo separadas que correspondem a seus domnios de origem do site. Por padro, esses arquivos tm permisso para acessar quaisquer recursos de seu prprio servidor. Arquivos SWF remotos podem receber permisso para acessar dados adicionais de outros domnios por permisses explcitas de autor e de site, como arquivos de poltica de URL e o mtodo Security.allowDomain(). Para obter detalhes, consulte Controles de site (arquivos de poltica) na pgina 711 eControles de autor (desenvolvedor) na pgina 714. Arquivos SWF remotos no podem carregar nenhum recurso ou arquivo local. Para obter mais informaes sobre a segurana do Flash Player, consulte o tpico Segurana do Centro de desenvolvedores do Flash Player, em www.adobe.com/go/devnet_security_br.

Caixas de proteo locais


Arquivo local descreve qualquer arquivo que referenciado usando o protocolo file: ou um caminho UNC (Conveno de nomenclatura universal). Arquivos SWF locais so colocados em uma de quatro caixas de proteo locais:

A caixa de proteo local com sistema de arquivos por motivos de segurana, o Flash Player coloca todos os
arquivos SWF e ativos locais na caixa de proteo local com sistema de arquivos, por padro. Nessa caixa de proteo, arquivos SWF podem ler arquivos locais (usando a classe URLLoader, por exemplo), mas no podem se comunicar com a rede de nenhuma maneira. Isso garante ao usurio que os dados locais no podem ser vazados para a rede ou, de outra forma, compartilhados de maneira inadequada.

A caixa de proteo local com a rede ao compilar um arquivo SWF, possvel especificar que ele tem acesso
rede quando executado como um arquivo local (consulte Configurao de tipo de caixa de proteo de arquivos SWF locais na pgina 707). Esses arquivos so colocados na caixa de proteo local com a rede. Arquivos SWF que so atribudos caixa de proteo local com a rede perdem o acesso a seus arquivos locais. Em troca, os arquivos SWF tm permisso para acessar dados da rede. No entanto um arquivo SWF local com a rede ainda no tem permisso para ler nenhum dado derivado da rede a menos que permisses estejam presentes para aquela ao, por meio de um arquivo de poltica de URL ou de uma chamada ao mtodo Security.allowDomain(). Para conceder essa permisso, um arquivo de poltica de URL deve conceder permisso a todos os domnios usando <allowaccess-from domain="*"/> ou usando Security.allowDomain("*"). Para obter informaes, consulteControles de site (arquivos de poltica) na pgina 711 eControles de autor (desenvolvedor) na pgina 714.

PROGRAMAO DO ACTIONSCRIPT 3.0 707


Segurana do Flash Player

A caixa de proteo local confivel arquivos SWF locais que esto registrados como confiveis (pelos usurios
ou pelos programas instaladores) so colocados na caixa de proteo local confivel. Administradores do sistema e usurios tambm tm a capacidade de reatribuir (mover) um arquivo SWF local para ou de um caixa de proteo local confivel com base em consideraes de segurana (consulteControles de administrador na pgina 708 e Controles de usurio na pgina 710). Arquivos SWF atribudos caixa de proteo local confivel podem interagir com quaisquer outros arquivos SWF e carregar dados de qualquer lugar (remoto ou local).

A caixa de proteo do aplicativo AIR esta caixa de proteo contm contedo instalado com o aplicativo AIR
em execuo. Por padro, os arquivos na caixa de proteo do aplicativo AIR podem executar cross-script de qualquer arquivo em qualquer domnio. No entanto, arquivos fora da caixa de proteo do aplicativo AIR no tm permisso para executar cross-script no arquivo AIR. Por padro, os arquivos na caixa de proteo do aplicativo AIR podem carregar contedo e dados de qualquer domnio. A comunicao entre as caixas de proteo local com rede e local com sistema de arquivos, bem como a comunicao entre as caixas de proteo remota e local com sistema de arquivos, estritamente proibida. Permisso para essa comunicao no pode ser concedida por um aplicativo executado no Flash Player ou por um usurio ou administrador. Script em qualquer direo entre arquivos HTML locais e arquivos SWF locais, por exemplo, usando a classe ExternalInterface, exige que tanto os arquivos HTML quanto os arquivos SWF envolvidos estejam na caixa de proteo confivel local. Isso ocorre porque os modelos de segurana locais de navegadores diferem do modelo de segurana local do Flash Player. Arquivos SWF na caixa de proteo local com rede no podem carregar arquivos SWF na caixa de proteo local com sistema de arquivos. Arquivos SWF na caixa de proteo local com sistema de arquivos no podem carregar arquivos SWF na caixa de proteo local com rede.

Configurao de tipo de caixa de proteo de arquivos SWF locais


possvel configurar um arquivo SWF para a caixa de proteo local com sistema de arquivos ou a caixa de proteo local com rede definindo-se as configuraes de publicao do documento na Ferramenta de autoria. Um usurio final ou o administrador de um computador pode especificar que um arquivo SWF local confivel, permitindo que ele carregue dados de todos os domnios, tanto locais quanto de rede. Isso especificado nos diretrios Global Flash Player Trust e User Flash Player Trust. Para obter mais informaes, consulte Controles de administrador na pgina 708 e Controles de usurio na pgina 710. Para obter mais informaes sobre caixas de proteo locais, consulte Caixas de proteo locais na pgina 706.

A propriedade Security.sandboxType
Um autor de um arquivo SWF pode usar a propriedade esttica somente leitura Security.sandboxType para determinar o tipo de caixa de proteo qual o Flash Player atribuiu o arquivo SWF. A classe Security inclui constantes que representam valores possveis da propriedade Security.sandboxType, da seguinte maneira:

Security.REMOTE o arquivo SWF proveniente de uma URL da Internet e opera de acordo com as regras da

caixa de proteo com base em domnio.


Security.LOCAL_WITH_FILE o arquivo SWF um arquivo local, mas no foi considerado como confivel pelo

usurio e no foi publicado com uma designao de rede. O arquivo SWF pode ler de fontes de dados locais, mas no pode se comunicar com a Internet.

Security.LOCAL_WITH_NETWORK o arquivo SWF um arquivo local e no foi considerado como confivel pelo

usurio, mas foi publicado com uma designao de rede. O arquivo SWF pode se comunicar com a Internet mas no pode ler de fontes de dados locais.

PROGRAMAO DO ACTIONSCRIPT 3.0 708


Segurana do Flash Player

Security.LOCAL_TRUSTED o arquivo SWF um arquivo local e foi considerado como confivel pelo usurio, seja usando o Gerenciador de configuraes ou um arquivo de configurao de confiana do Flash Player. O arquivo SWF pode ler de fontes de dados locais e se comunicar com a Internet. Security.APPLICATION o arquivo SWF est em execuo em um aplicativo AIR e foi instalado com o pacote

(arquivo AIR) daquele aplicativo. Por padro, os arquivos na caixa de proteo do aplicativo AIR podem executar cross-script em qualquer arquivo em qualquer domnio. No entanto, arquivos fora da caixa de proteo do aplicativo AIR no tm permisso para executar cross-script no arquivo AIR. Por padro, os arquivos na caixa de proteo do aplicativo AIR podem carregar contedo e dados de qualquer domnio.

Controles de permisso
O modelo de segurana de tempo de execuo do cliente Flash Player foi designado em torno de recursos que so objetos, como arquivos SWF, dados locais e URLs da Internet. Participantes so as partes que so as proprietrias ou que usam esses recursos. Os participantes podem exercer controles (configuraes de segurana) sobre seus prprios recursos e cada recurso tem quatro participantes. O Flash Player refora estritamente uma hierarquia de autoridade para esses controles, conforme mostrado na ilustrao a seguir:
Configuraes do administrador (Instituio do usurio)

Configuraes do usurio

Configuraes do site

Configuraes do autor

Hierarquia de controles de segurana

Isso significa, por exemplo, que se um administrador restringir o acesso a um recurso, nenhum outro participante poder substituir essa restrio.

Controles de administrador
Um usurio administrativo de um computador (um usurio que fez logon com direitos administrativos) pode aplicar configuraes de segurana do Flash Player que afetam todos os usurios do computador. Em um ambiente no empresarial, como em um computador domstico, normalmente h um usurio que tambm tem acesso administrativo. Mesmo em um ambiente empresarial, usurios individuais podem ter direitos administrativos no computador. H dois tipos de controles de usurio administrativo:

O arquivo mms.cfg O diretrio Global Flash Player Trust

PROGRAMAO DO ACTIONSCRIPT 3.0 709


Segurana do Flash Player

O arquivo mms.cfg
O arquivo mms.cfg um arquivo de texto que permite que os administradores ativem ou restrinjam o acesso a vrios recursos. Quando o Flash Player iniciado, l as configuraes de segurana desse arquivo e as usa para limitar a funcionalidade. O arquivo mms.cfg inclui configuraes que o administrador usa para gerenciar recursos, como controles de privacidade, segurana de arquivo local, conexes de soquete, entre outros. Um arquivo SWF pode acessar algumas informaes sobre capacidades que foram desativadas chamando as propriedades Capabilities.avHardwareDisable e Capabilities.localFileReadDisable. No entanto a maioria das configuraes no arquivo mms.cfg no podem ser consultadas no ActionScript. Para reforar as polticas de segurana e de privacidade independentemente do aplicativo para um computador, o arquivo mms.cfg deve ser modificado apenas por administradores do sistema. O arquivo mms.cfg no deve ser usado por instaladores de aplicativos. Embora um instalador que executa com privilgios administrativos possa modificar o contedo do arquivo mms.cfg, a Adobe considera esse uso como uma violao da confiana do usurio e recomenda que os criadores de instaladores nunca modifiquem o arquivo mms.cfg. O arquivo mms.cfg armazenado no seguinte local:

Windows: system\Macromed\Flash\mms.cfg
(por exemplo, C:\WINDOWS\system32\Macromed\Flash\mms.cfg)

Mac: app support/Macromedia/mms.cfg


(por exemplo, /Library/Application Support/Macromedia/mms.cfg) Para obter mais informaes sobre o arquivo mms.cfg, consulte o Guia de administrao do Flash Player, em www.adobe.com/go/flash_player_admin_br.

O diretrio Global Flash Player Trust


Usurios administrativos e aplicativos de instalador podem registrar arquivos SWF locais especificados como confiveis para todos os usurios. Esses arquivos SWF so atribudos caixa de proteo confivel local. Eles podem interagir com quaisquer outros arquivos SWF e podem carregar dados de qualquer lugar remoto ou local. Os arquivos so designados como confiveis no diretrio Global Flash Player Trust, no seguinte local:

Windows: system\Macromed\Flash\FlashPlayerTrust
(por exemplo, C:\WINDOWS\system32\Macromed\Flash\FlashPlayerTrust)

Mac: app support/Macromedia/FlashPlayerTrust


(por exemplo, /Library/Application Support/Macromedia/FlashPlayerTrust) O diretrio Flash Player Trust pode conter qualquer nmero de arquivos de texto, cada um dos quais lista caminhos confiveis, com um caminho por linha. Cada caminho pode ser um arquivo SWF individual, um arquivo HTML ou um diretrio. Linhas de comentrios comeam com o smbolo #. Por exemplo, um arquivo de configurao de confiana do Flash Player que contm o texto a seguir concede status confivel a todos os arquivos no diretrio especificado e em todos os subdiretrios:
# Trust files in the following directories: C:\Documents and Settings\All Users\Documents\SampleApp

Os caminhos listados em um arquivo de configurao de confiana devem sempre ser caminhos locais ou caminhos de rede SMB. Qualquer caminho HTTP em um arquivo de configurao confivel ignorado. Apenas arquivos locais podem ser confiveis. Para evitar conflitos, d a cada arquivo de configurao confivel um nome de arquivo correspondente ao aplicativo de instalao e use uma extenso de arquivo .cfg.

PROGRAMAO DO ACTIONSCRIPT 3.0 710


Segurana do Flash Player

Como um desenvolvedor que distribui um arquivo SWF executado localmente por meio de um aplicativo instalador, possvel fazer com que o aplicativo instalador adicione um arquivo de configurao ao diretrio Global Flash Player Trust, concedendo privilgios totais ao arquivo que voc est distribuindo. O aplicativo instalador deve ser executado por um usurio com direitos administrativos. Ao contrrio do arquivo ms.cfg, o diretrio Global Flash Player Trust includo com o objetivo de aplicativos instaladores concederem permisses de confiana. Os usurios administrativos e os aplicativos instaladores podem designar aplicativos locais confiveis usando o diretrio Global Flash Player Trust. Tambm h diretrios Flash Player Trust para usurios individuais (consulte Controles de usurio na pgina 710).

Controles de usurio
O Flash Player fornece trs mecanismos diferentes em nvel de usurio para definir permisses: a UI de Configuraes, o Gerenciador de configuraes e o diretrio User Flash Player Trust.

A UI de Configuraes e o Gerenciador de configuraes


A UI de Configuraes um mecanismo rpido e interativo para definir as configuraes de um domnio especfico. O Gerenciador de configuraes tem uma interface mais detalhada e permite fazer alteraes globais que afetam as permisses de muitos ou de todos os domnios. Alm disso, quando um arquivo SWG solicita uma nova permisso, exigindo a tomada de decises relativas a segurana ou privacidade durante a execuo, so exibidas caixas de dilogo nas quais os usurios podem ajustar algumas configuraes do Flash Player. O Gerenciador de configuraes e a UI de Configuraes oferecem opes relacionadas a segurana, como configuraes de cmera e microfone, configuraes de armazenamento de objetos compartilhados, configuraes relacionadas a contedo pr-existente etc. Nota: Qualquer configurao feita no arquivo mms.cfg (consulte Controles de administrador na pgina 708) no refletida no Gerenciador de configuraes. Para obter detalhes sobre o Gerenciador de configuraes, consulte www.adobe.com/go/settingsmanager_br.

O diretrio User Flash Player Trust


Usurios e aplicativos instaladores podem registrar arquivos SWF locais como confiveis. Esses arquivos SWF so atribudos caixa de proteo confivel local. Eles podem interagir com quaisquer outros arquivos SWF e podem carregar dados de qualquer lugar remoto ou local. Um usurio designa um arquivo como confivel no diretrio User Flash Player Trust, que est no mesmo diretrio que a rea de armazenamento de objetos compartilhados, nos seguintes locais (os locais so especficos do usurio atual):

Windows: app data\Macromedia\Flash Player\#Security\FlashPlayerTrust


(por exemplo, C:\Documents and Settings\JohnD\Application Data\Macromedia\Flash Player\#Security\FlashPlayerTrust no Windows XP ou C:\Users\JohnD\AppData\Roaming\Macromedia\Flash Player\#Security\FlashPlayerTrust no Windows Vista) No Windows, a pasta Application Data fica ocultada por padro. Para mostrar pastas e arquivos ocultos, selecione Meu computador para abrir o Windows Explorer, selecione Ferramentas > Opes de pasta e selecione a aba Exibir. Na aba Exibir, selecione o boto de opo Mostrar pastas e arquivos ocultos.

Mac: app data/Macromedia/Flash Player/#Security/FlashPlayerTrust


(por exemplo, /Users/JohnD/Library/Preferences/Macromedia/Flash Player/#Security/FlashPlayerTrust) Essas configuraes afetam apenas o usurio atual, no outros usurios que fazem logon no computador. Se um usurio sem direitos administrativos instalar um aplicativo em sua prpria parte do sistema, o diretrio User Flash Player Trust permitir que o instalador registre o aplicativo como confivel para aquele usurio.

PROGRAMAO DO ACTIONSCRIPT 3.0 711


Segurana do Flash Player

Como um desenvolvedor que distribui um arquivo SWF executado localmente por meio de um aplicativo instalador, voc pode fazer com que o aplicativo instalador adicione um arquivo de configurao ao diretrio User Flash Player Trust, concedendo privilgios totais ao arquivo que est distribuindo. Mesmo nessa situao, o arquivo do diretrio User Flash Player Trust considerado um controle de usurio, porque uma ao do usurio (instalao) o inicia. Tambm existe um diretrio Global Flash Player Trust, usado pelo usurio administrativo ou por instaladores para registrar um aplicativo para outros usurios de um computador (consulte Controles de administrador na pgina 708).

Controles de site (arquivos de poltica)


Para disponibilizar dados do servidor Web para arquivos SWF de outros domnios, crie um arquivo de poltica do servidor. Um arquivo de poltica um arquivo XML colocado em um local especfico no servidor. arquivos de poltica afetam o acesso a vrios ativos, incluindo os seguintes:

Dados em bitmaps, sons e vdeos Carregamento de arquivos de texto e XML Importao de arquivos SWF de outros domnios de segurana no domnio de segurana do arquivo SWF que est
sendo carregado

Acesso a soquete e conexes de soquete XML


Objetos ActionScript instanciam dois tipos diferentes de conexes de servidor: conexes de servidor com base em documento e conexes de soquete. Os objetos do ActionScript, como Loader, Sound, URLLoader e URLStream instanciam conexes de servidor com base em documento e esses objetos carregam um arquivo de uma URL. Os objetos Socket e XMLSocket do ActionScript fazem conexes de soquete que funcionam com fluxos de dados, no com documentos carregados. Como o Flash Player oferece suporte a dois tipos de conexes de servidor, h dois tipos de arquivos de poltica: arquivos de poltica de URL e arquivos de poltica de soquete.

Conexes com base em documento exigem arquivos de poltica de URL. Esses arquivos permitem que o servidor
indique que seus dados e documentos esto disponveis para arquivos SWF servidos em determinados domnios ou em todos os domnios.

Conexes de soquete exigem arquivos de poltica de soquetes que ativam a rede diretamente no nvel inferior do
soquete TCP usando as classes Socket e XMLSocket. O Flash Player exige que arquivos de poltica sejam transmitidos usando o mesmo protocolo que a tentativa de conexo quer usar. Por exemplo, quando voc coloca um arquivo de poltica no servidor HTTP, os arquivos SWF de outros domnios recebem permisso para carregar dados dele como um servidor HTTP. No entanto, se no fornecer um arquivo de poltica de soquete no mesmo servidor, voc estar proibindo que arquivos SWF de outros domnios se conectem ao servidor no nvel de soquete. Em outras palavras, o meio pelo qual um arquivo de poltica recuperado deve corresponder ao meio de conexo. O uso e a sintaxe do arquivo de poltica so discutidos brevemente no restante desta seo, pois eles se aplicam aos arquivos SWF publicados para o Flash Player 10. A implementao do arquivo de poltica um pouco diferente em verses anteriores do Flash Player, uma vez que verses sucessivas reforaram a segurana do Flash Player. Para obter informaes mais detalhadas sobre arquivos de poltica, consulte o tpico Alteraes em arquivos de poltica do Flash Player 9 do Centro de desenvolvedores do Flash Player, em www.adobe.com/go/devnet_security_br.

PROGRAMAO DO ACTIONSCRIPT 3.0 712


Segurana do Flash Player

arquivos de poltica mestre


Por padro, primeiro o Flash Player (e o contedo AIR que no est na caixa de proteo do aplicativo AIR) procura um arquivo de poltica de URL denominado crossdomain.xml no diretrio raiz do servidor e procura um arquivo de poltica de soquete na porta 843. Um arquivo em um desses locais chamado de arquivo de poltica mestre. No caso de conexes de soquete, o Flash Player tambm procura um arquivo de poltica de soquete na mesma porta que a conexo principal. No entanto, um arquivo de poltica encontrado naquela porta no considerado um arquivo de poltica mestre. Alm de especificar permisses de acesso, o arquivo de poltica mestre tambm pode conter uma instruo metapolicy. Uma metapoltica especifica quais locais podem conter arquivos de poltica. A metapoltica padro dos arquivos de poltica de URL somente mestre, o que significa que /crossdomain.xml o nico arquivo de poltica permitido no servidor. A metapoltica padro para arquivos de poltica de soquete all, o que significa que qualquer soquete no host pode servir um arquivo de poltica de soquete. Nota: No Flash Player 9 e anterior, a metapoltica padro de arquivos de poltica de URL era all, o que significa que qualquer diretrio pode conter um arquivo de poltica. Se voc implantou aplicativos que carregam arquivos de poltica de locais diferentes do arquivo padro /crossdomain.xml e se esses aplicativos estiverem executando agora no Flash Player 10, verifique se voc (ou outro administrador do servidor) modificou o arquivo de poltica mestre para permitir arquivos de poltica adicionais. Para obter informaes sobre como especificar uma metapoltica diferente, consulte o tpico Alteraes em arquivos de poltica do Flash Player 9 do Centro de desenvolvedores do Flash Player, em www.adobe.com/go/devnet_security_br. Um arquivo SWF pode verificar se existe um nome de arquivo de poltica diferente ou um local de diretrio diferente chamando o mtodo Security.loadPolicyFile(). No entanto, se o arquivo de poltica mestre no especificar que o local de destino pode servir arquivos de poltica, a chamada para loadPolicyFile() no ter nenhum efeito, mesmo que haja um arquivo de poltica naquele local. Chame loadPolicyFile() antes de tentar qualquer operao de rede que exija o arquivo de poltica. O Flash Player enfileira automaticamente solicitaes de rede por trs de tentativas do arquivo de poltica correspondente. Portanto, aceitvel, por exemplo, chamar Security.loadPolicyFile() imediatamente antes de iniciar uma operao de rede. Ao verificar um arquivo de poltica mestre, o Flash Player aguarda trs segundos por uma resposta do servidor. Se uma resposta no for recebida, o Flash Player assumir que no existe nenhum arquivo de poltica. No entanto no h nenhum valor de tempo limite padro para chamadas para loadPolicyFile(). O Flash Player assume que o arquivo que est chamando existe, e aguarda quanto tempo for necessrio para carreg-lo. Portanto, para verificar se um arquivo de poltica mestre est carregado, use loadPolicyFile() para cham-lo explicitamente. Mesmo que o mtodo seja denominado Security.loadPolicyFile(), um arquivo de poltica no ser carregado at que uma chamada de rede que exija um arquivo de poltica seja emitida. Chamadas para loadPolicyFile() simplesmente informam ao Flash Player onde procurar por arquivos de poltica quando eles so necessrios. No possvel receber notificao de quando uma solicitao de arquivo de poltica iniciada ou concluda e no h motivo para isso. O Flash Player executa verificaes de polticas assincronamente e aguarda automaticamente para iniciar conexes at aps o xito das verificaes do arquivo de poltica. As sees a seguir contm informaes que se aplicam apenas a arquivos de poltica de URL. Para obter mais informaes sobre arquivos de poltica de soquete, consulte Conexo a soquetes na pgina 727.

Escopo do arquivo de poltica de URL


O arquivo de poltica de URL se aplica apenas ao diretrio do qual ele carregado e a seus diretrios filho. Um arquivo de poltica no diretrio raiz se aplica ao todo o servidor. Um arquivo de poltica carregado de um subdiretrio arbitrrio aplica-se apenas quele diretrio e a seus subdiretrios.

PROGRAMAO DO ACTIONSCRIPT 3.0 713


Segurana do Flash Player

Um arquivo de poltica afeta o acesso somente ao servidor especfico onde ele reside. Por exemplo, um arquivo de poltica localizado em https://www.adobe.com:8080/crossdomain.xml aplica-se apenas a chamadas de carregamento de dados feitas para www.adobe.com por HTTPS na porta 8080.

Especificao de permisses de acesso em um arquivo de poltica de URL


Um arquivo de poltica contm uma nica tag <cross-domain-policy> que, por sua vez, contm zero ou mais tags <allow-access-from>. Cada tag <allow-access-from> contm um atributo, domain, que especifica um endereo IP exato, um domnio exato ou um domnio curinga (qualquer domnio). Os domnios curinga so indicados de duas maneiras:

Por um nico asterisco (*), que corresponde a todos os domnios e a todos os endereos IP. Por um asterisco seguido por um sufixo, que corresponde apenas aos domnios que terminam com o sufixo
especificado. Sufixos devem comear com um ponto. No entanto domnios curinga com sufixos podem corresponder a domnios que consistem apenas no sufixo sem o ponto inicial. Por exemplo, xyz.com considerado como parte de *.xyz.com. Curingas no so permitidos em especificaes de domnios IP. O exemplo a seguir mostra um arquivo de poltica de URL que permite acesso a arquivos SWF originados de *.example.com, www.friendOfExample.com e 192.0.34.166:
<?xml version="1.0"?> <cross-domain-policy> <allow-access-from domain="*.example.com" /> <allow-access-from domain="www.friendOfExample.com" /> <allow-access-from domain="192.0.34.166" /> </cross-domain-policy>

Se voc especificar um endereo IP, o acesso ser concedido somente a arquivos SWF carregados daquele endereo IP usando a sintaxe IP (por exemplo, http://65.57.83.12/flashmovie.swf). O acesso no concedido a arquivos SWF que usam a sintaxe de nome de domnio. O Flash Player no executa resoluo de DNS. possvel permitir acesso a documentos originrios de qualquer domnio, conforme mostrado no exemplo a seguir:
<?xml version="1.0"?> <!-- http://www.foo.com/crossdomain.xml --> <cross-domain-policy> <allow-access-from domain="*" /> </cross-domain-policy>

Cada tag <allow-access-from> tambm tem o atributo opcional secure que padronizado como true. Se o arquivo de poltica estiver em um servidor HTTPS e voc quiser permitir que arquivos SWF em um servidor no-HTTPS carreguem dados do servidor HTTPS, poder definir o atributo como false. A configurao do atributo secure como false pode comprometer a segurana oferecida pelo HTTPS. Especificamente, a configurao desse atributo como false abre contedo de segurana a ataques por falsificao. A Adobe recomenda enfaticamente que voc no defina o atributo secure como false. Se os dados a serem carregados estiverem em um servidor HTTPS, mas o carregamento do arquivo SWF estiver em um servidor HTTP, a Adobe recomenda mover o arquivo SWF que est sendo carregado para um servidor HTTPS. Fazer isso permite manter todas as cpias de seus dados seguras sob a proteo de HTTPS. No entanto, se voc decidir que deve manter o arquivo SWF que est sendo carregado em um servidor HTTP, adicione o atributo secure="false" tag <allow-access-from>, conforme mostrado no cdigo a seguir:
<allow-access-from domain="www.example.com" secure="false" />

PROGRAMAO DO ACTIONSCRIPT 3.0 714


Segurana do Flash Player

Outro elemento que pode ser usado para permitir acesso a tag allow-http-request-headers-from. Esse elemento concede a um cliente, que hospeda contedo de outro domnio, permisso para enviar cabealhos definidos pelo usurio ao seu domnio. Enquanto a tag <allow-access-from> concede a outros domnios permisso para enviar dados ao seu domnio, a tag allow-http-request-headers-from concede a outros domnios permisso para enviar dados a seu domnio na forma de cabealhos. No exemplo a seguir, qualquer domnio tem permisso para enviar o cabealho SOAPAction ao domnio atual:
<cross-domain-policy> <allow-http-request-headers-from domain="*" headers="SOAPAction"/> </cross-domain-policy>

Se a instruo allow-http-request-headers-from estiver no arquivo de poltica mestre, ela ser aplicada a todos os diretrios no host. Caso contrrio, ela ser aplicada apenas ao diretrio e subdiretrios do arquivo de poltica que contm a instruo.

Pr-carregamento de arquivos de poltica


O carregamento de dados de um servidor ou a conexo a um soquete uma operao assncrona. O Flash Player simplesmente aguarda que o download do arquivo de poltica seja concludo antes de iniciar a operao principal. No entanto, a extrao de dados de pixels de imagens ou a extrao de dados de amostra de sons uma operao sncrona. O arquivo de poltica deve ser carregado para que os dados possam ser extrados. Ao carregar a mdia, especifique que ela verifique a existncia de um arquivo de poltica:

Ao usar o mtodo Loader.load(), defina a propriedade checkPolicyFile do parmetro context, que um


objeto LoaderContext.

Ao incorporar uma imagem em um arquivo de texto usando a tag <img>, defina o atributo checkPolicyFile da
tag <img> como "true", da seguinte maneira:
<img checkPolicyFile = "true" src = "example.jpg">

Ao usar o mtodo Sound.load(), defina a propriedade checkPolicyFile do parmetro context, que um


objeto SoundLoaderContext.

Ao usar a classe NetStream, defina a propriedade checkPolicyFile do objeto NetStream.


Ao definir um desses parmetros, o Flash Player primeiro verifica se h qualquer arquivo de poltica que j foi baixado naquele domnio. Em seguida, ele procura o arquivo de poltica no local padro do servidor, verificando as instrues <allow-access-from> e a presena de uma metapoltica. Finalmente, ele considera quaisquer chamadas pendentes para o mtodo Security.loadPolicyFile() para verificar se elas esto em escopo.

Controles de autor (desenvolvedor)


A API ActionScript principal usada para conceder privilgios de segurana o mtodo Security.allowDomain() que concede privilgios a arquivos SWF nos domnios especificados por voc. No exemplo a seguir, um arquivo SWF concede acesso a arquivos SWF servidos no domnio www.example.com:
Security.allowDomain("www.example.com")

Esse mtodo concede permisses para o seguinte:

Cross-scripting entre arquivos SWF (consulte Cross-scripting na pgina 721) Acesso lista de exibio (consulte Como percorrer a lista de exibio na pgina 723) Deteco de eventos (consulte Segurana de eventos na pgina 724) Acesso total propriedades e mtodos do objeto Stage (consultesegurana de Palco na pgina 722)

PROGRAMAO DO ACTIONSCRIPT 3.0 715


Segurana do Flash Player

O objetivo principal da chamada do mtodo Security.allowDomain() conceder permisso para arquivos SWF em um domnio externo para executar script do arquivo SWF chamando o mtodo Security.allowDomain(). Para obter mais informaes, consulte Cross-scripting na pgina 721. Especificar um endereo IP como parmetro do mtodo Security.allowDomain() no permite acesso de todas as partes que se originam no endereo IP especificado. Ao contrrio, isso permite o acesso apenas de uma parte que contm o endereo IP especificado como sua URL, em vez de um nome de domnio mapeia para o endereo IP. Por exemplo, se o nome do domnio www.example.com for mapeado para o endereo IP 192.0.34.166, uma chamada para Security.allowDomain("192.0.34.166") no conceder acesso a www.example.com. possvel passar o curinga "*" para o mtodo Security.allowDomain() para permitir acesso a todos os domnios. Como ele concede permisso para arquivos SWF de todos os domnios para executarem script na chamada do arquivo, use o curinga "*" com cuidado. O ActionScript inclui uma segunda API de permisso, chamada Security.allowInsecureDomain(). Esse mtodo faz a mesma coisa que o mtodo Security.allowDomain(), exceto que, quando chamado de um arquivo SWF servido por uma conexo HTTPS segura, ele permite adicionalmente acesso ao arquivo SWF de chamada por outros arquivos SWF que so servidos em um protocolo inseguro, como HTTP. No entanto, no uma boa prtica de segurana permitir script entre arquivos de um protocolo seguro (HTTPS) e arquivos de protocolos inseguros (como HTTP). Isso pode abrir contedo seguro a ataques de falsificao. Esses ataques podem ocorrer da seguinte maneira: como o mtodo Security.allowInsecureDomain() permite acesso aos dados de HTTPS seguro por arquivos SWF servidos em conexes HTTP, um invasor situado entre o servidor HTTP e seus usurios pode substituir seu arquivo SWF de HTTP por um arquivo prprio, que pode ento acessar seus dados HTTPS. Outro mtodo importante relacionado segurana o mtodo Security.loadPolicyFile() que faz com que o Flash Player verifique se h um arquivo de poltica em um local no padro. Para obter mais informaes, consulte Controles de site (arquivos de poltica) na pgina 711.

Restrio de APIs de rede


APIs de rede podem ser restringidas de duas maneiras. Para impedir atividades mal-intencionadas, o acesso a portas comumente reservadas bloqueado. Voc no pode substituir esses bloqueios em seu cdigo. Para controlar o acesso de um arquivo SWF funcionalidade da rede com relao a outras portas, possvel usar a configurao allowNetworking.

Portas bloqueadas
O Flash Player e o Adobe AIR tm restries sobre o acesso HTTP a determinadas portas, assim como navegadores. Solicitaes HTTP no so permitidas para determinadas portas padro que convencionalmente so usadas para tipos de servidores no-HTTP. Qualquer API que acesse uma URL da rede est sujeita a essas restries de bloqueio de porta. A nica exceo so APIs que chamam soquetes diretamente, como Socket.connect() eXMLSocket.connect(), ou chamadas para Security.loadPolicyFile() nas quais um arquivo de poltica de soquete est sendo carregado. Conexes de soquete so permitidas ou negadas por meio do uso de arquivos de poltica de soquete no servidor de destino. A lista a seguir mostra as APIs do ActionScript 3.0 s quais se aplica o bloqueio de portas:
FileReference.download(),FileReference.upload(), Loader.load(), Loader.loadBytes(), navigateToURL(), NetConnection.call(), NetConnection.connect(), NetStream.play(), Security.loadPolicyFile(), sendToURL(), Sound.load(), URLLoader.load(), URLStream.load()

PROGRAMAO DO ACTIONSCRIPT 3.0 716


Segurana do Flash Player

O bloqueio de portas tambm se aplica importao da Biblioteca compartilhada, ao uso da tag <img> em campos de texto e ao carregamento de arquivos SWF em uma pgina HTML usando as tags <object> e<embed>. As listas a seguir mostram quais portas so bloqueadas: HTTP: 20 (dados ftp), 21 (controle ftp) HTTP e FTP: 1 (tcpmux), 7 (echo), 9 (discard), 11 (systat), 13 (daytime), 15 (netstat), 17 (qotd), 19 (chargen), 22 (ssh), 23 (telnet), 25 (smtp), 37 (time), 42 (name), 43 (nicname), 53 (domain), 77 (priv-rjs), 79 (finger), 87 (ttylink), 95 (supdup), 101 (hostriame), 102 (iso-tsap), 103 (gppitnp), 104 (acr-nema), 109 (pop2), 110 (pop3), 111 (sunrpc), 113 (auth), 115 (sftp), 117 (uucp-path), 119 (nntp), 123 (ntp), 135 (loc-srv / epmap), 139 (netbios), 143 (imap2), 179 (bgp), 389 (ldap), 465 (smtp+ssl), 512 (print / exec), 513 (login), 514 (shell), 515 (printer), 526 (tempo), 530 (courier), 531 (chat), 532 (netnews), 540 (uucp), 556 (remotefs), 563 (nntp+ssl), 587 (smtp), 601 (syslog), 636 (ldap+ssl), 993 (ldap+ssl), 995 (pop3+ssl), 2049 (nfs), 4045 (lockd), 6000 (x11)

Uso do parmetro allowNetworking


possvel controlar o acesso de um arquivo SWF funcionalidade da rede definindo o parmetro allowNetworking nas tags <object> e<embed> na pgina HTML que contm o contedo do SWF. Os valores possveis de allowNetworking so:

"all" (o padro) todas as APIs de rede tm permisso no arquivo SWF. "internal" o arquivo SWF no pode chamar APIs de interao de navegador ou navegao de navegador,

listadas posteriormente nesta seo, mas ele pode chamar quaisquer outras APIs de rede.
"none" o arquivo SWF no pode chamar APIs de interao de navegador ou de navegao de navegador, listadas posteriormente nesta seo, e no pode usar quaisquer APIs de comunicao SWF com SWF, tambm listadas posteriormente.

O parmetro allowNetworking foi projetado para uso principalmente quando o arquivo SWF e a pgina HTML que o delimita esto em domnios diferentes. O uso do valor de "internal" ou de "none" no recomendado quando o arquivo SWF que est sendo carregado do mesmo domnio que as pginas HTML que o delimitam, porque no possvel garantir que um arquivo SWF sempre seja carregado com a pgina HTML pretendida. Partes no confiveis podem carregar um arquivo SWF do seu domnio sem HTML delimitado, em cujo caso a restrio allowNetworking no funcionar como pretendido. A chamada de uma API impedida lana uma exceo SecurityError. Adicione o parmetro allowNetworking e defina seu valor nas tags <object> e <embed> da pgina HTML que contm uma referncia ao arquivo SWF, conforme mostrado neste exemplo:
<object classic="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" Code base="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,124, 0" width="600" height="400" ID="test" align="middle"> <param name="allowNetworking" value="none" /> <param name="movie" value="test.swf" /> <param name="bgcolor" value="#333333" /> <embed src="test.swf" allowNetworking="none" bgcolor="#333333" width="600" height="400" name="test" align="middle" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" /> </object>

PROGRAMAO DO ACTIONSCRIPT 3.0 717


Segurana do Flash Player

Uma pgina HTML tambm pode usar um script para gerar tags de incorporao SWF. necessrio alterar o script para que ele insira as configuraes corretas de allowNetworking. As pginas HTML geradas pelo Flash e pelo Adobe Flex Builder usam a funo AC_FL_RunContent() para incorporar referncias aos arquivos SWF. Adicione as configuraes do parmetro allowNetworking ao script, como no seguinte:
AC_FL_RunContent( ... "allowNetworking", "none", ...)

As seguintes APIs so impedidas quando allowNetworking est definido como "internal":


navigateToURL(), fscommand(), ExternalInterface.call()

Alm das APIs da lista anterior, as seguintes APIs tambm so impedidas quando o parmetro allowNetworking est definido como "none":
sendToURL(), FileReference.download(), FileReference.upload(), Loader.load(), LocalConnection.connect(), LocalConnection.send(), NetConnection.connect(), NetStream.play(), Security.loadPolicyFile(), SharedObject.getLocal(), SharedObject.getRemote(), Socket.connect(), Sound.load(), URLLoader.load(), URLStream.load(), XMLSocket.connect()

Mesmo que a configurao allowNetworking selecionada permita que um arquivo SWF use uma API de rede, pode haver outras restries com base nas limitaes da caixa de proteo de segurana (consulte Caixas de proteo de segurana na pgina 706). Quando allowNetworking est definido como "none", no possvel fazer referncia a mdia externa em uma tag <img> na propriedade htmlText de um objeto TextField (uma exceo SecurityError lanada). Quando allowNetworking est definido como "none", um smbolo de uma biblioteca compartilhada importada adicionado na ferramenta de autoria do Flash (no no ActionScript) bloqueado em tempo de execuo.

Segurana de modo de tela cheia


O Flash Player 9.0.27.0 e verses posteriores oferecem suporte ao modo de tela cheia, no qual o contedo executado no Flash Player pode ocupar toda a tela. Para entrar em modo de tela cheia, a propriedade displayState do Palco definida como a constante StageDisplayState.FULL_SCREEN. Para obter mais informaes, consulte Configurao de propriedades do palco na pgina 287. Para arquivos SWF executados em um navegador, h mais consideraes sobre segurana. Para ativar o modo de tela cheia, nas tags <object> e <embed> na pgina HTML que contm uma referncia ao arquivo SWF, adicione o parmetro allowFullScreen com o valor definido como "true" (o valor padro "false"), conforme mostrado no exemplo a seguir:
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0, 18,0" width="600" height="400" id="test" align="middle"> <param name="allowFullScreen" value="true" /> <param name="movie" value="test.swf" /> <param name="bgcolor" value="#333333" /> <embed src="test.swf" allowFullScreen="true" bgcolor="#333333" width="600" height="400" name="test" align="middle" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" /> </object>

PROGRAMAO DO ACTIONSCRIPT 3.0 718


Segurana do Flash Player

Uma pgina HTML tambm pode usar um script para gerar tags de incorporao SWF. necessrio alterar o script para que ele insira as configuraes corretas de allowFullScreen. As pginas HTML geradas pelo Flash e pelo Flex Builder usam a funo AC_FL_RunContent() para incorporar referncias a arquivos SWF e voc precisa adicionar as configuraes do parmetro allowFullScreen, conforme a seguir:
AC_FL_RunContent( ... "allowFullScreen", "true", ...)

O ActionScript que inicia o modo de tela cheia pode ser chamado apenas em resposta a um evento do mouse ou do teclado. Se ele for chamado em outras situaes, o Flash Player lanar uma exceo. Um mensagem exibida quando o contedo entra em modo de tela cheia, fornecendo ao usurio instrues sobre como sair e retornar ao modo normal. A mensagem exibida por alguns segundos e, em seguida, desaparece. No caso de contedo executado em um navegador, o uso do teclado fica restrito no modo de tela cheia. No Flash Player 9, s dado suporte para atalhos de teclado que retornam o aplicativo ao modo normal, como pressionar a tecla Escape. Os usurios no podem inserir texto em campos de texto ou navegar pela tela. No Flash Player 10 e verses posteriores, h suporte para teclas que no so impressas (como as teclas de seta, espao, Shift e Tab). No entanto, a entrada de texto ainda no permitida. O modo de tela cheia sempre permitido no player independente ou em um arquivo de projetor. Alm disso, o uso do teclado (inclusive para entrada de texto) totalmente suportado nesses ambientes. Chamar a propriedade displayState de um objeto Stage lana uma exceo para qualquer chamador que no esteja na mesma caixa de proteo de segurana que o proprietrio do Palco (o arquivo SWF principal). Para obter mais informaes, consulte segurana de Palco na pgina 722. Os administradores podem desativar o modo de tela cheia de arquivos SWF em execuo em navegadores configurando FullScreenDisable = 1 no arquivo mms.cfg. Para obter detalhes, consulte Controles de administrador na pgina 708. Em um navegador, um arquivo SWF deve ser contido em uma pgina HTML para permitir o modo de tela cheia.

Carregamento de contedo
Um arquivo SWF pode carregar os seguintes tipos de contedo:

Arquivos SWF Imagens Som Vdeo

Carregamento de arquivos SWF e de imagens


Use a classe Loader para carregar arquivos SWF e imagens (arquivos JPG, GIF ou PNG). Qualquer arquivo SWF, a no ser um que esteja na caixa de proteo local com arquivos do sistema, pode carregar arquivos SWF e imagens de qualquer domnio de rede. Apenas arquivos SWF em caixas de proteo locais podem carregar arquivos SWF e imagens do sistema de arquivos local. No entanto arquivos na caixa de proteo local com rede podem carregar apenas arquivos SWF locais que estejam na mesma caixa de proteo confivel local ou local com rede. Os arquivos SWF na caixa de proteo local com rede carregam contedo local que no sejam arquivos SWF (como imagens), no entanto eles no podem acessar dados no contedo carregado.

PROGRAMAO DO ACTIONSCRIPT 3.0 719


Segurana do Flash Player

Ao carregar um arquivo SWF a partir de uma origem no confivel (como um domnio diferente daquele do arquivo SWF da raiz do objeto Loader), convm definir uma mscara para o objeto Loader para impedir que o contedo carregado (que filho do objeto Loader) seja desenhado em partes do Palco fora daquela mscara, conforme mostrado no cdigo a seguir:
import flash.display.*; import flash.net.URLRequest; var rect:Shape = new Shape(); rect.graphics.beginFill(0xFFFFFF); rect.graphics.drawRect(0, 0, 100, 100); addChild(rect); var ldr:Loader = new Loader(); ldr.mask = rect; var url:String = "http://www.unknown.example.com/content.swf"; var urlReq:URLRequest = new URLRequest(url); ldr.load(urlReq); addChild(ldr);

Ao chamar o mtodo load() do objeto Loader, possvel especificar um parmetro context que um objeto LoaderContext. A classe LoaderContext inclui trs propriedades que permitem definir o contexto de como o contedo carregado pode ser usado:

checkPolicyFile: Use essa propriedade apenas ao carregar um arquivo de imagem (no um arquivo SWF).

Especifique-a para um arquivo de imagem de um domnio diferente daquele do arquivo que contm o objeto Loader. Se voc definir a propriedade como true, o Loader verificar o servidor de origem para obter um arquivo de poltica de URL (consulteControles de site (arquivos de poltica) na pgina 711). Se o servidor conceder permisso ao domnio Loader, o ActionScript de arquivos SWF no domnio Loader poder acessar dados na imagem carregada. Em outras palavras, voc pode usar a propriedade Loader.content para obter uma referncia ao objeto Bitmap que representa a imagem carregada ou o mtodo BitmapData.draw() para acessar pixels da imagem carregada.

securityDomain: S use essa propriedade ao carregar um arquivo SWF (no uma imagem). Especifique-a para um

arquivo SWF de um domnio diferente daquele do arquivo que contm o objeto Loader. Apenas dois valores so suportados atualmente para a propriedade securityDomain: null (o padro) e SecurityDomain.currentDomain. Se voc especificar SecurityDomain.currentDomain, ele solicitar que o arquivo SWF carregado seja importado para a caixa de proteo do arquivo SWF que est sendo carregado, indicando que ele funcionar como se fosse carregado do prprio servidor do arquivo SWF que est sendo carregado. Isso ser permitido apenas se um arquivo de poltica de URL for encontrado no servidor do arquivo SWF carregado, permitindo acesso pelo domnio do arquivo SWF que est sendo carregado. Se o arquivo de poltica for encontrado, o carregador e o carregado podero executar script livremente um no outro assim que o carregamento for iniciado, uma vez que esto na mesma caixa de proteo. Observe que a importao da caixa de proteo pode ser substituda principalmente executando um carregamento comum e, em seguida, fazendo com que o arquivo SWF chame o mtodo Security.allowDomain(). Esse ltimo mtodo pode ser mais fcil de usar, pois o arquivo SWF carregado estar em sua prpria caixa de proteo natural e, portanto, capaz de acessar recursos de seu prprio servidor real.

applicationDomain: Use essa propriedade apenas ao carregar um arquivo SWF gravado no ActionScript 3.0 (no em uma imagem ou arquivo SWF gravado no ActionScript 1.0 ou no ActionScript 2.0). Ao carregar o arquivo, possvel especificar se ele ser colocado em um domnio de aplicativo especfico, em vez de ser colocado como padro em um novo domnio de aplicativo que filho do domnio do aplicativo do arquivo SWF que est sendo carregado. Observe que os domnios de aplicativos so subunidades de domnios de segurana e portanto voc poder especificar um domnio de aplicativo de destino apenas se o arquivo SWF que est sendo carregado for de

PROGRAMAO DO ACTIONSCRIPT 3.0 720


Segurana do Flash Player

seu prprio domnio de segurana, seja porque ele de seu prprio servidor ou porque voc o importou com xito em seu domnio de segurana usando a propriedade securityDomain. Se voc especificar um domnio de aplicativo, mas o arquivo SWF carregado fizer parte de um domnio de segurana diferente, o domnio especificado em applicationDomain ser ignorado. Para obter mais informaes, consulte Uso da classe ApplicationDomain na pgina 657. Para obter detalhes, consulte Especificao do contexto do carregamento na pgina 315. Uma propriedade importante de um objeto Loader a propriedade contentLoaderInfo que um objeto LoaderInfo. Ao contrrio da maioria dos outros objetos, um objeto LoaderInfo compartilhado entre o arquivo SWF que est sendo carregado e o contedo carregado e sempre est acessvel para as duas partes. Quando o contedo carregado um arquivo SWF, ele pode acessar o objeto LoaderInfo por meio da propriedade DisplayObject.loaderInfo. Objetos LoaderInfo incluem informaes, como o progresso do carregamento, as URLs do carregador e do carregado, o relacionamento de confiana entre o carregador e o carregado e outras informaes. Para obter mais informaes, consulte Monitoramento do progresso do carregamento na pgina 314.

Carregamento de som e vdeo


Todos os arquivos SWF, alm dos que esto na caixa de proteo local com sistema de arquivos, tm permisso para carregar som e vdeo de origens da rede, usando os mtodos Sound.load(), NetConnection.connect() e NetStream.play() . Apenas arquivos SWF locais podem carregar mdia do sistema de arquivos local. Apenas arquivos SWF na caixa de proteo local com sistema de arquivos ou na caixa de proteo local confivel podem acessar dados nesses arquivos carregados. H outras restries ao acessar dados de mdia carregada. Para obter detalhes, consulte Acesso mdia carregada como dados na pgina 724.

Carregamento de arquivos SWF e de imagens usando a tag <img> em um campo de texto


possvel carregar arquivos SWF e bitmaps em um campo de texto usando a tag <img>, conforme mostrado no cdigo a seguir:
<img src = 'filename.jpg' id = 'instanceName' >

possvel carregar contedo carregado dessa maneira usando o mtodo getImageReference() da ocorrncia TextField, conforme mostrado no cdigo a seguir:
var loadedObject:DisplayObject = myTextField.getImageReference('instanceName');

No entanto observe que arquivos SWF e imagens carregados dessa maneira so colocados na caixa de proteo que corresponde a sua origem. Ao carregar um arquivo de imagem usando uma tag <img> em um campo de texto, o acesso aos dados da imagem pode ser permitido por um arquivo de poltica de URL. possvel verificar se h um arquivo de poltica adicionando um atributo checkPolicyFile tag <img>, como no cdigo a seguir:
<img src = 'filename.jpg' checkPolicyFile = 'true' id = 'instanceName' >

Ao carregar um SWF usando uma tag <img> em um campo de texto, possvel permitir acesso aos dados daquele arquivo SWF por meio de uma chamada ao mtodo Security.allowDomain().

PROGRAMAO DO ACTIONSCRIPT 3.0 721


Segurana do Flash Player

Ao usar uma tag <img> em um campo de texto para carregar um arquivo externo (em vez de usar uma classe Bitmap incorporada em seu SWF), um objeto Loader criado automaticamente como um filho do objeto TextField, e o arquivo externo carregado naquele Loader exatamente como se voc tivesse usado um objeto Loader no ActionScript para carregar o arquivo. Nesse caso, o mtodo getImageReference() retorna o Loader que foi criado automaticamente. Nenhuma verificao de segurana necessria para acessar esse objeto Loader porque ele est na mesma caixa de proteo de segurana que o objeto de chamada. No entanto quando voc faz referncia propriedade content do objeto Loader para acessar a mdia carregada, regras de segurana so aplicadas. Se o contedo for uma imagem, ser necessrio implementar um arquivo de poltica de URL e, se o contedo for um arquivo SWF, voc precisar fazer com que o cdigo no arquivo SWF chame o mtodo allowDomain().

Contedo entregue usando servidores RMTP


O Flash Media Server usa o protocolo RTMP para servir dados, udio e vdeo. Um arquivo SWF carrega essa mdia usando o mtodo connect() da classe NetConnection, passando uma URL de RTMP como o parmetro. O Flash Media Server pode restringir conexes e impedir que contedo seja baixado, com base no domnio do arquivo solicitante. Para obter detalhes, consulte a documentao do Flash Media Server. Para mdia baixada de origens RTMP, no possvel usar os mtodos BitmapData.draw() e
SoundMixer.computeSpectrum() para extrair grficos e dados de som em tempo de execuo.

Cross-scripting
Se dois arquivos SWF escritos com o ActionScript 3.0 forem servidos no mesmo domnio, por exemplo, se a URL de um arquivo SWF for http://www.example.com/swfA.swf e a URL do outro for http://www.example.com/swfB.swf, um arquivo SWF poder examinar e modificar variveis, objetos, propriedades, mtodos e assim por diante na ordem e vice-versa. Isso chamado de cross-scripting. O cross-scripting no suportado entre arquivos SWF AVM1 e SWF AVM2. Um arquivo SWF AVM1 criado usando o ActionScript 1.0 ou o ActionScript 2.0. (AVM1 e AVM2 se referem a ActionScript Virtual Machine.) No entanto possvel usar a classe LocalConnection para enviar dados entre o AVM1 e o AVM2. Se dois arquivos SWF forem servidos em domnios diferentes, por exemplo, http://siteA.com/swfA.swf e http://siteB.com/siteB.swf, por padro, o Flash Player no permitir que o swfA.swf execute script do swfB.swf, nem que o swfB.swf execute script do swfA.swf. O arquivo SWF d permisso a arquivos SWF de outros domnios chamando Security.allowDomain(). Com a chamada de Security.allowDomain("siteA.com"), o swfB.swf concede aos arquivos SWF do siteA.swf permisso para executar script nele.

PROGRAMAO DO ACTIONSCRIPT 3.0 722


Segurana do Flash Player

Em qualquer situao entre domnios, importante que as duas partes envolvidas sejam bem-definidas. Para fins desta discusso, o lado que executa o cross-scripting chamado de parte de acesso (normalmente o SWF que faz o acesso) e o outro lado chamado de a parte que est sendo acessada (normalmente o SWF que est sendo acessado). Quando o siteA.swf executa script no siteB.swf, o siteA.swf a parte que acessa e o siteB.swf a parte que est sendo acessada, conforme mostrado na ilustrao a seguir:
siteA.com / swfA.swf
SWF

var url:String = "http://siteB.com/swfB.swf"; var req:URLRequest = new URLRequest(url); myLoader.load(req);

myLoader.content.eggCount = 3; myLoader.content.DisplayEggs();

carregar

entre scripts

2 permisso

Security.allowDomain("siteA.com");

var eggCount:Number; function DisplayEggs() { ... }; siteB.com / swfB.swf


SWF

Permisses entre domnios estabelecidas com o mtodoSecurity.allowDomain() so assimtricas. No exemplo anterior, o siteA.swf pode executar script no siteB.swf, mas o siteB.swf no pode executar script no siteA.swf, pois o siteA.swf no chamou o mtodo Security.allowDomain() para conceder permisso aos arquivos SWF no siteB.com para executar script nele. possvel configurar permisses simtricas fazendo com que os dois arquivos SWF chamem o mtodo Security.allowDomain(). Alm de proteger arquivos SWF contra a execuo de script entre domnios originadas por outros arquivos SWF, o Flash Player protege arquivos SWF conta a execuo de script entre domnios originadas por arquivos HTML. A execuo de script de HTML para SWF pode ocorrer com retornos de chamada estabelecidos por meio do mtodo ExternalInterface.addCallback(). Quando a execuo de script de HTML para SWF cruza domnios, o arquivo SWF que est sendo acessado deve chamar o mtodo Security.allowDomain() exatamente como quando a parte que faz o acesso um arquivo SWF ou haver falha na operao. Para obter mais informaes, consulte Controles de autor (desenvolvedor) na pgina 714. Alm disso, o Flash Player fornece controles de segurana para execuo de script de SWF para HTML. Para obter mais informaes, consulte Controle do acesso URL de sada na pgina 731.

segurana de Palco
Algumas propriedades e mtodos do objeto Stage esto disponveis para qualquer entidade grfica ou clipe de filme na lista de exibio. No entanto o objeto Stage considerado como tendo um proprietrio: o primeiro arquivo SWF carregado. Por padro, as seguintes propriedades e mtodos do objeto Stage esto disponveis apenas para arquivos SWF na mesma caixa de proteo de segurana que o proprietrio do Palco:

PROGRAMAO DO ACTIONSCRIPT 3.0 723


Segurana do Flash Player

Propriedades
alinhar

Mtodos
addChild() addChildAt() addEventListener() dispatchEvent() hasEventListener() setChildIndex() willTrigger()

displayState frameRate
height mouseChildren numChildren quality scaleMode showDefaultContextMenu stageFocusRect stageHeight stageWidth tabChildren textSnapshot width

Para que um arquivo SWF em uma caixa de proteo diferente daquela do proprietrio do Palco acesse essas propriedades e mtodos, o arquivo SWF do proprietrio do Palco deve chamar o mtodo Security.allowDomain() para permitir o domnio da caixa de proteo externa. Para obter mais informaes, consulte Controles de autor (desenvolvedor) na pgina 714. A propriedade frameRate um caso especial, qualquer arquivo SWF pode ler a propriedade frameRate. No entanto, apenas aqueles que esto na caixa de proteo de segurana do proprietrio do Palco (ou aqueles que receberam permisso por uma chamada para o mtodo Security.allowDomain()) podem alterar a propriedade. Tambm h restries nos mtodos removeChildAt() e swapChildrenAt() do objeto Stage, mas essas so diferentes das outras restries. E vez de ser necessrio estar no mesmo domnio que o proprietrio do Palco para chamar esses mtodos, o cdigo deve estar no mesmo domnio que o proprietrio dos objetos filho afetados ou os objetos filho podem chamar o mtodo Security.allowDomain().

Como percorrer a lista de exibio


A capacidade de um arquivo SWF acessar objetos de exibio carregados de outras caixas de proteo restrita. Para que um arquivo SWF acesse um objeto de exibio criado por outro arquivo SWF em uma caixa de proteo diferente, o arquivo SWF que est sendo acessado deve chamar o mtodo Security.allowDomain() para permitir acesso pelo domnio do arquivo SWF que est acessando. Para obter mais informaes, consulte Controles de autor (desenvolvedor) na pgina 714. Para acessar um objeto Bitmap que foi carregado por um objeto Loader, um arquivo de poltica de URL deve existir no servidor de origem do arquivo de imagem, e esse arquivo de poltica deve conceder permisso ao domnio do arquivo SWF que est tentando acessar o objeto Bitmap (consulte Controles de site (arquivos de poltica) na pgina 711).

PROGRAMAO DO ACTIONSCRIPT 3.0 724


Segurana do Flash Player

O objeto LoaderInfo que corresponde a um arquivo carregado (e ao objeto Loader) inclui as trs seguintes propriedades que definem o relacionamento entre o objeto carregado e o objeto Loader: childAllowsParent, parentAllowsChild e sameDomain.

Segurana de eventos
Eventos relacionados lista de exibio tm limitaes de acesso de segurana com base na caixa de proteo do objeto de exibio est despachando o evento. Um evento na lista de exibio tem fases de bubbling e de captura (descritas em Manipulao de eventos na pgina 251). Durante as fases de bubbling e de captura, um evento migra do objeto de exibio de origem por meio de objetos de exibio pai na lista de exibio. Se um objeto pai estiver em uma caixa de proteo de segurana diferente do objeto de exibio de origem, a fase de captura e de bubble parar abaixo daquele objeto pai, a menos que haja confiana mtua entre o proprietrio do objeto pai e o proprietrio do objeto de origem. Essa confiana mtua pode ser obtida pelo seguinte:
1 O arquivo SWF que possui o objeto pai deve chamar o mtodo Security.allowDomain() para confiar no

domnio do arquivo SWF que possui o objeto de origem.


2 O arquivo SWF que possui o objeto de origem deve chamar o mtodo Security.allowDomain() para confiar no

domnio do arquivo SWF que possui o objeto pai. O objeto LoaderInfo que corresponde a um arquivo carregado (e ao objeto Loader) inclui as duas seguintes propriedades que definem o relacionamento entre o objeto carregado e o objeto Loader: childAllowsParent e parentAllowsChild. Para eventos despachados de objetos que no so objetos de exibio, no h verificaes de segurana ou implicaes relacionadas segurana.

Acesso mdia carregada como dados


Os dados carregados so acessados usando mtodos, como BitmapData.draw() e SoundMixer.computeSpectrum(). Por padro, um arquivo SWF de uma caixa de proteo de segurana no pode obter dados de pixels ou dados de udio do grfico ou de objetos de udio renderizados ou reproduzidos pela mdia carregada em outra caixa de proteo. No entanto possvel usar os mtodos a seguir para conceder essa permisso:

Em um arquivo SWF carregado, chame o mtodo Security.allowDomain() para conceder acesso a dados a
arquivos SWF em outros domnios.

Para uma imagem, som ou vdeo carregado, adicione um arquivo de poltica de URL no servidor do arquivo
carregado. Esse arquivo de poltica deve conceder acesso ao domnio do arquivo SWF que est tentando chamar os mtodos BitmapData.draw() ou SoundMixer.computeSpectrum() para extrair dados do arquivo. As sees a seguir fornecem detalhes sobre o acesso a dados de bitmap, som e vdeo.

PROGRAMAO DO ACTIONSCRIPT 3.0 725


Segurana do Flash Player

Acesso a dados de bitmap


O mtodo draw() de um objeto BitmapData permite desenhar os pixels exibidos atualmente de qualquer objeto de exibio para o objeto BitmapData. Isso pode incluir os pixels de um objeto MovieClip, de um objeto Bitmap ou de qualquer objeto de exibio. As seguintes condies devem ser atendidas para que o mtodo draw() desenhe pixels para o objeto BitmapData:

No caso de um objeto de origem diferente de um bitmap carregado, o objeto de origem e (no caso de um objeto
Sprite ou MovieClip) todos os seus objetos filho devem vir do mesmo domnio que o objeto que est chamando o mtodo draw(), ou devem estar em um arquivo SWF que possa ser acessado pelo chamador fazendo com que o mtodo Security.allowDomain() seja chamado.

No caso de um objeto de origem de bitmap Loaded, o objeto de origem deve vir do mesmo domnio que o objeto
que est chamando o mtodo draw(), ou seu servidor de origem deve incluir um arquivo de poltica de URL que conceda permisso ao domnio que est fazendo a chamada. Se essas condies no forem atendidas, uma exceo SecurityError ser lanada. Ao carregar a imagem usando o mtodo load() da classe Loader, voc pode especificar um parmetro context que um objeto SoundLoaderContext. Se voc definir a propriedade checkPolicyFile do objeto LoaderContext como true, o Flash Player verificar se h um arquivo de poltica de URL no servidor do qual a imagem carregada. Se houver um arquivo de poltica e o arquivo permitir que o domnio do arquivo SWF que est sendo carregado, o arquivo ter permisso para acessar os dados no objeto Bitmap. Caso contrrio, o acesso ser negado. Tambm possvel especificar uma propriedade checkPolicyFile em uma imagem carregada por meio de uma tag <img> em um campo de texto. Para obter detalhes, consulte Carregamento de arquivos SWF e de imagens usando a tag <img> em um campo de texto na pgina 720

Acesso a dados de som


As seguintes APIs do ActionScript 3.0 relacionadas a som tm restries de segurana:

O mtodo

SoundMixer.computeSpectrum() sempre permitido para arquivos SWF que esto na mesma caixa de proteo de segurana que o arquivo de som. Para arquivos em outras caixas de proteo, h verificaes de segurana.

O mtodo

SoundMixer.stopAll() sempre permitido para arquivos SWF que esto na mesma caixa de proteo de segurana que o arquivo de som. Para arquivos em outras caixas de proteo, h verificaes de segurana.

A propriedade id3 da classe Sound sempre permitida para arquivos SWF que esto na mesma caixa de proteo
de segurana que o arquivo de som. Para arquivos em outras caixas de proteo, h verificaes de segurana. Todo evento tem dois tipos de caixas de proteo associadas a ele, uma caixa de proteo de contedo e uma caixa de proteo do proprietrio:

O domnio de origem do som determina a caixa de proteo de contedo e isso determina se os dados podem ser
extrados do som por meio da propriedade id3 do som e do mtodo SoundMixer.computeSpectrum().

O objeto que iniciou a reproduo do som determina a caixa de proteo do proprietrio e isso determina se o som
pode ser parado usando o mtodo SoundMixer.stopAll().

PROGRAMAO DO ACTIONSCRIPT 3.0 726


Segurana do Flash Player

Ao carregar o som usando o mtodo load() da classe Sound, voc pode especificar um parmetro context que um objeto SoundLoaderContext. Se voc definir a propriedade checkPolicyFile do objeto SoundLoaderContext como true, o Flash Player verificar se h um arquivo de poltica de URL no servidor do qual o som carregado. Se houver um arquivo de poltica e o arquivo permitir o domnio do arquivo SWF que est sendo carregado, o arquivo receber permisso para acessar a propriedade id do objeto Sound. Caso contrrio, no ter essa permisso. Alm disso, a configurao da propriedade checkPolicyFile pode ativar o mtodo SoundMixer.computeSpectrum() para sons carregados. possvel usar o mtodo SoundMixer.areSoundsInaccessible() para descobrir se uma chamada para o mtodo SoundMixer.stopAll() no parar todos os sons porque a caixa de proteo de um ou mais proprietrios de som est inacessvel para o chamador. A chamada do mtodo SoundMixer.stopAll() pra esses sons cuja caixa de proteo de proprietrio a mesma que a do chamador de stopAll(). Ela tambm pra aqueles sons cuja reproduo foi iniciada por arquivos SWF que chamaram o mtodo Security.allowDomain() para permitir acesso pelo domnio do arquivo SWF que est chamando o mtodo stopAll(). Qualquer outro som no parado e a presena desses sons pode ser revelada chamando o mtodo SoundMixer.areSoundsInaccessible(). A chamada do mtodo computeSpectrum() requer que todo som que esteja sendo reproduzido seja da mesma caixa de proteo que o objeto que est chamando o mtodo ou de uma origem que recebeu permisso para a caixa de proteo do chamador. Caso contrrio, uma exceo SecurityError lanada. Para sons que foram carregados de sons incorporados em uma biblioteca em um arquivo SWF, a permisso ser concedida com uma chamada para o mtodo Security.allowDomain() no arquivo SWF carregado. Para sons carregados de origens que no sejam arquivos SWF (originrios de arquivos mp3 carregados ou de arquivos de vdeo), um arquivo de poltica de URL no servidor de origem concede acesso a dados contidos na mdia carregada. Voc no poder usar o mtodo computeSpectrum() se um som for carregado de fluxos RTMP. Para obter mais informaes, consulteControles de autor (desenvolvedor) na pgina 714 eControles de site (arquivos de poltica) na pgina 711.

Acesso a dados de vdeo


possvel usar o mtodo BitmapData.draw() para capturar os dados de pixels do quadro atual de um vdeo. H dois tipos diferentes de vdeo:

Vdeo RTMP Vdeo progressivo que carregado de um arquivo FLV sem um servidor RTMP
No possvel usar o mtodo BitmapData.draw() para acessar vdeo RTMP. Ao chamar o mtodo BitmapData.draw() com vdeo progressivo como o parmetro source, o chamador de BitmapData.draw() deve estar na mesma caixa de proteo que o arquivo FLV, ou o servidor do arquivo FLV deve ter um arquivo de poltica que conceda permisso para o domnio do arquivo SWF que est fazendo a chamada. possvel solicitar que o arquivo de poltica seja baixado configurando a propriedade checkPolicyFile do objeto NetStream como true.

PROGRAMAO DO ACTIONSCRIPT 3.0 727


Segurana do Flash Player

Carregamento de dados
Os arquivos SWF podem carregar dados de servidores no ActionScript e enviar dados do ActionScript para servidores. O carregamento de dados um tipo de operao diferente do carregamento de mdia porque as informaes carregadas aparecem diretamente no ActionScript em vez de serem exibidas como mdia. Geralmente, os arquivos SWF podem carregar dados de seus prprios domnios. No entanto, eles costumam exigir arquivos de poltica para carregar dados de outros domnios (consulte Controles de site (arquivos de poltica) na pgina 711).

Uso de URLLoader e URLStream


possvel carregar dados, como um arquivo XML ou um arquivo de texto. Os mtodos load() das classes URLLoader e URLStream so governados pelas permisses do arquivo de poltica de URL. Se voc usar o mtodo load() para carregar contedo de um domnio diferente daquele do arquivo SWF que est chamando o mtodo, o Flash Player verificar se existe um arquivo de poltica de URL no servidor dos ativos carregados. Se houver um arquivo de poltica e ele conceder acesso ao domnio do arquivo SWF que est sendo carregado, voc poder carregar os dados.

Conexo a soquetes
Por padro, o Flash Player procura um arquivo de poltica de soquete servido na porta 843. Assim como os arquivos de poltica de URL, esse arquivo chamado de arquivo de poltica mestre. Quando arquivos de poltica foram introduzidos no Flash Player 6 pela primeira vez, no havia suporte para arquivos de poltica de soquete. Conexes a servidores de soquete eram autorizadas por um arquivo de poltica no local padro em um servidor HTTP na porta 80 do mesmo host que o servidor de soquete. O Flash Player 9 ainda oferece suporte a essa capacidade, mas o Flash Player 10 no oferece. No Flash Player 10, apenas arquivos de poltica de soquete podem autorizar conexes de soquete. Como os arquivos de poltica de URL, os arquivos de poltica de soquete oferecem suporte a uma instruo de metapoltica que especifica quais portas podem servir arquivos de poltica. No entanto, em vez de master-only, a metapoltica padro para arquivos de poltica de soquete all. Isto , a menos que o arquivo de poltica mestre especifique uma configurao mais restritiva, o Flash Player assumir que qualquer soquete no host pode servir um arquivo de poltica de soquete. O acesso a conexes de soquete XML e a soquete est desativado por padro, mesmo que o soquete que voc est conectando esteja no mesmo domnio que o arquivo SWF. possvel permitir acesso em nvel de soquete servindo um arquivo de poltica de segurana de qualquer um dos seguintes locais:

Porta 843 (o local do arquivo de poltica mestre) A mesma porta que a conexo de soquete principal Uma porta diferente da conexo de soquete principal
Por padro, o Flash Player procura um arquivo de poltica de soquete na porta 843 e na mesma porta que a conexo de soquete principal. Se desejar servir um arquivo de poltica de soquete em uma porta diferente, o arquivo SWF dever chamar Security.loadPolicyFile(). Um arquivo de poltica de soquete tem a mesma sintaxe que um arquivo de poltica de URL, exceto que ele tambm deve especificar as portas s quais ele concede acesso. Quando um arquivo de poltica de soquete servido em uma porta com nmero inferior a 1024, ele pode conceder acesso a qualquer porta. Quando um arquivo de poltica proveniente da porta 1024 ou superior ele s pode conceder acesso a portas 1024 e superiores. As portas permitidas so especificadas em um atributo to-ports na tag <allow-access-from>. Os valores de nmeros de portas nicos, intervalos de portas e curingas so aceitos.

PROGRAMAO DO ACTIONSCRIPT 3.0 728


Segurana do Flash Player

Este um exemplo de arquivo de poltica de soquete:


<?xml version="1.0"?> <!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd"> <!-- Policy file for xmlsocket://socks.mysite.com --> <cross-domain-policy> <allow-access-from domain="*" to-ports="507" /> <allow-access-from domain="*.example.com" to-ports="507,516" /> <allow-access-from domain="*.example.org" to-ports="516-523" /> <allow-access-from domain="adobe.com" to-ports="507,516-523" /> <allow-access-from domain="192.0.34.166" to-ports="*" /> </cross-domain-policy>

Para recuperar um arquivo de poltica de soquete da porta 843 ou da mesma porta como uma conexo de soquete principal, chame o mtodo Socket.connect() ou XMLSocket.connect(). O Flash Player primeiro verifica se h um arquivo de poltica mestre na porta 843. Se um arquivo de poltica mestre for localizado, ele verificar se o arquivo contm uma instruo de metapoltica que probe arquivos de poltica de soquete na porta de destino. Se o acesso no for proibido, o Flash Player primeiro procurar a instruo allow-access-from apropriada no arquivo de poltica mestre. Se uma instruo no for localizada, ele procurar um arquivo de poltica de soquete na mesma porta que a conexo de soquete principal. Para recuperar um arquivo de poltica de soquete de um local diferente, primeiro chame o mtodo
Security.loadPolicyFile() com a sintaxe especial "xmlsocket", como no seguinte: Security.loadPolicyFile("xmlsocket://server.com:2525");

Chame o mtodo Security.loadPolicyFile() antes de chamar o mtodo Socket.connect() ou XMLSocket.connect(). O Flash Player ento aguarda at que tenha atendido sua solicitao de arquivo de poltica antes de decidir se permite sua conexo principal. No entanto, se o arquivo de poltica mestre especificar que o local de destino no pode servir arquivos de poltica, a chamada para loadPolicyFile() no ter nenhum efeito, mesmo que haja um arquivo de poltica naquele local. Se estiver implementando um servidor de soquetes e precisar fornecer um arquivo de poltica de soquete, decida se o arquivo de poltica deve ser fornecido usando a mesma porta que aceita conexes principais ou usando uma porta diferente. Em qualquer dos casos, o servidor deve aguardar a primeira transmisso de seu cliente antes de enviar uma resposta. Quando o Flash Player solicita um arquivo de poltica, ele sempre transmite a string a seguir assim que a conexo estabelecida:
<policy-file-request/>

Quando o servidor recebe essa string, ele pode transmitir o arquivo de poltica. A solicitao do Flash Player sempre terminada por um byte nulo e a resposta do servidor tambm deve ser terminada por um byte nulo. No espere reutilizar a mesma conexo para uma solicitao de arquivo de poltica e para uma conexo principal. Feche a conexo depois de transmitir o arquivo de poltica. Se isso no for feito, o Flash Player fechar a conexo do arquivo de poltica antes de reconectar-se para configurar a conexo principal.

Envio de dados
O envio de dados ocorre quando cdigo ActionScript de um arquivo SWF envia dados a um servidor ou a um recurso. O envio de dados sempre permitido para arquivos SWF de domnio da rede. Um arquivo SWF local pode enviar dados a endereos de rede apenas se estiver na caixa de proteo local confivel ou local com rede. Para obter mais informaes, consulte Caixas de proteo locais na pgina 706.

PROGRAMAO DO ACTIONSCRIPT 3.0 729


Segurana do Flash Player

possvel usar a funo flash.net.sendToURL() para enviar dados a uma URL. Outros mtodos tambm enviam solicitaes a URLs. Esses incluem mtodos de carregamento, como Loader.load() e Sound.load(), mtodos de carregamento de dados, como URLLoader.load() e URLStream.load().

Upload e download de arquivos


O mtodo FileReference.upload() inicia o upload de um arquivo selecionado por um usurio a um servidor remoto. necessrio chamar o mtodo FileReference.browse() ou FileReferenceList.browse() antes de chamar o mtodo FileReference.upload(). O ActionScript que inicia o mtodo FileReference.browse() ou FileReferenceList.browse() s pode ser chamado em resposta a um evento de mouse ou de teclado. Se ele for chamado em outras situaes, o Flash Player 10 e verses posteriores iro gerar uma exceo. A chamada do mtodo FileReference.download() abre a caixa de dilogo na qual o usurio pode baixar um arquivo de um servidor remoto. Nota: Se o servidor exigir autenticao de usurio, apenas os aplicativos Flash em execuo em um navegador (ou seja, que utilizam plug-in para navegador ou controle ActiveX), podero fornecer uma caixa de dilogo para solicitar que o usurio insira um nome e uma senha para autenticao, e somente para downloads. O Flash Player no permite uploads para um servidor que exige autenticao de usurio. Uploads e downloads no sero permitidos se o arquivo SWF que est chamando estiver na caixa de proteo local com sistema de arquivos. Por padro, um arquivo SWF no pode iniciar um upload ou um download de um servidor que no seja seu prprio servidor. Um arquivo SWF pode carregar ou baixar de um servidor diferente se esse servidor fornecer um arquivo de poltica que conceda permisso ao domnio do arquivo SWF que est chamando.

Carregamento de contedo incorporado de arquivos SWF importados em um domnio de segurana


Ao carregar um arquivo SWF, voc pode definir o parmetro context do mtodo load() do objeto Loader usado para carregar o arquivo. Esse parmetro usa um objeto LoaderContext. Ao definir a propriedade securityDomain do objeto LoaderContext como Security.currentDomain, o Flash Player verificar se h um arquivo de poltica de URL no servidor do arquivo SWF carregado. Se houver um arquivo de poltica e ele conceder acesso ao domnio do arquivo SWF que est sendo carregado, voc poder carregar o arquivo SWF como mdia importada. Dessa maneira, o arquivo carregado pode obter acesso a objetos na biblioteca do arquivo SWF. Uma maneira alternativa de um arquivo SWF acessar classes no arquivo SWF carregado de uma caixa de proteo de segurana diferente fazer com que o arquivo SWF carregado chame o mtodo Security.allowDomain() para conceder acesso ao domnio do arquivo SWF que est chamando. possvel adicionar a chamada ao mtodo Security.allowDomain() ao mtodo construtor da classe principal do arquivo SWF carregado e fazer com que o arquivo SWF que est sendo carregado adicione um ouvinte de eventos para responder ao evento init despachado pela propriedade contentLoaderInfo do objeto Loader. Quando esse evento for despachado, o arquivo SWF carregado ter chamado o mtodo Security.allowDomain() no mtodo construtor e as classes no arquivo SWF carregado estaro disponveis para o arquivo SWF que est sendo carregado. O arquivo SWF que est sendo carregado pode recuperar classes do arquivo SWF carregado chamando Loader.contentLoaderInfo.applicationDomain.getDefinition().

PROGRAMAO DO ACTIONSCRIPT 3.0 730


Segurana do Flash Player

Trabalho com contedo legado


No Flash Player 6, o domnio usado para determinadas configuraes do Flash Player se baseia na parte posterior do domnio do arquivo SWF. Essas configuraes incluem configuraes para permisses de cmera e microfone, quotas de armazenamento e armazenamento de objetos compartilhados persistentes. Se o domnio de um arquivo SWF incluir mais de dois segmentos, como www.example.com, o primeiro segmento do domnio (www) ser removido e a parte restante do domnio ser usada. Assim, no Flash Player 6, www.example.com e store.example.com usam example.com como domnio dessas configuraes. De modo semelhante, www.example.co.uk e store.example.co.uk usam example.co.uk como o domnio dessas configuraes. Isso pode resultar em problemas nos quais arquivos SWF de domnios no relacionados, como example1.co.uk e example2.co.uk, tm acesso aos mesmos objetos compartilhados. No Flash Player 7 e posterior, as configuraes do player so escolhidas por padro de acordo com o domnio exato de um arquivo SWF. Por exemplo, um arquivo SWF do www.example.com usa as configuraes do player para www.example.com. Um arquivo SWF do store.example.com usa as configuraes separadas do player para store.example.com. Em um arquivo SWF gravado com o ActionScript 3.0, quando Security.exactSettings definida como true (o padro), o Flash Player usa domnios exatos para configuraes do player. Quando definido como false, o Flash Player usa as configuraes de domnio usadas no Flash Player 6. Se alterar o valor padro de exactSettings, voc dever faz-lo antes de ocorrer algum evento que exija que o Flash Player escolha configuraes de player, por exemplo: usando uma cmera ou um microfone ou recuperando um objeto compartilhado persistente. Se voc publicou um arquivo SWF da verso 6 e criou objetos compartilhados persistentes a partir dele, para recuperar esses objetos compartilhados persistentes de um SWF que usa o ActionScript 3.0, voc deve definir Security.exactSettings como false antes de chamar SharedObject.getLocal().

Configurao de permisses de LocalConnection


A classe LocalConnection permite desenvolver arquivos SWF que podem enviar instrues um para o outro. Objetos LocalConnection podem se comunicar apenas entre arquivos SWF que esto em execuo no mesmo computador cliente, mas podem estar em execuo em diferentes aplicativos; por exemplo, um arquivo SWF em execuo em um navegador e um arquivo SWF em execuo em um projetor. Para cada comunicao LocalConnection, h um arquivo SWF e um arquivo SWF ouvinte. Por padro, o Flash Player permite comunicao LocalConnection entre arquivos SWF no mesmo domnio. Para arquivos SWF em diferentes caixas de proteo, o ouvinte deve permitir permisso de remetente usando o mtodo LocalConnection.allowDomain(). A string passada como um argumento para o mtodo LocalConnection.allowDomain() pode conter qualquer um dos seguintes: nomes exatos do domnio, endereos IP e * asterisco. A forma do mtodo allowDomain() foi alterada desde o ActionScript 1.0 e 2.0. Nessas verses anteriores,
allowDomain() era um mtodo de retorno de chamada que voc implementava. No ActionScript 3.0, allowDomain() um mtodo embutido da classe LocalConnection que voc chama. Com essa alterao, allowDomain() funciona da mesma maneira que Security.allowDomain().

Um arquivo SWF usa a propriedade domain da classe LocalConnection para determinar seu domnio.

PROGRAMAO DO ACTIONSCRIPT 3.0 731


Segurana do Flash Player

Controle do acesso URL de sada


Script e acesso URL de sada (por meio do uso de URLs HTTP, mailto: etc.) so executados com o uso das seguintes APIs do ActionScript 3.0:

A funo flash.system.fscommand() O mtodo ExternalInterface.call() A funo flash.net.navigateToURL()


Para arquivos SWF em execuo localmente, as chamadas para esses mtodos sero bem-sucedidas apenas se o arquivo SWF e a pgina que o contm (se houver) estiverem na caixa de proteo de segurana local confivel. Haver falha em chamadas para esses mtodos se o contedo estiver na caixa de proteo local com rede ou local com sistema de arquivos. Para arquivos SWF que no esto em execuo localmente, todas essas APIs podem se comunicar com a pgina da Web na qual esto incorporados, dependendo do valor do parmetro AllowScriptAccess descrito a seguir. A funo flash.net.navigateToURL() tem a capacidade adicional de comunicao com qualquer janela ou quadro de navegador aberto, no apenas com a pgina na qual o arquivo SWF est incorporado. Para obter mais informaes sobre essa funcionalidade, consulte Uso da funo navigateToURL() na pgina 732. O parmetro AllowScriptAccess no cdigo HTML que carrega um arquivo SWF controla a capacidade de executar acesso URL a partir do arquivo SWF. Defina esse parmetro dentro da tag PARAM ou EMBED. Se nenhum valor estiver definido para AllowScriptAccess, o arquivo SWF e a pgina HTML podero se comunicar apenas se os dois forem do mesmo domnio. O valor do parmetro AllowScriptAccess pode ser um destes trs valores possveis: "always", "sameDomain" ou "never".

Quando AllowScriptAccess "always", o arquivo SWF pode se comunicar com a pgina HTML na qual ele est
incorporado, mesmo quando o arquivo de um domnio diferente da pgina HTML.

Quando AllowScriptAccess "sameDomain", o arquivo SWF pode se comunicar com a pgina HTML na qual
ele est incorporado apenas quando o arquivo SWF est no mesmo domnio que a pgina HTML. Esse valor o padro de AllowScriptAccess. Use essa configurao, ou no defina um valor para AllowScriptAccess, para evitar que um arquivo SWF hospedado em um domnio acesse um script em uma pgina HTML proveniente de outro domnio.

Quando AllowScriptAccess est definido como "never", um arquivo SWF no pode se comunicar com
nenhuma pgina HTML. O uso deste valor tornou-se obsoleto no Adobe Flash CS4 Professional. Ele no recomendado e no deveria ser necessrio se voc no disponibiliza arquivos SWF no confiveis de seu prprio domnio. Se for necessrio servir arquivos SWF no confiveis, a Adobe recomenda que seja criado um subdomnio diferente e que todo o contedo no confivel seja colocado nele. Este um exemplo de configurao da tag AllowScriptAccess em uma pgina HTML para permitir acesso URL de sada para um domnio diferente:
<object id='MyMovie.swf' classid='clsid:D27CDB6E-AE6D-11cf-96B8-444553540000' codebase='http://download.adobe.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0' height='100%' width='100%'> <param name='AllowScriptAccess' value='always'/> <param name='src' value=''MyMovie.swf'/> <embed name='MyMovie.swf' pluginspage='http://www.adobe.com/go/getflashplayer' src='MyMovie.swf' height='100%' width='100%' AllowScriptAccess='never'/> </object>

PROGRAMAO DO ACTIONSCRIPT 3.0 732


Segurana do Flash Player

Uso da funo navigateToURL()


Alm da configurao de segurana especificada pelo parmetro allowScriptAccess discutido acima, a funo navigateToURL() tem um segundo parmetro - target. O parmetro target pode ser usado para especificar o nome de uma janela ou quadro HTML para o qual enviar a solicitao de URL. Restries de segurana adicionais se aplicam a essas solicitaes, e as restries variaro se navigateToURL() estiver sendo usado como uma instruo de script ou de no-script. Para instrues de script, como navigateToURL("javascript: alert('Hello from Flash Player.')"), as seguintes regras so aplicadas.

Se o arquivo SWF for um arquivo confivel localmente, a solicitao ter xito. Se o destino for a pgina HTML na qual o arquivo SWF est incorporado, as regras de allowScriptAccess
descritas acima sero aplicadas.

Se o destino contiver contedo carregado do mesmo domnio que o arquivo SWF, a solicitao ter xito. Se o destino contiver contedo carregado de um domnio diferente do arquivo SWF, e nenhuma das duas condies
anteriores for atendida, haver falha na solicitao. Para instrues de no-script (como HTTP, HTTPS e mailto:, haver falha na solicitao se todas as condies a seguir se aplicarem:

O destino uma das palavras-chave "_top" ou "_parent" e o arquivo SWF uma pgina da Web hospedada em um domnio diferente e o arquivo SWF est incorporado com um valor de allowScriptAccess diferente de "always".

Para obter mais informaes


Para obter mais informaes sobre acesso URL de sada, consulte as seguintes entradas no Referncia dos componentes e da linguagem do ActionScript 3.0:

A funo flash.system.fscommand() O mtodo call() da classe ExternalInterface A funo flash.net.navigateToURL()

Objetos compartilhados
O Flash Player fornece a capacidade de usar objetos compartilhados que so objetos ActionScript que persistem fora de um arquivo SWF, seja localmente no sistema de arquivos de um usurio ou remotamente em um servidor RTP. Objetos compartilhados, como outras mdias no Flash Player, so particionados em caixas de proteo de segurana. No entanto o modelo de caixa de proteo para objetos compartilhados um pouco diferente porque objetos compartilhados no so recursos que podem ser acessados alm dos limites do domnio. Ao contrrio, os objetos compartilhados sempre so recuperados de um armazenamento de objetos compartilhados que especfico ao domnio de cada arquivo SWF que chama mtodos da classe SharedObject. Normalmente, um objeto compartilhado mais particular do que o domnio de um arquivo SWF: por padro, cada arquivo SWF usa um armazenamento de objetos compartilhados especfico a toda a sua URL de origem.

PROGRAMAO DO ACTIONSCRIPT 3.0 733


Segurana do Flash Player

Um arquivo SWF pode usar o parmetro localPath dos mtodos SharedObject.getLocal() e SharedObject.getRemote() para usar um armazenamento de objetos compartilhados com apenas uma parte de sua URL. Dessa maneira, o arquivo SWF pode permitir o compartilhamento com outros arquivos SWF de outras URLs. Mesmo que voc passe '/' como o parmetro localPath, ele ainda especifica um objeto compartilhado especfico a seu prprio domnio. Os usurios podem restringir o acesso a objetos compartilhados usando a caixa de dilogo Configuraes do Flash Player ou o Gerenciador de configuraes. Por padro, os objetos compartilhados podem ser criados at um mximo de 100 KB de dados por domnio. Usurios administrativos e usurios tambm podem aplicar restries quanto capacidade de gravar no sistema de arquivos. Para obter mais informaes, consulte Controles de administrador na pgina 708 e Controles de usurio na pgina 710. possvel especificar que um objeto compartilhado est protegido especificando true para o parmetro secure do mtodo SharedObject.getLocal() ou do mtodo SharedObject.getRemote(). Observe o seguinte sobre o parmetro secure:

Se esse parmetro for definido como true, o Flash Player criar um novo objeto compartilhado ou obter uma
referncia a um objeto compartilhado protegido existente. Esse objeto compartilhado protegido apenas poder ser lido ou gravado por arquivos SWF entregues via HTTPS que chamarem SharedObject.getLocal() com o parmetro protegido definido como true.

Se esse parmetro for definido como false, o Flash Player criar um novo objeto compartilhado ou obter uma
referncia a um objeto compartilhado existente que pode ser lido ou gravado por arquivos SWF entregues via conexes no-HTTPS. Se o arquivo SWF que faz a chamada no for de uma URL HTTPS, especificar true para o parmetro secure do mtodo SharedObject.getLocal() ou do mtodo SharedObject.getRemote() resultar em uma exceo SecurityError. A opo de armazenamento de um objeto compartilhado tem como base a URL de origem do arquivo SWF. Isso verdadeiro mesmo nas duas situaes em que um arquivo SWF no originrio de uma URL simples: carregamento de importao e carregamento dinmico. O carregamento de importao se refere situao em que voc carrega um arquivo SWF com a propriedade LoaderContext.securityDomain definida como SecurityDomain.currentDomain. Nessa situao, o arquivo SWF carregado ter uma pseudo-URL que comea com o domnio dou arquivo SWF carregado e especifica sua URL de origem real. O carregamento dinmico refere-se ao carregamento de um arquivo SWF usando o mtodo Loader.loadBytes(). Nessa situao, o arquivo SWF carregado ter uma pseudo-URL que comea com a URL completa do arquivo SWF carregado, seguida por uma ID de nmero inteiro. Em ambos os casos de carregamento de importao e de carregamento dinmico, a pseudo-URL de um arquivo SWF pode ser examinada usando a propriedade LoaderInfo.url. A pseudo-URL tratada exatamente como uma URL real para a escolha de um armazenamento de objetos compartilhados. possvel especificar o parmetro localPath de um objeto compartilhado que use parte ou toda a pseudo-URL. Usurios e administradores podem optar por desativar o uso de objetos compartilhados de terceiros. Esse o uso de objetos compartilhados por qualquer arquivo SWF que esteja em execuo em um navegador da Web, quando a URL de origem desse arquivo SWF for de um domnio diferente da URL mostrada na barra de endereo do navegador. Usurios e administradores podem optar por desativar o uso de objetos compartilhados de terceiros por motivos de privacidade, com o objetivo de impedir rastreamento entre domnios. Para evitar essa restrio, convm garantir que qualquer arquivo SWF que usa objetos compartilhados seja carregado apenas dentro de estruturas da pgina HTML que garantem que o arquivo SWF se origina do mesmo domnio mostrado na barra de endereo do navegador. Quando voc tenta usar objetos compartilhados de um arquivo SWF de terceiros, e o objeto compartilhado de terceiros est desativado, os mtodos SharedObject.getLocal() e SharedObject.getRemote() retornam null. Para obter mais informaes, consulte www.adobe.com/products/flashplayer/articles/thirdpartylso.

PROGRAMAO DO ACTIONSCRIPT 3.0 734


Segurana do Flash Player

Acesso a cmera, microfone, rea de transferncia, mouse e teclado


Quando um arquivo SWF tenta acessar a cmera ou o microfone de um usurio usando os mtodos Camera.get() ou Microphone.get(), o Flash Player exibe a caixa de dilogo Privacidade na qual o usurio pode permitir ou negar acesso sua cmera e microfone. O usurio e o usurio administrativo tambm podem desativar o acesso cmera em uma base por site ou global, por meio de controles no arquivo mms.cfg, da UI de Configuraes e do Gerenciador de configuraes (consulte Controles de administrador na pgina 708 e Controles de usurio na pgina 710). Com restries de usurio, cada mtodo Camera.get() e Microphone.get() retorna um valor null. possvel usar a propriedade Capabilities.avHardwareDisable para determinar se a cmera e o microfone foram proibidos (true) ou permitidos (false) administrativamente. O mtodo System.setClipboard() permite que um arquivo SWF substitua o contedo da rea de transferncia por uma string de caracteres de texto simples. Isso no impe nenhum risco de segurana. Para proteo contra o risco imposto por recorte e cpia de senhas e outros dados confidenciais nas reas de transferncia, no h nenhum mtodo getClipboard() correspondente. Um aplicativo executado no Flash Player s pode monitorar eventos de teclado e de mouse que ocorrem dentro de seu foco. O contedo executado no Flash Player no consegue detectar eventos de teclado ou de mouse em outro aplicativo.

735

ndice
Smbolos ^ (circunflexo) 213 __proto__ 39 __resolve 39 , operador (vrgula) 50 ? operador (condicional) 75 . (dot), operador 65 . metacaractere (ponto) 213 . operador (dot) 82 ... (rest), parmetro 88 ) 213 colchete de abertura (\ 213 * asterisco, anotao de tipo 52, 54, 60 / (barra) 212, 213 \? (ponto de interrogao) 213 \] (colchete da direita) 213 \\ (barra invertida) em expresses regulares 213 em strings 145 & (e comercial) 615 | (pipe) 218 A Acelerao de hardware, para tela cheia 539 acessador do descendente (..) operador, XML 241 ActionScript armazenamento em arquivos do ActionScript 25 compatibilidade com verses anteriores 7 criao de aplicativos com 24 descrio do 4 documentao 2 escrita com editores de texto 27 ferramentas de escrita 26 formas de incluir em aplicativos 25 histrico de suporte da OOP 118 novos recursos no 5 processo de desenvolvimento 27 sobre 38 vantagens do 4 ActionScript 1.0 119 ActionScript 2.0, cadeia de prottipos 120 agrupamento de objetos de exibio 282 alterao de status, eventos 198 alternao em expresses regulares 218 alto-falantes e microfones 590 ambiente do sistema cliente sobre 653 tarefas comuns 653 ambiente lxico 90 animao 311 annimas, funes 81, 87 anotao de tipo asterisco (*) 52, 54, 60 anotaes de tipo 49, 54 API externa conceitos e termos 685 exemplo 692 formato XML 691 sobre 685 tarefas comuns 685 vantagens 687 aplicativo/x-www-form-urlencoded 614 aplicativos de podcast criao 592 extenso 599 aplicativos, decises de desenvolvimento 24 rea de transferncia salvamento de texto 655 segurana 734 rea de transferncia copiar e colar 668 formatos de dados 669, 670 argumentos transmitidos por valor ou referncia 85 aritmtica da data 136 armadura 429 armazenamento de dados 628 armazenamento em cache de bitmaps filtros 357 quando evitar 304 quando usar 303 vantagens e desvantagens 303 armazenamento local 628 arquitetura de exibio 274, 322 arquivo mms.cfg 709 e vdeo 539 arquivos carregamento 631 download 729 gravao 633 suporte a copiar e colar 668 upload 643, 729 arquivos de poltica 711, 727 classes URLLoader e URLStream 727 extrao de dados 724 propriedade checkPolicyFile e 315, 725 propriedade securityDomain e 719 tag img e 720 arquivos de poltica de soquete 711, 727 arquivos de poltica de URL 711 arquivos de poltica entre domnios Consulte arquivos de poltica arquivos de poltica mestre 712 arquivos SWF carregamento 313 comunicao entre domnios 623 comunicao entre ocorrncias 621 determinao do ambiente de tempo de execuo 656 importao de carregados 729 arquivos SWF externos carregamento 415 arrastar e soltar captura de interaes 604 criao da interao 294 aspas 145 aspas duplas em strings 145 aspas simples em strings 145 assncronos, erros 187 associatividade, regras de 70 atributo allowFullScreen 717 atributo dinmico 95 atributo final 56, 103, 106, 114 atributo internal 42, 44, 98 atributo private 97 atributo protected 98 atributo public 96 atributo static 98 autoria do Flash, quando usar para o ActionScript 26 avanar clipes de filme 411 AVM1 (ActionScript Virtual Machine) 118 AVM2 (ActionScript Virtual Machine 2) 118, 122

PROGRAMAO DO ACTIONSCRIPT 3.0 736


ndice

B barra 212, 213 barras barra (/) 212, 213 barra invertida (\\) 145, 213 bitmap formatos de arquivo 485 suavizao 488 bitmaps definio na classe Bitmap 278 otimizao 495 segurana 725 sobre 485 suporte a copiar e colar 668 transparente versus opaco 486 blocos catch 191 bone 429 bytes carregados 314 C cache de filtros e bitmaps 357 cadeia de prottipos 38, 120 cadeia do escopo 90, 117 caixas de proteo 706 cmeras captura de entrada 556 condies de reproduo 561 exibio do contedo na tela 557 permisses 558 segurana 730, 734 verificao da instalao 558 caminho 335 caminho de classe 42 caminho de criao 42 caminho de origem 42 campos de texto desativao do IME para 662 dinmicos 435 entrada 435 estticos 435 HTML em 444 imagens em 438 modificao 437 rolagem de texto 439 tag img e segurana 720 campos de texto de entrada 435 campos de texto dinmicos 435 campos de texto estticos 435 captura da entrada da cmera 556

captura de texto selecionado pelo usurio 441 caractere circunflexo (^) 213 caractere de barra (|) 218 caractere de barra invertida (\\) em expresses regulares 213 em strings 145 caractere de nova linha 145 caractere de tabulao 145 caractere delimitador, diviso de strings em matriz 149 caractere feed de formulrio 145 caractere pipe (|) 218 caracteres em expresses regulares 212 em strings 146, 149 caracteres ASCII 143 caracteres Unicode 143 carregamento de dados de arquivos 631 carregamento de grficos 313 cenas, para demarcar linhas de tempo 412 chaves de objeto em matrizes 171 chaves de string 170 chaves, string 170 cinemtica inversa 428 classe AnimatorFactory 427 classe ApplicationDomain 315, 657, 719 classe Array algoritmo do construtor 176 construtor 161 criao de ocorrncias 161 extenso 175 mtodo concat() 169 mtodo join() 169 mtodo pop() 164 mtodo push() 163, 177 mtodo reverse() 165 mtodo shift() 164 mtodo slice() 169 mtodo sort() 165 mtodo sortOn() 165, 167 mtodo splice() 163, 164 mtodo toString() 169 mtodo unshift() 163 propriedade de comprimento 165, 170 sobre 160 Classe AVM1Movie 279 Classe Bitmap 278 classe Bitmap 488 classe BitmapData 488

classe Boolean coero implcita no modo estrito 62 projeo 63 Classe ByteArray 175 classe Camera 556 Classe Capabilities 656 classe Clipboard mtodo setData() 671 mtodo setDataHandler() 671 propriedade generalClipboard 668 classe ClipboardFormats 669 classe ClipboardTransferModes 670 classe Date construtor 135 mtodo getMonth() 102, 136 mtodo getMonthUTC() 136 mtodo getTime() 136 mtodo getTimezoneOffset() 137 mtodo parse() 102 mtodo setTime() 136 propriedade date 136 propriedade day 136 propriedade fullYear 135 propriedade hours 136 propriedade milliseconds 136 propriedade minutes 136 propriedade month 135 propriedade monthUTC 136 propriedade seconds 136 sobre 134 classe Delegate 263 classe Dictionary parmetro useWeakReference 172 sobre 171 classe DisplayObject propriedade blendShader 400 propriedade stage 256 sobre 275, 282 Classe DisplayObjectContainer 279 classe DisplayObjectContainer 275, 282 Classe ErrorEvent 267 classe ErrorEvent 197 classe Event categorias de mtodo 260 constantes 258 mtodo clone() 260 mtodo isDefaultPrevented() 261 mtodo preventDefault() 255, 261 mtodo stopImmediatePropogation() 260

PROGRAMAO DO ACTIONSCRIPT 3.0 737


ndice

mtodo stopPropogation() 260 mtodo toString() 260 propriedade bubbles 259 propriedade cancelable 258 propriedade currentTarget 260 propriedade eventPhase 259 propriedade target 260 propriedade type 258 sobre 258 subclasses 261 classe EventDispatcher interface IEventDispatch e 108 mtodo addEventListener() 105, 255 mtodo dispatchEvent() 266 mtodo willTrigger() 266 referncias 66 classe ExternalInterface 687, 717, 731 classe facade 594 classe FileReference 630, 631, 633, 717, 729 classe FileReferenceList 643, 729 classe Graphics mtodo BeginShaderFill() 396 classe GraphicsPathCommand 336 classe HTMLLoader copiar e colar 668 classe IKEvent 432 classe IKMover 431 classe int, projeo 62 Classe InteractiveObject 279 Classe Loader 313 classe Loader 717, 725, 729 classe LoaderContext 315, 719, 725 classe LoaderInfo acesso a objeto de exibio 724 monitoramento do progresso do carregamento 314 classe LocalConnection parmetro connectionName 624 permisses 730 restrita 717 sobre 619 classe Matrix definio de gradientes com 328 classe Matrix3D 516 classe Microphone 260 Classe MorphShape 279 classe Motion 425 classe MotionBase 423 Classe MouseEvent 255, 261 Classe MovieClip 279

classe MovieClip taxas de quadros 287 classe mx.util.Delegate 263 classe NetConnection 717 classe NetStream 714, 717, 720 classe Number funo global isNaN() 52 intervalo de inteiros 59 preciso 59 projeo 62 valor padro 52 classe Object matrizes associativas 170 mtodo valueOf() 124 propriedade de prottipo 120, 123 tipo de dados e 60 classe PerspectiveProjection 512 Classe Proxy 46 classe RegExp mtodos 224 propriedades 221 sobre 209 classe Security 717 classe SecurityDomain 315, 719 classe Shader 388 propriedade data 389 classe ShaderData 389 classe ShaderFilter 404 classe ShaderInput 392 propriedade input 392 classe ShaderJob 406 mtodo start() 407 modo de execuo sncrona 407 propriedade target 407 classe ShaderParameter 393 propriedade index 396 propriedade type 395 propriedade value 393 Classe Shape 278 classe SharedObject 628, 717 Classe SimpleButton 278 classe Socket 624, 717, 727 classe Sound 714, 717, 720 classe SoundFacade 594 classe SoundLoaderContext 714 Classe Sprite 279 classe Stage 256 classe StageDisplayState 717 Classe StaticText 279

classe String mtodo charAt() 146 mtodo charCodeAt() 146 mtodo concat() 147 mtodo fromCharCode() 146 mtodo indexOf() 149 mtodo lastIndexOf() 149 mtodo match() 150 mtodo replace() 150 mtodo seach() 150 mtodo slice() 148 mtodo split() 149 mtodos substr() e substring() 148 mtodos toLowerCase() e toUpperCase() 152 classe StyleSheet 444 classe TextEvent 255 Classe TextField 255, 279 classe TextField copiar e colar 668 Classe TextFormat 443 classe TextLineMetrics 456 classe TextSnapshot 449 classe Timer monitoramento da reproduo 598 sobre 137 Classe UIEventDispatcher 254 classe uint, projeo 62 classe URLLoader carregamento de dados XML 239, 247 quando restrita 717 segurana e 727 sobre 614 classe URLStream 717, 727 classe URLVariables 614 classe Vector construtor 162 criao de ocorrncias 161 criao de vetor de tamanho fixo 162 mtodo concat() 169 mtodo join() 169 mtodo reverse() 165 mtodo slice() 169 mtodo sort() 166 mtodo toString() 169 sobre 160 classe Vector3D 516 classe Video 532 Classe XML 40 Classe XMLDocument 234

PROGRAMAO DO ACTIONSCRIPT 3.0 738


ndice

classe XMLDocument 41 Classe XMLNode 234 Classe XMLParser 234 Classe XMLSocket 239, 247 classe XMLSocket 625, 717, 727 Classe XMLTag 234 classes abstratas no suportadas 95 atributo dinmico 95 atributo internal 98 atributo private 97 atributo protected 98 atributo public 96 atributos 94 atributos de propriedades 96 base 110 caractersticas 12 classes particulares 40 classes pblicas 42 controle de acesso padro 98 corpo 95 criao personalizada 28 declarao de propriedades estticas e de ocorrncia 96 definio de espaos para nomes em 95 definies de 94 dinmicas 57, 82, 97 embutidas 39 herana de propriedades da ocorrncia 112 instrues de nvel superior 95 propriedades estticas 116 seladas 57 sobre 94 sobre a escrita de cdigo para 29 subclasses 110 classes abstratas 95 classes base 110 classes de ativos incorporados 107 classes de caracteres (em expresses regulares) 215 classes de caracteres negadas (em expresses regulares) 216 classes de dados grficos 339 classes de erro ActionScript 201 sobre 199 classes de erros personalizadas 195 classes dinmicas 97 classes Error principais no ECMAScript 199 classes particulares 40

classes personalizadas 28 classes pblicas 42 classificao de matrizes 165, 166 cliente LocalConnection personalizado 620 Clipboard sistema 668 clipes de filme avanar 411 conceitos e termos 409 reproduzir e parar 410 retroceder 411 sobre 408 tarefas comuns 408 taxa de quadros 287 codificao de URL 615 codificao do e comercial (&) 615 cdigo externo, chamada a partir do ActionScript 689 cdigo, formas de incluir em aplicativos 25 cdigos de caractere 602 cdigos de substituio 151 cdigos de substituio $ 151 cdigos de substituio de smbolo de dlar ($) 151 cdigos de tecla 602 colchete da direita (\]) 213 colchete da esquerda 213 colchete de fechamento 213 colchetes uso 159 ColdFusion 619 coleta de lixo 83, 172 ColorTransform, classe 350 colorTransform, propriedade 350 comentrios sobre 21, 67 em XML 235 compatibilidade, Flash Player e arquivos FLV 530 comportamento padro cancelamento 259 definido 255 comunicao entre arquivos SWF 621 entre arquivos SWF em domnios diferentes 623 entre ocorrncias do Flash Player 619 concatenao de objetos XML 240 de strings 147

conceitos bsicos comentrios 21 controle de fluxo 21 criao de ocorrncias de objetos 19 eventos 13 exemplo 22 mtodos 12 objetos 11 operadores 20 propriedades 12 variveis 9 condicionais 76 condicional (?\ ) operador 75 conexes de soquete 624, 727 conflitos de nome, evitar 40, 43 constantes 69, 99, 258 construtor Date() 135 construtor PrintJob() 675 construtor URLLoader 614 construtores no ActionScript 1.0 119 sobre 100 construtores particulares no suportados 101 contineres de objeto de exibio 275, 282 contineres externos, obteno de informaes 688 contedo da exibio, carregamento dinmico 313 contedo, carregamento dinmico 313 contexto do carregamento 315 contorno 335, 337 controle de fluxo, conceitos bsicos 21 converso de tipo 61, 62, 246 converso de tipo explcita 61 converso de tipo implcita 61 cookie Flash 628 cookies 628 copiar e colar modos de transferncia 670 renderizao adiada 671 cor do fundo, como deixar opaco 304 cores ajuste em objetos de exibio 306 alterao especfica 307 combinao de imagens diferentes 305 definio para objetos de exibio 306 plano de fundo 304 createBox(), mtodo 349 cross-scripting 721

PROGRAMAO DO ACTIONSCRIPT 3.0 739


ndice

CSS carregamento 445 definida 435 estilos 444 cursores de mouse, personalizao 605 cursores, personalizao 605 D da API de desenho. Consulte objetos de exibio dados carregamento externo 614 envio a servidores 618 segurana de 724, 728 dados de bitmap, cpia 491 dados externos, upload 614 dados RSS carregamento, exemplo 248 leitura para um canal de podcast 593 datas e horas exemplos 134 sobre 134 definies de classes, vrias 657 definies de vrias classes 657 depurao 190 desaparecimento de objetos de exibio 308 desempenho, melhora para objetos de exibio 302 desenvolvimento planejamento 24 processo 27 destino do evento 251, 256 deteco de coliso no nvel de pixel 490 diferenciao entre maisculas e minsculas 65 dimensionamento controle da distoro 301 matrizes 348 objetos de exibio 348 palco 288 Dimensionamento em hardware 291 dinmicas, classes 57, 82 Diretiva de espao para nomes XML padro 245 diretiva use namespace 45, 47, 125 disposio em camadas, reorganizao 321 distance(), mtodo 344 distncia focal 522 diviso por zero 59 do..while, repetio 80

documentao ActionScript 2 Adobe Developer Center e Adobe Design Center 3 Flash 2 Programao do ActionScript 3.0 sumrio 1 Documentao do Flash 2 documentos externos, carregamento de dados 615 dois-pontos (\ ) operador 54 domnios, comunicao entre 623 dot (.) operador 65, 82 download de arquivos 641, 729 drawPath() 335 drawTriangles() 519 E caracteres de colchetes (\ 213 e comercial (&) 615 E4X. Consulte XML ECMAScript para XML. Consulte XML editores de texto 27 elevao 56 embutidas, classes 39 encaixe de pixels 488 encapsulamento HTTP 625 endereos de 128 bits 612 Endian.BIG_ENDIAN 625 Endian.LITTLE_ENDIAN 625 entidade grfica, primeira carregada 275, 314 entrada do teclado, captura 601 entrada do usurio conceitos e termos 600 sobre 600 tarefas comuns 600 enumeraes 105 envio de eventos 251 Error, classes ECMAScript 199 erros assncronos 187 classe ErrorEvent 196, 267 classes personalizadas 195 eventos baseados no status 196 exibio 193 ferramentas de depurao 190 impresso 676 instruo throw 192

relanamento 194 sobre manipulao 184 tipos de 184, 186 erros sncronos 187 escala impresso 680 escopo funes e 83, 90 global 90 nvel de bloqueio 51 variveis 50 espao em branco 235 espao para nomes AS3 124, 176 espaos de coordenadas definio 342 transposio 344 espaos para nome AS3 176 espaos para nomes abertura 45 aplicao 45 AS3 124 atributos definidos pelo usurio 98 definio 44, 95 diretiva use namespace 45, 47, 125 espao para nomes padro 44 especificadores de controle de acesso 44 flash_proxy 46 importao 48 palavra-chave do espao para nomes 44 referncia 45 sobre 43 XML 245 Especificao de eventos DOM 251, 255 Especificao de eventos DOM nvel 3 251, 255 estrela (*). Consulte asterisco estruturas de dados 157 Event.COMPLETE 614 evento enterFrame 257 Evento fullScreen 290 evento init 257 eventos Consulte tambm ouvintes de evento alterao de status 198 comportamentos padro 255 conceitos bsicos 13 envio 251, 266 erro 196, 267 evento enterFrame 257

PROGRAMAO DO ACTIONSCRIPT 3.0 740


ndice

evento init 257 fluxo de evento 251, 256, 259 n de destino 256 n pai 257 objetos de evento 257 de objetos de exibio 291 palavra-chave this 263 segurana 724 eventos de erro 196, 267 eventos de erro baseados no status 196 eventos de tempo 138 excees 186 Exemplo da classe SpriteArranger 317 exemplo de analisador Wiki 225 exemplo de cliente Telnet 644 exemplo de GeometricShapes 125 exemplo de jukebox de vdeo 563 exemplo do relgio 139 Exemplo do WordSearch 607 exemplo SimpleClock 139 exemplos analisador Wiki 225 aplicativo de som 592 carregamento de dados RSS 248 classe Matrix 350 classe SpriteArranger 317 criao de um cliente Telnet 644 deteco de capacidades do sistema 664 expresses regulares 225 filtragem de imagens 379 formatao de texto 450 GeometricShapes 125 impresso de vrias pginas 680 jukebox de vdeo 563 manipulao de erros 267 matrizes 180 reorganizao das camadas do objeto de exibio 321 RunTimeAssetsExplorer 416 SimpleClock 139 strings 152 uso da API externa em um continer de pgina da Web 692 WordSearch 607 exibio do contedo da cmera na tela 557 exportao de smbolos da biblioteca 413 expresses de funo 81 expresses regulares alternao usando metacaractere pipe (|) 218 alternadores e grupos de caracteres 219

capturando correspondncias de substring 219 caracteres em 212 classes de caracteres 215 criao 212 delimitador de barra (/) 212 exemplo 225 grupos 218 grupos nomeados 220 metacaracteres 212, 213 metaseqncias 212, 214 mtodos para trabalhar com 224 parmetros em mtodos String 225 pesquisa 223 propriedades 221 quantificadores 216 sinalizadores 221 sobre 209 externos, carregamento de arquivos SWF 415 F fase de bubbling 256 fase de captura 256 fase ou n de destino 256 fechamentos de funo 80, 84, 90 FileReference.download() 715 FileReference.upload() 715 filtragem de dados XML 243 Filtro de sombreador 404 filtros alterao em tempo de execuo 358 aplicao em objetos BitmapData 357 aplicao em objetos de exibio 355 armazenamento em cache de bitmaps 357 criao 355 para objetos de exibio e bitmap 362 explicao 357 de imagens, exemplo 379 remoo de objetos de exibio 357 tarefas comuns 354 Flash Media Server 721 Flash Player compatibilidade com FLV codificado 530 comunicao entre ocorrncias 619 desativao do modo de tela cheia 539 IME e 659 tela cheia em um navegador 536 verso 6 119 verso do depurador 267

flash_proxy, espao para nomes 46 Flash, linha de tempo 25 Flex, quando usar para o ActionScript 27 fluxo de evento 251, 256, 259 fluxo de programa 76 FLV configurao para hospedagem em servidor 562 formato de arquivo 531 no Macintosh 563 foco, gerenciamento em interaes 606 folhas de estilo em cascata. Consulte CSS folhas de estilo. Consulte CSS fontes dispositivo 435 incorporadas 435, 447 fontes de dispositivo 435 fontes incorporadas definidas 435 uso 447 for each..instruo in 78, 171, 244 for..instruo in 78, 171, 244 formas, desenho 335 formatao de texto 443, 446 formatos de dados, rea de transferncia 669 formatos de hora 135 funo clearInterval() 139 funo clearTimeout() 139 funo fscommand() 619, 717, 731 funo getTimer() 139 funo global isNaN() 52 Funo global Vector 162 funo navigateToURL() 717, 731 funo onClipEvent() 254 funo sendToURL() 717, 728 funo setInterval() 139 funes acessor 103 adio de propriedades a 89 aninhadas 84, 90 annimas 81, 87 chamada 80 controle de tempo 139 escopo 83, 90 objeto de argumentos 85 objetos 88 parmetros 85 parnteses 80 recursivas 87

PROGRAMAO DO ACTIONSCRIPT 3.0 741


ndice

retorno de valores 84 sobre 80 funes aninhadas 84, 90 funes de acessor, get e set 103 funes de controle de tempo 139 fusos horrios 135, 137 G geometria conceitos e termos 323, 343 sobre 342 uso de tarefas comuns 342 gerenciamento de memria 172 gerenciamento de profundidade, aprimorado 280 getRect(), mtodo 348 getters e setters sobre 103 substituio 115 global, escopo 90 gradientes 328 Grficos GIF 313 Grficos JPG 313 Grficos PNG 313 grficos, carregamento 313 GraphicsStroke 335 gravao de dados em arquivos 633 grupos de no captura em expresses regulares 220 grupos nomeados (em expresses regulares) 220 grupos, em expresses regulares 218 H hashes 169, 171 herana definio 110 propriedade fixa 123 propriedades da ocorrncia 112 propriedades estticas 116 herana de classe 123 herana de propriedade fixa 123 Horrio universal (UTC) 135 Horrio universal coordenado (UTC) 135 I iamento 51 identificadores 43 if..else, instruo 76 IK 428

imagens em campos de texto 438 carregamento 313 definio na classe Bitmap 278 exemplo de filtragem 379 segurana 725 IME eventos de composio 663 manipulao no Flash Player 659 verificao da disponibilidade 660 importao de arquivos SWF 729 impresso altura e largura da pgina 680 conceitos e termos 675 escala 680 especificao da rea 679 excees e retornos 676 objetos Rectangle 679 orientao 680 pginas 675 pontos 679 propriedades da pgina 678 sobre 674 tarefas comuns 674 tempo limite 678 vrias pginas, exemplo 680 vetor ou bitmap 678 impresso de bitmap 678 impresso de vetor 678 impresso paisagem 680 impresso retrato 680 inclinao de matrizes 348, 349 inclinao de objetos de exibio 348 incompatibilidades de tipos 54 indices 519 infinito 59 infinito negativo 59 infinito positivo 59 instruo de pacote 94 instruo if 76 instruo import 42 instruo return 84, 101 instruo super 101, 102, 114 instruo switch 77 instrues de encerramento 67 instrues de funo 81 instrues PrintJob, controle de tempo 678 interaes do usurio, gerenciamento do foco 606 Interface IEventDispatcher 265

interface IEventDispatcher 108, 265 interface IGraphicsData 339 interfaces definio 109 extenso 109 implementao em uma classe 109 sobre 108 interfaces IDataInput e IDataOutput 625 interpolao de movimento 420 intersection(), mtodo 347 intersects(), mtodo 348 intervalos de caracteres, especificao 216 intervalos de tempo 137 IPv6 612 iterao por meio de matrizes 171 J juno 429 L linha de tempo do Flash, adio do ActionScript 25 lista de exibio como percorrer 286 fluxo de evento 256 segurana 723 sobre 274 vantagens 279 literais compostos 66 literais de objeto 170 Loader.load() 715 Loader.loadBytes() 715 localToGlobal(), mtodo 344 loop for (XML) 234, 244 for each..in 171, 244 for..in 171, 244 loops for, XML 234, 244 M Macintosh, arquivos FLV 563 malha com textura 508 manipulao de erros comportamentos padro 255 estratgias 189 exemplos 267 ferramentas 189 tarefas comuns 185 termos 185 manipuladores de evento 254

PROGRAMAO DO ACTIONSCRIPT 3.0 742


ndice

manipuladores de evento on() 254 mantissa 59 mapas 169, 171 Mapas MIP 495 Mapeamento UV 508, 521 mascaramento de objetos de exibio 309 mascaramento do canal alfa 310 Matrix, classe definio 348 dimensionamento 349 exemplo 350 inclinao 349 objetos, definio 349 rotao 349 transposio 349 matriz tipificada 160 matrizes associativas 169 chaves de objeto 171 classificao 165 clonagem 174 comprimento 165 consulta 169 cpia profunda 174 cpia superficial 174 criao 149, 161 exemplos 180 indexadas 159 insero de elementos 163 iterao 171 literais de matriz 66, 161 matrizes aninhadas e mtodo join() 169 multidimensionais 173 operador delete 164 pares de chave e valor 170 recuperao de valores 164 remoo de elementos 164 sobre 157 superconstrutor 176 tamanho mximo 159 tarefas comuns 158 termos 158 uso de matrizes associativas e indexadas 174 matrizes de transformao. Consulte Matrix, classe matrizes indexadas 159 matrizes no ordenadas 169 MAX_VALUE (classe Number) 59

mecanismo de texto adio de grficos 459 alinhamento da linha de base 467 bloqueio/clonagem de ElementFormat 469 bloqueio/clonagem de FontDescription 471 controle de texto 471 cor da fonte 466 criao de linhas 459 criao e exibio de texto 458 deslocamento da linha de base 467 ElementFormat 458 espaamento entre letras 473 espelhamento de eventos 464 exemplo de layout de jornal 476 FontDescription 469 fontes incorporadas versus fontes de dispositivo 470 formatao de texto 466 GraphicElement 458, 459 GroupElement 458, 460 justificao de texto 472 justificao de texto do Leste Asitico 473 kerning 474 manipulao de eventos 462 mtodo replaceText 461 objeto ElementFormat 466 paradas de tabulao 475 propriedade fontLookup 470 propriedade fontName 470 propriedade fontPosture 470 quebra de texto 475 quebras de linha 475 rastreamento 474 referncia de fonte 470 renderizao de fontes 470 rotao do texto 467 substituio de texto 461 suporte a idiomas asiticos 468 suporte para texto asitico 473 TextBlock 458 TextElement 458 TextLine 458 trabalho com fontes 469 transparncia da fonte (alfa) 466 uso de maisculas e minsculas no texto 467 menu de atalho (menu de contexto) 605 menu de contexto, personalizao 605

menu exibido ao clicar com o boto direito do mouse (menu de contexto) 605 metacaractere * (asterisco) 213 metacaractere + (adio) 213 metacaractere $ 213 metacaractere asterisco (*) 213 metacaractere sinal de dlar ($) 213 metacaracteres () (parnteses) 213 metacaracteres, em expresses regulares 212 metadados Pixel Bender 389 metadados, vdeo 548, 551 uso 547 metapolticas 712 metaseqncias, em expresses regulares 212, 214 mtodo addCallback() 722 mtodo addEventListener() 105, 255, 265 mtodo addFilterProperty() 425 mtodo addListener() 255 mtodo addPropertyArray() 423 mtodo addTarget() 427 mtodo allowDomain() carregamento do contexto 315 classe LocalConnection 623 construtor e 729 sobre cross-scripting 721 som e 726 tag img e 720 mtodo allowInsecureDomain() 623 mtodo apply() 176 mtodo beginGradientFill() 328 mtodo browse() 729 mtodo call() (classe ExternalInterface) 717, 731 mtodo charAt() 146 mtodo charCodeAt() 146 mtodo clone() (classe BitmapData) 491 mtodo clone() (classe Event) 260 mtodo computeSpectrum() (classe SoundMixer) 721, 724, 725 mtodo concat() classe String 147 mtodo connect() classe LocalConnection 717 classe NetConnection 717, 720 classe Socket 717 classe XMLSocket 717 mtodo createGradientBox() 328 mtodo decode() 615 mtodo dispatchEvent() 266 mtodo download() 717, 729

PROGRAMAO DO ACTIONSCRIPT 3.0 743


ndice

mtodo draw() 315, 719, 721, 724, 725, 726 mtodo exec() 224 mtodo ExternalInterface.addCallback() 722 mtodo fromCharCode() 146 mtodo Function.apply() 176 mtodo getArmatureByName() 431 mtodo getBoneByName() 431 mtodo getDefinition() 729 mtodo getImageReference() 721 mtodo getLocal() 628, 717, 730, 732 mtodo getMonth() 102, 136 mtodo getMonthUTC() 136 mtodo getRemote() 628, 717, 732 mtodo getTime() 136 mtodo getTimezoneOffset() 137 mtodo indexOf() 149 mtodo initFilters() 425 mtodo isDefaultPrevented() 261 mtodo join() 169 mtodo lastIndexOf() 149 mtodo lineGradientStyle() 328 mtodo load() (classe Loader) 315, 714, 717 mtodo load() (classe Sound) 714, 717, 720, 729 mtodo load() (classe URLLoader) 614, 717 mtodo load() (classe URLStream) 717, 729 mtodo loadBytes() 315, 714 mtodo loadPolicyFile() 717 mtodo LocalConnection.allowDomain() 623, 730 mtodo LocalConnection.allowInsecureDomai n() 623 mtodo LocalConnection.connect() 717 mtodo match() 150 mtodo NetConnection.connect() 717, 720 mtodo parse() 102 mtodo play() (classe NetStream) 717 mtodo pop() 164 mtodo preventDefault() 255, 261 mtodo push() 163, 177 mtodo replace() 139, 150, 151 mtodo reverse() 165 mtodo search() 150 mtodo Security.allowDomain() 714 carregamento do contexto 315 construtor e 729 sobre cross-scripting 721

som e 726 tag img e 720 mtodo send() (classe LocalConnection) 620, 717 mtodo setClipboard() 734 mtodo setData() mtodo Clipboard 671 mtodo setDataHandler() (classe Clipboard) 671 mtodo setTime() 136 mtodo setTimeout() 139 mtodo SharedObject.getLocal() 730, 732, 733 mtodo SharedObject.getRemote() 732, 733 mtodo shift() 164 mtodo slice() classe String 148 mtodo SoundMixer.computeSpectrum() 721, 724, 725 mtodo SoundMixer.stopAll() 725 mtodo splice() 163, 164 mtodo split() 149 mtodo stopAll() (classe SoundMixer) 725 mtodo stopImmediatePropogation() 260 mtodo stopPropogation() 260 mtodo String() sobre 147 mtodo System.setClipboard() 734 mtodo test() 224 mtodo toLowerCase() 152 mtodo toString() classe Event 260 mtodo toUppercase() 152 mtodo unshift() 163 mtodo upload() 717, 729 mtodo URLLoader.load() 614, 615 mtodo URLVariables.decode() 615 mtodo valueOf() (classe Object) 124 mtodo willTrigger() 266 mtodo XMLSocket.connect() 717 mtodos conceitos bsicos 12 construtores 100 definio 100 estticos 101 getters e setters 103, 115 ocorrncia 102 substituio 114 vinculados 91, 104 mtodos de ocorrncia 102

mtodos de retorno de chamada manipulao 543 pontos de sinalizao e metadados de vdeo 542 mtodos estticos 101 mtodos substr() e substring() 148 mtodos vinculados 91, 104 mtricas de linha de texto 435, 456 microfone acesso 589 deteco de atividade 590 roteamento para alto-falantes locais 590 segurana 730, 734 mdia carregada, acesso como dados 724 MIN_VALUE (classe Number) 59 modo de converso do IME configurao 661 determinao 660 modo de mesclagem de sombreador 400 modo de tela cheia 289, 290, 717 modo estrito converso explcita 61 erros em tempo de execuo 55 projeo 61 retorno de valores 84 sobre 53 modo padro 55, 82 modo restrito sintaxe de pontos e 82 monitor, modo de tela cheia 289 MovieClip, criando objetos 413 N NaN, valor 59 navigateToURL() 715 NetConnection.call() 715 NetConnection.connect() 715 NetStream.play() 715 nvel de bloqueio, escopo 51 ns em XML, acesso 241 nmeros octais 62 O objeto arguments 85, 86, 88 objeto de ativao 90 objeto de caractersticas 122 objeto de classe 38, 121 objeto de lista de exibio 255 objeto de prottipo 82, 120, 123 Objeto Fill 335

PROGRAMAO DO ACTIONSCRIPT 3.0 744


ndice

objeto global 90 objeto LoaderContext 714 objetos conceitos bsicos 11 instanciao 19 objetos BitmapData, aplicao de filtros 357 objetos compartilhados configuraes do Flash Player e 730 exibio de contedo de 629 segurana e 630, 732 sobre 628 objetos Date obteno de valores de tempo 135 objetos de Date exemplo de criao 135 objetos de evento 251 objetos de exibio adio lista de exibio 282 agrupamento 282 ajuste de cores 306 animao 311 API de desenho e 322 armazenamento em cache 302 bitmaps 485 clipes de filme 408 criao 282 definio de cores 306 desaparecimento 308 dimensionamento 299, 301, 348 entrada do usurio 600 escolha de uma subclasse 292 eventos 291 exemplo 316, 332 exemplo de clique e arrasto 320 exemplo de reorganizao 321 filtro 354, 355, 362 fora da lista 281 gerenciamento de profundidade 280 herana das classes principais 278 inclinao 348 mascaramento 309 montagem de objetos complicados 281 posicionamento 293, 294 remoo de filtros 357 rotao 308, 348 segurana 723 sobre 275 subclassificao 281 tamanho 299 tarefas comuns 276

termos 277 transformao de matriz 349 transposio 348 objetos de exibio fora da lista 281 objetos de funo 94 objetos delimitadores 53 objetos genricos 66, 170 objetos Point distncia entre pontos 344 sobre 344 transposio de espaos de coordenadas 344 objetos Rectangle impresso 679 objetos serializados suporte a copiar e colar 668 objetos visuais. Consulte objetos de exibio objetos XMLList concatenao 240 sobre 237 ocorrncia URLRequest 614, 615 ocorrncias, criao 19 opo -as3 do compilador 176 opo -es do compilador 176 opes do compilador 125, 176 operao assncrona 267 operador != (desigualdade) 146 operador !== (desigualdade estrita) 146 operador . (ponto), XML 234, 241 operador .. (acessador do descendente), XML 241 operador @ (identificador de atributo), XML 234, 242 operador * (caractere curinga), XML 242 operador + (adio) 147 operador + (concatenao), XMLList 240 operador += (atribuio de adio) 147, 240 operador == 146 operador === 146 operador > 146 operador >= 146 operador as 57, 108 operador de acesso matriz 159 operador de acesso s propriedades 171 operador de adio (+) 147 operador de asterisco (caractere curinga), XML 242 operador de atribuio de adio (+=) 147 operador de caractere curinga (*), XML 242 operador de concatenao (+), XMLList 240 operador de desigualdade (!=) 146

operador de desigualdade estrita (!==) 146 operador de identificador de atributo (@), XML 234, 242 operador delete 83, 164 operador instanceof 57 operador is 56, 108 operador maior do que 71 operador maior ou igual a 146 operador maior que 146 operador menor do que 71 operador menor ou igual a 146 operador menor que 146 operador new 39 operador vrgula 50 operadores aditivos 73 atribuio 75 conceitos bsicos 20 condicionais 75 desvio em nvel de bits 74 igualdade 74, 146 lgicos 75 lgicos em nvel de bits 74 multiplicativos 73 precedncia 70 prefixo 73 primrios 72 relacionais 74 sobre 70 sufixo 72 unrios 70, 73 operadores ( ) (filtragem XML) 243 operadores (parnteses) () 67 operadores aditivos 73 operadores associativos direita 70 operadores associativos esquerda 70 operadores binrios 70 operadores de atribuio 75 operadores de chaves ({ e }) em XML 239 operadores de desvio em nvel de bits 74 operadores de igualdade 74, 146 operadores de prefixo 73 operadores de sufixo 72 operadores lgicos 75 operadores lgicos em nvel de bits 74 operadores multiplicativos 73 operadores primrios 72 operadores relacionais 74 operadores sobrecarregados 70 operadores ternrios 70

PROGRAMAO DO ACTIONSCRIPT 3.0 745


ndice

operadores unrios 70, 73 ordem de bytes 625 ordem de bytes big-endian 625 ordem de bytes de rede 625 ordem de bytes little-endian 625 ouvintes de evento alteraes no ActionScript 3.0 255 criao 261 fora de uma classe 262 gerenciamento 265 como mtodos de classe 263 remoo 266 sobre 251 tcnica a ser evitada 264 ouvintes. Consulte ouvintes de evento P pacote flash 41 pacote flash.display API de desenho e 322 bitmaps e 485 clipes de filme e 408 entrada do usurio 600 filtro 354 sobre a programao de exibio 274 som e 569 Pacote flash.geom 342 pacotes criao 41 importao 41 nvel superior 40, 41 operador dot 40, 65 pacotes aninhados 40 sintaxe de pontos 66 sobre 40 pacotes aninhados 40 palavra-chave classe 94 palavra-chave de funo 81, 100 palavra-chave extends 110 palavra-chave override 103, 104 palavra-chave this 102, 103, 104, 263 palavra-chave var 49, 99 palavras reservadas 68 palavras-chave 68 palavras-chave sintticas 68 Palco como continer de objeto de exibio 276 dimensionamento 288 propriedades, configurao 287

segurana 722 sobre 256, 275 Parmetro de tipo 162 parmetro do Pixel Bender valor padro 393 parmetro do sombreador Pixel Bender ordem 396 parmetro printArea 678 parmetro priority, mtodo addEventListener() 265 parmetro rest 88 parmetro useCapture, mtodo addEventListener() 265 parmetro useWeakReference 172 parmetros opcionais ou necessrios 86 transmisso por valor ou referncia 85 parmetros de funo 85 parmetros necessrios 86 parmetros opcionais 86 parar clipes de filme 410 parnteses metacaracteres 213 operadores 67 operadores de filtragem XML 243 vazio 80 parnteses da direita 213 parnteses da esquerda 213 parnteses de abertura 213 parnteses de fechamento 213 permisses cmera 558 classe LocalConnection 730 perspectiva 507, 520 pesquisa de strings 150 pesquisa, em expresses regulares 223 Pixel Bender kernel 386 sobre 386 sombreador 386 termos 387 uso no ActionScript 386 pixels, manipulao individual 489 plano de fundo opaco 304 player. Consulte Flash Player Point, objetos usos adicionais para 345 polar(), mtodo 345 polimorfismo 111 ponteiros (cursores), personalizao 605

ponto (.) metacaractere 213 ponto (.) operador, XML 234, 241 ponto (.). Consulte ponto ponto de fuga 508 ponto de interrogao (\?) metacaractere 213 ponto-e-vrgula 67 pontos de sinalizao uso 547 em vdeo 541 pontos versus pixels 679 portas, conexo no nvel de soquete 727 posies de caracteres em strings 149 de objetos de exibio 293 posies de ndice em strings 146 primeira entidade grfica carregada 275, 314 principais, classes Error no ActionScript 201 programao de exibio, sobre 274 programao orientada a objetos conceitos 93 tarefas comuns para 92 programas, definio bsica 9 ProgressEvent.PROGRESS 614 progresso da reproduo do udio 598 progresso do carregamento 314 projeo 61, 62, 63, 508 propriedade arguments.callee 86 propriedade arguments.caller 88 propriedade arguments.length 86 propriedade avHardwareDisable 709 propriedade bubbles 259 propriedade callee 86 propriedade caller 88 propriedade cancelable 258 propriedade Capabilities.avHardwareDisable 709 propriedade Capabilities.localFileReadDisable 709 propriedade checkPolicyFile 714 propriedade childAllowsParent 724 propriedade clipboardData (eventos de copiar e colar HTML) 669 propriedade content (classe Loader) 721 propriedade contentLoaderInfo 314, 729 propriedade contentType 614 propriedade currentDomain 729 propriedade currentTarget 260 propriedade dataFormat 618 propriedade date 136 propriedade day 136

PROGRAMAO DO ACTIONSCRIPT 3.0 746


ndice

propriedade de comprimento classe Array 165 propriedade de dados (classe URLRequest) 615 propriedade de prottipo 120, 123 propriedade displayState 289, 717 propriedade do mtodo (classe URLRequest) 615 propriedade domain (classe LocalConnection) 730 propriedade dotall de expresses regulares 221 propriedade eventPhase 259 propriedade exactSettings (classe Security) 730 propriedade extended de expresses regulares 221 propriedade fieldOfView 512 propriedade focalLength 513 propriedade frameRate 287 propriedade fullScreenSourceRect 291 propriedade fullYear 135 propriedade generalClipboard (classe Clipboard) 668 propriedade global de expresses regulares 221 propriedade hours 136 propriedade htmlText 438 propriedade id3 725 propriedade ignoreCase de expresses regulares 221 propriedade length objeto arguments 86 strings 145 propriedade level 267 propriedade loaderInfo 314 propriedade LocalConnection.client 620 propriedade localFileReadDisable 709 propriedade matrix3D 510 propriedade milliseconds 136 propriedade minutes 136 propriedade month 135 propriedade monthUTC 136 propriedade multiline de expresses regulares 221 propriedade parentAllowsChild 724 propriedade projectionCenter 513 propriedade rotationX 512 propriedade rotationY 511 propriedade rotationZ 512 propriedade sameDomain 724 propriedade seconds 136

propriedade Security.currentDomain 729 propriedade Security.exactSettings 730 propriedade security.sandboxType 707 propriedade tailjoint 431 propriedade target 260 Propriedade type (classe Event) 258 propriedade URLLoader.dataFormat 618 propriedade URLRequest.contentType 614 propriedade URLRequest.data 615 propriedade URLRequest.method 615 propriedade z 510 propriedades ActionScript versus outras linguagens 38 adio a funes 89 conceitos bsicos 12 definio, para ActionScript 3.0 96 esttica e de ocorrncia 96, 116 XML 235 propriedades da ocorrncia herana 112 propriedades da pgina 678 propriedades de expresses regulares 221 propriedades de ocorrncia declarao 96 propriedades estticas declarao 96 dentro da cadeia do escopo 117 herana 116 XML 235 proprietrio do Palco 722 __proto__ 39 Q quadros, salto de 411 quantificadores (em expresses regulares) 216 R Rectangle, objetos definio 346 intersees 347 redimensionamento 346 reposicionamento 346 unies 347 usos adicionais para 348 recursivas funes 87

rede conceitos e termos 612 restrio 715 sobre 611 referncia, transmisso por 85 referncias de objetos suporte a copiar e colar 668 referncias fracas 172 regra de preenchimento 338 regra diferente de zero 338 regra par-mpar 338 remoo 508, 525 renderizao 3D 525 renderizao adiada (copiar e colar) 671 renderizao tridimensional 525 repetio do..while 80 for 78 for each..in 78 for..in 78 while 79 repeties for 78 representaes de strings de objetos 147 reproduo cmera e 561 controle da taxa de quadros 287 de clipes de filme 410 monitoramento de udio 598 pausa e reincio de udio 598 vdeo 533 reproduo de udio, monitoramento 598 __resolve 39 Restries de vetores 160 retroceder clipes de filme 411 rolagem de texto 439, 440 rotao 508 rotao 3D 522 rotao de matrizes 348 rotao de objetos de exibio 308, 348 rotao tridimensional 522 rotate(), mtodo 349 S scale(), mtodo 349 scripts do lado do servidor 618 Security.loadPolicyFile() 712, 715 segurana Consulte tambm arquivos de poltica viso geral 704 acesso mdia carregada como dados 724

PROGRAMAO DO ACTIONSCRIPT 3.0 747


ndice

rea de transferncia 734 arquivos de poltica 711 arquivos SWF importados 729 arquivos, upload e download 729 bitmaps 725 bloqueio de portas 715 caixas de proteo 706 cmera 730, 734 classe LocalConnection 730 conexo a portas 727 envio de dados 728 imagens 725 lista de exibio 723 microfone 730, 734 modo de tela cheia 717 mouse 734 objetos compartilhados 730, 732 Palco 722 relacionada a eventos 724 RTMP 721 som 720, 725 soquetes 727 tag allowNetworking 716 tag img 720 teclado 734 UI de Configuraes e Gerenciador de configuraes 710 URLLoader 727 URLStream 727 vdeo 720, 726 segurana de udio 725 Segurana de contedo de protocolo RTMP 721 segurana de contedo RTMP 721 segurana do mouse 734 segurana do teclado 734 seladas, classes 57 sem tipo variveis 39, 52 sendToURL() 715 seqncias de eliminao nas classes de caracteres 215 Server, Flash Media 721 servidor de soquete 626 servidor de soquete Java 626 setters. Consulte getters e setters significando 59 smbolos da biblioteca, exportao 413 smbolos em expresses regulares 212 sinal de adio (+) 213

sinalizador dotall em expresses regulares 223 sinalizador extended em expresses regulares 223 sinalizador g (em expresses regulares) 221 sinalizador global em expresses regulares 222 sinalizador i (em expresses regulares) 221 sinalizador ignore em expresses regulares 222 sinalizador m (em expresses regulares) 221 sinalizador multiline em expresses regulares 222 sinalizador s (em expresses regulares) 221 sinalizador x (em expresses regulares) 221 sinalizadores em expresses regulares 221 sintaxe 65 sintaxe de barras 66 sintaxe de pontos 65 Sistema de coordenadas 3D 508 sistema de coordenadas, 3D 508 sistema do usurio, determinar em tempo de execuo 655 sistema, determinar o do usurio 655 som aplicativo de amostra 592 envio e recebimento de um servidor 592 segurana de 720, 725 sombra 118 sombreador Pixel Bender acesso a metadados 389 carregamento no tempo de execuo 388 cdigo de bytes 388 dados no de imagem 406 entrada 391 especificao de valor de entrada 392 identificao de entradas e parmetros 391 incorporao em um arquivo SWF 388 parmetro 391 processamento em segundo plano 406 uso como filtro 404 uso como modo de mesclagem 400 uso como preenchimento de desenho 396 uso no ActionScript 396 uso no modo autnomo 406 sombreadores Pixel Bender 386 Sound.load() 715 string delimitada por caracteres, combinao de matrizes 183

strings combinao de matrizes em uma string delimitada por caracteres 183 comparao 146 concatenao 147 converso de maisculas e minsculas 152 converso de objetos XML 246 converso de tipo de dados para atributos XML 247 correspondncia de substrings 219 declarao 144 exemplo 152 length 145 localizao de substrings 148 padres, localizao 148, 149 posio do caractere 149 posies de ndice 146 substituio de texto 149 substrings 148, 149 tarefas comuns 143 termos 144 verificao de correspondncia em expresses regulares 224 suavizao de bitmap 488 suavizao de borda de texto 448 subclasses 110 substituio de getters e setters 115 substituio de maisculas e minsculas em strings 152 substituio de texto em strings 149 substrings correspondncia em expresses regulares 219 criao com base em um delimitador 149 localizao e substituio 148, 149 sobre 148 superclasses 110 superconstrutor de matrizes 176 SWF carregamento de verses antigas de arquivos 416 T tag allowNetworking 716 tag img em campos de texto, segurana 720 tamanho do arquivo, menor para formas 280 tela cheia desativao 539 encerramento 539

PROGRAMAO DO ACTIONSCRIPT 3.0 748


ndice

tempo de execuo, determinar o sistema do usurio 655 tempo limite 678 tempo limite de script 678 texto atribuio de formatos 443 captura de entrada 441 conceitos e termos 435 espessura 448 esttico 279, 449 exibio 437 formatao 443, 450 formatao de faixas de 446 manipulao 440 nitidez 448 restrio de entrada 442 rolagem 439, 440 salvamento na rea de transferncia 655 seleo 440 sobre 436 suavizao de borda 448 substituio 149 suporte a copiar e colar 668 tarefas comuns 434 tipos disponveis 437 texto esttico acesso 449 criao 279 texto HTML e CSS 444 exibio 438 texto selecionado pelo usurio, captura 441 throw, instruo 192 timers 137 Tipo base Vector 160 tipo de dados Boolean 58 tipo de dados int 59 tipo de dados Number 59 tipo de dados padro 39 tipo de dados String 60 tipo de dados uint 60 tipos de dados Boolean 58 definidos 53 int 59 Number 59 padro (sem tipo) 39 personalizados 105 simples e complexos 10 sobre 10

String 60 uint 60 void 60 tipos de dados personalizados, enumeraes 105 tipos primitivos, converses implcitas 61 tipos. Consulte tipos de dados traado 335 Transform, classe transform, propriedade 349 transformao 508 transformao de bitmap 520 translao 508 translate(), mtodo 349 transposio de matrizes 348 TriangleCullling 526 tringulos, desenho 519 try..catch..instrues finally 191 twips 679 U undefined 39, 60 union(), mtodo 347 upload de arquivos 636, 643, 729 URI (Localizador uniforme de recursos) 44 URIs 44 URLLoader.load() 715 URLLoaderDataFormat.VARIABLES 618 URLRequestMethod.GET 616 URLRequestMethod.POST 616 URLs suporte a copiar e colar 668 URLs dos objetos carregados 314 URLStream.load() 715 UTC (Horrio universal coordenado) 135 V valor de escala T 521 valor de escala, perspectiva 521 valor null 52, 59, 60 valor nulo 172 valor T 508 valores atribuio a variveis 49 transmisso de argumentos por 85 valores complexos 53 valores de decremento 72 valores de incremento 72 valores de parmetro padro 86 valores de unidade de tempo 135

valores literais literais de matriz 66, 161 objeto 170 sobre 66 valores primitivos 39, 53 Vantagens do uso de vetores 160 variveis anotaes de tipo 49, 54 conceitos bsicos 9 declarao 99 escopo de 50 estticas 99 inicializao 52, 238 instruo var 49 no inicializadas 52 ocorrncia 100 sem tipo 39, 52 substituio no permitida 100 tipos de 99 valor padro 52 variveis de ocorrncia 100 variveis estticas 99 variveis globais 50 variveis locais 50 velocidade, melhora para renderizao 303 verificao de tipos tempo de compilao 53 tempo de execuo 55 verificao de tipos em tempo de compilao 54 verso de depurador, Flash Player 267 vrtice 508 vertices 519 vetor 3D 508 vetor, 3D 508 video noes bsicas sobre formatos 529 vdeo acelerao de hardware para tela cheia 539 carregamento 532 compatibilidade do Flash Player e do AIR com 530 encerramento do modo de tela cheia 539 envio para servidor 562 final do fluxo 534 fluxo contnuo 540 formato FLV 531 no Macintosh 563 mapeamento mip 495 metadados 548, 551

PROGRAMAO DO ACTIONSCRIPT 3.0 749


ndice

propriedade fullScreenHeight 538 propriedade fullScreenSourceRect 537 propriedade fullScreenWidth 538 qualidade 560 reproduo 533 segurana 720, 726 sobre 527 suporte para H.264 529 suporte para teclado no modo de tela cheia 538 tarefas comuns 527 uso de pontos de sinalizao e metadados 547 uso de tela cheia 535 vdeo de fluxo contnuo 540 vdeo em tela cheia 535 Vdeo Flash. Consulte FLV void 60 W while, repetio 79 X XML acesso a atributos 242 ActionScript 232 carregamento de dados 239, 247 comentrios 235 como percorrer estruturas 241 conceitos bsicos 230 conceitos e termos 233 converso de tipo 246 documentos 231 E4X (ECMAScript para XML) 40, 230, 233 espao em branco 235 espaos para nomes 245 filtragem 243 for each..repeties in 78 formato da API externa 691 inicializao de variveis 238 instrues de processamento 235 loops for 234, 244 mtodos 236 ns filho 241 ns pai 241 operadores de chaves ({ e }) 239 propriedades 235 servidor de soquete 626 tarefas comuns 232 transformao 239

Você também pode gostar