";
L'expression régulière correspond à la chaîne entière :
Paragraph 1
Paragraph 2
Supposez, néanmoins, que vous souhaitez établir une correspondance avec un seul groupe
...
. Vous pouvez
procéder comme suit :
Paragraph 1
Ajoutez un point d'interrogation (?) après les quantificateurs pour qu'ils deviennent des quantificateurs paresseux. Par
exemple, l'expression régulière suivante, qui utilise le quantificateur paresseux *? , correspond à
suivi du nombre
minimum de caractères possible (paresseux), suivi de
:
/
.*?<\/p>/
Lisez attentivement les points suivants concernant les quantificateurs :
• Les quantificateurs {0} et {0,0} n'excluent pas un élément d'une correspondance.
• Ne combinez pas plusieurs quantificateurs, comme dans /abc+*/.
• Le caractère point (.) ne divise pas les lignes en deux à moins de définir l'indicateur s (dotall), même s'il est suivi
d'un quantificateur *. Considérons par exemple le code qui suit :
+ (plus) Correspond à l'élément précédent répété une ou plusieurs fois.
? (point d'interrogation) Correspond à l'élément précédent répété zéro ou une fois.
{n}
{n,}
et
{n,n}
Indique un quantificateur numérique ou une plage de quantificateurs pour l'élément précédent :
/A{27}/ correspond au caractère A répété 27 fois.
/A{3}/ correspond au caractère A répété 3 fois ou plus.
/A{3,5}/ correspond au caractère A répété 3 à 5 fois.
Caractère de remplacement
de quantificateur
Description
PROGRAMMATION AVEC ACTIONSCRIPT 3.0 POUR FLASH 220
Utilisation d'expressions régulières
var str:String = "
Test\n";
str += "Multiline
";
var re:RegExp = /
.*<\/p>/;
trace(str.match(re)); // null;
re = /
.*<\/p>/s;
trace(str.match(re));
// output:
Test
// Multiline
Pour plus d'informations, consultez la section « Indicateurs et propriétés » à la page 223.
Permutation
Utilisez le caractère | (barre) dans une expression régulière pour que son moteur tienne compte des autres possibilités
pour une correspondance. Par exemple, l'expression régulière suivante correspond à l'un des mots cat, dog, pig, rat:
var pattern:RegExp = /cat|dog|pig|rat/;
Vous pouvez utiliser des parenthèses pour définir des groupes et limiter le domaine du permutateur |. L'expression
régulière suivante correspond à cat suivi de nap ou nip :
var pattern:RegExp = /cat(nap|nip)/;
Pour plus d'informations, consultez la section « Groupes » à la page 220.
Les deux expressions régulières suivantes (l'une utilisant le permutateur |, l'autre une classe de caractère (définie avec
[ et ] )) sont équivalentes :
/1|3|5|7|9/
/[13579]/
Pour plus d'informations, consultez la section « Classes de caractère » à la page 217.
Groupes
Vous pouvez spécifier un groupe dans une expression régulière en utilisant des parenthèses, comme suit :
/class-(\d*)/
Un groupe est une sous-section d'un modèle. Vous pouvez utiliser des groupes pour effectuer les opérations suivantes :
• Appliquer un quantificateur à plusieurs caractères
• Délimiter des sous-modèles à appliquer avec la permutation (à l'aide du caractère |)
• Capturer des correspondances de sous-chaîne (par exemple, en utilisant \1 dans une expression régulière pour
établir une correspondance avec un groupe mis en correspondance précédemment, ou en utilisant $1 de la même
façon dans la méthode replace() de la classe String)
Les sections suivantes fournissent des détails sur ces utilisations de groupes.
Utilisation de groupes avec des quantificateurs
Si vous n'utilisez pas de groupe, un quantificateur s'applique au caractère ou à la classe de caractère qui le précède,
comme indiqué ci-dessous :
PROGRAMMATION AVEC ACTIONSCRIPT 3.0 POUR FLASH 221
Utilisation d'expressions régulières
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
Néanmoins, vous pouvez utiliser un groupe pour appliquer un quantificateur à plusieurs caractères ou classes de
caractère :
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
Pour plus d'informations sur les quantificateurs, consultez la section « Quantificateurs » à la page 218.
Utilisation de groupes avec le permutateur (|)
Vous pouvez utiliser des groupes pour définir le groupe de caractères auquel vous souhaitez appliquer un permutateur
(|), comme suit :
var pattern:RegExp = /cat|dog/;
// matches cat or dog
pattern = /ca(t|d)og/;
// matches catog or cadog
Utilisation de groupes pour capturer des correspondances de sous-chaîne
Lorsque vous définissez un groupe entre parenthèses standard dans un modèle, vous pouvez ensuite vous y référer
dans l'expression régulière. Il s'agit d'une backreference. Ces types de groupes sont appelés groupes capturés. Par
exemple, dans l'expression régulière suivante, la séquence \1 correspond à toute sous-chaîne mise en correspondance
avec le groupe entre parenthèses capturé :
var pattern:RegExp = /(\d+)-by-\1/;
// matches the following: 48-by-48
Vous pouvez spécifier jusqu'à 99 backreferences dans une expression régulière en tapant \1,\2,...,\99.
De même, dans la méthode replace() de la classe String, vous pouvez utiliser $1–$99 pour insérer des
correspondances de chaîne de groupe capturé dans la chaîne de remplacement :
var pattern:RegExp = /Hi, (\w+)\./;
var str:String = "Hi, Bob.";
trace(str.replace(pattern, "$1, hello."));
// output: Bob, hello.
PROGRAMMATION AVEC ACTIONSCRIPT 3.0 POUR FLASH 222
Utilisation d'expressions régulières
Si vous utilisez des groupes capturés, la méthode exec() de la classe RegExp et la méthode match() de la classe String
renvoient des sous-chaînes qui correspondent aux groupes capturés :
var pattern:RegExp = /(\w+)@(\w+).(\w+)/;
var str:String = "bob@example.com";
trace(pattern.exec(str));
// bob@example.com,bob,example,com
Utilisation de groupes non capturés et de groupes d'anticipation
Un groupe non capturé est utilisé pour le regroupement uniquement ; il n'est pas collecté et il ne correspond pas à des
backreferences numérotées. Utilisez (?: et ) pour définir des groupes non capturés, comme suit :
var pattern = /(?:com|org|net);
Par exemple, notez la différence entre mettre (com|org) dans un groupe capturé et dans un groupe non capturé (la
méthode exec() répertorie les groupes capturés après la correspondance complète) :
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
Un type spécial de groupe non capturé est le groupe d'animation dont il existe deux types : le groupe d'animation positif
et le groupe d'animation négatif.
Utilisez (?= et ) pour définir un groupe d'anticipation positif, qui spécifie que le sous-modèle dans le groupe doit
établir une correspondance à la position. Néanmoins, la portion de la chaîne qui correspond au groupe d'anticipation
positif peut correspondre aux modèles restants dans l'expression régulière. Par exemple, étant donné que (?=e) est
un groupe d'anticipation positif dans le code suivant, le caractère e auquel il correspond peut être mis en
correspondance par une partie suivante de l'expression régulière (dans ce cas, le groupe capturé, \w*) :
var pattern:RegExp = /sh(?=e)(\w*)/i;
var str:String = "Shelly sells seashells by the seashore";
trace(pattern.exec(str));
// Shelly,elly
Utilisez (?= et ) pour définir un groupe d'anticipation négatif, qui indique que le sous-modèle dans le groupe ne doit
pas établir une correspondance à la position. Par exemple :
var pattern:RegExp = /sh(?!e)(\w*)/i;
var str:String = "She sells seashells by the seashore";
trace(pattern.exec(str));
// shore,ore
Utilisation de groupes nommés
Un groupe nommé est un type de groupe dans une expression régulière ayant un identificateur nommé. Utilisez
(?P et ) pour définir le groupe nommé. Par exemple, l'expression régulière suivante inclut un groupe nommé
avec l'identificateur nommé digits :
var pattern = /[a-z]+(?P\d+)[a-z]+/;
PROGRAMMATION AVEC ACTIONSCRIPT 3.0 POUR FLASH 223
Utilisation d'expressions régulières
Lorsque vous utilisez la méthode exec(), un groupe nommé de correspondance est ajouté comme propriété du
tableau result :
var myPattern:RegExp = /([a-z]+)(?P\d+)[a-z]+/;
var str:String = "a123bcd";
var result:Array = myPattern.exec(str);
trace(result.digits); // 123
Voici un autre exemple, qui utilise deux groupes nommés, avec les identificateurs name et dom :
var emailPattern:RegExp =
/(?P(\w|[_.\-])+)@(?P((\w|-)+))+\.\w{2,4}+/;
var address:String = "bob@example.com";
var result:Array = emailPattern.exec(address);
trace(result.name); // bob
trace(result.dom); // example
Remarque : les groupes nommés ne font pas partie de la spécification du langage ECMAScript. Ils représentent une
fonction ajoutée dans ActionScript 3.0.
Indicateurs et propriétés
Le tableau suivant répertorie les cinq indicateurs que vous pouvez définir pour des expressions régulières. Vous pouvez
accéder à chaque indicateur en tant que propriété de l'objet d'expression régulière.
Ces propriétés sont en lecture seule. Vous pouvez définir les indicateurs (g, i, m, s, x) lorsque vous définissez une
variable d'expression régulière, comme suit :
var re:RegExp = /abc/gimsx;
Cependant, vous ne pouvez pas définir directement les propriétés nommées. Par exemple, le code suivant génère une
erreur :
var re:RegExp = /abc/;
re.global = true; // This generates an error.
Par défaut, à moins de les spécifier dans la déclaration d'expression régulière, les indicateurs ne sont pas définis, et les
propriétés correspondantes sont également définies sur false.
De plus, il existe deux autres propriétés d'une expression régulière :
• La propriété lastIndex spécifie la position d'index dans la chaîne à utiliser pour l'appel suivant à la méthode
exec() ou test() d'une expression régulière.
• La propriété source spécifie la chaîne qui définit la portion de modèle de l'expression régulière.
Indicateur Propriété Description
g global A plusieurs correspondances.
i ignoreCase Correspondance sensible à la casse. S'applique aux caractères A—Z et a—z mais pas à des caractères
étendus tels que É et é .
m multiline Lorsque cet indicateur est défini, $ et ^ peuvent correspondre au début d'une ligne et à la fin d'une ligne,
respectivement.
s dotall Lorsque cet indicateur est défini, . (point) peut correspondre au caractère de nouvelle ligne (\n).
x extended Autorise les expressions régulières étendues. Vous pouvez tapez des espaces dans l'expression
régulière. Ils sont ignorés dans le cadre du modèle. Ceci vous permet de taper un code d'expression
régulière de façon plus lisible.
PROGRAMMATION AVEC ACTIONSCRIPT 3.0 POUR FLASH 224
Utilisation d'expressions régulières
L'indicateur g (global)
Lorsque l'indicateur g (global) n'est pas inclus, une expression régulière n'a pas plus d'une correspondance. Par
exemple, avec l'indicateur g exclu de l'expression régulière, la méthode String.match() renvoie une sous-chaîne de
correspondance uniquement :
var str:String = "she sells seashells by the seashore.";
var pattern:RegExp = /sh\w*/;
trace(str.match(pattern)) // output: she
Lorsque l'indicateur g est défini, la méthode Sting.match() renvoie plusieurs correspondances, comme suit :
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
L'indicateur i (ignoreCase)
Par défaut, les correspondances d'expression régulière sont sensibles à la casse. Lorsque vous définissez l'indicateur i
(ignoreCase), le respect de la casse est ignoré. Par exemple, la lettre minuscule s dans l'expression régulière ne
correspond pas à la lettre majuscule S, le premier caractère de la chaîne :
var str:String = "She sells seashells by the seashore.";
trace(str.search(/sh/)); // output: 13 -- Not the first character
Lorsque l'indicateur i est défini, cependant, l'expression régulière correspond à la lettre majuscule S :
var str:String = "She sells seashells by the seashore.";
trace(str.search(/sh/i)); // output: 0
L'indicateur i ignore le respect de la casse uniquement pour les caractères A–Z et a–z, mais par pour les caractères
étendus tels que É et é .
L'indicateur m (multiline)
Si l'indicateur m (multiline) n'est pas défini, le ^ correspond au début de la chaîne et le $ à sa fin. Si l'indicateur m est
défini, ces caractères correspondent au début d'une ligne et à la fin d'une ligne, respectivement. Considérez la chaîne
suivante, qui inclut un caractère de nouvelle ligne :
var str:String = "Test\n";
str += "Multiline";
trace(str.match(/^\w*/g)); // Match a word at the beginning of the string.
Même si l'indicateur g (global) est défini dans l'expression régulière, la méthode match() correspond à une seule
sous-chaîne, car il n'existe qu'une seule correspondance pour le ^ (le début de la chaîne). Le résultat est le suivant :
Test
Voici le même code avec l'indicateur m défini :
var str:String = "Test\n";
str += "Multiline";
trace(str.match(/^\w*/gm)); // Match a word at the beginning of lines.
Cette fois, le résultat inclut les mots au début des deux lignes :
Test,Multiline
Seul le caractère \n signale la fin d'une ligne. Ce n'est pas le cas des caractères suivants :
• Retour de chariot (\r)
PROGRAMMATION AVEC ACTIONSCRIPT 3.0 POUR FLASH 225
Utilisation d'expressions régulières
• Séparateur de ligne Unicode (\u2028)
• Séparateur de paragraphe Unicode (\u2028)
L'indicateur s (dotall)
Si l'indicateur s (dotall ou “dot all”) n'est pas défini, un point (.) dans un modèle d'expression régulière ne
correspond pas à un caractère de nouvelle ligne (\n). Par conséquent, il n'existe aucune correspondance pour l'exemple
suivant :
var str:String = "
Test\n";
str += "Multiline
";
var re:RegExp = /
.*?<\/p>/;
trace(str.match(re));
Néanmoins, si l'indicateur s est défini, le point correspond au caractère de nouvelle ligne :
var str:String = "
Test\n";
str += "Multiline
";
var re:RegExp = /
.*?<\/p>/s;
trace(str.match(re));
Dans ce cas, la correspondance est la sous-chaîne entière dans les balises
, y compris le caractère de nouvelle ligne :
Test
Multiline
L'indicateur x (extended)
Les expressions régulières peuvent être difficiles à lire, notamment lorsqu'elles comprennent de nombreux
métasymboles et métaséquences. Par exemple :
/
|(\s*[^>]*>)).*?<\/p>/gi
Lorsque vous utilisez l'indicateur x (extended) dans une expression régulière, les espaces vides que vous tapez dans le
modèle sont ignorés. Par exemple, l'expression régulière suivante est identique à l'exemple précédent :
/
)
Comme indiqué dans l'exemple suivant, vous pouvez également utiliser des accolades ( { et } ) pour transmettre des
données par référence (à partir d'autres variables) lorsque vous construisez des objets XML :
var ids:Array = [121, 122, 123];
var names:Array = [["Murphy","Pat"], ["Thibaut","Jean"], ["Smith","Vijay"]]
var x:XML = new XML("");
for (var i:int = 0; i < 3; i++)
{
var newnode:XML = new XML();
newnode =
{names[i][0]}{names[i][1]};
x = x.appendChild(newnode)
}
Vous pouvez affecter des propriétés et des attributs à un objet XML à l'aide de l'opérateur =, comme dans l'exemple
suivant :
var x:XML =
Smith
x.firstname = "Jean";
x.@id = "239";
PROGRAMMATION AVEC ACTIONSCRIPT 3.0 POUR FLASH 243
Utilisation de XML
Ceci définit l'objet XML x de la façon suivante :
SmithJean
Vous pouvez utiliser les opérateurs + et += pour concaténer des objets XMLList :
var x1:XML = test1
var x2:XML = test2
var xList:XMLList = x1 + x2;
xList += test3
Ceci définit l'objet XMLList xList de la façon suivante :
test1test2test3
Parcours de structures XML
L'une des fonctions puissantes d'XML est sa capacité à fournir des données imbriquées, complexes, via une chaîne
linéaire de caractères de texte. Lorsque vous chargez des données dans un objet XML, ActionScript les analyse et charge
sa structure hiérarchique en mémoire (ou envoie une erreur d'exécution si les données XML ne sont pas formées
correctement).
Les opérateurs et les méthodes des objets XML et XMLList permettent de parcourir aisément la structure des données XML.
Utilisez l'opérateur point (.) et l'opérateur d'accesseur descendant (..) pour accéder aux propriétés enfant d'un objet
XML. Considérez l'objet XML suivant :
var myXML:XML =
Baking Extravagant Pastries with KumquatsContinoChuck238Emu Care and BreedingCaseJustin115
L'objet myXML.book est un objet XMLList contenant des propriétés enfant de l'objet myXML appelées book. Ces deux
objets XML correspondent aux deux propriétés book de l'objet myXML.
L'objet myXML..lastName est un objet XMLList contenant des propriétés descendantes appelées lastName. Ces deux
objets XML correspondent aux deux propriétés lastName de l'objet myXML.
PROGRAMMATION AVEC ACTIONSCRIPT 3.0 POUR FLASH 244
Utilisation de XML
L'objet myXML.book.editor.lastName est un objet XMLList contenant tout enfant appelé lastName des enfants
appelés editor des enfants appelés book de l'objet myXML : en l'occurrence, un objet XMLList contenant un seul objet
XML (la propriété lastName dont la valeur correspond à « Case »).
Accès aux noeuds enfant et parent
La méthode parent() renvoie le parent d'un objet XML.
Vous pouvez utiliser les valeurs d'index ordinales d'une liste enfant pour accéder à des objets enfant spécifiques. Par
exemple, considérez un objet XML myXML ayant deux propriétés enfant appelées book. Chaque propriété enfant
appelée book possède un numéro d'index qui lui est associé :
myXML.book[0]
myXML.book[1]
Pour accéder à un petit-enfant spécifique, vous pouvez indiquer des numéros d'index pour les noms de l'enfant et du
petit-enfant:
myXML.book[0].title[0]
Cependant, s'il n'existe qu'un seul enfant de x.book[0] nommé title, vous pouvez omettre la référence d'index,
comme suit :
myXML.book[0].title
De même, s'il n'existe qu'un seul enfant book de l'objet x et que cet objet enfant possède un seul objet title, vous pouvez
omettre les deux références d'index, de la façon suivante :
myXML.book.title
Vous pouvez utiliser la méthode child() pour accéder à des enfants dont le nom est basé sur une variable ou une
expression, comme indiqué dans l'exemple suivant :
var myXML:XML =
Dictionary;
var childName:String = "book";
trace(myXML.child(childName).title) // output: Dictionary
Accès à des attributs
Utilisez le symbole @ (l'opérateur identifiant d'attribut) pour accéder aux attributs dans un objet XML ou XMLList,
comme indiqué dans le code suivant :
var employee:XML =
WuErin;
trace(employee.@id); // 6401
Vous pouvez utiliser le symbole de caractère générique * avec le symbole @ pour accéder à tous les attributs d'un objet
XML ou XMLList, comme dans le code suivant :
PROGRAMMATION AVEC ACTIONSCRIPT 3.0 POUR FLASH 245
Utilisation de XML
var employee:XML =
WuErin;
trace(employee.@*.toXMLString());
// 6401
// 233
Vous pouvez utiliser la méthode attribute() ou attributes() pour accéder à un attribut spécifique ou à tous les
attributs d'un objet XML ou XMLList, comme dans le code suivant :
var employee:XML =
WuErin;
trace(employee.attribute("id")); // 6401
trace(employee.attribute("*").toXMLString());
// 6401
// 233
trace(employee.attributes().toXMLString());
// 6401
// 233
Vous pouvez également utiliser la syntaxe suivante pour accéder à des attributs, comme indiqué dans l'exemple
suivant :
employee.attribute("id")
employee["@id"]
employee.@["id"]
Ils sont tous équivalents à employee.@id. Cependant, la syntaxe employee.@id est préférable.
Filtrage par attribut ou valeur d'élément
Vous pouvez utiliser les opérateurs parenthèses— ( et ) —pour filtrer des éléments avec un nom d'élément spécifique
ou une valeur d'attribut. Considérez l'objet XML suivant :
var x:XML =
ZmedSueData analystMcGeeChuckJr. data analyst
Les expressions suivantes sont toutes valides :
• x.employee.(lastName == "McGee")—Il s'agit du deuxième noeud employee.
• x.employee.(lastName == "McGee").firstName—Il s'agit de la propriété firstName du deuxième noeud
employee.
PROGRAMMATION AVEC ACTIONSCRIPT 3.0 POUR FLASH 246
Utilisation de XML
• x.employee.(lastName == "McGee").@id—Il s'agit de la valeur de l'attribut id du deuxième noeud employee.
• x.employee.(@id == 347)—Le premier noeud employee.
• x.employee.(@id == 347).lastName—Il s'agit de la propriété lastName du premier noeud employee.
• x.employee.(@id > 300)—Il s'agit d'un XMLList avec deux propriétés employee.
• x.employee.(position.toString().search("analyst") > -1)—Il s'agit d'un XMLList avec deux propriétés
position.
Si vous tentez de filtrer en fonction d'attributs ou d'éléments qui n'existent pas, Flash® Player et Adobe® AIR™ renvoient
une exception. Par exemple, la dernière ligne du code suivant génère une erreur car il n'existe aucun attribut id dans
le deuxième élément p :
var doc:XML =
Hello, Bob.
Hello.
;
trace(doc.p.(@id == '123'));
De même, la dernière ligne du code suivant génère une erreur car il n'existe aucune propriété b du deuxième élément p :
var doc:XML =
Hello, Bob.
Hello.
;
trace(doc.p.(b == 'Bob'));
Pour éviter ces erreurs, vous pouvez identifier les propriétés ayant les éléments ou les attributs correspondants, à l'aide
des méthodes attribute() et elements(), comme dans le code suivant :
var doc:XML =
Hello, Bob.
Hello.
;
trace(doc.p.(attribute('id') == '123'));
trace(doc.p.(elements('b') == 'Bob'));
Vous pouvez également utiliser la méthode hasOwnProperty(), comme dans le code suivant :
var doc:XML =
Fichier Description
RSSViewer.mxml
ou
RSSViewer.fla
Le fichier d'application principal dans Flash (FLA) ou Flex (MXML).
com/example/programmingas3/rssViewer/RSSParser.as Une classe qui contient des méthodes utilisant E4X pour parcourir des
données (XML) RSS et générer une représentation HTML correspondante.
RSSData/ak.rss Un exemple de fichier RSS. Cette application est définie pour lire des données
RSS à partir du Web, sur un flux RSS Flex hébergé par Adobe. Néanmoins,
vous pouvez facilement modifier l'application pour lire des données RSS
depuis ce document qui utilise un schéma légèrement différent de celui du
flux RSS Flex.
PROGRAMMATION AVEC ACTIONSCRIPT 3.0 POUR FLASH 253
Utilisation de XML
Les premières lignes de la méthode effacent l'espace de noms xml par défaut :
default xml namespace = new Namespace();
La directive default xml namespace a un domaine de niveau bloc de fonction. Cela signifie que le domaine de cette
déclaration est la méthode buildItemHTML().
Les lignes qui suivent assemblent l'objet XMLList en fonction des arguments de chaîne transmis à la fonction :
var body:XMLList = new XMLList();
body += new XML("" + itemTitle + "");
var p:XML = new XML("
" + itemDescription + "
");
var link:XML = ;
link.@href = itemLink; //
link.font.@color = "#008000";
//
// 0x008000 = green
link.font = "More...";
p.appendChild( );
p.appendChild(link);
body += p;
Cet objet XMLList représente des données de chaîne adaptées à un champ de texte HTML d'ActionScript.
La méthode xmlLoaded() utilise la valeur de renvoi de la méthode buildItemHTML() et la convertit en une chaîne :
XML.prettyPrinting = false;
rssOutput = outXML.toXMLString();
Extraction du titre du flux RSS et envoi d'un événement personnalisé
La méthode xmlLoaded() définit une variable de chaîne rssTitle, en fonction des informations contenues dans les
données XML RSS source:
rssTitle = rssXML.channel.title.toString();
Pour finir, la méthode xmlLoaded() génère un événement qui notifie l'application que les données sont analysées et
disponibles :
dataWritten = new Event("dataWritten", true);
254
Chapitre 12 : Gestion des événements
Un système de gestion des événements permet au programmeur de répondre aux actions de l'utilisateur et aux
événements système de manière pratique. Le modèle d'événements ActionScript 3.0 n'est pas uniquement pratique, il
respecte les normes en vigueur et s'intègre parfaitement aux listes d'affichage d'Adobe® Flash® Player et d'Adobe® AIR™.
Ce modèle repose sur la spécification d'événements Document Object Model (DOM) de niveau 3, une architecture de
gestion d'événements normalisée. Il constitue donc pour les programmeurs ActionScript un outil puissant et
parfaitement intuitif.
Ce chapitre s'organise en cinq sections. Les deux premières fournissent des informations générales sur la gestion
d'événements dans ActionScript. Les trois dernières sections décrivent les principaux concepts qui sous-tendent le
modèle d'événements : le flux d'événements, l'objet événement et les écouteurs d'événement. Dans ActionScript 3.0, le
système de gestion des événements interagit étroitement avec la liste d'affichage ; ce chapitre suppose que vous
connaissiez les principes de base de cette liste. Pour plus d'informations, consultez le chapitre « Programmation de
l'affichage » à la page 277.
Principes de base de la gestion des événements
Introduction à la gestion des événements
Vous pouvez concevoir un événement comme tout type d'action qui se produit dans votre fichier SWF et qui présente
un intérêt pour vous en tant que programmeur. Par exemple, la plupart des fichiers SWF prennent en charge une
certaine forme d'interaction, qu'il s'agisse d'une action aussi simple qu'un clic avec la souris ou d'une opération plus
complexe, telle que l'acceptation et le traitement des données saisies dans un formulaire. Toute interaction de ce type
dans le fichier SWF est considérée comme un événement. Des événements peuvent également se produire sans aucun
interaction directe de l'utilisateur, par exemple lorsque le chargement des données depuis un serveur se termine ou
qu'une caméra reliée devient active.
Dans ActionScript 3.0, tout événement est représenté par un objet événement, qui correspond à une occurrence de la
classe Event ou de l'une de ses sous-classes. Le rôle d'un objet événement est non seulement de stocker des
informations relatives à un événement spécifique, mais aussi de contenir des méthodes qui favorisent la manipulation
de cet objet. Par exemple, lorsque Flash Player ou AIR détecte un clic de la souris, il crée un objet événement (une
occurrence de la classe MouseEvent) qui représente cet événement particulier.
Après la création d'un objet événement, Flash Player ou AIR le distribue, ce qui signifie que l'objet événement est
transmis à l'objet représentant la cible de l'événement. L'objet qui doit recevoir l'objet événement ainsi distribué est
appelé cible d'événement. Par exemple, lorsqu'une caméra reliée devient active, Flash Player distribue un objet
événement directement à la cible de l'événement, dans ce cas l'objet représentant la caméra. Toutefois, si la cible
d'événement se trouve dans la liste d'affichage, l'objet événement est transmis tout au long de la hiérarchie de la liste
d'affichage jusqu'à ce qu'il atteigne la cible en question. Dans certains cas, l'objet événement se « propage ».ensuite vers
le haut de la hiérarchie de la liste d'affichage, selon le même cheminement. Cette traversée de la hiérarchie de la liste
d'affichage correspond au flux d'événements.
Vous pouvez « écouter ».les objets événement de votre code grâce aux écouteurs d'événement. Les écouteurs
d'événement sont des fonctions ou des méthodes que vous écrivez pour répondre aux différents événements. Pour
garantir que le programme réagisse aux événements, vous devez ajouter des écouteurs d'événement soit à la cible
d'événement, soit à l'un des objets de la liste d'affichage qui font partie du flux d'événements de l'objet événement.
PROGRAMMATION AVEC ACTIONSCRIPT 3.0 POUR FLASH 255
Gestion des événements
Chaque fois que vous écrivez un code d'écouteur d'événement, il suit cette structure de base (les éléments en gras sont
des espaces réservés que vous rempliriez pour votre cas particulier) :
function eventResponse(eventObject:EventType):void
{
// Actions performed in response to the event go here.
}
eventTarget.addEventListener(EventType.EVENT_NAME, eventResponse);
Ce code a un double rôle. Tout d'abord, il définit une fonction, qui est une manière de spécifier les actions à exécuter
en réponse à l'événement. Ensuite, il appelle la méthode addEventListener() de l'objet source, « inscrivant ».ainsi la
fonction auprès de l'événement spécifié de sorte que lorsque l'événement survient, les actions de la fonction ont lieu.
Lorsque l'événement se produit, la cible de l'événement vérifie sa liste de toutes les fonctions et méthodes enregistrées
en tant qu'écouteurs d'événement. Elle appelle ensuite chacune d'entre elles, transmettant l'objet événement comme
paramètre.
Vous devez apporter quatre modifications à ce code pour créer votre propre écouteur d'événement. Premièrement,
vous devez remplacer le nom de la fonction par celui que vous souhaitez utiliser (ceci doit être modifié à deux endroits,
là où le code indique eventResponse). Deuxièmement, vous devez spécifier le nom de la classe de l'objet événement
qui est envoyé par l'événement que vous souhaitez écouter (EventType dans le code), et vous devez indiquer la
constante pour l'événement en question (EVENT_NAME dans la liste). Troisièmement, vous devez appeler la
méthode addEventListener() sur l'objet qui enverra l'événement (eventTarget dans ce code). Vous pouvez
également modifier le nom de la variable utilisée comme paramètre de la fonction (eventObject dans ce code).
Tâches courantes de gestion des événements
Vous trouverez ci-dessous des tâches courantes de gestion des événements. Chacune d'entre elles est décrite dans ce
chapitre :
• Ecrire un code pour répondre à des événements
• Empêcher qu'un code réponde à des événements
• Utiliser des objets event
• Utiliser un flux d'événements :
• Identification des informations de flux d'événements
• Arrêt du flux d'événements
• Arrêt du comportement par défaut
• Envoyer des événements à partir de vos classes
• Créer un type d'événement personnalisé
Concepts importants et terminologie
La liste de référence suivante énumère les termes importants que vous rencontrerez dans ce chapitre :
• Comportement par défaut : certains événements sont liés à un comportement appelé comportement par défaut. Par
exemple, lorsqu'un utilisateur tape du texte dans un champ, un événement de saisie de texte est déclenché. Le
comportement par défaut de cet événement consiste à afficher le caractère tapé dans le champ de texte—mais vous
pouvez annuler ce comportement par défaut (si vous ne souhaitez pas afficher le caractère tapé, par exemple).
• Distribuer : indiquer à des écouteurs d'événement qu'un événement a eu lieu.
• Evénement : quelque chose qui s'est produit sur un objet et que ce dernier peut indiquer à d'autres objets.
PROGRAMMATION AVEC ACTIONSCRIPT 3.0 POUR FLASH 256
Gestion des événements
• Flux d'événements : lorsque des événements concernent un objet sur la liste d'affichage (un objet affiché à l'écran),
tous les objets qui contiennent l'objet sont informés de l'événement et avertissent à leur tour leurs écouteurs
d'événement. Ce processus commence avec la scène et se poursuit à travers la liste d'affichage jusqu'à l'objet réel où
s'est produit l'événement. Il recommence ensuite avec la scène. Ce processus est appelé flux d'événements.
• Objet événement : un objet contenant des informations sur l'occurrence d'un événement particulier qui est envoyé
à tous les écouteurs lorsqu'un événement est distribué.
• Cible d'événement : l'objet qui envoie un événement. Par exemple, si l'utilisateur clique sur un bouton situé dans
un Sprite se trouvant dans la scène, tous ces objets envoient des événements mais c'est au niveau de la cible
d'événement que se produit l'événement (le bouton cliqué, dans ce cas).
• Ecouteur : un objet ou une fonction qui s'est enregistré avec un objet, pour indiquer qu'il doit être averti lorsqu'un
événement spécifique se produit.
Utilisation des exemples fournis dans ce chapitre
Au fur et à mesure que vous avancez dans ce chapitre, vous pouvez tester des exemples de code. Tous les codes de ce
chapitre comprennent un appel de la fonction trace() pour tester les résultats du code. Pour tester les codes de ce
chapitre :
1 Créez un document vide à l'aide de l'outil de programmation Flash.
2 Sélectionnez une image-clé dans le scénario.
3 Ouvrez le panneau Actions et copiez le code dans le panneau Script.
4 Exécutez le programme en sélectionnant Contrôle > Tester l'animation.
Les résultats des fonctions trace() des codes s'affichent dans le panneau Sortie.
Certains codes sont plus complexes et sont écrits sous la forme d'une classe. Pour tester ces exemples :
1 Créez un document vide à l'aide de l'outil de programmation Flash et enregistrez-le sur votre ordinateur.
2 Créez un fichier ActionScript et enregistrez-le dans le même répertoire que le document créé à l'étape 1. Le nom du
fichier doit correspondre au nom de la classe du code. Par exemple, si le code définit une classe EventTest,
enregistrez le fichier ActionScript sous le nom EventTest.as.
3 Copiez le code dans le fichier ActionScript et enregistrez le fichier.
4 Dans le document, cliquez sur une partie vide de la scène ou de l'espace de travail pour activer l'Inspecteur des
Propriétés du document.
5 Dans l'Inspecteur des Propriétés, dans le champ Classe du document, saisissez le nom de la classe ActionScript que
vous avez copiée du texte.
6 Exécutez le programme en sélectionnant Contrôle > Tester l'animation.
Les résultats de l'exemple s'affichent dans le panneau Sortie.
Ces techniques de test d'exemples de code sont expliquées plus en détail à la section « Test des exemples de code
contenus dans un chapitre » à la page 36.
PROGRAMMATION AVEC ACTIONSCRIPT 3.0 POUR FLASH 257
Gestion des événements
Variation de la gestion d'événements dans
ActionScript 3.0 par rapport aux versions antérieures
En ce qui concerne la gestion des événements, la différence la plus évidente entre ActionScript 3.0 et les versions
antérieures est qu'ActionScript 3.0 comprend un seul système de gestion des événements alors que les anciennes
versions d'ActionScript en comptent plusieurs. Cette section commence par une présentation générale du
fonctionnement de la gestion des événements dans les versions précédentes, puis étudie les nouveautés qu'apporte
ActionScript 3.0 dans ce domaine.
Gestion des événements dans les versions précédentes d'ActionScript
Antérieurement à ActionScript 3.0, le langage ActionScript fournissait plusieurs méthodes de gestion des événements :
• Les gestionnaires d'événement on(), qui peuvent se placer directement sur des occurrences Button et MovieClip
• Les gestionnaires d'événement onClipEvent(), qui peuvent se placer directement sur des occurrences MovieClip
• Des propriétés de fonction de rappel, telles que XML.onload et Camera.onActivity
• Des écouteurs d'événement, que vous pouvez enregistrer à l'aide de la méthode addListener()
• La classe UIEventDispatcher, qui implémentait partiellement le modèle d'événements DOM
Chacun de ces mécanismes présente des avantages et des inconvénients. Les gestionnaires on() et onClipEvent()
sont simples d'utilisation, mais compliquent la maintenance des projets car il peut s'avérer difficile de localiser le code
placé directement sur les boutons ou les clips. Les fonctions de rappel sont également faciles à implémenter, mais
imposent une limite d'une seule fonction de rappel par événement. L'implémentation des écouteurs d'événement est
plus complexe : ils nécessitent non seulement la création d'un objet et d'une fonction d'écouteur, mais aussi
l'enregistrement de l'écouteur auprès de l'objet qui génère l'événement. Bien qu'elle accroisse le temps système
nécessaire, cette solution vous permet de créer plusieurs objets écouteur et de tous les enregistrer pour le même
événement.
Dans ActionScript 2.0, le développement des composants engendrait un modèle d'événements encore différent. Ce
nouveau modèle, caractérisé par la classe UIEventDispatcher, reposait sur un sous-ensemble de la spécification
d'événements DOM. Ainsi, pour les développeurs accoutumés à la gestion des événements de composant, le passage
au nouveau modèle d'événements d'ActionScript 3.0 se fera sans trop de difficultés.
Malheureusement, si l'on constate des recoupements entre les divers modèles d'événements, il existe aussi des
différences. Par exemple, dans ActionScript 2.0, certaines propriétés, telles que TextField.onChanged, peuvent
s'utiliser soit comme fonction de rappel, soit comme écouteur d'événement. Toutefois, la syntaxe qui permet
d'enregistrer les objets écouteurs varie selon que vous utilisez l'une des six classes qui prennent en charge les écouteurs
ou la classe UIEventDispatcher. Pour les classes Key, Mouse, MovieClipLoader, Selection, Stage et TextField, vous
utilisez la méthode addListener(), mais pour la gestion des événements de composant, vous utilisez une méthode
appelée addEventListener().
La multiplicité des modèles de gestion d'événements a fait naître une autre complexité : l'étendue de la fonction de
gestionnaire d'événement variait largement en fonction du mécanisme utilisé. En d'autres termes, la signification du
mot-clé this n'était pas cohérente sur l'ensemble des systèmes de gestion d'événements.
PROGRAMMATION AVEC ACTIONSCRIPT 3.0 POUR FLASH 258
Gestion des événements
Gestion d'événements dans ActionScript 3.0
ActionScript 3.0 utilise pour la première fois un modèle de gestion d'événements qui vient remplacer les nombreux
mécanismes qui existaient dans les précédentes versions du langage. Le nouveau modèle d'événements repose sur la
spécification d'événements de niveau 3 DOM (Document Object Model). Bien que le format de fichier SWF ne suive
pas spécifiquement la norme DOM, il existe suffisamment de similitudes entre la liste d'affichage et la structure du
DOM pour permettre l'implémentation de ce modèle d'événements. Un objet de la liste d'affichage est semblable à un
noeud de la structure hiérarchique du DOM ; dans ce chapitre, les termes objet de liste d'affichage et noeud sont
d'ailleurs utilisés de façon interchangeable.
L'implémentation du modèle d'événements DOM dans Flash Player et AIR comprend un concept appelé
« comportements par défaut ». Un comportement par défaut est une action que Flash Player ou AIR effectue comme
conséquence normale de certains événements.
Comportements par défaut
Les développeurs se chargent normalement d'écrire le code qui permet de répondre aux événements. Dans certains cas,
cependant, un comportement est si couramment associé à un événement que Flash Player ou AIR l'exécute
automatiquement, sauf si le développeur ajoute du code pour annuler son exécution. Comme Flash Player ou AIR se
livre automatiquement à cette opération, on parle de comportements par défaut.
Par exemple, lorsqu'un utilisateur entre du texte dans un objet TextField, il est si courant de voir s'afficher la saisie dans
l'objet TextField en question que ce comportement est prédéfini dans Flash Player ou AIR. Si vous ne souhaitez pas
conserver ce comportement par défaut, vous pouvez l'annuler à l'aide du système de gestion des événements.
Lorsqu'un utilisateur entre du texte dans un objet TextField, Flash Player ou AIR crée une occurrence de la classe
TextEvent afin de représenter cette saisie. Pour éviter que Flash Player ou AIR n'affiche le texte dans l'objet TextField,
vous devez accéder à cette occurrence de TextEvent spécifique et appeler sa méthode preventDefault().
Certains comportements par défaut ne peuvent être évités. Par exemple, Flash Player et AIR génèrent un objet
MouseEvent lorsque l'utilisateur double-clique sur un mot dans un objet TextField. Le comportement par défaut, qui
ne peut être évité, consiste à mettre en évidence le mot situé sous le curseur.
De nombreux types d'objets événement ne sont associés à aucun comportement par défaut. Par exemple, l'objet
événement Connect, que Flash Player distribue lorsqu'une connexion réseau est établie, n'est associé à aucun
comportement par défaut. La documentation de l'API relative à la classe Event et ses sous-classes fait l'inventaire de
chaque type d'événement, décrit le comportement par défaut qui lui est éventuellement associé et indique si ce dernier
peut être évité.
Il est important de comprendre que les comportements par défaut sont uniquement associés à des objets événements
distribués par Flash Player ou AIR ; il n'en existe aucun pour les objets événements distribués via ActionScript par
programmation. Par exemple, vous pouvez utiliser les méthodes de la classe EventDispatcher pour distribuer un objet
événement du type textInput, mais cet objet ne sera associé à aucun comportement par défaut. En d'autres termes,
Flash Player et AIR n'affichent aucun caractère dans un objet TextField en réponse à un événement textInput que
vous avez distribué par programmation.
Nouveautés des écouteurs d'événement dans ActionScript 3.0
Pour les développeurs qui connaissent bien la méthode ActionScript 2.0 addListener(), il peut être utile de souligner
les différences entre le modèle d'écouteur d'événement d'ActionScript 2.0 et le modèle d'événements
d'ActionScript 3.0. La liste ci-après décrit les principales différences entre ces deux modèles d'événements :
• Pour ajouter des écouteurs d'événement dans ActionScript 2.0, vous utilisez, selon le cas, addListener() ou
addEventListener(). Dans ActionScript 3.0, il faut utiliser addEventListener() dans tous les cas.
PROGRAMMATION AVEC ACTIONSCRIPT 3.0 POUR FLASH 259
Gestion des événements
• ActionScript 2.0 ne propose aucun flux d'événements dans ActionScript 2.0, ce qui signifie que la méthode
addListener() peut uniquement être appelée sur l'objet qui émet l'événement. Dans ActionScript 3.0, la méthode
addEventListener() peut être appelée sur tout objet faisant partie du flux d'événements.
• Dans ActionScript 2.0, les écouteurs d'événement peuvent être des fonctions, des méthodes ou des objets, alors que
dans ActionScript 3.0, seules les fonctions et les méthodes peuvent agir comme écouteurs d'événement.
Flux d'événements
Flash Player ou AIR distribue des objets événements dès que survient un événement. Si la cible d'événement ne se
trouve pas dans la liste d'affichage, Flash Player ou AIR distribue l'objet événement directement à la cible. Par exemple,
Flash Player distribue l'objet événement Progress directement à un objet URLStream. Cependant, si la cible
d'événement se trouve dans la liste d'affichage, Flash Player distribue l'objet événement à la liste d'affichage, dans
laquelle l'objet chemine jusqu'à atteindre la cible d'événement.
Le flux d'événements représente le parcours que suivra un objet événement dans la liste d'affichage. Cette liste
s'organise de manière hiérarchique, pour constituer une arborescence. Au sommet de la liste d'affichage se trouve la
scène, un conteneur d'objet d'affichage spécial qui lui sert de racine. La Scène, représentée par la classe
flash.display.Stage, est uniquement accessible via un objet d'affichage. Chaque objet d'affichage présente une propriété
appelée stage, qui renvoie à la scène de cette application.
Lorsque Flash Player ou AIR distribue un objet d'événement pour un événement associé à une liste d'affichage, celuici
effectue un aller-retour entre la Scène et le noeud cible. Selon la définition de la spécification d'événements DOM, le
noeud cible est le noeud qui représente la cible d'événement. En d'autres termes, le noeud cible est l'objet de la liste
d'affichage au niveau duquel est survenu l'événement. Par exemple, si l'utilisateur clique sur un objet de la liste
d'affichage appelé child1, Flash Player ou AIR distribue un objet événement dont le noeud cible est child1.
Le flux d'événements se décompose en trois phases. La première correspond à la phase de capture, qui comprend tous
les noeuds de la Scène jusqu'au parent du noeud cible. La deuxième partie est appelée la phase cible, qui comprend
uniquement le noeud cible. La troisième partie s'appelle la phase de propagation vers le haut. Elle comprend les noeuds
rencontrés lors du cheminement du parent du noeud cible jusqu'à la scène.
Le nom de ces phases prend tout son sens si vous envisagez la liste d'affichage comme une hiérarchie verticale dont le
sommet est la Scène, comme illustré par le schéma suivant :
Scène
Noeud parent
Noeud enfant1 Noeud enfant2
PROGRAMMATION AVEC ACTIONSCRIPT 3.0 POUR FLASH 260
Gestion des événements
Si un utilisateur clique sur Child1 Node, Flash Player ou AIR distribue un objet événement dans ce flux d'événements.
Comme le montre l'illustration suivante, le parcours de l'objet commence à Stage. L'objet descend ensuite jusqu'à
Parent Node, puis vers Child1 Node. Il se propage alors vers le haut jusqu'à Stage, en repassant par Parent Node.
Dans cet exemple, la phase de capture comprend Stage et Parent Node pendant le trajet descendant initial. La phase
cible comprend le temps passé au noeud Child1 Node. La phase de propagation comprend les noeuds Parent Node
et Stage, qui se trouvent sur le chemin du retour vers le noeud racine.
Le flux d'événements contribue au renforcement du système de gestion des événements par rapport aux versions
précédentes d'ActionScript. Dans ces dernières, le flux d'événements est inexistant, ce qui signifie que les écouteurs
d'événement s'ajoutent uniquement à l'objet qui génère l'événement. Dans ActionScript 3.0, vous pouvez ajouter des
écouteurs d'événement aussi bien à un noeud cible qu'à tout autre noeud du flux d'événements.
Cette possibilité d'ajouter des écouteurs d'événement tout au long du flux d'événements s'avère particulièrement utile
lorsqu'un composant d'interface comprend plusieurs objets. Par exemple, un objet bouton contient souvent un objet
texte qui sert de libellé au bouton. Sans la possibilité d'ajouter un écouteur au flux d'événements, il faudrait en ajouter
un à l'objet bouton et un à l'objet texte pour être sûr d'être averti des événements de clic survenant à tout endroit du
bouton. Le flux d'événements vous permet, au contraire, de placer un seul écouteur d'événement sur l'objet bouton afin
de gérer les événements de clic, qu'ils se produisent sur l'objet texte ou sur des zones de l'objet bouton non couvertes
par l'objet texte.
Cependant, certains objets événements ne participent pas aux trois phases du flux d'événements. Certains types
d'événements, tels que enterFrame et init, sont distribués directement au noeud cible et ne participent ni à la phase
de capture, ni à la phase de propagation vers le haut. D'autres événements peuvent cibler des objets qui ne font pas
partie de la liste d'affichage, par exemple les événements distribués à une occurrence de la classe Socket. Ces objets
événements aboutissent directement à l'objet cible, sans participer à la phase de capture et de propagation vers le haut.
Pour savoir comme se comporte un type d'événement particulier, vous pouvez consulter la documentation de l'API ou
examiner les propriétés de l'objet événement. Cette dernière méthode est décrite à la section suivante.
Objets événement
Les objets événements jouent deux rôles essentiels dans le nouveau système de gestion des événements. Tout d'abord,
ces objets représentent de véritables événements puisqu'ils stockent dans un ensemble de propriétés des informations
relatives à des événements précis. Ils contient en outre un jeu de méthodes qui vous permet de manipuler les objets
événements et d'agir sur le comportement du système de gestion des événements.
Pour faciliter l'accès à ces propriétés et ces méthodes, l'API Flash Player définit une classe Event qui constitue la classe
de base de tous les objets événements. La classe Event définit un jeu fondamental de propriétés et de méthodes
commun à tous les objets événements.
PROGRAMMATION AVEC ACTIONSCRIPT 3.0 POUR FLASH 261
Gestion des événements
Cette section commence par étudier les propriétés de la classe Event avant de décrire les méthodes de cette même
classe, puis explique l'existence de sous-classes dans la classe Event.
Présentation des propriétés de la classe Event
La classe Event définit plusieurs propriétés et constantes en lecture seule qui fournissent des informations essentielles
sur l'objet événement. Les points suivants revêtent une importance particulière :
• Les types d'objet événement sont représentés par des constantes et stockés dans la propriété Event.type.
• La possibilité d'éviter le comportement par défaut d'un événement est représentée par une valeur booléenne,
stockée dans la propriété Event.cancelable.
• Les informations relatives au flux d'événements se trouvent dans les propriétés restantes.
Types d'objets événement
Chaque objet événement est associé à un type d'événement. Les types d'événement sont stockés dans la propriété
Event.type sous forme de chaîne. Il est utile de connaître le type d'un objet événement car votre code peut alors
distinguer les objets de types différents. Par exemple, le code suivant spécifie que la fonction clickHandler() doit
répondre à tous les objets événements clic de souris transmis à myDisplayObject :
myDisplayObject.addEventListener(MouseEvent.CLICK, clickHandler);
La classe Event est elle-même associée à deux douzaines de types d'événement, représentés par des constantes de la
classe Event. Dans cet extrait de la définition de la classe Event, certaines de ces constantes sont illustrées :
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
}
}
Ces constantes permettent de faire facilement référence à des types d'événement précis. Vous devez utiliser ces
constantes au lieu des chaînes qu'elles représentent. Si vous orthographiez de manière incorrecte un nom de constante
dans votre code, le compilateur peut détecter l'erreur. Si vous utilisez les chaînes qu'elles représentent, une erreur de
frappe ne sera pas forcément détectée lors de la compilation et pourrait provoquer un comportement inattendu,
difficile à déboguer. Par exemple, utilisez le code suivant pour ajouter un écouteur d'événement :
myDisplayObject.addEventListener(MouseEvent.CLICK, clickHandler);
plutôt que :
myDisplayObject.addEventListener("click", clickHandler);
Informations de comportement par défaut
Le code que vous écrivez est en mesure de vérifier si le comportement par défaut d'un objet événement donné peut être
évité. Pour ce faire, il doit accéder à la propriété cancelable. La propriété cancelable contient une valeur
booléenne qui indique si le comportement par défaut peut être évité ou non. Vous pouvez éviter, ou annuler, le
comportement par défaut de quelques événements à l'aide de la méthode preventDefault(). Pour plus
d'informations, consultez Annulation du comportement d'événement par défaut à la section « Présentation des
méthodes de la classe Event » à la page 263.
PROGRAMMATION AVEC ACTIONSCRIPT 3.0 POUR FLASH 262
Gestion des événements
Informations de flux d'événements
Les propriétés restantes de la classe Event contiennent des informations importantes sur l'objet événement et ses
relations au flux d'événements, comme l'explique la liste suivante :
• La propriété bubbles contient des informations sur les parties du flux d'événements auquel participe l'objet
événement.
• La propriété eventPhase indique la phase actuelle du flux d'événements.
• La propriété target stocke une référence à la cible d'événement.
• La propriété currentTarget stocke une référence de l'objet de liste d'affichage qui traite actuellement l'objet
événement.
La propriété bubbles
On dit d'un événement qu'il se propage vers le haut (en anglais, « to bubble ») lorsqu'il participe à la phase de
propagation vers le haut du flux d'événements, c'est-à-dire quand l'objet événement est transmis du noeud cible via ses
ascendants jusqu'à la Scène. La propriété Event.bubbles stocke une valeur booléenne qui indique si l'objet événement
participe à la phase de propagation vers le haut. Tous les événements qui se propagent vers le haut participent
également aux phases de capture et cible ; de tels événements participent donc aux trois phases du flux d'événements.
Si la valeur est true, l'objet événement participe aux trois phrases. Si la valeur est false, l'objet événement ne participe
pas à la phase de propagation vers le haut.
La propriété eventPhase
Vous pouvez déterminer la phase d'événement de tout objet événement grâce à sa propriété eventPhase. La
propriété eventPhase a pour valeur un entier non signé qui représente l'une des trois phases du flux d'événements.
L'API de Flash Player définit une classe EventPhase distincte qui contient trois constantes correspondant aux trois
valeurs entières non signées, comme illustré par l'extrait de code suivant :
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;
}
}
Ces constantes correspondent aux trois valeurs valables pour la propriété eventPhase. Vous pouvez utiliser ces
constantes pour améliorer la lisibilité de votre code. Supposons par exemple que vous souhaitiez être sûr qu'une
fonction appelée myFunc() soit uniquement appelée lorsque la cible d'événement se trouve dans la scène cible. Le code
suivant vous permet de tester cette condition :
if (event.eventPhase == EventPhase.AT_TARGET)
{
myFunc();
}
La propriété target
La propriété target contient une référence à l'objet cible de l'événement. Dans certains cas, ce système est simple, par
exemple, lorsqu'un micro devient actif, la cible de l'objet événement est l'objet Microphone. Toutefois, si la cible se
trouve sur la liste d'affichage, il faut tenir compte de la hiérarchie de cette dernière. Par exemple, si un utilisateur clique
avec la souris sur un point correspondant à plusieurs objets de la liste d'affichage qui se chevauchent, Flash Player
et AIR choisissent toujours comme cible d'événement l'objet qui se trouve le plus loin de la Scène.
PROGRAMMATION AVEC ACTIONSCRIPT 3.0 POUR FLASH 263
Gestion des événements
Dans des fichiers SWF complexes, et particulièrement ceux dont les boutons sont régulièrement ornés d'objets enfant
plus petits, la propriété target ne doit pas être utilisée fréquemment car elle pointera souvent vers l'objet enfant du
bouton plutôt que vers le bouton lui-même. Dans de telles situations, il est courant d'ajouter des écouteurs
d'événement au bouton et d'utiliser la propriété currentTarget. En effet, cette dernière pointe vers le bouton alors
que la propriété target peut pointer vers l'un des enfants du bouton.
La propriété currentTarget
La propriété currentTarget contient une référence de l'objet de liste d'affichage qui traite actuellement l'objet
événement. Même s'il peut paraître étrange de ne pas savoir quel noeud traite actuellement l'objet événement que vous
étudiez, gardez à l'esprit que vous pouvez ajouter une fonction écouteur à n'importe quel objet d'affichage du flux
d'événements de l'objet événement en question. En outre, cette fonction écouteur peut être placée à tout endroit. Par
ailleurs, la même fonction écouteur peut être ajoutée à différents objets d'affichage. L'utilité de la propriété
currentTarget augmente donc avec la taille et la complexité du projet.
Présentation des méthodes de la classe Event
Il existe trois catégories de méthodes dans la classe Event :
• Les méthodes d'utilitaire, qui peuvent créer des copies d'un objet événement ou le convertir en chaîne
• Les méthodes de flux d'événements, qui suppriment les objets événements du flux d'événements
• Les méthodes de comportement par défaut, qui évitent le comportement par défaut ou vérifient s'il peut être évité
Méthodes d'utilitaire de la classe Event
La classe Event compte deux méthodes d'utilitaire. La méthode clone() permet de créer des copies d'un objet
événement. La méthode toString() permet de représenter sous forme de chaînes les propriétés d'un objet événement
ainsi que leurs valeurs. Bien qu'utilisées en interne par le modèle d'événements, ces deux méthodes sont mises à la
disposition des développeurs pour un usage générique.
Pour les développeurs expérimentés qui souhaitent créer des sous-classes de la classe Event, il est nécessaire de
redéfinir et d'implémenter des versions de ces deux méthodes d'utilitaires afin de garantir le bon fonctionnement de
la sous-classe d'événement.
Arrêt du flux d'événements
La méthode Event.stopPropagation() ou Event.stopImmediatePropagation() vous permet d'arrêter le
cheminement d'un objet événement dans le flux d'événements. Quasi identiques, ces deux méthodes diffèrent
uniquement en ce que les autres écouteurs d'événement du noeud actuel sont autorisés ou non à s'exécuter :
• La méthode Event.stopPropagation() empêche l'objet événement de passer au noeud suivant mais seulement
après que tous les autres écouteurs du noeud actuel ont été autorisés à s'exécuter.
• La méthode Event.stopImmediatePropagation() empêche l'objet événement de passer au noeud suivant sans
autoriser les autres écouteurs du noeud actuel à s'exécuter.
Quelle que soit la méthode appelée, elle n'a aucun effet sur la réalisation du comportement par défaut de l'événement.
Utilisez les méthodes de comportement par défaut de la classe Event pour éviter le comportement par défaut.
Annulation du comportement d'événement par défaut
Deux méthodes sont liées à l'annulation du comportement par défaut : preventDefault() et isDefaultPrevented().
Appelez la méthode preventDefault() pour annuler le comportement par défaut associé à un événement. Pour
vérifier si preventDefault() a déjà été appelée sur un objet événement, appelez la méthode
isDefaultPrevented(), qui renvoie la valeur true si la méthode a déjà été appelée, false dans le cas contraire.
PROGRAMMATION AVEC ACTIONSCRIPT 3.0 POUR FLASH 264
Gestion des événements
La méthode preventDefault() fonctionne uniquement s'il est possible d'annuler le comportement par défaut de
l'événement. Pour vérifier que c'est le cas, reportez-vous à la documentation de l'API de ce type d'événement ou
examinez la propriété cancelable de l'objet événement à l'aide du code ActionScript.
L'annulation du comportement par défaut n'a aucun effet sur la progression d'un objet événement dans le flux
d'événements. Utilisez les méthodes de flux d'événements de la classe Event pour supprimer un objet événement du
flux d'événements.
Sous-classes de la classe Event
Pour de nombreux événements, le jeu de propriétés commun, défini dans la classe Event est suffisant. Néanmoins,
d'autres événements présentent des caractéristiques exclusives qui ne peuvent être capturées par les propriétés
disponibles dans la classe Event. Pour ces événements, ActionScript 3.0 définit plusieurs sous-classes de la classe
Evénement.
Chaque sous-classe fournit un complément de propriétés et de types d'événement spécifiques à la catégorie
d'événement considérée. Par exemple, les événements liés aux actions de la souris présentent plusieurs caractéristiques
uniques, que les propriétés définies dans la classe Event ne peuvent capturer. La classe MouseEvent constitue une
extension de la classe Event puisqu'elle ajoute dix propriétés contenant des informations telles que l'emplacement de
l'événement de souris et les éventuelles touches actionnées en même temps.
Une sous-classe d'Event contient également des constantes qui représentent de types d'événement associés à la sousclasse.
Par exemple, la classe MouseEvent définit des constantes pour plusieurs types d'événement de souris,
notamment click, doubleClick, mouseDown et mouseUp.
Comme le décrit la section consacrée aux méthodes d'utilitaire de la classe Event dans « Objets événement » à la
page 260, lors de la création d'une sous-classe d'Event, vous devez bloquer les méthodes clone() et toString() pour
fournir la fonctionnalité propre à la sous-classe.
Les écouteurs d'événement
Les écouteurs d'événement, également appelés gestionnaires d'événements, sont des fonctions que Flash Player et AIR
exécutent en réponse à des événements déterminés. La procédure d'ajout d'un écouteur d'événement se déroule en
deux temps. En premier lieu, vous créez une fonction ou méthode de classe que Flash Player ou AIR doit exécuter en
réponse à l'événement. On parle parfois de fonction d'écouteur ou de fonction de gestionnaire d'événement. En second
lieu, vous utilisez la méthode addEventListener() pour enregistrer la fonction d'écouteur auprès de la cible de
l'événement ou tout autre objet de la liste d'affichage qui appartient au flux d'événements approprié.
Création d'une fonction d'écouteur
La création d'une fonction d'écouteur est un domaine dans lequel le modèle d'événements ActionScript 3.0 diffère du
modèle d'événements DOM. Dans le modèle d'événements DOM, on distingue clairement un écouteur d'événement
et une fonction d'écouteur : un écouteur d'événement est une occurrence de classe qui implémente l'interface
EventListener, tandis qu'une fonction d'écouteur est une méthode de cette classe appelée handleEvent(). Dans le
modèle d'événements DOM, vous enregistrez l'occurrence de classe qui contient la fonction d'écouteur, plutôt que la
fonction d'écouteur elle-même.
PROGRAMMATION AVEC ACTIONSCRIPT 3.0 POUR FLASH 265
Gestion des événements
Le modèle d'événements ActionScript ne fait aucune distinction entre l'écouteur d'événement et la fonction d'écouteur.
L'interface EventListener est inexistante dans ActionScript 3.0 et les fonctions d'écouteur peuvent être définies en
dehors de toute classe ou au sein d'une classe. Par ailleurs, il n'est pas nécessaire de nommer les fonctions d'écouteur
handleEvent() ; vous pouvez utiliser tout identifiant valable. Dans ActionScript 3.0, vous enregistrez le nom de la
fonction d'écouteur elle-même.
Fonction d'écouteur définie en dehors de toute classe
Le code suivant crée un fichier SWF simple qui affiche une forme carrée de couleur rouge. Une fonction d'écouteur
appelée clickHandler(), qui n'appartient à aucune classe, écoute les événements de clic de souris dans le carré rouge.
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);
}
Lorsqu'un utilisateur interagit avec le fichier SWF résultant, en cliquant sur le carré, Flash Player ou AIR génère la
sortie de trace ci-après :
clickHandler detected an event of type: click
the this keyword refers to: [object global]
Notez que l'objet événement est transmis sous forme d'instruction à clickHandler(). Cela permet à votre fonction
d'écouteur d'examiner l'objet événement. Dans cet exemple, vous utilisez la propriété type de l'objet événement pour
vérifier que cet événement correspond à un clic.
L'exemple vérifie aussi la valeur du mot-clé this. Dans ce cas, this représente l'objet global, ce qui est logique
puisque la fonction est définie en dehors de toute classe ou objet personnalisé.
PROGRAMMATION AVEC ACTIONSCRIPT 3.0 POUR FLASH 266
Gestion des événements
Fonction d'écouteur définie comme méthode de classe
L'exemple ci-dessous est identique au précédent, qui définit la classe ClickExample, sauf que la fonction
clickHandler() est définie comme méthode de la 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);
}
}
Lorsqu'un utilisateur interagit avec le fichier SWF résultant, en cliquant sur le carré rouge, Flash Player ou AIR génère
la sortie de trace ci-après :
clickHandler detected an event of type: click
the this keyword refers to: [object ChildSprite]
Notez que le mot-clé this renvoie à l'occurrence de ChildSprite appelée child. Voici un changement de
comportement par rapport à ActionScript 2.0. Si vous utilisiez des composants dans ActionScript 2.0, vous vous
rappelez sans doute que lorsqu'une méthode de classe était transmise à UIEventDispatcher.addEventListener(),
l'étendue de la méthode était liée au composant qui émettait l'événement, et non à la classe dans laquelle la méthode
d'écouteur était définie. En d'autres termes, si vous utilisiez cette technique dans ActionScript 2.0, le mot-clé this
renvoyait au composant émettant l'événement et non à l'occurrence de ChildSprite.
Pour certains développeurs, il s'agissait d'un vrai problème car cela signifiait qu'ils ne pouvaient accéder à aucune autre
méthode et propriété de la classe qui contenait la méthode d'écouteur. Pour le contourner, les programmeurs
d'ActionScript 2.0 pouvaient utiliser la classe mx.util.Delegate pour modifier l'étendue de la méthode d'écouteur.
Cette manipulation n'est plus nécessaire puisque ActionScript 3.0 crée une méthode liée lorsque
addEventListener() est appelée. Par conséquent, le mot-clé this fait référence à l'occurrence de ChildSprite appelée
child et le programmeur peut accéder aux autres méthodes et propriétés de la classe ChildSprite.
PROGRAMMATION AVEC ACTIONSCRIPT 3.0 POUR FLASH 267
Gestion des événements
Ecouteur d'événement à ne pas utiliser
Une troisième technique permet de créer un objet générique dont l'une des propriétés pointe vers une fonction
d'écouteur affectée dynamiquement. Elle est cependant déconseillée. Nous l'évoquons ici en raison de son utilisation
courante dans ActionScript 2.0 ; il n'est toutefois pas recommandé de l'utiliser dans ActionScript 3.0. Cette mise en
garde tient au fait que le mot-clé this fera référence à l'objet global et non à l'objet écouteur.
L'exemple ci-après est identique à l'exemple précédent de la classe ClickExample, sauf que la fonction d'écouteur est
définie comme faisant partie d'un objet générique appelé 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);
}
Les résultats de trace seront les suivants :
clickHandler detected an event of type: click
the this keyword refers to: [object global]
On s'attendrait à ce que this fasse référence à myListenerObj et que la sortie de trace soit [object Object], mais
le mot-clé renvoie en fait à l'objet global. Lorsque vous transmettez un nom de propriété dynamique comme
instruction à addEventListener(), Flash Player ou AIR est incapable de créer une méthode liée. En effet, ce que vous
transmettez comme paramètre listener n'est rien de plus que l'adresse mémoire de votre fonction d'écouteur ;
Flash Player et AIR n'ont aucun moyen de lier cette adresse à l'occurrence de myListenerObj.
PROGRAMMATION AVEC ACTIONSCRIPT 3.0 POUR FLASH 268
Gestion des événements
Gestion des écouteurs d'événement
Vous pouvez gérer vos fonctions d'écouteur à l'aide des méthodes de l'interface IEventDispatcher. Cette interface est
la version ActionScript 3.0 de l'interface EventTarget du modèle d'événements DOM. Bien que le nom
IEventDispatcher semble impliquer que l'objet principal de la classe est l'envoi (ou la distribution) des objets
événements, les méthodes qui lui correspondent servent en fait plus souvent à l'enregistrement, la vérification et la
suppression des écouteurs d'événement. L'interface IEventDispatcher définit cinq méthodes, comme illustré dans le
code suivant :
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;
}
}
L'API de Flash Player implémente l'interface IEventDispatcher à l'aide de la classe Event Dispatcher. Cette dernière
constitue la classe de base de toutes les classes pouvant servir de cibles d'événement ou faire partie d'un flux
d'événements. Par exemple, la classe DisplayObject hérite de la classe EventDispatcher, par conséquent, tout objet de
la liste d'affichage peut accéder aux méthode de l'interface IEventDispatcher.
Ajout des écouteurs d'événement
La méthode addEventListener() est la clé de voûte de l'interface IEventDispatcher. Elle permet d'enregistrer les
fonctions d'écouteurs. Les deux paramètres requis sont type et listener. Le paramètre type spécifie le type
d'événement. Avec le paramètre listener, vous pouvez spécifier la fonction d'écouteur qui doit s'exécuter lorsque
l'événement survient. Le paramètre listener peut être une référence à une fonction ou une méthode de classe.
Remarque : n'utilisez pas de parenthèses lors de la spécification du paramètre listener. Par exemple, la fonction
clickHandler() est spécifiée sans parenthèses dans l'appel suivant à la méthode addEventListener() :
Remarque : addEventListener(MouseEvent.CLICK, clickHandler).
Le paramètre useCapture de la méthode addEventListener() vous permet de contrôler la phase du flux
d'événements pendant laquelle votre écouteur sera actif. Si useCapture a la valeur true, votre écouteur sera actif
pendant la phase de capture du flux d'événements. Si useCapture a la valeur false, votre écouteur sera actif pendant
la phase cible et la phase de propagation du flux d'événements. Pour écouter un événement pendant toutes les phases
du flux d'événements, vous devez appeler deux fois addEventListener() ; la première fois useCapture prend
la valeur true, la seconde, useCapture prend la valeur false.
PROGRAMMATION AVEC ACTIONSCRIPT 3.0 POUR FLASH 269
Gestion des événements
Le paramètre priority de la méthode addEventListener() ne fait pas officiellement partie du modèle d'événements
DOM de niveau 3. Il est inclus dans ActionScript 3.0 pour vous offrir une plus grande souplesse dans l'organisation de
vos écouteurs d'événement. Lorsque vous appelez addEventListener(), vous pouvez définir la priorité de cet
écouteur d'événement en transmettant une valeur entière comme paramètre priority. La valeur par défaut est 0.
Vous pouvez toutefois utiliser une valeur entière négative ou positive. Plus le nombre est élevé, plus l'exécution de
l'écouteur d'événement est rapide. Les écouteurs d'événement de priorité équivalente sont exécutés suivant l'ordre dans
lequel ils ont été ajoutés : plus l'écouteur est ajouté tôt, plus il est exécuté rapidement.
Le paramètre useWeakReference vous permet de spécifier si la référence à la fonction d'écouteur est faible ou
normale. En lui attribuant la valeur true, vous évitez les situations dans lesquelles les fonctions d'écouteurs demeurent
dans la mémoire alors qu'elles sont inutiles. Flash Player et AIR utilisent une technique appelée nettoyage pour effacer
de la mémoire les objets qui ne servent plus. Un objet est considéré comme inutilisé lorsqu'il n'apparaît dans aucune
référence. Le nettoyeur de mémoire ignore les références faibles, c'est-à-dire qu'une fonction d'écouteur vers laquelle
pointe uniquement une référence faible est incluse dans le nettoyage.
Suppression des écouteurs d'événement
La méthode removeEventListener() permet de supprimer un écouteur d'événement dont vous n'avez plus besoin.
Il est judicieux de supprimer tous les écouteurs qui ne seront plus utilisés. Les paramètres requis sont notamment
eventName et listener, soit les mêmes que ceux requis pour la méthode addEventListener(). Rappel : pour
écouter les événements pendant toutes les phases du flux d'événements, vous pouvez appeler addEventListener()
deux fois, en attribuant à useCapture la valeur true la première, puis false la seconde. Pour supprimer les deux
écouteurs d'événement, il serait nécessaire d'appeler removeEventListener() à deux reprises, la première fois en
attribuant la valeur true à useCapture, la seconde fois en utilisant la valeur false.
Distribution d'événements
La méthode dispatchEvent() peut servir aux développeurs chevronnés pour distribuer un objet événement
personnalisé dans le flux d'événements. Cette méthode accepte un seul paramètre, une référence à l'objet événement,
qui doit être une occurrence de la classe Event ou de l'une de ces sous-classes. Après distribution, la propriété target
de l'objet événement est définie avec l'objet sur lequel portait l'appel dispatchEvent().
Vérification des écouteurs d'événement existants
Les deux dernières méthodes de l'interface IEventDispatcher fournissent des informations précieuses sur l'existence
des écouteurs d'événement. La méthode hasEventListener() renvoie la valeur true si un écouteur d'événement est
détecté pour un type d'événement spécifique sur un objet particulier de la liste d'affichage. La méthode
willTrigger() renvoie également la valeur true si un écouteur est détecté pour un objet donné de la liste d'affichage.
Cependant willTrigger() vérifie les écouteurs sur l'objet d'affichage en question mais également sur tous les
ascendants de cet objet dans l'ensemble des phases du flux d'événements.
PROGRAMMATION AVEC ACTIONSCRIPT 3.0 POUR FLASH 270
Gestion des événements
Evénements d'erreur sans écouteurs
Plus que les événements, les exceptions constituent le mécanisme principal de gestion des erreurs dans
ActionScript 3.0. Toutefois, la gestion des exceptions ne fonctionne pas sur les opérations asynchrones telles que les
chargements de fichiers. Si une erreur survient pendant une opération asynchrone, Flash Player et AIR distribuent un
objet événement d'erreur. Si vous ne créez pas d'écouteur pour l'événement d'erreur, les versions de débogage de Flash
Player et AIR affichent une boîte de dialogue comportant des informations sur l'erreur en question. Par exemple, la
version de débogage de Flash Player affiche la boîte de dialogue suivante, qui décrit l'erreur associée à une tentative de
chargement d'un fichier par l'application à partir d'une URL non valide :
La plupart des événements d'erreur reposent sur la classe ErrorEvent. Ils présentent donc une propriété appelée text,
qui sert au stockage du message d'erreur que Flash Player ou AIR affiche. Il existe deux exceptions : les classes
StatusEvent et NetStatusEvent. Ces deux classes possèdent une propriété level (StatusEvent.level et
NetStatusEvent.info.level). Lorsque la valeur de la propriété level est error, ces types d'événement sont
considérés comme des événements d'erreur.
Un événement d'erreur n'interrompt pas l'exécution du fichier SWF. Il se traduit uniquement par l'affichage d'une
boîte de dialogue dans les versions de débogage des navigateurs et des lecteurs autonomes, d'un message dans le
panneau de sortie du lecteur de création et d'une entrée dans le fichier journal d'Adobe Flex Builder 3. Aucune
manifestation n'est visible dans les autres versions de Flash Player ou AIR.
Exemple : Alarm Clock
L'exemple Alarm Clock correspond à une horloge qui permet à l'utilisateur de déterminer l'heure à laquelle l'alarme
doit se déclencher et d'afficher un message en même temps. Il repose sur l'application SimpleClock du chapitre
« Utilisation des dates et des heures » à la page 135 et illustre de nombreux aspects de l'utilisation des événements dans
ActionScript 3.0, notamment les suivants :
• Ecoute des événements et réponse
• Notification d'un événement aux écouteurs
• Créer un type d'événement personnalisé
Pour obtenir les fichiers d'application de cet exemple, visitez l'adresse
www.adobe.com/go/learn_programmingAS3samples_flash_fr. Les fichiers d'application Alarm Clock se trouvent
dans le dossier Samples/AlarmClock. Il s'agit des fichiers suivants :
PROGRAMMATION AVEC ACTIONSCRIPT 3.0 POUR FLASH 271
Gestion des événements
Présentation du réveil
Dans cet exemple, la principale fonctionnalité de l'horloge (dont la mesure du temps et l'affichage du cadran) réutilise
le code de l'application SimpleClock, décrite à la section « Exemple : horloge analogique simple » à la page 140. La
classe AlarmClock étend la classe SimpleClock de cet exemple en y ajoutant la fonctionnalité de réveil requise : réglage
de l'heure de déclenchement et avertissement une fois l'alarme déclenchée.
Le rôle des événements est de fournir un avertissement lorsque se produit quelque chose. La classe AlarmClock expose
l'événement Alarme, à l'écoute duquel d'autres objets peuvent être placés afin d'effectuer les actions voulues. En outre,
la classe AlarmClock utilise une occurrence de la classe Timer pour déterminer à quel moment déclencher l'alarme.
Comme la classe AlarmClock, la classe Timer fournit un événement pour avertir d'autres objets (une occurrence de
AlarmClock dans ce cas) une fois un certain délai écoulé. Comme dans la plupart des applications ActionScript, les
événements constituent une part importante de la fonctionnalité de l'exemple Alarm Clock.
Déclenchement de l'alarme
Comme mentionné plus haut, la seule fonctionnalité de la classe AlarmClock est liée à la définition et au
déclenchement de l'alarme. La classe intégrée Timer (flash.utils.Timer) permet au développeur de définir du code qui
sera exécuté après un délai spécifique. La classe AlarmClock utilise une occurrence de Timer pour déterminer le
moment auquel déclencher l'alarme.
Fichier Description
AlarmClockApp.mxml
ou
AlarmClockApp.fla
Le fichier d'application principal dans Flash (FLA) ou Flex (MXML).
com/example/programmingas3/clock/AlarmClock.as Classe permettant d'étendre la classe SimpleClock, qui ajoute la
fonctionnalité de réveil.
com/example/programmingas3/clock/AlarmEvent.as Une classe d'événement personnalisé (sous-classe de
flash.events.Event), qui sert d'objet événement à l'événement alarm
de la classe AlarmClock.
com/example/programmingas3/clock/AnalogClockFace.as Dessine une horloge ronde et les aiguilles des heures, des minutes et
des secondes en fonction de l'heure (décrit dans l'exemple
SimpleClock).
com/example/programmingas3/clock/SimpleClock.as Composant d'interface d'horloge doté d'une fonctionnalité simple de
mesure temporelle (décrit dans l'exemple SimpleClock).
PROGRAMMATION AVEC ACTIONSCRIPT 3.0 POUR FLASH 272
Gestion des événements
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);
}
L'occurrence de Timer définie dans la classe AlarmClock est appelée alarmTimer. La méthode initClock(), qui
effectue les opérations de configuration nécessaires à l'occurrence de AlarmClock, exploite la variable alarmTimer de
deux manières. Tout d'abord, la variable est instanciée avec les paramètres indiquant à l'occurrence de Timer
d'attendre 0 millisecondes et de déclencher l'événement timer une seule fois. Après instanciation de alarmTimer, le
code appelle la méthode addEventListener() de cette variable pour indiquer qu'il veut écouter l'événement timer
de cette variable. Le fonctionnement d'une occurrence de Timer repose sur la distribution de l'événement timer après
un certain délai. La classe AlarmClock doit savoir quand l'événement timer est distribué afin de déclencher sa propre
alarme. En appelant addEventListener(), le code AlarmClock s'enregistre comme écouteur auprès de alarmTimer.
Les deux paramètres indiquent que la classe AlarmClock souhaite écouter l'événement timer (indiqué par la constante
TimerEvent.TIMER), et que lorsque l'événement survient, la méthode onAlarm() de la classe AlarmClock doit être
appelée en réponse à l'événement.
Pour effectivement définir l'alarme, la méthode setAlarm() de la classe AlarmClock est appelée, comme suit :
PROGRAMMATION AVEC ACTIONSCRIPT 3.0 POUR FLASH 273
Gestion des événements
/**
* 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;
}
Cette méthode effectue plusieurs opérations, notamment le stockage du message d'alarme et la création d'un objet Date
(alarmTime) représentant le moment réel où l'alarme se déclenchera. Point le plus important de cette étude, le
minuteur de la variable alarmTimer, dans les dernières lignes la méthode, est défini et activé. Tout d'abord, la méthode
reset() est appelée, qui arrête le minuteur et le remet à zéro s'il est déjà reparti. Ensuite, l'heure actuelle (représentée
par la variable now) est soustraite à la valeur de la variable alarmTime afin de déterminer combien de millisecondes
doivent s'écouler avant le déclenchement de l'alarme. La classe Timer ne déclenche pas l'événement timer à une heure
absolue ; c'est ce décalage relatif qui est attribué à la propriété delay de alarmTimer. Enfin, la
méthode start() est appelée pour lancer le minuteur.
Une fois le délai spécifié écoulé, alarmTimer distribue l'événement timer. Comme la classe AlarmClock s'est
enregistrée comme écouteur auprès de sa méthode onAlarm() pour l'événement timer, lorsque celui-ci survient,
onAlarm() est appelée.
/**
* 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);
}
PROGRAMMATION AVEC ACTIONSCRIPT 3.0 POUR FLASH 274
Gestion des événements
Lorsqu'une méthode est enregistrée comme écouteur d'événement, elle doit être définie avec la signature adaptée
(c'est-à-dire le jeu de paramètres et le type de renvoi de la méthode). Pour écouter l'événement timer de la classe
Timer, une méthode doit comporter un paramètre dont le type de données est TimerEvent (flash.event.TimerEvent),
une sous-classe de la classe Event. Lorsque l'occurrence de Timer appelle ses écouteurs d'événement, elle transmet une
occurrence de TimerEvent à l'objet événement.
Notification de l'alarme à d'autres composants
De même que la classe Timer, la classe AlarmClock fournit un événement qui permet de transmettre des notifications
à d'autres éléments de code lorsque l'alarme se déclenche. Pour qu'une classe puisse utiliser le système de gestion des
événements intégré à ActionScript, elle doit implémenter l'interface flash.events.IEventDispatcher. La plupart du
temps, cela se fait par extension de la classe flash.events.EventDispatcher, qui assure une implémentation standard de
IEventDispatcher (ou par extension de l'une des sous-classes de EventDispatcher). Comme décrit précédemment, la
classe AlarmClock étend la classe SimpleClock, qui à son tour étend la classe Sprite, elle-même extension de la classe
EventDispatcher (par héritage). Ainsi, la classe AlarmClock intègre déjà une fonctionnalité lui permettant de fournir
ses propres événements.
D'autres éléments de code peuvent s'enregistrer pour être notifiés de l'événement alarm de la classe AlarmClock en
appelant la méthode addEventListener(), héritée de EventDispatcher. Lorsqu'une occurrence de AlarmClock est
prête à notifier à d'autres éléments de code le déclenchement de l'événement alarm, elle le fait en appelant la méthode
dispatchEvent(), également héritée de EventDispatcher.
var alarm:AlarmEvent = new AlarmEvent(this.alarmMessage);
this.dispatchEvent(alarm);
Ces lignes de code sont extraites de la méthode onAlarm() de la classe AlarmClock (présentée plus haut dans son
intégralité). La méthode dispatchEvent() de l'occurrence de AlarmClock est appelée, puis elle notifie à tous les
écouteurs enregistrés le déclenchement de l'événement alarm de l'occurrence de AlarmClock. Le paramètre transmis
à dispatchEvent() est l'objet événement qui sera ensuite passé aux méthodes d'écouteur. Dans ce cas, il s'agit d'une
occurrence de la classe AlarmEvent, une sous-classe de Event créée spécialement pour cet exemple.
Elaboration d'un événement d'alarme personnalisé
Tous les écouteurs d'événement reçoivent un paramètre d'objet événement avec des informations sur l'événement qui
a été déclenché. Dans bien des cas, l'objet événement est une occurrence de la classe Event. Dans d'autres cas
néanmoins, il s'avère utile de fournir des informations complémentaires aux écouteurs d'événement. Comme décrit
plus haut dans ce chapitre, il suffit pour cela de définir une nouvelle classe, sous-classe de la classe Event, et d'utiliser
une occurrence de cette classe comme objet événement. Dans cet exemple, une occurrence de AlarmEvent est utilisée
comme objet événement lorsque l'événement alarm de la classe AlarmClock est distribué. La classe AlarmEvent,
présentée ici, fournit des informations complémentaires sur l'événement alarm, à savoir le message d'alarme :
PROGRAMMATION AVEC ACTIONSCRIPT 3.0 POUR FLASH 275
Gestion des événements
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;
}
...
}
Le meilleur moyen de créer une classe d'objet événement personnalisée est de définir une classe qui étend la classEvent,
comme illustré dans l'exemple précédent. Pour compléter la fonctionnalité héritée, la classe AlarmEvent définit une
propriété message qui contient le texte du message d'alarme associé à l'événement. La valeur message est transmise
sous forme de paramètre au constructeur AlarmEvent. La classe AlarmEvent définit également la constante ALARM qui
peut servir à référencer l'événement (alarm) lors de l'appel de la méthode addEventListener() de la classe
AlarmClock.
Outre l'ajout de fonctionnalité, chaque sous-classe Event doit redéfinir la méthode clone() héritée dans le cadre de la
gestion des événements ActionScript. Les sous-classes Event peuvent éventuellement redéfinir la méthode
toString() afin d'inclure les propriétés de l'événement personnalisé dans la valeur renvoyée par l'appel de la méthode
toString().
PROGRAMMATION AVEC ACTIONSCRIPT 3.0 POUR FLASH 276
Gestion des événements
/**
* 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");
}
La méthode clone() redéfinie doit renvoyer une nouvelle occurrence de la sous-classe Event personnalisée, avec
toutes les propriétés personnalisées définies pour correspondre à l'occurrence actuelle. Dans la méthode toString()
redéfinie, la méthode d'utilitaire formatToString() (héritée de Event) sert à fournir une chaîne comportant le nom
du type personnalisé, ainsi que les noms et valeurs de toutes ses propriétés.
277
Chapitre 13 : Programmation de
l'affichage
Dans Adobe® ActionScript® 3.0, la programmation de l'affichage vous permet de manipuler des éléments qui s'affichent
sur la scène d'Adobe® Flash® Player ou Adobe® AIR™. Ce chapitre décrit les concepts fondamentaux de l'utilisation des
éléments affichés à l'écran. Il décrit l'organisation par programmation des éléments visuels, ainsi que la création de
classes d'objets d'affichage personnalisées.
Concepts fondamentaux de la programmation de
l'affichage
Introduction à la programmation de l'affichage
Chaque application créée par le biais d'ActionScript 3.0 possède une hiérarchie d'objets d'affichage appelée liste
d'affichage, comme l'indique l'illustration ci-dessous. La liste d'affichage contient tous les éléments visibles de
l'application.
PROGRAMMATION AVEC ACTIONSCRIPT 3.0 POUR FLASH 278
Programmation de l'affichage
Comme le montre cette illustration, les éléments d'affichage se rangent dans un ou plusieurs groupes suivants :
• Scène
La scène constitue le conteneur de base des objets d'affichage. Chaque application comporte un objet Stage, qui
contient tous les objets d'affichage à l'écran. La scène correspond au conteneur de plus haut niveau et domine la
hiérarchie de la liste d'affichage :
Chaque fichier SWF est associé à une classe ActionScript, appelée classe principale du fichier SWF. Lorsqu'un fichier
SWF s'ouvre dans Flash Player ou Adobe AIR, Flash Player ou AIR appelle la fonction constructeur correspondant
à la classe et l'occurrence créée (systématiquement un type d'objet d'affichage) est ajoutée en tant qu'enfant de l'objet
Stage. La classe principale d'un fichier SWF étend systématiquement la classe Sprite (pour plus d'informations,
consultez la section « Avantages de l'utilisation de la liste d'affichage » à la page 282).
Vous pouvez accéder à la scène via la propriété stage de toute occurrence de DisplayObject. Pour plus
d'informations, consultez la section « Définition des propriétés de la scène » à la page 291.
• Objets d'affichage
Dans ActionScript 3.0, tous les éléments qui apparaissent à l'écran dans une application sont des types d'objets
d'affichage. Le package flash.display comprend une classe DisplayObject, qui correspond à une classe de base
étendue par diverses autres classes. Ces autres classes représentent divers types d'objets d'affichage, tels que les
formes vectorielles, les clips et les champs de texte, pour n'en citer que quelques-uns. Pour une présentation de ces
classes, consultez la section « Avantages de l'utilisation de la liste d'affichage » à la page 282.
• Conteneurs d'objets d'affichage
Les conteneurs d'objets d'affichage sont des types spéciaux d'objets d'affichage qui, outre leur propre représentation
visuelle, peuvent également comporter des objets enfant qui sont aussi des objets d'affichage.
La classe DisplayObjectContainer est une sous-classe de la classe DisplayObject. Un objet DisplayObjectContainer
peut contenir plusieurs objets d'affichage dans la liste d'enfants correspondante. Par exemple, l'illustration suivante
contient un type d'objet DisplayObjectContainer appelé Sprite qui comporte divers objets d'affichage :
A. Objet SimpleButton. Ce type d'objet d'affichage possède des états « up », « down » et « over ». B. Objet Bitmap. Dans ce cas de figure,
l'objet Bitmap a été chargé à partir d'un JPEG externe via un objet Loader. C. Objet Shape. Le « cadre d'image » contient un rectangle
arrondi dessiné dans ActionScript. Un filtre Ombre portée est appliqué à cet objet Shape. D. Objet TextField.
A
B
C D
PROGRAMMATION AVEC ACTIONSCRIPT 3.0 POUR FLASH 279
Programmation de l'affichage
Dans le contexte des objets d'affichage, les objets DisplayObjectContainer portent également le nom de conteneurs
d'objets d'affichage voire, tout simplement, de conteneurs. Comme indiqué précédemment, la scène est un
conteneur d'objets d'affichage.
Bien que tous les objets d'affichage visibles héritent leurs caractéristiques de la classe DisplayObject, le type de
chacun d'eux correspond à une sous-classe déterminée de la classe DisplayObject. Il existe, par exemple, une
fonction constructeur associée à la classe Shape ou à la classe Video, mais aucune fonction constructeur pour la
classe DisplayObject.
Tâches courantes de programmation de l'affichage
Puisque la majeure partie de la programmation ActionScript implique de créer et manipuler des éléments visuels, un
grand nombre de tâches se rapportent à la programmation de l'affichage. Ce chapitre décrit les tâches communes
relatives à tous les objets d'affichage, notamment :
• Utilisation de la liste d'affichage et des conteneurs d'objets d'affichage
• Ajout d'objets d'affichage à la liste d'affichage
• Suppression d'objets de la liste d'affichage
• Transfert d'objets entre les conteneurs d'objets d'affichage
• Déplacement d'objets devant ou derrière d'autres objets
• Utilisation de la scène
• Définition de la cadence
• Contrôle de la mise à l'échelle de la scène
• Utilisation du mode plein écran
• Manipulation des événements associés aux objets d'affichage
• Positionnement des objets d'affichage, notamment la création d'une interaction glisser-déposer
• Redimensionnement, mise à l'échelle et rotation d'un objet d'affichage
• Application de modes de fondu, de transformations de couleur et de transparence aux objets d'affichage
• Masquage des objets d'affichage
• Animation des objets d'affichage
• Chargement d'un contenu d'affichage externe (tel que des fichiers SWF ou des images)
Dans la suite de ce manuel, divers chapitres décrivent d'autres tâches de manipulation des objets d'affichage. Ces
dernières concernent à la fois les tâches associées à tout objet d'affichage et les tâches réservées à des types déterminés
d'objets d'affichage :
• Dessin de graphiques vectoriels par le biais d'ActionScript sur des objets d'affichage, décrit dans « Utilisation de
l'API de dessin » à la page 328
• Application de transformations géométriques à des objets d'affichage, décrite dans « Utilisation de la géométrie » à
la page 350
• Application d'effets de filtre graphique tels que le flou, le rayonnement, l'ombre portée, etc. à des objets d'affichage,
décrite dans « Filtrage des objets d'affichage » à la page 363
• Utilisation de caractéristiques propres à MovieClip, décrite dans « Utilisation des clips » à la page 417
• Utilisation d'objets TextField, décrite dans « Utilisation de texte » à la page 443
• Utilisation des images bitmap, décrite dans « Utilisation des images bitmap » à la page 494
PROGRAMMATION AVEC ACTIONSCRIPT 3.0 POUR FLASH 280
Programmation de l'affichage
• Utilisation d'éléments vidéo, décrite dans « Utilisation de la vidéo » à la page 536
Concepts importants et terminologie
La liste de référence suivante énumère les termes importants que vous rencontrerez dans ce chapitre :
• Alpha : valeur colorimétrique représentant le montant de transparence (ou, plus précisément, le montant d'opacité)
d'une couleur. Ainsi, une couleur dotée d'une valeur de canal alpha de 60 % n'affiche que 60 % de son intensité
totale et est transparente à 40 %.
• Graphique bitmap : graphique défini en termes informatiques sous forme de grille (lignes et colonnes) de pixels de
couleur. Les exemples courants de graphiques bitmap incluent les photos numériques et images similaires.
• Mode de mélange : indique l'interaction requise du contenu de deux images qui se chevauchent. En règle générale,
une image opaque superposée à une autre image se contente de bloquer l'image placée sous elle, qui est donc
totalement invisible. Toutefois, divers modes de mélange entraînent le mélange des couleurs de diverses façons de
sorte que le résultat corresponde à une combinaison des deux images.
• Liste d'affichage : hiérarchie des objets d'affichage rendus sous forme de contenu visible à l'écran par Flash Player
et AIR. La scène correspond à la racine de la liste d'affichage et tous les objets d'affichage associés à la scène ou à l'un
de ses enfants composent la liste d'affichage (même si l'objet n'est pas à proprement parler rendu, parce qu'il réside
en dehors de la scène, par exemple).
• Objet d'affichage : objet représentant un type de contenu visuel dans Flash Player ou AIR. La liste d'affichage ne
contient que des objets d'affichage et toutes les classes d'objets d'affichage sont des sous-classes de la classe
DisplayObject.
• Conteneur d'objet d'affichage : type spécial d'objet d'affichage qui, outre (généralement) sa propre représentation
visuelle, peut comporter des objets d'affichage enfant.
• Classe principale du fichier SWF : classe qui définit le comportement de l'objet d'affichage de plus haut niveau d'un
fichier SWF, soit, fondamentalement, la classe associée au fichier SWF en tant que tel. Ainsi, un fichier SWF créé
dans l'outil de programmation Flash possède un « scénario principal » qui intègre tous les autres scénarios. La classe
principale du fichier SWF correspond à la classe dont le scénario principal est une occurrence.
• Masquage : technique consistant à ne pas afficher certaines parties d'une image (ou, à l'inverse, à n'afficher que
certaines parties d'une image). Les sections de l'image masque deviennent transparentes, afin d'assurer la visibilité
du contenu sous-jacent. Ce terme se réfère à la bande utilisée par un peintre en bâtiment pour empêcher la peinture
d'être appliquée à certaines sections.
• Scène : conteneur visuel correspondant à la base ou à l'arrière-plan de tout contenu visuel dans un fichier SWF.
• Transformation : modification des caractéristiques visuelles d'un graphique (rotation de l'objet, modification de
son échelle, désalignement, déformation ou altération de sa couleur).
• Graphique vectoriel : graphique défini en termes informatiques par des lignes et des formes dessinées en fonction
de caractéristiques déterminées (épaisseur, longueur, taille, angle et position, par exemple).
Utilisation des exemples fournis dans ce chapitre
Au fur et à mesure que vous avancez dans ce chapitre, vous pouvez tester ses exemples de code. Ce chapitre étant
consacré à la création et à la manipulation de contenu visuel, pratiquement tous les exemples de code qu'il contient
créent des objets visuels et les affichent à l'écran. A l'encontre des chapitres précédents, tester un exemple de code
implique de visualiser le résultat dans Flash Player ou AIR plutôt que d'afficher des valeurs de variable. Pour tester les
codes de ce chapitre :
1 Créez un document vide à l'aide de l'outil de programmation Flash.
PROGRAMMATION AVEC ACTIONSCRIPT 3.0 POUR FLASH 281
Programmation de l'affichage
2 Sélectionnez une image-clé dans le scénario.
3 Ouvrez le panneau Actions et copiez le code dans le panneau Script.
4 Exécutez le programme en sélectionnant Contrôle > Tester l'animation.
Le résultat du code s'affiche à l'écran et tout appel de la fonction trace() apparaît dans le panneau Sortie.
Ces techniques de test d'exemples de code sont décrites de manière plus détaillée dans « Test des exemples de code
contenus dans un chapitre » à la page 36.
Classes d'affichage de base
Le package flash.display ActionScript 3.0 contient des classes destinées aux objets visuels susceptibles d'apparaître
dans Flash Player ou AIR. L'illustration suivante identifie les relations entre les sous-classes de ces classes d'objets
d'affichage de base.
L'illustration indique ce dont héritent les classes d'objets d'affichage. Notez que certaines de ces classes, en particulier
StaticText, TextField et Video, ne figurent pas dans le package flash.display, mais héritent toutefois des caractéristiques
de la classe DisplayObject.
Toutes les classes qui étendent la classe DisplayObject héritent de ses méthodes et propriétés. Pour plus d'informations,
consultez la section « Propriétés et méthodes de la classe DisplayObject » à la page 285.
Vous pouvez créer une occurrence d'un objet des classes suivantes, qui figurent dans le package flash.display :
• Bitmap : la classe Bitmap permet de définir des objets bitmap, qu'ils soient chargés à partir de fichiers externes ou
rendus via ActionScript. Vous pouvez charger des bitmaps à partir de fichiers externes par le biais de la classe
Loader. Libre à vous de charger des fichiers GIF, JPG ou PNG. Vous pouvez également créer un objet BitmapData
à partir de données personnalisées, puis créer un objet Bitmap qui utilise ces données. Les méthodes de la classe
BitmapData permettent de modifier les bitmaps, qu'ils soient chargés ou créés dans ActionScript. Pour plus
d'informations, consultez la section « Chargement d'objets d'affichage » à la page 319 et le chapitre « Utilisation des
images bitmap » à la page 494.
• Loader : la classe Loader permet de charger des ressources externes (fichiers SWF ou graphiques). Pour plus
d'informations, consultez la section « Chargement dynamique du contenu d'affichage » à la page 319.
MorphShape
DisplayObject
AVM1Movie Shape StaticText Video
DisplayObjectContainer TextField
Bitmap InteractiveObject
SimpleButton
Loader Stage
MovieClip
Sprite
PROGRAMMATION AVEC ACTIONSCRIPT 3.0 POUR FLASH 282
Programmation de l'affichage
• Shape : la classe Shape permet de créer des graphiques vectoriels, tels que des rectangles, des lignes, des cercles, etc.
Pour plus d'informations, consultez le chapitre « Utilisation de l'API de dessin » à la page 328.
• SimpleButton : un objet SimpleButton est une représentation ActionScript d'un symbole de bouton créé dans l'outil
de programmation Flash. Une occurrence de SimpleButton est dotée de quatre états de bouton : « up », « down »,
« over » et « hit test » (zone qui réagit aux événements souris et clavier).
• Sprite : un objet Sprite peut contenir des graphiques qui lui sont propres, ainsi que des objets d'affichage enfant. (La
classe Sprite étend la classe DisplayObjectContainer.) Pour plus d'informations, consultez la section « Utilisation
de conteneurs d'objets d'affichage » à la page 286 et le chapitre « Utilisation de l'API de dessin » à la page 328.
• MovieClip : un objet MovieClip est la forme ActionScript d'un symbole de clip créé dans l'outil de programmation
Flash. En pratique, un objet MovieClip est similaire à un objet Sprite, à une exception près : il possède également
un scénario. Pour plus d'informations, consultez le chapitre « Utilisation des clips » à la page 417.
Les classes suivantes, qui ne figurent pas dans le package flash.display, sont des sous-classes de la classe DisplayObject :
• La classe TextField, qui figure dans le package flash.text, est un objet d'affichage destiné à l'affichage et à la saisie de
texte. Pour plus d'informations, consultez la section « Utilisation de texte » à la page 443.
• La classe Video, qui figure dans le package flash.media, correspond à l'objet d'affichage utilisé pour afficher des
fichiers vidéo. Pour plus d'informations, consultez le chapitre « Utilisation de la vidéo » à la page 536.
Les classes suivantes du package flash.display étendent la classe DisplayObject, mais il est impossible d'en créer une
occurrence. Parce qu'elles combinent des fonctionnalités communes en une classe unique, elles servent plutôt de
classes parent à d'autres objets d'affichage.
• AVM1Movie : la classe AVM1Movie permet de représenter des fichiers SWF chargés créés dans ActionScript 1.0
et 2.0.
• DisplayObjectContainer : les classes Loader, Stage, Sprite et MovieClip étendent chacune la classe
DisplayObjectContainer. Pour plus d'informations, consultez la section « Utilisation de conteneurs d'objets
d'affichage » à la page 286.
• InteractiveObject : classe de base de tous les objets utilisés pour interagir avec la souris et le clavier. Les objets
SimpleButton, TextField, Loader, Sprite, Stage et MovieClip sont tous des sous-classes de la classe
InteractiveObject. Pour plus d'informations sur la création d'interactions souris et clavier, consultez le chapitre
« Capture des données saisies par l'utilisateur » à la page 608.
• MorphShape : ces objets sont générés lors de la création d'une interpolation de forme dans l'outil de
programmation Flash. Il est impossible d'en créer des occurrences par le biais d'ActionScript, mais vous pouvez y
accéder dans la liste d'affichage.
• Scène : la classe Stage étend la classe DisplayObjectContainer. Il n'existe qu'une seule occurrence de scène par
application, et elle figure au sommet de la hiérarchie de la liste d'affichage. Vous pouvez accéder à la scène via la
propriété stage de toute occurrence de DisplayObject. Pour plus d'informations, consultez la section « Définition
des propriétés de la scène » à la page 291.
Par ailleurs, la classe StaticText, qui figure dans le package flash.text, étend la classe DisplayObject, mais il est
impossible d'en créer une occurrence dans du code. Les champs de texte statique sont créés dans Flash uniquement.
Avantages de l'utilisation de la liste d'affichage
Dans ActionScript 3.0, des classes distinctes sont réservées aux différents types d'objets d'affichage. Dans
ActionScript 1.0 et 2.0, un grand nombre de types d'objets identiques sont inclus dans une même classe : MovieClip.
PROGRAMMATION AVEC ACTIONSCRIPT 3.0 POUR FLASH 283
Programmation de l'affichage
Cette individualisation des classes et la structure hiérarchique des listes d'affichage présentent les avantages suivants :
• Rendu plus efficace et utilisation réduite de la mémoire
• Gestion optimisée de la profondeur
• Parcours entier de la liste d'affichage
• Objets d'affichage absents de la liste
• Classement simplifié en sous-classes des objets d'affichage
Rendu plus efficace et taille réduite des fichiers
Dans ActionScript 1.0 et 2.0, vous ne pouvez dessiner des formes que dans un objet MovieClip. ActionScript 3.0
intègre des classes d'objets d'affichage plus simples, dans lesquelles vous pouvez dessiner des formes. Parce que ces
classes d'objets d'affichage ActionScript 3.0 ne contiennent pas le jeu complet de méthodes et propriétés associées à un
objet MovieClip, elles mobilisent moins de ressources en mémoire et processeur.
Par exemple, à l'encontre d'un objet Shape, chaque objet MovieClip comporte des propriétés associées au scénario du
clip. Les propriétés de gestion du scénario font parfois appel à un volume considérable de ressources en mémoire et
processeur. Dans ActionScript 3.0, l'utilisation de l'objet Shape se traduit par une amélioration des performances.
L'objet Shape nécessite moins de ressources que l'objet MovieClip, plus complexe. Flash Player et AIR n'ont pas besoin
de gérer les propriétés MovieClip inutilisées, optimisant ainsi la vitesse et réduisant les besoins de mémoire de l'objet.
Gestion optimisée de la profondeur
Dans ActionScript 1.0 et 2.0, la profondeur était gérée par un système et des méthodes de gestion linéaire de la
profondeur, tels que getNextHighestDepth().
ActionScript 3.0 comprend la classe DisplayObjectContainer, dont les méthodes et propriétés sont mieux adaptées à
la gestion de la profondeur des objets d'affichage.
Dans ActionScript 3.0, lorsque vous déplacez un objet d'affichage au sein de la liste des enfants d'une occurrence de
DisplayObjectContainer, les autres enfants du conteneur d'objets d'affichage sont automatiquement repositionnés et
des positions d'index enfant appropriées leur sont affectées dans le conteneur d'objets d'affichage.
Par ailleurs, ActionScript 3.0 permet systématiquement de détecter tous les objets enfant de tout conteneur d'objets
d'affichage. Chaque occurrence de DisplayObjectContainer possède une propriété numChildren, qui indique le
nombre d'enfants figurant dans le conteneur d'objets d'affichage. Puisque la liste des enfants d'un conteneur d'objets
d'affichage correspond systématiquement à une liste indexée, vous pouvez examiner chaque objet de la liste de la
position d'index 0 à la dernière position d'index (numChildren - 1). Cette technique n'était pas proposée par les
méthodes et propriétés d'un objet MovieClip dans ActionScript 1.0 et 2.0.
ActionScript 3.0 permet de parcourir aisément et séquentiellement la liste d'affichage, car les numéros d'index de la
liste des enfants d'un conteneur d'objets d'affichage se suivent. Parcourir la liste d'affichage et gérer la profondeur des
objets est désormais beaucoup plus simple que dans ActionScript 1.0 et 2.0. Dans ActionScript 1.0 et 2.0, un clip
pouvait en effet contenir des objets dont l'ordre de profondeur n'était pas séquentiel, ce qui rendait parfois le parcours
de la liste d'objets difficile. Dans ActionScript 3.0, chaque liste d'enfants d'un conteneur d'objets d'affichage est mise en
cache en interne sous forme de tableau, ce qui permet des recherches extrêmement rapides (par index). Passer en
boucle sur tous les enfants d'un conteneur d'objets d'affichage s'avère également très rapide.
Dans ActionScript 3.0, vous pouvez également accéder aux enfants d'un conteneur d'objets d'affichage par le biais de
la méthode getChildByName() de la classe DisplayObjectContainer.
PROGRAMMATION AVEC ACTIONSCRIPT 3.0 POUR FLASH 284
Programmation de l'affichage
Parcours entier de la liste d'affichage
ActionScript 1.0 et 2.0 ne vous permettaient pas d'accéder à certains objets, telles les formes vectorielles, dessinées dans
l'outil de programmation Flash. Dans ActionScript 3.0, vous pouvez accéder à tous les objets de la liste d'affichage,
qu'ils aient été créés en ActionScript ou dans l'outil de programmation Flash. Pour plus d'informations, consultez la
section « Parcours de la liste d'affichage » à la page 290.
Objets d'affichage absents de la liste
ActionScript 3.0 permet de créer des objets d'affichage qui ne figurent pas dans la liste d'affichage visible. Ils portent le
nom d'objets d'affichage hors liste. Un objet d'affichage n'est ajouté à la liste d'affichage visible que lorsque vous appelez
la méthode addChild() ou addChildAt() d'une occurrence de DisplayObjectContainer qui a déjà été intégrée à la
liste d'affichage.
Les objets d'affichage hors liste permettent d'assembler des objets d'affichage complexes, tels que ceux qui possèdent
plusieurs conteneurs d'objets d'affichage comportant plusieurs objets d'affichage. En n'intégrant pas à la liste des objets
d'affichage, vous pouvez assembler des objets complexes sans avoir à effectuer leur rendu. Vous économisez ainsi le
temps de traitement correspondant. Vous pouvez alors ajouter un objet hors liste à la liste d'affichage au moment
voulu. Il est également possible d'intégrer un enfant d'un conteneur d'objets d'affichage à la liste d'affichage, puis de
l'en extraire ou d'en modifier la position dans cette dernière, le cas échéant.
Classement simplifié en sous-classes des objets d'affichage
Dans ActionScript 1.0 et 2.0, il était souvent nécessaire d'ajouter de nouveaux objets MovieClip à un fichier SWF pour
créer des formes de base ou afficher des bitmaps. Dans ActionScript 3.0, la classe DisplayObject comprend un grand
nombre de sous-classes intégrées, telles que Shape et Bitmap. Parce que les classes d'ActionScript 3.0 sont plus
spécialisées pour des types spécifiques d'objets, il est plus simple de créer des sous-classes de base des classes intégrées.
Par exemple, pour dessiner un cercle dans ActionScript 2.0, vous pourriez créer une classe CustomCircle qui étend la
classe MovieClip lors de la création d'une occurrence d'un objet de la classe personnalisée. Néanmoins, cette classe
comprendrait également diverses propriétés et méthodes émanant de la classe MovieClip (telles que totalFrames) qui
ne s'appliquent pas à elle. Dans ActionScript 3.0, vous pouvez toutefois créer une classe CustomCircle qui étend l'objet
Shape et, de ce fait, ne comprend pas les propriétés et méthodes sans rapport contenues dans la classe MovieClip. Le
code suivant illustre un exemple de classe CustomCircle :
PROGRAMMATION AVEC ACTIONSCRIPT 3.0 POUR FLASH 285
Programmation de l'affichage
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);
}
}
Utilisation des objets d'affichage
Maintenant que vous maîtrisez les bases de la scène, des objets d'affichage, des conteneurs d'objets d'affichage et de la
liste d'affichage, cette section contient des informations plus détaillées relatives à l'utilisation des objets d'affichage
dans ActionScript 3.0.
Propriétés et méthodes de la classe DisplayObject
Tous les objets d'affichage sont des sous-classes de la classe DisplayObject et, de ce fait, héritent des propriétés et
méthodes de cette dernière. Les propriétés dont ils héritent correspondent aux propriétés de base qui s'appliquent à
tous les objets d'affichage. Par exemple, chaque objet d'affichage possède une propriété x et une propriété y qui
indiquent sa position dans son conteneur d'objets d'affichage.
Il est impossible de créer une occurrence de DisplayObject à l'aide du constructeur de la classe DisplayObject. Vous
devez créer un autre type d'objet (un objet qui est une sous-classe de la classe DisplayObject), tel Sprite, pour créer une
occurrence d'objet par le biais de l'opérateur new. Par ailleurs, pour créer une classe d'objet d'affichage personnalisée,
vous devez créer une sous-classe de l'une des sous-classes d'objets d'affichage ayant une fonction constructeur
utilisable (telle que la classe Shape ou la classe Sprite). Pour plus d'informations, consultez la description de la classe
DisplayObject dans le Guide de référence du langage et des composants ActionScript 3.0.
Ajout d'objets d'affichage à la liste d'affichage
Lorsque vous créez une occurrence d'un objet d'affichage, elle n'apparaît pas à l'écran (sur la scène) tant que vous ne
l'avez pas ajoutée à un conteneur d'objets d'affichage figurant dans la liste d'affichage. Par exemple, dans le code
suivant, l'objet myText TextField n'est pas visible si vous omettez la dernière ligne de code. Dans la dernière ligne de
code, le mot-clé this doit se référer à un conteneur d'objets d'affichage figurant déjà dans la liste d'affichage.
PROGRAMMATION AVEC ACTIONSCRIPT 3.0 POUR FLASH 286
Programmation de l'affichage
import flash.display.*;
import flash.text.TextField;
var myText:TextField = new TextField();
myText.text = "Buenos dias.";
this.addChild(myText);
Lorsque vous ajoutez un élément visuel à la scène, il devient un enfant de cette dernière. Le premier fichier SWF chargé
dans une application (tel celui intégré à une page HTML) est automatiquement ajouté en tant qu'enfant de la scène. Il
peut s'agir de n'importe quel type d'objet qui étend la classe Sprite.
Tout objet d'affichage créé sans utiliser ActionScript (par exemple en ajoutant une balise MXML dans Adobe Flex
Builder 3 ou en plaçant un élément sur la scène dans Flash) est ajouté à la liste d'affichage. Bien que vous n'ajoutiez pas
ces objets d'affichage par le biais d'ActionScript, vous pouvez y accéder via ActionScript. Par exemple, le code suivant
règle la largeur d'un objet appelé button1, qui a été ajouté dans l'outil de programmation (et non via ActionScript) :
button1.width = 200;
Utilisation de conteneurs d'objets d'affichage
Si un objet DisplayObjectContainer est supprimé de la liste d'affichage ou s'il est transféré ou transformé d'une autre
façon, chaque objet d'affichage de DisplayObjectContainer est également supprimé, transféré ou transformé.
Un conteneur d'objets d'affichage correspond à un type d'objet d'affichage et peut être ajouté à un autre conteneur
d'objets d'affichage. Par exemple, l'image suivante illustre un conteneur d'objets d'affichage, pictureScreen, qui
comporte une forme de contour et quatre autres conteneurs d'objets d'affichage (de type PictureFrame) :
PROGRAMMATION AVEC ACTIONSCRIPT 3.0 POUR FLASH 287
Programmation de l'affichage
A. Forme définissant la bordure du conteneur d'objets d'affichage pictureScreen B. Quatre conteneurs d'objets d'affichage, qui sont des enfants
de l'objet pictureScreen
Pour qu'un objet d'affichage apparaisse dans la liste d'affichage, vous devez l'ajouter à un conteneur d'objets d'affichage
figurant dans la liste d'affichage. A cet effet, vous utilisez la méthode addChild() ou la méthode addChildAt() de
l'objet conteneur. Par exemple, sans la dernière ligne du code suivant, l'objet myTextField ne s'afficherait pas :
var myTextField:TextField = new TextField();
myTextField.text = "hello";
this.root.addChild(myTextField);
Dans cet exemple de code, this.root pointe vers le conteneur d'objets d'affichage MovieClip qui comporte le code.
Dans votre propre code, vous pouvez stipuler un autre conteneur.
A B
PROGRAMMATION AVEC ACTIONSCRIPT 3.0 POUR FLASH 288
Programmation de l'affichage
Utilisez la méthode addChildAt() pour ajouter l'enfant à une position déterminée de la liste des enfants du conteneur
d'objets d'affichage. Ces positions d'index basées sur zéro dans la liste des enfants se réfèrent à l'ordre d'apparition (de
l'avant à l'arrière) des objets d'affichage. Considérons par exemple les trois objets d'affichage suivants. Chaque objet a
été créé à partir d'une classe personnalisée appelée Ball.
L'ordre d'apparition de ces objets d'affichage dans leur conteneur peut être modifié par le biais de la méthode
addChildAt(). Considérons par exemple le code qui suit :
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);
Une fois ce code exécuté, les objets d'affichage sont placés comme suit dans l'objet DisplayObjectContainer
container. Notez l'ordre d'apparition des objets.
Pour placer un objet en tête de la liste d'affichage, il suffit de l'ajouter à nouveau à celle-ci. Par exemple, après le code
précédent, utilisez la ligne de code suivante pour placer ball_A en première position dans la pile :
container.addChild(ball_A);
Ce code supprime ball_A de son emplacement actuel dans la liste d'affichage de container, et l'ajoute ensuite au
sommet de la liste, ce qui a pour effet de le placer en haut de l'empilement d'objets.
PROGRAMMATION AVEC ACTIONSCRIPT 3.0 POUR FLASH 289
Programmation de l'affichage
Vous disposez de la méthode getChildAt() pour vérifier l'ordre d'apparition des objets d'affichage. La méthode
getChildAt() renvoie les objets enfant d'un conteneur en fonction du numéro d'index transmis. Par exemple, le code
suivant révèle le nom des objets d'affichage placés à des positions diverses dans la liste des enfants de l'objet
DisplayObjectContainer container :
trace(container.getChildAt(0).name); // ball_A
trace(container.getChildAt(1).name); // ball_C
trace(container.getChildAt(2).name); // ball_B
Si vous supprimez un objet d'affichage de la liste des enfants de son conteneur parent, les éléments de la liste ayant un
indice plus élevé descendent tous d'une position dans l'index des enfants. Ainsi, si nous reprenons l'exemple précédent,
le code ci-après illustre le transfert de l'objet d'affichage qui occupait la position 2 dans l'objet DisplayObjectContainer
container vers la position 1 suite à la suppression d'un objet d'affichage occupant une position inférieure dans la liste
d'enfants :
container.removeChild(ball_C);
trace(container.getChildAt(0).name); // ball_A
trace(container.getChildAt(1).name); // ball_B
Les méthodes removeChild() et removeChildAt() ne suppriment pas entièrement une occurrence d'objet
d'affichage. Elles se contentent de la supprimer de la liste des enfants du conteneur. Une autre variable peut continuer
à faire référence à l'occurrence. (Utilisez l'opérateur delete pour supprimer totalement un objet.)
Un objet d'affichage ne possédant qu'un seul conteneur parent, vous ne pouvez ajouter une occurrence d'objet
d'affichage qu'à un seul conteneur d'objets d'affichage. Par exemple, le code suivant indique que l'objet d'affichage tf1
ne peut figurer que dans un seul conteneur (soit, dans ce cas, un Sprite, qui étend la 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
Si vous ajoutez à un conteneur d'objets d'affichage un objet qui est déjà contenu dans un autre conteneur d'objets
d'affichage, l'objet sera supprimé de la liste des enfants de ce dernier.
Outre les méthodes décrites précédemment, la classe DisplayObjectContainer définit plusieurs méthodes d'utilisation
des objets d'affichage enfant, notamment :
• contains() : détermine si un objet d'affichage est un enfant d'un objet DisplayObjectContainer.
• getChildByName() : extrait un objet d'affichage en fonction de son nom.
• getChildIndex() : renvoie la position d'index d'un objet d'affichage.
• setChildIndex() : modifie la position d'un objet d'affichage enfant.
• swapChildren() : permute l'ordre de deux objets d'affichage.
PROGRAMMATION AVEC ACTIONSCRIPT 3.0 POUR FLASH 290
Programmation de l'affichage
• swapChildrenAt() : permute l'ordre de deux objets d'affichage définis en fonction de leur valeur d'index.
Pour plus d'informations, consultez les entrées appropriées du Guide de référence du langage et des composants
ActionScript 3.0.
N'oubliez pas qu'un objet d'affichage qui ne figure pas dans la liste d'affichage (donc, qui ne se trouve pas dans un
conteneur d'objets d'affichage enfant de la scène) est appelé objet d'affichage hors liste.
Parcours de la liste d'affichage
Comme nous l'avons vu, la liste d'affichage est une structure en arborescence. Au sommet de l'arborescence figure la
scène, qui peut comporter plusieurs objets d'affichage. Les objets d'affichage qui sont eux-mêmes des conteneurs
d'objets d'affichage peuvent contenir d'autres objets d'affichage, voire des conteneurs d'objets d'affichage.
La classe DisplayObjectContainer comporte des propriétés et méthodes de parcours de la liste d'affichage, par le biais
des listes d'enfants des conteneurs d'objets d'affichage. Considérons par exemple le code suivant, qui ajoute deux objets
d'affichage, title et pict, à l'objet container (qui est un Sprite, et la classe Sprite étend la 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);
PROGRAMMATION AVEC ACTIONSCRIPT 3.0 POUR FLASH 291
Programmation de l'affichage
La méthode getChildAt() renvoie l'enfant de la liste d'affichage à une position d'index déterminée :
trace(container.getChildAt(0) is TextField); // true
Vous pouvez également accéder aux objets enfant en indiquant leur nom. Chaque objet d'affichage possède un nom,
qui est attribué par défaut par Flash Player ou AIR (tel « instance1 ») si vous ne l'attribuez pas vous-même. Par
exemple, le code suivant indique comment utiliser la méthode getChildByName() pour accéder à un objet d'affichage
enfant portant le nom « banana loader » :
trace(container.getChildByName("banana loader") is Loader); // true
L'utilisation de la méthode getChildByName() entraîne parfois un ralentissement des performances par rapport à la
méthode getChildAt().
Puisque la liste d'affichage d'un conteneur d'objets d'affichage peut contenir d'autres conteneurs d'objets d'affichage en
tant qu'objets enfant, vous pouvez parcourir la liste d'affichage complète de l'application sous forme d'arborescence.
Par exemple, dans l'extrait de code illustré précédemment, une fois l'opération de chargement de l'objet Loader pict
terminée, un objet d'affichage enfant (l'image bitmap) de l'objet pict est chargé. Pour accéder à cet objet d'affichage
bitmap, vous pouvez écrire pict.getChildAt(0). Vous pouvez également écrire
container.getChildAt(0).getChildAt(0) (puisque container.getChildAt(0) == pict).
La fonction suivante génère un extrait trace() en retrait de la liste d'affichage d'un conteneur d'objets d'affichage :
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 + "")
}
}
}
Définition des propriétés de la scène
La classe Stage annule la plupart des propriétés et méthodes de la classe DisplayObject. Si vous appelez l'une de ces
propriétés ou méthodes annulées, Flash Player et AIR renvoient une exception. Par exemple, l'objet Stage ne possède
pas de propriété x ou y car, en tant que conteneur principal de l'application, sa position est fixe. Or, les propriétés x et
y indiquent la position d'un objet d'affichage par rapport à son conteneur, et puisque la scène ne se trouve pas dans un
autre conteneur d'objets d'affichage, ces propriétés seraient inapplicables.
Remarque : certaines propriétés et méthodes de la classe Stage sont réservées aux objets d'affichage appartenant au même
sandbox de sécurité que le premier fichier SWF chargé. Pour plus d'informations, consultez la section « Sécurité de la
scène » à la page 732.
Contrôle de la cadence de lecture
La propriété framerate de la classe Stage permet de définir la cadence de tous les fichiers SWF chargés dans
l'application. Pour plus d'informations, consultez le Guide de référence du langage et des composants ActionScript 3.0.
PROGRAMMATION AVEC ACTIONSCRIPT 3.0 POUR FLASH 292
Programmation de l'affichage
Contrôle de la mise à l'échelle de la scène
Lorsque la portion de l'écran qui représente Flash Player ou AIR est redimensionnée, Flash Player ou AIR ajuste
automatiquement le contenu de la scène pour compenser. La propriété scaleMode de la classe Stage détermine
comment le contenu de la scène est ajusté. Cette propriété peut être réglée sur quatre valeurs différentes, définies en
tant que constantes dans la classe flash.display.StageScaleMode.
Pour trois des valeurs scaleMode (StageScaleMode.EXACT_FIT, StageScaleMode.SHOW_ALL et
StageScaleMode.NO_BORDER), Flash Player et AIR mettent à l'échelle le contenu de la scène en fonction de ses
limites. Les trois options déterminent différemment l'exécution de la mise à l'échelle :
• StageScaleMode.EXACT_FIT applique une mise à l'échelle proportionnelle du fichier SWF.
• StageScaleMode.SHOW_ALL détermine si une bordure apparaît, telles les barres noires qui s'affichent lorsque vous
regardez un film grand écran sur une télévision standard.
• StageScaleMode.NO_BORDER détermines'il est possible de réduire partiellement le contenu.
Si scaleMode est défini sur StageScaleMode.NO_SCALE, le contenu de la scène conserve sa taille stipulée lorsque
l'utilisateur redimensionne la fenêtre Flash Player ou AIR. Dans ce mode de mise à l'échelle uniquement, les propriétés
stageWidth et stageHeight de la classe Stage permettent de déterminer les dimensions réelles de la fenêtre
redimensionnée, en pixels. (Dans les autres modes, les propriétés stageWidth et stageHeight renvoient toujours la
largeur et la hauteur originales du fichier SWF.) De plus, lorsque la propriété scaleMode est définie sur
StageScaleMode.NO_SCALE et que le fichier SWF est redimensionné, l'événement resize de la classe Stage est
distribué, ce qui vous permet d'effectuer des ajustements en conséquence.
Définir scaleMode sur StageScaleMode.NO_SCALE permet donc de mieux contrôler l'ajustement du contenu en cas
de redimensionnement de la fenêtre. Par exemple, si un fichier SWF contient une vidéo et une barre de contrôle, il peut
s'avérer utile de conserver la taille de la barre de contrôle en cas de redimensionnement de la scène et de ne modifier
que la taille de la fenêtre de vidéo en fonction du changement de taille de la scène. Ce cas de figure est illustré dans
l'exemple suivant :
PROGRAMMATION AVEC ACTIONSCRIPT 3.0 POUR FLASH 293
Programmation de l'affichage
// 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.
import flash.display.Stage;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
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);
Utilisation du mode plein écran
Le mode plein écran permet de définir la scène d'un film de sorte à remplir totalement le moniteur sans bordure ou
menu. La propriété displayState de la classe Stage permet d'activer ou désactiver ce mode pour un fichier SWF. La
propriété displayState peut être réglée sur l'une des valeurs définies par les constantes de la classe
flash.display.StageDisplayState. Pour activer le mode plein écran, définissez la propriété displayState sur
StageDisplayState.FULL_SCREEN :
stage.displayState = StageDisplayState.FULL_SCREEN;
Dans Flash Player, le mode plein écran ne peut être activé que via ActionScript en réponse à un clic de souris (clic de
bouton droit inclus) ou une frappe de touche. Le contenu AIR qui s'exécute dans le sandbox de sécurité de l'application
ne nécessite pas que le mode plein écran soit activé en réponse à une action de l'utilisateur.
Pour quitter le mode plein écran, définissez la propriété displayState sur StageDisplayState.NORMAL.
stage.displayState = StageDisplayState.NORMAL;
Un utilisateur peut également désactiver le mode plein écran en plaçant le focus sur une autre fenêtre ou en utilisant
l'une des combinaisons de touches suivantes : la touche Echap (toutes les plates-formes), Contrôle-W (Windows),
Commande-W (Mac) ou Alt-F4 (Windows).
PROGRAMMATION AVEC ACTIONSCRIPT 3.0 POUR FLASH 294
Programmation de l'affichage
Activation du mode plein écran dans Flash Player
Pour activer le mode plein écran d'un fichier SWF intégré à une page HTML, le code HTML requis pour intégrer Flash
Player doit comprendre une balise param et un attribut embed, associés au nom allowFullScreen et à la valeur true,
comme suit :
Dans l'outil de programmation Flash, choisissez Fichier -> Paramètres de publication, puis dans la boîte de dialogue
Paramètres de publication, cliquez sur l'onglet HTML et sélectionnez le modèle Flash seulement - Autorisation du
Plein écran.
Dans Flex, assurez-vous que le modèle HTML inclut les balises