ADOBE ACTIONSCRIPT 3.0 - Langage de programmation

ACTIONSCRIPT 3.0 - Langage de programmation ADOBE - Notice d'utilisation et mode d'emploi gratuit

Retrouvez gratuitement la notice de l'appareil ACTIONSCRIPT 3.0 ADOBE au format PDF.

📄 1205 pages Français FR Télécharger 💬 Question IA 10 questions ⚙️ Specs
Notice ADOBE ACTIONSCRIPT 3.0 - page 1
Choisissez votre langue et indiquez votre email : nous vous enverrons une version traduite specifiquement.
Type de produit Langage de programmation
Version 3.0
Plateformes compatibles Web, mobile, bureau
Fonctionnalités principales Création d'applications interactives, animations, jeux en ligne, multimédia
Environnement de développement Adobe Flash Builder, Adobe Animate
Langage de programmation orienté Objet
Support de la communauté Forums, documentation officielle, tutoriels en ligne
Maintenance et mises à jour Suivi des mises à jour par Adobe, support pour les versions antérieures
Sécurité Gestion des permissions, sandboxing, mises à jour de sécurité régulières
Documentation Documentation officielle disponible sur le site d'Adobe
Exigences système Compatible avec les principaux systèmes d'exploitation et navigateurs modernes

FOIRE AUX QUESTIONS - ACTIONSCRIPT 3.0 ADOBE

Qu'est-ce qu'Adobe ActionScript 3.0?
Adobe ActionScript 3.0 est un langage de programmation orienté objet utilisé principalement pour le développement d'applications et de jeux sur la plateforme Adobe Flash.
Comment installer Adobe ActionScript 3.0?
Adobe ActionScript 3.0 est intégré dans Adobe Flash Professional et Adobe Flash Builder. Assurez-vous d'avoir installé l'un de ces programmes pour utiliser ActionScript 3.0.
Comment résoudre une erreur de compilation?
Vérifiez votre code pour des erreurs de syntaxe, des références à des classes inexistantes ou des bibliothèques manquantes. Consultez la fenêtre des erreurs pour plus de détails.
Pourquoi mon animation ne fonctionne-t-elle pas?
Assurez-vous que votre timeline est correctement configurée et que toutes les instances de vos symboles sont bien nommées. Vérifiez également que votre code ActionScript est attaché au bon calque.
Comment puis-je optimiser mes fichiers ActionScript?
Utilisez des classes pour organiser votre code, évitez les variables globales autant que possible, et supprimez le code inutilisé pour réduire la taille de votre fichier.
Comment gérer les événements dans ActionScript 3.0?
Utilisez la méthode 'addEventListener' pour écouter les événements et la méthode 'removeEventListener' pour les supprimer. Assurez-vous de spécifier le bon type d'événement et le bon gestionnaire.
Comment déboguer mon code ActionScript?
Utilisez le débogueur intégré d'Adobe Flash ou Flash Builder. Vous pouvez également utiliser des instructions 'trace()' pour afficher des messages dans la console.
Où puis-je trouver des ressources pour apprendre ActionScript 3.0?
Consultez la documentation officielle d'Adobe, des tutoriels en ligne, et des forums comme Stack Overflow pour des conseils et des exemples.
Comment publier une application ActionScript?
Dans Adobe Flash Professional ou Flash Builder, choisissez 'Fichier' > 'Publier' pour générer un fichier SWF que vous pouvez déployer sur le web ou intégrer dans d'autres applications.
Comment gérer les problèmes de compatibilité avec les navigateurs?
Assurez-vous que vous utilisez la dernière version d'Adobe Flash Player et que votre code est compatible avec les dernières normes de sécurité des navigateurs.

Questions des utilisateurs sur ACTIONSCRIPT 3.0 ADOBE

0 question sur cet appareil. Repondez a celles que vous connaissez ou posez la votre.

Poser une nouvelle question sur cet appareil

L'email reste privé : il sert seulement à vous prévenir si quelqu'un répond à votre question.

Aucune question pour l'instant. Soyez le premier à en poser une.

Téléchargez la notice de votre Langage de programmation au format PDF gratuitement ! Retrouvez votre notice ACTIONSCRIPT 3.0 - ADOBE et reprennez votre appareil électronique en main. Sur cette page sont publiés tous les documents nécessaires à l'utilisation de votre appareil ACTIONSCRIPT 3.0 de la marque ADOBE.

MODE D'EMPLOI ACTIONSCRIPT 3.0 ADOBE

Guide du développement d'ACTIONSCRIPT 3.0

Informations juridiques

Vous trouvez des informations juridiques à l'adresse http://help.adobe.com/fr_FR/legal notices/index.html.

Sommaire

Chapitre 1: Utilisation des dates et des heures

Gestion des dates calendaires et des heures 1

Contrôle des intervalles temporels 4

Exemple de date et heures : horloge analogue simple 6

Chapitre 2 : Utilisation des chaînes

Principes de base des chaînes 10

Creation de chaînes 11

Propriété length 12

Utilisation de caractères dans des chaînes 12

Comparaison de chaînes 13

Récupération des représentations de chaîne d'autres objets 14

Concaténation de chaînes 14

Recherche de sous-chaines et de modèles dans des chaînes 15

Conversion de la casse dans des chaînes 19

Example de chaine : ASCII Art 20

Chapitre 3 : Utilisation de tableaux

Principes de base des tableaux 25

Tableaux indexés 27

Tableaux associatifs 38

Tableaux multidimensionnels 41

Clonage de tableaux 43

Extension de la classe Array 44

Exemple de tableau : PlayList 49

Chapitre 4: Gestion des erreurs

Principes de base de la gestion des erreurs 53

Types d'erreurs 55

Gestion des erreurs dans ActionScript 3.0 57

Utilisation des versions de débogage des moteurs d'exécution Flash 58

Gestion des erreurs synchrones dans une application 59

Creation de classes d'erreur personalisées 64

Réponse à des événements et à l'état d'erreur 65

Comparaison des classes Error 68

Example de gestion des erreurs : application CustomErrors 72

Chapitre 5: Utilisation d'expressions régulières

Principes de base des expressions régulières 78

Syntaxe d'expression régulière 79

Méthodes d'utilisation d'expressions régulières avec des chaînes 93

Example d'expression régulière : analyseur Wiki 94

Chapitre 6: Utilisation de XML

Principes de base de XML 99

Approche E4X concernant le traitement XML 102

Objects XML 103

Objects XMLList 106

Initialisation de variables XML 107

Assemblage et transformation d'objects XML 108

Parcours de structures XML 110

Utilisation des espaces de noms XML 114

Conversion de type XML 115

Lecture de documents XML externes 117

Utilisation de XML dans un exemple ActionScript : chargement de données RSS depuis Internet 118

Chapitre 7 : Utilisation de la fonctionnalité JSON native

Présentation de l'API JSON 121

Définition du comportement JSON personnelisé 122

Chapitre 8: Gestion des événements

Principes de base de la gestion des événements 129

Variation de la gestion d'événements dans ActionScript 3.0 par rapport aux versions antérieures 131

Flux d'evénements 133

135

Ecouteurs d'evénement 139

Example de gestion des événements : Alarm Clock 145

Chapitre 9: Utilisation de domaines d'application

Chapitre 10:Programmation del'affichage

Concepts fondamentaux de la programmation de l'affiche 157

Classes d'affichage de base 160

Avantages de l'utilisation de la liste d'affichage 162

Utilisation des objets d'affichage 164

Manipulation des objets d'affichage 180

Animation des objets 200

Orientation de la scène 202

Chargement dynamique du contenu d'affichage 205

Example d'objet d'affichage : SpriteArranger 211

Chapitre 11: Utilisation de la géométrie

Principes de base de la géométrie 218

Utilisation des objets Point 219

Utilisation des objets Rectangle 221

Utilisation des objets Matrix 224

Example de géométrie : application d'une transformation de matrice à un objet d'affichage 226

Chapitre 12 : Utilisation de l'API de dessin

Principles de base de l'API de dessin 230

Classe Graphics 231

Dessin de lignes et de courbes 231

Dessin de formes à l'aide des méthodes intégrées 234

Création de lignes et de replissages en dégradé 235

Utilisation de la classe Math avec les méthodes de dessin 239

Animation avec l'API de dessin 240

Example d'utilisation de I'API de dessin: generateur algorithmique d'effets visuels 241

Utilisation avancée de l'API de dessin 243

Chapitre 13 : Utilisation des images bitmap

Principes de base de l'utilisation des images bitmap 251

Classes Bitmap et BitmapData 253

Manipulation des pixels 255

Copie de données bitmap 257

Compression des données d'une image bitmap 258

Creation de textures avec les fonctions de bruit aléatoire 259

Défillement du contenu d'images bitmap 261

Utilisation du mipmapping 262

Exemple d'objet Bitmap : lune en rotation animée 263

Décodage asynchrone des images bitmap 273

Chapitre 14 : Filtrage des objets d'affichage

Principes de base du filtrage des objets d'affichage 276

Creation et application de filtrés 277

Filtres d'affichage disponibles 284

Exemple de filtrage des objets d'affichage : Filter Workbench 302

Chapitre 15 : Utilisation des shaders de Pixel Bender

Principes de base des shaders de Pixel Bender 310

Chargement ou integration d'un Shader 312

Acces aux métadonnées du shader 314

Spcification des valeurs des entrées et des paramètres d'un Shader 315

Utilisation d'un Shader 320

Chapitre 16: Utilisation des clips

Principes de base des clips 333

Utilisation des objets MovieClip 334

Contrôle de la lecture d'un clip 334

Creation d'objects MovieClip à l'aide d'ActionScript 337

Chargement d'un fichier SWF externe 340

Exemple de clip: RuntimeAssetsExplorer 342

Chapitre 17: Utilisation des interpolations de mouvement

Principes de base des interpolations de mouvement 346

Copie de scripts d'interpolation de mouvement dans Flash 347

Incorporation de scripts d'interpolation de mouvement 348

Description de l'animation 349

Ajout de filtres 352

Association d'une interpolation de mouvement à ses objets d'affichage 353

Chapitre 18 : Utilisation de la cinématique inverse

Principes de base de la cinématique inverse 355

Aperçu de l'animation de squelettes IK 356

Obtention d'informations sur un squelette IK 358

Instanciation de I'objet IKMover et restriction du mouvement 358

Mouvement d'un squelette IK 359

Utilisation de ressorts 360

Utilisation d'evénements IK 360

Chapitre 19:Travail en trois dimensions (3D)

Principes de base des objets d'affichage 3D 362

Présentation des objets d'affichage 3D dans les moteurs d'exécution de Flash Player et d'AIR 363

Creation et déplacement d'objets d'affichage 3D 365

Projection d'objects 3D sur un affichage 2D 367

Example : Projection de perspective 369

Transformations 3D complexes 372

Creation d'effets 3D à l'aide de triangles 375

Chapitre 20: Principes de base de l'utilisation du texte

Chapitre 21 : Utilisation de la classeTextField

Affichage du texte 385

Sélection et manipulation de texte 389

Capture du texte saisi par l'utilisateur 391

Restriction de la saisie de texte 392

Mise en forme du texte 393

Fonctions avancées d'affichage de texte 397

Utilisation du texte statique 399

ExampleTextField : mise en forme du texte dans le style « article de journal » 401

Chapitre 22 : Utilisation de Flash Text Engine

Creation et affichage de texte 410

Gestion des événements dans FTE 415

Mise en forme du texte 418

Utilisation des polices 422

Contrôle du texte 425

Example d'utilisation de Flash Text Engine : mise en forme d'un article de journal 431

Chapitre 23 : Utilisation de Text Layout Framework

Présentation de Text Layout Framework 440

Utilisation de Text Layout Framework 441

Structuration du texte à l'aide de TLF 446

Formatage du texte à l'aide de TLF 450

Importation et exportation de texte à l'aide de TLF 451

Gestion des contenteurs de texte à l'aide de TLF 452

Activation de la selection, de la modification et de l'annulation de texte à l'aide de TLF 453

Gestion des événements à l'aide de TLF 453

Positionnement des images dans le texte 454

Chapitre 24 : Utilisation du son

Principes de base de l'utilisation du son 455

Présentation de l'architecture audio 456

Chargement de fichiers audio externes 458

Utilisation dessons intégrés 460

Utilisation de fichiers audio de lecture en continu 462

Utilisation de données audio générées de façon dynamique 463

Lecture de sons 465

Sécurité lors du chargement et de la lecture des sons 469

Contrôle du volume du son et de la balance 470

Utilisation des métadonnées audio 471

Acces aux données audio brutes 472

Capture de l'entrée de son 476

Exemple d'objet Sound: Podcast Player 482

Chapitre 25 : Utilisation de la videoo

Principes de base de la video 489

Présentation des formats video 490

Présentation de la classe Video 494

Chargement de fichiers video 494

Contrôle de la lecture de la video 495

Lecture de videos en mode plein écran 497

Lecture de fichiers video en flux continu 501

Présentation des points de repère 501

Ecriture de méthodes de rappel pour les métadonnées et les points de repère 502

Utilisation des points de repère et des métadonnées 508

Gestion de I'activité de I'objet NetStream 518

Rubriques avances relatives aux fichiers video 521

Exemple video : Video Jukebox 523

Présentation à accelération matérielle par le biais de la classe StageVideo 528

Chapitre 26 : Utilisation de caméras

Présentation de la classe Camera 537

Affichage du contenu de laamera 538

Conception d'une application gérant uneamera locale 538

Etablissement d'une connexion avec laamera de l'utilisateur 539

Vérification de la présence de cameras 539

Detection de l'autorisation d'acceder à laamera 540

Optimisation de la qualite des videos de laamera 542

Gestion de I'etat de laamera 543

Chapitre 27 : Utilisation de la gestion des droits d'auteur numériques (DRM)

Présentation du flux de travail associé au contenu protégé 546

Membres et événements DRM de la classe NetStream 553

Utilisation de la classe DRMStatusEvent 554

Utilisation de la classe DRMAutenticatedEvent 556

Utilisation de la classe DRMErrorEvent 559

Utilisation de la classe DRMManager 560

Utilisation de la classe DRMContentData 561

Mise à jour de Flash Player en vue de prendre en charge Adobe Access 562

Licences hors bande 563

Prise en charge de domaine 565

Lecture de contenu chiffre à l'aide de la prise en charge de Domaine 565

Aperçu de la licence 566

Diffusion de contenu 566

Chapitre 28 : Ajout d'un contenu PDF dans AIR

Detection des capacités PDF 569

Chargement du contenu PDF 570

Programmation du contenu PDF 571

Limits connues pour du contenu PDF dans AIR 572

Chapitre 29: Principes de base de l'interaction utilisateur

Capture des entrées utiliser 574

Gestion de la cible d'action 575

Découverte des types de saisie 576

Chapitre 30 : Saisie au clavier

Capture de la saisie au clavier 578

Utilisation de la classe IME 580

Claviers virtues 585

Chapitre 31: Entrées de souris

Capture des entrées de souris 593

Example d'entrée de souris:WordSearch 596

Chapitre 32 : Saisie tactile, multipoint et par mouvement

Principes de base de la saisie tactile 601

Découverte de la prise en charge des actions tactiles 603

Gestion des événements tactiles 604

Toucher-glisser 608

Gestion des événements de mouvement 609

Résolution des problèmes 613

Chapitre 33:Opération de copier-coller

Principes de base de l'opération de copier-coller 616

Lecture en provenance et écriture à destination du Presse-papiers du système 617

Opération copier-coller HTML dans AIR 617

Formats de données Clipboard 619

Chapitre 34 : Saisie via un accéléromètre

Vérification de la prise en charge de l'accéléomètre 626

Detection des changements de I'accelerometre 627

Chapitre 35:Opération glisser-deposer dans AIR

Principes de base des opérations glisser-deposer dans AIR 629

Prise en charge du mouvement de glissement vers l'extérieur 631

Prise en charge du mouvement de glissement vers l'intérieur 634

Opération glisser-deposer dans HTML 637

Gisissement des données hors d'un élément HTML 641

Gisissement de données dans un élément HTML 641

Example : Annulation du comportement de glissement vers l'intérieur HTML par défaut 642

Gestion des depots de fichier dans un sandbox HTML hors application 644

Dépôt de fichiers promis 645

Chapitre 36 : Utilisation des menus

Principes de base des menus 654

Creation de menus natifs (AIR) 661

A propos des menus contextuels dans un contenu HTML (AIR) 663

Affichage de menus natifs en incrustation (AIR) 664

Gestion des événements de menu 664

Exemple de menu natif: menu de fenetre et d'application (AIR) 666

Chapitre 37: Icônes de la barre des tâches dans AIR

A propos des icones de la barre des tâches 670

Icônes du Dock 671

Icônes de la barre d'étéat système 672

Icônes et boutons de la barre des tâches de la fenêtre 674

Chapitre 38 : Utilisation du système de fichiers

Utilisation de la classe FileReference 676

Utilisation de l'interface de programmation du système de fichiers AIR 691

Chapitre 39: Stockage des données locales

Objects partages 728

Stockage local chiffre 737

Chapitre 40 : Utilisation des bases de données SQL locales dans AIR

A propos des bases de données SQL locales 741

Creation et modification d'une base de données 746

Manipulation des données de bases de données SQL 753

Utilisation des opérations de base de données synchrones et asynchrones 782

Utilisation du chiffrement avec les bases de données SQL 787

Strégties d'utilisation des bases de données SQL 805

Chapitre 41 : Utilisation de tableaux d'octets

Lecture et écriture d'un object ByteArray 808

Example ByteArray : lecture d'un fichier .zip 814

Chapitre 42 : Principes de base de la mise en réseau et de la communication

Interfaces reseau 822

Changements de connectivité réseau 823

Enregistements DNS (Domain Name System) 826

Chapitre 43:Sockets

Sockets TCP 828

Sockets UDP (AIR) 839

Adresses IPv6 841

Chapitre 44: Communications HTTP

Chargement de données externes 843

Requêtes de service Web 852

Ouverture d'une URL dans une autre application 860

Chapitre 45 : Communications avec d'autres occurrences de Flash Player et d'AIR

A propos de la classe LocalConnection 862

Envoi de messages entre deux applications 864

Connexion au contenu dans des domains différents et aux applications AIR 866

Chapitre 46 : Communication avec les processus natifs dans AIR

Présentation des communications avec les processus natifs 869

Lancement et fermetre d'un processus natif 870

Communications avec un processus natif 871

Considerations liées à la sécurité qui affectent les communications avec le processus natif 872

Chapitre 47 : Utilisation de l'API externe

Principes de base de l'utilisation de l'API externe 874

Avantages de l'API externe et conditions requises 877

Utilisation de la classe ExternalInterface 878

Example d'API externe : communications entre ActionScript et JavaScript dans un navigateur Web 882

Chapitre 48 : Validation des signatures XML dans AIR

Bases de la validation des signatures XML 888

A propos des signatures XML 893

Implémentation de l'interface IURIDereferencer 895

Chapitre 49: Environnement du système client

Principes de base de l'environnement du système client 903

Utilisation de la classe System 904

Utilisation de la classe Capabilities 905

Example d'utilisation de Capabilities : détention des capacités du système 906

Chapitre 50: Appel et fermetre d'une application AIR

Appel d'une application 910

Capture des arguments de ligne de commande 912

Appel d'une application AIR lors de la connexion d'un utilisateur 915

Appel d'une application AIR à partir du navigateur 916

Fermeture d'une application 918

Chapitre 51 : Utilisation des informations sur le moteur d'execution d'AIR et les systèmes d'exploitation

Gestion des associations de fichiers 920

Lecture de la version du moteur d'exécution et du correctif 921

Detection des capacités d'AIR 921

Suivi de la presence des utilisateurs 922

Chapitre 52 : Utilisation des fenêtres natives AIR

Principes de base des fenêtres natives dans AIR 923

Creation de fenêtres 931

Gestion des fenêtres 940

Ecoute des événements d'une fenêtre 951

Affichage des fenêtres en mode plein écran 952

Chapitre 53 : Ecrans dans AIR

Principes de base des écrans dans AIR 954

Dénombrement des écrans 955

Chapitre 54 : Impression

Principles de base de l'impression 958

Impression d'une page 959

Taches des moteurs d'exécution de Flash et impression système 960

Définition de la taille, de l'échelle et de l'orientation 963

Techniques d'impression avancées 965

Example d'impression : impression de plusieurs pages 967

Example d'impression: mise à l'échelle, recadrage et ajustement 969

Example d'impression: options d'impression et de mise en page 971

Chapitre 55 : Geolocation

Detection des changements de géolocalisation 974

Chapitre 56 : Internationalisation des applications

Principes de base de l'internationalisation des applications 978

Présentation du package flash.globalization 979

Identification des paramètres régionaux 981

Formatage des nombres 982

Formatage des valeurs en devise 985

Formatage des dates et heures 987

Tri et comparaison des chaînes 989

Conversion de la casse 990

Example: Internationalisation d'une application de suivi des stocks 991

Chapitre 57 : Localisation d'applications

Choix d'un jeu de paramétres régionaux 996

Localisation de contenu Flex 997

Localisation du contenu Flash 997

Localisation d'applications AIR 997

Localisation des dates, heures et devises 998

Chapitre 58: A propos de l'environnement HTML

Présentation de l'environnement HTML 1000

AIR et WebKit 1003

Chapitre 59 : Programmation HTML et JavaScript dans AIR

A propos de la classe HTMLLoader 1019

Contournement des erreurs JavaScript liées à la sécurité 1021

Accès aux classes de l'API AIR à partir de JavaScript 1026

A propos des URL dans AIR 1027

Mise des objets ActionScript à disposition de JavaScript 1028

Accès au DOM HTML et aux objets JavaScript à partir d'ActionScript 1030

Intégration d'un contenu SWF en HTML 1031

Utilisation des bibliothèques ActionScript au sein d'une page HTML 1034

Conversion des objets Date et RegExp 1036

Manipulation d'une feuille de style HTML à partir d'ActionScript 1036

Programmation croise du contenu dans des sandbox de sécurité distincts 1038

Chapitre 60: Programmation du conteneur HTML d'AIR à l'aide de scripts

Affichage des propriétés des objects HTMLLoader 1043

Défilament du contenu HTML 1046

Accès à l'histoire de HTML 1047

Paramétrage de l'agent d'utilisateur employé lors du chargement du contenu HTML 1048

Paramétrage du codage des caractères à utiliser pour le contenu HTML 1048

Paramétrage des interfaces utiliser de type navigateur pour un contenu HTML 1049

Creation de sous-classes de la classe HTMLLoader 1060

Chapitre 61 : Gestion des événements HTML dans AIR

Evénements HTMLLoader 1062

Gestion des événements DOM avec ActionScript 1063

Réponse aux exceptions JavaScript non interceptées 1063

Gestion des événements d'exécution avec JavaScript 1065

Chapitre 62 : Affichage de contenu HTML dans une application mobile

Objects StageWebView 1068

Contenu 1069

Evénements de navigation 1070

Historique 1071

Cible d'action 1072

Capture d'image bitmap 1074

Chapitre 63 : Utilisation de programmes de travail à des fins de simultanéité

Présentation des programmes de travail et de la simultanéité 1076

Creation et gestion de programmes de travail 1077

Communication entre programmes de travail 1080

Chapitre 64: Sécurité

Présentation de la sécurité sur la plate-forme Flash 1085

Sandbox de sécurité 1087

Contrôles des autorisations 1091

Restriction des API de réseau 1100

Sécurité du mode plein écran 1102

Sécurité du mode interactif plein écran 1103

Chargement de contenu 1104

Programmation croisee 1107

Acces aux medias charges comme s'il s'agissait de données 1111

Chargement des données 1113

Chargement de contenu incorpore a partir de fichiers SWF importes dans un domaine de sécurité 1117

Utilisation de contenus existants 1117

Définition des autorisations LocalConnection 1118

Contrôle de l'accès URL externe 1118

1120

Acces à laamera, au microphone, au Presse-papiers, à la souris et au clavier 1122

Sécurité AIR 1122

Chapitre 65 : Utilisation des exemple de code ActionScript

Types d'exemples 1145

Exécution d'exemples ActionScript 3.0 dans Flash Professional 1147

Exécution d'exemples ActionScript 3.0 dans Flash Builder 1148

Exécution d'exemples ActionScript 3.0 sur un périphérique mobile 1150

Chapitre 66: Prise en charge de SQL dans les bases de données locales

Syntaxe SQL prise en charge 1155

Prise en charge des types de données 1177

Chapitre 67 : ID, arguments et messages d'erreur SQL détaillés

Chapitre 68: AGAL (Adobe Graphics Assembly Language)

Pseudo-code binaire AGAL 1188

Chapitre 1 : Utilisation des dates et des heures

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Si la ponctualité ne fait pas tout, elle n'en est pas moins un facteur clé des applications logicielles. ActionScript 3.0 propose différentes méthodes de gestion des dates calendaires, des heures et des intervalles temporels. Deux classes principales assurent l'essential de la fonctionnalité temporelle : la classe Date et la nouvelle classe Timer du package flash.utilis.

Les dates et les heures constituent un type d'informations courant utilisé dans les programmes ActionScript. Par exemple, vous pouvez, entre autres, connaître la date du jour ou calculer combien de temps un utiliser passée sur un écran particulier. Dans ActionScript, vous pouvez utiliser la classe Date pour représenter un moment unique dans le temps, y compris des informations de date et d'heure. Une occurrence de Date contient des valeurs pour les unités de date et d'heure individuelles (année, mois, date, jour de la période, heures, minutes, secondes, millisecondes et fuseau horsaire, par exemple). Pour des utilisations plus avances, ActionScript comprend également la classe Timer que vous pouvez utiliser pour effectuer des actions après un certain délié ou à des intervalles répetés.

Voir aussi

Date

flash.utils.Timer

Gestion des dates calendaires et des heures

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Dans ActionScript 3.0, toutes les fonctions de gestion des dates calendaires et des heures se concentrent autour de la classe de niveau supérieur Date. Cette classe contient des méthodes et des propriétés qui vous permettent de manier les dates et les heures soit selon le modele universel coordonné (UTC, Universal Time Coordinated), soit selon le fuseau hora considéré. L'UTC est une définition normalisée du temps qui correspond essentiellement à l'heure du méridien de Greenwich (GMT, Greenwich Mean Time).

Création d'objets Date

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La classe Date compte l'une des méthodes constructeur les plus polyvalentes de toutes les classes de base. Vous pouvez l'invoquer de quatre manières différentes.

Primo, sieldom parametre n'est fourni, le constructeur Date () renvoie un objet Date contenant la date et l'heure locale actuelle de votre fuseau hora. Exemple :

var now:Date = new Date();

Secundo, si un paramètre numérique unique est fourni, le constructeur Date() le considère comme le nombre de milliseconds écoulées depuis le 1er janvier 1970 et renvoie l'objet Date correspondant. Notez que la valeur en milliseconds que vous transmettez est considérée comme le nombre de milliseconds depuis le 1er janvier 1970 en temps UTC. Toutefois, l'objet Date affiche des valeurs dans votre fuseau horsaire local, sauf si vous utilisez des méthodes UTC uniquement pour les extraire et les afficher. Si vous créez un nouvel objet Date à l'aide du paramètre en milliseconds, voirlez à tener compte du décalage horsaire entre votre fuseau local et le temps UTC. Les instructions ci-après créé un objet Date défini à minuit le 1er janvier 1970 en temps UTC:

var millisecondsPerDay:int = 1000 60 60 24 // gets a Date one day after the start date of 1/1/19 varstartTime:Date new Date(millisecondsPerDay);

Tertio, you pouvez transmettre plusieurs parametes numériques au constructeur Date(). Celui-ci les traite respectivement comme la date, le mois, le jour, les heures, les minutes, les secondes et les millisecondes, et renvoie un objet Date correspondant. Les parametes indiqués sont considérés comme correspondant à l'heure locale只不过 qu'au temps UTC. Les instructions suivantes établissant un objet Date défini à minuit le 1er janvier 2000, dans le fuseau horsaire local :

var millennium:Date = new Date(2000, 0, 1, 0, 0, 0, 0); 

Quarto, vous pouvez transmettre un parametre numérique unique au constructeur Date(). Celui-ci essaiera d'analyser cette chaine en composants de date et heures, et de renvoyer un objet Date correspondant. Si vous désisissez cette approche, il est recommendé d'inclure le constructeur Date() dans un bloc try...catch afin d'intercpter toute erreur d'analyse. Le constructeur Date() gère plusieurs formats de chaine (dont la liste figure dans le manuel Guide de referencia ActionScript 3.0 pour la plate-forme Adobe Flash). L'instruction suivante initiaise un nouvel objet Date à l'aide d'une valeur chaine:

Si le constructeur Date() ne peut analyser le paramètre chaîne, il ne déclenché pas d'exception. Cependant, l'objet Date résultat contiendaure une valeur date incorrecte.

Obtention des valeurs d'unités temporelles

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Voupue extraire les valeurs de plusieurs unites temporelles au sein de l'objet Date grace a des propriétés ou des méthodes de la classe Date. Chacune des propriétés suivantes fournit la valeur d'une unité temporelle de l'objet Date :

La propriété fullYear
- La propriété month au format numérique : de 0 pour janvier à 11 pour décembre
- La propriété date, qui correspond au numéro calendaire du jour du mois, de 1 à 31
- La propriété day, qui correspond au jour de la semaine au format numérique, 0 représentant dimanche
La propriété heures, de 0 à 23
La propriété minutes
La propriété seconds
- La propriété milliseconds

La classe Date offre en fait plusieurs manieres d'obtenir ces valeurs. Vous pouvez par exemple obtenir la valeur month de l'objet Date de quatre manieres :

La propriété month

La methodegetMonth()
La propriété monthUTC
La methodegetMonthUTC()

Ces quatre solutions sont d'une efficacité équivalente, vous pouvez donc adopter celle qui convient le mieux à votre application.

Les propriétés repertoriées ci-dessus représentent toutes des composants de la valeur date totale. Par exemple, la propriété millisecond ne sera jamais supérieure à 999, puisque si elle atteint 1000, la valeur seconds augmente de 1, la propriété millisecond se remet à zéro.

Si vous poulez obtenir la valeur de l'objet Date en milliseconds depuis le 1er janvier 1970 (UTC), vous pouvez utiliser la méthodegetTime(). La méthodeSETS(), quant à elle, vous permet de modifier la valeur d'un objet Date existant en milliseconds depuis le 1er janvier 1970 (UTC).

Opérations arithmetiques sur la date et l'heure

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La classe Date permet d'additionner et de soustraire des dates et heures. Les valeurs Date sont conservées en interne sous forme de millisecondes. Il est donc nécessaire de convertir les autres valeurs en milliseconds avant de les ajouter ou de les soustraire aux objets Date.

Si votre application doit effectuer de nombreuses opérations arithmetiques sur les dates et heures, il peut s'avérer utile de créé des constantes qui conservent les valeurs d'unités temporelles courantes en millisecondes, comme illustré ci-après:

public static const millisecondsPerMinute:int = 1000 *60;
public static const millisecondsPerHour:int = 1000 *60*60;
public static const millisecondsPerDay:int = 1000 *60*60*24;

Il devient alors simple d'effectuer des opérations arithmetiques à l'aide des unités temporelles standard. Le code ci-après décale la valeur date d'une heures par rapport à l'heure actuelle à l'aide des méthodes getTime() et setTime():

var oneHourFromNow:Date = new Date();  
oneHourFromNow.getTime(oneHourFromNow.getTime() + millisecondsPerHour); 

Une autre manière de définir une valeur date consiste à créé un objet Date à l'aide d'un seul paramètre en milliseconds. Par exemple, le code suivant ajoute 30 jours à une date pour en calculer une autre :

La constante millisecondPerDay est ensuite multipliee par 30 pour representer la perteode de 30 jours et le résultat est ajouté à la valeur invoiceDate afin de définir la valeur dueDate.

Conversion entre plusieurs fuseaux horaires

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Les opérations arithmetiques sur les dates et heures sont particulièrement pratiques lorsque vous doivent convertir des dates d'un fuseau horsaire à un autre. Tel est le role de la méthode getTimezoneOffset(), qui renvoie la valeur (en minutes) de décalage entre le fuseau horsaire de l'objet Date et le temps UTC. La valeur renvoyée s'exprime en minutes parce que tous les fuseaux horaires ne correspondent pas à une heures; certains sont décalés d'une demi-heure par rapport aux fuseaux voisins.

L'exemple suivant utilise le décalage de fuseau hora pour convertir une date à partir de l'heure locale en temps UTC. La conversion s'effectue tout d'abord par calcul de la valeur du fuseau hora en millisecond, puis par ajustement de la valeur Date selon ce montant :

// creates a Date in local time  
var nextDay: Date = new Date("Mon May 1 2006 11:30:00 AM"); 
// converts the Date to UTC by adding or subtracting the time zone offset  
var offsetMillisecond:Number = nextDay.getTimezoneOffset() * 60 * 1000;  
nextDay.setTime(nextDay.getTime() + offsetMillisecond); 

Contrôle des intervalles temporels

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Lorsque vous développpez des applications à l'aide d'Adobe Flash CS4 Professional, vous avez accès au scenario, qui fournit une progression constante, image par image, au sein de votre application. Toutefois, dans un projet purement ActionScript, vous devez compter sur d'autres mécanismes temporels.

Boucles ou minuteurs?

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Dans certains langages de programmation, vous devezmettre au point des motifs temporels à l'aide d'instructions en boucle telles que for ou do..while.

Les instructions en boucle s'excutent en général aussi vite que la machine locale le permet, ce qui signifie que l'application sera plus rapide sur certaines machines que sur d'autres. Si votre application doit bénéficier d'un intervalle temporel cohérent, vousdezess'associer à un calendrier ou une horloge réels.Bien des applications, telles que les yeux, les animations, les contrôleurs en temps réel, nécessitant des mécanismes de décompte temporel qui soient cohérents d'une machine à l'autre.

La classe Timer d'ActionScript 3.0 offre une solution performante dans ce domaine. Grace au modele d'evénements ActionScript 3.0, la classe Timer distribue des événements Timer des qu'un intervalle spécifique est atteint.

La classe Timer

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Pour la gestion des fonctions temporelles dans ActionScript 3.0, il est recommendé d'utiliser la classe Timer (flash.utils.Timer), qui permet de distribuer des événementsès qu'un intervalle est atteint.

Pour lancer un minuteur, vous doivent accorder une occurrence de la classe Timer et lui indiquer à chaque fréquence elle doit généraer un événement Timer et combien de fois elle doit le faire avant de s'arrêté.

Par exemple, le code suivant cree une occurrence de Timer qui distribue un événement toutes les secondes pendant 60 secondes :

var oneMinuteTimer:Timer = new Timer(1000, 60); 

L'objet Timer distribue un objet TimerEvent chaque fois que l'intervalle donné est atteint. Le type d'évenement de l'objet TimerEvent est timer (défini par la constante TimerEvent.TIMER). Un objet TimerEvent contient les mêmes propriétés que l'objet standard Event.

Si l'occurrence de Timer prévoit un nombre fixe d'intervalles, elle distribue également un événement timerComplete (défini par la constante TimerEvent.TIMER_COMPLETE) lorsqu'elle atteint l'intervalle final.

Voici un court exemple d'application illustrant la classe Timer en action :

package
{ import flash.display.Sprite; import flash.eventsTimerEvent; import flash.utils TARer; public class ShortTimer extends Sprite { public function ShortTimer() { // creates a new five-second Timer var minuteTimer:Timer = new Timer(1000,5); // designates listeners for the interval and completion events minuteTimer.addEventListener(TimerEvent.TIMER,onTick); minuteTimer.addEventListener(TimerEvent.TIMER_COMPLETE,onTimerComplete); // starts the timer ticking minuteTimer.start(); } public function onTick(event:TimerEvent):void { // displays the tick count so far // The target of this event is the Timer instance itself. trace("tick 串 + event.target.currentCount); } public function onTimerComplete(event:TimerEvent):void { trace("Time's Up!"); } }

Lorsque la classe ShortTimer est créé, elle génére une occurrence de Timer qui marque chaque seconde pendant cinq secondes. Elle ajoute alors deux écouteurs au minuteur : un qui écoute chaque décompte et un qui écoute l'évenement timerComplete.

Elle lance ensuite le décompte du minuteur et à partir de là, la méthode onTick() s'exécute toutes les secondes.

La méthode onTick() affiche simplement le nombre actuel de tics. Àpès cinq secondes, la méthode onTimerComplete() s'exécuté et vous avertit que le temps est écoulé.

Si vous exécutez cet exemple, vous devriez voir les lignes suivantes s'afficher dans votre console ou fenêtre de suivir raison d'une ligne par seconde :

Fonctions temporelles du package flash.utils

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

ActionScript 3.0 contient un certain nombre de fonctions temporelles similaires à celles qui étaient disponibles dans ActionScript 2.0. Ces fonctions sont fournies au niveau du package dans le package flash.utils et elles fonctionnent de la même manière que dans ActionScript 2.0.

FonctionDescription
clearInterval(id:uint):voidAnnule un appel de setInterval() spécifique.
clearTimeout(id:uint):voidAnnule un appel desetTimeout() spécifique.
getTimer():intRenvoie le nombre de milliseconds qui se sont écoulées depuis l'initialisation d'Adobe® Flash® Player ou d'Adobe® AIR™.
setInterval(closure:Function, delay:Number, ... arguments):uintExécute une fonction à fréquence définie (intervalle exprimé en milliseconds).
setTimeout(closure:Function, delay:Number, ... arguments):uintExécute une fonction spécifique après un-delai spécifique (en milliseconds).

Ces fonctions demeurent dans ActionScript 3.0 afin d'assurer la compatibilité avec les versions antérieures. Adobe ne recommend pas leur utilisation dans les nouvelles applications ActionScript 3.0. Il est en général plus simple et plus efficace d'utiliser la classe Timer.

Exemple de date et heures : horloge analogue simple

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Un exemple d'horloge analogique simple illustré ces deux concepts de date et heures :

  • Obtention de la date et de l'heure actuelle et extraction des valeurs heures, minutes et secondes
  • Utilisation d'une horloge pour fixer le rythme d'une application

Pour obtenir les fichiers d'application de cet exemple, voir

www.adobe.com/go/learn_programmingAS3samplesflash_fr. Les fichiers d'application SimpleClock se trouvent

Dans le dossier Samples/SimpleClock. L'application se compose des fichiers suivants :

FichierDescription
SimpleClockApp.mxml ou SimpleClockApp.flaFichier d'application principal dans Flash (FLA) ou Flex (MXML).
com/example/programmingas3/simpleclock/SimpleClock.asFichier d'application principal.
com/example/programmingas3/simpleclock/AnalogClockFace.asDessine un cadran d'horloge rond et les aiguilles des heures, des minutes et des secondes en fonction de l'heure.

Définition de la classe SimpleClock

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Si l'exemple d'horloge est simple, il est always judicious de bien organiser les applications de manière à faciliter leur extension future. Dans ce but, l'application SimpleClock utilise la classe SimpleClock pour gérer les tâches de démarrage et de mesure temporelle. Elle se sert ensuite d'une autre classe, AnalogClockFace, pour l'affichage réel de l'heure.

Voici le code qui définit et initiaïse la classe SimpleClock (vous remarquerez que dans la version Flash, SimpleClock étend la classe Sprite à la place):

Cette classe possède deux propriétés importantes :

  • La propriété face, qui correspond à une occurrence de la classe AnalogClockFace
  • La propriété ticker, qui est une occurrence de la classe Timer

La classe SimpleClock utilise un constructeur par défaut. La méthode initClock() se charge de la vérable configuration, en créé le cadran et en langant le décompte de l'occurrence de Timer.

Création du cadran

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Les lignes suivantes du code SimpleClock créé le cadran utilisé pour afficher l'heure :

/** Sets up a SimpleClock instance.
*/
public function initClock(faceSize:Number = 200 ) { // creates the clock face and adds it to the display list face = new AnalogClockFace(Math.max(20,faceSize)); face.init(); addChild(face); // draws the initial clock display face.draw();

La taille de l'horloge peut être transmise à la méthode initClock(). Si aucune valeur faceSize n'est transmise, la taille par défaut de 200 pixels est utilisé.

L'application initiaise ensuite l'horloge et l'ajoute à la liste d'affichage à l'aide de la méthode addChild() heritiée de la classe DisplayObjectContainer. Elle appelle enfin la méthode AnalogClockFace.draw() pour afficher une fois le cadran, qui indique l'heure actuelle.

Lancement du minuteur

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Une fais le cadran create, la méthode initClock() définit le minuteur :

Cette méthode commence par instancier une occurrence de Timer qui va distribuer un événement par seconde (toutes les 1000 milliseconds). Comme le constructeur Timer() ne recoit pas de second paramètre repeatCount, l'horloge se produit indéfiniment.

La méthode SimpleClock.onTick() s'exécute une fois par seconde après réception de l'évenement timer :

public function onTick(event:TimerEvent):void { // updates the clock display face.draw(); } 

La méthode AnalogClockFace.draw() dessine simplement le cadran de l'horloge et des aiguilles.

Affichage de l'heure actuelle

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La plupart du code de la classe AnalogClockFace implique la définition des éléments d'affichage du cadran. Lors de son initialisation, AnalogClockFace dessine un contour circulaire, place des libellés numériques pour chaque heures, puis cree trois objets Shape, un pour l'aiguille des heures, un pour celle des minutes et un pour l'aiguille des secondes de l'horloge.

Lorsque l'application SimpleClock s'exécute, elle appelle la méthode AnalogClockFace.draw() toutes les secondes, comme suit :

Cette méthode enregistre l'houre actuelle dans une variable, pour que l'hourne ne puisse changer pendant le dessin des aiguilles de l'horloge. Elle appelle ensuite la méthode showTime() pour afficher les aiguilles, comme illustré ci-après:

/** * Displays the given Date/Time in that good old analog clock style.
*/
public function showTime(time:Date):void
{ // gets the time values var seconds:uint = timeSeconds(); var minutes:uint = time.getMinutes(); var hours:uint = time.getHours(); // multiplies by 6 to get degrees this(secondHandrotation = 180+ (seconds * 6); this.minuteHandRotation = 180+ (minutes * 6); // Multiply by 30 to get basic degrees, then // add up to 29.5 degrees (59 * 0.5) // to account for the minutes. this hour Hand rotation = 180+ (hours * 30) + (minutes * 0.5);

Tout d'abord, cette méthode extrait les valeurs des heures, des minutes et des secondes pour l'heure actuelle. Elle utilise ensuite ces valeurs pour calculer l'angle de chaque aiguille. comme l'aiguille des secondes effectue une rotation complète en 60 secondes, elle tourne de 6 degrés par seconde (360/60). L'aiguille des minutes pivote selon le même angle chaque minute.

L'aiguille des heures se met à jour toutes les minutes également et doit donc progresser à chaque minute. Elle tourne de 30 degrès toutes les heures (360/12), mais pivote également d'un demi-degré toutes les minutes (30 degrés divisés par 60 minutes).

Chapitre 2 : Utilisation des chaînes

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La classe String contient des méthodes qui vous permettent de manipuler des chaînes de texte. Les chaînes s'utilisent avec de nombreux objets. Les méthodes décrites ci-après permettent de manipuler les chaînes utilisées dans des objets tels que TextField, StaticText, XML, ContextMenu et FileReference.

Les chaînes sont des séries de caractères. ActionScript 3.0 prend en charge les caractères ASCII et Unicode.

Voir aussi

String

RegExp

parseFloat()

parseInt()

Principes de base des chaînes

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Pour les programmes, une « chaine » est un texte, une suite de lettres, chiffres ou autres caractères qui se suivent et forment une unité représentée par une valeur. Par exemple, la ligne de code suivante cree une variable ayant le type de données String (chaine) et affecte une valeur de chaine litterale à cette variable :

Comme le montre cet exemple, ActionScript permet de délimiter une valeur chaîne en enfermant du texte entre des guillemets droits doubles ou simples. Voici d'autres examples de chaînes :

"Hello"

"555-7649"

"http://www.adobe.com/"

Lorsque vous manipulez un fragment de texte en ActionScript, vous utilisez une valeur chaine. La classe String d'ActionScript est le type de données qui permet de travailler avec du texte. Des occurrences de chaines sont frequently utilisées pour des propriétés, des paramètres de méthodes, etc., dans de nombreuses autres classes en ActionScript.

Concepts important et terminologie

La liste de référence suivante content des termes importants relatifs aux chaînes :

ASCII Système de codage permettant de représentier du texte sous forme de caractères et symboles dans les programmes informatiques. Le système ASCII gère les 26 lettres de l'alphabet latin, plus un nombre limite de caractères supplémentaires.

Caractère Unité de base d'un texte (lettre ou symbole).

Concaténation Ajout bout à bout de plusieurs valeurs de chaîne pour en creer une nouvelle.

Chaine vide Chaine qui ne contient rien: ni texte, ni'espace, ni autre caractère, représentée par ".". Une chaine vide n'est pas la même chose qu'une variable ayant une valeur nulle (null) : celle-ci est une variable à laquelle aucune occurrence de l'objet String n'est affectée, alors qu'une chaine vide est une occurrence dont la valeur ne contient aucun caractère.

String Valeur textuelle (sequence de caractères).

Littéral (ou « littéral de chaine ») Valeur chaine écrite explicitement en code, sous forme de valeur texte encadrée par des guillemets droits simples ou doubles.

Sous-chaine Définit une chaine qui fait partie d'une autre chaine.

Unicode Systeme standardisé de codage permettant de représentier du texte sous forme de caractères et symboles dans les programmes informatiques. Le système Unicode permet d'utiliser la totalité des caractères de toutes les langues écrites existantes.

Création de chaînes

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La classe String permet de représentier des données de chaine (texte) en ActionScript 3.0. Les chaînes ActionScript prennet en charge les caractères ASCII et Unicode. La meilleure façon de créé une chaine est d'utiliser un littéral de chaine. Pour déclarer un littéral de chaine, utilisez les guillemets droits doubles (" ) ou les guillemets droits simples (''). Par exemple, les deux chaînes suivantes sont équivalentes :

var str1:String = "hello";  
var str2:String = 'hello'; 

Vou puez également déclarer une chaîne à l'aide de l'opérateur new, comme suit :

var str1:String = new String("hello");
var str2:String = new String(str1);
var str3:String = new String(); // str3 == "" 

Les deux chaînes suivantes sont équivalentes :

var str1:String = "hello";  
var str2:String = new String("hello"); 

Pour utiliser des guillemets droits simples (') dans un littéral de châte délimité par des guillemets droits simples ('), utilisez le caractère d'échévement (). De même, pour utiliser des guillemets droits doubles ('') dans un littéral de châte délimité par des guillemets droits doubles (''), utilisez le caractère d'échévement (). Les deux chaînes suivantes sont équivalentes :

Vou puez utiliser des guillemets simples ou des guillemets doubles en fonction de ceux qui existent dans un littéral de chaine, comme dans l'exemple suivant :

var str1:String = "ActionScript <span class='heavy'>3.0</span>";
var str2:String = "<item id="155">banana</item>"; 

Rappelons qu'ActionScript fait la distinction entre les guillemets droits simples (') et les guillemets simples gauches ou droits (' ou ' ). Il en est de même pour les guillemets doubles. Utilisez des guillemets droits pour délimiter des littéraux de chaine. Lorsque vous collez du texte dans ActionScript depuis une autre source, utilisez les caractères corrects.

Comme indiquedans le tableau suivant, vous pouvez utiliser le caractere d'échéppement ( ) ) pour définir d'autres caractères dans des litteraux de chaine :

Séquence d'échévementCaractère
\bRetour arrêté
\fChangement de page
\nNouvelle ligne
\rRetour chariot
\tTabulation
\unnnCaracteré Unicode dont le code de caractère est spécifique par le nombre hexadecimal nnnn ; par exemple, \u263a est le caractère smiley.
\xnnCaracteré ASCII dont le code est spécifique par le nombre hexadecimal nn.
\"Guillemet droit simple
\"Guillemet droit double
\Barre oblique inverse

Propriété length

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Chaque chaîne possède une propriété length correspondant au nombre de caractères qu'elle contient:

var str:String = "Adobe"; trace(str.length); //output:5

Une chaine vide et une chaine null ont toutes deux une longueur de 0, comme l'indique l'exemple suivant :

var str1:String = new String();   
trace(str1.length); // output: 0   
str2:String = '';   
trace(str2.length); // output: 0 

Utilisation de caractères dans des chaînes

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Chaque caractère d'une chaîne possède une position d'index dans la chaîne (un entier). La position d'index du premier caractère est 0. Par exemple, dans la chaîne suivante, le caractère y occupe la position 0 et le caractère w occupe la position 5 :

"yellow" 

Voupez examiner des caractères individuels à différentes positions d'une chaine à l'aide des méthodes charAt() et charCodeAt(), comme dans l'exemple suivant:

var str:String = "hello world!";  
for (var i:int = 0; i < str.length; i++)  
{  
    trace(str.charAt(i), "-", str.charCodeAt(i));  
} 

Lorsque you executez ce code, vous obtenez le résultat suivant :

h - 104  
e - 101  
l - 108  
l - 108  
o - 111  
- 32  
w - 119  
o - 111  
r - 114  
l - 108  
d - 100  
! - 33 

Voupeuz également utiliser des codes de caractère pour définir une chaine à l'aide de la méthode fromCharCode(), comme l'indique l'exemple suivant:

Comparaison de chaînes

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Voussoupezutiliserlesopérateurssuivants pourcomparerdeschaines: < , < = ,! = , = =, = > et .Vouspouvezutilisercesopérateursavecdesinstructionsconditionnelles(ifetwhile,parexampie) comme l'indique l'exampie suivant:

var str1:String = "Apple";
var str2:String = "apple";
if (str1 < str2)
{ trace("A < a, B < b, C < c, ...");
}

Lorsque vous utilisez ces opérateurs avec des chaînes, ActionScript considère la valeur du code de chaque caractère dans la chaine, en comparant les caractères de gauche à droite, comme indiqué ci-dessous :

trace("A" < "B"); // true  
trace("A" < "a"); // true  
trace("Ab" < "az"); // true  
trace("abc" < "abza"); // true 

Utilisez les opérateurs = = et ! = pour comparer des chaînes entre elles et pour comparer des chaînes avec d'autres types d'objets, comme l'indique l'exemple suivant:

var str1:String = "1";  
var str1b:String = "1";  
var str2:String = "2";  
trace(str1 == str1b); // true  
trace(str1 == str2); // false  
var total uint = 1;  
trace(str1 == total); // true 

Récupération des représentations de chaine d'autres objets

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Voupez obtenir une representation de chaine de n'importe quel type d'objet. Tous les objets disposent en effet d'une methode toString():

var n:Number = 99.47 var str:String n.toString(); //str = = "99.47"

Lorsque vous utilisez l'opérateur de concatenation + avec une combinaison d'objet String et d'objets qui ne sont pas des chaînes, vous n'avez pas besoin d'utiliser la méthode toString(). Pour plus d'informations sur la concatenation, voir la section suivante.

La fonction globale String() renvoie la même valeur pour un objet donné que la valeur renvoyée par l'objet appelant la méthode toString().

Concaténation de chaînes

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La concatenation de chaînes consiste à prendre deux chaînes et à les combiner en une seule chaîne de façon séquentielle. Par exemple, vous pouvez utiliser l'opérateur + pour concaténer deux chaînes :

var str1:String = "green";  
var str2:String = "ish";  
var str3:String = str1 + str2; // str3 == "greenish" 

Vou puez e galement utilise l'opérateur + = pour obtenir le même résultat, comme dans l'exemple suivant:

var str:String = "green";  
str += "ish"; // str == "greenish" 

En outre, la classe String comprend la méthode concat(), utiliser comme suit :

var str1:String = "Bonjour";  
var str2:String = "from";  
var str3:String = "Paris";  
var str4:String = str1.conscat(" ", str2, " ", str3); // str4 == "Bonjour from Paris" 

Si vous utilisez l'opérateur ^+ (ou l'opérateur + = ) avec un objet String et un objet qui n'est pas une chaîne, ActionScript convertit automatiquement ce dernier en un objet String afin d'évaluer l'expression, comme indiqué dans l'exemple :

var str:String = "Area = ";  
var area:Number = Math.PI * Math.pow(3, 2);  
str = str + area; // str == "Area = 28.274333882308138" 

Néanmoins, vous pouvez utiliser des parentheses pour le regroupement afin de fournir un contexte à l'opérateur +, comme indiqué dans l'exemple suivant :

trace("Total: " + 4.55 + 1.45); // output: Total:4.551.45
trace("Total: " + (4.55 + 1.45)); // output: Total:6 

Recherche de sous-chaines et de modèles dans des chaînes

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Les sous-chênes sont des caractères consécutifs à l'intérieur d'une châte. La chaine "abc", par exemple, contient les sous-chênes suivantes : "", "a", "ab", "abc", "b", "bc", "c". Vous pouvez utiliser des méthodes ActionScript pour localiser les sous-chênes d'une châte.

Les modèles sont défiinis en ActionScript par des chaînes ou par des expressions régulières. Par exemple, l'expression régulière suivanté définit un modele spécifique, les lettres A, B, et C suivies d'un chiffre (les barres de fraction sont des délimiteurs d'expression régulière):

/ABC\d/

ActionScript compte des méthodes servant à rechercher des modèles dans des chaînes et à replacer les correspondances trouvées par des sous-châines de substitution. Ces méthodes sont décrites dans les sections suivantes.

Les expressions régulières peuvent définir des modèles compliqués. Pour plus d'informations, voir « Utilisation d'expressions régulières » à la page 78.

Recherche d'une sous-chaine par la position d'un caractère

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Les méthodes substr() et substring() sont similaires. Elles rengoient toutes les deux une sous-chaine d'une chaine. Elles prenent deux paramètres. Dans les deux méthodes, le premier paramètre est la position du caractère initial dans la chaine concernée. Toutefois, dans la méthode substr(), le deuxième paramètre est la longueur de la sous-chaine à renvoyer, alors que dans la méthode substring(), le第二种 paramètre est la position du caractère final de la sous-chaine (qui ne figure pas dans la chaine renvoyée). Cet exemple illustré la différence entre ces deux méthodes :

var str:String = "Hello from Paris, Texas!!"; trace(str.substring(11,15)); // output: Paris, Texas!!
trace(str.substring(11,15)); // output: Pari 

La méthode slice() fonctionne de la même façon que la méthode substring(). Lorsque deux nombres entiers non négatifs sont passés en paramètres, son fonctionnement est identique. Néanmoins, la méthode slice() peut recevoir des entiers négatifs comme paramètres. Dans ce cas, la position des caractères est comptée à partir de la fin de la chaine, comme dans l'exemple suivant :

var str:String = "Hello from Paris, Texas!!!";  
trace(str.slice(11,15)); // output: Pari  
trace(str.slice(-3,-1)); // output: !!  
trace(str.slice(-3,26)); // output: !!!  
trace(str.slice(-3,str.length)); // output: !!  
trace(str.slice(-8,-3)); // output: Texas 

Voussousvezassocerdesentierspositifsetnégatifscomeparamétresde lamethodoslice().

Recherche de la position des caractères d'une sous-chaine correspondante

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

VoupeusutiliserlesmethodesindexOf()etlastindexOf()pourlocaliserdes sous-chinescorrespondantesau seind'unechaine, comme dansl'exemple suivant:

var str:String = "The moon, the stars, the sea, the land"; trace(str.indexOf("the")); // output: 10 

La méthode indexOf() est sensible à la casse.

Vouspouvieszpecifiedundeuxieme parametre pourindiquerla position delindexdansla chainea partir de laquelle commencerlacresearche, comme suit:

var str:String = "The moon, the stars, the sea, the land"  
trace(str.indexOf("the", 11)); // output: 21 

La méthode lastindexOf() trouve la dernière occurrence d'une sous-chaine dans la chaine :

var str:String = "The moon, the stars, the sea, the land"  
trace(str.lastIndexOf("the")); // output: 30 

Si vous incluez un deuxième paramètre avec la méthode lastIndexOf(), la recherche est effectué à l'envers à partir de cette position d'index dans la chaine (de droite à gauche):

var str:String = "The moon, the stars, the sea, the land"  
trace(str.lastIndexOf("the", 29)); // output: 21 

Creation d'un tableau de sous-chainssegmenté par un délimiteur

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Vouss pouvez utiliser la méthode split() pour creer un tableau de sous-chênes divisé en fonction d'un caractère délimiter. Par exemple, vous pouvez segmenter une chaine séparée par des virgules ou des tabulations en plusieurs chaînes.

L'exemple suivant indique comment diviser un tableau en sous-chines avec le caractère esperluette (&) comme délimitectur :

var queryStr:String = "first= Joe&last= cheng&title=manager&StartDate = 3 / 6 / 65 "; var params:Array = queryStr.split("\&",2); // params = = ["first Joe","last cheng"]

Le deuxième paramètre de la méthode split() (qui est facultatif) définit la taille maximale du tableau renvoyé.

Vou puez également utiliser une expression régulière comme caractère délimueur :

var str:String = "Give me\t5."  
var a:Array = str.split(/\\s+/); // a == ["Give","me","5.'] 

Pour plus d'informations, voir « Utilisation d'expressions régulières » à la page 78 et le manuel Guide de référence ActionScript 3.0 pour la plate-forme Adobe Flash.

Recherche de modèles dans des chaînes et remplacement de sous-chains

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La classe String comprend les méthodes suivantes pour utiliser des modèles dans des chaînes :

Utilisez les méthodes match() et search() pour localiser des sous-chaines qui correspond à un modele.
- Utilisez la méthode replace() pour rechercher des sous-chains qui correspondent à un modèle et les replacer par une sous-chaine spécifique.

Ces méthodes sont décrites dans les sections suivantes.

Voupeus d'informations sur les expressions regulières, voir « Utilisation d'expressions régulières » à la page 78.

Recherche de sous-chaines correspondantes

La méthode search() renvoie la position de l'index de la première sous-chaine qui correspond à un modèle donné, comme illustré dans cet exemple :

var str:String = "The more the merrier."; // (This search is case-sensitive.) trace(str.search("the")); // output: 9 

Vou puez egalent utilise des expressions regulières pour définir le modele pour lequel étabir une correspondence, comme illustré dans cet exemple :

var pattern:RegExp = /the/i;  
var str:String = "The more the merrier.";  
trace(str.search(pattern)); // 0 

Le résultat de la méthode trace() est 0, car le premier caractère dans la chaîne est la position de l'index 0. L'indicateur i est défini dans l'expression régulière. Par conséquent, la recherche n'est pas sensible à la casse.

La méthode search() trovue une seule correspondance et renvoie sa position d'index de début, même si l'indicateur g (global) est défini dans l'expression régulière.

L'exemple suivant presente une expression régulière plus compliquée qui correspond à une chaine dans des guillemets doubles :

var pattern: RegExp = /[^\*]*";  
var str:String = "The \\"more\" the merrier.";  
trace(str.search(pattern)); // output: 4 

La méthode match() fonctionne de façon similaire. Elle recherche une sous-chaine correspondante. Néanmoins, lorsque vous utilisez l'indicateur global dans un modele d'expression régulière ( comme dans l'exemple suivant), match() renvoie un tableau de sous-chaines correspondantes :

var str:String = "bob@example.com, omar@example.org";
var pattern:RegExp = /\w*@\w*. [org|com] + /g;
var results:Array = str.match(pattern); 

Le tableau résultats est défini comme suit :

["bob@example.com","omar@example.org"]

Pour plus d'informations sur les expressions régulières, voir « Utilisation d'expressions régulières » à la page 78.

Remplacement de sous-chaines mises en correspondance

Voupeusutiliserlambdaéchéode replace() pour rechercher un modele spécifié dans une chaîne et remplacer les correspondances par la chaine de remplacement spécifiée, commeillustré dans l'exemple suivant:

Dans cet exemple, les chaînes mises en correspondance ne sont pas sensibles à la casse car l'indicateur i (ignoreCase) est défini dans l'expression régulière, et plusieurs correspondances sont replacées car l'indicateur g (global) est défini. Pour plus d'informations, voir « Utilisation d'expressions régulières » à la page 78.

Voupez inclure les codes de remplacement s suivants dans la chaine de remplacement. Le texte de remplacement indique dans le tableau suivant est insere a la place du code de remplacement ..

Code Texte de remplacement
&Sous-chaine correspondante.
`Partie de la chaine qui précède la sous-chaine correspondante. Ce code utilise les guillemets simples droits gauches (°) et non les guillemets simples droits (°) ni les guillemets simples anglais gauches (°).
'Partie de la chaine qui suit la sous-chaine correspondante. Ce code utilise les guillemets simples droits (°).
nnième groupe entre parenthéses correspondant capturé, où n est un chiffre compris entre 1 et 9 et n n'est pas suivi d'une décimale.
nnnnième groupe entre parenthéses correspondant capturé, où nn est un nombre décimal à deux chiffres compris entre 01 et 99. Si la nnième capture n'est pas définie, le texte de remplacement est une chaine vide.

L'exemple suivant illustrer l'utilisation des codes de remplacement 2 et 1, qui représentent le premier et le deuxième groupes capturés correspondants :

var str:String = "flip-flop";

var pattern: RegExp = /(\w+) - (\w+)/g;

trace(str.replace(pattern, "2-1)); // flop-flip

Vou puez également utiliser une fonction comme deuxième paramètre de la méthode replace(). Le texte correspondant est remplaced par la valeur renvoyée de la fonction.

var str:String = "Now only $9.95!";  
var price:RegExp = /\$([\d,]+.\d+) +/i;  
trace(str.replace(price, usdToEuro));  
function usdToEuro(matchedSubstring:String, capturedMatch1:String, index:int, str:String):String  
{  
    var usd:String = capturedMatch1;  
    usd = usd.replace("\\"," ");  
    var exchangeRate:Number = 0.853690;  
    var euro:Number = parseFloat(USD) * exchangeRate;  
    const euroSymbol:String = String.fromCharCode(8364);  
    return euro.toFixed(2) + " " + euroSymbol;  
} 

Lorsque vous utilisez une fonction comme deuxieme parametre de la methode replace(), les arguments suivants sont transmis à la fonction :

  • La partie correspondante de la chaîne.
  • Tout groupe entre parenthèses capture correspondant. Le nombre d'arguments transmis de cette façon varie selon le nombre de correspondances entre parenthèses. Pour déterminer le nombre de correspondances entre parenthèses, vérifie arguments.length - 3 dans le code de la fonction.
  • La position d'index dans la chaîne où débute la correspondance.
  • La chaine compte.

Conversion de la casse dans des chaînes

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Comme illustré dans l'exemple suivant, les méthodes toLowerCase() et toUpperCase() convertissent les caractères alphétiques de la chaîne en minuscule et en majuscule, respectivement:

var str:String = "Dr. Bob Roberts, #9."  
trace(strtoLowerCase()); // dr. bob roberts, #9.  
trace(strtoUpperCase()); // DR. BOB ROBERTS, #9. 

Une fois que ces méthodes sont executées, la chaine source reste inchangée. Pour transformer la chaine source, utilisez le code suivant :

str = strtoUpperCase(); 

Ces méthodes fonctionnent avec des caractères étendus, pas simplement a-z et A-Z:

var str:String = "Jose Barça";  
trace(strtoUpperCase(), strtoLowerCase()); // JOSE BARÇA jose barça 

Exemple de chaine : ASCII Art

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Cet exemple ASCII Art représentée différentes façon d'utiliser la classe String en ActionScript 3.0, notamment :

  • La méthode split() de la classe String est utilisé pour extraire des valeurs d'une chaine séparée par des caractères (informations d'image dans un fisier de texte séparé par des tabulations).
  • Plusieurs techniques de manipulation de chaînes, y compris split(), la concatenation et l'extraction d'une partie de la chaîne à l'aide de substring() et de substr(), sont utilisées pourmettre la première lecture de chaque mot dans les titres d'image en majuscule.
  • La méthode getCharAt() est utilisé pour obtenir un seul caractère à partir d'une chaine (pour déterminer le caractère ASCII correspondant à une valeur bitmap d'échelle de gris).
  • La concatenation de chaine est utilisé pour construire la représentation ASCII art d'une image, un caractère à la fois.

Le terme ASCII art fait reférence à des représentations textuelles d'une image dans lesquelles une grille de polices de caractères à espacement constant (caracteres Courier New, par exemple) trace l'image. L'image suivante est un exemple d'ASCII art produit par l'application :

ADOBE ACTIONSCRIPT 3.0 - Exemple de chaine : ASCII Art - 1

ADOBE ACTIONSCRIPT 3.0 - Exemple de chaine : ASCII Art - 2
La version ASCII art du graphique est illustrée à droite.

Pour obtenir les fichiers d'application de cet exemple, voir

www.adobe.com/go/learn_programmingAS3samplesflash_fr. Les fichiers de l'application ASCIIArt se trouvent dans

le dossier Samples/AsciiArt. L'application se compose des fichiers suivants :

FichierDescription
AsciArtApp.mxlouAsciArtApp.flaFichier d'application principal en FLA pour Flash ou en MXLPour Flex
com/example/programmingas3/asciiArt/AsciArtBuilder.asLa classe qui fournit la fonctionnalité principale de l'application, notamment l'extraction de métadonnées d'image d'un fichier de texte, le chargement des images et la gestion du processus de conversion d'image en texte.
com/example/programmingas3/asciiArt/BitmapToAsciConverter.asUne classe qui fournit la méthode parseBitmapData() pour convertir des données d'image dans une version String.
com/example/programmingas3/asciiArt/Image.asUne classe qui représentée une image bitmap chargée.
com/example/programmingas3.asciiArt/ImageInfo.asUne classe représentant des métadonnées pour une image ASCII art (titre, URL de fichier image, etc.).
image/Un dossier contenant des images utilisées par l'application.
txt/ImageData.txtUn fichier de texte séparé par des tabulations et contenant des informations sur les images à charger par l'application.

Extraction de valeurs séparées par des tabulations

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Cet exemple utilise le stockage séparé de données d'application par rapport à l'application ; de cette façon, si les données changent (par exemple, si une autre image est ajoutée ou que le titre d'une image change), il est inutil de recreer le fjichier SWF. Dans ce cas, les métadonnées d'image, y compris le titre de l'image, l'URL du fjichier d'image réel et certaines valeurs utilisées pour manipuler l'image, sont stockés dans un fjichier de texte (le fjichier txt/ImageData.txt dans le projet). Le contenu du fjichier de texte est le suivant :

Le fichier utilise un format séparé par des tabulations spécifique. La première ligne est une ligne d'en-tête. Les lignes restantes contiennent les données suivantes pour chaque bitmap à charger :

  • Le nom de fichier du bitmap.
  • Le nom d'affichage du bitmap.
  • Les valeurs de seuil du blanc et les valeurs de seuil du noir pour les bitmaps. Il s'agit de valeurs hexadécimales au-dessus et en dessous desquelles un pixel doit être considéré comme totalement blanc ou totalement noir.

Dès que l'application démarre, la classe AsciiArtBuilder se charge et analyse le contenu du fischier de texte afin de créé la « pile » d'images qu'elle chargera. Pour cela, elle utilise le code suivant de la méthode parseImageInfo() de la classe AsciiArtBuilder :

var lines:Array = _imageInfoLoader.data.split("\n");
var numLines:uint = lines.length;
for (var i:uint = 1 ; i < numLines ; i + + ) { var imageInfoRaw:String = lines[i]; ... if(imageInfoRaw.length>0) { // Create a new image info record and add it to the array of image info. var imageInfo:ImageInfo = new ImageInfo(); // Split the current line into values (separated by tab (\t) // characters) and extract the individual properties: var imageProperties:Array = imageInfoRaw.split("\t"); imageInfofileName = imageProperties[0]; imageInfo.title = normalizeTitle(imageProperties[1]); imageInfo.whiteThreshold = parseInt(imageProperties[2],16); imageInfo.blackThreshold = parseInt(imageProperties[3],16); result.push(imageInfo); }

Le contenu entier du fichier de texte se trouve dans une seule occurrence de String, la propriété

_imageInfoLoader.data. Vous pouze utiliser la méthode split() avec le caractère de nouvelle ligne ("\n") comme paramètre pour divisor l'occurrence de String en un tableau (lines) dont les éléments sont les lignes individuelles du filchier de texte. Le code utilise ensuite une boucle pour travailler avec chacune des lignes (excepté la première car elle contient uniquement des en-têtes). A l'intérieur de la boucle, la méthode split() est de nouveau utilisé pour divisor le contenu de la ligne en un ensemble de valeurs (l'objet Array appelé imageProperties). Le paramètre utilisé avec la méthode split() dans ce cas est le caractère de tabulation ("\t") car les valeurs dans chaque ligne sont déliminées par des tabulations.

Utilisation de méthodes String pour normaliser des titres d'image

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Dans cette application, tous les titres d'image sont affichés à l'aide d'un format standard, avec la première lecture de chaque mot en majuscule (excepté quelques mots qui ne sont généralement pas en majuscule dans des titres anglais). Au lieu de considérer que le fjchier de texte contient des titres formats correctement, l'application formate les titres lors de leur extraction du fjchier de texte.

Dans la liste de code précédente, lors de l'extraction de valeurs de métadonnées d'image individuelles, la ligne de code suivante est utilisé:

imageInfo.title = normalizeTitle(imageProperties[1]);

Dans ce code, le titre de l'image issu du fichier de texte est transmis au moyen de la méthode normalizeTitle() avant d'être stocké dans l'objet ImageInfo :

private function normalizeTitle(title:String):String
{ var words:Array = title.split(""); var len:uint = words.length; for(var i:uint; < . i + + ) { words[i] = capitalizeFirstLetterwords[i]); } return words.join(" ");

Cette méthode utilise la méthode split() pour divisor le titre en mots individuels (separés par le caractère d'espacement), transmet chaque mot au moyen de la méthode capitalizeFirstLetter() puis utilise la méthode join() de la classe Array pour combiner de nouveaux les mots en une chaine unique.

Comme son nom l'indique, la méthode capitalizeFirstLetter() met la première dette de chaque mot en majuscule:

En anglais, le premier caractère des mots suivants utilisés dans un titre n'est pas mis en majuscule: “and,” “the,” “in,” “an,” “or,” “at,” “of,” ou “a.” (il s'agit d'une version simplifiée des régles). Pour executer cette logique, le code utilise d'abord une instruction switch pour vérifier si le mot est l'un des mots ne devant pas etre en majuscule. Si c'est le cas, le code sort de l'instruction switch. Si le mot doit etre en majuscule, la procedure comprend plusieurs étapes :

1 La première lecture du mot est extraite à l'aide de substr (0, 1), qui extraie une sous-chaine commençant par le caractère au niveau de l'index 0 (la première lecture de la chaine, comme indiqué par le premier paramètre 0). La sous-chaine contendra un caractère (indiqué par le deuxième paramètre 1).
2 Ce caractère est mis en majuscule à l'aide de la méthode toUpperCase().

3 Les caractères restants du mot d'origine sont extrais à l'aide de substring (1), qui extraie une sous-chaine commençant à l'index 1 (la deuxième lecture) jusqu'à la fin de la chaine (indiqué en omettant le deuxième paramètre de la méthode substring ().
4 Le dernier mot est créé en combinant la première lecture mise en majuscule et les lettres restantes en utilisant la concatenation de chaine: firstLetter + otherLetters

Génération du texte ASCII art

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La classe BitmapTo ASCII Converter permet de convertir une image bitmap en sa representation de texte ASCII. Cette procEDURE est effectuee par la methode parseBitmapData(), partiellement representee ici:

var result:String = "";
// Loop through the rows of pixels top to bottom:
for(var y:uint = 0 ;y < _data.height;y + = verticalResolution)
{ // Within each row, loop through pixels left to right: for(var x:uint = 0 ;x < _data.width;x + = horizontalResolution) { ... // Convert the gray value in the 0-255 range to a value // in the 0-64 range (since that's the number of "shades of // gray" in the set of available characters): index = Math.floor(grayVal/4); result + = palette.charAt(index); } result + = " n" .
}
return result;

Ce code définit d'abord une occurrence de String appelée résultat qui sera utilisé pour créé la version ASCII art de l'image bitmap. Il effectue ensuite une boucle sur les pixels de l'image bitmap source. Il utilise plusieurs techniques de manipulation des couleurs (non décrites ici) pour convertir le rouge, le vert et le bleu d'un pixel en une valeur d'échelle de gris (un nombre entre 0 et 255). Le code divise ensuite cette valeur par 4 ( comme indiqué) pour la convertir en une valeur dans l'échelle 0-63, qui est stockée dans la variable index (l'échelle 0-63 est utilisé car la palette des caractères ASCII disponibles utilisée par cette application contient 64 valeurs). Lapalette des caractères est définie en tant qu'occurrence de String dans la classe BitmapTo ASCII Converter :

Etant donné que la variable index définit le caractère ASCII de la palette qui correspond au pixel actuel dans l'image bitmap, ce caractère est récapuére de la palette String à l'aide de la méthode charAt(). Il est ensuite ajouté à l'occurrence de String résultat au moyen de l'opérateur d'affection de concatenation (+=). En outre, à la fin de chaque ligne de pixels, un caractère de nouvelle ligne est concatenated à la fin de l'occurrence de String résultat afin que la ligne à renvoyer creée une ligne de pixels de caractères.

Chapitre 3 : Utilisation de tableaux

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Les tableaux vous permettent de stocker plusieurs valeurs dans une seule structure de données. Vous pouvez utiliser des tableaux indexés simples qui stockent des valeurs à l'aide d'index d'entiers ordinaux fixes ou des tableaux associatifs complexes qui stockent des valeurs à l'aide de clés arbitraires. Les tableaux peuvent également être multidimensionnels et conténir des éléments étant eux-mêmes des tableaux. Pour finir, vous pouvez utiliser un vecteur pour les tableaux dont les éléments sont tous des occurrences du même type de données.

Voir aussi

Array

Vecteur

Principes de base des tableaux

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Vou aurez souvent besoin en programmation d'utiliser un ensemble d'éléments只不过 qu'un seul objet; par exemple, dans une application de lecteur de musique, vous pouvez avoir une liste de morceaux en attente de lecture. Vous ne souhaitez pas créé une variable séparée pour chaque morceau de cette liste. Il serait préférible de rassembler tous les objets Song et de les utiliser sous forme de groupe.

Un tableau est un élément de programmation qui agit comme conteneur pour un ensemble d'éléments (une liste de morceaux, par exemple). La plupart du temps, tous les éléments d'un tableau sont des occurrences de la même classe, mais ceci n'est pas obligatoire dans ActionScript. Les éléments individuels d'un tableau sont les éléments du tableau. Un tableau peut être comparé à un tiroir classeur pour des variables. Les variables peuvent être ajoutées en tant qu'éléments au tableau, comme vous placez un dossier dans le tiroir classeur. Vous pouvez utiliser le tableau comme une variable unique, comme si vous transportiez le tiroir entier à un autre endroit. Vous pouvez utiliser lesvariables en tant que groupe, comme si vous recherchiez des informations dans les dossiers en les parcourant l'un après l'autre. Vous pouvez y acceder individuellement, comme si vous ouvriez le tiroir et seLECTIONniez un seul dossier.

Par exemple, imaginez que vous créez une application de lecteur de musique dans laquelle un utiliser peut seLECTIONner plusieurs morceaux et les ajouter à une liste de lecture. Dans votre code ActionScript, vous ave une méthode appelée addSongsToPlaylist() qui accepte un seul tableau comme paramètre. Peu importe le nombre de morceaux à ajouter à la liste (quelques-uns, un grand nombre, ou même un seul), vous devez appeler la méthode addSongsToPlaylist() une seule fois, en lui transmettant le tableau qui contient les objets Song. Dans la méthode addSongsToPlaylist(), vous pouvez utiliser une boucle pour parcourir les éléments (morceaux) du tableau un par un et les ajouter à la liste de lecture.

Le type de tableau ActionScript le plus courant est le tableau indexé. Dans un tableau indexé, chaque élément est stocké dans un emplacement numérotré appelé index. On accède à des éléments à l'aide du numéro, comme une adresse. Les tableaux indexés répondent à la plupart des besoin en programmation. La classe Array est une classe courante utilisée pour représentier un tableau indexé.

Un tableau indexé est souvent utilisé pour stocker plusieurs éléments du même type, des objets qui sont des occurrences de la même classe. La classe Array ne dispose pas de moyens pour restreindre le type d' éléments qu'elle contient. La classe Vector est un type de tableau indexé dans lequel tous les éléments d'un tableau unique sont du même type. L'utilisation d'une occurrence de Vector à la place d'une occurrence de Array peut également déboucher sur une amélioration des performances entre autres. la classe Vector est prise en charge à partir de Flash Player 10 et Adobe AIR 1.5.

Une utilisation spéciale d'un tableau indexé est un tableau multidimensionnel. Un tableau multidimensionnel est un tableau indexé dont les éléments sont des tableaux indexés, qui contiennent à leur tour d'autres éléments.

Le tableau associatif est un另一种 type de tableau. Il utilise une chaine key au lieu d'un index numérique pour identifier des éléments individuels. Enfin, ActionScript 3.0 comprend également une classe Dictionary qui représenté un dictionnaire. Un dictionnaire est un tableau qui vous permet d'utiliser tout type dobjet comme clé afin de désigner les éléments entre eux.

Concepts important et terminologie

La liste de référence suivante content des termes importantes utilisés dans le cadre de la programmation de routines qui gèrent des tableaux et des vecteurs :

Array Obj qui sert de conteneur pour regrouper plusieurs objets.

Opérateur ([]) d'accès au tableau Paire de crochets entourant un index ou une clé qui identifie de façon unique un élément du tableau. Cette syntaxe est utilisé après le nom d'une variable de tableau pour spécifique un seul élément du tableau只想 qu'un tableau entier.

Tableau associatif Tableau qui utilise des clés de chaine pour identifier des éléments individuels.

Type de base Type de données des objets qu'une occurrence de Vector est autorisée à stocker.

Dictionnaire Tableau dont les éléments sont constitués de paires d'objets appelées clé et valeur. La clé est utilisée à la place d'un index numérique pour identifier un seul élément.

Elément Elément unique dans un tableau.

Index Adresse numérique utilisé pour identifier un élément unique dans un tableau indexé.

Tableau indexé Type de tableau standard qui stocke chaque élément dans une position numérotée et utilise le nombre (index) pour identifier des éléments individuels.

Clé Chaine ou objet utilise pour identifier un seul élément dans un tableau associatif ou un dictionnaire.

Tableau multidimensionnel Tableau contenant des éléments qui sont des tableaux plutilt que des valeurs uniques.

T Convention standard utilise dans la presente documentation pour représentier le type de base d'une occurrence de Vector,quel qu'il soit.La convention T est utilise pour representer un nom de classe, comme cela est indiquedans la description du parametre Type. ( T correspond a « type», comme dans « type de données »).

Paramètre Type Syntaxe utilisé avec le nom de classe Vector pour spécifique le type de base de Vector (le type de données des objets qu'il stocke). La syntaxe consiste en un point (.), puis le nom du type de données entouré de parentheses en chevron (<>). L'ensemble ressemble à ceci : Vector. Dans la présente documentation, la classe spécifique dans le paramètre Type est représenté de façon générique par T.

Vecteur Type de tableau dont les éléments sont tous des occurrences du même type de données.

Tableaux indexés

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Les tableaux indexés stockent une série d'une ou de plusieurs valeurs organises de façon à ce que vous puissiez accéder à chaque valeur à l'aide d'une valeur d'entier non signé. Le premier index correspond toujours au nombre 0. L'index est ensuite incrémenté d'une unité pour chaque élément ajoute consécutivement au tableau. Dans ActionScript 3.0, deux classes sont utilisées comme tableaux indexés : la classe Array et la classe Vector.

Les tableaux indexés utilisent un entier 32 bits non signé pour le nombre d'index. La taille maximale d'un tableau indexé est 2^32 - 1 ou 4 294 967 295. Si vous tentez de créé un tableau plus grand que la taille maximale, une erreur d'exécution se produit.

Pour acceder à un élément particulier d'un tableau indexé, vous pouvez utiliser l'opérateur ([ ]) d'accès au tableau pour désigner la position de l'index de l'élement visé. Par exemple, le code suivant représenté le premier élément (l'élement à l'index 0) dans un tableau indexé appelé songTitles :

songTitles[0]

La combinaison du nom de la variable du tableau suivi de l'index entre crochets fonctionne comme un identifiant unique. En d'autres termes, elle peut etre utiliser tout comme un nom de variable. Vous pouze affercer une valeur a un élément du tableau indexé en utilisant le nom et l'index du cote gauche d'une instruction d'afctation :

Dans la même veine, vous pouvez récapérer une valeur à un élément du tableau indexé en utilisant le nom et l'index du côté croit d'une instruction d'aftection :

var nextSong:String = songTitles[2];

Vous pouvez aussi utiliser une variable entre crochets只不过 que de fournir une valeur explicite. Elle doit containir une valeur entière non-négative telle qu'un uint, un int positif ou une occurrence de Number d'entier positif. Cette technique est utilisée couramment pour passer en boucle sur les éléments dans un tableau indexé et effectuer une opération sur un ou tous les éléments. Le code ci-dessous déscrit cette technique. Le code utilise une boucle pour acceder à chaque valeur dans un objet Array appelé oddNumbers. Il utilise l'instruction trace() pour imprimer chaque valeur sous la forme "oddNumber[index] = value":

var oddNumbers:Array = [1,3,5,7,9,11];
var len:uint = oddNumbers.length;
for(var i:uint = 0 ;i<len;i++)
{ trace("oddNumbers[" + i.toString() ^+ "]= " + oddNumbers[i].ToString());
}

Classe Array

La classe Array est le premier type de tableau indexé. Une occurrence de Array peut compter une valeur de n'importe quel type de données. Le même objet Array peut compter des objets qui sont de types de données différents. Par exemple, une occurrence de Array unique peut avoir une valeur String en index 0, une occurrence de Number en index 1 et un objet XML en index 2.

Classe Vector

La classe Vector est un autre type de tableau indexé qui est disponible dans ActionScript 3.0. Une occurrence de Vector est un tableau typé, ce qui signifie que tous les éléments d'une occurrence de Vector ont toujours le même type de données.

Remarque : la classe Vector est prise en charge à partir de Flash Player 10 et Adobe AIR 1.5.

Lorsque you declare a variable Vector ou que you instanciez un objet Vector, you specifyz explicitement le type de données des objets que le vecteur peut containir. Le type de données spécifie est connu sous le nom de type de base du vecteur. Lors de l'execution et de la compilation (en mode strict), tout code qui fixe la valeur d'un élément Vector ou récapère une valeur d'un élément Vector est contrôle. Si le type de données de lobjet que l'on tente d'ajouter ou de récapérez ne correspond pas au type de base du vecteur, une erreur se produit.

Outre la restriction concernant le type de données, la classe Vector possède d'autres restrictions qui la distinguent de la classe Array :

  • Un vecteur est un tableau dense. Un objet Array peut composer des valeurs dans les index 0 et 7 même si elle n'en a pas dans les positions 1 à 6. Cependant, un vecteur doit composer une valeur (ou null) dans chaque index.
  • Un vecteur peut facultativement avoir une longueur fixe. Ceci signifie que le nombre d' éléments du vecteur est immuable.
  • L'accès aux éléments d'un vecteur est défini par ses limites. Vous ne pouvez jamais lire une valeur d'un index supérieur à celui de l'élement final (longueur - 1). Vous ne pouvez jamais définir une valeur avec un index supérieur à l'index final actuel. En d'autres termes, vous pouvez définir une valeur uniquement à l'index existant ou à une [longueur] d'index.

En raison de ses restrictions, un vecteur presente trois avantages principaux par rapport à une occurrence d'Array dont les éléments sont tous des occurrences d'une classe unique :

Performance : l'accès à l'élement de tableau et son iteration sont beaucoup plus rapides lorsque vous utilisez une occurrence de Vector que lorsque vous utilisez une occurrence d'Array.
- Sécurité des types : en mode strict, le compilateur peut identifier les erreurs de type de données. Parmi ces erreurs, il y a l'affection d'une valeur du type de données incorrect à un vecteur ou l'attente d'un type de données incompatible lors de la lecture d'une valeur à partir du vecteur. A l'exécution, les types de données sont également contrôlés lors de l'ajout de données à un object Vector ou la lecture de données qui en provient. Notez cependant que lorsque vous utilisez la méthode push() ou unshift() pour ajouter des valeurs à un vecteur, les types de données des arguments ne sont pas vérifiés au moment de la compilation. Lorsque vous utilisez ces méthodes, les valeurs sont toujours contrôlées à l'exécution.
- Fiabilité : le contrôle de gamme à l'exécution (ou contrôle de longueur fixe) assure une fiabilité nettement supérieure à celle des objets Array.

A part les contraintes et les avantages supplémentaires, la classe Vector est très proche de la classe Array. Les propriétés et les méthodes d'un objet Vector sont similaires, voire dans certains cas identiques, aux propriétés et aux méthodes d'un objet Array. Au lieu d'utiliser un objet Array dont tous les éléments possèdent le même type de données, il est généralement préféable de faire appel à une occurrence de l'objet Vector.

Déception de tableaux

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Voupez utilise plusieurs techniques pour creer une occurrence de Array ou une occurrence de Vector. Cependant, les techniques de creation de chaque type de tableau sont quelque peu différentes.

Creation d'une occurrence de Array

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Vou creez un objet Array par l'appl au constructeur Array ( ou par l'utilisation d'une syntaxe de litteral de tableau.

Vous pouvez utiliser la fonction de constructeur Array() de trois façon différentes. Premièrement, si vous appèlez le constructeur sans arguments, vous obtenez un tableau vide. Vous pouze utiliser la propriété length de la classe Array pour vérifier que le tableau ne contient aucun élément. Par exemple, le code suivant appelle le constructeur Array() sans arguments :

var names:Array = new Array(); tracenames.length); // output: 0 

Deuxièmement, si vous utilisez un nombre comme unique paramètre pour le constructeur Array(), un tableau de cette longueur est créé, avec chaque valeur d'élement définitie sur undefined. L'argument doit être un entier non signé compris entre les valeurs 0 et 4 294 967 295. Par exemple, le code suivant appelle le constructeur Array() avec un seul argument numérique :

var names:Array = new Array(3);  
tracenames.length); // output: 3  
tracenames[0]); // output: undefined  
tracenames[1]); // output: undefined  
tracenames[2]); // output: undefined 

Troisiement, si vous appelez le constructeur et transmettez une liste d' éléments comme paramétres, un tableau est créé avec des éléments correspondant à chacun des paramétres. Le code suivant transmet trois arguments au constructeur Array():

var names:Array = new Array("John", "Jane", "David"); tracenames.length); // output: 3 trace names[0]); // output: John trace names[1]); // output: Jane trace names[2]); // output: David 

Voussouvez aussi creer des tableaux avec des litteraux de tableau. Un litteral de tableau peut etre affecte directement à une variable de tableau, comme illustré dans l'exemple suivant:

var names:Array = ["John", "Jane", "David"]; 

Création d'une occurrence de Vector

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

Vou creez une occurrence de Vector par l'appel du constructeur Vector. <T>() . You pouze aussi creer un vecteur par l'applé à la fonction globale Vector. <T>() . Cette fonction convertit un objet spécifique en une occurrence de Vector. Dans Flash Professional CS5 et les versions ultérieures, Flash Builder 4 et les versions ultérieures et Flex 4 et les versions ultérieures, you pouze également创建工作 une occurrence de Vector à l'aide de la syntaxe de litteral correspondante.

Toutes les fois que vous déclarez une variable Vector (ou de la même façon, un paramètre de la méthode Vector ou un type de renvoi de la méthode Vector), vous spécifie le type de base de la variable Vector. Vous spécifie également le type de base lorsque vous créEZ une occurrence de Vector par l'appoint au constructeur Vector.(). Autrement dit, toutes les fois que vous utilisez le terme Vector dans ActionScript, il est arrivapné d'un type de base.

Vous spécifie le type de base du vecteur à l'aide de la syntaxe de paramètres de type. Le paramètre de type suit immédiatement le mot Vector dans le code. Il est formé d'un point (.), puis du nom de classe de base entouré de parentheses en chevron (<>) comme l'indique cet exemple :

var v:Vector.<String>;  
v = new Vector.<String>(); 

Dans la première ligne de cet exemple, la variable v est déclarée comme une occurrence de Vector.. En d'autres termes, il représenté un tableau indexé qui ne peut composer que des occurrences de String. La deuxième ligne appelle le constructeur Vector() pour creer une occurrence du même type Vector, c'est-à-dire un vecteur dont les éléments sont tous des objets String. Il affecte cet objet à v.

Utilisation du constructeur Vector, <T>()

Si vous utilisez le constructeur Vector.() sans arguments, il create une occurrence de Vector vide. Vous pouvez contrôler qu'un vecteur est vide en vérifiant sa propriété length. Par exemple, le code ci-dessus appelle le constructeur Vector.() sans arguments :

var names:Vector.<String> = new Vector.<String>(); tracenames.length); // output: 0 

Si vous savez d'avance de combien d' éléments un vecteur a besoin initialement, vous pouvez prédéfinir ce nombre dans le vecteur. Pour creer un vecteur avec un certain nombre d' éléments, transmettez le nombre d' éléments comme premier paramètre (le paramètre length). Comme les éléments du vecteur ne peuvent pas etre vides,ils sont replis d'occurrences du type de base. Si ce type est un type de refereence qui autorise les valeurs null,les éléments contiennent tous null. Autrement,ils contiennent tous la valeur par defaut pour la classe.Par exemple, une variable uint ne peut pas etre null. Par consequenc, dans le code ci-dessous, le vecteur appelé ages est create avec sept éléments, chacun contenant la valeur 0.

var ages:Vector.<uint> = new Vector.<uint>(7); 
trace(ages); // output: 0,0,0,0,0,0,0 

Enfin, à l'aide du constructeur Vector. T , vous pouze également créé un vecteur de longueur fixe en transmettant true comme deuxieme paramètre (le parametre fixed). Dans ce cas, le vecteur est créé avec le nombre spécifique d' éléments et celui-ci ne peut pas'être modifié. Notez cependant que vous pouze quand même changer les valeurs des éléments d'un vecteur de longueur fixe.

Utilisation du constructeur de syntaxe de littéral Vector

Dans Flash Professional CS5 et les versions ultérieures, Flash Builder 4 et les versions ultérieures et Flex 4 et les versions ultérieures, vous pouvez transmettre une liste de valeurs au constructeur Vector() pour stipuler les valeurs initiales du vecteur :

// var v:Vector.<T> = new <T>[E0, ..., En-1,]; 
// For example: 
var v:Vector.<int> = new <int>[0,1,2,]; 

Cette syntaxe possède les caractéristiques suivantes :

  • La virgule de fin de ligne est facultative.
  • La syntaxe ne gère pas la présence d'éléments vides dans le tableau. Une instruction telle que var v:Vector. = new [0,2,] renvoie une erreur de compilation.
  • Il est impossible de stipuler la longueur par défaut de l'occurrence de Vector. La longueur correspond au nombre d'éléments qui compose la liste d'initialisation.
  • Il est impossible de specifier si l'occurrence de Vector possède une longueur fixe. Utilisez à cet effet la propriété fixe.
  • Il risque de se produit des pertes de données ou des erreurs si les éléments transmis en tant que valeurs ne correspondent pas au type indiqué. Exemple :

Utilisation du constructeur Vector. < T >

Outre le constructeur Vector. < T > () et le constructeur de syntaxe de litteral Vector, vous disposez également de la fonction globale Vector. < T > () pour creer un objet Vector. La fonction globale Vector. < T > () est une fonction de conversion. Lorsque vous appelez la fonction globale Vector. < T > () , vous spécifiez le type de base du vecteur que la méthode renvoie. Vous transmettez un tableau indexé unique (occurrence de Array ou Vector) comme argument. La méthode renvoie alors un vecteur avec le type de base spécifique, contenant les valeurs dans l'argument du tableau source. Le code ci-dessous montre la syntaxe nécessaire pour appeler la fonction globale Vector. < T > () .

var friends:Vector. = Vector.([ "Bob", "Larry", "Sarah"]);

La fonction globale Vector.() exécute une conversion de type de base sur deux niveaux. D'abord, lorsqu'une occurrence de Array est transmise à la fonction, une occurrence de Vector est renvoyée. Ensuite, que le tableau source soit une occurrence de Array ou Vector, la fonction tente de convertir les éléments du tableau source en valeurs du type de base. La conversion utilise des règles standard de conversion des types de données ActionScript. Par exemple, le code suivant convertit les valeurs String du tableau source en nombres entiers dans le vecteur résultat. La partie décimale de la première ("1.5") est tronquée et la troisième valeur non numérique ("Waffles") est convertie en 0 dans le résultat :

var numbers:Vector.<int> = Vector.<int>([ "1.5", "17", "Waffles"]); trace(numbers); // output: 1,17,0 

S'il n'est pas possible de convertir un élément sourcequelconque, une erreur se produit.

Lorsque le code appelle la fonction globale Vector. T , si un élément du tableau source est une occurrence d'une sous-classe du type de base spécifique, l'élement est ajusté au vecteur résultat (aucune erreur ne se produit). L'utilisation de la fonction globale Vector. T est en fait le seul moyen de convertir un vecteur avec un type de base T en un vecteur avec un type de base qui est une super classe de T.

Insertion d'éléments de tableau

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

L'opérateur ([]) d'accès au tableau constitue le moyen le plus élémentaire d'ajouter un élément à un tableau indexé. Pour définir la valeur d'un élément de tableau indexé, utilisez le nom d'objet Array ou Vector et le nombre d'index du côté gauche d'une instruction d'affection.

Si un élément ne se trouve pas déjà à cette position d'index du tableau ou du vecteur, l'index est créé et la valeur y est stockée. Si une valeur existe à cet index, la nouvelle valeur replaces l'ancienne.

Un objet Array vous permet de creer un élément pour tout index. Cependant, avec un objet Vector, vous pouvez affecter uniquement une valeur à un index existant ou à l'index disponible suivant. Celui-ci correspond à la propriété length de l'objet Vector. Utilisez du code comme celui qui est presenté ci-dessous pour ajouter un nouvel élément à un objet Vector de la façon la plus sure :

myVector [myVector.length] = valueToAdd; 

Trois méthodes des classes Array et Vector, push(), unshift() et splice(), vous permettent d'insérer des éléments dans un tableau indexé. La méthode push() ajoute un ou plusieurs éléments à la fin d'un tableau. Ainsi, le dernier élément inséré dans le tableau à l'aide de la méthode push() aura le numéro d'index le plus élevé. La méthode unshift() insère un ou plusieurs éléments au début d'un tableau, qui est toujours au numéro d'index 0. La méthode splice() insère des éléments au niveau d'un index spécifique dans le tableau.

L'exemple suivant illustrer les trois méthodes. Un tableau appelé planets est créé pour trier les noms des planêtes par ordre de proximé par rapport au soleil. La méthode push() est tout d'abord appelée pour ajouter l'élement initial, Mars. Deuxièmement, la méthode unshift() est appelée pour insérer l'élement Mercury au début du tableau. Pour finir, la méthode splice() est appelée pour insérer les éléments Venus et Earth après Mercury, mais avant Mars. Le premier élément envoyé à splice(), l'entier 1, indique à l'insertion de début à l'index 1. Le deuxième argument envoyé à splice(), l'entier 0, indique qu'aucun élément ne doit être supprimé. Pour finir, les troisième et quatre arguments envoyés à splice(), Venus et Earth, sont les éléments à insérer.

var planets:Array = new Array(); planets.push("Mars"); // array contents: Mars planets.unshift("Mercury"); // array contents: Mercury, Mars planets.splice(1, 0, "Venus", "Earth"); trace(PLANES); // array contents: Mercury, Venus, Earth, Mars 

Les méthodes push() et unshift() renvoie toutes les deux un entier non signé qui représentée la longueur du tableau modifié. La méthode splice() renvoie un tableau vide lorsqu'elle est utilisée pour insérer des éléments, ce qui semble étrange mais comprehensible en raison de saversatilité. Vous pouvez utiliser la méthode splice() non seulement pour insérer des éléments dans un tableau, mais également pour en supprimer. Lorsque vous l'utilisez pour supprimer des éléments, la méthode splice() renvoie un tableau contenant les éléments suprimés.

Remarque: si une propriété fixe de l'objet Vector est définie sur true, le nombre total d' éléments du vecteur reste immuable. Si vous tentez d'ajouter un nouvel élément à un vecteur de longueur fixe à l'aide des techniques décrites ici, une erreur se produit.

Récupération des valeurs et suppression des éléments du tableau

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Utilisez l'opérateur ([]) d'accès au tableau pour récapérer la valeur d'un élément de la façon la plus simple. Pour récapérer la valeur d'un élément de tableau indexé, utilisez le nom d'objet Array ou Vector et le nombre d'index du côté droit d'une instruction d'aftection.

var myFavoriteSong:String = songTitles[3];

Il est possible d'essayer de récapérer une valeur à partir d'un tableau ou d'un vecteur à l'aide d'un index où aucun élément n'este. Dans ce cas, un objet Array renvoie la valeur non définie et un vecteur renvoie une exception RangeError.

Trois méthodes des classes Array et Vector, pop(), shift() et splice(), vous permettent de supprimer des éléments. La méthode pop() supprime un élément de la fin du tableau. En d'autres termes, elle supprime l'élement au niveau du nombre d'index le plus élevé. La méthode shift() supprime un élément du début du tableau, ce qui signifie qu'elle supprime toujours l'élement au nombre d'index 0. La méthode splice(), qui peut également être utilisée pour insérer des éléments, supprime un nombre arbitraire d'éléments en commencerant au nombre d'index indiqué par le premier argument envoyé à la méthode.

L'exemple suivant utilise les trois méthodes pour supprimer des éléments d'une occurrence d'Array. Un tableau nommé oceans est créé pour stocker les noms des océans. Certains noms dans le tableau sont des noms de lacs只不过 que des noms d'océans. Ils doivent donc être supprimés.

Premièrement, la méthode splice() est utilisé pour supprimer les éléments Arial et Superior, et insérer les éléments Atlantic et Indian. Le premier argument envoyé à splice(), l'entier 2, indique que l'opération doit commencer par le troisième élément dans la liste, qui est à l'index 2. Le deuxième argument, 2, indique que deux éléments doivent être supprimés. Les arguments restants, Atlantic et Indian, sont des valeurs à insérer à l'index 2.

Deuxièmement, la méthode pop() est utilisé pour supprimer le dernier élément dans le tableau, Huron. Et troisièmement, la méthode shift() est utilisé pour supprimer le premier élément dans le tableau, Victoria.

var oceans:Array = ["Victoria", "Pacific", "Aral", "Superior", "Indian", "Huron"];  
oceanssplice(2, 2, "Arctic", "Atlantic"); // replaces Aral and Superior  
oceans.pop(); // removes Huron  
oceans-shift(); // removes Victoria  
trace(oceans); // output: Pacific, Arctic, Atlantic, Indian 

Les méthodes pop() et shift() reivoient toutes les deux l'objet qui a été supprimé. Pour une occurrence de Array, le type de données de la valeur renvoyée est Object car les tableaux peuvent contérer des valeurs de n'importequel type de données. Pour une occurrence de Vector, le type de données de la valeur renvoyée est le type de base du vecteur. La méthode splice() renvoie un tableau ou un vecteur contenant les valeurs suprimées. Vous pouvez modifier l'exemple du tableau oceans ans de façon à ce que l'appel à splice() affecte le tableau renvoyé à une nouvelle variable de tableau, comme illustré dans l'exemple suivant :

var lakes:Array = oceanssplice(2, 2, "Arctic", "Atlantic"); trace(lakes); // output: Aral, Superior 

Il se peut que vous rencontres un code qui utilise l'opérateur delete sur un élément de l'objet Array. L'opérateur delete définit la valeur d'un élément de tableau sur undefined, mais il ne supprime pas l'élement du tableau. Par exemple, le code suivant utilise l'opérateur delete sur le troisième élément dans le tableau oceans, mais la longueur du tableau demeure à 5 :

var oceans:Array = ["Arctic", "Pacific", "Victoria", "Indian", "Atlantic"];  
delete oceans[2];  
trace(oceans); // output: Arctic, Pacific, Indian, Atlantic  
trace(oceans[2]); // output: undefined  
trace(oceans.length); // output: 5 

Vous pouvez tronquer un tableau ou un vecteur à l'aide d'une propriété length de tableau. Si vous définisse la propriété length d'un tableau indexé sur une longueur qui est moindre que la longueur actuelle du tableau, celui-ci est tronqué : tous les éléments stockés à des numéroes d'index supérieurs à la nouvelle valeur length, diminuée de 1, sont supprimés. Par exemple, si le tableau oceans était trié de telle façon que toutes les entrées valides se trouvaient au début du tableau, vous pourriez utiliser la propriété length pour supprimer les entrées de fin de tableau, comme l'indique le code ci-dessous :

var oceans:Array = ["Arctic", "Pacific", "Victoria", "Aral", "Superior"];  
oceans.length = 2;  
trace(oceans); // output: Arctic,Pacific 

Remarque: si une propriété fixe de l'objet Vector est définie sur true, le nombre total d' éléments du vecteur reste immuable. Si vous essayez de supprimer un élément d'un vecteur de longueur fixe ou de tronquer celui-ci à l'aide des techniques décrites ici, une erreur se produit.

Tri d'un tableau

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Trois méthodes, reverse(), sort() et sortOn(), vous permettent de modifier l'ordre d'un tableau indexé, soit en triant, soit en inversant l'ordre. Toutes ces méthodes modifiient le tableau existant. Le tableau ci-dessous résume ces méthodes et leurs comportements pour les objets Array et Vector :

MéthodeComportement d'ArrayComportement de Vector
reverse()Modifie l'ordre des éléments de telle sorte que le dernier élément devient le premier élément, le pénultième le deuxième, etc.Identique au comportement d'Array
sort()Vous permet de trier les éléments du tableau de diverses façon prédéfinies, comme l'ordre alphabetique ou numérique. Vous pouvez également spécifique un algorithme de tri personnalisé.Trie les éléments suivant l'algorithmme de tri personnelisé que vous spécifiez
sortOn()Vous permit de trier des objets qui ont une ou plusieurs propriétés en commun en spécifique la ou les propriétés à utiliser comme critères de tri.Non disponible dans la classe Vector

Méthode reverse()

La méthode reverse() ne prendaucun parametre et ne renvoie aucune valeur mais vouspermét de faire basculer l'ordre de votre tableau de son état actuel à l'ordre inverse. L'exemple suivant inverse l'ordre des océans répertoriés dans le tableau oceans :

var oceans:Array = ["Arctic", "Atlantic", "Indian", "Pacific"];

oceans.reverse();

trace(oceans); // output: Pacific,Indian,Atlantic,Arctic

Tri de base avec la méthode sort() ( classe Array uniquement)

Pour une occurrence d'Array, la méthode sort() réorganise les éléments dans un tableau à l'aide de l'ordre de tri par défaut. L'ordre de tri par défaut possède les caractéristiques suivantes :

Le tri est sensible à la casse, ce qui signifie que les majuscules précédent les minuscules. Par exemple, la lecture D precede la lecture b.
- Le tri est croissant, ce qui signifie que les codes de caractère bas (A, par exemple) précédent les codes de caractère élevés (B, par exemple).
Le tri place les valeurs identiques les une a cote des autres mais sans ordre particulier.
- Le tri est basé sur des chaînes, ce qui signifie que les éléments sont convertis en chaînes avant d'être comparés (par exemple, 10 précède 3 car la chaine "1" a un code de caractère inférieur à celui de la chaine "3").

Vous pouvez trier vos tableau en ignorant la casse ou par ordre decroissant. Vos pouze egalement trier les nombres de vos tableau par ordre numérique plusot que par ordre alphabétique. La methode sort () de la classe Array possede un parametre options qui vous permit de modifier chaque caractéristique de I'ordre de tri par defaut. Les options sont definies par un ensemble de constantes statiques dans la classe Array, comme indiqued dans la liste suivante :

  • Array.CASEINSENSITIVE : cette option permet d'ignorer la casse lors du tri. Par exemple, la lecture minuscule b précède la lettuce majuscule D.
  • Array.DESCENDING : cette option inverse le tri croissant par défaut. Par exemple, la lecture B précède la lecture A.
  • Array.UNIQUESORT : cette option permet d'arrêter le tri si deux valeurs identiques sont repérées.
  • Array.NUMERIC : cette option permet d'effectuer un tri numérique, de façon à ce que 3 précède 10.

L'exemple suivant met en évidence certaines de ces options. Un tableau appelé poets est créé. Il est trié à l'aide de plusieurs options.

var poets:Array = ["Blake", "cummings", "Angelou", "Dante"];  
poets.sort(); // default sort  
trace(poets); // output: Angelou,Blake,Dante,cummings  
poets.sort(Array.CASEINSENSITIVE);  
trace(poets); // output: Angelou,Blake,cummings,Dante  
poets.sort(Array.DESCENDING);  
trace(poets); // output: cummings,Dante,Blake,Angelou  
poets.sort(Array.DESCENDING | Array.CASEINSENSITIVE); // use two options  
trace(poets); // output: Dante,cummings,Blake,Angelou 

Tri personnalisé avec la méthode sort() (classes Array et Vector)

En plus du tri de base qui est disponible pour un objet Array, vous pouze également étabir une rège de tri personnalisé. Cette technique est la seule forme de méthode sort() disponible pour la classe Vector. Pour définir un tri personnalisé, vous rédigez une fonction de tri personnalisée et la transmettez comme argument à la méthode sort().

Par exemple, si vous avez une liste de noms dans laquelle chaque élément de liste contient le nom entier d'une personne mais que vous souhaitez trier la liste par nom de famille, vous devez utiliser une fonction de tri personnelisé pour analyser chaque élément et utiliser le nom de famille dans la fonction de tri. Le code suivant indique comment procéder avec une fonction personnalisée utilisée comme paramètre pour la méthode Array.sort():

var names:Array = new Array("John Q. Smith", "Jane Doe", "Mike Jones"); function orderLastName(a, b):int { var lastname: RegExp = /\b\S+\$/; var name1 = a.match(lastName); var name2 = b.match(lastName); if (name1 < name2) { return -1; } else if (name1 > name2) { return 1; } else { return 0; } } tracenames); // output: John Q. Smith, Jane Doe, Mike Jones names.sort(orderLastName); tracenames); // output: Jane Doe, Mike Jones, John Q. Smith 

La fonction de tri personnelé orderLastName() utilise une expression régulière pour extraire le nom de famille de chaque éléments à utiliser pour l'opération de comparaison. L'identifant de fonction orderLastName est l'unique paramètre utilisé lors de l'appel à la méthode sort () sur le tableau names. La fonction de tri accepte deux paramétres, a et b, car elle fonctionne sur deux éléments de tableau à la fois. La valeur renvoyée de la fonction de tri indique la manière dont les éléments doivent être triés :

  • Une valeur renvoyee de -1 indique que le premier paramètre, a, precede le second paramètre, b.
  • Une valeur renvoyee de 1 indique que le second paramètre, b, precede le premier, a.

  • Une valeur renvoyee de 0 indique que les éléments ont une précédence de tri équivalente.

Méthode sortOn() ( classe Array uniquement)

La méthode sortOn() est conçue pour des objets Array avec des éléments contenant des objets. Ces objets doivent avoir au moins une propriété en commun pouvant être utilisée comme clé de tri. L'utilisation de la méthode sortOn() pour des tableaux d'autres types provoque des résultats inattendus.

Remarque: la classe Vector ne contient pas de méthode sorton(). Cette méthode n'est disponible que pour les objets Array.

L'exemple suivant modifie le tableau poets de façon à ce que chaque élément soit un objet只不过 qu'une chaine.
Chaque objet contient à la fois le nom de famille du poète et sa date de naissance.

Vou puez utilise la methode sortOn() pour trier le tableau par la propriete born. La methode sortOn() definit deux parametes, fieldName et options. L'argument fieldName doit être spécifique en tant que chaine. Dans l'exemple suivant, la methode sortOn() est appelée avec deux arguments, "born" et Array.Numeric. L'argument Array.NUMERIC est utilisé pour vérifier que le tri est effectué par ordre numérique只不过 que par ordre alphabétique. Ceci est utile même lorsque tous les nombres ont le même nombre de chiffres car vous étés certain que le tri se fera comme prévu si un nombre compteant un nombre inférieur ou supérieur de chiffres est ensuite ajouté au tableau.

poets.sortOn("born", Array.NUMERIC);
for (var i:int = 0 . < poets.length; ++i) { trace(poets[i].name,poets[i].born); } /* output:
Wang 701
Dante 1265
Blake 1757
cummings 1894
Angelou 1928
*/

Tri sans modification du tableau d'origine ( classe Array uniquement)

Généralement, les méthodes sort() et sortOn() modifiert un tableau. Si vous souhaïez trier un tableau sans modifier le tableau existant, transmettez la constante Array. RETURNINDEXEDARRAY avec le paramètre options. Cette option indique aux méthodes de renvoyer un nouveau tableau qui reflète le tri et laïssé le tableau d'origineinchangé. Le tableau renvoyé par les méthodes est un tableau simple de nombres d'index qui reflète le nouvel ordre de tri et ne contientaucen élément du tableau d'origine.Par exemple,pour trier le tableaupoetspar année de naissance sans le modifier,incluezlaconstanteArray.RETNINDEXEDARRAY dans l'argumenttransmispourle parametreoptions.

L'exemple suivant stocke les informations d'index renvoyees dans un tableau nommé indices et utilise le tableau indices avec le tableau poets inchangé pour trier les poêtes dans l'ordre de leur année de naissance :

var indices:Array;  
indices = poets.sortOn("born", Array.NUMERIC | Array.RETNINDEXEDARRAY);  
for (var i:int = 0; i < indices.length; ++i)  
{  
    var index:int = indices[i];  
    trace(poets[index].name, poets[index].born);  
}  
/* output:  
Wang 701  
Dante 1265  
Blake 1757  
cummings 1894  
Angelou 1928  
*/ 

Interrogation d'un tableau

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Les quatre méthodes restantes des classes Array et Vector, concat(), join(), slice(), toString(), interrogent toutes le tableau sans le modifier. Les méthodes concat() et slice() renvoie toutes les deux de nouveaux tableaux, alors que les méthodes join() et toString() renvoie des chaînes. La méthode concat() prend un nouveau tableau ou une liste d' éléments comme arguments et le/la combine avec le tableau existant pour créé un tableau. La méthode slice() possède deux paramètres nommés startIndex et endIndex, et renvoie un nouveau tableau contenant une copie des éléments découvertes du tableau existant. La découverte commence avec l'objet à startIndex et se termine avec l'objet juste avant endIndex. Il convient d'insister : l'objet à endIndex n'est pas compris dans la valeur renvoyée.

L'exemple suivant utilise concat() et slice() pour creer des tableaux à l'aide d'éléments d'autres tableaux :

var array1:Array = ["alpha", "beta"];  
var array2:Array = array1.conscat("gamma", "delta");  
trace(array2); // output: alpha, beta, gamma, delta  
var array3:Array = array1CONSArray2);  
trace(array3); // output: alpha, beta, alpha, beta, gamma, delta  
var array4:Array = array3.slice(2, 5);  
trace(array4); // output: alpha, beta, gamma 

Voupeusutiliserlesmethodesjoin()ettostring()pourinterroglerel tableauerenvoyersoncontenu sousla forme d'une chaine.Siacaucunparametre n'estutilise pourla methodejoin(),lesdeuxmethodesecomportendefaconidentique:ellesrenvoientunechainecontenantuneliste de tous leselements du tableau,separésparuna virgule. La methodejoin(),contrairementàla methode tostring(),acceptepanparametre nommedelimiter,quipermet dechoisirlesymboleàutiliser comme séparateurentrechaque elementde la chaine renvoyee.

L'exemple suivant create un tableau nommé rivers et appelle à la fois join() et toString() pour renvoyer les valeurs dans le tableau sous la forme d'une chaine. La méthode toString() est utilisé pour renvoyer des valeurs séparées par une virgule (riverCSV), alors que la méthode join() est utilisé pour renvoyer des valeurs séparées par le caractère +.

var rivers:Array = ["Nile", "Amazon", "Yangtze", "Mississippi"];  
var riverCSV:String = rivers.toString();  
trace(riverCSV); // output: Nile, Amazon, Yangtze, Mississippi  
var riverPSV:String = rivers.join "+");  
trace(riverPSV); // output: Nile+Amazon+Yangtze+Mississippi 

Il existe un problème avec la méthode join(); toutes les occurrences de tableau et de vecteur imbriquées sont toujours renvoyées avec des valeurs séparées par des virgules, quel que soit le séparateur que vous spécifiez pour les éléments de tableau principaux, comme illustré dans l'exemple suivant:

var nested:Array = ["b","c","d"];

var letters:Array = ["a", nested, "e"];

var joined:String = letters.join(" ^+ ");

trace(joined); // output: a+b,c,d+e

Tableaux associatifs

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Un tableau associatif, parfois appelé hachage ou mappage, utilise des clés只得 qu'un index numérique pour organiser des valeurs stockées. Chaque clé dans un tableau associatif est une chaine unique qui est utilisée pour acceder à une valeur stockée. Un tableau associatif est une occurrence de la classe Object, ce qui signifie que chaque clé correspond à un nom de propriété. Les tableaux associatifs sont des collections non triées de paires de clés et de valeurs. Notre code ne doit pas s'attendre à ce que les clés d'un tel tableau seprésentent dans un ordre précis.

ActionScript 3.0 contient aussi un type avancé de tableau associatif appelé dictionnaire. Les dictionaries, qui sont des occurrences de la classe Dictionary dans le package flash.utils, utilisent des clés de tout type de données. En d'autres termes, les clés de dictionnaire ne sont pas limitées à des valeurs de type String.

Tableaux associats avec clés de chaine

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Deux méthodes permettent de creer des tableaux associatis dans ActionScript 3.0. La première consiste a utiliser une occurrence de Object. Celle-ci vous permit d'initialiser votre tableau avec un litteral d'objet. Une occurence de la classe Object, également appelée objet générique, fonctionne comme un tableau associatif. Chaque nom de propriété de l'objet générique devient la clé qui permet d'acceder à une valeur stockée.

L'exemple suivant create un tableau associatif appelé monitorInfo, à l'aide d'un littéral d'objet pour initialiser le tableau avec deux paires de clés et de valeurs :

var monitorInfo:Object = {type:"Flat Panel", resolution:"1600 x 1200"};

trace(monitorInfo["type"], monitorInfo["resolution"]);

// output: Flat Panel 1600 x 1200

Si vous n'avez pas besoin d'initialiser le tableau lors de la déclaration, vous pouvez utiliser le constructeur Object pour créé le tableau, comme suit :

var monitorInfo:Object = new Object();

Une fois que le tableau est créé à l'aide d'un littéral d'objet ou du constructeur de la classe Object, vous pouvez lui ajouter de nouvelles valeurs à l'aide de l'opérateur ([]) d'accès au tableau ou de l'opérateur point (.). L'exemple suivant ajoute deux nouvelles valeurs à monitorArray:

monitorInfo["aspect ratio"] = "16:10"; // bad form, do not use spaces

monitorInfocolors = "16.7 million";

trace(monitorInfo["aspect ratio"], monitorInfocolors);

// output: 16:10 16.7 million

La clé appelée aspect ratio contient un caractère d'espace. Cela est possible dans le cas de l'opérateur ([]) d'accès au tableau, mais avec l'opérateur point, une erreur se produit. L'utilisation d'espace dans le nom de vos clés n'est donc pas conseillée.

La seconde méthode pour creer un tableau associatif consiste à utiliser le constructeur Array (ou le constructeur d'une classe dynamique), puis à utiliser l'opérateur ([ ]) d'accès au tableau ou l'opérateur point (. ) pour ajouter les paires de clés et de valeurs au tableau. Si vous déclarez votre tableau associatif comme étant de type Array, vous ne pouvez pas utiliser de littéral d'objet pour l'initialiser. Ce code create un tableau associatif appelé monitorInfo à l'aide du constructeur Array, et ajoute les clés appelées type et resolution, ainsi que leurs valeurs :

var monitorInfo:Array = new Array();  
monitorInfo["type"] = "Flat Panel";  
monitorInfo["resolution"] = "1600 x 1200";  
trace(monitorInfo["type"], monitorInfo["resolution"]); // output: Flat Panel 1600 x 1200 

L'utilisation du constructeur Array pour creer un tableau associatif ne presente aucun avantage. Vous ne pouvez pas utiliser la propriété Array.length ou une méthode de la classe Array avec des tableaux associatifs, même si vous utilisez le constructeur Array ou le type de données Array. Il est préféable d'utiliser le constructeur Array pour creer des tableaux indexés.

Tableaux associats avec clés d'objet (dictionnaires)

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Vouss pouvez utiliser la classe Dictionary pour creer un tableau associatif qui utilise des objets pour les clés au lieu de chaînes. Ces tableaux sont parfois appelés dictionnaires, hachages ou mappages. Par exemple, supposez que vous avez une application qui détermine l'emplacement d'un objet Sprite selon son association avec un conteneur spécifique. Vous pouvez utiliser un objet Dictionary pour mapper chaque objet Sprite à un conteneur.

Le code suivant creé trois occurrences de la classe Sprite qui servent de clés pour l'objet Dictionary. La valeur GroupA ou GroupB est affectée à chaque clé. Les valeurs peuvent être de n'importequel type de données, mais dans cet exemple, GroupA et GroupB sont des occurrences de la classe Object. Vous pouvez ensuite acceder à la valeur associée à chaque clé avec l'opérateur d'accès au tableau ([]), comme illustré dans le code suivant :

import flash.display.Sprite;
import flash.utilsictionary;
var groupMap:Dictionary = new Dictionary();
// objects to use as keys
var spr1:Sprite = new Sprite();
var spr2:Sprite = new Sprite();
var spr3:Sprite = new Sprite();
// objects to use as values
var groupA:Object = new Object();
var groupB:Object = new Object();
// Create new key-value pairs in dictionary.
groupMap[spr1] = groupA;
groupMap[spr2] = groupB;
groupMap[spr3] = groupB;
if (groupId[spr1] = = groupA) { trace("spr1 is in groupA"); }
if (groupId[spr2] = = groupB) { trace("spr2 is in groupB"); }
if (groupId[spr3] = = groupB) { trace("spr3 is in groupB"); }

Itération avec des clés d'objet

Vouspouvez parcourir en boucle le contenu d'un objet Dictionary à l'aide d'une boucle for...in ou d'une boucle for each..in. Une boucle for...in vous permet d'effectuer une iteration en fonction des clés, tandis qu'une boucle for each..in vous permet d'effectuer une iteration en fonction des valeurs associées à chaque clé.

Utilisez la boucle for...in pour acceder directement aux clés d'objet d'un objet Dictionary. Vous pouze également acceder aux valeurs de l'objet Dictionary avec l'opérateur d'accès au tableau ([]). Le code suivant utilise l'exemple précédent du dictionnaire groupMap pour indiquer comment parcourir en boucle un objet Dictionary avec la boucle for...in:

for(varkey:Objectin groupMap)   
{ trace(key,groupMap[key]);   
}   
/\*output: [objectSprite][object Object] [object Sprite][object Object] [object Sprite][object Object] 

Utilisez la boucle for each..in pour acceder directement aux valeurs d'un objet Dictionary. Le code suivant utilise également le dictionnaire groupMap pour indiquer comment parcourir en boucle un objet Dictionary avec la boucle for each..in:

for each (var item:Object in groupMap) { trace(item); } /* output: [object Object] [object Object] [object Object] */ 

Clés d'objet et gestion de la mémoire

Adobe® Flash® Player et Adobe® AIR™ utilisent un système de nettoyage permettant de récapérer la mémoire qui n'est plus utilisé. Lorsque aucune ↔équence ne pointe vers un objet, ce dernier peut être nettoyé et la mémoire récapéree au prochain nettoyage. Par exemple, le code suivant create un objet et lui affecte une ↔équence à la variable myObject :

var myObject:Object = new Object();

Tant que des références à l'objet existent, le système de nettoyage ne recupère pas la mémoire que l'objet occupe. Si la valeur de myObject est modifiée et qu'elle pointe vers un autre objet ou qu'elle est définie sur null, la mémoire occupée par l'objet d'origine peut être nettoyée. Néanmoins, aucune autre référence à l'objet d'origine ne doit exister.

Si vous utilisez myObject comme clé dans un objet Dictionary, vous creez une autre référence à l'objet d'origine. Par exemple, le code suivant créée deux références à un objet, la variable myObject et la clé dans l'objet myMap :

import flash.utilsDictionary;

var myObject:Object = new Object();  
var myMap:Dictionary = new Dictionary();  
myMap[myObject] = "foo"; 

Pour que l'objet lié référencé par myObject puisse être nettoyé, vous devez supprimer toutes ses références. Dans ce cas, vous devez modifier la valeur de myObject et supprimer la clé myObject de myMap, comme indiqué dans le code suivant:

Voupez egalent utilise le parametre useWeakReference du constructeur Dictionary pour que toutes les clés de dictionnaire deviennent des reférences faibles. Le système de nettoyage ignore les reférences faibles. Par conséquent, un objet n'ayant que des reférences faibles peut être nettoyé. Par exemple, dans le code suivant, vous n'avez pas besoin de supprimer la clé myObject de myMap pour que lobjet puisse être nettoyé:

import flash.utilsDictionary;
var myObject:Object = new Object();
var myMap:Dictionary = new Dictionary(true);
myMap[myObject] "foo";
myObject null; // Make object eligible for garbage collection.

Tableaux multidimensionnels

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Les tableaux multidimensionnels contiennent d'autres tableaux comme éléments. Prenons par exemple une liste de tâches stockée sous forme de tableau indexé de chaînes :

Pour stocker une liste de tâches distincte pour chaque jour de la période, vous pouvez créé un tableau multidimensionnel avec un élément pour chaque jour. Chaque élément contient à son tour un tableau indexé (semblable au tableau tasks) qui stocke la liste des tâches. Vous pouvez utiliser n'importe qu'elle combinaison de tableaux indexés ou associatifs dans des tableaux multidimensionnels. Les exemples des sections suivantes utilisent soit deux tableaux indexés soit un tableau associatif de tableaux indexés. Vous pouvez essayer les autres combinaisons pour vous exercer.

Deux tableaux indexés

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Lorsque you utilisez deux tableaux indexés, vous pouvez visualiser le résultat sous forme de tableau ou de feuille de calcul. Les éléments du premier tableau représentent les lignes alors que les éléments du second tableau représentent les colonnes.

Par exemple, le tableau multidimensionnel suivant utilise deux tableaux indexés pour suivre des listes de tâches pour chaque jour de la semaine. Le premier tableau, masterTaskList, est créé à l'aide du constructeur de classe Array.

Chaque élément du tableau représenté un jour de la semaine, avec l'index 0 représentant lundi et l'index 6 dimanche. Ces éléments peuvent être considérés comme les lignes du tableau. Vous pouvez créé la liste de tâches de chaque jour en affectant un littéral de tableau à chacun desSept éléments que vous créez dans le tableau masterTaskList. Les litteraux de tableau représentent les colonnes du tableau.

var masterTaskList:Array = new Array();  
masterTaskList[0] = ["wash dishes", "take out trash"];  
masterTaskList[1] = ["wash dishes", "pay bills"];  
masterTaskList[2] = ["wash dishes", "dentist", "wash dog"];  
masterTaskList[3] = ["wash dishes"];  
masterTaskList[4] = ["wash dishes", "clean house"];  
masterTaskList[5] = ["wash dishes", "wash car", "pay rent"];  
masterTaskList[6] = ["mow lawn", "fix chair"]; 

Vou puez acceder a des elements particuliers sur toute listedes taches a l'aide de I'opérateur d'accès au tableau ([]). Le premier groupe de crochets representation le jour de la semaine et le second la listede taches pour ce jour. Par exemple, pour recupérer la seconde tache de la listede du mercredi, utilisez d'abord l'index 2 pour mercredi puis utilisez l'index 1 pour la seconde tache dans la listede.

trace(masterTaskList[2][1]); // output: dentist

Pour récapérer la première tâche de la liste du dimanche, utilisez l'index 6 pour dimanche et l'index 0 pour la première tâche sur la liste.

trace(masterTaskList[6][0]); // output: mow lawn

Tableau associatif avec un tableau indexé

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Pour facilitier l'accès aux tableaux, vous pouvez utiliser un tableau associatif pour les jours de la semaine et un tableau indexé pour les listes de tâche. Les tableaux associatisifs vous permettent d'utiliser une syntaxe à point lorsque vous vous reférez à un jour particulier de la semaine, mais nécessitent un traitement d'exécution supplémentaire pour acceder à chaque élément du tableau associatif. L'exemple suivant utilise un tableau associatif comme base d'une liste de tâches, avec une paire de clés et de valeurs pour chaque jour de la semaine :

var masterTaskList:Object = new Object();  
masterTaskList["Monday"] = ["wash dishes", "take out trash"];  
masterTaskList["Tuesday"] = ["wash dishes", "pay bills"];  
masterTaskList["Wednesday"] = ["wash dishes", "dentist", "wash dog"];  
masterTaskList["Thursday"] = ["wash dishes"];  
masterTaskList["Friday"] = ["wash dishes", "clean house"];  
masterTaskList["Saturday"] = ["wash dishes", "wash car", "pay rent"];  
masterTaskList["Sunday"] = ["mow lawn", "fix chair"]; 

La syntaxe à point rend le code plus lisible car elle évite d'utiliser plusieurs groupes de crochets.

trace(masterTaskList.Wednesday[1]); // output: dentist trace(masterTaskList.Sunday[0]);// output: mow lawn 

Voupez parcouir en boucle la liste des tâches en utilisant une boucle for...in, mais vous devez utiliser l'opérateur d'accès au tableau ([]), en lieu et place de la syntaxe à point, pour acceder à la valeur associée à chaque clé. Etant donné que masterTaskList est un tableau associatif, les éléments ne sont pas nécessairement récuperés dans l'ordre que vous attendez, comme l'indique l'exemple suivant:

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La classe Array ne possè de aucune méthode intégrée pour effectuer des copies de tableaux. Vous pouvez créé une copie simple d'un tableau en appelant la méthode concat() ou slice() sans arguments. Dans une copie simple, si le tableau d'origine a des éléments qui sont des objets, seules les références aux objets sont copées (et non les objets). La copie pointe vers les mêmes objets que l'original. Tout changement effectué sur les objets apparait dans les deux tableaux.

Dans une copie en profondeur, les objets se trouvant dans le tableau d'origine sont copés également de façon à ce que le nouveau tableau ne pointe pas vers les mêmes objets que le tableau d'origine. La copie en profondeur exige plus d'une ligne de code, ce qui nécessite généralement la création d'une fonction. Une telle fonction peut être créé comme fonction d'utilitaire globale ou comme méthode d'une sous-classe Array.

L'exemple suivant définit une fonction appelée clone() qui effectue une copie en profondeur. L'algorithmme est issu d'une technique de programmation Java courante. La fonction create une copie en profondeur en sérieisant le tableau en une occurrence de la classe ByteArray puis en relisant le tableau dans un nouveau tableau. Cette fonction accepte un object de façon à ce qu'il puisse être utilisé à la fois avec des tableaux indexés et des tableaux associatifs, comme indiqué dans le code suivant :

import flash.utils.ByteArray;
function clone.source:Object):* { var myBA:ByteArray newByteArray(); myBA.writeObject.source); myBA.position = 0 return(myBA.readObject());
}

Extension de la classe Array

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La classe Array est l'une des classes de base non finale, c'est-à-dire que vous pouvez创建工作 sous-classe d'Array. Cette section décrit comment创建工作 une sous-classe d'Array et décrit les problèmes pouvant se poser pendant le processus.

Comme mentionné précédement, les tableaux dans ActionScript ne sont pas typés, mais vous pouvez créé une sous-classe d'Array qui accepte des éléments d'un seul type de données. L'exemple fourni dans les sections suivantes définit une sous-classe Array appelée TypedArray qui limite ses éléments à des valeurs du type de données indiqué dans le premier paramètre. La classe TypedArray estprésentée comme un exemple de la façon dont la classe Array est étendue et risque de ne pas être adaptée à des fins de production pour différentes raisons. Premièrement, la vérification du type a lieu lors de l'exécution只不过 que de la compilation. Deuxièmement, lorsqu'une méthode TypedArray rencontres une incompatibilité, elle est ignorée et aucune exception n'est renvoyée, même si vous pouvez facilement modifier les méthodes pour renvoyer des exceptions. Troisièmement, la classe ne peut pas empêcher l'utilisation de l'opérateur d'accès au tableau pour insérer des valeurs de n'importe quel type dans le tableau. Quatrièmement, le style de codage privilégie la simplicité par rapport à l'optimisation des performances.

Remarque : vous pouvez utiliser la technique décrite ici pour creer un tableau typé. Cependant, utiliser un objet Vector constitue une meilleure démarche. Une occurrencie de Vector est un veritable tableau typé. Elle dépasse la classe Array ou toute sous-classe par ses performances et ses améliorations. Une illustration de la création d'une sous-classe Array constitue l'objet de cette description.

Déclaration de la sous-classes

Utilisez le mot-clé extends pour indiquer qu'une classe est une sous-classe d'Array. Une sous-classe d'Array doit utiliser l'attribut dynamic, comme la classe Array. Autrement, votre sous-classe ne fonctionne pas correctement.

Le code suivant représenté la définition de la classe TypedArray, qui comporte une constante contenant le type de données, une méthode de constructeur et les quatre méthodes permettant d'ajouter des éléments au tableau. Le code pour chaque méthode est omis dans cet exemple, mais il est décrit de façon détaillée dans les sections qui suivent :

public dynamic class TypedArray extends Array { private constdataType:Class; public functionTypedArray(.args){} AS3overridefunctionconcat(.args):Array{} AS3overridefunctionpush(.args):uint{} AS3overridefunctionsplice(.args){} AS3overridefunctionunshift(.args):uint{} }

Les quatre méthodes de remplacement utilisent l'espace de nom AS3 au lieu de l'attribut public car cet exemple suppose que l'option -as3 du compilateur est définie sur true et l'option -es du compilateur sur false. Il s'agit des paramétres par défaut pour Adobe Flash Builder et AdobeFlashProfessional.

Si vous étés un développement expérimenté et que vous préférez utiliser l'héritage de prototype, vous pouvez apporter deux changements mineurs à la classe TypedArray afin qu'elle compile avec l'options -es du compilerer définitie sur true. Commencez par supprimer toutes les occurrences de l'attribut override et remplacez l'espace de nom AS3 par l'attribut public. Remplacez ensuite Array.proto type pour les quatre occurrences de super.

ConstructeurTypedArray

Le constructeur de sous-classe pose un défi intéérissant car il doit accepter une liste d'arguments de longueur arbitraire. Il s'agit de savoir comment transférer les arguments au superconstructeur pour creer le tableau. Si vous transmettez la liste des arguments sous forme d'un tableau, le superconstructeur le considère comme un seul argument de type Array et le tableau résultat a toujours une longueur d'1 élément. Le transfert de-listes d'arguments se fait généralement au moyen de la méthode Function.apply(), qui prend un tableau d'arguments comme second paramètre mais le convertit en une liste d'arguments lors de l'exécution de la fonction. Malheureusement, vous ne pouvez pas utiliser la méthode Function.apply() avec des constructeurs.

La seule solution est de recreer la logique du constructeur Array dans le constructeur TypedArray. Le code suivant indique l'algorithme utilisé dans le constructeur de classe Array, que vous pouvez réutiliser dans votre constructeur de sous-classe Array:

public dynamic class Array
{ public function Array(..args) { var n:uint = args.length if (n = =1\& \& (args[0] is Number)) { var dlen:Number = args[0]; varulen:uint = dlen; if (ulen != dlen) { throw new RangeError("Array index is not a 32-bit unsigned integer (" ^+ dlen+")); } length = ulen; } else { length = n; for(var i:int=0;i<n;i++) { this[i] = args[i] } } }

Le constructeur TypedArray partage une grande partie du code du constructeur Array, avec seulement quatre changements apportés au code. Premièrement, la liste des paramètres comprend un nouveau paramètre obligatoire de type Class qui permet d'indiquer le type de données du tableau. Deuxièmement, le type de données transmis au constructeur est affecté à la variable dataType. Troisièmement, dans l'instruction else, la valeur de la propriété length est affectée après la boucle for de façon à ce que length comprend uniquement des arguments du type correct. Quatrièmement, le corps de la boucle for utilise la version de remplacement de la méthode push() de façon à ce que seuls des arguments du type de données correct soient ajoutés au tableau. L'exemple suivant présente la fonction constructeur TypedArray :

public dynamic class TypedArray extends Array
{ private vardataType:Class; public function TypedArray(typeParam:Class,..args) {dataType = typeParam; var n:uint = args.length if (n = = 1\& \& (args[0] is Number)) { var dlen:Number = args[0]; varulen:uint = dlen if (ulen != dlen) { throw new RangeError("Array index is not a 32-bit unsigned integer (" ^+ dlen+")") } length = ulen; } else { for(var i:int = 0 ;i<n;i++) { //type check done in push() this.push(args[i]) } length = this.length; } }

Méthodes de remplacement TypedArray

La classe TypedArray remplace les quatre méthodes de la classe Array qui permettent d'ajouter des éléments à un tableau. Dans chaque cas, la méthode de remplacement ajoute une vérification du type qui empêche d'ajouter des éléments qui ne sont pas du type de données correct. Chaque méthode appelle ensuite sa version de superclasse.

La méthode push() parcourt en boucle la liste des arguments avec une boucle for.. in et effectue une vérification du type sur chaque argument. Les arguments qui ne sont pas de type correct sont supprimés du tableau args avec la méthode splice(). Une fois que la boucle for.. in se termine, le tableau args contient des valeurs de type dataType uniquement. La version de super classe de push() est ensuite appelée avec le tableau args mis à jour, comme indiqué dans le code suivant :

AS3 override function push(...args):uint  
{  
    for (var i:* in args)  
    {  
        if (!(args[i] isdataType))  
            {  
                args.splice(i,1);  
            }  
    }  
    return (super.push.apply(this, args));  
} 

La méthode concat() create aTypedArray temporary appelé passArgs pour stocker les arguments soumis à la vérification de type. Ceci permet de réutiliser le code de vérification de type qui existe dans la méthode push(). Une boucle for...in effectue une iteration sur le tableau args et appelle push() sur chaque argument. Etant donné que passArgs est typé sous la forme TypedArray, la version TypedArray de push() est executée. La méthode concat() appelle ensuite sa version de super classe, comme indiqué dans le code suivant:

AS3 override function concat(...args):Array  
{  
    var passArgs:TypedArray = new Array(dataType);  
    for (var i:* in args)  
    {  
        // type check done in push()  
        passArgs.push(args[i]);  
    }  
    return (super_concat.apply(this, passArgs));  
} 

La méthode splice() prend une liste d'arguments arbitraire, mais les deux premiers arguments se refèrent toujours à un numéro d'index et au nombre d'éléments à supprimer. C'est pourquoi la méthode de remplacement splice() effectue la vérification de type uniquement pour les éléments du tableau args dans les positions d'index 2 ou supérieures. Il estMLSIGRIGRIGRIGRIGRIGRIGRIGRIGRIGRIGRIGRIGRIGRIGRIGRIGRIGRIGRIGRIGRIGRIGRIGRIGRIGRIGRIGRIGRIGRIGRIGRIGRIGRIGRIGRIGRIGRIGRIGRIGRIGRIGRIGRIGRIGRIGRIGRIGRIGRIG RIG RIG RIG RIG RIG RIG RIG RIG RIG RIG RIG RIG RIG RIG RIG RIG RIG RIG RIG RIG RIG RIG RIG RIG RIG RIG RIG RIG RIG RIG RIG RIG RIG RIG RIG RIG RIG RIG RIG RIG RIG RIG RIG RIG RIG RIG RIG RIG RIG RIG

AS3 override function splice(...args):*
{ if(args.length 2) { for(var i:int = 2 ;i< args.length; i + + ) { if(!(args[i]is dataType)) { args.ssplice(i,1); } } } return (super.spline.apply(this, args));
}

La méthode unshift(), qui ajoute des éléments au début d'un tableau, accepte une liste d'arguments arbitraire également. La méthode de remplacement unshift() utilise un algorithme trèssemblable à celui utilisé par la méthode push(), comme indiqué dans le code suivant:

AS3 override function unshift(...args):uint  
{  
    for(var i:* in args)  
    {  
        if (!(args[i] isdataType))  
            {  
                argssplice(i,1);  
            }  
        }  
    return (super_unshift.apply(this, args));  
} 

Exemple de tableau : PlayList

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

L'exemple PlayList présente les techniques d'utilisation des tableaux, dans le contexte d'une application de lecture musicale qui gère une liste de chansons. Ces techniques sont les suivantes :

  • Création d'un tableau indexé
  • Ajout d' éléments à un tableau indexé
    Tri d'un tableau d'objets en fonction de différentes propriétés, à l'aide d'options de tri différents
    Conversion d'un tableau en une chaine séparée par des caractères

Pour obtenir les fichiers d'application de cet exemple, voir

www.adobe.com/go/learn_programmingAS3samplesflash_fr. Les fichiers d'application PlayList se trouvent dans le

dossier Samples/PlayList. L'application se compose des fichiers suivants :

FichierDescription
PlayList.mxml ou PlayList.flaFichier d'application principal dans Flash (FLA) ou Flex (MXML).
com/example/programmingas3/playlist/PlayList.asClasse représentant une liste de morceaux. Elle utilise un tableau pour enregister la liste et gère le tri des éléments de la liste.
com/example/programmingas3/playlist/Song.asObjet de valeur représentant des informations sur une seule chanson. Les éléments gérés par la classe PlayList sont des occurrences Song.
com/example/programmingas3/playlist/SortProperty.asPseudo-étúnération dont les valeurs disponibles représentent les propriétés de la classe Song en fonction desquilles une liste d'objets Song peut être triée.

Présentation de la classe PlayList

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La classe PlayList gère un ensemble d'objets Song. Elle a des méthodes publiques qui permettent d'ajouter une chanson à la liste de lecture (la méthode addSong()) et de trier les chansons dans la liste (la méthode sortList)). En outre, la classe comprend une propriété d'accesseur en lecture seule, songList, qui permet d'acceder au groupe de chansons dans la liste de lecture. En interne, la classe PlayList conserve une trace de ses chansons à l'aide d'une variable Array privée:

public class PlayList
{ private var _songs:Array; private var _currentSort:SortProperty = null; private var _needToSort:Boolean = false; }

En plus de la variable Array Songs utilisé par la classe PlayList pour conserver une trace de sa liste de chansons, deux autres variables privées vérifié si la liste doit être triée (_needToArray) et contrôle l'article sur laquelle est basé le tri de la liste de chansons à un moment donné (_currentSort).

Comme avec tous les objets, lorsque vous avez déclaré une occurrence de Array, vous n'vez effectué que la moitié du travail consistant à creator un tableau. Avant d'acceder à des méthodes ou à des propriétés d'une occurrence de Array, cette dernière doit être instanciée dans le constructeur de la classe PlayList.

public function PlayList()
{
    this._songs = new Array();
    // Set the initial sorting.
    this.sortList(SortProperty.TITLE);
} 

La première ligne du constructeur instancie la variable _songs pour qu'elle puisse etre utilisée. En outre, la methode sortList() est appelée pour définir la propriete de tri initiale.

Ajout d'une chanson à la liste

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Lorsqu'un utilisateur ajoute une nouvelle chanson dans l'application, le code dans le formulaire de saisie des données appelle la méthode addSong() de la classe PlayList.

A l'intérieur de addSong(), la méthode push() du tableau_songs est appelée. Ceci permet d'ajouter l'objet Song transmis à addSong() en tant que nouvel élément dans ce tableau. Avec la méthode push(), le nouvel élément est ajouté à la fin du tableau, indépendamment du tri appliqué précédemment. Ceci signifie qu'une fois que la méthode push() a été appelée, la liste des chansons risque de ne plus être triée correctement. Par conséquent, la variable _needToSort est définié sur true. Théoriumplement, la méthode sortList() pourrait être appelée immidiatement afin d'éviter de vérifier si la liste est triée ou non à un moment donné. En pratique, cependant, la liste des chansons n'a pas besoin d'être triée jusqu'àu moment précédent immidiatement sa récupération. En retardant l'opération de tri, l'application n'effectue pas de tri inutile si, par exemple, plusieurs chansons sont ajoutées à la liste avant sa récapération.

Tri de la liste de chansons

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Etant donné que les occurrences Song gérées par la liste de lecture sont des objets complexes, les utilisateurs de l'application peuvent trier la liste de lecture en fonction de différentes propriétés (titre de la chanson ou année de publication, par exemple). Dans l'application PlayList, le tri de la liste des chansons s'effectue en trois étapes : identification de la propriété sur laquelle est basé le tri de la liste, indication des options de tri à utiliser lors du tri en fonction de cette propriété et exécution du tri.

Propriétés de tri

Un objet Song conserve la trace de plusieurs propriétés, notamment le titre de la chanson, l'artiste, l'année de publication, le nom du filchier et un ensemble de genres sélectionné par l'utilisateur auquel la chanson appartient. Seules les trois premières propriétés sont pratiques pour le tri. Dans un souci de commodité pour les développpeurs, l'exemple inclut la classe SortProperty, qui agit comme une enumeration avec des valeurs représentant les propriétés disponibles pour le tri.

public static const TITLE:SortProperty = new SortProperty("title");
public static const ARTIST:SortProperty = new SortProperty("artist");
public static const YEAR:SortProperty = new SortProperty("year"); 

La classe SortProperty contient trois classes, TITLE, ARTIST et YEAR. Chacune d'elles stocke une chaine comportant le nom de la propriété de la classe Song pouvant être utilisé pour le tri. Chaque fois qu'une propriété de tri est indiquée dans le reste du code, le membre de l'énumération est utilisé. Par exemple, dans le constructeur PlayList, la liste est triée initialement en appelant la méthode sortList(), comme suit :

// Set the initial sorting.  
this.sortList(SortProperty.TITLE); 

Etant donne que la propriété de tri est spécifiée sous la forme SortProperty. TITLE, les chansons sont triées par titre.

Tri par propriété et définition d'options de tri

La classe PlayList trie la liste de chansons dans la méthode sortList(), comme suit :

/** * Sorts the list of songs according to the specified property.
*/
public function sortListsortedProperty:SortProperty):void
{ ... var sortOptions:uint; switch (sortProperty) { case SortProperty.TITLE: sortOptions = Array.CASEINSENSITIVE; break; case SortProperty.ARTIST: sortOptions = Array.CASEINSENSITIVE; break; case SortProperty.YEAR: sortOptions = Array.NUMERCIC; break; } // Perform the actual sorting of the data. this._songs.sortOn(sortProperty.propertyName, sortOptions); // Save the current sort property. this._currentSort = sortProperty; // Record that the list is sorted. this._needToSort = false;

Lors du tri par titre ou par artiste, il est préférible d'effectuer un tri par ordre alphabétique. En revanche, lors du tri par année, il est plus logique d'effectuer un tri numérique. L'instruction switch sert à définir l'options de tri appropriée, stockée dans la variable sortOptions, en fonction de la valeur indiquée dans le paramètre sortProperty. Ici encore, les membres de l'énumération nommés sont utilisés pour faire la différence entre les propriétés,只不过 que les valeurs absolues.

Une fois que vous avez déterminé la propriété et les options de tri, le tableau _songs est trié en appelant sa méthode sortOn(), en transmettant ces deux valeurs comme paramètres. La propriété de tri est enregistrée et la liste des chansons est triée.

Combaison d' éléments de tableau en une chaine séparée par des caractères

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Cet exemple utilise non seulement un tableau pour conserver la liste des chansons dans la classe PlayList mais également des tableaux dans la classe Song pourGERer la liste des genres auxquels une chanson apparient. Considerons ce fragment de code issu de la definition de la classe Song :

Lors de la création d'une occurrence de Song, le paramètre genres utilisé pour spécifique le genre (ou les genres) auquel la chanson apparait est défini comme occurrence d'Array. Ainsi, vous pouvez regrouper plusieurs genres en une seule variable qui peut être transmise au constructeur. Néanmoins, la classe Song conserve, en interne, les genres dans la variable privée __genres sous la forme d'une occurrence de String séparée par des points-virgules. Le paramètre Array est converti en une chaîne séparée par des points-virgules en appelant sa méthode join() avec la valeur de chaîne littérale "; " comme séparateur spécifique.

De la même façon, les accesseurs genres permettent de définir ou de récapérier des genres sous la forme d'un tableau :

L'accesseur genresset se comporte exactement comme le constructeur ; il accepte un tableau et appelle la méthode join() pour la convertir en une chaine séparée par des points-virgules. L'accesseur get effectue l'opération inverse : la méthode split() de la variable __genres est appelée. Elle divise la chaine en un tableau de valeurs utilisant le séparateur spécifique (la valeur de chaine littérale "; " comme précédemment).

Chapitre 4 : Gestion des erreurs

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

« Gérer » une erreur signifie que vous intégrrez des fonctions logiques à l'application pour réagir à une erreur ou la corriger. Les erreurs sont généres lors de la compilation d'une application ou lors de l'exécution d'une application compilation. Lorsque l'application gère les erreurs, il se produit une réaction à l'erreur. Il arrive en revanche qu'une erreur soit ignorée (auquel cas le processus à l'origine de l'erreur échoue silencieusement). La gestion des erreurs, lorsqu'elle est utilisée correctement, protège votre application et ses utilisateurs contre un comportement inattendu.

Cependant, la gestion des erreurs est une catégorie large qui englobe la réponse à de nombreux types d'erreurs générées lors de la phase de compilation ou lors de l'exécution d'une application. Nous allons passer en revue la gestion des erreurs d'exécution (renvoyées lors de l'exécution d'une application), les différents types d'erreurs générés et les avantages du système de gestion des erreurs d'ActionScript 3.0.

Principes de base de la gestion des erreurs

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Une erreur d'exécution est une erreur qui se produit dans votre code ActionScript et qui empêche le contenu ActionScript de s'executer comme prévu. Pour assurer l'exécution correcte du code ActionScript du point de vue de l'utilisateur, écrivez le code dans l'application qui gère l'erreur (la corrige, la contourne ou informe au moins l'utilisateur qu'elle a eu lieu). Ce processus est appelé gestion des erreurs.

La gestion des erreurs est une catégorie large qui englobe la réponse à de nombreux types d'erreurs générées lors de la phase de compilation ou lors de l'exécution d'une application. Les erreurs qui se produit lors de la compilation sont souvent plus facies à identifier. Corrigez-les pour terminer la création d'un fichier SWF.

Les erreurs d'exécution peuvent être difficiles à détecter car elles se produit lorsqu'el code erroné est exécuté. Si un segment de votre programme contient plusieurs branches de code, telle une instruction if...then...else, testez toutes les conditions possibles, avec toutes les valeurs en entrée susceptibles d'être utilisées par un utilisateur réel, pour confirmer que le code ne contient pas d'erreur.

Les erreurs d'exécution peuvent être divisées en deux catégories : les erreurs de programme sont des erreurs dans votre code ActionScript (specification du type de données incorrect pour un paramètre de méthode, par exemple) ; les erreurs logiques sont des erreurs dans la logique (le contrôle des données et la manipulation des valeurs) de votre programme (utilisation de la formule incorrecte pour calculer les taux d'intérêt dans une application bancaire, par exemple). Encore une fois, ces deux types d'erreurs peuvent souvent être détectés et corrigés à l'avance en testant attentivement votre application.

Il serait idéal d'identifier et de supprimer toutes les erreurs de votre application avant de la dette à la disposition des utilisateurs finaux. Cependant, toutes les erreurs ne peuvent pas être prévues ni évitées. Supposons, par exemple, que l'actionScript charge des informations depuis un site Web particulier sur lequel vous n'avez aucurn contrôle. Si ce site Web n'est pas disponible, la partie de l'action qui dépend de ces données externes ne se comporte pas correctement. L'aspect primordial de la gestion des erreurs consiste à anticiper ces cas de figure et à les traiter judiciausement. Il est préféable que l'exécution de l'action ne soit pas interrompue ou, tout du moins, qu'un message indique à l'utilisateur pourquoi elle ne fonctionne pas.

Les erreurs d'exécution sont représentées de deux façon dans ActionScript :

  • Classes d'erreur : de nombreuses erreurs sont associées à une classe Error. Lorsqu'une erreur se produit, le moteur d'exécution Flash (Flash Player ou Adobe AIR, par exemple) créé une occurrence de la classe Error spécifique associée à cette erreur. Your code peut utiliser les informations contenues dans cet object erreur pour donner une réponse appropriée à l'erreur.
  • Evénements d'erreur : il arrive qu'une erreur se produit lorsque le moteur d'exécution Flash déclencherait normalement un événement. Si tel est le cas, un événement d'erreur est alors déclenché. Chaque événement d'erreur étant associé à une classe, le moteur d'exécution de Flash transmet une occurrence de cette classe aux méthodes enregistrées auprès de l'événement d'erreur.

Pour déterminer si une méthode donnée peutdéclencher une erreur ou un événement d'erreur, voir la rubrique correspondante dans le manuel Guide de référence ActionScript 3.0 pour la plate-forme Adobe Flash.

Concepts important et terminologie

La liste de référence suivante content des termes importants relatifs à la programmation de routines de gestion des erreurs :

Asynchrone Commande de programme telle qu'un appel de méthode qui ne fournit pas un résultat immediat, mais qui produit un résultat (ou une erreur) sous la forme d'un événement.

Capture Lorsqu'une exception (une erreur d'exécution) se produit et que votre code la découvert, ce dernier la capture. Lorsqu'une exception est capturée, le moteur d'exécution Flash cesse d'indiquer à un autre code ActionScript que l'exception s'est produit.

Version de débogage Version spéciale du moteur d'exécution Flash, telle que la version de débogage de Flash Player ou l'application de débogage du lanceur AIR (ADL), qui contient le code requis pour averrir les utilisateurs de la présence d'erreurs d'exécution. Dans la version standard de Flash Player ou Adobe AIR (celle que possèdent la plupart des utilisateurs), les erreurs qui ne sont pas générées par toute code ActionScript sont ignorées. Dans les versions de débogage (intégrées à Adobe Flash CS4 Professional et Adobe Flash Builder), un message d'advertisement apparait lorsqu'une erreur non générée se produit.

Exception Erreur qui se produit lorsqu'une application est en cours d'exécution et que le moteur d'exécution Flash ne peut pas la résoudre seul.

Renvoi Lorsque votre code capture une exception, le moteur d'exécution Flash)cesse de signaler l'exception à d'autres objets. S'il est important pour d'autres objets que l'exception leur soit signalée, le code doit renvoyer l'exception pour recommencer le processus de notification.

Synchrone Commande de programme (un appel de méthode, par exemple) qui fournit un résultat immédiat (ou qui renvoie immédiatement une erreur), ce qui signifie que la réponse peut être utilisé dans le même bloc de code.

Envoi Le fait de signaler au moteur d'exécution Flash (et par conséquent, à d'autres objets et au code ActionScript) qu'une erreur s'est produit s'appeille envoyer une erreur.

Types d'erreurs

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Lorsque vous développpez et executez des applications, vous rencontres différents types d'erreurs et de termes. La liste suivante présente les principaux termes et types d'erreurs :

  • Erreurs de compilation : générées par le compilateur ActionScript lors de la compilation du code. Les erreurs de compilation ont lieu lorsque des problèmes de syntaxe dans votre code empêchent de créé votre application.
  • Erreurs d'exécution : généres lorsque vous exécutez votre application après l'avoir compilation. Les erreurs d'exécution représentent des erreurs qui se produit lors de la lecture d'un filchier SWF dans un moteur d'exécution Flash tel qu'Adobe Flash Player ou Adobe AIR. Dans la plupart des cas, il est possible de gérer les erreurs d'exécution au moment où elles se produit, de les signaler à l'utilisateur et de prendre les mesures requises pour poursuivre l'exécution de l'application. S'il s'agit d'une erreur grave (impossibilité de se connecter à un site Web distant ou de charger des données), vous pouvez utiliser la gestion des erreurs pourmettre fin à l'application en douceur.
  • Erreurs synchrones : erreurs d'exécution généraies lorsqu'une fonction est appelée. Par exemple, lorsque vous tentez d'utiliser une méthode spécifique et que l'argument que vous lui transmettez n'est pas valide, le moteur d'exécution de Flash renvoie une exception. La plupart des erreurs se produit en mode synchrone (au moment de l'exécution d'une instruction) et le flux de contrôle passé immidiatement à l'instruction catch la plus appropriée.

Par exemple, l'extrait de code suivant renvoie une erreur d'exécution, car la méthode browse() n'est pas appelée avant que le programme ne tente de charger un fisier :

Dans ce cas, une erreur d'exécution est renvoyée de façon synchrone car Flash Player a déterminé que la méthode browse() n'a été appelée avant la tentative de chargement du fischiér.

Pour obtenir des informations détaillées relatives à la gestion des erreurs synchrones, voir « Gestion des erreurs synchrones dans une application » à la page 59.

  • Les erreurs asynchrones sont des erreurs du moteur d'exécution qui se produit hors du flux normal du programme. Elles générent des événements, interceptés par des écouteurs d'évenement. Une opération asynchrone est une opération dans laquelle une fonction lance une opération mais n'attend pas qu'elle se termine. Vous pouze créé un écouteur d'évenements d'erreur pour attendre que l'application ou l'utilisateur tente une opération. Si cette dernière échoue, vous intercepez l'erreur avec un écouteur d'évenements et répondez à l'évenement d'érreur. Ensuite, l'écouteur d'évenement appelle une fonction de gestionnaire d'évenement pour répondre à l'évenement d'érreur avec pertinence. Par exemple, le gestionnaire d'évenement peut lancer une boîte de dialogue qui invite l'utilisateur à résoudre l'érreur.

Reprenez l'exemple d'erreur synchrone lors du chargement d'un fichier presente precedemment. Si vous reussissez à appeler la méthode browse() avant de lancer le chargement d'un fichier, Flash Player distribue plusieurs événements. Par exemple, au démarrage d'un chargement, l'évenement open est distribué. A la fin du chargement, l'évenement compte est distribué. Etant donné que la gestion d'évenements est asynchrone (c'est-à-dire qu'elle n'a pas lieu à des moments prédéfinis, connus et spécifique), faites appel à la méthode addEventListener() pour détecter ces événements spécifique, comme l'indique le code suivant:

var fileRef:FileReference = new FileReference();
fileRef.addEventListener(Event.SELECT, selectHandler);
fileRef.addEventListener(Event Opens, openHandler);
fileRef.addEventListener(Event.COMPLETec, completeHandler);
fileRefbrowse();
function selectHandler(event:Event):void{trace("...select...");var request:URLRequest = new URLRequest("http://www.yourdomain.com/fileupload.cfm");request.method URLRequestMethod.ENDST;event.target.upload(request);}function openHandler(event:Event):void{trace("...open...");}function completeHandler(event:Event):void{trace("...complete...");}

Pour obtenir des informations détaillées sur la gestion des erreurs asynchrones, voir « Réponse à des événements et à l'état d'erreur » à la page 65.

  • Exceptions non interceptées : renvoyées sans logique correspondante (telle une instruction catch) pour y répondre. Si votre application renvoie une erreur, et qu'aucune instruction catch ni gestionnaire d'évenement approprié n'est trouve au niveau actuel ou supérieur pour gérer l'erreur, cette dernière est considérée comme une exception non interceptée.

Lorsqu'il se produit une erreur non interceptee, le moteur d'execution distribue un événement uncaughtError. Cet événementporte également le nom de « gestionnaire d'erreur global ». Il est distribué par l'objet UncaughtErrorEvents du fichier SWF et est proposé par la propriété LoaderInfo.uncaughtErrorEvents. Sieldomécouteur n'est enregistré pour l'évenement uncaughtError, le moteur d'execution ignore les erreurs non interceptées et tente de poursuivre son exécution,ès lors que l'erreur n'interrrompt pas le fichier SWF.

Outre la distribution de l'évenement uncaughtError, les versions de débogage du moteur d'exécution de Flash répondent aux erreurs non interceptées en mettant fin au script actif. Elles affichent ensuite les erreurs non interceptées dans le résultat de l'instruction trace ou écrivent le message d'erreur dans un fjichier journal. Si l'objet exception est une occurrence de la classe Error ou de l'une de ses sous-classes, les informations de trace de la pile s'affichent également dans le résultat. Pour plus d'informations sur l'utilisation de la version de débogage des moteurs d'exécution Flash, voir « Utilisation des versions de débogage des moteurs d'exécution Flash » à la page 58.

Remarque : lors du traitement d'un événement uncaughtError, si un événement d'erreur est renvoyé par un gestionnaire uncaughtError, celui-ci est appelé plusieurs fois. Il se produit alors une boucle infinie d'exceptions. Il est donc recommandé d'éviter ce type de scenario.

Gestion des erreurs dans ActionScript 3.0

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Etant donné que de nombreuses applications peuvent être exécutées sans créé de logique pour:gérer les erreurs,les développèurs sont tentés de retarder la création de la gestion des erreurs dans leurs applications. Néanmoins, sans gestion des erreurs, une application risque de s'interrompre ou de poser des problèmes à l'utilisateur si elle ne fonctionne pas comme prévu. ActionScript 2.0 possède une classe Error qui vous permet de créé une logique dans des fonctions personalisées afin de renvoyer une exception avec un message spécifique. Etant donné que la gestion des erreurs est Cruciale pour rendre une application conviviale, ActionScript 3.0 inclut une architecture étendue pour interceptor les erreurs.

Remarque: bien que le manuel Guide de référence ActionScript 3.0 pour la plate-forme Adobe Flash passé en revue les exceptions renvoyées par de nombreuses méthodes, il ne contient pas nécessairement toutes les exceptions associées à chaque méthode. une méthode risque de renvoyer une exception due à une erreur de syntaxe ou d'autres problèmes qui ne sont pas signalés explicitement dans la description de la méthode, même si cette dernière répertorie certaines exceptions renvoyées.

Eléments de gestion des erreurs ActionScript 3.0

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

ActionScript 3.0 comprend de nombreux outils permettant de générer les erreurs, notamment :

  • Classes Error : ActionScript 3.0 comprend un large évendail de classes Error destinées à multiplier le nombre de situations susceptibles de produit des objets d'erreur. Chaque classe Error permet aux applications de génér et de répondre à des conditions d'erreur spécifique, qu'elles soient liées à des erreurs système ( comme une condition MemoryError), à des erreurs de codage ( comme une condition ArgumentError), à des erreurs de réseau et de communication ( comme une condition URIError), ou d'autres situations. Pour plus d'informations sur chaque classe, voir « Comparaison des classes Error » à la page 68.
  • Moins d'échecs silencieux : dans les versions précédentes de Flash Player, les erreurs étaient généraes et signalées uniquement si vous utilisiez explicitement l'instruction throw. Les méthodes et propriétés ActionScript natives reçoient des erreurs d'exécution pour le moteur d'exéciution de Flash Player 9 et des versions ultérieures de Flash. Ces erreurs permettent de:gérer les exceptions de manière plus efficace au moment où elles se produit, puis de réagir à chaque exception.
  • Messages d'erreur clairs affichés lors du débogage : Lorsque vous utilisez la version de débogage d'un moteur d'exécution de Flash, les situations ou le code à l'origine du problème générent des messages d'erreur détaillés qui vous aident à identifier les raisons de l'éché c'd'un bloc de code particulier. Ces messages optimisent la résolution des erreurs. Pour plus d'informations, voir « Utilisation des versions de débogage des moteurs d'exécution Flash » à la page 58.
  • Les erreurs précises permettent d'afficher des messages d'erreur clairs pour les utilisateurs. Dans les versions précédentes de Flash Player, la méthode FileReference.upload() renvoyait la valeur boolée false en cas d'éché de l'appel.upload(), indiquant l'une des cinq erreurs possibles. Si une erreur se produit lorsque vousappelez la méthode upload() dans ActionScript 3.0, quatre erreurs spécifique vous aident à afficher des messagesd'erreur plus précis à l'intention des utilisateurs finalaux.

  • Gestion des erreurs affinée : des erreurs distinctes sont renvoyées pour de nombreuses situations courantes. Par exemple, dans ActionScript 2.0, avant qu'un objet FileReference ne soit renseigné, la propriété name possède la valeur null (par conséquent, avant d'utiliser ou d'afficher la propriété name, vérifie qu'elle est définie sur une valeur autre que null). Dans ActionScript 3.0, si vous tentez d'acceder à la propriété name avant qu'elle ne soit renseignée, Flash Player ou AIR renvoie une erreur IllegalOperationError qui vous indique que la valeur n'a pas été définitie. Vous pouvez utiliser des blocs try...catch...finally pour:gérer l'erreur. Pour plus d'informations, voir « Utilisation des instructions try...catch...finally » à la page 59.

  • Aucun problème sérieux de performance : l'utilisation de blocs try..catch..finally pourGER des erreurs ne nécessite pas ou peu de ressources supplémentaires par rapport aux versions precedentes d'ActionScript.
  • Une classe ErrorEvent qui vous permet de creer des écouteurs pour des événements d'erreurs asynchrones spécifiques : pour plus d'informations, voir « Réponse à des événements et à l'état d'erreur » à la page 65.

Strégties de gestion des erreurs

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Tant que l'application ne rencontre pas de condition problématique, vous pouvez continuer à l'exécuter sans créé de logique de gestion des erreurs dans le code. En revanche, si vous ne gérrez pas d'erreurs de façon active et que votre application rencontres un problème, vos utilisateurs ignoreont toujours la raison de son éché.

Voupez aborder la gestion des erreurs de diverses facons dans votre application. Laiste suivante résume les trois principales options de gestion des erreurs :

  • Utilisez les instructions try..catch..finally. Ces instructions interceptent les erreurs synchrones lorsqu'elles se produit. Vous pouvez imbriquer vos instructions dans une hierarchie pour interceptor des exceptions à différents niveaux d'exécution du code. Pour plus d'informations, voir « Utilisation des instructions try..catch..finally » à la page 59.
  • Créez des objets d'erreur personalisés. Vous pouvez utiliser la classe Error pour créé des objets d'erreur personalisés afin de suivre des opérations spécifiques dans votre application qui ne sont pas couvertes par des types d'erreur intégrés. Vous pouvez ensuite appliquer des instructions try...catch...finally aux objets d'erreur personalisés. Pour plus d'informations, voir « Création de classes d'erreur personalisées » à la page 64.
  • Ecrivez des gestionnaires et des écouteurs d'évenement pour répondre à des événements d'erreur. Cette stratégie permet de creator des gestionnaires d'erreurs globaux destinés à gérer des événements similaires sans dupliquer un volume élevé de code dans les blocs try...catch...finally. Il est également plus probable que vous interceptiez des erreurs asynchrones à l'aide de cette approche. Pour plus d'informations, voir « Réponse à des événements et à l'état d'éreur » à la page 65.

Utilisation des versions de débogage des moteurs d'exécution Flash

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Adobe propose aux développpeurs des editions speciales des moteurs d'execution Flash, destinées à les aider à executer des opérations de débogage. Vous obtenez une copie de la version de débogage de Flash Player lorsque vous installez Adobe Flash Professional ou Adobe Flash Builder. Vous disposez également d'un utiliser de débogage des applications Adobe AIR, appelé ADL, lorsque vous installez l'un de ces outils ou dans le cadre de l'installation du SDK d'Adobe AIR.

Il existe une grande différence dans la façon dont les versions de débogage et les versions de Flash Player et Adobe AIR mises sur le marché signaient les erreurs. Les versions de débogage indiquent le type d'erreur (Error, IOError ou EOFError générique), le numéro de l'erreur et un message d'erreur sous une forme lisible par une personne. Les versions mises sur le marché indiquent uniquement le type d'erreur et son numéro. Considerons par exemple le code qui suit :

try
{ tf.text = myByteArray.readBoolean();
} catch (error:EOFError) { tf.text = error.toString();
}

Si la méthode readBoolean() renvoie une erreur EOFError dans la version de débogage de Flash Player, le message suivant s'affiche dans le champ de texte tf: « EOFError: Erreur #2030: Fin de fichier détectée »

Dans une version commerciale de Flash Player ou d'Adobe AIR, le même code afficherait le texte suivant : « EOFError: Erreur #2030 ».

Remarque: étant donné que les lecteurs de débogage diffusent l'évenement « allComplete», évitez de creator des événements personalisés portant le nom « allComplete». Vous risquez sinon de rencontres un comportement imprévisible lors du débogage.

Ce type de version ne comprend pas de châne de message d'erreur, afin de réduire au minimum la taille et les ressources requises. Vous pouvez consulter le numéro d'erreur dans la documentation (annexes du manuel Guide de référence ActionScript 3.0 pour la plate-forme Adobe Flash) pour l'associer à un message d'erreur. Vous pouvez également reproductive l'erreur dans les versions de débogage de Flash Player et AIR pour visualiser le message entier.

Gestion des erreurs synchrones dans une application

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La gestion des erreurs la plus courante est la logique de gestion des erreurs synchrones, qui consiste à insérer des instructions dans votre code pour interceptor les erreurs synchrones lors de l'exécution d'une application. Ce type de gestion des erreurs permet à votre application de repérer des erreurs d'exécution et de les résoudre lorsque des fonctions échouent. La logique d'intervention d'une erreur synchrone fait appel aux instructions try...catch...finally, qui tentent littéralement une opération, interceptent toute réponse à l'erreur émanant du moteur d'exécution Flash, puis exécutent une autre opération pour gérer l'opération qui a échoué.

Utilisation des instructions try..catch..finally

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Lorsque vous manipuez des erreurs d'exécution synchrones, utilisez les instructions try...catch...finally pour interceptor les erreurs. Lorsqu'une erreur d'exécution se produit, le moteur d'exécution Flash renvoie une exception, ce qui signifie qu'il suspend l'exécution normale et create un objet spécial de type Error. L'objet Error est ensuite renvoyé au premier bloc catch disponible.

L'instruction try regroupe les instructions pouvant creer des erreurs. Vous utilisez toujours l'instruction catch avec une instruction try. Si une erreur est detectee dans l'une des instructions du bloc try, les instructions catch associées à cette instruction try sont executees.

L'instruction finally regroupe les instructions executées, qu'une erreur se produit ou non dans le bloc try. S'il ne se produit pas d'erreur, les instructions du bloc finally sont executées au terme de l'exécution des instructions du bloc try. S'il se produit une erreur, l'instruction catch appropriée est exécutée en premier lieu, suivie des instructions du bloc finally.

Le code suivant illustré la syntaxe d'utilisation des instructions try...catch...finally:

Chaque instruction catch identifie un type d'exception spécifique qu'elle gère. L'instruction catch peut spécifier uniquement des classes d'erreur qui sont des sous-classes de la classe Error. Chaque instruction catch est vérifiée dans l'ordre. Seule la première instruction catch qui correspond au type d'erreur renvoyé est executée. En d'autres termes, si vous vérifie d'abord la classe Error de niveau supérieur, puis une sous-classes de la classe Error, seule la classe Error de niveau supérieur est prise en compte. Le code suivant illustrste ce point :

try   
{ throw new ArgumentError("I am an ArgumentError");   
} catch (error:Error)   
{ trace("Error" + error.message);   
} catch (error:ArgumentError)   
{ trace("ArgumentError" + error.message);   
} 

Le code précédent affiche le résultat suivant :

I am an ArgumentError

Pour interceptor correctement l'erreur ArgumentError, assurez-vous que les types d'erreur les plus spécifiques sont répertoriés en premier, suivis des types d'erreur plus générés, comme l'indique le code suivant :

try   
{ throw new ArgumentError("I am an ArgumentError");   
} catch (error:ArgumentError)   
{ trace(" <ArgumentError> " + error.message);   
} catch (error:Error)   
{ trace(" <Error> " + error.message);   
} 

Plusieurs méthodes et propriétés de l'API d'ActionScript reivoient des erreurs d'exécution si elles en rencontres lors de leur exécution. Par exemple, la méthode close() de la classe Sound revoie une erreur IOError si la méthode ne parvient pas à fermer le flux audio, comme indiqué dans le code suivant :

var mySound:Sound = new Sound();   
try { mySound.close();   
} catch (error:IOError) { // Error #2029: This URiLStream object does not have an open stream. 

Au fur et à mesure que vous vous familiariserez avec le manuel Guide de référence ActionScript 3.0 pour la plate-forme Adobe Flash, vous identifièez les méthodes qui reçoient des exceptions, comme indiqué dans la description de chaque méthode.

Instruction throw

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Les moteurs d'exécution Flash renvoient des exceptions s'ils,reçountrent des erreurs lors de l'exécution de votre application. En outre, vous pouvez renvoyer des exceptions de façon explicite à l'aide de l'instruction throw. Si tel est le cas, Adobe vous conseille de renvoyer des occurrences de la classe Error ou de ses sous-classes. Le code suivant illustre une instruction throw qui renvoie une occurrence de la classe Error, MyErr, et appelle une fonction, myFunction ( ) en réponse au renvoi de l'erreur :

var MyError:Error = new Error("Encountered an error with the numUsers value", 99);  
var numUsers:uint = 0;  
try {  
    if (numUsers == 0) {  
        trace("numUsers equals 0");  
    }  
}  
catch (error:uint) {  
    throw MyError; // Catch unsigned integer errors.  
}  
catch (error:int) {  
    throw MyError; // Catch integer errors.  
}  
catch (error:Number) {  
    throw MyError; // Catch number errors.  
}  
catch (error:*){  
    throw MyError; // Catch any other error.  
}  
finally {  
    myFunction(); // Perform any necessary cleanup here.  
} 

Les instructions catch sont classées de façon à ce que les types de données les plus spécifiques apparaissent en premier. Si l'instruction catch associée au type de données Number est répertoriée en premier, ni l'instruction catch associée au type de données uint, ni l'instruction catch associée au type de données int n'est executée.

Remarque : dans le langage de programmation Java, chaque fonction qui peut renvoyer une exception doit le déclarer en répertoriant les classes d'exception qu'elle peut renvoyer dans une clause throws associée à la déclaration de la fonction. ActionScript ne requiert pas que vous déclariez les exceptions renvoyées par une fonction.

Affichage d'un message d'erreur simple

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

L'un des avantages majorés du nouveau modèle d'évenement d'erreur et d'exception consiste à permettre d'informer les utilisateurs du moment où une action échoue et de la raison de cet échéç. Notre role consiste à écrire le code pour afficher le message et à offrir des options en réponse.

Le code suivant illustre une instruction try...catch simple perpetualment d'afficher l'erreur dans un champ de texte :

package
{ import flash.display.Sprite; import flash.text.TextField; public class SimpleError extends Sprite { public var employee:XML = 1234 1-234 ; public function SimpleError() { try { if (employee.costCenter.length( ! = 1 ) { throw new Error("Error, employee must have exactly one cost center assigned.)); } catch (error:Error) { var errorMessage:TextField = newTextField(); errorMessage.autoSize = TextFieldAutoSize.LEFT; errorMessage.textColor = 0xFF0000; errorMessage.text = error.message; addChild(errorMessage); } } }

En utilisant un plus grand nombre de classes d'erreur et d'erreurs de compilerer intégrées, ActionScript 3.0 fournit de plus amples informations sur les raisons de l'échec d'une action que les versions précédentes. Ces informations permettent de créé des applications plus stables qui géront moins les erreurs.

Renvoide erreurs

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Lorsque vous creez une application, vous etes parfois amene a renvoyer une erreur si vous ne parvenez pas à la gerer correctement. Par exemple, le code suivant illustre un bloc try...catch imbrique, qui renvoie une erreur

ApplicationError personnalisée si le bloc catch imbriqué n'est pas capable de gérer l'erreur :

try   
{ try { trace("<< try >>"); throw new ApplicationError("some error which will be rethrown"); } catch (error:ApplicationError) { trace("<< catch >> " + error); trace("<< throw >>"); throw error; } catch (error:Error) { trace("<< Error >> " + error); }   
} catch (error:ApplicationError) { trace("<< catch >> " + error); } 

Le résultat issu du fragment de code precedent serait le suivant :

Le bloc try imbriqué renvoie une erreur ApplicationError personnalisé qui est interceptée par le bloc catch suivant. Ce bloc catch imbriqué peut tenter de gérer l'erreur et, si la tentative échoue, renvoyer l'objet ApplicationError au bloc try...catch.

Déciation de classes d'erreur personalisées

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Vou puez etendre l'une des classes Error standard pour creer vos classes d'erreur specialisées dans ActionScript.
Vou puez creer vos classes d'erreur pour les motifs suivants :

  • Identifier des erreurs ou des groupes d'erreurs spécifique uniques pour votre application.

Outre les erreurs interjectées par un moteur d'exécution de Flash, vous pouvez par exemple gérer différemment les erreurs renvoyées par votre propre code. Vous pouvez creator une sous-classe de la classe Error pour suivre le nouveau type de données d'erreur dans les blocs try...catch.

Fournir des fonctionnalités d'affichage d'erreurs exceptionnelles pour les erreurs générées par votre application.

Par exemple, vous pouvez创建工作 une méthode toString() qui formate vos messages d'erreur d'une certaine façon. Vous pouvez également définir une méthode lookupErrorString() qui prend un code d'erreur et recupere le message ajustat en fonction du langage que l'utilisateur préfére.

Une classe d'erreur spécialisée doit etendre la classe Error d'actionScript de base. Voici un exemple de classe AppError spécialisée qui etend la classe Error :

public class AppError extends Error   
{ public function AppError(message:String, errorID:int) { super(message, errorID); }   
}   
L'exemple suivant illustrer une classe AppError dans voire protry { throw new AppError("Encountered Custom AppError", 29); } catch (error:AppError) { trace(error(errorID +": " + error.message) } 

Remarque: si vous souhaitez remplaner la methode Error.toString() dans votre sous-classe, fournisse-lui un parametre ... (rest). La Specification du langage ECMAScript sur laquelle est basé ActionScript 3.0 définit ainsi la methode Error.toString() et ActionScript 3.0 respecte cette définition à des fins de rétrocompatibilité. Par conséquent, lorsque vous remplacez la methode Error.toString(), Veillez à ce que les paramétres se correspondent exactement. Vous ne pouvez pas transmettre de paramétres à la methode toStringing() lors de l'exécution, car ils sont ignorés.

Réponse à des événements et à l'état d'erreur

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

L'une des améliorations majorées apportées à la gestion des erreurs dans ActionScript 3.0 est la prise en charge de la gestion des événements d'erreur pour répondre à des erreurs asynchrones lors de l'exécution d'une application. (Pour obtenir une définition des erreurs asynchrones, voir « Types d'erreurs » à la page 55).

Voupe creer des ecouteurs d'evénement et des gestionnaires d'evénements pour repondre aux événements d'erreurs. De nombreuses classes distribuents des événements d'erreurs de la meme facon que d'autres événements. Par exemple, une occurrence de la classe XMLHttpRequest distribue normalement trois types d'evénements :Event .CLOSE, Event . CONNECT et DataEvent .DATA. Neanmoins, lorsqu'un probleme se produit, la classe XMLHttpRequest peut distribuer IOErrorEvent. IOError ou SecurityErrorEvent .SECURITY_ERROR. Pour plus d'informations sur les écouteurs et les gestionnaires d'evénement, voir « Gestion des événements » à la page 129.

Les événements d'erreurs peuvent être classés en deux catégories :

  • Evénements d'erreurs qui étendent la classe ErrorEvent

La classe flash.events.ErrorEvent contient les propriétés et les méthodes permettant de générer les erreurs d'exécution liées à des opérations de réseau et de communication dans une application en cours d'exécution. Les classes AsyncErrorEvent, IOException et SecurityErrorEvent étendent la classe ErrorEvent. Si vous utilisez la version de débogage d'un moteur d'exécution de Flash, une boîte de dialogue vous informe, lors de l'exécution, de la présence d'évenements d'erreurs sans fonctions d'écouteur rencontres par le lecteur.

  • Evénements d'erreurs basés sur le statut

Les événements d'erreur basés sur le statut sont liés aux propriétés netStatus et status des classes de communication et de réseau. Si un moteur d'exécution Flash rencontres un problème lors de la lecture ou de l'écriture des données, la valeur des propriétés netStatus.info level ou status.level ( selon l'objet de classe que vous utilisez) est définie sur la valeur "error". Vous répondez à cette erreur en vérifiant que la propriété level contient la valeur "error" dans votre fonction de gestionnaire d'évenement.

Utilisation d'événements d'erreurs

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La classe ErrorEvent et ses sous-classes contiennent des types d'erreurs destinés à gérer les erreurs distribuées par les moteurs d'exécution Flash lorsqu'ils tentent de dire ou d'écrire des données.

L'exemple suivant utilise à la fois une instruction try...catch et des gestionnaires d'évenement d'erreur pour afficher toute erreur détectée lors de la tentative de lecture d'un fichier local. Vous pouze ajouter un code de gestion plus élaboré pour proposer des options à l'utilisateur ou:gérer l'erreur automatiquement aux endroits indiqués par le commentaire « your error-handling code here »:

package
{ import flash.display.Sprite; import flash.errors.IOError; import flash.events.IOErrorEvent; import flash.events.TextEvent; import flash.media Sounds; import flash.media SoundsChannel; import flash.net URLsRequest; import flash.text.TextField; import flash.text.TextFieldAutoSize; public class LinkEventExample extends Sprite { private var myMP3:Sound; public function LinkEventExample() { myMP3 = new Sound(); var list:TextField = newTextField(); list.autoSize = TextFieldAutoSize.LEFT; list.multiline true; list_htmlText = "Track 1
"; list_htmlText + = "Track 2
"; addEventListener(TextEvent.LINK, linkHandler); addChild(list); } private function playMP3(mp3:String):void { try { myMP3.load(new URLLRequest(mp3)); myMP3.play(); } catch (err:Error)

{ trace(err.message); // your error-handling code here } myMP3.addEventListener(IOErrorEvent.IO_ERROR, errorHandler); } private function linkHandler(linkEvent:mmEvent):void { playMP3(linkEvent.text); // your error-handling code here } private function errorHandler(errorEvent:IOErrorEvent):void { trace(errorEvent.text); // your error-handling code here } } 

Utilisation d'événements de changement de statut

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Les moteurs d'exécution Flash changent dynamiquement la valeur des propriétés netStatus.info level ou status.level pour les classes qui prennt en charge la propriété level pendant qu'une application s'exécute. Les classes qui ont la propriété netStatus.info level sont NetConnection, NetStream et SharedObject. Les classes qui ont la propriété status-level sont HTTPStatusEvent, Camera, Microphone et LocalConnection. Vous pouvez écrire une fonction de gestionnaire pour répondre au changement de valeur level et suivre les erreurs de communication.

L'exemple suivant utilise une fonction netStatusHandler() pour tester la valeur de la propriété level. Si la propriété level indique qu'une erreur a été rencontres, le code suit le message « Video stream failed »

package
{ import flash.display.Sprite; import flash.events.NetStatusEvent; import flash.events.SecurityErrorHandler; import flash.media Video; import flash.net.NetConnection; import flash.net.NetStream; public class VideoExample extends Sprite { private var videoUrl:String = "Video.flv"; private var connection:NetConnection; private var stream:NetStream; public function VideoExample() { connection = new NetConnection(); connection.addEventListener (NetStatusEvent.NET_STATUS, netStatusHandler); connection.addEventListener (SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler); connection.connect(null); }

private function netStatusHandler(event:NetStatusEvent):void { if (event.info.level == "error") { trace("Video stream failed") } else { connectStream(); } } private function securityErrorHandler(event:SecurityErrorEvent):void { trace("securityErrorHandler: " + event); } private function connectStream():void { var stream:NetStream = new NetStream(connection); var video:Video = new Video(); video.attachNetStream(stream); stream.play(videoUrl); addChild(video); } } 

Comparaison des classes Error

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

ActionScript fournit de nombreuses classes Error prédéfinies. Vous pouvez toute fois faire appel aux mêmes classes Error dans votre propre code. Il existe deux types principaux de classes Error dans ActionScript 3.0 : les classes Error de base d'ActionScript et les classes Error du package flash.error. Le package flash.error contient des classes supplémentaires permettant le débogage et le développement d'applications ActionScript 3.0.

Classes Error de base

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Parmi les classes Error de base figurent les classes Error, ArgumentError, EvalError, RangeError, ReferenceError, SecurityError, SyntaxError, TypeError, URIError et VerifyError. Chacune de ces classes se trouve dans l'espace de noms de niveau supérieur.

Nom de classeDescriptionRemarques
ErrorLa classe Error permet de renvoyer des exceptions et correspond à la classe de base des autres classes d'exception définies dans ECMAScript : Evaluation, RangeError, ReferenceError, SyntaxError, TypeError et URIError.La classe Error sort de classe de base à toutes les erreurs d'exécution et est recommandée pour toutes les classes d'erreur personalisées.
ArgumentErrorLa classe ArgumentError représentée une erreur qui se produit lorsque les valeurs de paramètre fournies lors d'un appel de fonction ne correspondant pas aux paramètres définis pour cette-ci.Voici des exemple d'erreurs d'argument :Trop ou trop peu d'arguments sont fournis à une méthode.Un argument avait été membre d'une énumération, et cela n'a pas été le cas.
EvalErrorUne exception EvalError est renvoyée si des paramètres sont transmis au constructeur de la classe Function ou si le code utilisé appelle la fonction eval().Dans ActionScript 3.0, la prise en charge de la fonction eval() a été supprimée et toute tentative d'utilisation de la fonction entraine le renvoi d'une erreur.Les versions précédentes de Flash Player utilisant la fonction eval() pour acceder à des variables, des propriétés, des objets ou des clips par nom.
RangeErrorUne exception RangeError est renvoyée si une valeur numérique excède la plage acceptable.Par exemple, une exception RangeError est renvoyée par la classe Timer si un retard est négatif ou infini. Elle peut également être renvoyée si vous tentez d'ajouter un objet d'affichage à une profondeur non valide.
ReferenceErrorUne exception ReferenceError est renvoyée lorsque vous tentez d'utiliser une référence à une propriété non définie pour un objet scellé (non dynamique). Les versions du compileur ActionScript antérieures à ActionScript 3.0 ne renvoyaient pas d'erreur lorsque vous tentiez d'acceder à une propriété non définie. ActionScript 3.0 renvoie toute fois l'exception ReferenceError dans ce cas de figure.Les exceptions pour des variables non définies pointent vers des bogues évventuels afin d'améliorer la qualité du logiciel. Cependant, si vous n'vez pas l'habitude d'initialiser les variables, ce nouveau comportement d'actionScript requiert de vous quelques changements lorsque vous écrivez du code.
SecurityErrorL'exception SecurityError est renvoyée lorsqu'une violation de sécurité se produit et que l'accès est refusé.Voici des examples d'erreurs de sécurité :Un accès à une propriété ou un appel de méthode non autorisé est effectué en franchissant les limits du sandbox de sécurité.II s'est produit une tentative d'accès à une URL non autorisée par le sandbox de sécurité.II s'est produit une tentative de connexion socket sur un port, mais le filchier de régulation socket approprié n'était pasprésent.II s'est produit une tentative d'accès à la caméra ou au microphone de l'utiliser et celui-ci a refusé l'accès au périphérique.
SyntaxErrorUne exception SyntaxError est renvoyée lorsqu'il se produit une erreur d'analyse dans votre code ActionScript.Une exception SyntaxError peut être renvoyée dans les cas suivants :ActionScript renvoie des exceptions SyntaxError lorsque la classe RegExp analyse une expression régulière non valide行动 :ActionScript renvoie des exceptions SyntaxError lorsque la classe XMLDocument analyse un code XML non valide.
TypeErrorL'exception TypeError est renvoyée lorsque le type réel d'un opérande ne correspond pas au type prévu.Une exception TypeError peut être renvoyée dans les cas suivants : • Un paramètre réel de fonction ou de méthode ne peut pas être forcé à correspondre au type de paramètre formel. • Une valeur est affectée à une variable et ne peut pas être forcée à correspondre au type de la variable. • Le côté droit de l'opérateur is ou instanceof n'est pas un type valide. • L'utilisation du mot clé super n'est pas valide. • Une recherche de propriété donne lieu à plusieurs liaisons, soit un résultat ambigu. • Une méthode est appelée pour un objet incompatible. Par exemple, une exception TypeError est renvoyée si une méthode de la classe RegExp est « greffée » sur un objet générique, puis appelée.
URIErrorL'exception URIError est renvoyée lorsque l'une des fonctions de gestion URI globales est utilisée d'une manière qui n'est pas compatible avec sa définition.Une exception URIError peut être renvoyée dans les cas suivants : Un URI non valide est défini par une fonction API de Flash Player qui s'attend à un URI valide, comme Socket . connect().
VerifyErrorUne erreur VerifyError est renvoyée lorsqu'un fichier SWF incorrect ou ALTERÉ est détecté.Lorsqu'un fichier SWF charge un autre fichier SWF, le fichier SWF parent peut interceptor une exception VerifyError généraee par le fichier SWF charge.

Classes Error du package flash.error

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Le package flash(error contient des classes Error considérées comme parties intégrantes de l'API des moteurs d'exécution de Flash. A l'encontre des classes Error décrites, le package flash.error communique les événements d'erreurs propres aux moteurs d'exécution de Flash (tel Flash Player ou Adobe AIR).

Nom de classeDescriptionRemarques
EOFErrorUne exception EOFError est émise lors d'une tentative de lecture au-delà de la fin des données disponibles.Par exemple, une exception EOFError est émise chaque fois qu'une méthode de lecture de l'interface IDataInput est appelée et que les données sont insuffisantes pour répondre à la requête de lecture.
IllegalOperationErrorUne exception IllegalOperationError est renvoyée lorsqu'une méthode n'est pas implémentée ou si l'implémentation ne couvre pas l'utilisation actuelle.Voici quelques examples d'exception s'erreurs liées à des opérations non valides :· Une classe de base, telle que DisplayObjectContainer, propose plus de fonctionnalités qu'une scène ne peut prendre en charge. Par exemple, si vous tentez d'obtenir ou de définir un masque sur la scène (à l'aide de stage .mask), le moteur d'exécution de Flash renvoie une exception IllegalOperationError accompagnée du message « La classe Stage n'implémente ni cette propriété, ni cette méthode » .· Une sous-classe hérite d'une méthode dont elle n'a pas besoin et qu'elle ne souhaite pas prendre en charge.· Certains méthodes d'accessibilité sont appelées lorsque Flash Player est compilation sans les fonctions d'accessibilité.· Les fonctions réservées à la création sont appelées à partir d'une version d'exécution de Flash Player.· Vous tentez de définir le nom d'un objet placé sur le scenario.
IOErrorUne exception IOError est renvoyée lorsqu'un type d'exception E/S se produit.Vous obtenez cette erreur, par exemple, lorsque vous tentez une opération de lecture-écriture sur un socket qui n'est pas connecté ou qui est déconnecté.
MemoryErrorUne exception MemoryError est renvoyée lors de l'échec d'une requête d'allocation de mémoire.Par défaut, ActionScript Virtual Machine 2 n'impose pas de limite à la quantité de mémoire allouée par un programme ActionScript. Sur un système de bureau, les échecs d'allocation de mémoire sont rares. Une erreur est renvoyée lorsque le système ne parvient pas à alluer la mémoire requise pour une opération. Par conséquent, sur un système de bureau, cette exception est peu fréquent, à moins qu'une requête d'allocation ne soit extrémement importante (par exemple, une requête de 3 milliards d'octets est impossible, car un programme Microsoft® Windows® de 32 bits peut accéder à 2 Go d'espace d'adressage uniquement).
ScriptTimeoutErrorUne exception ScriptTimeoutError est renvoyée lorsqu'un intervalle de délais d'expiration du script de 15 secondes est atteint. En interceptant une exception ScriptTimeoutError, vous pouze gérer le décalais d'expiration du script plus en douceur. Si aucun gestionnaire d'exception n'est défini, le gestionnaire de l'exception non interceptée affiche une boîte de dialogue contenant un message d'erreur.Pour éviter qu'un développement n'intercepte l'exception et restée dans une boucle sans fin, seule la première exception ScriptTimeoutError renvoyée au cours d'un script doit être interceptée. Le code ne peut pas interceptor une exception ScriptTimeoutError ultérieure. Elle passée donc immédiatement au gestionnaire de l'exception non interceptée.
StackOverflowErrorL'exception StackOverflowError est renvoyée lorsque la pile disponible pour le script a été écuisée.Une exception StackOverflowError peut indiquer qu'un problème de récursivité à l'infini s'est produit.

Exemple de gestion des erreurs : application CustomErrors

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

L'application CustomErrors déscrit les techniques d'utilisation des erreurs personnalisées lors de la création d'une application. Ces techniques sont les suivantes :

  • Validation d'un paquet XML
  • Ecriture d'une erreur personalisée
  • Renvoi d'erreurs personalisées
  • Notification des utilisateurs lors du renvoi d'une erreur

Pour obtenir les fichiers d'application de cet exemple, voir

www.adobe.com/go/learn_programmingAS3samplesflash_fr. Les fichiers d'application CustomErrors se trouvent dans le dossier Samples/CustomError. L'application se compose des fichiers suivants :

FichierDescription
CustomErrors.mxml ou CustomErrors.flaFichier d'application principal en FLA pour Flash ou en MXML pour Flex
com/example/programmingas3 errors/ApplicationError.asUne classe servant de classe Error de base pour les classes FatalError et WarningError.
com/example/programmingas3 errors/FatalError.asUne classe qui définit une erreur FatalError renvoyée par l'application. Cette classe étend la classe ApplicationError personnalisée.
com/example/programmingas3 errors/Validator.asUne classe qui définit une seule méthode qui valide un paquet XML employee fourni par l'utilisateur.
com/example/programmingas3 errors/WarningError.asUne classe qui définit une erreur WarningError renvoyée par l'application. Cette classe étend la classe ApplicationError personnalisée.

Présentation de l'application CustomErrors

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Au chargement de l'application, la méthode initApp() est appelée dans les applications Flex ou le code du scenario (autre qu'une fonction) est executé dans les applications Flash Professional. Ce code définit un exemple de paquet XML que la classe Validator vérifiera. Le code suivant est executé :

employeeXML = John Doe 12345 67890 ;
}

Le paquet XML est ensuite affché dans une occurrence du composant TextArea sur la scene. Cette étape permet de modifier le paquet XML avant de tenter de le revalider.

Lorsque l'utilisateur clique sur le bouton de validation, la méthodevalidateData() est appelée. Cette méthode valide le paquet XML employee à l'aide de la méthode validateEmployeeXML() de la classe Validator. Le code suivant présente la méthodevalidateData():

function validateData():void
{ try { var tempXML:XML XML xmlText.text); ValidatorValidateEmployeeXML(tempXML); status.text = "The XML was successfully validated."; } catch (error:FatalError) { showFatalError(error); } catch (error:WarningError) { showWarningError(error); } catch (error:Error) { showGenericError(error); }

Un objet XML temporaire est d'abord créé à l'aide du contenu de l'occurrence du composant TextArea xmlText. La méthode validate EmployeeXML() de la classe Validator personnalisée

(com.example.programmingas3 errors/Validator.as) est ensuite appelée et transmet l'objet XML-temporaire comme paramètre. Si le paquet XML est valide, l'occurrence du composant Label status affiche un message de réussite et l'application se ferme. Si la méthode validateEmployeeXML() renvoie une erreur personnalisée (c'est-à-dire qu'une erreur FatalError, WarningError ou une erreur générique se produit), l'instruction catch appropriée s'exécute et appelle les méthodes showFatalError(), showWarningError() ou showGenericError(). Chacune de ces méthodes affiche un message approprié dans une zone de texte appelée.statusText pour avertir l'utilisateur de l'erreur spécifique qui s'est produit. Chaque méthode met également à jour l'occurrence du composant Label status avec un message spécifique.

Si une erreur grave se produit pendant une tentative de validation du paquet XML employee, le message d'erreur s'affiche dans la zone de texte.statusText et l'occurrence du composant TextArea xmlText et l'occurrence du composant Button validateBtn sont désactivées, comme l'indique le code suivant:

function showFatalError(error:FatalError):void
{ var message:String = error.message ^+ "\n\n"; var title:String = error.Title(); statusText.text = message ^+ " " ^+ title ^+ "\n\nThis application has ended."; this.xmlText.enabled = false; this.validateBtn.enabled = false; hideButtons();
}

S'il se produit une erreur d'advertissement au lieu d'une erreur grave, le message d'erreur est affiché dans l'occurrence de TextArea.statusText, mais les occurrences de composantTextField xmlText et Button ne sont pas désactivées. La méthode showWarningError() affiche le message d'erreur personnalisé dans la zone de texte.statusText. Le message invite également l'utilisateur à indiquer s'il souhaite poursuivre la validation de l'objet XML ou annuler le script. Le fragment de code suivant présente la méthode showWarningError():

function showWarningError(error:WarningError):void { var message:String = error.message + "\n\n" + "Do you want to exit this application?"; showButtons(); var title:String = error.getName(); statusText.text = message;
}

Lorsque l'utilisateur clique sur le bouton Oui ou Non, la méthode closeHandler() est appelée. Le fragment de code suivant présente la méthode closeHandler():

function closeHandler(event:CloseEvent):void
{ switch (event.detail) { case yesButton: showFatalError(new FatalError(9999)); break; case noButton: statusText.text = ""; hideButtons(); break; }
}

Si l'utiliseur souhaite annuler le script en cliquant sur Oui, une exception FatalError est renvoyee, provoquant l'arrêt de l'application.

Création d'une validation personalisée

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La classe Validator personnalisée contient une seule méthode, validateEmployeeXML(). La méthode validateEmployeeXML() gère un seul argument, employee, qui correspond au paquet XML à valider. La méthode validateEmployeeXML() est la suivante:

public static function validateEmployeeXML employee:XML):void  
{  
// checks for the integrity of items in the XML  
if (employee.costCenter.length() < 1)  
{  
    throw new FatalError(9000);  
}  
if (employee.costCenter.length() > 1)  
{  
    throw new WarningError(9001);  
}  
if (employee.ssn.length() != 1)  
{  
    throw new FatalError(9002);  
} 

Un employé doit appartenir à un (et un seul) centre de contrôle pour être validé. S'il n'appartient àaucun centre de contrôle, la méthode renvoie une erreur FatalError, qui se propage jusqu'à la méthode validateData() dans le fichier d'application principale. Si l'employé appartient à plusieurs centres de contrôle, une erreur WarningError est renvoyée. La dernière vérification de la validation XML contrôle que l'utilisateur possède un seul numéro de sécurité sociale défini (le nœud ssn dans le paquet XML). S'il n'y a pas exactement un nœud ssn, une erreur FatalError est renvoyée.

Voupez ajouter des verifications supplémentaires à la méthode validateEmployeeXML() afin de vérifier, par exemple, que le nœud ssn contient un numéro valide, ou que l'employé possède au moins un numéro de téléphone et une adresse électronique, et que ces deux valeurs sont valides. Vous pouvez également modifier le XML de façon à ce que chaque employé ait un ID unique et spécifique l'ID de son responsable.

Définition de la classe ApplicationError

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La classe ApplicationError sert de classe de base aux classes FatalError et WarningError. Elle estend la classe Error et définit ses propres propriétés et méthodes personnalisées, y compris un ID d'erreur, la gravité et un objet XML contenant les codes d'erreur personnalisés et les messages. Cette classe définit également deux constantes statiques utilisées pour définir la gravité de chaque type d'erreur.

La méthode du constructeur de la classe ApplicationError est la suivante :

Chaque nœud d'erreur dans l'objet XML contient un code numérique unique et un message d'erreur. Vous pouvez consulter facilement les messages d'erreur par code d'erreur à l'aide d'E4X, comme indiqué dans la méthode getMessageText() suivante:

public function getMessageText(id:int):String
{ var message:XMLList = messages(error>@code = id); return message[0].text();
}

La méthode getMessageText() prend un seul argument entier, id, et renvoie une chaine. L'argument id correspond au code de l'erreur à rechercher. Par exemple, lorsque vous transmettez un id de 9001, l'erreur indiquant que les employés doivent être affectés à un seul centre de contrôle est renvoyée. Si plusieurs erreurs ont le même code, ActionScript renvoie le message d'erreur uniquement pour le premier résultat trouvez (message [0] dans l'objet XMLList renvoyé).

La méthode suivante de cette classe, getTitle(), ne prendaucnPametre et renvoie une valeur de chaine qui contient l'ID de cette erreur spécifique. Cette valeur permet d'identifier aisément l'erreur exacte qui s'est produit lors de la validation du paquet XML. Le fragment de code suivant presente la méthode getNameTitle():

public function getTitle():String { return "Error#" + id; } 

La dernière méthode finale de la classe ApplicationError est toString(). Cette méthode remplace la fonction définie dans la classe Error pour que vous puissiez personnelier la presentation du message d'erreur. La méthode renvoie une chaine qui identifie le numero d'erreur spécifique et le message qui s'est affiché.

public override function toString():String
{ return"[APPLICATIONERROR#" ^+ id ^+ "] 串 +message;
}

Définition de la classe FatalError

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La classe FatalError étend la classe ApplicationError personnalisée et définit trois méthodes : le constructeur FatalError, getTitle() et toString(). La première méthode, le constructeur FatalError, prend un seul argument entier, errorID, et définit la gravité de l'erreur à l'aide des valeurs de constante statiques définies dans la classe ApplicationError. Elle obtient le message de l'erreur spécifique en appelant la méthode getMessageText() dans la classe ApplicationError. Le constructeur FatalError se présente comme suit :

public function FatalError(errorID:int) { id = errorID; severity = ApplicationError.FATAL; message = getMessageText(errorID); }

La méthode suivant de la classe FatalError, getTitle(), remplace la méthode getTitle() définie précédement dans la classe ApplicationError et ajoute le texte "-- FATAL" dans le titre pour informer l'utilisateur qu'une erreur grave s'est produit. La méthode getName() se présente comme suit:

public override function getTitle():String  
{ return "Error#" + id + " -- Fatal"; } 

La méthode finale dans cette classe, toString(), remplace la méthode toString() définie dans la classe ApplicationError. La méthode toString() est la suivante :

public override function toString():String   
{ return ["FATAL ERROR #" + id +"] " + message;   
} 

Définition de la classe WarningError

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La classe WarningError étend la classe ApplicationError et est presque identique à la classe FatalError, à l'exception de quelques changements de chaîne mineurs. Elle définit la gravité de l'erreur sur ApplicationError.WARNING au lieu de ApplicationError.FATAL, comme indiqué dans le code suivant :

public function WarningError(errorID:int) { id = errorID; severity = ApplicationError.WARNING; message = super.getText(errorID); }

Chapitre 5 : Utilisation d'expressions régulières

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Une expression régulière déscrit un modele servant à rechercher et à manipuler du texte de correspondance dans des chaînes. Les expressions régulières ressemblant à des chaînes, mais elles comprend des codes spéciaux pour déscrire des modèles et des répétitions. Par exemple, l'expression régulière suivante correspond à une chaine qui commence par le caractère A suivi d'un ou de plusieurs chiffres séquentiels :

/A\d+/

Les rubriques suivantes sont consacrées à la syntaxe de base de construction d'expressions régulières. Néanmoins, les expressions régulières peuvent être très complexes et comporter de nombreuses nuances. Vous pouvez vous documenter sur les expressions régulières sur le Web et dans les librairies. Différentes environnementés de programmation implément des expressions régulières de différentes façon. ActionScript 3.0 implémente des expressions régulières comme définis dans la version 3 de la Specification du langage ECMAScript (ECMA-262).

Voir aussi

RegExp

Principes de base des expressions régulières

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Une expression régulière déscrit un modele de caractères. Les expressions régulières seront généralement à vérifier qu'une valeur de texte est conforme à un modele particulier (par exemple, vérifier qu'un numéro de téléphone saisi par l'utilisateur compte le nombre de chiffres correct) ou à remplacer des portions d'une valeur de texte qui correspondent à un modele donné.

Les expressions régulières peuvent être simples. Par exemple, supposons que vous souhaitiez confirmer qu'une chaîne particulière correspond à ABC ou que vous souhaitiez replacer chaque occurrence d'ABC dans une chaîne par un autre texte. Dans ce cas, vous pouvez utiliser l'expression régulière suivante qui définit le modele responsable les lettres A, B et C, dans l'ordre :

/ABC/

Le littéral de l'expression régulière est délimité avec la barre oblique (/).

Les modèles d'expression régulière peuvent également être complexes et parfois sembler obscures, comme l'expression suivante pour étabir une correspondance avec une adresse électronique valide :

$$ / ([ 0 - 9 a - z A - Z ] + [ -. _ {+} + \& ]) * [ 0 - 9 a - z A - Z ] + @ ([ - 0 - 9 a - z A - Z ] + [. ]) + [ a - z A - Z ] {2, 6 } / $$

Vous utiliserez le plus souvent des expressions régulières pour rechercher des modèles dans des chaînes et pour remplaçer des caractères. Dans ces cas, vous créées un objet d'expression régulière et l'utiliserez comme paramètre pour une ou plusieurs méthodes de classe String. Les méthodes suivantes de la classe String prennten des expressions régulières comme paramètres : match(), replace(), search() et split(). Pour plus d'informations sur ces méthodes, voir « Recherche de modèles dans des chaînes et remplacement de sous-chains » à la page 17.

La classe RegExp comprend les méthodes suivantes: test() et exec(). Pour plus d'informations, voir « Méthodes d'utilisation d'expressions régulières avec deschains » à la page 93.

Concepts important et terminologie

La liste de référence suivante contient des termes importants relatifs à la fonctionnalité étudiee.

Caractère d'échémpement Caractère indiquant que le caractère qui suit doit être considéré comme un caractère de remplacement只想 que comme un caractère littéral. Dans une syntaxe d'expression régulière, la barre oblique inverse () est le caractère d'échémpement. Par conséquent, une barre oblique inverse suivie d'un autre caractère est un code spécial只想 que le caractère à proprement parler.

Indicateur Caractere qui spécifie une option associée au mode d'utilisation du modele d'expression régulière (respect de la casse, par exemple).

Caractre de remplacement Caractre qui a une signification spéciale dans un modele d'expression reguliere et qui ne represente pas litteralement ce caractete dans le modele.

Quantificateur Caractères indiquant le nombre de répetitions d'une partie du modele. Par exemple, un quantificateur peut être utilisé pour indiquer qu'un code postal américain doit containir cinq ou neuf chiffres.

Expression régulière Instruction de programme définissant un modele de caractères qui permet de confirmer si d'autres chaînes correspondant à ce modele ou de remplaçer des sections d'une chaîne.

Syntaxe d'expression régulière

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Cette section déscrit tous les éléments de la syntaxe d'expression régulière d'ActionScript. Comme vous pourrez le constater, les expressions régulières peuvent être très complexes et comporter de nombreuses nuances. Vous pouvez vous documenter sur les expressions régulières sur le Web et dans les libraires. Différentes environnements de programmation implément des expressions régulières de différentes façon. ActionScript 3.0 implémente des expressions régulières comme définis dans la version 3 de la Specification du langage ECMAScript (ECMA-262).

Généralement, vous utilise des expressions régulières qui correspond à des modèles plus compliqués qu'une simple chaine de caractères. Par exemple, l'expression régulière suivant définit le modele comportant les lettres A, B et C, dans l'ordre, suivies par un chiffre :

/ABC\d/

Le code (\backslash d) representa un chiffre. La barre oblique inverse () ) est appelée caractère d'échévement. Lorsqu'elle est combinée au caractère qui la suit (dans ce cas, la dette d), elle a une signification spéciale dans l'expression régulière.

L'expression régulière suivanté définit le modele des lettres ABC suivies par des chiffres (remarquez l'astérisque) :

/ABC\d*/

L'astérisque (*) est un caractère de remplacement. Un caractère de remplacement est un caractère ayant une signification spéciale dans les expressions régulières. L'astérisque est un type de caractère de remplacement spécifique appelé quantificateur, utilisé pour quantifier le nombre de répetitions d'un caractère ou groupe de caractères. Pour plus de détails, voir « Quantificateurs » à la page 85.

Outre son modele, une expression régulière peut containir des indicateurs qui spécifient comment l'expression régulière doit être mise en correspondence. Par exemple, l'expression régulière suivant utilise l'indicateur i qui indique qu'elle ignore le respect de la casse dans les chaînes de correspondance :

/ABC\d*/i 

Pour plus d'informations, voir « Indicateurs et propriétés » à la page 89.

Voupeuutilerdesexpressionregulieresaide desmethodes suivantesde la classe String:match(), replace()etsearch().Pourplusd'informationssurcesmethodes,voir«Recherche demodeles dansdeschaineset remplacementde sous-chaines»àla page17.

Création d'une occurrence d'expression régulière

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Il existe deux façon de creer une occurence d'expression reguliere. L'une des methodes consiste a utiliser des barres obliques (/) pour delimiter l'expression reguliere, et l'autre consiste a utiliser le constructeur new. Par exemple, les expressions régulieres suivantes sont équivalentes :

var pattern1: RegExp = /bob/i;  
var pattern2: RegExp = new RegExp("bob", "i"); 

Des barres obliques délimitant un littéral d'expression régulière de la même façon que des guillemets délimitant un littéral de chaine. La partie de l'expression régulière contenue entre les barres obliques définit le modulo. L'expression régulière peut également inclure des indicateurs après la barre de délimitation finale. Ces indicateurs sont considérés comme faisant partie de l'expression régulière, mais ils sont séparés de son modulo.

Lorsque vous utilisez le constructeur new, vous utilisez deux chaînes pour définir l'expression régulière. La première chaîne définit le modele, et la seconde les indicateurs, comme dans l'exemple suivant :

var pattern2: RegExp = new RegExp("bob", "i"); 

Lorsque vous incluez une barre oblique dans une expression régulière qui est définie à l'aide de délimiteurs de barre oblique, vous nevez faire précéder la barre oblique du caractère d'échéppement (). Par exemple, l'expression régulière suivante correspond au modele (1/2):

var pattern: RegExp = /1\2; 

Pour inclure des guillemets dans une expression régulière définie avec le constructeur new, vous devez ajouter un caractère d'échémpement () ) avant les guillemets ( comme lorsque vous définissez un littéral String). Par exemple, les expressions régulières suivantes correspondant au modee eat at "joe's":

var pattern1:RegExp = new RegExp("eat at \\"joe's\"",\\"");  
var pattern2:RegExp = new RegExp('eat at "joe\'s\"',\\""); 

N'utilise pas le caractère d'échémpement avec des guillemets dans des expressions régulières définies à l'aide des délimiteurs de barre oblique. De même, n'utilise pas le caractère d'échémpement avec des barres obliques dans des expressions régulières définies avec le constructeur new. Les expressions régulières suivantes sont équivalentes. Elles définissent le modulo 1/2 "joe's":

var pattern1: RegExp = /1\2 "joe's" /;

var pattern2:RegExp = newRegExp("1/2 \"joe's\"\"", "\");

var pattern3:RegExp = newRegExp('1/2 "joe\'s"', ';'

De même, dans une expression régulière définie à l'aide du constructeur new, tapez deux fois le caractère barre oblique inverse pour utiliser une métaséquence débutant par le caractère barre oblique inverse(), telle que (\backslash) (qui correspond à n'importe quel chiffre).

var pattern:RegExp = newRegExp("\d+", "", // matches one or more digits

Voudevez taper deux fois le caractere barre oblique inverse,carle premier parametre de la methode constructeur RegExp() est une chaine.Dans un litteral de chaine,ce caractere doit etre entre deux fois pour etre interprete comme une barre oblique inverse unique.

La section qui suit décrit la syntaxe servant à définir des modèles d'expression régulière.

Pour plus d'informations, voir « Indicateurs et propriétés » à la page 89.

Caractères, caractères de remplacement et métaséquences

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

L'expression régulière la plus simple est celle qui correspond à une série de caractères, comme dans l'exemple suivant :

var pattern: RegExp = /hello/;

Néanmoins, les caractères suivants, appelés caractères de remplacement, ont des significations spéciales dans des expressions régulières :

^ $ \ . * + ? ( ) [ ] { } |

Par exemple, l'expression régulière suivante correspond à la lecture A suivie par zéro ou plusieurs occurrences de la lecture B (le caractère de remplacement astérisque indique cette répétition), suivie par la lecture C :

/AB*C/

Pour inclure un caractère de remplacement sans sa signification spéciale dans un modele d'expression régulière, vous nevez utiliser le caractère d'échéppement ( ). Par exemple, l'expression régulière suivante correspond à la lecture A suivie par la lecture B, suivie par un astérisque, suivie par la lecture C :

var pattern: RegExp = /AB*C/;

Une métaséquence, comme un caractère de remplacement, a une signification spéciale dans une expression régulière. Une métaséquence est constituée de plusieurs caractères. Les sections suivantes fournissent des détails sur l'utilisation des caractères de remplacement et des métaséquences.

A propos des caractères de remplacement

Le tableau suivant répertorie les caractères de remplacement que vous pouvez utiliser dans des expressions régulières :

Caractère de remplacementDescription
^ (caret)Etablit une correspondance au début d'une chaine. Lorsque l'indicateur m (multiline) est définir, le caret correspond au début d'une ligne également (voir « Indicateurs et propriétés » à la page 89). Lorsqu'il est utilisé au début d'une classe de caractère, le caret indique la négation et non le début d'une chaine. Pour plus d'informations, voir « Classes de caractère » à la page 83.
(signe dollar)Etablit une correspondance à la fin d'une chaine. Lorsque l'indicateur m (multiline) est définir, correspond à la position avant une nouvelle ligne (\n) également. Pour plus d'informations, voir « Indicateurs et propriétés » à la page 89.
\ (caractère d'échéappement)Echappe la signification spéciale du caractère de remplacement des caractères spéciaux. Vous pouze également utiliser le caractère d'échéappement si vous souhaitez utiliser une barre oblique dans un littéral d'expression régulière, comme dans /1\2/ (pour correspondre au caractère 1, suivi par la barre oblique, suivi par le caractère 2).
. (point)Correspond à un seul caractère. Un point correspond à un caractère de nouvelle ligne (\n) uniquement si l'indicateur s (dotal) est définir. Pour plus d'informations, voir « Indicateurs et propriétés » à la page 89.
* (étoile)Correspond à l'élement précédent répété zéro ou plusieurs fois. Pour plus de détails, voir « Quantificateurs » à la page 85.
+ (plus)Correspond à l'élement précédent répété une ou plusieurs fois. Pour plus de détails, voir « Quantificateurs » à la page 85.
? (point d'interrogation)Correspond à l'élement précédent répété zéro ou une fois. Pour plus de détails, voir « Quantificateurs » à la page 85.
( et )Définit des groupes dans l'expression régulière. Utilisez des groupes pour: · confiner le domaine du permutateur | :/(a|b|c)d/ · définir le domaine d'un quantificateur:/ (walla.) {1,2}/ · dans des backreferences. Par exemple, le \1 dans l'expression régulière suivante correspond à toute correspondence au premier groupe entre parenthèses du modulo : · /(w*) est répété : \1/ Pour plus d'informations, voir « Groupes » à la page 87.
[ et ]Spécifie une classe de caractère qui définit des correspondances possibles pour un seul caractère : /[aeiou] / correspond à l'un des caractères spécifique. Dans les classes de caractère, utilisez le trait d'union (-) pour désigner une plaque de caractères : /[A-Z0-9] / correspond aux lettres majuscules A à Z ou aux chiffres 0 à 9. Dans les classes de caractère, insérez un caractère d'échéappement pour échapper les caractères ] et les caractères :-/ [+\\. -] \d+/ correspond à + ou à - avant un ou plusieurs chiffres. Dans les classes de caractère, d'autres caractères (qui sont normalement des caractères de remplacement) sont considérés comme des caractères normaux (et non comme des caractères de remplacement), sans qu'une barre oblique inverse soit nécessaire : /[] /£ correspond àou à £. Pour plus d'informations, voir « Classes de caractère » à la page 83.
| (opérateur de transfert de données)Utilisé pour la permutation, pour correspondir à la partie de gauche ou à celle de droite : /abc|xyz/ correspond à abc ou à xyz.

A propos des métaséquences

Les métaséquences sont des séquences de caractères ayant une signification spéciale dans un modele d'expression régulière. Le tableau suivant décrit ces métaséquences :

MétaséquenceDescription
{n}Indique un quantificateur numérique ou une plage de quantificateurs pour l'élement liéparent : /A{27} / correspond au caractère A répété 27 fois.
{n,}
et/ A{3} / correspond au caractère A répété 3 fois ou plus.
{n,}
Pour plus de détails, voir « Quantificateurs » à la page 85.
\bEtablit une correspondance à la position entre un caractère mot et un caractère non-mot. Si le premier ou le dernier caractère dans la chaine est un caractère mot, correspond égalément au début ou à la fin de la chaine.
\bEtablit une correspondance à la position entre deux caractères mot. Correspod égalément à la position entre deux caractères non-mot.
\dCorrespond à une décimale.
\DCorrespond à tout caractère autre qu'un chiffre.
\fCorrespond à un caractère de changement de page.
\nCorrespondau caractère de nouvelle ligne.
\rCorrespondau caractère de retard de chariot.
\sCorresponda tout caractère d'espace blanc (un espace, une tabulation, une nouvelle ligne ou un caractère de retard de chariot).
\SCorresponda tout caractère autre qu'un caractère d'espace blanc.
\tCorrespondau caractère de tabulation.
\u
\u
\vCorresponda un caractère d'avancement vertical.
\wCorresponda un caractère mot (AZ-, az-, 0-9 ou _). \wne correspond pas aux caractères qui ne sont pas anglais tels que é, n, ou φ.
\wCorresponda tout caractère autre qu'un caractère mot.
\xnnCorresponda au caractère avec la valeur ASCII spécifiée, comme définir par le nombre hexadecimal nn.

Classes de caractère

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Vous utilisez des classes de caractère pour spécifier une liste de caractères devant correspondir à une position dans l'expression régulière. Vous définissez des classes de caractère avec des crochets ( [ et ]). Par exemple, l'expression régulière suivant définit une classe de caractère qui remplace bag, beg, big, bog ou bug :

/b[aeiou]g/

Sequences d'échévement dans des classes de caractère

La plupart des caractères de remplacement et des métaséquences ayant normalement des significations spéciales dans une expression régulière n'ont pas ces mêmes significations dans une classe de caractère. Par exemple, dans une expression régulière, l'astérisque est utilisé pour la répetition, mais ce n'est pas le cas lorsqu'il apparait dans une classe de caractère. La classe de caractère suivante correspond à l'astérisque de façon littérale, avec tout autre caractère répertorié :

/ [abc*123] / 

Cependant, les trois caractères répertoriés dans le tableau suivant fonctionnent comme des caractères de remplacement, avec une signification spéciale, dans des classes de caractère :

Caractère de remplacementSignification dans des classes de caractère
]Définit la fin de la classe de caractère.
-Définit une plage de caractères (voir la section suivante, " Plages de caractères dans des classes de caractère").
\Définit des métaséquences et annule la signification spéciale des caractères de remplacement.

Pour que ces caractères soient reconnus comme caractères litteraux (dans la signification du caractère de remplacement spécifique), vous devez faire précéder le caractère du caractère d'échémpement. Par exemple, l'expression régulière suivante inclut une classe de caractère qui correspond à l'un des quatre symboles (\$, \, ] ou -):

[ / [\\ \backslash \\ ]\backslash -] / ] 

Outre les caractères de remplacement qui conservent leurs significations spéciales, les métaséquences suivantes fonctionnent comme des métaséquences dans des classes de caractère :

MétaséquenceSignification dans des classes de caractère
\nCorrespond à un caractère de nouvelle ligne.
\rCorrespond à un caractère de retard de chariot.
\tCorrespond à un caractère de tabulation.
\u n n nCorrespond au caractère avec la valeur de point de code Unicode spécifique ( comme défini par le nombre hexadecimal n n n).
\x n nCorrespond au caractère avec la valeur ASCII spécifique ( comme défini par le nombre hexadecimal n n).

D'autres caractères de remplacement et métaséquences d'expression régulière sont considérés comme des caractères normaux dans une classe de caractère.

Plages de caractères dans des classes de caractère

Utilisez le trait d'union pour spécifique une plage de caractères telle que A - Z , a - z , ou 0-9. Ces caractères doivent constituer une plage valide dans le jeu de caractères. Par exemple, la classe de caractère suivante correspond à un caractère compris dans la plage a - z ou un chiffre :

[ / [a - z0 - 9] / ] 

Vous peuvent également utiliser le code de caractère ASCII \xnn pour spécifique une plage par valeur ASCII. Par exemple, la classe de caractère suivante correspond à un caractère d'un jeu de caractères ASCII étendus (é et e, par exemple):

\X 

Classes de caractère niées

Lorsque vous utilisez un caret (^) au début d'une classe de caractère, il la Nie (tot caricature non repertorié est considéré comme une correspondance). La classe de caractère suivante correspond à tout caricature sauf une dette minuscule (az-) ou un chiffre :

/ [ -z0 - 9] /

Vous doivent taper le caret (°) au début d'une classe de caractère pour indiquer la négation. Autrement, vous ajoutez simplement le caret aux caractères dans la classe de caractère. Par exemple, la classe de caractère suivante correspond à un symbole (le caret, notamment):

/ [!.#+%$&^] / 

Quantificateurs

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Voussutilizestesquantificateurs pourspecifierdesrepetitionsdecaracteresoude séquencesdansdesmodés,comme suit:

Caractère de remplacement de quantificateurDescription
* (étoile)Correspond à l'élement precedent répété zéro ou plusieurs fois.
+(plus)Correspond à l'élement precedent répété une ou plusieurs fois.
? (point d'interrogation)Correspond à l'élement precedent répété zéro ou une fois.
{n}Indique un quantificateur numérique ou une plage de quantificateurs pour l'élement precedent :
{n,}/À{27}/ correspond au caractère A répété 27 fois.
et/À{3}/ correspond au caractère A répété 3 fois ou plus.
{n,n}/À{3,5}/ correspond au caractère A répété 3 à 5 fois.

Vou puez appliquer un quantificateur a un seul caractere, a une classe de caractere ou a un groupe :

  • a + / correspond au caractère a répétré une ou plusieurs fois.
  • d + / correspond à un ou plusieurs chiffres.
  • / [abc] +/ correspond à une répetition d'un ou de plusieurs caractères, a, b, ou c.
  • / (very, ) */ correspond au mot very suivi par une virgule et un espace répété zéro ou plusieurs fois.

Vou puez utilise des quantificateurs dans des groupes de parentheses auxquels sont appliqués des quantificateurs. Par exemple, le quantificateur suivant correspond à des chaînes du type word et word-word-word:

w + (- w)^* /

Par défaut, les expressions régulières effectuent un greedy matching. Tout sous-modèle dans l'expression régulière (.*, par exemple) tente demettre en correspondence autant de caractères que possible dans la chaine avant de passer à la partie suivante de l'expression régulière. Par exemple, considérrez l'expression régulière et la chaine suivantes :

var pattern: RegExp = /<p>.*<\p>/; 

L'expression régulière correspond à la chaine entière :

Supposez, néanmoins, que vous souhaitez étabir une correspondance avec un seul groupe . Vous pouvez procéder comme suit:

<p>Paragraph 1</p> 

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 combiniez 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 suivé d'un quantificateur . Considerons par exemple le code qui suit :
var str:String = "<p>Test\n";
str += "Multiline</p>";
var re:RegExp = "/<p>.*<\p>";
trace(str.match(re)); // null;
re = "/<p>.*<\p>/s";
trace(str.match(re));
// output: <p>Test
// Multiline</p> 

Pour plus d'informations, voir « Indicateurs et propriétés » à la page 89.

Permutation

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

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/; 

Vouss pouvez utiliser des parenthèses pour définir des groupes et limiter le domaine du permutateur |. L'expression régulière suivante correspond à catuivi de nap ou nip :

var pattern: RegExp = /cat(nap|nip) /; 

Pour plus d'informations, voir « Groupes » à la page 87.

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 :

Pour plus d'informations, voir « Classes de caractère » à la page 83.

Groupes

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Vouspouvezspecifierungroupe dans une expressionreguliereenutilisantdesparentheses, comme suit:

/class-(\d*)/ 

Un groupe est une sous-section d'un modele. Vous pouvez utiliser des groupes pour effectuer les operations suivantes :

  • Appliquer un quantificateur à plusieurs caractères
  • Delimiter des sous-modeles à appliquer avec la permutation (à l'aide du caractère |)
  • Capturer des correspondances de sous-chaine (par exemple, en utilisant 1 dans une expression régulière pour étabir une correspondance avec un groupe mis en correspondence 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'utilise 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 :

Néanmoins, vous pouvez utiliser un groupe pour appliquer un quantificateur à plusieurs caractères ou classes de caractère :

Pour plus d'informations sur les quantificateurs, voir « Quantificateurs » à la page 85.

Utilisation de groupes avec le permutateur (I)

Vou puez 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

Utilisation de groupes pour capturer des correspondances de sous-chaine

Lorsque vous définissez un groupe entre parenthèses standard dans un modulo, 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érie 1 correspond à toute sous-chaine mise en correspondence avec le groupe entre parenthèses capturé :

var pattern: RegExp = /(\d+) -by-\1/;

Vou puez 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 chaine de groupecapturé dans la chaine de remplacement :

var pattern: RegExp = /Hi, (\w+).;

var str:String = "Hi, Bob.";

trace(str.replace(pattern, "$1, hello").));

// output: Bob, hello.

Si vous utilisez des groupes capturés, la méthode exec() de la classe RegExp et la méthode match() de la classe String rengoient des sous-châ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 capturing est utilisé pour le regroupement uniquement ; il n'est pas collecté et il ne correspond pas à des backreferences numéroétées. Utilisez (? : et ) pour définir des groupes non capturés, comme suit :

var pattern = /(?:com|org|net);

Par exemple, notez la différence entremettre(com|org) dans un groupe caputé et dans un groupe noncaputé (la méthode exec () répertorie les groupes captures après la correspondancecomplete):

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écifique de groupe non capturing 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-module dans le groupe doit étabrir 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 capture, 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 étabrir une correspondance à la position. 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<digits>\d+) [a-z] +; 

Lorsque you utilise la méthode exec(), un groupe nommé de correspondance est ajusté comme propriété du tableau résultat :

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<name>(\w| [_.\-]) + )@(?P<dom>((\w|-)+)) + .\w{2,4}+;  
var address:String = "bob@example.com";  
var result:Array = emailPattern.exec(address);  
trace(result.name); // bob  
trace(result Dom); // example 

Remarque : les groupes nommés ne font pas partie de la Specification du langage ECMAScript. Ils représentent une fonction ajoutée dans ActionScript 3.0.

Indicateurs et propriétés

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Le tableau suivant répertorie les cinq indicateurs que vous pouvez définir pour des expressions régulières. Vous pouvez acceder à chaque indicateur en tant que propriété de l'objet d'expression régulière.

IndicateurPropriétéDescription
gglobalA plusieurs correspondances.
iignoreCaseCorrespondance sensible à la casse. S'applique aux caractères A-Z et a-z mais pas à des caractères étendus tels que É et é.
mmultilineLorsque cet indicateur est défini, $ et ^ peuvent correspondre au début d'une ligne et à la fin d'une ligne, respectivement.
sdotallLorsque cet indicateur est défini, . (point) peut correspondre au caractère de nouvelle ligne (\n).
xextendedAutorise les expressions régulières étendues. Vous pouvez tapez des espaces dans l'expression régulière. Ils sont importés dans le cadre du modulo. Ceci vous permet de taper un code d'expression régulière de façon plus lisible.

Ces propriétés sont en lecture seule. Vous pouvez définir les indicateurs (g, i, m, s, x) lorsque vous définiquee 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 nominé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 chaine à utiliser pour l'appel suivant à la méthode exec() ou test() d'une expression régulière.
  • La propriété source spécifie la chaine qui définit la portion de modèle de l'expression régulière.

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-chaine de correspondence uniquement:

Lorsque l'indicateur g est defini, la méthode Sting.match() renvoie plusieurs correspondances, comme suit :

L'indicateur i (ignoreCase)

Par défaut, les correspondances d'expression régulière sont sensibles à lacke. Lorsque vous définissez l'indicateur i (ignoreCase), le respect de la casse est ignoré. Par exemple, la lecture minuscule s dans l'expression régulière ne correspond pas à la lettuce majuscule s, le premier caractère de la chaine :

Lorsque l'indicateur est défi ni, cependant, l'expression régulière correspond à la lecture majuscule s :

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 E et e.

L'indicateur m (multiline)

Si l'indicateur m (multiline) n'est pas définir, le ^ correspond au début de la chaine et le s à 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 chaine 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. 

Meme si l'indicateur g (global) est defini dans l'expression régulière, la méthode match() correspond à une seule sous-chaine, car il n'existe qu'une seule correspondance pour le ^ (le début de la chaine). Le résultat est le suivant :

Test

Voici le même code avec l'indicateur m défin :

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 )
  • Séparateur de ligne Unicode (\u2028)
  • Séparateur de paragraphe Unicode (\u2028)

L'indicateurs (dotall)

Si l'indicateur s (dotall ou "dot all") n'est pas définir, un point (. ) dans un modele 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 = "<p>Test\n";
str += "Multiline</p>";
var re:RegExp = "/<p>.*?<\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 = "<p>Test\n";
str += "Multiline</p>";
var re:RegExp = "/<p>.*?<\p>/s";
trace(str.match(re)); 

Dans ce cas, la correspondance est la sous-chaine entiere dans les balises < > , y compris le caractere de nouvelle ligne :

<p>Test  
Multiline</p> 

L'indicateur x (extended)

Les expressions régulières peuvent être difficiles à dire, notamment lorsqu'elles comprennent de nombreux métasymboles et métaséquences. Exemple :

$$ / < p (> | (\backslash s ^ {} [ ^ {\wedge} ] ^ { >})). ^ {\star}? < \backslash / p > / g i $$

Lorsque you utilisez l'indicateur × (extended) dans une expression reguliere, les espaces vides que vous tapez dans le modele sont ignorés. Par exemple, l'expression reguliere suivante est identique à l'exemple precedent :

$$ / \quad < p \quad (> \mid (\backslash s ^ {} [ ^ {\wedge} ] ^ {} >)) \quad . ^ {*} ? \quad < / p > \quad / g i x $$

Si l'indicateur × est défié et que vous souhaitez établit une correspondance avec un espace vide, faites précédder l'espace vide d'une barre oblique. Par exemple, les deux expressions régulières suivantes sont équivalentes :

La propriété lastIndex

La propriété lastIndex spécifie la position d'index dans la chaine à laquelle la recherche suivante doit démarrer. Cette propriété affecte les méthodes exec() et test() appelées sur une expression régulière dont l'indicateur g est définir sur true. Considérons par exemple le code qui suit :

var pattern:RegExp = /p\w*/gi;  
var str:String = "Pedro Piper picked a peck of pickled peppers.";  
trace(pattern.lastIndex);  
var result:Object = pattern.exec(str);  
while (result != null)  
{  
    trace(pattern.lastIndex);  
    result = pattern.exec(str);  
} 

La propriété lastIndex est défini sur 0 par défaut (pour commencer les recherches au début de la chaine). ÀpRES chaque correspondance, elle est définié sur la position d'index suivant la correspondance. Par conséquent, le résultat pour le code précédent est le suivant :

0   
5   
11   
18   
25   
36   
44 

Si l'indicateur global est défini sur false, les méthodes exec() et test() n'utilisent pas ni ne définiennent la propriété lastIndex.

Les méthodes match(), replace() et search() de la classe String lancent toutes les recherches du début de la chaine, independamment du réglage de la propriété lastIndex de l'expression régulière utilisée dans l'appel à la méthode (néanmoins, la méthode match() définit lastIndex sur 0).

Vou puez définir la propriété lastIndex de sorte à ajuster la position de début dans la chaîne pour la mise en correspondence des expressions régulières.

La propriété source

La propriété source spécifie la chaine qui définit la portion de modèle d'une expression régulière. Exemple :

var pattern: RegExp = /foo/gi;

trace(pattern.source); // foo

Méthodes d'utilisation d'expressions régulières avec des chaînes

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La classe RegExp comprend deux méthodes: exec() et test().

Outre les méthodes exec() et test() de la classe RegExp, la classe String comprend les méthodes suivantes qui vous permettent d'étabrir une correspondence avec des expressions régulières dans des chaînes : match(), replace(), search() et splice().

La méthode test()

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La méthode test() de la classe RegExp vérifie si la chaine fournie contient une correspondance pour l'expression régulière, comme l'indique l'exemple suivant:

var pattern: RegExp = /Class- \w/;

var str = "Class-A";

trace(pattern.test(str)); // output: true

La méthode exec()

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La méthode exec() de la classe RegExp vérifie si la chaine fournie contient une correspondance pour l'expression régulière et renvoie un tableau avec les éléments suivants:

La sous-chaine correspondante
- Les correspondances de sous-chaine pour les groupes entre parentheses dans l'expression régulière

Le tableau inclut également une propriété index qui indique la position d'index du début de la correspondance de sous-chaine.

Considérons par exemple le code qui suit :

var pattern: RegExp = /\d{3} -\d{3} -\d{4}/; //U.S phone number

var str:String = "phone: 415-555-1212";

var result:Array = pattern.exec(str);

trace(result.index, " - ", result);

// 7-415-555-1212

Utilisez la méthode exec() plusieurs fois pour établier une correspondance avec plusieurs sous-chains lorsqu'elindicateur g (global) est défini pour l'expression régulière :

var pattern:RegExp = /\w\sh\w\*/gi;   
var str:String = "She sells seashells by the seashore";   
var result:Array = pattern.exec(str);   
while (result != null) { trace(result.index, "\t", pattern.lastIndex, "\t", result); result = pattern.exec(str); } //output: //0 3 She //10 19 seashells //27 35 seashore 

Méthodes de chaine utilisant des paramètres RegExp

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Les méthodes suivantes de la classe String prènnant des expressions régulières comme paramêtres : match(), replace(), search() et split(). Pour plus d'informations sur ces méthodes, voir « Recherche de modélles dans des chaînes et remplacement de sous-chains » à la page 17.

Exemple d'expression régulière : analyseur Wiki

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Cet exemple simple de conversion de texte Wiki illustrer des utilisations d'expressions régulières :

  • Conversion de lignes de texte qui mettent en correspondence un modèle Wiki source et les chaînes de sortie HTML appropriées.
  • Utilisation d'une expression régulière pour convertir des modèles URL en balises de lien hypertexte HTML
  • Utilisation d'une expression régulière pour convertir les chaines dollar américain ("\(9.95", par exemple) enchaines euro ("8.24 €", par exemple)

Pour obtenir les fischiers d'application de cet exemple, voir www.adobe.com/go/learn_programmingAS3samplesflash_fr. Les fischiers de l'application WikiEditor se trouvent dans le dossier Samples/WikiEditor. L'application se compose des fischiers suivants:

FichierDescription
WikiEditor.mxml ou WikiEditor.flaFichier d'application principal dans Flash (FLA) ou Flex (MXML).
com/example/programmingas3/regExpExamples/WikiParser.asUne classe qui comprend des méthodes utilisant des expressions régulières pour convertir des modèles de texte d'entrée Wiki en-sortie HTML équivalente.
com/example/programmingas3/regExpExamples/URLParser.asUne classe qui comprend des méthodes utilisant des expressions régulières pour convertir des chaînes URL en balises de lien hypertexte HTML <a>.
com/example/programmingas3/regExpExamples/CurrencyConverter.asUne classe qui comprend des méthodes utilisant des expressions régulières pour convertir des chaînes dollar américain en chaînes euro.

Définition de la classe WikiParser

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La classe WikiParser inclut des méthodes qui convertissent le texte d'entrée Wiki en sortie HTML équivalente. Il ne s'agit pas d'une application de conversion Wiki très puissant, mais elle illustre des utilisations d'expressions régulières pour la mise en correspondence de modèle et la conversion de chaine.

La fonction constructeur et la méthode setWikiData() initialisent un exemple de chaine de texte d'entrée Wiki, comme suit :

public function WikiParser()
{
    wikiData = setWikiData();
} 

Lorsque l'utilisateur clique sur le bouton de test dans l'application exemple, cette dernière appelle la méthode parseWikiString() de l'objet WikiParser. Cette méthode appelle plusieurs autres méthodes, qui assemblent à leur tour la chaine HTML résultat.

public function parseWikiString(wikiString:String):String
{ var result:String = parseBold(wikiString); result = parseItalic(result); result = linesToParagraphs(result); result = parseBullets(result); return result;
}

Chaque méthode appelée—parseBold(), parseItalic(), linesToParagraphs(), et parseBullets()—utilise la méthode replace() de la chaine pour remplaçer les modèles de correspondence, définis par une expression régulière, de façon à transformer le texte Wiki en texte formaté HTML.

Conversion des modèles de texte en gras et en italique

La méthode parseBold() recherche un modele de texte Wiki en gras ('' 'foo' ', par exemple) et le transforme en son équivalent HTML (foo, par exemple), comme suit :

private function parseBold(input:String):String  
{  
    var pattern:RegExp = /^[''']/*.gro;  
    return input.replace(pattern, "<b>$1</b>")  
} 

Notez que la portion (.?) de l'expression régulière correspond à des caractères () entre les deux modèles de définition '.'. Le quantificateur ? rend la correspondance nongreedy, de façon à ce que pour une chaine telle que ' ' 'aaa' ' ' 'bbb ' ' 'ccc' ' ' ', la première chaine mise en correspondance soit ' ' 'aaa' ' ' ' et non la chaine entière (qui commence et se termine par le modele "'').

Les parentheses dans l'expression régulière définissant un groupe capturing, et la méthode replace() se refère à ce groupe en utilisant le code §1 dans la chaine de remplacement. L'indicateur g (global) dans l'expression régulière vérifie que la méthode replace() remplace toutes les correspondances dans la chaine (pas simplement la première).

La méthode parseItalic() fonctionne comme la méthode parseBold(), sauf qu'elle recherche deux apostrophes ('') comme séparateur pour le texte en italique (au lieu de trois):

private function parseItalic(input:String):String  
{  
    var pattern:RegExp = /^['.*?']'/g;  
    return input.replace(pattern, "<i>$1</i>")  
} 

Conversion de modèles de puce

Comme dans l'exemple suivant, la méthode parseBullet() recherche le modele de puce Wiki (* foo, par exemple) et le transforme en son équivalent HTML (< 1i>foo</ / li> , par exemple):

private function parseBullets(input:String):String  
{  
    var pattern: RegExp = /\^{\.*}(.*)/gm;  
    return input.replace(pattern, "<li>$1</li>")  
} 

Le symbole ^ au début de l'expression régulière correspond au début d'une ligne. L'indicateur m (multiline) dans l'expression régulière fait en sorte que cette dernière compare le symbole ^ au début d'une ligne, et non simplement au début de la chaine.

Le modele correspond à un astérisque (la barre oblique est utilisé pour signaler un astérisque littéral au lieu d'un quantificateur ).

Les parentheses dans l'expression régulière définissent un groupe capturé, et la méthode replace() se refère à ce groupe en utilisant le code §1 dans la chaine de remplacement. L'indicateur g (global) dans l'expression régulière vérifie que la méthode replace() remplace toutes les correspondances dans la chaine (pas simplement la première).

Conversion de modèles Wiki de paragraphe

La méthode linesToParagraphs() convertit chaque ligne dans la chaine Wiki d'entrée en une balise de paragraphe HTML <p> . Ces lignes dans la méthode extraient des lignes vides de la chaine d'entrée Wiki:

var pattern: RegExp = /\^$/gm;
var result: String = input.replace(pattern, "", ); 

Les symboles ^ et dans l'expression régulière correspondant au début et à la fin d'une ligne. L'indicateur m (multiline) dans l'expression régulière fait en sorte que cette dernière compare le symbole ^ au début d'une ligne, et non simplement au début de la chaine.

La méthode replace() remplace toutes les chaînes de correspondence (lignes vides) par une chaine vide (""). L'indicateur g (global) dans l'expression régulière vérifie que la méthode replace() remplace toutes les correspondances dans la chaine (pas simplement la première).

Conversion d'URL en balises HTML

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Lorsque l'utilisateur clique sur le bouton de test dans l'exemple d'application et qu'il a coché la case urlToATag, l'application appelle la méthode statique URLParser.urlToATag() pour convertir les chaînes URL de la chaîne Wiki d'entrée en balises HTML .

var protocol:String = (((?:http|ftp)://)";  
var urlPart:String = "("([a-z0-9_]+\..[a-z0-9_]+)”;  
var optionalUrlPart:String = "("(\.[a-z0-9_]*)";  
var urlPattern:RegExp = newRegExp(protocol + urlPart + optionalUrlPart, "ig");  
var result:String = input.replace(urlPattern, "<a href='\\1\\2\\3'><u>$1\\2\\3</u></a>"); 

La fonction constructeur RegExp() sert à assembler une expression régulière (urlPattern) à partir de plusieurs parties constituantes. Ces parties constituentes sont représentées par chaque chaîne définitissant une partie du modele de l'expression régulière.

La première partie du modele de l'expression régulière, définite par la chaine protocol, définit un protocole URL : http:// ou ftp:///. Les parenthèses définissent un groupe non capture, indiqué par le symbole ?. Ceci signifie que les parenthèses seront simplement a définir un groupe pour le modele de permutation | ; le groupe ne correspondra pas à des codes de backreference ( 1, 2, $3) dans la chaine de remplacement de la méthode replace().

Les autres parties constituent de l'expression régulière utilisent chacune des groupes capturés (indiqués par des parentheses dans le modele) qui sont ensuite utilisés dans les codes de backreference ( 1, 2, $3) dans la chaine de remplacement de la méthode replace().

La partie du modele définie par la chaine urlPart correspond au moins à l'un des caractères suivants : a-z, 0-9, _ ou -. La quantificateur + indique qu'au moins un caractère à une correspondance. Le . indique un point obligatoire (.). Et le reste correspond à une autre chaine d'au moins un de ces caractères : a-z, 0-9, _ ou -.

La partie du modele définie par la chaine optionalUrlPart correspond à zéro ou plus des caractères suivants : un point (. ) suivi par n'importe quel nombre de caractères alphanumeric (y compris _ et -). Le quantificateur * indique que zéro ou plus de caractères ont une correspondance.

L'applé à la méthode replace() utilise l'expression régulière et assemble la chaîne HTML de remplacement, à l'aide de backreferences.

La méthode urlToAtag() appelle ensuite la méthode emailToAtag(), qui utilise des techniquessemblables pour remplaçer des modèles de courrier électronique par des chaînes de lien hypertexte HTML . Les expressions régulières utilisées pour correspond à des URL HTTP, FTP et de courrier électronique dans le fjichier sont assez simples car elles sont données à titre d'exemple. Elles sont beaucoup plus compliquées si l'on souhaite étabir une correspondence plus correcte.

Conversion deschaines dollar américain chanées euro

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Lorsque l'utilisateur clique sur le bouton de test dans l'exemple d'application et qu'il a coché la case dollarToEuro, l'application appelle la méthode statique CurrencyConverter.usdToEuro() pour convertir des chaines dollar américain ("\(9.95", par exemple) en chaines euro ("8.24€", par exemple), comme suit :

var usdPrice: RegExp = /\$([\d,] + .d+) + /g;  
return input.replace(usdPrice, usdStrToEuroStr); 

La première ligne définit un modèle simple pour étabir une correspondance avec des chaines dollar américain. Le caractère (s) est precedé du caractère d'échéppement ().

La méthode replace() utilise l'expression régulière pour étabir une correspondance avec le modèle et appelle la fonction usdStrToEuroStr() pour déterminer la chaîne de remplacement (une valeur en euros).

Lorsqu'un nom de fonction est utilisé comme deuxieme paramètre de la méthode replace(), les éléments suivants sont transmis comme paramétres à la fonction appelée :

  • La partie correspondante de la chaine.
  • Tout groupe entre parentheses capture correspondant. Le nombre d'arguments transmis de cette façon varie selon le nombre de correspondances de groupes entre parentheses capturées. Pour déterminer le nombre de correspondances de groupes entre parentheses capturés, vérifie arguments.length - 3 dans le code de la fonction.
  • La position d'index dans la chaine ou débute la correspondance.
    La chaine complete.

La méthode usdStrToEuroStr() convert les modèles de chaine dollar américain en châines euro, comme suit :

private function usdToEuro(...args):String  
{  
    var usd:String = args[1];  
    usd = usd.replace("\\","\\");  
    var exchangeRate:Number = 0.828017;  
    var euro:Number = Number(USD) * exchangeRate;  
    trace(usd, Number(USD), euro);  
    const euroSymbol:String = String.fromCharCode(8364); // €  
    return euro.toFixed(2) + " " + euroSymbol;  
} 

args [1] représenté le groupe entre parentheses capturing mis en correspondence par l'expression régulière usdPrice. Il s'agit de la portion numérique de la chaine dollar américain, c'est-à-dire la quantité en dollar, sans le signe . La méthode applique une conversion de taux de change et renvoie la chaine résultat (avec un symbole de fin de ligne € au lieu du symbole place à gauche).

Chapitre 6 : Utilisation de XML

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

ActionScript 3.0 inclut un groupe de classes basé sur la Specification ECMAScript pour XML (E4X) (ECMA-357 version 2). Ces classes comprend une fonctionnalité puissant et facile à utiliser permettant de travailler avec des données XML. A l'aide d'E4X, vous pouvez développer un code avec des données XML plus rapidement qu'avant les techniques de programmation précédentes. En outre, le code que vous produit est plus facile à dire.

Voir aussi

Classe XML

Spécification ECMA-357

Principes de base de XML

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

XML est un moyen standard de représentier des informations structurées afin de permettre aux ordinateurs de les utiliser facilement et aux utilisateurs de les écrire et de les comprendre. XML est l'abréviation de eXtensible Markup Language. La norme XML est disponible à l'adresse www.w3.org/XML/.

XML offre une façon pratique et standard de classer des données, afin de facilitier leur lecture, leur accès et leur manipulation. XML utilise une arborescence et une structure de balises identiques à celle du code HTML. Voici un exemple simple de données XML :

Les données XML peuvent également être plus complexes, avec des balises imbriquées dans d'autres balises ainsi que des attributs et d'autres composants structurels. Voici un exemple plus complexe de données XML :

Vous remarquerez que ce document XML contient d'autres structures XML complètes (les balises song avec leurs enfants, par exemple). Il démontre également d'autres structures XML telles que des attributs (tracknumber et length dans les balises song), et des balises qui contiennent d'autres balises au lieu de données (la balise tracks, par exemple).

Prise en main de XML

Si vous avez peu ou pas d'experience avec XML, voici une brève description des aspects les plus courants des données XML. Les données XML sont écrites sous forme de texte brut, avec une syntaxe spécifique permettant d'organiser les informations en un format structuré. Généralement, un seul jeu de données XML est appelé un document XML. Dans le format XML, les données sont organises en éléments (qui peuvent être des éléments de données unique ou des conteneurs pour d'autres éléments) à l'aide d'une structure hierarchique. Chaque document XML possède un élément comme niveau supérieur ou élément principal. Cet élément racine peut containir une seule information, même s'il est plus probable qu'il contienne d'autres éléments qui, à leur tour, contiennent d'autres éléments, et ainsi de suite. Par exemple, ce document XML contient les informations relatives à un album musical :

Chaque élément se désigne par un ensemble de balises—le nom de l'élément place entre chevrons (signes inférieur à et supérieur à). La balise de début, indiquant le début de l'élément, porte le nom de l'élément :

<title> 

La balise de fin, qui marque la fin de l'objet, a une barre oblique avant le nom de l'objet :

</title> 

Si un élément est vide, il peut être écrit comme élément vide (parfois appelé élément de fin automatique). Dans XML, cet élément :

<lastplayed/> 

est identique a cet élément :

Outre le contenu de l'élément place entre les balises de début et de fin, un élément peut composer d'autres valeurs, appelées attributs, définies dans la balise de début de l'élement. Par exemple, cet élément XML définit un seul attribut appelé length, avec la valeur "4:19":

Chaque élément XML possède un contenu qui est soit une valeur, soit un ou plusieurs éléments XML, ou rien du tout (pour un élément vide).

En savoir plus sur XML

Pour en savoir plus sur l'utilisation de XML, un grand nombre de livres et de ressources sont disponibles, ainsi que les sites Web suivants :

  • Didactiel XML W3Schools : http://w3schools.com/XML/
  • Didacticiels XMLpitstop, listes de discussions, etc.: http://xmlpitstop.com/

Classes ActionScript pour utiliser XML

ActionScript 3.0 inclut plusieurs classes permettant d'utiliser des informations structurées XML. Les deux classes principales sont les suivantes :

  • XML : représenté un seul élément XML, qui peut être un document XML avec plusieurs enfants ou un élément à une seule valeur dans un document.
  • XMLList : représenté un ensemble d' éléments XML. Un object XMLList est utilisé lorsque plusieurs éléments XML sont des frères (au même niveau, et contenus par le même parent, dans la hierarchie du document XML). Par exemple, une occurrence de XMLList serait le moyen le plus facile d'utiliser cet ensemble d' éléments XML (probabilité contenus dans un document XML):
<artist type="composer">Fred Wilson</artist>  
<artist type="conductor">James Schmidt</artist>  
<artist type="soloist">Susan Harriet Thurndon</artist> 

Pour des utilisations plus avances impliquant des espaces de noms XML, ActionScript inclut également les classes Namespace et QName. Pour plus d'informations, voir « Utilisation des espaces de noms XML » à la page 114.

Outre les classes intégrées permettant d'utiliser XML, ActionScript 3.0 comprend également plusieurs opérateurs offrant des fonctionnalités spécifiques pour acceder et manipuler des données XML. Cette approche d'utilisation de XML au moyen de ces classes et de ces opérateurs est appelée ECMAScript pour XML (E4X), comme définir par la Specification ECMA-357 version 2.

Concepts importants et terminologie

La liste de référence suivante contient des termes importants utilisés dans le cadre de la programmation de routines de gestion des éléments XML :

Elément Entité unique dans un document XML correspondant au contenu compris entre une balise de début et une balise de fin (balises comprises). Les éléments XML peuvent containir des données de texte ou d'autres éléments, ou bien être vides.

Element vide Element XML qui ne contient aucun élément infant. Les éléments vides sont souvent écrites en tant que balises de fin automatique (, par exemple).

Document Structure XML unique. Un document XML peut containir n'importe quel nombre d'éléments (ou peut être constitué d'un seul élément vide); cependant, un document XML doit avoir un seul élément de niveau supérieur qui contient tous les autres éléments dans le document.

Nœud Autre nom d'un élément XML.

Attribut Valeur nommée associée à un élément qui est écrite dans la balise de début de l'élément au format attributename="valeur",只不过 que d'être écrite comme élément enfant séparé imbriqué dans l'élément.

Approche E4X concernant le traitement XML

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La Specification ECMAScript pour XML définit un ensemble de classes et de fonctionnalités permettant d'utiliser des données XML. Cet ensemble de classes et de fonctionnalités est connu sous le nom de E4X. ActionScript 3.0 intégre les classes E4X suivantes : XML, XmlList, QName et Namespace.

Les méthodes, propriétés et opérateurs des classes E4X sont conçus avec les objectifs suivants :

  • Simplicité : lorsque cela est possible, E4X facilité l'écriture et la compréhension du code à utiliser avec des données XML.
  • Coherence : les méthodes et le raisonnement E4X sont cohérents avec eux-mêmes et avec d'autres parties d'ActionScript.
  • Connaissance : you manipulez des données XML avec des opérateurs bien connus tels que l'opérateur point ( ).

Remarque : ActionScript 2.0 intégre une autre classe XML. Dans ActionScript 3.0, cette classe a été renommée XMLDocument, pour éviter tout conflit de nom avec la classe XML d'ActionScript 3.0 qui fait partie d'E4X. Dans ActionScript 3.0, les classes hériétées (XMLDocument, XmlNode, XmlParser et XMLTag) sont comprises dans le package flash.xml, pour la prise en charge du contenu hériété principalement. Les nouvelles classes E4X sont des classes de base. Vous ne devez pas importer de package pour les utiliser. Pour plus d'informations sur les classes XML d'ActionScript 2.0 existantes, voir le package flash.xml dans le manuel Guide de referencia ActionScript 3.0 pour la plate-forme Adobe Flash.

Voici un exemple de manipulation de données avec E4X :

var myXML:XML = <order> <item id='1'> <menuName>burger</menuName> <price>3.95</price> </item> <item id='2'> <menuName>fries</menuName> <price>1.45</price> </item> </order> 

Votr application chouent des donnns XML depus une source externe telle qu'un service Web ou un flux RSS. Toutefois, par souci de clarté, les exemples de code ci-apres affectent les données XML en tant que litteraux.

Comme l'indique le code suivant, E4X inclut des opérateurs intuitifs tels que les opérateurs point (. ) et identifient d'attribut (@) pour acceder aux propriétés et aux attributs dans l'XML :

trace(myXML.item[0].userName); // Output: burger  
trace(myXML.item.(id==2).userName); // Output: fries  
trace(myXML.item.(userName=="burger").price); // Output: 3.95 

Utilisez la méthode appendChild() pour affecter un nouveau nœud enfant à l'XML, comme l'indique le code suivant :

var addItem:XML = <item id="3"> <menuName>medium cola</menuName> <price>1.25</price> </item>   
myXML.appendChild(newItem); 

Utilisez les opérateurs @ et. non seulement pour dire des données mais également pour les affecter, comme dans l'exemple suivant :

myXML.item[0].menuName="regular burger";  
myXML.item[1].menuName="small fries";  
myXML.item[2].menuName="medium cola";  
myXML.item.(menuName=="regular burger").@quantity = "2";  
myXML.item.(menuName=="small fries").@quantity = "2";  
myXML.item.(menuName=="medium cola").@quantity = "2"; 

Utilisez une boucle for pour parcouir en boucle les nœuds de l'XML, comme suit :

var total:Number = 0 for each (var property:XML in myXML.item)
{ var q:int Number[property/@quantity); var p:Number Number[property.price); var itemTotal:Number = q*p; total + = itemTotal; trace(q ^+ " " ^+ property.getName + " \"^+$ itemTotal.toFixed(2))
}
trace("Total:\$",total.toFixed(2));

Objects XML

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Un objet XML peut représentier un élément XML, un attribut, un commentaire, une instruction de traitement ou un élément de texte.

Un objet XML est classé soit dans la catégorie des objets ayant un contenu simple, soit dans celle des objets ayant un contenu complexe. Un objet XML ayant des nœuds infant est considéré comme ayant un contenu complexe. Le contenu est considéré comme simple s'il correspond à un attribut, un commentaire, une instruction de traitement ou un nœud de texte.

Par exemple, l'objet XML suivant contient un contentu complexe, y compris un commentaire et une instruction de traitement :

XMLignoreComments = false;
XML注意事项 false;
varx1:XML = <--Thisisacomment.--> <menuName burger <price 3.95 <menuName fries <price 1.45

Comme l'indique l'exemple suivant, vous pouvez maintainant utiliser les méthodes comments() et processingInstructions() pour créé des objets XML, un commentaire et une instruction de traitement :

var x2:XML = x1comments() [0];  
var x3:XML = x1processingInstructions() [0]; 

Propriétés XML

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La classe XML a cinq propriétés statiques :

  • Les propriétés ignoreComments et ignoreProcessingInstructions déterminent si les commentaires ou les instructions de traitement sont ignorés lorsque l'objet XML est analysé.
  • La propriété ignoreWhitespace détermine si les espaces blancs sont ignorés dans les balises d'un élément et les expressions intégrées séparées uniquement par des espaces blancs.
  • Les propriétés prettyIndentet prettyPrinting seront à formater le texte renvoyé par les méthodes toString() et toXMLString() de la classe XML.

Pour plus d'informations sur ces propriétés, voir le manuel Guide de référence ActionScript 3.0 pour la plate-forme Adobe Flash.

Méthodes XML

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Les méthodes suivantes vous permettent d'utiliser la structure hierarchique des objets XML :

- appendChild()
- child()
- childIndex()
- children()
- descendants()
- elements()
- insertChildAfter() 
  • insertChildBefore()
    parent()
    -neys

Les méthodes suivantes vous permettent d'utiliser des attributs d'objet XML :

  • attribute()
  • attributes()

Les méthodes suivantes vous permettent d'utiliser des propriétés d'objet XML :

  • hasOwnProperty()
    propertyIsEnumerable()
  • replace()
  • setChildren()

Les méthodes suivantes vous permettent d'utiliser des espaces de nom et des nombres qualifiés :

  • addNamespace()
  • inScopeNamespaces()
  • localName()
    name()
  • namespace()
  • namespaceDeclarations()
  • removeNamespace()
  • setLocalName()
  • setName()
  • setNamespace()

Les méthodes suivantes vous permettent d'utiliser et de déterminer certains types de contenu XML :

  • comments()
  • hasComplexContent()
  • hasSimpleContent()
  • nodeKind()
  • processingInstructions()
    text()

Les méthodes suivantes vous permettent d'effectuer des conversions en chaînes et de formater des objets XML :

  • defaultSettings()
  • setSettings()
  • settings()
  • normalize()
  • toString()
  • toXMLString()

Il existe quelques méthodes supplémentaires :

  • contains()
    copy()
  • valueOf()
    length()

Pour plus d'informations sur ces méthodes, voir le manuel Guide de référence ActionScript 3.0 pour la plate-forme Adobe Flash.

Objects XmlList

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Une occurrence de XmlList représenté un ensemble arbitraire d'objects XML. Elle peutContainir des documents XML complets, des fragments XML ou les résultats d'une requête XML.

Les méthodes suivantes vous permettent d'utiliser la structure hiéarchique des objets XmlList :

  • child()
  • children()
  • descendants()
    elements()
    parent()

Les méthodes suivantes vous permettent d'utiliser des attributs d'objet XmlList :

  • attribute()
  • attributes()

Les méthodes suivantes vous permettent d'utiliser des propriétés XmlList :

  • hasOwnProperty()
  • propertyIsEnumerable()

Les méthodes suivantes vous permettent d'utiliser et de déterminer certains types de contenu XML :

  • comments()
  • hasComplexContent()
  • hasSimpleContent()
  • processingInstructions()
    text()

Les méthodes suivantes vous permettent d'effectuer des conversions en chaînes et de formater les objets XMLList :

  • normalize()
  • toString()
  • toXMLString()

Il existe quelques méthodes supplémentaires :

  • contains()
    copy()
    length()
  • valueOf()

Pour plus d'informations sur ces méthodes, voir le manuel Guide de référence ActionScript 3.0 pour la plate-forme Adobe Flash.

Pour un objet XMllist qui contient exactement un element XML, vous pouze utiliser toutes les propriétés et les méthodes de la classe XML car un XMllist avec un élément XML est traité comme un objet XML. Par exemple, dans le code suivant, étant donné que doc.div est un objet XMllist contenant un élément, vous pouze utiliser la méthode appendChild() de la classe XML :

var doc:XML =  
    <body>  
        <div>  
            <p>Hello</p>  
            </div>  
        </body>;  
doc.div.appendChild(<p>World</p}); 

Pour consulter la liste des méthodes et des propriétés XML, voir « Objects XML » à la page 103.

Initialisation de variables XML

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Vous pouvez affecter un litteral XML à un objet XML, comme suit :

var myXML:XML =  
<order>  
    <item id='1'>  
        <menuName>burger</menuName>  
        <price>3.95</price>  
    </item>  
    <item id='2'>  
        <menuName>fries</menuName>  
        <price>1.45</price>  
    </item>  
</order> 

Comme indiquedans le code suivant, vous pouze également utiliser le constructeur new pour creer une occurrenced'un objet XML à partir d'une chaine contenant des données XML:

var str:String = "<order><item id='1'><menuName>burger</menuName>";
+ "<price>3.95</price></item></order>";
var myXML:XML = new XML(str); 

Si les données XML dans la chaine ne sont pas bien formées (par exemple, s'il manque une balise de fin), une erreur d'execution se produit.

Voupez egalent transmettre des données par reference (a partir d'autres variables) dans un objet XML, comme indiquedans l'exemple suivant:

var tagname:String = "item";
var attributename:String = "id";
var attributevalue:String = "5";
var content:String = "Chicken";
var x:XML = <{tagname} {attributename} {attributevalue} {content} 一 {tagname} trace(x.toXMLString()) // Output: Chicken

Pour charger des données XML depuis une URL, utilisez la classe URLLoader, comme indiquedans l'exemple suivant :

import flash.events.Event;
import flash.net URLsLoader;
import flash.net(URLRequest;
var externalXML:XML;
var loader:URLLoader = new URLLoader();
var request:URLRequest = new URLRequest("xmlFile.xml"); loader.load(request);
loader.addEventListener(Event.COMPLET, onComplete);
function onComplete(event:Object):void { var loader:URLLoader = event.target as URLLoader; if (loader != null) { externalXML new XMLloader.data); trace(externalXML.toString()); } else { trace("loader is not a URLsLoader!"); }

Pour dire des données XML depuis une connexion de socket, utilisez la classe XMLSocket . Pour plus d'informations, voir la classe XMLSocket dans le manuel Guide de referrer ActionScript 3.0 pour la plate-forme Adobe Flash.

Assemblage et transformation d'objects XML

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Utilise la méthode prendChild() ou appendChild() pour ajouter une propriété au début ou à la fin de la liste des propriétés d'un objet XML, comme indiqué dans l'exemple suivant:

var x1:XML = <p>Line 1</p>  
var x2:XML = <p>Line 2</p>  
var x:XML = <body></body>  
x = x.appendChild(x1);  
x = x.appendChild(x2);  
x = x presupendChild(<p>Line 0</p]);  
// x == <body><p>Line 0</p><p>Line 1</p><p>Line 2</p></body> 

Utilisez la méthode insertChildBefore() ou insertChildAfter() pour ajouter une propriété avant ou après une propriété spécifique, comme suit :

var x:XML =

Paragraph 1

Paragraph 2


var newNode:XML =

Paragraph 1.5


x=x.insertChildAfter(x.p[0], newNode)


x=x.insertChildBefore(x.p[2],

Paragraph 1.75

)

Comme indiquedansl'exemple suivant,vouspouvezeguallyutiliserdesaccolades({et})pour transmettre desdonnées parreference(àpartird'autresvariables)longueyouconstruisezdesobjectsXML:

var ids:Array = [121, 122, 123];  
var names:Array = [["Murphy","Pat"], ["Thibaut","Jean"], ["Smith","Vijay"]]  
var x:XML = new XML("<employeeList></employeeList>");  
for (var i:int = 0; i < 3; i++)  
{  
    var newNode:XML = new XML();  
    newNode = <employee id={'ids[i]}>  
        <last>{names[i][0]}</last>  
        <first>{names[i][1]}</first>  
        </employee>;  
    x = x.appendChild(newnode)  
} 

Vou puez affector 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
xfirstname "Jean";
x.@id = "239";

Ceci définit l'objet XML x de la façon suivante :

<employee id="239">
    <lastname>Smith</lastname>
    <firstname>Jean</firstname>
</employee> 

Vouppouvezutiliserlesopérateurs ^+ et + = pourconcaténerdesobjetsXMLList:

var x1:XML = test1
var x2:XML = test2
var xList:MLLList = x1 ^+ x2;
xList + = test3

Ceci définit l'objet XmlList xList de la façon suivante :

<a>test1</a> <b>test2</b> <c>test3</c> 

Parcours de structures XML

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

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 hierarchique 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 acceder aux propriétés infant d'un objet XML. Considérez l'objet XML suivant :

var myXML:XML = <order> <book ISBN="0942407296"> <title>Baking Extravagant Pastries with Kumquats</title> <author> <lastname>Contino</lastname> <firstname>Chuck</firstname> </author> <pageCount>238</pageCount> </book> <book ISBN="0865436401"> <title>Emu Care and Breeding</title> <editor> <lastname>Case</lastname> <firstname>Justin</firstname> </editor> <pageCount>115</pageCount> </book> </order> 

L'objet myXML. book est un objet XMLList contenant des propriétés infant 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 RSSList contenant des propriétés descendantes appelées lastName. Ces deux objets XML correspondant aux deux propriétés lastName de l'objet myXML.

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 infant et parent

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La méthode parent() renvoie le parent d'un objet XML.

Vou puez utilise les valeurs d'index ordinales d'une liste infant pour acceder à des objets infant spécifiques. Par exemple, considrez un objet XML myXML ayant deux propriétés infant appelées book. Chaque propriété infant appelée book possède un nombre d'index qui lui est associé :

myXML.book [0]

myXML.book [1]

Pour acceder à un petit-enfant spécifique, vous pouvez indiquer des numérios 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 × et que cet objet enfant possède un seul objet title, vous pouvez omettre les deux références d'inex, de la façon suivante :

myXML.book.title 

Vou puez utilise la methode child() pour acceder à des enfants dont le nom est basé sur une variable ou une expression, comme indiquedans l'exemple suivant:

var myXML:XML = Dictionary ;
var childName:String = "book";
trace(myXML(child(childName).title) // output: Dictionary

Accès à des attributs

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Utilisez le symbole @ (l'opérateur identifient d'attribut) pour acceder aux attributs dans un objet XML ou XmlList, comme indiqué dans le code suivant :

var employee:XML = <employee id="6401" code="233"> <lastname>Wu</lastname> <firstname>Erin</firstname> </employee>; trace.employee.@id); // 6401 

Vou puez utilise le symbole de caractere générique * avec le symbole @ pour acceder à tous les attributs d'un objet XML ou XMLList, comme dans le code suivant :

var employee:XML = Wu Erin ;
trace.employee.@*.toXMLString());
// 6401
// 233

Vou puez utilise la methode attribute() ou attribués() pour acceder à un attribut spécifique ou à tous les attributs d'un objet XML ou XMLList, comme dans le code suivant :

var employee:XML = <employee id="6401" code="233"> <lastname>Wu</lastname> <firstname>Erin</firstname> </employee>; trace.employee_ATTRIBUTE("id")); // 6401 trace.employee_ATTRIBUTE("*").toXMLString()); // 6401 // 233 trace.employee_attributes().toXMLString()); // 6401 // 233 

Voupez egalent utilise la syntaxe suivant pour acceder à des attributs, comme indiquedans l'exemple suivant:

Ils sont tous équivalents à employee.@id. Cependant, la syntaxe employee.@id est préféable.

Filtrage par attribut ou valeur d'élement

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Voupeusutiliserlesopereursparentheses-(et)—pourfiltrresdeselementsavecunnomd'ellementspecificque ou une valeur d'attribut.Considerez l'objetXML suivant:

var x:XML = <employeeList> <employee id="347"> <lastname>Zmed</lastname> <firstname>Sue</firstname> <position>Data analyst</position> </employee> <employee id="348"> <lastname>McGee</lastname> <firstname>Chuck</firstname> <position>Jr. data analyst</position> </employee> </employeeList> 

Les expressions suivantes sont toutes valides :

  • x.employee.(lastname == "McGee")—Il s'agit du deuxième nœud employee.
  • x.employee. (lastname == "McGee"). firstName—Il s'agit de la propriété的第一个 Name du deuxième nœud employee.
  • 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 nœud employee.
  • x.employee. (@id == 347).lastname—Il s'agit de la propriété_lastname du premier nœud 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 d'appliquer un filtré à des attributs ou des éléments qui n'existant pas, une exception est renvoyée. 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éments p :

var doc:XML = <body> <p id='123'>Hello, <b>Bob</b>.</p> <p>Hello.</p> </body>;   
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 deuxieme élément p :

var doc:XML = <body> <p id='123'>Hello, <b>Bob</b>.</p> <p>Hello.</p> </body>;   
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 attribuer() et elements(), comme dans le code suivant:

var doc:XML = <body> <p id='123'>Hello, <b>Bob</b>.</p> <p>Hello.</p> </body>;   
trace(doc.p.(attribute('id') == '123'));   
trace(doc.p.(elements('b') == 'Bob')); 

Voupeuz également utiliser la méthode hasOwnProperty(), comme dans le code suivant :

var doc:XML = <body> <p id='123'>Hello, <b>Bob</b>.</p> <p>Hello.</p> </body>;   
trace(doc.p.(hasOwnProperty('@id') && @id == '123'));   
trace(doc.p.(hasOwnProperty('b') && b == 'Bob')); 

Utilisation de for..in et for each.. dans les instructions

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

ActionScript 3.0 propose les instructions for.. in et for each.. in pour permettre les iterations dans les objets XMLList. Par exemple, considerez l'objet XML suivant, myXML, et l'objet XMLList, myXML.item. L'objet XMLList, myXML.item, est constitué de deux nœuds item de l'objet XML.

var myXML:XML = <order> <item id='1' quantity='2'> <menuName>burger</menuName> <price>3.95</price> </item> <item id='2' quantity='2'> <menuName>fries</menuName> <price>1.45</price> </item> </order>; 

La boucle for...in permet de procesder a une itération sur un ensemble de noms de propriete dans un objet XMLList :

var total:Number = 0 for(var pname:String in myXML.item)
{ total + = myXML.item.@quantity[pname] * myXML.item.price[pname];

La boucle for each...in permet de proceder à une iteration dans les propriétés de l'objet XMLList :

var total2:Number = 0 for each (var prop:XML in myXML.item)
{ total2 + = prop.@quantity * prop.price;

Utilisation des espaces de noms XML

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Les espaces de noms dans un objet (ou document) XML identifient le type de données que contient l'objet. Par exemple, lorsque vous envoyez et fournissez des données XML à un service Web qui utilise le protocole de messagerie SOAP, vous déclarez l'espace de noms dans la balise de début de l'XML :

var message:XML = <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" <soap:Body xmlns:w="http://www.test.com/weather/" 78< / w :tempurature> ;

L'espace de nom a un préfixe, soap, et un URI qui le définit, http://schemas.xmlsoap.org/soap/envelope/.

ActionScript 3.0 inclut la classe Namespace pour utiliser des espaces de nombres XML. Pour l'objet XML de l'exemple précédent, vous pouvez utiliser la classe Namespace comme suit :

var soapNS:Namespace = message namespace("soap"); traceSOAPNS); // Output: http://schemas.xmlsoap.org/soap/envelope/ 
var wNS:Namespace = new Namespace("w", "http://www.test.com/weather/");  
message.addNamespace(wNS);  
var encodingStyle:XIList = message.@soapNS::encodingStyle;  
var body:XIList = messagesoapNS::Body; 

messagesoapNS::Body.wNS::GetWeatherResponse.wNS::tempurature = "78";

Les méthodes suivantes de la classe XML permettent d'utiliser les espaces de nom : addNamespace(), inScopeNamespaces(), localName(), name(), namespace(), namespaceDeclarations(), removeNamespace(), setLocalName(), setName() et setNamespace().

La directive default xml namespace vous permet d'affector un espace de nom par défaut associé aux objets XML. Par exemple, dans l'exemple suivant, x1 et x2 partagent le même espace de nom par défaut :

var ns1:Namespace = new Namespace("http://www.example.com/namespaces/");  
default xml namespace = ns1;  
var x1:XML = <test1 />;  
var x2:XML = <test2 />; 

Conversion de type XML

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Vous peuvent convertir des objets XML et XmlList en valeurs String. De même, vous pouvez convertir des chaînes en objets XML et XmlList. Sachez que toutes les valeurs d'attribut, les noms et les valeurs de texte XML sont des chaînes. Les sections suivantes décrivent toutes ces formes de conversion de type XML.

Conversion d'objects XML et XmlList en chaînes

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Les classes XML et XmlList contiennent les méthodes toString() et toXMLString(). La méthode toXMLString() renvoie une chaine qui comprend la totalité des balises, des attributs, des déclarations d'espace de nom et du contentu de lobjet XML. Pour les objets XML ayant un contentu complexe ( éléments enfant), la méthode toString() procède exactement comme la méthode toXMLString(). Pour les objets XML ayant un contentu simple (ceux qui contiennent un seul élément de texte), la méthode toString() renvoie uniquement le contentu de texte de l'élement, comme indiqué dans l'exemple suivant :

var myXML:XML = <order> <item id='1' quantity='2'> <menuName>burger</menuName> <price>3.95</price> </item> <order>; trace(myXML.item[0].menuName.toString()); // <menuName>burger</menuName> trace(myXML.item[0].menuName.toString()); // burger 

Si vous utilisez la méthode trace() sans spécifier toString() ou toXMLString(), les données sont converties à l'aide de la méthode toString() par défaut, comme indiqué dans le code suivant:

var myXML:XML = <order> <item id='1' quantity='2'> <menuName>burger</menuName> <price>3.95</price> </item> <order>;   
trace(myXML.item[0].userName); // burger 

Lorsque vous utilise la méthode trace() pour déboguer un code, vous pouvez utiliser la méthode toXMLString() de façon à ce que la méthode trace() générale des données plus complètes.

Conversion dechains en objets XML

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Vou puez utiliser le constructeur new XML() pour creer un objet XML à partir d'une chaine, comme suit :

var x:XML = new XML("<a>test</a>") 

Si vous tentez de convertir une chaine en XML à partir d'une chaine qui représenté un XML non valide ou un XML qui n'est pas formé correctement, une erreur d'exécution est renvoyée, comme suit :

var x:XML = new XML("<a>test"); // throws an error 

Conversion de valeurs d'attribut, de noms et de valeurs de texte à partir de chaînes

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Toutes les valeurs d'attribut XML, les noms et les valeurs de texte sont des types de données String que vous pouvez convertir en d'autres types de données. Par exemple, le code suivant utilise la fonction Number() pour convertir des valeurs de texte en nombres :

var myXML:XML = 3.95 1.00 ;
var total:XML = 0;
myXML.appendChild(total);
for each (var item:XML in myXML.item) { myXML.total.children() [0] = Number(myXML.total.children() [0]) + Number(item.price.children() [0]);
}
trace(myXML.total); // 4.95;

Si ce code n'utilisait pas la fonction Number(), il interpréterait l'opérateur + comme l'opérateur de concatenation de chaine, et la méthode trace() de la dernière ligne généraient les éléments suivants:

01.003.95 

Lecture de documents XML externes

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Voupeusutiliserla classeURLLoader pour chargerdesdonnéesXMLdepuisuneURL.Pourutiliserlecode suivant dansvosapplications,remplacezla valeurXML_url dansl'exemplarpar uneURLvalide:

import flash.events.Event;
import flash.net URLsLoader;
var myXML:XML = new XML();
var XML_URL:String "http://www.example.com/Sample3.xml";
var myXMLURL:URLRequest new URLRequest(XLMLURL);
var myLoader:URLLoader new URLLoader(myXMLURL);
myLoader.addEventListener(Event.COMPLET, xmlLoaded);
function xmlLoaded(event:Event):void
{ myXML XML(myLoader.data); trace("Data loaded.");

Vou puez egalent utilise la classe XMLSocket pour definir une connexion de socket XML asynchrone avec un serveur. Pour plus d'informations, voir le manuel Guide de reference ActionScript 3.0 pour la plate-forme Adobe Flash.

Utilisation de XML dans un exemple ActionScript : chargement de données RSS depuis Internet

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

L'exemple d'application RSSViewer présente plusieurs fonctions d'utilisation d'XML dans ActionScript, notamment :

  • Utilisation de méthodes XML pour parcourir des données XML sous la forme d'un flux RSS.
  • Utilisation de méthodes XML pour assembler des données XML sous la forme HTML à utiliser dans un champ de texte.

Le format RSS est largement utilisé pour diffuser des nouvelles via XML. Un fjichier de données RSS simple peut avoir l'aspect suivant :

?xml version="1.0" encoding="UTF-8"?

L'application SimpleRSS lit les données RSS depuis Internet, analyse les données à la recherche de titres, de liens et de descriptions et renvoie ces données. La classe SimpleRSSUI fournit l'IU et appelle la classe SimpleRSS qui effectue le traitement XML.

Pour obtenir les fischiers d'application de cet exemple, voir www.adobe.com/go/learn_programmingAS3samplesflash_fr. Les fischiers d'application RSSViewer se trouvent dans le dossier Samples/RSSViewer. L'application se compose des fischiers suivants:

FichierDescription
RSSViewer.mxml ou RSSViewer.flaFichier d'application principal dans Flash (FLA) ou Flex (MXML).
com/example/programmingas3/rssViewer/RSSParser.asUne 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.rssUn exemple de fichier RSS. Cette application est définie pour dire 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 dire des données RSS depuis ce document qui utilise un schéma légèrement différent de celui du flux RSS Flex.

Lecture et analyse de données XML

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La classe RSSParser comprend une méthode xmlLoaded() qui convertit les données RSS d'entrée, stockées dans la variable rssXML, en une chaine contenant une sortie formative HTML, rssOutput.

Vers le début de la méthode, le code définit l'espace de nom XML par défaut si les données RSS source complènent un espace de nom par défaut :

if (rssXML namespace("") != undefined)  
{  
    default xml namespace = rssXML namespace("");  
} 

Les lignes suivantes parcourent ensuite en boucle le contenu des données XML source, en examinant chaque propriété descendante appelée item :

for each (var item:XML in rssXML..item)  
{  
    var itemTitle:String = item.title.toString();  
    var itemDescription:String = item.description.toString();  
    var itemLink:String = item.link.toString();  
    outXML += buildItemHTML(itemTitle, itemDescription, itemLink);  
} 

Les trois premières lignes définissent simplement des variables de chaine pour représentier les propriétés de titre, de description et de lien de la propriété item des données XML. La ligne suivante appelle la méthode buildItemHTML() pour obtenir des données HTML sous la forme d'un object RSSList et utilise les trois nouvelles variables de chaine en tant que paramètres.

Assemblage de données XmlList

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Les données HTML (un objet XmlList) seprésentent comme suit :

itemTitle

itemDescription
More...

Les premières lignes de la méthode effacent l'espace de nombres 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 chaine transmis à la fonction :

var body:XMLList = new XmlList();  
body += new XML("<b>" + itemTitle + "</b>")  
var p:XML = new XML("<p>" + itemDescription + "</p>")  
var link:XML = <a></a>;  
link.@href = itemLink; // <link href="itemLinkString" />  
link font.@color = "#008000";  
// <font color="#008000"></font></a>  
// 0x008000 = green  
link font = "More...";  
p.appendChild(<br/>);  
p.appendChild(link);  
body += p; 

Cet objet XMLList représenté des données de chaine 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 :

XMLprettyPrinting = false;
rssOutput outXML.toString();

Extraction du titre du flux RSS et envoi d'un événement personnelisé

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La méthode xmlLoaded() définit une variable de chainedrssTitle 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 notification l'application que les données sont analysées et disponibles :

dataWritten = new Event("dataWritten", true); 

Chapitre 7 : Utilisation de la fonctionnalité JSON native

ActionScript 3.0 fournit une API native permettant de coder et de décoder des objets ActionScript à l'aide du format JavaScript Object Notation (JSON). La classe JSON et les fonctions membres associées suivant la Specification ECMA-262 5e édition avec de légères variations.

ADOBE ACTIONSCRIPT 3.0 - Chapitre 7 : Utilisation de la fonctionnalité JSON native - 1

Le membre de la communauté Todd Anderson fournit une comparaison entre l'API JSON native et la classe JSON as3corelib pierce. Voir Working with Native JSON in Flash Player 11 (disponible en angeais uniquement).

Voir aussi

JSON

Présentation de l'API JSON

L'API JSON ActionScript est constituée de la classe JSON et des fonctions membres toJSON() sur quelques classes natives. Pour les applications nécessitant un codage JSON personnelisé pour une classe, la structure ActionScript propose diverses méthodes permettant de replacer le codage par défaut.

La classe JSON gère en interne l'importation et l'exportation des classes ActionScript qui ne fournissant pas de membre toJSON(). Dans ces cas, la classe JSON traverse les propriétés publiques de chaque objet qu'elle déetecte. Si un objet contient d'autres objets, JSON parcourt les objets imbriqués et effectue la même traversée. Si un objet fournit une méthode toJSON(), JSON utilise cette méthode personnalisée plutôt que son algorithmme interne.

L'interface JSON est composée d'une méthode d'encodage, stringify(), et d'une méthode de décodage, parse(). Chacune de ces méthodes fournit un paramètre permettant d'insérer votre propre logique dans la procédure de codage et de décodage JSON. Pour stringify(), ce paramètre est appelé replacer; pour parse(), il est appelé revival. Ces paramètres prennt une définition de fonction avec deux arguments à l'aide de la signature suivante:

function(k, v):*

Méthodes toJSON()

La signature des méthodes toJSON() est

public function toJSON(k:String):*

JSON.stringify() appelle la méthode toJSON(), si elle existe, pour chaque propriété publique qu'elle rencontres lorsqu'elle traverse un objet. Une propriété consiste en une paire clé-valeur. Lorsque stringify() appelle la méthode toJSON(), il transmet la clé, k, de la propriété qu'il examine actuèlement. Une implémentation toJSON() standard évalue chaque nom de propriété et renvoie l'encodage souhaïte de sa valeur.

La méthode toJSON() peut renvoyer tout type de valeur (identifiée à l'aide du signe*) et pas uniquement une chaine. Ce type de renouni de variable permet à la méthode toJSON() de renvoyer un objet, le cas échéant. Par exemple, si une propriété de votre classe personnalisée contient un objet issu d'une autre bibliothèque fierce, vous pouvez renvoyer cet objet lors que la méthode toJSON() déetecte votre propriété. JSON parcourt alors l'objet tiers. Le processus de codage est le suivant:

  • Si la méthode toJSON() renvoie un objet qui n'est pas évalué par rapport à une chaine, stringify() parcourt cet objet.
  • Si la méthode toJSON() renvoie une chaine, stringify() enveloppe la valeur dans une autre chaine, renvoie la chaine enveloppée et passé à la valeur suivante.

Dans de nombreux cas, il est préférible de renvoyer un objet只不过 que de renvoyer une chaine JSON créé par votre application. Le renvoi d'un objet implique l'utilisation de l'algorithm de codage JSON et permet à JSON de se repeter dans les objets imbriqués.

La méthode toJSON() n'est pas définie dans la classe Object ou dans la plupart des autres classes natives. Son absence indique à JSON d'effectuer sa traversée standard sur les propriétés publiques de l'objet. Si vous préférez, vous pouvez également utiliser la méthode toJSON() pour exposer les propriétés privées de votre objet.

Certaines classes natives posent néanmoins des problèmes que les bibliothèques ActionScript sont incapables de résoudre efficacement dans tous les cas d'utilisation. Pour ces classes, ActionScript fournit une implémentation triviale que le client peut à nouveau implémenter selon ses besoin. Les classes qui fournissent des membres toJSON()Triviaux sont les suivantes :

  • ByteArray
  • Date
  • Dictionary
    XML

Vouss pouvez intégrer la classe ByteArray dans une sous-classe pour replacer sa méthode toJSON(), mais vous poupez aussi redéfinir son prototype. Les classes Date et XML, qui sont déclarées comme étant finales, vous obligent à utiliser le prototype de classe pour redéfinir toJSON(). La classe Dictionary est déclarée comme étant dynamique, ce qui vous donne la liberté de replacer la méthode toJSON().

Définition du comportement JSON personnelisé

You disposze de plusieurs options pour implementer vos propres codage et decodage JSON pour les classes natives :

  • Définir ou remplaçer toJSON() sur la sous-classe personnalisée d'une classe native non finale
  • Définir et redéfinir toJSON() sur le prototype de la classe
  • Définir une propriété toJSON sur une classe dynamique
    Utiliser les parametes JSON.stringify() replacer et JSON数据分析() reviver

Voir aussi

ECMA-262, 5e édition

Définition de la méthode toJSON() sur le prototype d'une classe intégrée

L'implementation JSON native dans ActionScript imite le mécanisme JSON ECMAScript défini dans ECMA-262, 5e édition. Etant donné qu'ECMAScript ne prend pas en charge les classes, ActionScript définit le comportement de JSON en termes de distribution basée sur les prototypes. Ancêtres des classes ActionScript 3.0, les prototypes permettent un heritage simulé, ainsi que les ajouts et redefinitions de membres.

ActionScript permet de définir ou de redéfinir toJSON() sur le prototype d'une classe. Ce privilège s'étend aux classes déclarées comme étant finales. Lorsque vous définissez toJSON() sur le prototype d'une classe, votre définition s'applique à toutes les occurrences de cette classe dans le cadre de votre application. Par exemple, voici comment vous pouvez définir une méthode toJSON() sur le prototype de la classe MovieClip :

MovieClip.protoType.toJSON = function(k):* { trace("prototype.toJSON() called.); return "toJSON";
}

Lorsque votre application appelle la méthode stringify() sur une occurrence de MovieClip, stringify() renvoie le résultat de votre méthode toJSON():

var mc:MovieClip = new MovieClip();  
var js:String = JSON.stringify(mc); //"prototype toJSON() called."  
trace("js: " + js); //"js: toJSON" 

Voupez en outre remplacer toJSON() dans les classes natives qui definissant cette methode. Par exemple, le code suivant remplace Date.toJSON():

Date.prototype.toJSON = function (k):* { return "any date format you like via toJSON: "+ "this.time:" + this.time + " this(hours:" + this(hours; } var dt: Date = new Date(); trace(JSON.stringify(dt)); // "any date format you like via toJSON: this.time:1317244361947 this_hours:14" 

Définition ou remplacement de toJSON() au niveau de la classe

Les applications n' ont pas toujours besoin d'utiliser des prototypes pour redéfinir toJSON(). Il est également possible de définir toJSON() en tant que membre d'une sous-classe si la classe parente n'est pas marquee comme finale. Vous pouvez par exemple étendre la classe ByteArray et définir une fonction toJSON() publique :

package { import flash.utils.ByteArray; public class MyByteArray extends ByteArray { public function MyArray() { public function toJSON(s:String):\* { return "MyArray"; } } } 
var ba:ByteArray = newByteArray();   
trace(JSON_stringify(ba)); //"ByteArray"   
var mba:MyByteArray = new MyByteArray(); //"MyArray"   
trace(JSON_stringify(mba)); //"MyArray" 

Si un classe est dynamique, il est possible d'ajouter une propriété toJSON à un objet de cette classe et de lui attribuer une fonction de la façon suivante :

var d:Dictionary = new Dictionary();   
trace(JSON_stringify((d)); // "Dictionary"   
d.toJSON = function(){return {c:"toJSON override.}\}; // overrides existing function   
trace(JSON_stringify((d)); // {"c":"toJSON override.}" 

Vou puez rempacer, definir ou redéfinir toJSON() sur n'importe qu'elle classe ActionScript. Néanmoins, la plupart des classes ActionScript intégrées ne définissant pas toJSON(). La classe Object ne définit pas la méthode toJSON dans son prototype par défaut ni ne la déclare en tant que membre de classe. Seule une poignée de classes natives définit la méthode comme fonction prototype. C'est pourquoit, dans la plupart des cas, vous ne pouvez pas remplacer toJSON() de façon traditionnelle.

Les classes natives qui ne définissent pas toJSON() sont sérieisées sur JSON par l'implémentation JSON interne. Dans la mesure du possible, évitez de replacer cette fonctionnalité intégrée. Si vous définisse un membre toJSON(), la classe JSON utilise votre logique plutôt que sa propre fonctionnalité.

Utilisation du paramètre REPLACER de la méthode JSON.stringify()

Il peut être utile de replacer toJSON() sur le prototype en vue de modifier le comportement d'exportation JSON d'une classe dans une application. Néanmoins, votre logique d'exportation doit s'appliquer uniquement à des cas spéciaux sous des conditions provisoires. Pour prendre en compte ces modifications à petite échelle, vous pouvez utiliser le paramètre replacer de la méthode JSON.stringify().

La méthode stringify() applique la fonction transmise via le paramètre replacer à l'objet en cours de codage. La signature pour cette fonction est similaire à celle de toJSON():

function (k,v):

Contrairement à la méthode toJSON(), la fonction replacer requiert la valeur v, ainsi que la clé k. Cette différence est nécessaire, car la méthode stringify() est définie sur l'objet JSON statique et non sur l'objet en cours de codage. Lorsque la méthode JSON(stringify() appelle replacer(k,v), elle traverse l'objet d'entrée d'origine. Le paramètre implicite this transmis à la fonction replacer fait reférence à l'objet qui détient la clé et la valeur. Etant donné que la méthode JSON(stringify() ne modifie pas l'objet d'entrée d'origine, cet object resteinchangé dans le conteneur actuellément traversé. Vous pouvez par conséquent utiliser le code this [k] pour interroger la clé sur l'objet d'origine. Le paramètre v renferme la valeur que toJSON() convertit.

Tout comme toJSON(), la fonction replacer peut renvoyer tout type de valeur. Si replacer renvoie une chaine, le moteur JSON convertit le contenu en série d'échévement entre guillemets et place ce contenu également entre guillemets. Cette structure garantit que stringify() receive un objet de chaine JSON valide qui reste une chaine dans un prochain appel de JSON.parse().

Le code suivant utilise le paramètre replacer et le paramètre this implicite pour renvoyer les valeurs time et hours d'un objet Date :

JSON.stringify(d, function (k,v):* { return "any date format you like via replacer: "+ "holder[k].time:" ^+ this[k].time ^+ " holder[k].hours:" ^+ this[k].hours; });

Utilisation du paramètre reviver de la méthode JSON数据分析()

Le paramètre revival de la méthode JSON.parse() est l'opposé de la fonction replacer : il convertit une chaîne JSON en objet ActionScript utilisé. L'argument revival est une fonction qui prend deux paramètres et renvoie tout type :

function (k,v):

Dans cette fonction, k est une clé et v est la valeur de k . Tout comme stringify(), parse() traverse les paires clé-valeur JSON et applique la fonctionreviver, si elle existe, à chaque paire. L'un des problèmes potentiels est que la classe JSON ne renvoie pas le nom de classe ActionScript d'un objet. Il peut par conséquent être difficile de savoir quel type dobjet ranimer. Ce problème peut en outre s'avérer particulièrement délicat lorsque les objets sont imbriqués. En désignant les fonctions toJSON(), replacer et revivalier, vous pouvez trouver des moyens d'identifier les objets ActionScript exportés tout en gardant intacts les objets d'origine.

Exemple d'analyse

L'exemple suivant illustrer une strategie de ranimation d'objets analysés à partir de chaînes JSON. Cet exemple définit deux classes : JSONGenericDictExample et JSONDictionaryExtnExample. La classe JSONGenericDictExample est une classe Dictionary personnalisée. Chaque enregistrement contient le nom et la date de naissance d'une personne, ainsi qu'un ID unique. Chaque fois que le constructeur JSONGenericDictExample est appelé, il ajoute l'objet nouvellement créé à un tableau statique interne avec un entier augmentant statiquement comme son ID. La classe JSONGenericDictExample définit également une méthode revive() qui extrait uniquement l'entier du membre id le plus long. La méthode revive() utilise cet entier pour rechercher et renvoyer l'objet ranimable ajustat.

La classe JSONDictionaryExtnExample étend la classe Dictionary ActionScript. Ses enregistrents n'ont pas de structure définie et peuvent contir toutes sortes de données. Les données sont attribuées après la construction de l'objet JSONDictionaryExtnExample et non par les propriétés définies dans la classe. Les enregistrents de JSONDictionaryExtnExample utilisent les objets JSONGenericDictExample comme clés. Lorsqu'un objet JSONDictionaryExtnExample est ranimé, la fonction JSONGenericDictExample revival() utilise l'ID associé à JSONDictionaryExtnExample pour recuperer l'objet de clé correct.

Plus important anymore, la méthode JSONDictionaryExtnExample.toJSON() renvoie une chaine de marqueurs en plus de l'objet JSONDictionaryExtnExample. Cette chaine identifie la sortie JSON comme appartenant à la classe JSONDictionaryExtnExample. Ce marqueur indique clairement le type d'objet en cours de traitement lors de l'exécution de JSON.parse().

package {
// Generic dictionary example:
public class JSONGenericDictExample {
    static var revivableObjects = {};
    static var nextId = 10000;
    public var id;
    public var dname:String;
    public var birthday;
public function JSONGenericDictExample(name, birthday) {
    revivableObjects下一篇 = this;
    this.id = "id_class_JSONGenericDictExample_" + nextId;
    this.dname = name;
    this.birthday = birthday;
    nextId++;
}
public function toString():String { return this.dname; }
public static function revive(id:String):JSONGenericDictExample {
    var r:RegExp = /^[^id_class_JSONGenericDictExample_([0-9]*$)];
    var res = r.exec(id);
    return JSONGenericDictExample revivalobjects[res[1]};
}
} 

return {"class JSONDictionaryExtnExample":contents};
}
// This is just here for debugging and for illustration public function toString():String { varretval = ["JSONDictionaryExtnExample<"; var printed any = false; for(vark in this){ retval + = k.toString() ^+ "=" ^+ "[e = ^+ +this[k].earnings ^+ ",v = ^+ +this[k].violations ^+ "," printed any = true; } if (printed any) retval = retval.substring(0,retval.length-2); retval + = 串 ]" return retval; 1

Lorsque le script d'exécution suivant appelle JSON.parse() sur un objet JSONDictionaryExtnExample, la fonction reviver appelle JSONGenericDictExample revive() sur chaque objet dans JSONDictionaryExtnExample. Cet appel extrait l'ID qui représenté la clé de l'objet. La fonction JSONGenericDictExample revive() utilise cet ID pour récapérer et renvoyer l'objet JSONDictionaryExtnExample stocké à partir d'un tableau statique隱私.

import flash.display MovieClip;   
import flash.text.TextField;   
var a_bob1:JSONGenericDictExample = new JSONGenericDictExample("Bob",new Date(Date.parse("01/02/1934")));   
var a_bob2:JSONGenericDictExample = new JSONGenericDictExample("Bob",new Date(Dateparse("05/06/1978")));   
var a_jen:JSONGenericDictExample = new JSONGenericDictExample("Jen",new Date(Dateparse("09/09/1999")));   
var e = new JSONDictionaryExtnExample();   
e[a_bob1] = {earnings: 40, violations: 2};   
e[a_bob2] = {earnings: 10, violations: 1};   
e[a_jen] = {earnings: 25, violations: 3};   
trace("JSON.stringify(e): " + JSON.stringify(e)); // {"class JSONDictionaryExtnExample": //{"id_class_jsonGenericDictExample_10001": //{"earnings":10,"violations":1}, //"id_class_jsonGenericDictExample_10002": //{"earnings":25,"violations":3}, //"id_class_jsonGenericDictExample_10000": // {"earnings":40,"violations":2}}   
var e_result = JSON.stringify(e);   
var e1 = new JSONDictionaryExtnExample();   
var e2 = new JSONDictionaryExtnExample();   
// It's somewhat easy to convert the string from JSON.stringify(e) back   
// into a dictionary (turn it into an object via JSON.parse, then loop   
// over that object's properties to construct a fresh dictionary). 

//
// The harder exercise is to handle situations where the dictionaries
// themselves are nested in the object passed to JSON.stringify and
// thus does not occur at the topmost level of the resulting string.
//
// (For example: consider roundtripping something like
// var tricky_array = [e1,[[4,e2,6]},{table:e3}]
// where e1,e2,e3 are all dictionaries. Furthermore, consider
// dictionaries that contain references to dictionaries.)
//
// This parsing (or at least some instances of it) can be done via
// JSON.parse, but it's not necessarily trivial. Careful consideration
// of how toJSON, replacer, and reviver can work together is
// necessary.
var e_roundtrip = JSON.parse(e_result,
// This is a reviver that is focused on rebuilding JSONDictionaryExtnExample objects. function (k,v) { if("class JSONDictionaryExtnExample"in v){ // special marker tag; //see JSONDictionaryExtnExample.toJSON(). var e = new JSONDictionaryExtnExample(); var contents = v["class JSONDictionaryExtnExample"]; for(var i in contents){ // Reviving JSONGenericDictExample objects from string // identifiers is also special; // see JSONGenericDictExample constructor and // JSONGenericDictExample's revive() method. e[JSONGenericDictExample revival(i)] = contents[i]; } return e; } else{ return v; }
});
trace("///==Hereis an extended Dictionary that has been round-tripped = " ;
trace("///==Note that we have revived Jen/Jan during the roundtrip. = " ;
trace("e:" ^+ e); //[JSONDictionaryExtnExample < Bob = [e = 40,v = 2] ,Bob=[e=10,v=1], //Jen=[e=25,v=3]>
trace("e_roundtrip:" ^+ e_roundtrip); //[JSONDictionaryExtnExample < Bob = [e = 40,v = 2] , //Bob=[e=10,v=1],Jen=[e=25,v=3]>
trace("Is e_roundtrip a JSONDictionaryExtnExample? " + (e_roundtrip is
JSONDictionaryExtnExample)); //true
trace("Name change: Jen is now Jan");
a_jen.dname = "Jan"
trace("e:" ^+ e); //[JSONDictionaryExtnExample < Bob = [e = 40,v = 2] ,Bob=[e=10,v=1], //Jan=[e=25,v=3]>
trace("e_roundtrip:" ^+ e_roundtrip); //[JSONDictionaryExtnExample < Bob = [e = 40,v = 2] , //Bob=[e=10,v=1],Jan=[e=25,v=3]>

Chapitre 8 : Gestion des événements

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

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'évenement ActionScript 3.0 n'est pas seulement pratique, il est conforme aux normes en vigueur et bien intégré à la liste d'affichage. Ce modele repose sur la spécification d'évenements Document Object Model (DOM) de niveau 3, une architecture de gestion d'évenements normalisée. Il constitue donc pour les programmes ActionScript un outil puissant et parfaitement intuitif.

Le système de gestion d'événements ActionScript 3.0 assures une interaction étroite avec la liste d'affichage. Pour comprendre les principes de base de la liste d'affichage, voir « Programmation de l'affichage » à la page 156.

Voir aussi

Package flash.events

Spcification d'evénements Document Object Model (DOM) niveau 3

Principes de base de la gestion des événements

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Vous pouvez conceiveur un événement comme tout type d'action qui se produit dans votre fichier SWF et qui présente un interet pour vous en tant que programmeur. Par exemple, la plupart des fichiers SWF prennet 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 produit sans aucun interaction directe de l'utilisateur, par exemple lorsque le chargement des données depuis un serveur se termine ou qu'uneamera 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 role d'un objet événement est non seulement de stocker des informations relatives à un événement spécifique, mais aussi deContainir 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 create un objet événement (une occurrence de la classe MouseEvent) qui représenté 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 receiveoir l'objet événement ainsi distribué est appelé cible d'événement. Par exemple, lorsqu'uneamera 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 laamera. 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 hierarchie de la liste d'affichage jusqu'à ce qu'il attaigne la cible en question. Dans certains cas, l'objet événement se « propage » ensuite vers le haut de la hierarchie de la liste d'affichage, selon le même cheminement. Cette traversée de la hierarchie 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'évenement. Les écouteurs d'évenement sont des fonctions ou des méthodes que vous écrivez pour répondre aux différents événements. Pour garantir que le programme réalisée aux événements, vous nevez ajouter des écouteurs d'évenement soit à la cible d'évenement, soit à l'un des objets de la liste d'affichage qui font partie du flux d'évenements de l'objet événement.

Chaque fois que vous écrivez un code d'écouteur d'évenement, il suit cette structure de base (les éléments en gras sont des espaces réservés que vous repliriez pour votre cas particulier):

Ce code a un double role. Tout d'abord, il définit une fonction, qui est une manière de spécifique les actions à exécuter en réponse à l'évenancement. Ensuite, il appelle la méthode addEventListener() de l'objet source, « inscrivant » ainsi la fonction auprès de l'évenancement spécifique de sorte que lorsque l'évenancement survient, les actions de la fonction ont lieu. Lorsque l'évenancement se produit, la cible de l'évenancement vérifie sa liste de toutes les fonctions et méthodes enregistrées en tant qu'écouteurs d'évenancement. Elle appelle ensuite chacune d'elles, transmettant l'objet événement à titre de paramètre.

Voudevez apporter quatre modifications à ce code pour creer votre propre écouteur d'évenement. Première, 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'évenement que vous souhaitez écouter (EventType dans le code), et vous devez indiquer la constante pour l'évenement en question (EVENT_NAME dans la liste). Troisièmement, vous devez appeler la méthode addEventListener() sur l'objet qui enverra l'évenement (eventTarget dans ce code). Vous pouvez également modifier le nom de la variable utilisé comme paramètre de la fonction (eventObject dans ce code).

Concepts importants et terminologie

La liste de référence suivante contient des termes importants utilisés dans le cadre de la réduction de routines de gestion des événements :

Propagation Certains événements doivent lieu à une propagation afin de permettre à un objet d'affichage parent de réagir aux événements distribués par ses enfants.

Phase de propagation Partie du flux d'événements dans laquelle un événement est propagated jusqu'àux objets d'affichage parent. La phase de propagation suit la phase de capture et la phase cible.

Phase de capture Partie du flux d'evénements dans laquelle un événement se propage de la cible la plus générale vers l'objet cible le plus spécifique. La phase de capture precede la phase cible et la phase de propagation.

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 tape dans le champ de texte—mais vous pouvez annuler ce comportement par défaut (si vous ne souhaitez pas afficher le caractère tape, par exemple).

Distribuer Indiquer à des écouteurs d'événements qu'un événement a eu lieu.

Evénement Opération subie par un objet et que ce dernier peut signaler à d'autres objets.

Flux d'événements Lorsque des événements concernnent un objet de la liste d'affichage (un objet affché à l'écran), tous les objets qui contiennent cet objet sont informés de l'événement et avertissent à leur tour les écouteurs d'événements correspondants. 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 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 Object 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 Objet ou fonction qui s'est enregistré auprès d'un objet pour indiquer qu'il doit être averti lorsqu'un événement spécifique se produit.

Phase cible Stade du flux d'événements où un événement atteint la cible la plus spécifique possible. La phase cible se produit entre la phase de capture et la phase de propagation.

Variation de la gestion d'événements dans ActionScript 3.0 par rapport aux versions antérieures

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ulté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 ancienne versions d'ActionScript en compteit plusieurs. Cette section commence par une presentation générale du fonctionnement de la gestion des événements dans les versions précédentes, puis étudie les nouvelles qu'apporte ActionScript 3.0 dans ce domaine.

Gestion des événements dans les versions précédentes d'ActionScript

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Antérieurement à ActionScript 3.0, le langage ActionScript fournissait plusieurs méthodes de gestion des événements :

  • Les gestionnaires d'évenement on (), qui peuvent se placer directement sur des occurrences Button et MovieClip
  • Les gestionnaires d'évenement 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'évenement, que vous pouvez enregistrer à l'aide de la méthode addListener()
  • La classe UIEventDispatcher, qui implémentait partiellement le modele d'événements DOM

Chacun de ces mécanismes présente des avantages et des inconveniens. 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 place directement sur les boutons ou les clips. Les fonctions de rappel sont également facies à implémenter, maisIMPÔNT 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é r'évenement. Bien qu'elle accroisse le temps système nécessaire, cette solution vous permet de creator 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 modele d'evénements encore différent. Ce nouveau modele, caractérisé par la classe UIEventDispatcher, reposait sur un sous-ensemble de la Specification d'événements DOM. Ainsi, pour les développpeurs accoutumés à la gestion des événements de composant, le passage au nouveau modele 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'enregister les objets écouteurs varie selon que vous utilisez l'une des six classes qui prennten en charge les écouteurs ou la classe UIEventDispatcher. Pour les classes Key, Mouse, MovieClipLoader, Selection, Stage etTextField, 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.

Gestion d'événements dans ActionScript 3.0

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

ActionScript 3.0 utilise pour la première fois un modele de gestion d'evénements qui vient remplaçer les nombreux mécanismes qui existaient dans les precedentes versions du langage. Le nouveau modele d'evénements repose sur la Specification 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 modele d'événements. Un objet de la liste d'affichage est semble à un noeud de la structure hierarchique 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 modele 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éveloppateurs se chargeant normalement d'écrit 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éveloppement ajoute du code pour annuler sonexecution. commeFlash 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 utiliser entre du texte dans un objetTextField, Flash Player ou AIR create une occurrence de la classe TextEvent afin de représentier cette saisie. Pour éviter que Flash Player ou AIR n'affiche le texte dans l'objetTextField, vous doivent acceder à cette occurrence de TextEvent spécifique et appeler sa méthode préventDefault().

Certain comportements par défaut ne peuvent pas être évités. Par exemple, Flash Player et AIR générent un objet MouseEvent lorsqu'elutilisateur 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 évientuellesment 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 existeaucun 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'affichentaucun caractère dans un objetTextField en réponse à un événement textInput que vous avez distribué par programmation.

Nouveautés des écouteurs d'évenement dans ActionScript 3.0

Pour les développpeurs qui connaissent bien la methode ActionScript 2.0 addListener(), il peut etre utile de souligner les différences entre le modele d'ecouteur d'evénement d'ActionScript 2.0 et le modele d'evénements d'ActionScript 3.0. La liste ci-apres decrit les principales différences entre ces deux modles d'evénements :

  • Pour ajouter des écouteurs d'évenement dans ActionScript 2.0, vous utilisez, selon le cas, addListener() ou addEventListener(). Dans ActionScript 3.0, il faut utiliser addEventListener() dans tous les cas.
  • 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 lobjet qui émet l'événement. Dans ActionScript 3.0, la méthode addEventListener() peut être appelée sur tout object faisant partie du flux d'événements.
  • Dans ActionScript 2.0, les écouteurs d'évenement 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'évenement.

Flux dévénements

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

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 URLsStream. 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 chimine jusqu'à atteindre la cible d' événement.

Le flux d'evénements représenté le parcours que suivra un objet événement dans la liste d'affichage. Cette liste s'organise de manière hierarchique, 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'évenement pour un événement associé à une liste d'affichage, celui ci effectue un aller-retour entre la Scène et le nœud cible. Selon la définition de la spécification d'évenements DOM, le nœud cible est le nœud qui représentée la cible d'évenement. En d'autres termes, le nœud cible est l'objet de la liste d'affichage au niveau duquel est survenu l'évenement. 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 nœud 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'àu parent du noeud cible. La deuxieme partie est appelée la phase cible, qui comprend uniquement le noeud cible. La troisieme partie s'appele la phase de propagation. Elle comprend les noeuds rencontres 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 hierarchie verticale dont le sommet est la Scène, comme illustré par le schéma suivant :

ADOBE ACTIONSCRIPT 3.0 - Flux dévénements - 1

Si un utiliser 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 à Scène. L'objet descend ensuite jusqu'à Nœud parent, puis vers Nœud enfant1. Il se propage alors vers le haut jusqu'à Scène, en repassant par Nœud parent pour rejoindre Scène.

ADOBE ACTIONSCRIPT 3.0 - Flux dévénements - 2

Dans cet exemple, la phase de capture comprend Scène et Nœud parent pendant le trajet descendant initial. La phase cible comprend le temps passé au nœud Nœud enfant1. La phase de propagation comprend les nœuds Nœud parent et Scène, qui se trouvent sur le chemin du retour vers le nœud 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é r'évenement. 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'évenement tout au long du flux d'évenements s'avéré 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'évenements, il faudrait en ajouter un à l'objet bouton et un à l'objet texte pour être sur d'être averti des événements de clic survenant à tout endroit du bouton. Le flux d'évenements vous permet, au contraire, de placer un seul écouteur d'évenement sur l'objet bouton afin de:gérer les événements de clic, qu'ils se produit sur l'objet texte ou sur des zones de l'objet bouton non couvertes par l'objet texte.

Cependant, certains objets événements ne participant pas aux trois phases du flux d'événements. Certains types d'événements, tels que enterFrame et init, sont distribués directement au nœud cible et ne participant ni à la phase de capture, ni à la phase de propagation. 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.

Pour savoir comment se comporte un type d'évenement 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

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

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érables événements, puisqu'ils stockent dans un ensemble de propriétés des informations relatives à des événements précis. Ils contiennent en outre un jeu de méthodes qui vous permet de manipuler les objets événement 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énement.

Cette section commence par étudier les propriétés de la classe Event avant de déscrire 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

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

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ée, 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énements sont stockés dans la propriété Event.type sous forme de chaine. Il est utile de connaître le type d'un objet événement car votre code peut alors désigner les objets de types différents. Par exemple, le code suivant spécifique 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'évenement, 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:

Ces constantes permettent de faire facilement reférence à des types d'évenement précis. Vous doivent utiliser ces constantes au lieu des chaines 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 chaines qu'elles représentent, une erreur de frappe ne sera pasforcé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'évenement :

myDisplayObject.addEventListener(MouseEvent.CLICK, clickHandler);

platôt que :

myDisplayObject.addEventListener("click", clickHandler);

Informations relatives aux comportements 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 acceder à la propriété cancellable. La propriété cancellable contient une valeur boolée qui indique si le comportement par défaut peut être évité ou non. Vous pouze éviter, ou annuler, le comportement par défaut de quelques événements à l'aide de la méthode préventDefault(). Pour plus d'informations, voir Annulation d'un comportement associé par défaut à un événement sous « Présentation des méthodes de la classe Event » à la page 137.

Informations de flux d'evé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'explainque la liste suivante :

  • La propriété bubbles contient des informations sur les parties du flux d'événements auquel participèe l'objet événement.
  • La propriété eventPhase indique la phase actuelle du flux d'événements.
  • La propriété target stocke une referencia à la cible d'évenement.
  • La propriété currentTarget stocke une referrerce de l'objet de liste d'affichage qui traite actuellément l'objet événement.

La propriété bubbles

On dit d'un événement qu'il se propage lorsqu'il participe à la phase de propagation du flux d'événements, c'est-à-dire quand l'objet événement est transmis du nœud 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. Tous les événements qui se propagent vers le haut participant é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.

La propriété eventPhase

Voupez déterminer la phase d'évenement de tout object événement grâce à sa propriété eventPhase. La propriété eventPhase a pour valeur un entier non signé qui pourrait l'une des trois phases du flux d'évenements. 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 correspondant 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 sur qu'une fonction appelée myFunc () soit uniquement appelée lorsque la cible d'évenement se trouve dans la scene 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 reférence à l'objet cible de l'évenement. 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 tener compte de la hierarchie 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 désissent toujours comme cible d'évenement l'objet qui se trouve le plus loin de la Scène.

Dans des fichiers SWF complexes, et particulièrement ceux dont les boutons sont régulièrement ornés d'objets infant plus petits, la propriété target ne doit pas être utilisée féquement car elle pointera souvent vers l'objet infant du bouton plutôt que vers le bouton lui-même. Dans de telles situations, il est courant d'ajouter des écouteurs d'évenement 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énelCurrentTarget

La propriété currentTarget contient une reférence de l'objet de liste d'affichage quiTRAITE actuellément I'objet événement. Meme s'il peut paraitre étrange de ne pas savoir quel nœud traite actuellément I'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

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La classe Event contient trois catégories de méthodes :

  • Les méthodes d'utilitaire, qui peuvent creer des copies d'un objet événement ou le convertir en chaine
  • 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 annulent le comportement par défaut ou vérifient s'il a été annulé

Méthodes d'utilitaire de la classe Event

La classe Event compte deux méthodes d'utilitaire. La méthode clone() permet de créé des copies d'un objet événement. La méthode toString() permet de représentier sous forme de chaînes les propriétés d'un objet événement ainsi que leurs valeurs. Bien qu'utilises en interne par le modele d'événements, ces deux méthodes sont mises à la disposition des développpeurs pour un usage générique.

Pour les développements experimentés qui souhaitent créé 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'utilaires 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érents uniquement en ce que les autres écouteurs d'événement du nœud actuel sont autorisés ou non à s'exécuter :

  • La méthode Event.stopPropagation() empêche l'objet événement de passer au nœud suivant mais seulement après que tous les autres écouteurs du nœud actuel ont été autorisés à s'exécuter.
  • La méthode Event.stopImmediatePropagation() empêche l'objet événement de passer au nœud suivant sans autoriser les autres écouteurs du nœud 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'évenement. Utilisez les méthodes de comportement par défaut de la classe Event pour éviter le comportement par défaut.

Annulation d'un comportement associé par défaut à un événement

Deux méthodes sont associées à l'annulation du comportement par défaut: préventDefault() et isDefaultPrevented(). Appelez la méthode préventDefault() pour annuler le comportement associé par défaut à un événement. Pour vérifier si préventDefault() a déjà été appelée sur un object é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.

La méthode préventDefault() fonctionne uniquement s'il est possible d'annuler le comportement par défaut de l'évenement. Pour vérifier que c'est le cas, reportez-vous à la documentation de l'API de ce type d'évenement ou examinez la propriété cancellable 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

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

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 repré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 d'autres propriétés et types d'événements propres à la catégorie d'événement considérée. Par exemple, les événements liés aux actions de la sourispré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 évientuelles 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 sous-classe. 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 « Objects événement » à la page 135, 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.

Ecouteurs d'événement

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Les écouteurs d'évenement, également appelés gestionnaires d'évenements, sont des fonctions que Flash Player et AIR exécutent en réponse à des écovenements déterminés. La procédure d'ajout d'un écouteur d'évenement se déroule en deux temps. En premier lieu, vous creez une fonction ou méthode de classe que Flash Player ou AIR doit executer en réponse à l'évenement. On parle parfois de fonction d'écouteur ou de fonction de gestionnaire d'évenement. En second lieu, vous utilisez la méthode addEventListener() pour enregister la fonction d'écouteur auprès de la cible de l'évenement ou tout autre object de la liste d'affichage qui apparient au flux d'évenements approprié.

Création d'une fonction d'écouteur

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La création d'une fonction d'écouteur est un domaine dans lequel le modele d'événements ActionScript 3.0 diffère du modele d'événements DOM. Dans le modele d'événements DOM, on désigne clairément 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 modele 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.

Le modele d'evénements ActionScript ne fait aucune distinction entre l'écouteur d'évenement et la fonction d'écouteur. L'interface EventListener est inexistant 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 identifient variable. 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 create 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 resultant, en cliquant sur le carré, Flash Player ou AIR générale la sortie de suivi ci-après :

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ésenté l'objet global, ce qui est logique puisque la fonction est définie en dehors de toute classe ou objet personnelisé.

Fonction d'écouteur définie comme méthode de classe

L'exemple ci-dessous est identique au precedent, 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 resultant, en cliquant sur le carré rouge, Flash Player ou AIR générale la sortie de suivi ci-après :

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'évenement, 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'évenement et non à l'occurrence de ChildSprite.

Pour certains développpeurs, il s'agissait d'un vrai probleme car cela signifiait qu'ils ne pouvaient acceder à aucune autre méthode et propriété de la classe qui contenait la méthode d'écouteur. Pour le contourner, les programmes d'actionScript 2.0 pouvaient utiliser la classe mx.util.Delegate pour modifier l'etendue de la méthode d'écouteur. Cette manipulation n'est plus nécessaire puisque ActionScript 3.0 create une méthode liée lorsqu'addEventListener() est appelée. Par conséquent, le mot-clé this fait reférence à l'occurrence de ChildSprite appelée child et le programmeur peut acceder aux autres méthodes et propriétés de la classe ChildSprite.

Ecouteur d'évenement à ne pas utiliser

Une troisième technique permet de creator 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 toute fois 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 :

On s'attendrait à ce que this fasse reférence à myListenerObj et que la sortie de suivi 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éé 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 ontaucun moyen delier cette adresse à l'occurrence de myListenerObj.

Gestion des écouteurs d'événement

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Vous pouvezGERes fonctions d'ecouteur à l'aide des méthodes de I'interface IEventDispatcher. Cette interface est la version ActionScript 3.0 de I'interface EventTarget du modele d'evénements DOM. Bien que le nom IEventDispatcher semble impliquer que I'objet principal de la classe est l'envoi (ou la distribution) des objets événements,les méthodes qui lui correspondent seront en fait plus souvent à l'enregistrement,la verification et la suppression des écouteurs d'evé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:Object) :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'évenement ou faire partie d'un flux d'évenements. Par exemple, la classe DisplayObject hérite de la classe EventDispatcher, par conséquent, tout objet de la liste d'affichage peut acceder aux méthodes de l'interface IEventDispatcher.

Ajout des écouteurs d'évenement

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écifique le type d'évenement. Avec le paramètre listener, vous pouvez spécifier la fonction d'écouteur qui doit s'exéçuter lorsque l'évenement survient. Le paramètre listener peut être une reférence à une fonction ou une méthode de classe.

n'utilise pas de parentheses pour stipuler le parametre listener. Par exemple, la fonction clickHandler() est spécifiée sans parentheses dans l'appel suivant à la méthode addEventListener():

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 vous écouteur sera actif. Si useCapture à la valeur true, votre écouteur sera actif pendant la phase de capture du flux d'événements. Si useCapture à 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 doivent appeler deux fois addEventListener(); la première fois, useCapture prend la valeur true, la seconde fois, useCapture prend la valeur false.

Le paramètre priorité de la méthode addEventListener() ne fait pas officièlement partie du modele 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 prioritry. La valeur par défaut est 0. Vous pouze toutes 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é tout, plus il est exécuté rapidement.

Le paramètre useWeakReference vous permet de spécifique si la refé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 des objets qui ne seront plus. Un objet est considéré comme inutilisé lorsqu'il n'apparait dans aucune reférence. Le nettoyeur de mémoire ignore les reférences faibles, c'est-à-dire qu'une fonction d'écouteur vers laquelle pointe uniquement une reférence faible est incluse dans le nettoyage.

Suppression des écouteurs d'évenement

La méthode removeEventListener() permet de supprimer un écouteur d'évenement dont vous n'avez plus besoin. Il est judicious 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'évenements, vous pouze appeler addEventListener() deux fois, en attribuant à useCapture la valeur true la première, puis false la seconde. Pour supprimer les deux écouteurs d'évenement, il seraient 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'evenements

La méthode dispatchEvent() peut servir aux développpeurs chevronnés pour distribuer un objet événement personnelisé dans le flux d'événements. Cette méthode accepte un seul paramètre, une ↔équence à l'objet événement, qui doit être une occurrence de la classe Event ou de l'une de ces sous-classes. Àpres distribution, la propriété target de l'objet événement est définitie avec l'objet sur lequel portait l'appel dispatchEvent().

Vérification des écouteurs d'évenement existants

Les deux dernières méthodes de l'interface IEventDispatcher fournissant des informations précieuses sur l'existence des écouteurs d'évenement. La méthode hasEventListener() renvoie la valeur true si un écouteur d'évenement est detecté pour un type d'évenement spécifique sur un objet particulier de la liste d'affichage. La méthode willTrigger() renvoie également la valeur true si un écouteur est detecté 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'évenements.

Événements d'erreur sans écouteurs

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

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 creez pas d'écouteur pour l'évenement d'erreur, les versions de débogage de Flash Player et AIR affichent une boîte de dialogue significante 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éscrit l'erreur associée à une tentative de chargement d'un fichier par l'application à partir d'une URL non valide :

ADOBE ACTIONSCRIPT 3.0 - Événements d'erreur sans écouteurs - 1

La plupart des événements d'erreur reposent sur la classe ErrorEvent. Ils serontient 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 StatusBar et NetStatusEvent. Ces deux classes possèdent une propriété level (StatusEvent.level et StatusBar.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'interrrompt pas l'exécution du fjichier 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 fjichier journal d'Adobe Flash Builder. Aucune manifestation n'est visible dans les autres versions de Flash Player ou AIR.

Exemple de gestion des événements : Alarm Clock

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

L'exemple Alarm Clock correspond à une horloge qui permet à l'utiliser 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 1 et illustré 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'évenement personnelisé

Pour obtenir les fichiers d'application Flash Professional associés à cet exemple, voir

www.adobe.com/go/learn_programmingAS3samples.flash_fr. Pour obtenir les fischiers d'application Flex associés à cet exemple, voir http://www.adobe.com/go/as3examples_fr. Les fischiers d'application Alarm Clock se trouvent dans le dossier Samples/AlarmClock. Il s'agit des fischiers suivants :

FichierDescription
AlarmClockApp.mxml ou AlarmClockApp.flaFichier d'application principal dans Flash (FLA) ou Flex (MXML).
com/example/programmingas3/clock/AlarmClock.asClasse permettant d'extendre la classe SimpleClock, qui ajoute la fonctionnalité de réveil.
com/example/programmingas3/clock/AlarmEvent.asUne classe d'événement personnelisé (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.asDessine 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.asComposant d'interface d'horloge doté d'une fonctionnalité simple de mesure temporelle (décrit dans l'exemple SimpleClock).

Présentation du réveil

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

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éscribe à la section « Exemple de date et heures : horloge analogique simple » à la page 6. 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 role des événements est de fournir un avertissement lorsque se produit quelque chose. La classe AlarmClock expose l'évenement 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 averrir d'autres objets (une occurrence de AlarmClock dans ce cas) une fois un certainIELAI écoué. 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

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

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éveloppement de définir du code qui sera executé après un début spécifique. La classe AlarmClock utilise une occurrence de Timer pour déterminer le moment auquel déclencher l'alarme.

import flash.eventsTimerEvent;
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éfinitie 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 millisecond et de déclencher l'évenement timer une seule fois. ÀpRES instanciation de alarmTimer, le code appelle la méthode addEventListener() de cette variable pour indiquer qu'il peut écouter l'évenement timer de cette variable. Le fonctionnement d'une occurrence de Timer repose sur la distribution de l'évenement timer après un certain-delai. La classe AlarmClock doit savoir quand l'évenement 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'évenement timer (indiqué par la constante TimerEvent.TIMER), et que lorsque l'évenement survient, la méthode onAlarm() de la classe AlarmClock doit être appelée en réponse à l'évenement.

Pour effectivement définir l'alarme, la méthode setAlarm() de la classe AlarmClock est appelée, comme suit :

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 importante 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 (réprésentée par la variable now) est soustraite à la valeur de la variable alarmTime afin de déterminer combien de millisecond des doivent s'écouler avant le déclenchement de l'alarme. La classe Timer ne déclenché pas l'évenement timer à une heures absolue; c'est ce décalage relatif qui est attribué à la propriété delay d'alarmTimer. Enfin, la méthode start() est appelée pour lancer le minuteur.

Une fois le délambda spécifie écoulé, alarmTimer distribue l'évenement timer. Comme la classe AlarmClock s'est enregistrée comme écouteur auprès de sa méthode onAlarm() pour l'évenement 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);
}

Lorsqu'une méthode est enregistrée comme écouteur d'évenement, 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'évenement timer de la classe Timer, une méthode doit composer 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'évenement, elle transmet une occurrence de TimerEvent à l'objet événement.

Notification de l'alarme à d'autres composants

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

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éclenché. 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 IMPLEMENTation standard de IEventDispatcher (ou par extension de l'une des sous-classes de EventDispatcher). Comme déscrit précédemment, la classe AlarmClock étend la classe SimpleClock, qui (par le biais d'une chaine d'héritage) étend la classe EventDispatcher. 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 notifies de l'évenement alarm de la classe AlarmClock en appelant la méthode addEventListener(), heritée de EventDispatcher. Lorsqu'une occurrence de AlarmClock est prête à notification à d'autres éléments de code le déclenchement de l'évenement alarm, elle le fait en appelant la méthode dispatchEvent(), également heritée de EventDispatcher.

var alarm:AlarmEvent = new AlarmEvent(this.alarmMessage); this.delayEvent(alarm);

Ces lignes de code sont extraites de la méthode onAlarm() de la classe AlarmClock (presents plus haut dans son intégrality). La méthode dispatchEvent() de l'occurrence de AlarmClock est appelée, puis elle notification à tous les écouteurs enregistrés le déclenchement de l'évenement 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éé spécialement pour cet exemple.

Elaboration d'un événement d'alarme personnelisé

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Tous les écouteurs d'évenement recoivent un paramètre d'objet événement avec des informations sur l'évenement 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éré utile de fournir des informations complémentaires aux écouteurs d'évenement. 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é comme objet événement lorsque l'évenement alarm de la classe AlarmClock est distribué. La classe AlarmEvent, présente ici, fournit des informations complémentaires sur l'évenement alarm, à savoir le message d'alarme :

Le meilleur moyen de creator une classe d'objet événement personnalisée est de définir une classe qui étend la classeEvent, comme illustré dans l'exemple précédent. Pour compléter la fonctionnalité hériteit, la classe AlarmEvent définit une propriété message qui contient le texte du message d'alarme associé à l'évenement. 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 à referrer l'évenement (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() heritiée dans le cadre de la gestion des événements ActionScript. Les sous-classes Event peuvent eventuèlement redéfinir la méthode toString() afin d'inclure les propriétés de l'événement personnelé dans la valeur renvoyée par l'appel de la méthode toString().

/\*\* \*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 formattedToString("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érête de Event) sert à fournir une chaîne相对较vant le nom du type personnalisé, ainsi que les noms et valeurs de toutes ses propriétés.

Chapitre 9 : Utilisation de domaines d'application

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Le role de la classe ApplicationDomain est de stocker un tableau des définitions ActionScript 3.0. L'ensemble du code d'un fichier SWF est défini de sorte à exister dans un domaine d'application. Les domaines d'application seront à partitionner les classes qui se trouvent dans un même domaine de sécurité. Ainsi, plusieurs définitions de la même classe peuvent exister et les enfants peuvent réutiliser les définitions des parents.

Voupe faite appel aux domaines d'application lors du chargement, au moyen de l'API de la classe Loader, d'un fichier SWF externe etrit en ActionScript 3.0 (Notez que you ne pouze pas utiliser les domains d'application lorsque you chargez une image ou un fichier SWF etrit en ActionScript 1.0 ou 2.0.) Toutes les definiptions ActionScript 3.0 containues dans la classe chargede sont stockées dans le domaine d'application. Lorsque you chargez un fichier SWF, you'vez indiquer que le fichier doit etre inclus dans le même domaine d'application que I'objet Loader en attribuant au parametre applicationDomain de I'objet LoaderContext la valeur

ApplicationDomain.currentDomain. Si vous placez le fjichier SWF charge dans le même domaine d'application, vous pourrez acceder directement à ses classes, Cela s'avere pratique si vous chargez un fjichier SWF qui contient des medias incorporeés auxquels vous pouvez acceder via les noms de classe associés, ou si vous voulez acceder aux méthodes du fjichier SWF charge.

L'exemple suivant presuppose l'accès à un filchier Greeter.swf distinct définissant une méthode publique nommée welcome():

package
{ import flash.display.Loader; import flash.display.Sprite; import flash.events.*; import flash.net(URLRequest; import flash.system.ApplicationDomain; import flash.system LoadedContext; public class ApplicationDomainExample extends Sprite { private var ldr:Loader; public function ApplicationDomainExample() { ldr = new Loader(); var req:URLRequest = new URLRequest("Greeter.swf"); var ldrContext:LoaderContext = new LoaderContext(false,
ApplicationDomain.currentDomain); ldr(contentLoaderInfo.addEventListener(Event.COMPLETE,completeHandler); ldr.load(req,ldrContext); } private function completeHandler(event:Event):void { var myGreeter:Class = ApplicationDomain.currentDomain.getDefinition("Greeter") as Class; var myGreeter:Greeter = Greeter(event.target/content); var message:String = myGreeter.welcome("Tommy"); trace(message); //Hello,Tommy } }

Voir aussi l'exemple de classe ApplicationDomain dans le manuel Guide de référence ActionScript 3.0 pour la plateforme Adobe Flash.

Voici d'autres points à garder à l'esprit lorsque vous utilisez les domaines d'application :

  • L'ensemble du code d'un fichier SWF est défini de sorte à exister dans un domaine d'application. L'application principale s'exécute dans le domaine d'application actif. Le domaine du système contient tous les domaines d'application, y compris le domaine actif; il contient donc toutes les classes Flash Player.
  • A l'exception du domaine du système, tous les domaines d'application sont associés à un domaine parent. Le domaine parent du domaine de l'application principale est le domaine du système. Les classes chargées ne sont définies que si leur parent ne les définit pas encore. Vous ne pouvez pas replacer une définition de classe chargée par une définition plus récente.

Le schéma suivant illustrer une application qui charge du contentu à partir de divers fichiers SWF au sein d'un domaine unique, domain1.com. Selon le contentu charge, différents domains d'application peuvent être utilisés. Le texte suivant déscrit la logique utilisé pour définir le domaine d'application approprié pour chaque fichier SWF de l'application.

ADOBE ACTIONSCRIPT 3.0 - Chapitre 9 : Utilisation de domaines d'application - 1
A. Utilisation A B. Utilisation B C. Utilisation C

Le fichier principal d'application est application1.swf. Il contient des objets Loader qui charge du contenu à partir d'autres fichiers SWF. Dans ce scenario, le domaine d'application 1 est actif. Utilisation A, Utilisation B et Utilisation C illustrent les différentes techniques permettant de définir le domaine d'application approprié pour chaque fichier SWF de l'application.

Utilisation A Partitionné le fjichier SWF enfant en créé un enfant du domaine du système. Dans le schéma, le domaine d'application 2 est créé en tant qu'enfant du domaine du système. Le fjichier application2.swf est charge dans le domaine d'application 2 et ses définitions de classe sont ainsi partitionnées à partir des classes définies dans application1.swf.

Cette technique s'appliquera par exemple lorsqu'une ancienne application doit charger dynamiquement une nouvelle version de la même application sans creer de conflits. Les conflits sont éliminés parce que même si les noms de classe sont les mêmes, ils sont répartis dans différents domaines d'application.

Le code suivant cree un domaine d'application qui est un enfant du domaine du systeme, puis commence a charger un fichier SWF à l'aide de ce domaine d'application :

var appDomainA:ApplicationDomain = new ApplicationDomain(); 
var contextA:LoaderContext = new LoaderContext(false, appDomainA); 
var loaderA:Loader = new Loader(); 
loaderA.load(new URLRequest("application2.swf"), contextA); 

Utilisation B Ajoutez de nouvelles définitions de classe aux définitions actuelles. Le domaine d'application de module1.swf est défini sur le domaine actif (Domaine d'application 1). Vous pouvez alors ajouter au jeu actuel de définitions de classe de l'application de nouvelles définitions de classe. Cela pourrait servir pour une bibliothèque d'exécution partagée appartenant à l'application principale. Le fichier SWF est traité comme une bibliothèque partagée distante (RSL, remote shared library). Utilisez cette technique pour charger des RSL à l'aide d'un fichier de préchargement avant le lancement de l'application.

Le code suivant charge un fichier SWF, en définiissant son domaine d'application sur le domaine actif :

var appDomainB:ApplicationDomain = ApplicationDomain.currentDomain;

var contextB:LoaderContext = new LoaderContext(false, appDomainB);
var loaderB:Loader = new Loader();
loaderB.load(new URLLRequest("module1.swf"), contextB);

Utilisation C Utilisez les définitions de classe du parent en ajoutant un nouveau domaine infant au domaine actif. Le domaine d'application de module3.swf est un enfant du domaine actif, qui utilise pour toutes les classes les versions du parent. Cette technique peut s'appliquer à un module d'une application Internet riche (RIA, Rich Internet Application) à plusieurs écrans, qui seront charge comme enfant de l'application principale et utiliserait les types de cette dernière. Si vous pouvez garantir que toutes les classes sont toujours mises à jour pour rester compatibles avec les anciennes versions et que l'application de chargement est toujours plus récente que les contenus qu'elle charge, les enfants utilisayaront les versions des parents. L'utilisation d'un nouveau domaine d'application permet également de décharger toutes les définitions de classe en vue du nettoyage, à condition de veiller à ce qu'il ne subsiste aucune reférence au fichier SWF infant.

Cette technique autorise les modules charges à partir des objets Singleton et les membres de classe statiques de l'objet Loader.

Le code suivant cree un domaine infant dans le domaine actif et commence a charger un fichier SWF à l'aide de ce domaine d'application :

var appDomainC:ApplicationDomain = new ApplicationDomain(ApplicaitonDomain.currentDomain);

var contextC:LoaderContext = new LoaderContext(false, appDomainC);
var loaderC:Loader = new Loader();
loaderC.load(new URLLRequest("module3.swf"), contextC);

Chapitre 10 : Programming de l'affichage

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La programmation des éléments visuels dans Adobe® ActionScript® 3.0 repose sur l'utilisation des objets d'affichage sur la scène. Vous pouvez, par exemple, ajouter, déplacer, supprimer et trier les objets d'affichage, appliquer des filtres et des masques, dessiner des vecteurs et des graphiques bitmap, et executer des transformations en trois dimensions par le biais de l'API de programmation de l'affichage ActionScript. Les classes principales permettant de programmerper l'affichage font partie du package flash.display.

Remarque: Adobe® AIR™ fournit l'objet HTMLEader pour rendre et afficher un contenu HTML. L'objet HTMLEader effectue le rendu des éléments visuels du DOM HTML en tant qu'objet d'affichage unique. Il est impossible d'acceder directement à chaque élément du DOM par le biais de la hierarchie de la liste d'affichage ActionScript. Vous accédez aux éléments du DOM à l'aide de l'API DOM distincte proposée par l'objet HTMLEader.

Concepts fondamentaux de la programmation de l'affichage

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Chaque application créé par le biais d'ActionScript 3.0 possède une hierarchie 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.

ADOBE ACTIONSCRIPT 3.0 - Concepts fondamentaux de la programmation de l'affichage - 1

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 object Stage, qui contient tous les objets d'affichage à l'écran. La scène correspond au conteneur de plus haut niveau et domine la hierarchie de la liste d'affichage :

Chaque fisquier SWF est associé à une classe ActionScript, appelée classe principale du fisquier SWF. Lorsqu'un fisquier 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 (systematiquement un type d'objet d'affichage) est ajoutée en tant qu'enfant de l'objet Stage. La classe principale d'un fisquier SWF étend systematiquement la classe Sprite (pour plus d'informations, voir « Avantages de l'utilisation de la liste d'affichage » à la page 162).

Voussouspoucez accederà la scenevia la propriete stage de toute occurrence de DisplayObject.Pour plus d'informations,voir «Definition des propriétésde la scene » à la page 171.

  • Objects d'affichage

Dans ActionScript 3.0, tous les éléments qui apparaissent à l'écran dans une application sont des types d'objects 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'objects d'affichage, tels que les formes vectorielles, les clips et les champs de texte, pour n'en citer que quelques-uns. Pour une presentation de ces classes, voir « Avantages de l'utilisation de la liste d'affichage » à la page 162.

  • 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 compterer des objets infant qui sont aussi des objets d'affichage.

La classe DisplayObjectContainer est une sous-classe de la classe DisplayObject. Un objet DisplayObjectContainer peut containir plusieurs objets d'affichage dans la liste d'enfants correspondante. Par exemple, l'illustration suivant contient un type dobjet DisplayObjectContainer appelé Sprite qui comporte divers objets d'affichage :

ADOBE ACTIONSCRIPT 3.0 - Concepts fondamentaux de la programmation de l'affichage - 2
A. Obj SimpleButton. Ce type d'objet d'affichage possè des états « up », « down » et « over ». B. Obj Bitmap. Dans ce cas de figure, l'objet Bitmap a été chargeé à partir d'un JPEG externe via un objet Loader. C. Obj Shape. Le « cadre d'image » contient un rectangle arrondi dessiné dans ActionScript. Un filtré Ombre portée est appliqué à cet objet Shape. D. ObjTextField.

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 scene est un conteneur d'objets d'affichage.

Bien que tous les objets d'affichage visibles hériment 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.

Concepts important et terminologie

La liste de référence suivante contient des termes importantes utilisés dans le cadre de la programmation des graphiques ActionScript :

Alpha Valeur colorimétrique représentant le montant de transparence (ou, plus précisé, 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 fondu 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 totally invisible. Toutefois, divers modes de fondu entrainent le mélange des couleurs de diverses façon de sorte que le résultat correspond à une combinaison des deux images.

LiTe d'affichage Hiearchie 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 (meme si l'objet n'est pas a proprement parler rendu, para que qu'il reside en dehors de la scène, par exemple).

Objet d'affichage Object 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 composer des objets d'affichage infant.

Classe principale du fichier SWF Classe qui definit le comportement de I'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, dans un fichier SWF generé dans un outil de creation Flash, la classe principale correspond à la classe du document. Elle possède un « scenario principal » qui intègre tous les autres scénarios. La classe principale du fichier SWF correspond à la classe dont le scenario 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 refère à la bande utilisée par un peintre en bâtiment pour empêcher la peinture d'être appliquée à certaines sections.

Scene 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ésignement, déformation ou alteration 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).

Classes d'affichage de base

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Le package flash.display ActionScript 3.0 contient des classes destinées aux objets visuels susceptibles d'apparaitre dans Flash Player ou AIR. L'illustration suivant identifie les relations entre les sous-classes de ces classes d'objets d'affichage de base.

ADOBE ACTIONSCRIPT 3.0 - Classes d'affichage de base - 1

L'illustration indique ce dont hériment 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ériment toute fois des caractéristiques de la classe Display Object.

Toutes les classes qui étendent la classe DisplayObject hériment de ses méthodes et propriétés. Pour plus d'informations, voir « Propriétés et méthodes de la classe DisplayObject » à la page 165.

Yououpouvezcrier uneoccurrenced'unobject desclasses suivantes,qui figurendanslepackage flash.display:

  • Bitmap : la classe Bitmap permet de définir des objets bitmap, quils soient charges à partir de fischiers externes ou rendus via ActionScript. Vous pouvez charger des bitmaps à partir de fischiers externes par le biais de la classe Loader. Libre à vous de charger des fischiers GIF, JPG ou PNG. Vous pouvez également créé un objet BitmapData à partir de données personalisées, puis créé un objet Bitmap qui utilise ces données. Les méthodes de la classe BitmapData permettent de modifier les bitmaps, quils soient charges ou créés dans ActionScript. Pour plus d'informations, voir « Chargement d'objets d'affichage » à la page 206 et le chapitre « Utilisation des images bitmap » à la page 251.
  • Loader : la classe Loader permet de charger des ressources externes (fichiers SWF ou graphiques). Pour plus d'informations, voir « Chargement dynamique du contenu d'affichage » à la page 205.
  • Shape : la classe Shape permet de creer des graphiques vectoriels, tels que des rectangles, des lignes, des cercles, etc. Pour plus d'informations, voir « Utilisation de l'API de dessin » à la page 230.
  • 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 containir des graphiques qui lui sont propres, ainsi que des objets d'affichage infant (la classe Sprite étend la classe DisplayObjectContainer). Pour plus d'informations, voir « Utilisation de conteneurs d'objets d'affichage » à la page 165 et « Utilisation de l'API de dessin » à la page 230.

  • 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 après : il possède également un scenario. Pour plus d'informations, voir « Utilisation des clips » à la page 333.

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, voir « Principes de base de l'utilisation du texte » à la page 383.
  • La classe TextLine, qui figure dans le package flash.text.engine, correspond à l'objet d'affichage permettant d'afficher des lignes de texte composées par Flash Text Engine et Text Layout Framework. Pour plus d'informations, voir « Utilisation de Flash Text Engine » à la page 410 et « Utilisation de Text Layout Framework » à la page 440.
  • La classe Video, qui figure dans le package flash.media, correspond à l'objet d'affichage utilisé pour afficher des fichiers video. Pour plus d'informations, voir « Utilisation de la video » à la page 489.

Les classes suivantes du package flash.display étendent la classe DisplayObject, mais il est impossible d'en creer une occurrence. Parce qu'elles combin des fonctionnalités communes en une classe unique, elles seront plutôt de classes parent à d'autres objets d'affichage.

  • AVM1Movie : la classe AVM1Movie permet de représentier des fichiers SWF charges 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, voir « Utilisation de conteneurs d'objets d'affichage » à la page 165.
  • 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'une interaction de souris ou de clavier, voir « Principes de base de l'interaction utiliser » à la page 574.
  • MorphShape : ces objets sont généres lors de la création d'une interpolation de forme dans l'outil de programmation Flash. Il est impossible d'en creer des occurrences par le biais d'actionScript, mais vous pouvez y acceder 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 hierarchie de la liste d'affichage. Vous pouvez acceder à la scene via la propriété stage de toute occurrence de DisplayObject. Pour plus d'informations, voir « Définition des propriétés de la scene » à la page 171.

Par ailleurs, la classe StaticText, qui figure dans le package flash.text, etend la classe DisplayObject, mais il est impossible d'en creer une occurrencie dans du code. Les champs de texte statique sont crees dans Flash uniquement.

Les classes suivantes ne sont ni des objets d'affichage, ni des conteneurs d'objets d'affichage et n'apparaissent pas dans la liste d'affichage, mais affichent des graphiques sur la scene. Elles dessinent des éléments dans un rectangle, appelé fenêtre d'affichage, positionné relativement à la scene.

  • StageVideo : la classe StageVideo affiche le contenu video en faisant appel, dans la mesure du possible, à l'accelération matérielle. Cette classe est disponible à partir de Flash Player 10.2. Pour plus d'informations, voir « Présentation à accelération matérielle par le biais de la classe StageVideo » à la page 528.
  • StageWebView : la classe StageWebView affiche le contenu HTML. Elle est prise en charge depuis la version 2.5 d'AIR. Pour plus d'informations, voir « Objects StageWebView » à la page 1068.

Les classes fl.display suivantes proposent des fonctionnalités équivalentes à celles des classes flash.displayLoader et LoaderInfo. Utilisez-les au lieu des classes flash.display équivalentes en cas de développement dans l'environnement Flash Professional (CS5.5 ou ultérieur). Dans cet environnement, ces classes permettent de résoudre les problèmes liés à TLF avec préchargement RSL. Pour plus d'informations, voir « Utilisation des classes ProLoader et ProLoaderInfo » à la page 210.

  • fl.display.ProLoader : équivalente à flash.display.Loader
  • fl.display.ProLoaderInfo : équivalente à flash.displayLoadingInfo

Avantages de l'utilisation de la liste d'affichage

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

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'objects identiques sont inclus dans une meme classe : MovieClip.

Cette individualisation des classes et la structure hierarchique des listedes d'affichage presentent 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
  • Objects d'affichage absents de la liste
  • Classement simplifié en sous-classes des objets d'affichage

Rendu plus efficace et taille réduite des fichiers

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

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 compte des propriétés associées au scenario du clip. Les propriétés de gestion du scenario 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 besoin de mémoire de l'objet.

Gestion optimisée de la profondeur

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

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比较好 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 première position d'index (numChildren - 1). Cette technique n'était pas proposée par les méthodes et propriétés d'un object MovieClip dans ActionScript 1.0 et 2.0.

ActionScript 3.0 permet de parcourir aisément et séquientiellement la liste d'affichage, car les numérios d'index de la liste des enfants d'un conteneur d'objets d'affichage se suivant. Parcourir la liste d'affichage et géné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 effetContaining 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éré également très rapide.

Dans ActionScript 3.0, vous pouvez également acceder aux enfants d'un conteneur d'objets d'affichage par le biais de la méthode getChildByName() de la classe DisplayObjectContainer.

Parcours entier de la liste d'affichage

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

ActionScript 1.0 et 2.0 ne vous permettaient pas d'acceder à certains objets, telles les formes vectorielles, dessinées dans l'outil de programmation Flash. Dans ActionScript 3.0, vous pouze acceder à tous les objets de la liste d'affichage, qu'ils aient été créé en ActionScript ou dans l'outil de programmation Flash. Pour plus d'informations, voir « Parcours de la liste d'affichage » à la page 169.

**Objets d'affichage absents de la liste**

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

ActionScript 3.0 permet de creer 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 occurrencie 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 responsable 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 horsliste à la liste d'affichage au moment youlu. 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

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Dans ActionScript 1.0 et 2.0, il était souvent nécessaire d'ajouter de nouveaux objets MovieClip à un fichier SWF pour créé 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écifique d'objets, il est plus simple de créé des sous-classes de base des classes intégrées.

Par exemple, pour dessiner un cercle dans ActionScript 2.0, vous pourriezisser 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 toute foisisser une classe CustomCircle qui étend l'objet Shape et, de ce fait, ne comprend pas les propriétés et méthodes sans rapport continues dans la classe MovieClip. Le code suivant illustre un exemple de classe CustomCircle :

import flash.display.*;   
public class CustomCircle extends Shape { var xPos:Number; var yPos:Number; var radius:Number; var color:uint; public function CustomCircle(xInput:Number, yInput:Number, rInput:Number, colorInput:uint) { xPos = xInput; yPos = yInput; radius = rInput; color = colorInput; this.graphics.beginFill(color); this.graphics.drawCircle(xPos, yPos, radius); } 

Utilisation des objets d'affichage

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Maintenant que vous maïrrisiez 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

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Tous les objets d'affichage sont des sous-classes de la classe DisplayObject et, de ce fait, hériment des propriétés et méthodes de cette dernière. Les propriétés dont ils hériment correspondant aux propriétés de base qui s'appliquent à tous les objets d'affichage. Par exemple, chaque object 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 creer une occurrence de DisplayObject à l'aide du constructeur de la classe DisplayObject. Vous nevez creer un autre type d'objet (un objet qui est une sous-classe de la classe DisplayObject), tel Sprite, pour creer une occurence d'objet par le biais de I'opérateur new. Par ailleurs, pour creer une classe d'objet d'affichage personnalisée, vous nevez creer 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, voir la description de la classe DisplayObject dans le manuel Guide de reference ActionScript 3.0 pour la plate-forme Adobe Flash.

Ajout d'objets d'affichage à la liste d'affichage

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Lorsque vous créEZ une occurrencé d'un objet d'affichage, elle n'apparait 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 myTextTextField 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.

import flash.display.*;  
import flash.text.TextField;  
var myText:TextField = newTextField();  
myText.text = "Buenos días.";  
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 charge 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 un fjichier MXML Flex ou en plaçant un élément sur la scene dans Flash Professional) est ajouté à la liste d'affichage. Bien que vous n'ajoutiez pas ces objets d'affichage par le biais d'ActionScript, vous pouvez y acceder via ActionScript. Par exemple, le code suivant règla 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

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

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 illustrer un conteneur d'objects d'affichage, pictureScreen, qui compte une forme de contour et quatre autres conteneurs d'objects d'affichage (de type PictureFrame):

ADOBE ACTIONSCRIPT 3.0 - Utilisation de conteneurs d'objets d'affichage - 1
A. Forme definissant la cordure 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 = newTextField();  
myTextField.text = "hello";  
this.root.addChild(myTextField); 

Dans cet exemple de code, this.root pointe vers le conteneur d'objects d'affichage MovieClip qui comporte le code. Dans votre propre code, vous pouvez stipuler un autre conteneur.

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 reférènt à l'ordre d'apparition (de l'avant à l'arrête) des objets d'affichage. Considerons par exemple les trois objets d'affichage suivants. Chaque objet a été créé à partir d'une classe personnalisée appelée Ball.

ADOBE ACTIONSCRIPT 3.0 - Utilisation de conteneurs d'objets d'affichage - 2

ADOBE ACTIONSCRIPT 3.0 - Utilisation de conteneurs d'objets d'affichage - 3

ADOBE ACTIONSCRIPT 3.0 - Utilisation de conteneurs d'objets d'affichage - 4

L'ordre d'apparition de ces objets d'affichage dans leur conteneur peut etre modifie par le biais de la methode addChildAt(). Considerons par exemple le code qui suit :

Une fois ce code executé, les objets d'affichage sont placés comme suit dans l'objet DisplayObjectContainer container. Notez l'ordre d'apparition des objets.

ADOBE ACTIONSCRIPT 3.0 - Utilisation de conteneurs d'objets d'affichage - 5

Pour placer un objet en tete 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'emplement d'objects.

Vous disposez de la methode getChildAt() pour vérifier l'ordre d' apparition des objets d'affichage. La methode getChildAt() renvoie les objets infant d'un conteneur en fonction du numero d'index transmis. Par exemple, le code suivant revè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é descentent tous d'une position dans l'index des enfants. Ainsi, si nous repreneons l'exemple précédent, le code ci-après illustré le transfert de l'objet d'affichage qui occuqaient 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.getChildrenAt(0).name); // ball_A trace (container.getChildrenAt(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 t f 1 ne peut figurer que dans un seul conteneur (soit, dans ce cas, un Sprite, qui étend la classe DisplayObjectContainer):

tf1:TextField = newTextField();  
tf2:TextField = newTextField();  
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.getChildrenAt(0).name); // text 2  
trace(Container2 numChildren); // 1  
trace(Container2.getChildrenAt(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 infant, notamment :

  • contains(): déterminé 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(): modifier la position d'un objet d'affichage enfant.
  • removeChildren(): supprime plusieurs objects d'affichage enfants.

  • swapChildren(): permute l'ordre de deux objets d'affichage.

  • swapChildrenAt(): permute l'ordre de deux objets d'affichage définis en fonction de leur valeur d'index.

Pour plus d'informations, voir les entrées pertinentes du manuel Guide de référence ActionScript 3.0 pour la plateforme Adobe Flash.

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

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

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 compter plusieurs objets d'affichage. Les objets d'affichage qui sont eux-memes des conteneurs d'objets d'affichage peuventContainir d'autres objets d'affichage,voire des conteneurs d'objects d'affichage.

ADOBE ACTIONSCRIPT 3.0 - Parcours de la liste d'affichage - 1

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 = newTextField();   
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); 

La méthode getChildAt() renvoie l'enfant de la liste d'affichage à une position d'index déterminée :

trace container.getChildAt(0) isTextField); // true

Vou puez également acceder aux objets enfant en indiquant leur nom. Chaque objet d'affichage possé un nom, qui est attribué par défaut par Flash Player ou AIR (tel « instance1 ») si vous ne l'attribuuez pas vous-même. Par exemple, le code suivant indique comment utiliser la méthode getName() pour acceder à un objet d'affichage enfant portant le nom « banana loader »:

trace container.getName("banana loader") is Loader); // true

L'utilisation de la méthode给孩子ByName() entraîne parfois un ralentissement des performances par rapport à la méthode给孩子At().

Puisque la liste d'affichage d'un conteneur d'objets d'affichage peutContainir 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 charge. Pour acceder à 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 suivantegénéure un extrait trace() en retrait de la liste d'affichage d'un conteneur d'objects d'affichage :

function traceDisplayList container:DisplayObjectContainer,indentString:String = ""):void { var child:DisplayObject; for (var i:uint = 0 ; < container numChildren; i + + ) { child = container.getChildAt(i); trace(indentString,child,child.name); if (container.getChildAt(i) is DisplayObjectContainer) { traceDisplayList(DisplayObjectContainer(child),indentString ^+ "") } }

Adobe Flex

Si vous utilisez Flex, notez que cette application définit un grand nombre de classes d'objects d'affichage de composant et que celles-ci priment sur les méthodes d'accès à la liste d'affichage de la classe DisplayObjectContainer. Par exemple, la classe Container du package mx.core prime sur la méthode addChild() et autres méthodes de la classe DisplayObjectContainer (étendue par la classe Container). Dans le cas de la méthode addChild(), la classe primant sur la méthode, vous ne pouvez pas ajouter tous les types d'objects d'affichage à une occurrence de Container dans Flex. La méthode remplacee demande dans ce cas que l'objet infant ajouté soit de type mx.core.IIComponent.

Définition des propriétés de la scene

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

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 rengoient 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 object d'affichage par rapport à son conteneur, et puisque la scene ne se trouve pas dans un autre conteneur d'objets d'affichage, ces propriétés seraient inapplicable.

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 charge. Pour plus d'informations, voir « Sécurité de la scène » à la page 1109.

Contrôle de la cadence de lecture

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La propriété Framerate de la classe Stage permet de définir la cadence de tous les fichiers SWF charges dans l'application. Pour plus d'informations, voir le manuel Guide de referencia ActionScript 3.0 pour la plate-forme Adobe Flash.

Contrôle de la mise à l'échelle de la scène

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Lorsque la portion de l'écran qui représenté Flash Player ou AIR est redimensionné, le moteur d'exécution ajusté automatiquement le content de la scène en conséquence. La propriété scaleMode de la classe Stage détermine comment le content de la scène est ajusté. Cette propriété peut être réglée sur quatre valeurs distinctes, définies en tant que constantes dans la classe flash.display.StepScaleMode :

  • StageScaleMode.EXACT FIT met à l'échelle le fichier SWF de sorte à occuper les nouvelles dimensions de la scène sans tener compte du format d'origine du contenu. Etant donné que les facteurs d'échelle ne sont pas nécessairement identiques en largeur et en hauteur, le contenu risque de sembler écrasé ou étiré en cas de modification du format de la scène.
  • StageScaleMode.SHOW_ALL met à l'échelle le fichier SWF de sorte à occuper les nouvelles dimensions de la scène sans modifier le format du contenu. Ce mode de mise à l'échelle affiche la totalité du contenu, mais risque de donner lieu à des cordures de type « boîte aux lettres » similaires aux barres noires qui entourent un film grand écran sur une télévision standard.
  • StageScaleMode.NO Borders met à l'échelle le fjichier SWF de sorte à occuper totalement les nouvelles dimensions de la scène sans modifier le format du contenu. Ce mode de mise à l'échelle exploite pleinement la zone d'affichage de la scène, mais risque d'engendrer un recadrage.
  • StageScaleMode.NO Scale : ne met pas à l'échelle le fjichier SWF. Si les nouvelles dimensions de la scène sont inférieures aux dimensions d'origine, le contenu est recadré. Si elles leur sont supérieures, l'espace ajouté est vide. Dans le mode de mise à l'échelle StageScaleMode. NO Scale uniquely, les propriétés stageWidth et stageHeight de la classe Stage permettent de déterminer les dimensions réelles de la scène redimensionnée, exprimées en pixels. (Dans les autres modes, les propriétés stageWidth et stageHeight renvoie toujours la largeur et la hauteur d'origine du fjichier SWF.) De plus, lorsque la propriété scaleMode est définie sur StageScaleMode. NO Scale et que le fjichier SWF est redimensionné, l'évenement resize de la classe Stage est distribué, ce qui vous permet d'effectuer des ajustements en conséquence.

Définir scaleMode sur StageScaleMode.NO Scalepermetdondcdeuier controlerlajustementdu contenu en cas de redimensionnement de la fenetre.Par exemple,siun fichier SWF contient une video et une barre de controle, ilpeut s'avérer utile de conserver la taille de la barre de controle en cas de redimensionnement de la scene et de ne modifier que la taille de la fenetre de video en fonction du changement de taille de la scene.Ce cas de figure est illustrerdans l'exampie suivant:

//主要内容是a display object containing the main content; //it is positioned at the top-left corner of the Stage, and //it should resize when the SWF resize. //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主要内容) and it should not resize when the SWF //resizes. import flash.displayStage; import flash.display.StageAlign; import flash.display.StageScaleMode; import flash.events.Event; var swfStage:Stage =主要内容.stage; swfStage_scaleMode = StageScaleMode.NO Scale; swfStage align = StageAlign.TOP_LEFT; swfStage.addEventListener(Event.RESIZE,resizeDisplay); function resizeDisplay(event:Event):void { var swfWidth:int = swfStage.stageWidth; var swfHeight:int = swfStage.stageHeight; //Resize the main content area var newContentHeight:Number = swfHeight - controlBar.height;主要内容.height = newContentHeight;主要内容.scaleX = 主要内容(scaleY; //Reposition the control bar. controlBar.y = newContentHeight; }

Définition du mode de mise à l'échelle de la scène pour les fenêtres AIR

La propriété scaleMode de la scène indique comment celle-ci met à l'échelle et écrête les objets d'affichage infant lors d'un redimensionnement de fenêtre. N'utilise que le mode noScale dans AIR. Lorsque ce mode est activé, la scène n'est pas mise à l'échelle. La taille de la scène est modifiée directement en fonction des limites de la fenêtre. Les objets risquent d'être écrétés si la taille de la fenêtre est inférieure à sa taille initiale.

Les modes de mise à l'échelle de la scène sont adaptés aux environnementés tels qu'un navigateur Web qui ne permet pas nécessairement de contrôle la taille ou le format de la scène. Grace aux modes, vous pouvez selectionner le cas de figure le moins inadapté lorsque la scène ne correspond pas à la taille ou au format idéal définir par l'application. Dans AIR, vous contrôlez toujours la scène. Par conséquent, modifier la disposition du contenu ou redimensionner la fenêtre assure un meilleur résultat que l'activation de la mise à l'échelle de la scène.

Dans le navigateur et la fenêtre AIR initiale, la relation entre la taille de fenêtre et le facteur d'échelle initial est extraite du fjichier SWF charge. Toutefois, lorsque vous creez un objet NativeWindow, AIR désit une relation arbitraire définie sur 72:1 entre la taille de fenêtre et le facteur d'échelle. Par conséquent, si la fenêtre mesure 72x72 pixels, un rectangle de 10x10 pixels ajouté à la fenêtre est dessiné à la taille correcte (soit 10x10 pixels). Par contre, si la fenêtre mesure 144x144 pixels, un rectangle de 10x10 pixels est mis à l'échelle (soit 20x20 pixels). Si vous préférez utiliser une propriété scaleMode autre que noScale pour une scène de fenêtre, vous pouvez compenser le résultat en définissant le facteur d'échelle de tout object d'affichage de la fenêtre sur le rapport 72 pixels/largeur et hauteur actuelles de la scene. Le code suivant calcule par exemple le facteur d'échelle requis de l'objet d'affichage client :

if(newWindow stage scaleMode != StageScaleMode.NO_SCALE) {  
    client_scaleX = 72/newWindow.stage(stageWidth);  
    client_scaleY = 72/newWindow.stage(stageHeight);  
} 

Remarque: les fenêtres Flex et HTML définissant automatiquement la propriété scaleMode de la scène sur noScale. Modifier la propriété scaleMode entrave le fonctionnement des mécanismes de mise en forme automatique utilisés dans ces types de fenêtres.

Utilisation du mode Plein écran

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Le mode plein écran permet de définir la scene d'un film de sorte à replir totally le moniteur sans cordure ou menu. La propriété displayState de la classe Stage permit d'activer ou désactiver ce mode pour un fichier SWF. La propriété displayState peut être régée sur l'une des valeurs définies par les constantes de la classe flash.display.StateDisplayState. Pour activer le mode plein écran, définissee la propriété displayState sur StageDisplayStateFULLSCREEN:

stage.displayState = StageDisplayStateFULLSCREEN; 

Pour activer le mode interactif plein écran (nouveauté dans Flash Player 11.3), définièsez la propriété displayState sur StageDisplayState.FULLSCREEN_INTERACTIVE:

stage.displayState = StageDisplayState.FULLSCREEN_INTERACTIVE; 

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'execute 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恢复正常; 

Un utiliseur 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).

Activation du mode plein écran dans Flash Player

Pour activer le mode plein écran d'un fjchier 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'util de programmation Flash,CHOISSEF Fichier Parametes de publication, puis dans la boite de dialogue Parametes de publication, cliquez sur I'onget HTML et selectionnee le modèle Flash seulement - Autorisation du Plein ecran.

Dans Flex, assurez-vous que le modèle HTML inclut les balises et qui prennant en charge le plein écran.

Si vous utilisez JavaScript dans une page Web pour générer les balises d'intégration de SWF, vous doivent modifier le code JavaScript pour ajouter la balise et l'attribut allowFullScreen param. Par exemple, si vous page HTML fait appel à la fonction AC_FL_RunContent() (utilisée par les pages HTML générées par Flash Professional et Flash Builder), vous doivent ajouter le paramètre allowFullScreen à cet appel de fonction, comme suit :

AC_FL)_RunContent( ... 'allowFullScreen', 'true', ... ); //end AC code 

Ce cas de figure ne s'applique pas aux fichiers SWF qui s'excutent dans la version autonome de Flash Player.

Remarque: si vous définissez le Mode fenêtre (wmode dans le code HTML) sur Opaque sans fenêtre (opaque) ou Transparent sans fenêtre (transparent), la fenêtre plein écran est toujours opaque.

Il existe également des restrictions liées à la sécurité lors de l'utilisation du mode plein écran avec Flash Player dans un navigateur. Ces restrictions sont décrites dans le chapitre « Sécurité » à la page 1085.

Activation du mode interactif plein écran dans Flash Player 11.3 et les versions ultérieures

Flash Player 11.3 et les versions ultérieures prennt en charge le mode interactif plein écran, qui permet une prise en charge totale de toutes les touches du clavier (à l'exception de la touche Echap, qui permet de quitter le mode interactif plein écran). Le mode interactif plein écran est utile pour les yeux (par exemple pour activer la fonction de dialogue en ligne dans un jeu multijoueurs ou les commandes du clavier WASD dans un jeu de tir subjectif.)

Pour activer le mode interactif plein écran d'un fisier 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 allowFullScreenInteractive et à la valeur true, comme suit :

...

Dans l'outil de création de Flash, cliquez sur Fichier -> Paramètres de publication, puis, dans l'onglet HTML de la boîte de dialogue Paramètres de publication, sélectionné le modèle Flash seulement - Autorisation du Plein écran interactif.

Dans Flash Builder et Flex, vérifie que les modèles HTML incluent les balises et qui prennant en charge le mode interactif plein écran.

Si vous utilisez JavaScript dans une page Web pour générer les balises d'intégration de SWF, vous devez modifier le code JavaScript pour ajouter la balise et l'attribut allowFullScreenInteractive param. Par exemple, si vous page HTML fait appel à la fonction AC_FL_/_RunContent() (utilisée par les pages HTML générées par Flash Professional et Flash Builder), vous devez ajouter le paramètre allowFullScreenInteractive à cet appel de fonction, comme suit :

AC_FL)_RunContent( ... 'allowFullScreenInteractive', 'true', ... ); //end AC code 

Ce cas de figure ne s'applique pas aux fichiers SWF qui s'excutent dans la version autonome de Flash Player.

Mise à l'échelle et taille de la scene en mode plein écran

Les propriétés Stage.fullScreenHeight et Stage.fullScreenWidth renvoie la hauteur et la largeur de l'écran utilisé lors de l'activation du mode plein écran, lorsque le passage à cet état est immédiat. Ces valeurs risquent d'être incorrectes si l'utilisateur déplace le navigate d'un écran à un autre après avoir récapuérez ces valeurs, mais avant de passer au mode plein écran. Si l'utilisateur recupère ces valeurs dans le gestionnaire d'évenement dans lequel il a défini la propriété Stage.displayState sur StageDisplayState.FULLSCREEN, celles-ci sont correctes. Pour les utilisateurs qui utilisent plusieurs écrans, le contenu du fichier SWF s'étend pour n'accuper qu'un seul écran. Flash Player et AIR utilisent une mesure pour identifier le moniteur contenant la portion la plus élevé du fichier SWF et activent le mode plein écran sur celui-ci. Les propriétés fullScreenHeight et fullScreenWidth ne reflètent que la taille du moniteur utilisé en mode plein écran. Pour plus d'informations, voir Stage.fullScreenHeight et Stage.fullScreenWidth dans le manuel Guide de référence ActionScript 3.0 pour la plate-forme Adobe Flash.

En mode plein écran, le comportement de mise à l'échelle de la scène est identique à celui du mode normal. Cette mise à l'échelle est contrôleé par la propriété scaleMode de la classe Stage. Si la propriété scaleMode est définie sur StageScaleMode.NO Scale, les propriétés stageWidth et stageHeight de la classe Stage sont modifiées pour répercuter la taille de la zone de l'écran occupée par le fjichier SWF (soit, dans ce cas, l'écran entier). Dans un navigateur, le paramètre HTML correspondant contrôle le réglage.

L'évenement fullScreen de la classe Stage permet de détecter et répondre à l'activation ou à la désaction du mode plein écran. Par exemple, il peut être nécessaire de repositionner, d'ajouter ou de supprimer des éléments lors d'un changement d'état du mode plein écran, comme illustré par cet exemple :

import flash.eventsFULLScreenEvent;   
function fullScreenRedraw(event:FULLScreenEvent):void { if (event.fullScreen) { // Remove input text fields. // Add a button that closes full-screen mode. } else { // Re-add input text fields. // Remove the button that closes full-screen mode. } } mySprite.stage.addEventListener(FullScreenEvent.FULLSCREEN, fullScreenRedraw); Comme l'indique ce code, l'objet associé à l'événement fullScreen est une occurrence de la classe flash.events.FullScreenEvent, dont la propriété fullScreen indique si le mode plein écran est activé (false). 

Prise en charge du clavier en mode plein écran

Lorsque Flash Player est exécuté dans un navigator, l'ensemble du code ActionScript lié au clavier (événements de clavier et saisie de texte dans des occurrences deTextField, entre autres), est désactivé en mode plein écran. Les exceptions (c'est-à-dire les touches qui restent actives) sont les suivantes :

  • Les touches hors impression sélectionnées, notamment les touches fléchées, la barre d'espacement et la touche de tabulation
  • Les raccourcis clavier qui désactiver le mode plein écran : touche Echap (Windows et Mac), Contrôle-W (Windows), Commande-W (Mac) et Alt-F4

Ces restrictions ne sont pas presents pour le contenu SWF s'executant dans l'application Flash Player autonome ou dans AIR. AIR prend en charge un mode plein écran interactif qui permet la saisie clavier.

Prise en charge de la souris en mode plein écran

Par défaut, les événements de souris fonctionnent de la même façon en mode plein écran que dans un autre mode d'affichage. Néanmoins, le mode plein écran permet également de définir la propriété Stage.mouseLock en vue de verrouiller la souris. Le verrouillage de la souris désactive le curseur et permet de déplacer la souris sans aucune limite.

Remarque : vous pouvez verrouiller la souris uniquement sur des applications de bureau en mode plein écran. Le verrouillage de la souris sur des applications dans un autre mode d'affichage ou sur des applications mobiles renvoie une exception.

Le verrouillage de la souris est automatiquement désactivé et le curseur de la souris est à nouveau visible lorsque :

  • l'utilisateur quitter le mode plein écran en appuyant sur la touche Echap (toutes les plates-formes), ou sur les touches Ctrl-W (Windows), Cmd-W (Mac) ou Alt-F4 (Windows);
  • la fenêtre de l'application perd le focus;
  • une interface de paramétrage est visible, notamment une boîte de dialogue de confidentialité ;
  • une boîte de dialogue native s'affiche, notamment une boîte de dialogue de téléchargement d'un fichier.

Les événements associés au mouvement de la souris, tels que l'évenement mouseMove, font appel à la classe MouseEvent pour représentier l'objet de l'évenement. Lorsque le verrouillage de la souris est désactivié, utilisez les propriétés MouseEvent.localX et MouseEvent.localY pour déterminer l'emplacement de la souris. Lorsque le verrouillage de la souris est activé, utilisez les propriétés MouseEvent.movementX et MouseEvent.movementY pour déterminer l'emplacement de la souris. Les propriétés movementX et movementY contiennent les changements de position de la souris depuis le dernier événement只不过 que les coordonnées absolues de l'emplacement de la souris.

Mise à l'échelle matérielle en mode plein écran

La propriété fullScreenSourceRect de la classe Stage permet d'utiliser Flash Player ou AIR pourmettre à l'échelle une zone déterminée de la scène en mode plein écran. Dans Flash Player et AIR, la mise à l'échelle matérielle, si elle est disponible, s'effectue à l'aide de la carte graphique et de la carte video de l'ordinateur, et permet généralement d'afficher le contenu plusrapidement que la mise à l'échelle logicielle.

Pour tirer parti de la mise à l'échelle matérielle, définitisser l'ensemble ou une partie de la scène sur le mode plein écran. Le code suivant ActionScript 3.0 définit l'ensemble de la scène en mode plein écran :

import flashgeom.*;
{ stage.fullScreenSourceRect = new Rectangle(0,0,320,240); stage.displayState = StageDisplayState.FULLSCREEN;
}

Lorsque cette propriété est définié sur un rectangle valide et la propriété displayState sur le mode plein écran, Flash Player et AIR redimensionnent la zone spécifique. La taille réelle de la scène en pixels dans ActionScript ne change pas. Flash Player et AIR imposent une taille limite au rectangle en fonction de la taille du message standard « Appuyez sur la touche Echap pour quitter le mode plein écran ». Cette limite est généralement d'environ 260 sur 30 pixels, mais peut varier en fonction de la plate-forme et de la version de Flash Player.

La propriété fullScreenSourceRect ne peut être définie que lorsque Flash Player ou AIR ne sont pas en mode plein écran. Pour utiliser correctement cette propriété, vous doivent tout d'abord la définitir, puis définitir la propriété displayState sur le mode plein écran.

Pour activer la mise à l'échelle, définisseez la propriété fullScreenSourceRect sur un objet rectangle.

stage.fullScreenSourceRect = new Rectangle(0, 0, 320, 240); 

Pour désactiver la mise à l'échelle, définisseez la propriété fullScreenSourceRect sur null.

stage.fullScreenSourceRect = null; 

Pour tirer parti de toutes les fonctions d'accelération matérielle avec Flash Player, activez cette fonction dans la boîte de dialogue des paramètres de Flash Player. Pour afficher cette boîte de dialogue, cliquez avec le bouton droit de la souris (Windows) ou cliquez tout en appuyant sur la touche Ctrl (Mac) dans le contenu Flash Player dans votre navigateur. Cliquez sur le premier onglet, Affichage, puis cochez la case Activer l'accelération matérielle.

Modes Fenêtre direct et composition GPU

Flash Player 10 propose deux modes de fenêtre, direct et composition GPU, que vous pouze activer dans les paramétres de publication de l'outil de programmation Flash. Ces modes ne sont pas pris en charge par AIR. Pour tirer parti de ces modes, vous doivent activer l'accelération matérielle pour Flash Player.

Le mode direct utilise le chemin le plus rapide et le plus direct pour placer des graphismes sur l'écran, ce qui est pratique pour la lecture video.

La composition GPU utilise l'unité de traitement graphique sur la carte video pour accélérer la composition. La composition video constitue à créé des images multi-couches pour aboutir à une seule image video. Lorsque la composition est accélérée par la GPU, les performances de la conversion YUV, la correction des couleurs, la rotation, le redimensionnement et le fondu sont nettement améliorés. La conversion YUV se refère à la conversion des couleurs de signaux analogiques composites, qui sont utilisées pour la transmission, au mode de couleurs RVB (rouge-vertebu) que les cameras video et les écrons utilisent. Le recours à la GPU pour accélérer la composition réduit la demande en mémoire et en puissance de calcul qui affectera les performances de l'unité centrale. Il en résultat une lecture video plus régulière en définition standard.

Soyez vigilant lorsque vous implémentez ces modes Fenêtre. Fenêtre L'utilisation de la composition GPU peut s'avérer couteuse en mémoire et en ressources de l'unité centrale. Si certaines opérations ( comme les modes fondu, le filtrage, l'échéage ou le masquage) ne peuvent pas été exécutées dans la GPU, c'est le logiciel qui s'en charge. Adobe vous recommende de vous limiter à un fjichier SWF par page HTML lorsque vous utilisez ces modes. Il ne faudrait pas les utiliser pour des bandeaux. La Flash Test Movie facility ne fait pas appel à l'accélération matérielle mais vous pouvez l'utiliser par le biais de l'options Aperçu avant publication.

Il est inutil de fixer une cadence supérieure à 60 (c'est la fréquence de régénération d'écran maximal) dans votre fichier SWF. Une cadence entre 50 et 55 débouche sur des images perdues, ce qui peut se produit de temps à autre pour des raisons diverses.

Le mode direct requiert Microsoft DirectX 9 avec une mémoire virtuelle RAM de 128 Mo sous Windows et OpenGL pour Apple Macintosh, Mac OS X version 10.2 ou ultérieure. La composition GPU requiert Microsoft DirectX 9 et la prise en charge de Pixel Shader 2.0 sous Windows avec une mémoire virtuelle RAM de 128 Mo. Sous Mac OS X et Linux, la composition GPU requiert OpenGL 1.5 et plusieurs extensions d'OpenGL (objet framing buffer, objets multitexture etShader, langage d'ombrage,Shader de fragments).

Vou puez activer les modes d'acceleration direct et gpu pour chaque SWF par le biais de la boite de dialogue Parametes de publication de Flash, à l'aide du menu d'acceleration matérielle sur l'onglet Flash. Si vous désissiez Aucun, le mode Fenetre revient à défaut, transparent ou opaque, selon le paramètre du Mode Fenetre de l'onglet HTML.

Manipulation des événements associés aux objets d'affichage

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La classe DisplayObject herite de la classe EventDispatcher. Cela signifie que chaque objet d'affichage peut etre pleinement implique dans le modele d'evénement (décrit dans le chapitre « Gestion des événements » à la page 129). Chaque objet d'affichage peut utiliser sa méthode addEventListener() (héritée de la classe EventDispatcher) pour attendre un événement particulier, mais ceci uniquement si l'objet écouteur fait partie du flux d'evénement de l'évenement considéré.

Lorsque Flash Player ou AIR distribue un objet événement, celui-ci effectue un aller-retour à partir de la scène via l'objet d'affichage où s'est produit l'événement. Par exemple, si un utilisateur clique sur un objet d'affichage appelé child1, Flash Player distribue un objet événement à partir de la scène via la hierarchie de la liste d'affichage jusqu'à l'objet d'affichage child1.

D'un point de vue conceptuel, le flux d'évenement est divisé en trois phases, comme illustré par le diagramme suivant :

ADOBE ACTIONSCRIPT 3.0 - Manipulation des événements associés aux objets d'affichage - 1

Pour plus d'informations, voir « Gestion des événements » à la page 129.

Lors de la gestion des événements liés aux objets d'affichage, il est important de ne pas oublier l'effet potentiel des objets écouteurs d' événement sur l'eventuelle suppression automatique des objets d'affichage de la mémoire (garbage collection) lorsqu'ils sont supprimés de la liste d'affichage. Si des objets d'un objet d'affichage sont enregistrrés en tant qu'écouteurs d' événement, ce dernier n'est pas supprimé de la mémoire même s'il est supprimé de la liste d'affichage, car il continue à posseder des références à ces objets écouteur. Pour plus d'informations, voir « Gestion des écouteurs d' événement » à la page 143.

Selection d'une sous-classe de DisplayObject

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Plusieurs options étant disponibles, l'une des décisions importantes à prendre lors de l'utilisation d'objets d'affichage est lechioix de l'objet à utiliser dans un but précis. Les directives suivantes vous aidont àCHOISIR L'option appropriée. Ces suggestions sont valides que vous createz une occurrence de classe ou que vous choisisiez une classe de base pour une classe en cours de creation :

  • Si vous n'avez pas besoin d'un objet pouvant contérer d'autres objets d'affichage (autrement dit, si vous avez simplement besoin d'un objet à utiliser comme élément isolé), désissez l'une des sous-classes suivantes de DisplayObject ou d'InteractiveObject, selon l'utilisation prévue :

  • Bitmap, pour afficher une image bitmap.
    -TextField, pour ajouter du texte.
    Video, pour afficher une video.

  • Shape, pour disposer d'une « toile » destinée au tracé d'un contenu à l'écran. En particulier si vous souhaitez créé une occurrence pour dessiner des formes à l'écran et qu'elle ne contient pas d'autres objets d'affichage, vous obtiendrez des performances nettement supérieures en utilisant Shape plutôt que Sprite ou MovieClip.
  • MorphShape, StaticText ou SimpleButton pour des éléments créés par l'outil de programmation Flash. Il est impossible de créé par programmation des occurrences de ces classes, mais vous pouvez créé des variables avec ces types de données pour pointer sur des éléments créés dans l'outil de programmation Flash.
  • Si vous doivent disposer d'une variable qui se refère à la scène principale, utilisez la classe Stage en tant que type de données.
  • Si vous doivent disposer d'un contèur pour charger un fisier SWF ou fisier image externe, utilisez une occurrence de Loader. Le contenu charge sera ajouté à la liste d'affichage en tant qu'enfant de l'occurrence de Loader. Son type de données variera selon la nature du contenu charge, comme suit :

  • Une image chargee est une occurrence de Bitmap.

  • Un fichier SWF charge écrit dans ActionScript 3.0 est une occurrence de Sprite ou MovieClip (ou une occurrence d'une sous-classe de ces classes, comme indiqué par le creator du contenu).
  • Un fjichier SWF charge écrit dans ActionScript 1.0 ou ActionScript 2.0 est une occurrence d'AVM1Movie.

  • Si vous avez besoin d'un objet qui sera le conteneur d'autres objets d'affichage (que vous ayez ou non l'intention de dessiner en ActionScript dans cet objet),CHOISSEZ L'une des sous-classes de DisplayObjectContainer :

  • Sprite, si l'objet est créé en ActionScript uniquement ou en tant que classe de base d'un objet d'affichage personnelisé créé et manipulé en ActionScript uniquement.
    MovieClip, si you creez une variable pointant vers un symbole de clip creedans l'outil de programmation Flash.

  • Si vous creez une classe qui sera associée à un symbole de clip de la bibliothèque de Flash, désisissez l'une des sous-clASSES de DisplayObjectContainer comme classe de base de votre future classe :

  • MovieClip, si le symbole de clip associé possède un contenu sur plusieurs images.

  • Sprite, si le symbole de clip associé ne possède un contenu que sur la première image.

Manipulation des objets d'affichage

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Quel que soit l'objet d'affichage utilisé, tous les éléments affichés à l'écran partagent diverses techniques de manipulations. Par exemple, ils peuvent tous être positionnés à l'écran, avancer ou reculer dans l'ordre d'emplement des objets d'affichage, mis à l'échelle, pivotés, et ainsi de suite. Dans la mesure où tous les objets d'affichage hériment ces fonctionnalités de leur classe de base commune (DisplayObject), lesdites fonctionnalités ont le même comportement pour une occurrence d'un objet TextField, Video, Shape ou tout autre objet d'affichage. Les sections suivantes passent en revue plusieurs de ces manipulations appliquées à tous les objets d'affichage.

Modification de la position

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La manipulation la plus fondamentale de tout objet d'affichage consiste a le positionner a l'ecran. Pour définir la position d'un objet d'affichage, changez ses propriétés x et y.

myShape.x = 17;

myShape.y = 212;

Le système de positionnement d'un objet d'affichage assimile la scène à un système de coordonnées cartésiennes (système de grille standard doté d'un axe horizontal x et d'un axe vertical y). L'origine du système de coordonnées (coordonnée 0,0 correspondant à l'intersection des axes x et y) figure dans le coin supérieur gauche de la scène. A partir de l'origine, les valeurs x sont positives vers la droite et négatives vers la gauche, tandis que, contrairement aux systèmes de graphes standard, les valeurs y sont positives vers le bas et négatives vers le haut. Par exemple, les lignes précédentes de code déplacent l'objet myShape vers la coordonnée x 17 (17 pixels sur la droite de l'origine) et la coordonnée y 212 (212 pixels sous l'origine).

Par défaut, lorsqu'un objet d'affichage est créé dans ActionScript, les propriétés x et y sont toutes définies sur 0, plaçant ainsi l'objet dans le coin supérieur gauche de son contenu parent.

Modification de la position relativement à la scène

Il est important de se rappeler que les propriétés x et y se refèrent toujours à la position de l'objet d'affchage par rapport aux coordonnées 0,0 des axes de son objet d'affchage parent. Ainsi, pour une occurrence de Shape (par exemple un cercle) continue dans une occurrence de Sprite,mettre à zéro les propriétés x et y de l'objet Shape revient à placer le cercle dans le coin supérieur gauche de l'objet Sprite, qui n'est pasforcément le coin supérieur gauche de la scène. Pour positionner un objet par rapport aux coordonnées globales de la scène,utilisez la méthode globalToLocal()de tout objet d'affchage afin de convertir les coordonnées globales(scène) en coordonnées locales (conteneur de l'objet d'affchage), comme suit :

Voupez egelement utilise la methode localToGlobal() de la classe DisplayObject pour convertir les coordonnées locales en coordonnées de la scene.

Déplacement des objets d'affichage à l'aide de la souris

Voupez autoriser un utiliser à déplacer les objets d'affichage à l'aide de la souris par le biais de deux techniques distinctes dans ActionScript. Dans les deux cas, deux événements de souris sont utilisés : lorsque l'utilateur appuie sur le bouton de gauche (l'objet recoit alors l'instruction de suivre le curseur de la souris) et lorsqu'il le relâche (l'objet recoit alors l'instruction de cesser de suivre le curseur de la souris).

Remarque : Flash Player 11.3 et les versions ultérieures et AIR 3.3 et les versions ultérieures : vous pouze également utiliser l'évenement MouseEvent.RELEASE_OUTSIDE dans le cas d'un utilisateur qui relâche le bouton de la souris en dehors des limites du Sprite conteneur.

La première technique, basée sur la méthode startDrag(), est plus simple, mais plus limitée. Lorsque l'utilisateur appuie sur le bouton de la souris, la méthode startDrag() de l'objet d'affichage à faire glisser est appelée. Lorsque l'utilisateur relâche le bouton de la souris, la méthode stopDrag() est appelée. Puisque la classe Sprite définit ces deux fonctions, l'objet déplace doit être un Sprite ou l'une de ses sous-classes.

// This code creates a mouse drag interaction using the startDrag()
// technique.
// square is a MovieClip or Sprite instance). 
import flash.events.MouseEvent; 

Cette technique présente un désavantage relativement important : l'utilisation de startDrag() ne permet de faire glisser qu'un seul élément à la fois. Si un objet d'affichage est en cours de glissement et que la méthode startDrag() est appelée sur un autre objet d'affichage, le premier objet)cesse immédiatement de suivre la souris. Par exemple, si la fonction startDragging () est modifiée comme indiqué, seul l'objet circle est déplaced par glissement, bien que la méthode square.startDrag() ait été appelée :

function startDragging(event:事故发生):void { square.startDrag(); circle.startDrag(); } 

Puisqu'un seul objet à la fois peut être déplaced par glissement par le biais de startDrag(), la méthode stopDrag() peut être appelée sur n'importequel objet d'affichage et arrêté tout objet en cours de glissement.

Pour déplacer plusieurs objets d'affichage, ou pour éviter tout risque de conflit au cas où plusieurs objets seraient susceptibles d'utiliser startDrag(), il est préférible d'utiliser la technique de suivi de la souris pour créé l'effect de glisser-deposer. Avec cette technique, lorsque l'utiliseur appuie sur le bouton de la souris, une fonction est enregistrée en tant qu'écouteur de l'évenement mouseMove de la scène. Cette fonction, qui est alors appelée à chaque déplacement de la souris, entraîne le saut de lobjet déplace vers la coordonnée x, y de la souris. Une fois le bouton de la souris relaché, la fonction n'est plus enregistrée en tant qu'écouteur. Elle n'est donc plus appelée lorsque la souris est déplacee et lobjet cesse de suivre le curseur. Le code suivant illustré cette technique :

Outre le suivi du curseur par un objet d'affichage, il est souvent préférible de positionner l'objet déplaced à l'avant de l'affichage, créé ainsi une impression de flottement au-dessus de tous les autres objets. Supposons, par exemple, que deux objets, un cercle et un carré, puissant tous deux seront déplacés à l'aide de la souris. Si le cercle figure sous le carré sur la liste d'affichage et que vous cliquez et faites glisser le cercle pour placer le curseur au-dessus du carré, il semble glisser derrière le carré, brisant ainsi l'illusion du glisser déposer. Vous pouvez procéder de sorte que lorsque vous cliquez sur le cercle, il passse en première position dans la liste d'affichage et s'affiche ainsi par-dessus tout autre contenu.

Le code suivant (adapté de l'exemple précédent) permet de déplacer deux objets d'affichage, un cercle et un carré, à l'aide de la souris. Lorsque le bouton de la souris est pressé au-dessus de l'un d'eux, cet élément est amné en haut de la liste d'affichage de la scène, afin que l'élement déplace passé toujours devant les autres. (Tout nouveau code ou code modifié extrait du code précédent est imprimé en gras.)

// This code creates a drag-and-drop interaction using the mouse-following  
// technique.  
// circle and square are DisplayObjects (e.g. MovieClip or Sprite  
// instances). 

Pour creer un effet plus sophistique, par exemple pour un jeu ou des jetons ou des cartes passent d'une pile à l'autre, il est possible d'ajouter l'objet déplaced à la liste d'affichage de la scene lorsqu'il est « pris», puis de l'ajouter à une autre liste d'affichage (la « pile » sur laquelle il est déposé) lors du relâchement du bouton de souris.

Enfin, pour optimiser l'effet, vous pourriez appliquer un filtré Ombre portée à l'objet d'affichage lorsque vous cliquez dessus (en début de glissement) et supprimer l'objet portée lorsque vous relâchez l'objet. Pour plus d'informations sur le filtré Ombre portée et tout autre filtré appliqué aux objets d'affichage en ActionScript, voir « Filtrage des objets d'affichage » à la page 276.

Défilament horizontal ou vertical des objets d'affichage

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Si la taille d'un objet d'affichage est trop élevé pour la zone où vous souhaitez l'afficher, vous dispose de la propriété scrollRect pour définir la zone visible de l'objet d'affichage. Par ailleurs, en modifiant la propriété scrollRect en réponse à une action de l'utilisateur, vous pouvez entraîner un défilament vers la gauche ou la droite ou vers le haut ou le bas.

La propriété scrollRect est une occurrence de la classe Rectangle, qui combine les valeurs requises pour définir une zone rectangulaire en tant qu'objet unique. Pour définit initialement la zone visible de l'objet d'affichage, crééz une occurrence de Rectangle et affectez-la à la propriété scrollRect de l'objet. Par la suite, pour obtenir un défilament horizontal ou vertical, il suffit de dire la propriété scrollRect dans une variable Rectangle séparée et de changer la propriété voulue (par exemple, modifier la propriété x de l'occurrence de Rectangle pour un défilament horizontal, ou sa propriété y pour un défilament vertical). Vous réaffectez ensuite cette occurrence de Rectangle à la propriété scrollRect pour avertir l'objet d'affichage du changement de valeur.

Par exemple, le code suivant définit la zone visible d'un objet TextField nommé bigText dont la hauteur est trop importante pour les dimensions du filchier SWF. Lorsque l'utilisateur clique sur les deux boutons nommés up et down, les fonctions appelées entraînent le défilament vertical du contenu de l'objet TextField en modifiant la propriété y de l'occurrence de Rectangle scrollRect.

Comme le montre cet exemple, lorsque vous utilisez la propriété scrollRect d'un objet d'affichage, il est préferable de spécifique que Flash ou AIR doitmettre en cache le contenu de l'objet sous forme de bitmap, à l'aide de la propriété cacheAsBitmap. Ainsi, Flash Player et AIR n'ont pas à redressiner le contenu complet de l'objet d'affichage à chaque défilament de celui-ci, et peuvent utiliser le bitmap mis en cache pour afficher la portion concernée directement à l'écran. Pour plus d'informations, voir « Mise en cache des objets d'affichage » à la page 189.

Manipulation de la taille et de l'échelle des objets

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La taille d'un objet d'affichage peut être obtenue et modifiée de deux façon, en utilisant soit les propriétés de dimensions (width et height), soit les propriétés d'échelle (scaleX et scaleY).

Chaque objet d'affichage possède une propriété width et une propriété height, qui sont initialement définies sur la taille de l'objet en pixels. Vous pouvez lore les valeurs de ces propriétés pour mesurer la taille de l'objet d'affichage. Vous pouvez également stipuler de nouvelles valeurs pour modifier la taille de l'objet, comme suit :

// Resize a display object.

square.width = 420;

square.height = 420;

// Determine the radius of a circle display object.

var radius:Number = circle.width/2;

Modifier les propriétés height ou width d'un objet d'affichage modifie l'échelle de ce dernier. En d'autres termes, son contenu est étiré ou comprime en fonction de la taille de la nouvelle zone. Si lobjet d'affichage ne contient que des formes vectorielles, elles sont redessinées à la nouvelle échelle, sans perte de qualité. Tout élément graphique bitmap de lobjet d'affichage est mis à l'échelle au lieu d'être redessiné. Ainsi, une photo numérique dont la largeur et la hauteur augmentent de sorte à dépasser les dimensions réelles des informations relatives aux pixels de l'image est pixellisée, ce qui lui donne un aspect irrégulier.

Lorsque you modifiez les propriétés width ou height d'un objet d'affichage, Flash Player et AIR mettent également à jour les propriétés scaleX ou scaleY de l'objet.

Remarque: les objetsTextField ne respectent pas ce comportement de mise à l'échelle. Les champs de texte doivent se redimensionner automatiquement pour gérer le retour à la ligne automatique et les tailles de police. Leurs valeurs scaleX et scaleY sont donc réinitialisées à 1 au terme du redimensionnement. Toutefois, si vous ajustez la valeur scaleX ou scaleY d'unobjetTextField, les valeurs de largeur et de hauteur sont modifiées en fonction des valeurs de mise à l'échelle que vous indiquez.

Ces propriétés représentent la taille relative de l'objet d'affichage par rapport à sa taille d'origine. Les propriétés scalex et scaley utilisent des valeurs exprimées sous forme de fractions (décimales) pour représentier le pourcentage. Par exemple, si la propriété width d'un objet d'affichage a été réduite à la moitié de sa largeur originale, la propriété scalex de cet objet prendra la valeur 0, 5, soit 50% . Si sa hauteur a double, sa propriété scaley prendra la valeur 2, soit 200% .

Les changements de taille ne sont pas proportionnels. En d'autres termes, si vous modifie la hauteur d'un carré, mais non sa largeur, ses proportions ne sont plus identiques et il devient un rectangle au lieu d'un carré. Si vous souhaitez modifier relativement la taille d'un objet d'affichage, vous pouvez définir les valeurs des propriétés scaleX et scaleY pour redimensionner l'objet, plutôt que définir les propriétés width ou height. Par exemple, ce code modifie la propriété width de l'objet d'affichage appelé square, puis modifie l'échelle verticale (scaleY) en fonction de l'échelle horizontal, afin que la taille du carré demeure proportionnelle.

// Change the width directly.

square.width = 150;

// Change the vertical scale to match the horizontal scale,

Contrôle de la distorsion lors de la mise à l'échelle

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

En règle générale, lorsqu'un objet d'affichage est mis à l'échelle (s'il est étiré horizontally, par exemple), la distorsion réalisante est répartie équitablement dans l'objet, de sorte que chaque partie soit soumise à unétirementidentique. Pour les graphiques et éléments de conception, cette technique correspond probablement au résultatat escompté. Toutefois, il est parfois préféable de garder le contrôle sur les parties de l'objet qui seront étiées et celles qui ne le seront pas. Un exemple courant est celui d'un bouton représenté par un rectangle aux angles arrondis. Lors d'une mise à l'échelle normale, les angles du bouton sontétirés,entrainant ainsi la modification de leur rayon lorsque le bouton est redimensionné.

ADOBE ACTIONSCRIPT 3.0 - Contrôle de la distorsion lors de la mise à l'échelle - 1

Mais dans ce cas précis, il serait préférible de contrôler la mise à l'échelle, c'est-à-dire de pouvoir désigner certaines zones qui seront mises à l'échelle (les côtés) et celles qui ne le seront pas (les angles), afin que le changement d'échelle ne provoque pas de distorsion visible.

ADOBE ACTIONSCRIPT 3.0 - Contrôle de la distorsion lors de la mise à l'échelle - 2

Vous disposez de la mise à l'échelle à 9 découpes (Echelle-9) pour creer des objets d'affichage dont vous contrôle le mode de mise à l'échelle. La mise à l'échelle à 9 découpes permet de diviser lobjet d'affichage en neuf rectangles distincts (grille de 3 sur 3). Ces rectangles ne sont pas obligatoirement de la même taille, car l'utilisateur désit l'emplacement des lignes de séparation. Tout contenu place dans les quatre rectangles de coin (tehs que les angles arrondis d'un bouton) n'est ni étiré, ni comprime lors de la mise à l'échelle de lobjet d'affichage. Les rectangles placés en haut au centre et en bas au centre sont mis à l'échelle horizontally, mais non verticalement, tandis que les rectangles centraux de gauche et de droite sont mis à l'échelle verticalement, mais non horizontalement. Le rectangle central est mis à l'échelle horizontally et verticalement.

ADOBE ACTIONSCRIPT 3.0 - Contrôle de la distorsion lors de la mise à l'échelle - 3

Ainsi, si vous créez un objet d'affichage et souhaitez qu'une partie du contenu ne subisse jamais de mise à l'échelle, il vous suffit de placer les lignes de séparation de la grille de mise à l'échelle à 9 découpes de telle sorte que ce contenu se trouve dans l'un des rectangles des angles.

En ActionScript, il suffit de définir une valeur pour la propriété scale9Grid d'un objet d'affichage pour activer la mise à l'échelle à 9 découvertes pour cet objet et définir la taille des rectangles de la grille. Vous utilisez une occurrence de la classe Rectangle en tant que valeur de la propriété scale9Grid, comme suit :

Les quatre paramètres du constructeur Rectangle sont la coordonnée x, la coordonnée y, la largeur et la hauteur. Dans cet exemple, l'angle supérieur gauche du rectangle est place au point x : 32, y : 27 sur l'objet d'affichage appelé myButton. Le rectangle mesure 71 pixels de large et 64 pixels de haut (son bord droit correspond à la coordonnée x 103 sur l'objet d'affichage et son bord inférieur à la coordonnée y 92 sur l'objet d'affichage).

ADOBE ACTIONSCRIPT 3.0 - Contrôle de la distorsion lors de la mise à l'échelle - 4

La zone figurant dans la région définie par l'occurrence de Rectangle représenté le rectangle central de la grille Echelle-9. Les autres rectangles sont calculés par Flash Player et AIR en prolongeant les côts de l'occurrence de Rectangle, comme indiqué :

ADOBE ACTIONSCRIPT 3.0 - Contrôle de la distorsion lors de la mise à l'échelle - 5

Dans ce cas de figure, lorsque la mise à l'échelle du bouton augmente ou diminue, les angles arrondis ne sont niétirés, ni comprimés, mais les autres zones sont ajustées en conséquence.

ADOBE ACTIONSCRIPT 3.0 - Contrôle de la distorsion lors de la mise à l'échelle - 6

A. myButton.width = 131; myButton.height = 106; B. myButton.width = 73; myButton.height = 69; C. myButton.width = 54; myButton.height = 141;

Mise en cache des objets d'affichage

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Que vous créiez une application ou des animations scriptées complexes, vous doivent considérer la performance et l'optimisation, à mesure que la taille de vos conceptions Flash augmente. Lorsque vous contenu demeure statique (par exemple une occurrence de Shape rectangularie), Flash et AIR ne l'optimisent pas. Par conséquent, lorsque vous modifiez la position du rectangle, Flash Player ou AIR reddessine la totalité de l'occurrence de Shape.

Vouse coupez metre en cache des objets d'affichage specifiques pour amelierer les performances de suaive fichier SWF. L'objet d'affichage est essentiellement une surface, c'est-à-dire une version bitmap des données vectorielles de l'occurrence, données non destinées à etre considerrablement modifiées tout au long de la vie de suaive fichier SWF. Ainsi, les occurrences pour lesquelles la mise en cache est activée ne sont pas continuellement redessinées pendant la lecture du fichier SWF, et le rendu de ce dernier est plus rapide.

Remarque : you pouze mettre a jour les données vectorielles au moment de la recreation de la surface. Ainsi, les données vectorielles mises en cache dans la surface ne doivent pas nécessairement etre les mêmes pour l'ensemble du fichier SWF.

Pour qu'un objet d'affichage mette en cache sa représentation sous forme de bitmap, il suffit d'activer sa propriété cacheAsBitmap (true). Flash Player ou AIR create un objet de surface pour l'occurrence, correspondant à une image bitmap mise en cache et non à des données vectorielles. Si vous modifiez les limites de l'objet d'affichage, la surface est recréée et non redimensionné. Les surfaces peuvent s'imbriquer dans d'autres surfaces. La surface copiera l'image bitmap sur sa surface parent. Pour plus d'informations, voir « Activation de la mise en cache sous forme de bitmap » à la page 192.

Les propriétés opaqueBackground et scrollRect de la classe DisplayObject sont liées à la mise en cache sous forme de bitmap par le biais de la propriété cacheAsBitmap. Bien que ces trois propriétés soient indépendantes l'une de l'autre, opaqueBackground et scrollRect ne sont utiles que lorsqu'un objet est mis en cache sous forme de bitmap. Les avantages des propriétés opaqueBackground et scrollRect en termes de performances ne sont visibles que si cacheAsBitmap est définie sur true. Pour plus d'informations sur le défilament du contenu des objets d'affichage, voir « Défilament horizontal ou vertical des objets d'affichage » à la page 185. Pour plus d'informations sur la définition d'un arrêtre-plan opaque, voir « Définition d'un arrêtre-plan opaque » à la page 192.

Pour plus d'informations sur le masquage du canal alpha, qui demande que vous définissiez la propriété cacheAsBitmap sur true, voir « Masquage des objets d'affichage » à la page 197.

Quand activer la mise en cache

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

L'activation de la mise en cache d'un objet d'affichage create une surface dont les avantages sont multiples, par exemple pour accélérer le rendu des animations vectorielles complexes. Lorsque vous souhaitez activer la mise en cache, plusieurs scenarios sont disponibles. Il pourrait sembler avantageux de tousjours activer la mise en cache pour améliorer les performances de votre fjichier SWF. Cependant, dans certains cas, cette opération n'a aucun effet bénéfique et risque même parfois de ralentir le fjichier. Cette section presente des cas où la mise en cache s'avere bénéfique, et d'autres où il est préféable d'utiliser les objets de façon normale.

Les performances générales des données mises en cache dépendent de la complexité des données vectorielles de vos occurrences, de la quantité de modifications et de la définition, ou non, de la propriété opaqueBackground. Si vous modifiez de petites zones, la différence entre l'utilisation d'une surface et celle de données vectorielles sera négligeable. Vous pouvez dans ce cas tester les deux scénarios avant de déployer votre application.

Quand utiliser la mise en cache sous forme de bitmap

Ce qui suit est une série de scénarios dans lesquels vous pouvez voir les bénéfices significatifs qui résultat de la mise en cache sous forme de bitmap.

  • Image complexe d'arrière-plan : application qui contient une image d'arrière-plan complexe de données vectorielles (peut-être une image à laquelle vous avez appliqué la commande deTRAÇAGE de bitmap ou illustration créé dans Adobe Illustrator®). Vous pouvez animer les caractères sur l'arrière-plan, ce qui ralentit l'animation parce que l'arrière-plan a besoin de continuellement regénérer les données vectorielles. Pour améliorer les performances, vous pouvez définir la propriété opaqueBackground de l'objet d'affichage d'arrière-plan sur true. L'arrière-plan est rendu en tant que bitmap et peut être redessinérapidement pour que l'animation soit lue beaucoup plus vite.
  • Champ de texte de défilament : application qui affiche une grande quantité de texte dans un champ de texte de défilament. Vous pouvez placer le champ de texte dans un objet d'affichage que vous définiquee comme déroulant à l'aide de bornes de déroulement (propriété scrollRect). Ceci permet un déroulement de pixels rapide pour l'occurrence indiquée. Quand un utilisateur déroule l'occurrence dobjet d'affichage, Flash Player ou AIR fait défiler les pixels déroulés vers le haut et générale la zone nouvellement exposée au lieu de régénérer tout le champ de texte.

  • Système de fenêtres : application importante un système complexe de chevauchement de fenêtres. Chaque fenêtre peut être ouverte ou fermée (par exemple, les fenêtres du navigateur Web). Si vous marquez chaque fenêtre en tant que surface (en définissant la propriété cacheAsBitmap sur true), chaque fenêtre est isolée et mise en cache. Les utilisateurs peuvent faire glisser les fenêtres de manière à ce qu'elles se chevauchent. Chaque fenêtre n'a pas besoin de régénérer le contenu vectoriel.

  • Masquage du canal alpha : si vous utilisez le masquage du canal alpha, vous devez définir la propriété cacheAsBitmap sur true. Pour plus d'informations, voir « Masquage des objets d'affichage » à la page 197.

Activer la mise en cache sous forme de bitmap dans tous ces scenarios améliore la réactivité et l'interactivité de l'application en optimisant les graphiques vectoriels.

Par ailleurs, lorsque vous appliquez un filtré à un objet d'affichage, cacheAsBitmap est automatiquement définie sur true, même si vous l'avez explicitement définie sur false. Si vous supprimez tous les filtres appliqués à l'objet d'affichage, la propriété cacheAsBitmap retrouvere la valeur précédemment définie.

Quand éviter d'utiliser la mise en cache sous forme de bitmap

L'utilisation à mauvais escient de cette fonction risque d'affector les performances du fichier SWF. Avant d'utiliser la mise en cache sous forme de bitmap, tenez compte des considérations suivantes :

  • N'abusez pas des surfaces (objets d'affichage avec mise en cache activée). Chaque surface utilise plus de mémoire qu'un objet d'affichage standard, ce qui signifie que vous ne doivent activer les surfaces que lorsqu'il est nécessaire d'améliorer les performances de rendu.
    Un bitmap caché utilise beaucoup plus de mémoire qu'un objet d'affichage standard. Par exemple, si la taille d'une occurrence de Sprite sur la scène correspond à 250 pixels sur 250 pixels, elle est susceptible d'utiliser en cache 250 Ko au lieu d'1 Ko pour une occurrence de Sprite standard (non en cache).
  • Evitez de zoomer dans les surfaces cachées. Si vous abusez de la mise en cache sous forme de bitmap, une grande quantité de mémoire sera occupée (voir la puce précédente), surtout si vous zoomez sur le contenu.
    Utilisez des surfaces essentiellement non statiques (sans animation) pour les occurrences d'objets d'affichage. Vous pouvez faire glisser ou déplacer l'occurrence, mais son contenu ne doit pas etre animé ni subir de nombreuses modifications (les animations ou les contenus qui changent sont plus fréquents lorsqu'une occurrence de MovieClip contient une animation ou une occurrencie de Video). Par exemple, si vous faites pivoter ou transformez une occurrence, la différence entre la surface et les données vectorielles rend le traitement difficile et affecte le fichier SWF.
  • Panacher des surfaces avec des données vectorielles accroit la charge de traitement de Flash Player et AIR (et qu'il ne deviennent d'ordinateur). Dans la mesure du possible, regroupez les surfaces, en particulier lorsque vous creez des applications à fenêtes.
  • Ne mettez pas en cache les objets dont les graphiques sont fréquement modifiés. A chaque fois que vous exécutez une mise à l'échelle, inclinaison ou rotation de l'objet d'affichage, modifiez l'alpha ou la transformation de couleur, déplacez des objets d'affichage infant ou tracez à l'aide de la propriété graphique, la mémoire cache des bitmaps est régénéraée. Si cette opération se produit à chaque image, le moteur d'exécution doit tracer l'objet dans une image bitmap, puis copier celle-ci sur la scène, d'ou une charge de travail accrue par rapport au simple tracé de l'objet non mis en cache sur la scène. L'impact sur les performances de la mise en cache par rapport à la fréquence de mise à jour varie selon la complexité et la taille de l'objet d'affichage et ne peut être déterminé qu'en testant le contenu concerné.

Activation de la mise en cache sous forme de bitmap

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Pour activer la mise en cache d'un objet d'affichage sous forme de bitmap, définièsez sa propriété cacheAsBitmap sur true :

mySprite.cacheAsBitmap = true;

Après avoir défini la propriété cacheAsBitmap sur true, vous remarquerez que l'objet d'affichage accroche automatiquement les pixels sur les coordonnées entières. Lorsque vous testez le fjchier SWF, vous devriez remarquer que le rendu d'une animation associée à une image vectorielle complexe est bien plus rapide.

Une surface (heap en cache) n'est pas créé même quand cacheAsBitmap est défini sur true s'il se produit l'un ou l'autre des événements suivants :

  • Le bitmap fait plus de 2 880 pixels en hauteur ou en largeur.
  • Il est impossible d'allouer de la mémoire pour l'image bitmap.

Matrices de transformation des images bitmap mises en cache

Adobe AIR 2.0 et les versions ultérieures (profil mobile)

Dans les applications AIR pour périphériques mobiles, vous devriez définir la propriété cacheAsBitmapMatrix à chaque fois que vous définissez la propriété cacheAsBitmap. Définir cette propriété permet d'appliquer un large évteil de transformations à l'objet d'affichage sans déclencher un nouveau rendu.

mySprite.cacheAsBitmap = true;
mySprite.cacheAsBitmapMatrix = new Matrix();

Lorsque vous définissez cette propriété, vous pouvez appliquer la transformation complémentaire suivant à l'objet d'affichage sansmettre à nouveau l'objet en cache :

  • Déplacement ou translation sans accrochage de pixel
    Rotation
  • Mise à l'échelle
  • Inclinaison
  • Modification de l'alphi (transparence comprise entre 0 et 100% )

Ces transformations sont appliquées directement à l'image bitmap mise en cache.

Définition d'un arrêté-plan opaque

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Vous pouvez définir un arrêtre-plan opaque pour un objet d'affichage. Par exemple, si l'arrêtre-plan de votre fichier SWF contient une illustration vectorielle complexe, vous pouvez définir la propriété opaqueBackground sur une couleur donnée (en général la même couleur que la scène). La couleur est stipulée sous forme de nombre (généralement une valeur hexadécimale). L'arrêtre-plan est alors considéré comme un bitmap, ce qui permet d'optimiser les performances.

Lorsque vous définissez cacheAsBitmap sur true et la propriété opaqueBackground sur une couleur donnée, la propriété opaqueBackground assures l'opacité du bitmap interne et un rendu plus rapide. Si vous ne définissez pas cacheAsBitmap sur true, la propriété opaqueBackground ajoute une forme carrée vectorielle opaque à l'arrête-plan de l'objet d'affichage. Elle ne cree pas automatiquement un bitmap.

L'exemple suivant décrit comment définir l'arrière-plan d'un objet d'affichage pour optimiser les performances :

myShape.cacheAsBitmap = true;

myShape.opaqueBackground = 0xFF0000

Dans ce cas, la couleur d'arrière-plan de l'objet Shape appelé myShape est définie sur rouge (0xFF0000). Si l'on suppose que l'occurrence de Shape contient un triangle vert, sur une scène dotée d'un fond blanc le résultat sera un triangle vert sur le fond rouge défini par le cadre de selection de l'occurrence de Shape (le rectangle qui entoure entièrement Shape).

ADOBE ACTIONSCRIPT 3.0 - Définition d'un arrêté-plan opaque - 1

Ce code serait bien entendu plus logique s'il était utilisé avec une scene dotée d'un arrêtre-plan rouge uni. Si l'arrêtre-plan était d'une autre couleur, celle-ci replacérerait le rouge. Par exemple, dans un fichier SWF doté d'un arrêtre-plan blanc, la propriété opaqueBackground serait probablement définie sur 0xFFFFFFF, soit un blanc pur.

Application de modes de fondu

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Les modes de fondu supposent d'associer les couleurs d'une image (l'image de base) à celles d'une autre image (l'image mélangée) afin de produit une troisième image, qui est celle qui sera en fait affichée à l'écran. Chaque valeur de pixels d'une image est traitée avec la valeur de pixels correspondante de l'autre image afin d'obtenir un résultat représentant une valeur de pixels de position identique.

Tous les objets d'affichage possèdent une propriété blendMode qui peut être définie sur l'un des modes de fondu ci-dessous. Les valeurs ci-dessous sont des constantes définies dans la classe BlendMode. Vous pouvez également utiliser les valeurs String (entre parentheses) correspondant aux valeurs réelles des constantes.

  • BlendMode. ADD ("add"): s'utilise couramment pour creer un effet de dissolution animée entre deux images en éclaircissant progressivement leurs couleurs.
  • BlendMode. ALPHA ("alpha"): féquèment utilisé pour appliquer la transparence de l'avant-plan à l'arrête-plan. (Pas de prise en charge en cas de rendu par processeur graphique.)
  • BlendMode.DARKEN ("darken"): s'utilise couramment pour superposer un type. (Pas de prise en charge en cas de rendu par processeur graphique.)
  • BlendMode.DiffERENCE("difference"): s'utilise couramment pour creer des couleurs plus vives.
  • BlendMode_ERASE("erase"): s'utilise couramment pour découverter (effacer) une partie de l'arrière-plan à l'aide de l'alphad'avant-plan. (Pas de prise en charge en cas de rendu par processeur graphique.)
  • BlendMode.HARDLIGHT ("hardlight"): s'utilise couramment pour creer des effets d'ombrage. (Pas de prise en charge en cas de rendu par processeur graphique.)
  • BlendMode.INVERT("invert"): permet d'inverser l'arrière-plan.
  • BlendMode.LAYER("layer"): permet d'imposer la creation d'un tampon provisoire en vue de la précomposition d'un objet d'affichage spécifique. (Pas de prise en charge en cas de rendu par processeur graphique.)
  • BlendMode.LIGHTEN ("lighten"): s'utilise couramment pour superposer un type. (Pas de prise en charge en cas de rendu par processeur graphique.)
  • BlendMode.MULTIPLY ("multiply"): s'utilise couragement pour creer des ombres et des effets de profondeur.

  • BlendMode.NORMAL ("normal"): permet aux valeurs des pixels de l'image mélangée de supplanter celles de l'image de base.

  • BlendMode.overLAY("overlay"): s'utilise couramment pour creer des effets d'ombrage. (Pas de prise en charge en cas de rendu par processeur graphique.)
  • BlendMode.SCREEN("screen"): s'utilise couramment pour creer des mises en surbrillance et des halos.
  • BlendMode.SHADER ("shade"): permet d'indiquer l'utilisation d'un shade de Pixel Bender pour creer un effet de mélange personnelisé. Pour plus d'informations sur l'utilisation des shaders, voir « Utilisation des shaders de Pixel Bender » à la page 310. (Pas de prise en charge en cas de rendu par processeur graphique.)
  • BlendMode.SUBTRACT("subtract"): s'utilise couramment pour creer un effet de dissolution animée entre deux images en assombrissant progressivement leurs couleurs.

Réglage des couleurs DisplayObject

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Vous pouvez utiliser les méthodes de la classe ColorTransform (flashGeom.ColorTransform) pour régler la couleur d'un objet d'affichage. Chaque objet d'affichage possède une propriété transform, qui est une occurrence de la classe Transform et contient des informations relatives aux diverses transformations appliquées à l'objet d'affichage (rotation, changements d'échelle ou de position, etc.). Outre ces informations sur les transformations géométriques, la classe Transform comprend également une propriété colorTransform, qui est une occurrence de la classe ColorTransform et permet de régler les couleurs de l'objet d'affichage Pour acceder aux informations de transformation d'un objet d'affichage, utilisez le code suivant :

var colorInfo:ColorTransform = myDisplayObject.transform.colorTransform;

Après avoir créé une occurrence de ColorTransform, vous pouvez dire les valeurs de ses propriétés pour connaître les transformations de couleur qui lui ont déjà été appliquées, et vous pouvez modifier ces valeurs pour changer les couleurs de l'objet. Pourmettre à jour l'objet d'affichage après toute modification, vous devez réaffecteter l'occurrence de ColorTransform à la propriété transform.colorTransform.

var colorInfo:ColorTransform = myDisplayObject.transform.colorTransform;

Définition des valeurs de couleur à l'aide du code

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La propriété color de la classe ColorTransform permet d'affector une valeur de couleur rouge, vert, bleu (RVB) déterminée à l'objet d'affichage. L'exemple suivant utilise la propriété color pour changer en bleu la couleur de l'objet d'affichage square lorsque l'utilisateur clique sur le bouton blueBtn :

Notez que si vous changez la couleur d'un objet d'affichage à l'aide de la propriété color, c'est la couleur de l'objet entier qui est modifiée, même s'il compteit plusieurs couleurs à l'origine. Par exemple, si un objet d'affichage contient un cercle vert en arrêté-plan d'un texte noir, le choix du rouge pour la propriété color de l'occurrence de ColorTransform associée à cet objet transformera intégralement l'objet en rouge, cercle et texte compris (le texte ne sera donc plus lisible sur le fond de la même couleur).

Modification des effets de couleur et de luminosité à l'aide du code

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Supposons qu'un objet d'affichage comporte plusieurs couleurs (par exemple une photo numérique) et que vous n'ayez pas l'intention de modifier la couleur de l'ensemble de l'objet, mais uniquement celle d'un de ses éléments sur la base des couleurs existantes. Dans ce scenario, la classe ColorTransform comprend une série de propriétés de multiplication et de dominante permettant d'effectuer ce type de réglage. Les propriétés de multiplication, appelées redMultiplier, greenMultiplier, blueMultiplier et alphaMultiplier, fonctionnent comme des filtres photographiques de couleur (ou des lunettes à verres de couleur) et amplient ou diminuent certaines couleurs de l'objet d'affichage. Les propriétés de dominatee (redOffset, greenOffset, blueOffset et alphaOffset) permettent d'ajouter à l'objet une quantité supplémentaire d'une certaine couleur, ou d'indiquer la valeur minimale que peut avoir une couleur particulière.

Ces propriétés de multiplication et de dominante sont identiques aux réglages de couleurs avancés relatifs aux symboles de clips dans l'outil de programmation Flash lorsque vous sélectionnez Paramètres avancés dans le menu déroulant Couleur de l'Inspecteur des propriétés.

Le code suivant charge une image JPEG et lui applique une transformation de couleur, qui ajuste les canaux rouge et vert lorsque le pointeur de la classe se déplace le long des axes x et y. Dans ce cas précis, comme aucune valeur de dominante n'est spécifiée, les valeurs de chaque canal colorimétrique seront un pourcentage de la valeur de couleur originale de l'image, c'est-à-dire que la valeur maximaile de rouge ou de vert d'un pixel donné sera la quantité originale de vert ou de rouge de ce pixel.

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La propriété rotation permet de faire pivoter les objets d'affichage. Vous pouze dire cette valeur pour savoir si un objet a eté soumis à une rotation. Vous pouze également la définir sur un nombre (exprime en degrés) représentant le montant de rotation à appliquer à l'objet. Par exemple, cette ligne de code fait pivoter l'objet square de 45 degrés (un huitité de tour complet):

squarerotation = 45

Voupez ealement faire pivoter un objet d'affichage par le biais d'une matrice de transformation, decrite dans « Utilisation de la geometrie » à la page 218.

Application d'effets de fondu à des objets

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Vous pouvez contrôler la transparence d'un objet d'affichage de sorte à le rendre partiellement (ou totalement) transparent, ou modifier la transparence pour creer une impression d' apparition ou de disparition en fondu de l'objet. La propriété alpha de la classe DisplayObject définit la transparence (ou plus précisé l'opacité) d'un objet d'affichage. La propriété alpha peut être définie sur n'importe qu'elle valeur comprende entre 0 et 1, sachant que 0 correspond à une transparence totale et 1 à une opacité totale. Par exemple, le code suivant rend l'objet myBall transparent à 50% lors d'un clic de souris :

function fadeBall(event:事故发生):void { myBall.alpha = .5; } myBall.addEventListener(MouseEvent.CLICK, fadeBall); 

Voupez egelement modifier la transparence d'un objet d'affichage en utilisant les reglages de couleur proposés par la classe ColorTransform. Pour plus d'informations, voir « Reglage des couleurs DisplayObject » à la page 194.

Masquage des objets d'affichage

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Vou puez utilise un objet d'affichage comme masque pour creer un « trou » laissant apparaitre le contenu d'un autre objet.

Définition d'un masque

Pour indiquer qu'un objet d'affichage sera le masque d'un autre objet d'affichage, définișez l'objet masque comme proprițé m sk de l'objet à masquer :

// Make the object maskSprite be a mask for the object mySprite.

L'objet d'affichage masqué est révélé sous toutes les zones opaques (non transparentes) de l'objet d'affichage servant de masque. Par exemple, le code suivant create une occurrence de Shape qui contient un carré rouge de 100 pixels sur 100 et une occurrence de Sprite contenant un cercle bleu d'un rayon de 25 pixels. Lorsque l'utilisateur clique sur le cercle, il devient le masque du carré, de sorte que l'une partie du carré affichée est la section couverte par la partie pleine du cercle. En d'autres termes, seul un cercle rouge est visible.

L'objet d'affichage qui sert de masque peut être glissé, animé, redimensionné dynamiquement et peut utiliser plusieurs formes au sein d'un masque unique. Il n'est pas nécessaire que l'objet qui fait office de masque soit ajouté à la liste d'affichage. Toutefois, pour que l'objet servant de masque soit mis à l'échelle lors de la mise à l'échelle de la scène ou pour activer l'interaction utilisateur avec le masque (opération de type glisser et redimensionner contrôlée par l'utilisateur, par exemple), vous doivent l'avoir à la liste d'affichage. L'indice de profondeur (z-index, pour l'ordre de superposition) des objets d'affichage n'a pas d'importance, dés lors que l'objet masque est ajouté à la liste d'affichage (l'objet servant de masque ne s'affiche pas à l'écran, sauf en tant que masque). Si l'objet servant de masque est une occurrence de MovieClip dotée de plusieurs images, il lit toutes les images de son scenario, comme il le ferait s'il ne faisait pas office de masque. Pour supprimer un masque, définiSEE la propriété mask sur null :

// remove the mask from mySprite mySprite-mask = null;

Il est impossible d'utiliser un masque pour en masquer un autre. Il est impossible de définir la propriété _alpha d'un objet d'affichage servant de masque. Seuls les replissages sont utilisés dans un objet d'affichage employé comme masque ; les traits sont ignorés.

AIR 2

Si un objet d'affichage masqué est mis en cache en définissant les propriétés cacheAsBitmap et cacheAsBitmapMatrix, le masque doit correspondre à un infant de l'objet d'affichage masqué. De même, si l'objet d'affichage masqué est un descendant d'un conteneur d'objet d'affichage mis en cache, le masque et l'objet d'affichage doivent tous deux être des descendants du conteneur. Si l'objet masqué est un descendant de plusieurs conteneurs d'objet d'affichage mis en cache, le masque doit être un descendant du conteneur mis en cache le plus proche de l'objet masqué dans la liste d'affichage.

A propos du masquage des polices de périphérique

Vou puez utilise un objet d'affichage pour masquer le texte defini dans une police de péripérisque. Dans ce cas, le cadre de sélection rectangulaire du masque est utilisé comme forme de masquage. Ainsi, si vous créez un masque objet d'affichage non rectangulaire pour un texte de police de péripérisque, le masque qui apparait dans le fjchier SWF prend la forme du cadre de sélection rectangulaire du masque, et non celle du masque en tant que tel.

Masquageducanalalpha

Le masquage du canal alpha est pris en charge si le masque et les objets d'affichage masqués utilisent la mise en cache sous forme de bitmap, comme illustré ci-après :

Une application du masquage du canal alpha consiste par exemple à appliquer un filtré à l'objet masque indépendamment d'un filtré appliqué à l'objet d'affichage masqué.

Dans l'exemple suivant, un fjichier d'image exter est chargé sur la scene. Cette image (ou, plus précisément, l'occurrence de Loader dans laquelle elle est chargée) correspondra à l'objet d'affichage masqué. Un ovale dégradé (centre noir uni dont les bords deviennent progressivement transparents) est dessiné sur l'image. Il s'agit-là du masque alpha. La mise en cache sous forme de bitmap est activée pour les deux objets d'affichage. L'ovale est définir en tant que masque de l'image, puis peut être déplaced.

Animation des objets

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

L'animation consiste à faire bouger un élément ou à le faire progressivement évoluer. Les animations par script représentent un élément fondamental des produits, et elles sont aussi fréquement utilisées pour obtenir un résultat plus séduisant et ajouter des interactions à d'autres applications.

Une animation par script est règie par un principe de base : il doit se produit une évolution et cette dernière doit être divisée en incrémentes, au fil du temps. Il est facile de repeter une opération en ActionScript, à l'aide d'une simple boucle. Toutefois, une boucle exécute toutes ses iterations avant demettre à jour l'affichage. Pour créé une animation par script, vous doivent écrire un code ActionScript qui exécute plusieurs fois une action au fil du temps et met également à jour l'écran à chaque execution.

Supposons par exemple que vous souhaitez créé une animation simple, celle qu'une balle qui traverse l'écran. ActionScript comprend un mécanisme simple qui permet de suivre le passage du temps et demettre à jour l'écran en conséquence. En d'autres termes, vous pourriez écrire un code qui déplace la balle d'un petit incrément à chaque fois jusqu'à ce qu'elle atteigne sa destination. ÀpRES chaque déplacement, l'écran serait mis à jour, afin que l'utilisateur puisse visualiser le mouvement à l'écran.

D'un point de vue pratique, il est logique de synchroniser l'animation par script avec la cadence du fjichier SWF (en d'autres termes, de modifier une animation à chaque fois qu'une nouvelle image s'affiche ou devrait s'afficher), puisque cela permet de définir la fréquence des mises à jour de l'écran par Flash Player ou AIR. Chaque objet d'affichage possède un événement enterFrame qui est diffusé en fonction de la cadence d'affichage du fjichier SWF (un événement par image). La plupart des développpeurs qui créé une animation par script utilisent l'évenement enterFrame pour générer des actions répetées au fil du temps. Vous pourriez écrire du code qui écoute l'évenement enterFrame, déplace la balle animée d'un incrément déterminé à chaque image et, lorsque l'écran est mis à jour (à chaque image), la balle est redessinée à sa nouvelle position, créé ainsi un mouvement.

Remarque: une autre technique pour exécuter une action de manière répetitive dans le temps consiste à utiliser la classe Timer. Une occurrence de Timer déclenchée une notification d'évenement après un-delai horsaire donné. Il est donc possible d'écrite du code effectuant une animation sur la base de l'évenement timer de la classe Timer, en définissant un intervalle très court (une fraction de seconde). Pour plus d'informations sur l'utilisation de la classe Timer, voir « Contrôle des intervalles temporels » à la page 4.

Dans l'exemple suivant, une occurrence circulaire de Sprite, appelée circle, est créé sur la scène. Lorsque l'utilisateur clique sur le cercle, une série animée par script débute et entraine un fondu de circle (sa propriété alpha diminue) jusqu'à ce qu'il soit complètement transparent :

import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
// draw a circle and add it to the display list
var circle:Sprite = new Sprite();
circle.graphics.beginFill(0x990000);
circle.graphics.drawCircle(50, 50, 50);
circle.graphics.endFill();
addChild(circle);
// When this animation starts, this function is called every frame.
// The change made by this function (updated to the screen every
// frame) is what causes the animation to occur.
function fadeCircle(event:Event):void
{ circle.alpha = .05 if (circle.alpha < = 0 { circle.removeEventListener(Event.ENTER_FRAME, fadeCircle); }
}
function startAnimation(event: MouseEvent):void { circle.addEventListener(Event.ENTER_FRAME, fadeCircle);
}
circle.addEventListener(MouseEvent.CLICK, startAnimation);

Lorsque l'utilisateur clique sur le cercle, la fonction fadeCircle() est enregistrée en tant qu'écouteur de l'évenement enterFrame. En d'autres termes, elle commence à être appelée une fois par image. Cette fonction provoque un fondu de l'objet circle en changeant sa propriété alpha, si bien qu'à chaque nouvelle image la valeur de la propriété alpha du cercle décroit de 0,05 (soit 5% ) et l'écran est actualisé. Au fil du temps, lorsque la valeur alpha correspond à 0 (auquel cas circle est complètement transparent), la fonction fadeCircle() est supprimée des écouteurs d'évenement et l'animation s'arrête.

Le même code permet, par exemple, de creer un mouvement animé au lieu d'un fondu. En substituant une autre propriété à alpha dans la fonction qui écoute l'évenement enterFrame, cette propriété est animée. Par exemple, remplaçer la ligne

circle.alpha = .05

par la ligne

circle.x += 5; 

animelopropietéx.Lecercelsedéplacealorsversla droitede la scène.Laconditionquiarreled'animationpeutetre modifiée desorteàarrerler'animation(end'autrestermes,annulerlenregistrementdelécouteurenterFrame) lorsque lacoordonnéex appropriéeestatteinte.

Orientation de la scène

AIR 2.0 et les versions ultérieures

Les péripériques mobiles réorientent généralement l'interface utilisateur de sorte à assurer un affichage à la verticale lorsque l'utilitaire fait pivoter le péripérisque. Si vous activez l'orientation automatique dans votre application, le péripérisque conserve l'orientation adequate de l'écran, mais il vous incombe de vérifier que le contenu s'affiche correctement lorsque le format de la scène change. Si vous désactivez l'orientation automatique, l'écran du péripérisque reste fixe, à moins que vous ne modifiez l'orientation manuellement.

Les applications AIR s'excutent sur divers systèmes d'exploitation et périhériques mobiles. Le comportement d'orientation sous-jacent risque de varier selon le système d'exploitation, voire selon le périhérique sur un même système d'exploitation. Une stratégie de création simple adaptée à tous les périhériques et systèmes d'exploitation consiste à activer l'orientation automatique et à écouter les événements resize de l'objet Stage pour déterminer lorsqu'il est nécessaire d'actualiser la mise en forme de l'application.

Si l'application prend en charge le format portrait uniquement ou le format paysage uniquement, vous pouvez également désactiver l'orientation automatique et définiir le format généré dans le descriptor d'application AIR. Cette stratégie assure un comportement cohérent et Sélectionne l'orientation la « plus » adaptée au format sélectionné. Par exemple, si vous activez le format paysage, l'orientation可以选择 convient aux péripériques dotés de claviers coulissants (en mode paysage).

Identification du format et de l'orientation actuels de la scène

L'orientation est indiquée relativement à la position normale du périhérique. Sur la plupart des périhériques, il existe une position verticale clairément identifiable. Cette position est considérée comme l'orientation par défaut. Les trois autres orientations possibles sont les suivantes : rotated left, rotated right et upside down. La classe StageOrientation intègre les constantes de type chaine à utiliser lors de la définition ou de la comparaison de valeurs d'orientation.

La classe Stage définit deux propriétés qui indiquent l'orientation, à savoir :

  • Stage_deviceOrientation : indique l'orientation physique du périphérique par rapport à la position par défaut. Remarque : l'orientation du périphérique n'est pas always disponible si l'application vient de démarrer ou si le périphérique est posé à plat. Dans ces cas de figure, l'orientation indiquée du périphérique correspond à unknown.
  • Stage. orientation : indique l'orientation de la scene par rapport à la position par défaut. Si vous avez activé l'orientation automatique, la scene pivote dans la direction opposée à celle du périphérique pour demeurer vertical. Les positions droite et gauche indiquées par la propriété orientation représentent donc l'opposé des positions indiquées par la propriété deviceOrientation. Ainsi, si deviceRotation indique rotated right, orientation indique rotated left.

Pour identifier le format de la scène, il suffit de comparer la largeur et la hauteur actuelles de la scène :

Orientation automatique

Si l'orientation automatique est activée et que l'utilisateur fait pivoter le périphérique, le système d'exploitation réoriente l'interface utilisateur entière, y compris la barre des tâches système et l'application. Le format de la scène passé du mode portrait au mode paysage, et vice versa. La modification du format entraine également la modification des dimensions de la scène.

Pour activer ou désactiver l'orientation automatique lors de l'exécution, définièsez la propriété autoOrients de l'objet Stage sur true ou false. Vous pouvez définir la valeur initiale de cette propriété dans le descriptor d'application AIR avec l'élement . (Notez que dans les versions d'AIR antérieures à 2.6, autoOrients est une propriété disponible en lecture seule, que vous ne pouvez définir que dans le descriptor d'application.)

Si vous spécifie le format paysage ou portrait et activez l'orientation automatique, AIR définit l'orientation automatique au format spécifique.

Modification des dimensions de la scène

En cas de modification des dimensions de la scène, le contenu de cette dernière est mis à l'échelle et repositionné comme stipulé par les propriétés scaleMode et align de l'objet Stage. Dans la plupart des cas, il n'est pas recommandé de se fier au comportement automatique défini par les paramètres scaleMode de l'objet Stage. Pour prendre en charge plusieurs formats, il est préférible de modifier la mise en forme des graphiques et des composants ou de rafraîchir ces derniers. (Une logique de mise en formeouple presente également l'avantage d'assurer un meilleur fonctionnement de l'application sur des périphériques aux tailles d'écran et formats distincts.)

L'illustration suivantes les effets des différents paramètres scaleMode lors de la rotation d'un périphérique mobile standard :

ADOBE ACTIONSCRIPT 3.0 - Modification des dimensions de la scène - 1

ADOBE ACTIONSCRIPT 3.0 - Modification des dimensions de la scène - 2

ADOBE ACTIONSCRIPT 3.0 - Modification des dimensions de la scène - 3

ADOBE ACTIONSCRIPT 3.0 - Modification des dimensions de la scène - 4

ADOBE ACTIONSCRIPT 3.0 - Modification des dimensions de la scène - 5
Rotation d'un format paysage vers un format portrait

Cette illustration décrit le comportement du périphérique lorsque l'utilisateur passé du mode paysage au mode portrait avec différents modes de mise à l'échelle. Le passage du mode portrait au mode paysage produit des effets similaires.

Événements de changement d'orientation

L'objet Stage distribue deux types d'événements, dont vous disposez pour détecter les changements d'orientation et réagir à ces derniers. Les événements resize et orientationChange de la scène sont tous deux distribués si l'orientation automatique est activée.

Privilégiez l'évenement resize si vous vous fais à l'orientation automatique pour assurer une position verticale à l'affichage. Lorsque la scene distribue un événement resize, changez la disposition de votre contenu ou redessinez-le si nécessaire. L'évenement resize n'est distribué que si le mode de mise à l'échelle de la scene est défini sur noScale.

L'évenement orientationChange permet également de détecter les changements d'orientation. L'évenement orientationChange n'est distribué que si l'orientation automatique est activée.

Remarque: sur certaines plates-formes mobiles, la scène distribue un événement orientationChanging, que vous pouvez annuler, avant de distribuer les événements resize ou orientationChange. Etant donné que cet événement n'est pas pris en charge sur toutes les plates-formes, évitez de trop vous y fier.

Orientation manuelle

AIR 2.6 et les versions ultérieures

Voupez contrcler l'orientation de la scene via la methode setOrientation() ou setAspectRatio() de I'bject Stage.

Définition de l'orientation de la scène

Vou puez definir l'orientation de la scene à l'execution à l'aide de la méthode setOrientation() de l'objet Stage. Utilisez les constantes de chaîne définies par la classe StageOrientation pour spécifier l'orientation de votre choix :

this stage.setOrientation( StageOrientation.ROTATED_RIGHT );

Tous les péripériques et systèmes d'exploitation ne prennten pas en charge toutes les orientations possibles. Par exemple, Android 2.2 ne prend pas en charge la sélection par programmation de l'orientation vers la gauche sur les péripériques portrait standard et ne prend pas du tout en charge l'orientation à l'envers. La propriété supportedOrientations de la scène fournit une liste des orientations pouvant être transmises à la méthode setOrientation():

var orientations:Vector.<String> = this stagesupportedOrientations;  
for each( var orientation:String in orientations )  
{  
    trace( orientation );  
} 

Définition du format de la scène

Si le format de la scène vous importe, vous pouvez le définir sur portrait ou paysage. Vous pouvez définir le format soit dans le descripteur de l'application AIR, soit à l'exécution à l'aide de la méthode setAspectRatio() de l'objet Stage :

this stage.setAspectRatio(StageAspectRatio.LANDSCAPE);

Le moteur d'exécution désit l'une des deux orientations possibles pour le format spécifique. Il est possible que ce besoin ne corresponde pas à l'orientation du péripérique. Par exemple, l'orientation par défaut est préféérée à l'orientation à l'envers (AIR 3.2 et les versions antérieures) et l'orientation convenant au clavier coulissant est préféérée à l'orientation opposée.

(AIR 3.3 et versions ultérieures) A partir d'AIR 3.3 (SWF version 16), vous pouze également utiliser la constante StageAspectRatio.ANY. Si vous définisse Stage.autoOrients sur true et appelez setAspectRatio(StageAspectRatio.ANY), votre application a la capacité de réorienter toutes les orientations (paysage vers la gauche, paysage vers la droite, portait et portrait à l'envers). Autre nouvelle dans AIR 3.3: le format est persistent et toute rotation du péripérisque est soumise à l'orientation spécifique.

Example : définition de l'orientation de la scène de façon à ce qu'elle corresponde à l'orientation du péripérisque L'exemple suivant illustrer une fonction qui met à jour l'orientation de la scène afin qu'elle corresponde à celle du péripérisque. La propriété deviceOrientation de la scène indique l'orientation physique du péripérisque, même si l'orientation automatique est désactivée.

function refreshOrientation( theStage:Stage ):void  
{  
    switch ( theStagedeviceOrientation )  
{  
        case StageOrientation.DEFAULT:  
            theStage.setOrientation( StageOrientation.DEFAULT);  
            break;  
        case StageOrientation.ROTATED_RIGHT:  
            theStage.setOrientation( StageOrientation.ROTATED_LEFT );  
            break;  
        case StageOrientation.ROTATED_LEFT:  
            theStage.setOrientation( StageOrientation.ROTATED_RIGHT );  
            break;  
        case StageOrientation.UPSIDE_DOWN:  
            theStage.setOrientation( StageOrientation.UPSIDE_DOWN );  
            break;  
        default: //No change  
    }  
} 

La modification de l'orientation est asynchrone. Vous pouze écouter l'évenement orientationChange distribué par la scène pour savoir quand la modification est terminée. Si une orientation n'est pas prise en charge sur un périphérique, l'appel de setOrientation() échoue sans distribuer d'erreur.

Chargement dynamique du contenu d'affichage

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Les éléments d'affichage externes suivants peuvent être chargés dans une application ActionScript 3.0 :

  • Fichier SWF programme dans ActionScript 3.0 : ce fichier peut correspondre à Sprite, MovieClip ou toute classe qui étend Sprite. Dans les applications AIR sous iOS, seuls les fichiers SWF qui ne contiennent pas de code d'octet ActionScript peuvent être charges. En d'autres termes, les fichiers SWF qui contiennent des données incorporeées, telles qu'images et son, peuvent être charges, mais pas les fichiers SWF contenant du code exécutable.
  • Fichier d'image : tels que les fichiers.JPG, PNG et GIF.
  • Fichier AVM1 SWF : fournir SWF écrit en ActionScript 1.0 ou 2.0. (non pris en charge sur les applications mobiles AIR)
    Voues chargez ces ressources par le biais de la classe Loader.

Chargement d'objets d'affichage

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Les objets Loader permettent de charger des fischiers SWF et des fischiers graphiques dans une application. La classe Loader est une sous-classe de la classe DisplayObjectContainer. La liste d'affichage d'un objet Loader ne comporte qu'un seul objet d'affichage infant : l'objet d'affichage qui representation le filchier SWF ou graphique qu'il charge. Lorsque vous ajoutez un objet Loader à la liste d'affichage, comme dans le code ci-dessous, vous ajoutez également l'objet d'affichage infant charged à la liste d'affichage, une fois le chargement effectué :

var pictLdr:Loader = new Loader();  
var pictURL:String = "banana.jpg"  
var pictURLReq:URLRequest = new URLRequest(pictURL);  
pictLdr.load(pictURLReq);  
this.addChild(pictLdr); 

Lorsque le fichier SWF ou l'image sont charges, vous pouze transférer l'objet d'affichage charge dans un autre conteneur d'objets d'affichage, tel que l'objet container de la classe DisplayObjectContainer dans l'exemple illustré :

import flash.display.*;
import flash.net(URLRequest;
import flash.events.Event;
var container:Sprite = new Sprite();
addChild/container);
var pictLdr:Loader = new Loader();
var pictURL:String = "banana.jpg"
var pictURLReq:URLRequest = new URLRequest(pictURL);
pictLdr.load(pictURLReq);
pictLdr(contentLoaderInfo.addEventListener(Event.COMPLET, imgLoaded);
function imgLoaded(event:Event):void
{ container.addChild(pictLdr(content);
}

Surveillance de la progression du chargement

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Lorsque le chargement du filchier débute, un objet LoaderInfo est créé. Un objet LoaderInfo fournit diverses informations sur le chargement : progression, adresses URL du chargeur et du charge, nombre d'octets total de l'objet multimédia et dimensions nominales (hauteur et largeur) de celui-ci. Par ailleurs, un objet LoaderInfo distribue les événements qui permettent de suivre la progression du chargement.

Le diagramme suivant présente les diverses utilisations de l'objet LoaderInfo, pour l'occurrence de la classe principale du filchier SWF, pour un objet Loader et pour un objet charge par ce dernier :

ADOBE ACTIONSCRIPT 3.0 - Surveillance de la progression du chargement - 1

Vous pouze acceder à l'objet LoaderInfo en tant que propriete de l'objet Loader et de l'objet d'affichage chargeé. Dés que le chargement début, vous pouze acceder à l'objet LoaderInfo par le biais de la propriete contentLoaderInfo de l'objet Loader. Lorsque le chargement de l'objet d'affichage est terminé, vous pouze également acceder à l'objet LoaderInfo en tant que propriete de cet object charged par le biais de la propriete loaderInfo de l'objet d'affichage. La propriete loaderInfo de l'objet d'affichage charge se refère au même object LoaderInfo que la propriete contentLoaderInfo de l'objet Loader. En d'autres termes, un object LoaderInfo est partagé entre un object chargeé et l'objet Loader qui l'a chargeé (entre le chargeur et le charge).

Pour acceder aux propriétés du contenu charge, il est recommandé d'ajouter un écouteur d'évenement à l'objet LoaderInfo, comme indiqué dans le code suivant :

import flash.displayloader;
import flash.display.Sprite;
import flash.events.Event;
var ldr:Loader = new Loader();
var urlReq:URLRequest = new URLRequest("Circle.swf");
ldr.load(urlReq);
ldr(contentLoaderInfo.addEventListener(Event.COMPLET,loaded);
addChild(ldr);

function loaded(event:Event):void  
{  
    var content:Sprite = event.target(content);  
    contentscaleX = 2;  
} 

Pour plus d'informations, voir « Gestion des événements » à la page 129.

Définition du contexte de chargement

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Lorsque you chargez un fisier exter dans Flash Player ou AIR par le biais de la methode load() ou loadBytes() de la classe Loader, vous pouvez indiquer le parametre context. Ce parametre est un objet LoaderContext.

La classe LoaderContext comporte trois propriétés qui permettent de définir le contexte d'utilisation du contenu charge :

checkPolicyFile: utilisez cette propriété uniquely pour le chargement d'un fisier image (pas pour un fisier SWF). Si vous définissez cette propriété sur true, l'objet Loader vérifie si le serveur d'origine héberge un fisier de régulation (voir « Contrôles de site Web (fichiers de régulation) » à la page 1095). Cette opération n'est requise que si le contenu émane de domaines autres que celui du fisier SWF qui contient l'objet Loader. Si le serveur accorde une autorisation au domaine de Loader, le code ActionScript extrait des fisiers SWF du domaine de Loader peut acceder aux données de l'image chargeée. En d'autres termes, vous pouvez utiliser la commande BitmapData.draw() pour acceder aux données de l'image chargesées.

Notez qu'un fichier SWF extrait d'un autre domaine que celui de l'objet Loader peut appeler Security.allowDomain() pour autoriser un domaine déterminé.

  • securityDomain : utilisez cette propriété uniquement pour le chargement d'un fichier SWF (pas pour une image). Cette propriété peut etre appelée pour un fichier SWF provenant d'un autre domaine que celui du fichier qui contient l'objet Loader. Lorsque vous indiquez cette option, Flash Player vérifie l'existence d'un fichier de régulation et, s'il existe, les fichiers SWF des domains autorisés dans ce fichier peuvent utiliser des opérations de programmation croisiée avec le contenu du fichier SWF charge. Vous pouvez stipuler flash.system.SecurityDomain.currentDomain en tant que parametre.
  • applicationDomain: utilisez cette propriété uniquement lors du chargement d'un fichier SWF écrit dans ActionScript 3.0 (et non une image ou un fichier SWF écrit dans ActionScript 1.0 ou 2.0). Lorsque vous chargez un fichier, vous doivent indiquer que le fichier doit être inclus dans le même Domaine d'application que l'objet Loader en attribuant au paramètre applicationDomain la valeur flash.system.ApplicationDomain.currentDomain. Si vous placez le fichier SWF charge dans le même Domaine d'application, vous pourrez acceder directement à ses classes, ce qui s'avère utile si vous chargez un fichier SWF contenant des média intégrés, auxquels vous pouvez acceder via les noms de classes associés. Pour plus d'informations, voir « Utilisation de domaines d'application » à la page 152.

Exemple de vérification d'un fisier de régulation lors du chargement d'une image bitmap provenant d'un autre domaine :

var context:LoaderContext = new LoaderContext();   
context.checkPolicyFile = true;   
var urlReq:URLRequest = new URLRequest("http://www.[your_domain_here].com/photo11.jpg");   
var ldr:Loader = new Loader();   
ldr.load(urlReq, context); 

Exemple de vérification d'un fisquier de régulation lors du chargement d'un fisquier SWF à partir d'un autre domaine, dans le but de placer ce fisquier dans la même Sandbox de sécurité que l'objet Loader. Par ailleurs, le code ajoute les classes du fisquier SWF charge dans le même domaine d'application que celui de l'objet Loader :

var context:LoaderContext = new LoaderContext();  
context.securityDomain = SecurityDomain.currentDomain;  
context.applicationDomain = ApplicationDomain.currentDomain;  
var urlReq:URLRequest = new URLRequest("http://www.[your_domain_here].com/library.swf");  
var ldr:Loader = new Loader();  
ldr.load(urlReq, context); 

Pour plus d'informations, voir la classe LoaderContext dans le manuel Guide de referrer ActionScript 3.0 pour la plate-forme Adobe Flash.

Chargement de fichiers SWF dans AIR pour iOS

Adobe AIR 3.6 et ultérieur, iOS uniquement

Il existe des restrictions concernant le chargement et la compilation de code à l'exécution sur les périphériques iOS. En raison de ces restrictions, vous constaterez certaines différences nécessaires dans la tâche de chargement des fischiers SWF externes dans votre application :

  • Tous les fischiers contenant du code ActionScript doivent être inclus dans le package d'application. Aucun fisier SWF contenant du code ne peut être charge depuis une source externe (via un réseau, par exemple). Lors de la création du package de l'application, le code ActionScript des fischiers SWF du package d'application est compilé en code natif pour périphériques iOS.
  • Il est impossible de charger, décharger, puis recharger un fichier SWF. Si vous tentez de le faire, une erreur se produit.
  • Le comportement en cas de chargement en mémoire, puis de déchargement, est le même qu'avec les systèmes d'exploitation d'ordinateur de bureau. Si vous chargez un fjchier SWF, puis que vous le déchargez, tous les éléments visuels contenus dans le SWF sont décharges de la mémoire. Toutefois, les références de classe à une classe ActionScript dans le fjchier SWF charge restent en mémoire et sont accessibles par le code ActionScript.
  • Tous les fischiers SWF doivent être chargés dans le même domaine d'application que le fjichier SWF principal. Ceci n'est pas le comportement par défaut. C'est pourquoit, pour chaque SWF charge, vous neces creer un objet LoaderContext spécifique le domaine d'application principal et transmettre cet objet LoaderContext à l'objet de méthode Loader.load(). Si vous tentez de charger un fjichier SWF dans un domaine d'application autre que le domaine d'application SWF principal, une erreur se produit. Cela est vrai même si le fjichier SWF charge ne contient que des éléments visuels sans code ActionScript.

L'exemple suivant montre le code à utiliser pour charger le SWF depuis le package d'application dans le domaine d'application du fichier SWF principal :

var loader:Loader = new Loader();  
var url:URLRequest = new URLRequest("swfs/SecondarySwf.swf");  
var loaderContext:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain, null);  
loader.load(url, loaderContext); 

Un fichier SWF contenant uniquement des actifs sans code peut etre charge depuis le package d'application ou via reseau. Dans les deux cas, le fichier SWF doit always etre charge dans le domaine d'application principal.

Pour les versions d'AIR antérieures à 3.6, le code est retire de tous les fichiers SWF, à l'exception du filier d'application SWF principal, au cours du processus de compilation. Les fichiers SWF ne contenant que des éléments visuels peuvent être inclus dans le package d'application et charges à l'execution, mais pas le code. Si vous tentez de charger un filier SWF contenant du code ActionScript, une erreur se produit. Cette erreur cause l' apparition d'un message d'erreur « ActionScript non compiling » dans l'application.

Voir aussi

Packaging and loading multiple SWFs in AIR apps on iOS (disponible en anglais uniquement).

Utilisation des classes ProLoader et ProLoaderInfo

Flash Player 9 et les versions ultérieures et Adobe AIR 1.0 et les versions ultérieures requirement Flash

Professional CS5.5

Pour faciliter le préchargement de la bibliothèque RSL (Remote Shared Library), Flash Professional CS5.5 intégre à présent les classes fl.display.ProLoader et fl.display.ProLoaderInfo. Ces classes reflètent les classes flash.display.Loader et flash.display.LoaderInfo, mais assurent un chargement plus cohérent.

La classe ProLoader permit en particulier de charger les fichiers SWF qui font appel à Text Layout Framework (TLF) lors d'un préchargement RSL. A l'exécution, les fichiers SWF qui précharge d'autres fichiers SWF ou des fichiers SWZ, tels que TLF, nécessitent un fisier d'enveloppe SWF à usage interne uniquement. Cette couche complémentaire de complexité imposee par le fisier d'enveloppe SWF entraine parfois un comportement inattendu. La classe ProLoader résout ce problème en permettant de charger les fichiers comme des fichiers SWF standard. La solution adoptee par la classe ProLoader est transparente du point de vue de l'utiliseur et ne requiert pas de traitement particulier dans ActionScript. La classe ProLoader charge par ailleurs correctement les contenus SWF standard.

Dans Flash Professional CS 5.5 et ultérieur, vous pouvez remplacer la classe Loader par la classe ProLoader dans tous les cas de figure en toute sécurité. Exportez ensuite l'application vers Flash Player 10.2 ou ultérieur, afin que la classe ProLoader puisse acceder à la fonctionnalité ActionScript requise. Vous pouvez également faire appel à la classe ProLoader si vous ciblez des versions antérieures de Flash Player qui prennt en charge ActionScript 3.0. Toutefois, seul Flash Player 10.2 ou ultérieur exploite pleinement les fonctions de Proloader. Utilisez toujours la classe ProLoader si vous faites appel à TLF dans Flash Professional CS5.5 ou ultérieur. L'utilisation de ProLoader est superflue dans les environnementes autres que Flash Professional.

Important : pour les fichiers SWF publiés dans Flash Professional CS5.5 et ultérieur, il est toujours possible d'utiliser les classes fl.display.ProLoader et fl.display.ProLoaderInfo au lieu des classes flash.display.Loader et flash.display.LoaderInfo.

Problèmes résolus par la classe ProLoader

La classe ProLoader résout les problèmes que la classe Loader existante, de par sa conception, ne prendait pas en charge. Ces problèmes résultat du préchargement RSL de bibliothèques TLF. Ils concernnent spécifique les fichiers SWF qui charge n'd'autres fichiers SWF par le bias d'un objet Loader. Les problèmes résolus sont les suivants :

  • L'utilisation de scripts entre le fjichier de chargement et le fjichier chargeé entraine des résultats inattendus. La classe ProLoader définit automatiquement le fjichier SWF de chargement en tant que parent du fjichier SWF chargeé. De ce fait, les communications émanant du fjichier SWF de chargement ciblent directement le fjichier SWF chargeé.
  • L'application SWF doit:gérer activement le processus de chargement. Cette opération requiert la mise en œuvre d'événements supplémentaires tels que added, removed, addedToStage et removedFromStage. Si l'application cible Flash Player 10.2 ou ultérieur, la classe ProLoader permet d'éviter cette tâche supplémentaire.

Mise à jour du code en vue d'utiliser ProLoader au lieu de Loader

Etant donné que la classe ProLoader reflete la classe Loader, substituer une classe à l'autre dans le code ne présente aucune difficulté. L'exemple suivant illustré la mise à jour du code existant en vue d'utiliser la nouvelle classe :

import flash.display.Loader;
import flash.events.Event;
var l:Loader = new Loader();
addChild(1);
l(contentLoaderInfo.addEventListener(Event.COMPLET,loadComplete);
1.load("my.swf");
function loadComplete(e:Event){ trace('load complete!');
}
Il est possible de metre à jour ce code pour utiliser la classe ProLoader, comme suit :
import f1.display.ProLoader;
import flash.events.Event;
var l:ProLoader = new ProLoader();
addChild(1);
1 contentLoaderInfo.addEventListener(Event.COMPLET,loadComplete);
1.load("my.swf");
function loadComplete(e:Event){ trace('load complete!');
}

Exemple d'objet d'affichage : SpriteArranger

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

L'exemple d'application SpriteArranger est basé sur l'exemple d'application Geometric Shapes (voir Formation à ActionScript 3.0).

L'exemple SpriteArranger illustrde divers concepts de gestion des objets d'affichage :

  • Extension des classes d'objet d'affichage
  • Ajout d'objets à la liste d'affichage
    Superposition des objets d'affichage et utilisation des conteneurs d'objects d'affichage
  • Réponse aux événements d'objet d'affichage
  • Utilisation des propriétés et méthodes des objets d'affichage

Pour obtenir les fischiers d'application de cet exemple, voir www.adobe.com/go/learn(programmingAS3samplesflash_fr. Les fischiers d'application SpriteArranger résident dans le dossier Examples/SpriteArranger. L'application se compose des fischiers suivants:

FichierDescription
SpriteArranger.mxml ou SpriteArranger.flaFichier d'application principal dans Flash (FLA) ou Flex (MXML).
com/example/programmingas3/SpriteArranger/CircleSprite.asClasse définitant un type d'objet Sprite qui assure le rendu d'un cercle à l'écran.
com/example/programmingas3/SpriteArranger/DrawingCanvas.asClasse définitant le rectangle de la zone de dessin, soit un conteneur d'objets d'affichage importante des objets GeometricSprite.
com/example/programmingas3/SpriteArranger/SquareSprite.asClasse définitant un type d'objet Sprite qui assure le rendu d'un carré à l'écran.
com/example/programmingas3/SpriteArranger/TriangleSprite.asClasse définitant un type d'objet Sprite qui assure le rendu d'un triangle à l'écran.
com/example/programmingas3/SpriteArranger/GeometricSprite.asClasse qui étend l'objet Sprite, utilisé pour définir une forme à l'écran. CircleSprite, SquareSprite et TriangleSprite étendent chacun cette classe.
com/example/programmingas3/geometricshapes/IGeometricShape.asInterface de base qui définit les méthodes à implémenter par toutes les classes de formes géométriques.
com/example/programmingas3/geometricshapes/IPolygon.asInterface qui définit les méthodes à implémenter par les classes de forme géométrique dotées de plusieurs côts.
com/example/programmingas3/geometricshapes-RegularPolygon.asType de forme géométrique dont les côts sont de longueur égale et positionnés symétriquement autour du centre de la forme.
com/example/programmingas3/geometricshapes/Circle.asType de forme géométrique qui définit un cercle.
com/example/programmingas3/geometricshapes/EquilateralTriangle.asSous-classe de RegularPolygon qui définit un triangle équilatéral.
com/example/programmingas3/geometricshapes/Square.asSous-classe de RegularPolygon qui définit un carré.
com/example/programmingas3/geometricshapes/GeometricShapeFactory.asClasse qui contient une « méthode usine » permettant de créé des formes d'une taillée et d'un type de forme disponibles.

Définition des classes SpriteArranger

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

L'application SpriteArranger permet à l'utilisateur d'ajouter divers objets d'affichage au rectangle de la zone de dessin à l'écran.

La classe DrawingCanvas définit une zone de dessin, soit un type de conteneur d'objets d'affichage, à laquelle l'utilisateur peut ajouter des formes à l'écran. Ces formes sont des occurrences de l'une des sous-classes de la classe GeometricSprite.

Classe DrawingCanvas

Dans Flex, tous les objets d'affichage infant ajoutés à un objet Container doivent appartenir à une classe issue de la classe mx.core.IUComponent. Cette application ajoute une occurrence de la classe DrawingCanvas en tant qu'enfant d'un objet mx.containers.VBox, ainsi que le définit le code MXML dans le fjichier SpriteArranger.mxml. Cet heritage est défi ni dans la déclaration de classe DrawingCanvas, comme suit :

public class DrawingCanvas extends UIComponent

La classe UIComponent héritage des classes DisplayObject, DisplayObjectContainer et Sprite et le code de la classe DrawingCanvas utilise les méthodes et propriétés de ces dernières.

La classe DrawingCanvas étend la classe Sprite et cet heritage est défin dans la déclaration de classe DrawingCanvas, comme suit :

La classe Sprite est une sous-classe des classes DisplayObjectContainer et DisplayObject et la classe DrawingCanvas utilise les méthodes et propriétés de ces dernières.

La méthode constructeur DrawingCanvas() définit un objet Rectangle, bounds, qui est une propriété utilisée ultérieurement lors du tracé du contour de la zone de dessin. Elle appelle ensuite la méthode initCanvas(), comme suit:

this.bounds = new Rectangle(0, 0, w, h);  
initCanvas(fillColor, lineColor); 

Comme l'indique l'exemple suivant, la méthode initCanvas() définit diverses propriétés de l'objet DrawingCanvas, transmises en tant qu'arguments à la méthode constructeur :

this.lineColor = lineColor;
this fillsColor = fillColor;
this.width = 500 this.height = 200

La méthode initCanvas() appelle ensuite la méthode drawBounds() qui trace le rectangle de la zone de dessin à l'aide de la propriété graphics de la classe DrawingCanvas. La propriété graphics est heriterée de la classe Shape.

this.graphics.clear();   
this.graphics.lineStyle(1.0,this.lineColor,1.0);   
this.graphics.beginFill(this fillsColor,1.0);   
this.graphics.drawRect(bounds.left - 1, bounds.top - 1, bounds.width + 2, bounds.height + 2); 

this.graphics.endFill();

Les autres méthodes de la classe DrawingCanvas, indiquées ci-après, sont appelées en fonction des interactions de l'utilisateur avec l'application :

  • Les méthodes addShape() et déscribeChildren(), décrites à la section « Ajout d'objets d'affichage au rectangle de la zone de dessin » à la page 214
  • Les méthodes moveToBack(), moveDown(), moveToFront() et moveUp(), décrites à la section « Réorganisation de l'ordre de superposition des objets d'affichage » à la page 217
  • La méthode onMouseUp(), déscribe à la section « Cliquer-deplacer un objet d'affichage » à la page 216

Classe GeometricSprite et ses sous-classes

Chaque objet d'affichage susceptible d'être ajoute par l'utilisateur au rectangle de la zone de dessin est une occurrencé de l'une des sous-classes suivantes de la classe GeometricSprite :

La classe GeometricSprite comprend diverses propriétés communes à tous les objets GeometricSprite. Elles sont définies dans la fonction constructeur en fonction des paramètres transmis à cette dernière. Exemple :

this.size = size;
this.lineColor = lColor;
this fillsColor = fColor;

La propriété géometricShape de la classe GeometricSprite définit une interface IGeometricShape, qui stipule les propriétés mathématiques, mais non visuelles, de la forme. Les classes qui implémentent l'interface IGeometricShape sont définies dans l'exemple d'application GeometricShapes (voir Formation à ActionScript 3.0).

La classe GeometricSprite définit la méthode drawShape(), qui est affinée dans les définitions de remplacement de chaque sous-classe de GeometricSprite. Pour plus d'informations, voir ci-après « Ajout d'objets d'affichage au rectangle de la zone de dessin »

La classe GeometricSprite propose également les méthodes suivantes :

  • Les méthodes onMouseDown() et onMouseUp(), décrites à la section « Cliquer-deplacer un objet d'affichage » à la page 216
  • Les méthodes showSelected() et hideSelected(), décrites à la section « Cliquer-deplacer un objet d'affichage » à la page 216

Ajout d'objets d'affichage au rectangle de la zone de dessin

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Lorsque l'utilisateur clique sur le bouton Add Shape, l'application appelle la méthode addShape () de la classe DrawingCanvas. Elle create une occurrence de GeometricSprite en appelant la fonction constructeur appropriée de l'une des sous-classes de GeometricSprite, comme illustré dans l'exemple suivant :

public function addShape(shapeName:String, len:Number):void
{ var newShape:GeometricSprit; switch(shapeName) { case "Triangle": newShape = new TriangleSprite(len); break; case "Square": newShape = new SquareSprit(len); break; case "Circle": newShape = new CircleSprit(len); break; } newShape.alpha = 0.8 . this.addChild(newShape);

Chaque méthode constructeur appelle la méthode drawShape(), qui utilise la propriété graphics de la classe (héritée de la classe Sprite) pour dessiner le graphique vectoriel approprié. Par exemple, la méthode drawShape() de la classe CircleSprite comprend le code suivant:

L'avant-dernière ligne de la fonction addShape() définit la propriété alpha de lobjet d'affichage (héritée de la classe DisplayObject), de sorte que chaque objet d'affichage ajoute au rectangle de la zone de dessin soit légersement transparent, permettant ainsi à l'utilisateur de visualiser les objets placés derrière.

La dérrière ligne de la méthode addChild() ajoute le nouvel objet d'affichage à la liste infant de l'occurrence de la classe DrawingCanvas, qui figure déjà dans la liste d'affichage. Le nouvel objet d'affichage apparait alors sur la scene.

L'interface de l'application comprend deux champs de texte, selectedSpriteTxt et outputTxt. Les propriétés de texte de ces champs sont mises à jour avec des informations relatives aux objets GeometricSprite ajustés au rectangle de la zone de dessin ou sélectionnés par l'utilisateur. La classe GeometricSprite gère ces tâches de transmission d'informations en annulant la méthode toString() comme suit :

La propriété shapeType est définie sur la valeur appropriée de la méthode constructeur de chaque sous-classe
GeometricSprite. La méthode toString() pourrait par exemple renvoyer la valeur suivante pour une occurrence de
CircleSprite réseaument ajoutée à l'occurrence de DrawingCanvas :

La méthode describeChildren() de la classe DrawingCanvas parcourt la liste enfant du rectangle de la zone de dessin en utilisant la propriété numChildren (héritée de la classe DisplayObjectContainer) pour définir la limite de la boucle for. Elle générale une chaine qui recense chaque enfant, comme suit :

var desc:String = "";
var child:DisplayObject;
for(var i:int 0 ;i < < this numChildren; i + + ) { child = this.getChildrenAt(i); desc + = i ^+ :" ^+ child ^+ '\n';
}

La chaîne résultatpepermet dedéfinir lapropriététext du champde texteoutputTxt.

Cliqueur-deplacer un objet d'affichage

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Lorsque l'utilisateur clique sur une occurrence de GeometricSprite, l'application appelle le gestionnaire de I'événement onMouseDown(). Comme le montre le code ci-dessous, ce gestionnaire écoute les événements de cliç gauche de souris dans la fonction constructeur de la classe GeometricSprite :

La méthode onMouseDown() appelle ensuite la méthode showSelected() de l'objet GeometricSprite. S'il s'agit du premier appel de cette méthode sur l'objet, elle create un objet Shape appelé selectionIndicator et utilise la propriété graphics de l'objet Shape pour dessiner un rectangle rouge de mise en valeur, comme suit :

this selectionIndicator = new Shape();  
this selectionIndicator.graphics.lineStyle(1.0, 0xFF0000, 1.0);  
this selectionIndicator.graphics.drawRect(-1, -1, this.size + 1, this.size + 1);  
this.addChild(this-selectionIndicator); 

S'il ne s'agit pas du premier appel de la méthode onMouseDown(), celle-ci active simplement la propriété visible (héritée de la classe DisplayObject) de la forme selectionIndicator:

La méthode hideSelected() masque la forme selectionIndicator de l'objet précédent sélectionné en définissant sa propriété visible sur false.

La méthode du gestionnaire d'évenement onMouseDown() appelle également la méthode startDrag() (héritée de la classe Sprite), qui comprend le code suivant:

var boundsRect:Rectangle = this.parent.getRect(this.parent);  
boundsRect.width -= this.size;  
boundsRect.height -= this.size;  
this.startDrag(false, boundsRect); 

L'utilisateur peut alors déplacer l'objet selectionné sur la zone de dessin, au sein des limites définies par le rectangle boundsRect.

Lorsque l'utilisateur relâche le bouton de la souris, l'évenement mouseUp est distribué. La méthode constructeur de DrawingCanvas configure l'écouteur d'évenement suivant :

this.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);

Cet écouteur d' événement est associé à l'objet DrawingCanvas,只不过 qu'aux objets GeometricSprite individuels. En effet, lorsque l'utilisateur déplace l'objet GeometricSprite, celui-ci risque d'être placé derrière un autre objet d'affichage (un autre objet GeometricSprite) lorsque le bouton de la souris est relachué. L'évenement « mouse up » s'appliquérait à l'objet d'affichage en avant-plan, mais non à l'objet d'affichage déplaced par l'utilisateur. Ajouter l'écouteur à l'objet DrawingCanvas assures la gestion de l'évenement.

La méthode onMouseUp() appelle la méthode onMouseUp() de l'objet GeometricSprite, qui appelle alors la méthode stopDrag() de l'objet GeometricSprite.

Réorganisation de l'ordre de superposition des objets d'affichage

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

L'interface utiliser de l'application comprend des boutons intitulés Move Back, Move Down, Move Up et Move to Front. Lorsque l'utilisateur clique sur l'un de ces boutons, l'application appelle la méthode correspondante de la classe DrawingCanvas, à savoir : moveToBack(), moveDown(), moveUp() ou moveToFront(). Par exemple, la méthode moveToBack() comporte le code suivant:

public function moveToBack(shape:GeometricSprite):void { var index:int = this.getChildIndex(shape); if (index >0 1 { this.setChildIndex(shape,0); }
}

Cette méthode utilise la méthode setChildIndex() (héritée de la classe DisplayObjectContainer) pour placer l'objet d'affichage à la position d'index 0 de la liste des enfants de l'occurrence de DrawingCanvas (this).

Le fonctionnement de la méthode moveDown() est similaire, mais elle décrémente la position d'index de l'objet d'affichage d'une unité dans la liste des enfants de l'occurrence de DrawingCanvas :

public function moveDown(shape:GeometricSprite):void { var index:int = this.getChildIndex(shape); if (index >0 1 { this.setChildIndex(shape, index - 1); }
}

Le fonctionnement des méthodes moveUp() et moveToFront() est similaire aux méthodes moveToBack() et moveDown().

Chapitre 11 : Utilisation de la géométrie

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Le package flashgeom contient des classes qui définissent des objets géométriques, tels que des points, des rectangles et des matrices de transformation. Vous utilise ces classes pour définir les propriétés des objets qui sont utilisés dans autres classes.

Voir aussi

flash.geom, package

Principes de base de la géométrie

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Le package flashgeom contient des classes qui définissent des objets géométriques, tels que des points, des rectangles et des matrices de transformation. Ces classes ne fournissent pas nécessairement de fonctionnalité par elles-mêmes; néanmoins, elles sont utilisées pour définir les propriétés des objets utilisés dans d'autres classes.

Toutes les classes de géométrie se basent sur la notion selon laquelle les emplacements à l'écran sont représentés comme un plan en deux dimensions. L'écran est traité comme un graphique plat avec un axe horizontal (x) et un axe vertical (y). Tout emplacement (ou point) à l'écran peut être représenté sous la forme d'une paire de valeurs x et y, appelées coordonnées de cet emplacement.

Chaque objet d'affichage, y compris la scène, possède son propre espace de coordonnées. L'espace de coordonnées constitue le graphe d'un objet et permet de tracer la position des dessins, des objets d'affichage infant, etc. L'origine occupe la position 0, 0 (soit l'intersection des axes x et y) et est placée dans l'angle supérieur gauche de l'objet d'affichage. La position de l'origine est systématiquement respectée pour la scène, mais pas nécessairement pour d'autres objets d'affichage. La taille des valeurs figurant sur l'axe x croît vers la droite et diminuè vers la gauche. La coordonnée x des positions figurant sur la gauche de l'origine est négative. Cependant, contrairement aux systèmes de coordonnées classiques, la valeur des coordonnées de l'axe y croît vers le bas de l'écran et diminuè vers le haut dans le moteur d'exécution de Flash. La coordonnée y des valeurs situées au-dessus de l'origine est négative. Puisque l'angle supérieur gauche de la scène correspond à l'origine de son espace de coordonnées, la coordonnée x de la plupart des objets de la scène est supérieure à 0 et inférieure à la largeur de la scène. La coordonnée y d'un même objet est supérieure à 0 et inférieure à la hauteur de la scène.

Vous pouvez utiliser des occurrences de la classe Point pour représentater des points individuels dans un espace de coordonnées. Vous pouvez创建工作 une occurrence de Rectangle pour représentier une région rectangulaire dans un espace de coordonnées. Les utilisateurs chevronnés peuvent utiliser une occurrence de Matrix pour appliquer des transformations multiples ou complexes à un objet d'affichage. De nombreuses transformations simples (rotation, position, et changements d'échelle, par exemple) peuvent être appliquées directement à un objet d'affichage à l'aide des propriétés de ce dernier. Pour plus d'informations sur l'application de transformations à l'aide des propriétés d'un objet d'affichage, voir « Manipulation des objets d'affichage » à la page 180.

Concepts important et terminologie

La liste de référence suivante content des termes de géométrie importants :

Coordonnées cartésiennes Les coordonnées sont généralement écrites sous la forme d'une paire de nombres (5, 12 ou 17, -23). Les deux nombres sont la coordonnée x et la coordonnée y, respectivement.

Espace de coordonnées Représentation graphique des coordonnées contenues dans un objet d'affichage, par rapport auquel sont positionnés les éléments infant.

Origine Point d'intersection des axes x et y dans un espace de coordonnées. Ce point a les coordonnées 0, 0.

Point Emplacement unique dans un espace de coordonnées. Dans le système de coordonnées 2D utilisé dans ActionScript, la position sur les axes x et y (en d'autres termes, les coordonnées du point) définit ce dernier.

Point d'alignement Dans un objet d'affichage, origine (coordonnées 0, 0) de son espace de coordonnées.

Mise à l'échelle Taille relative d'un objet par rapport à sa taille d'origine. Mettre un objet à l'échelle consiste à modifier sa taille en l'étirant ou en le rétrécissant.

Translation Conversion des coordonnées d'un point d'un espace de coordonnées à un autre.

Transformation Modification des caractéristiques visuelles d'un graphique (rotation de l'objet, modification de son échelle, désignement, déformation ou alteration de sa couleur).

Axe Axé horizontal dans le système de coordonnées en 2 dimensions utilisé dans ActionScript.

Axe y Axe vertical dans le système de coordonnées en 2 dimensions utilisé dans ActionScript.

Utilisation des objets Point

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Un objet Point définit une paire de coordonnées cartésiennes. Il représenté un emplacement dans un système de coordonnées à deux dimensions, dans lequel x est l'axe horizontal et y l'axe vertical.

Pour définit un object Point, vous définissez ses propriétés x et y comme suit :

import flashgeom.*;
var pt1:Point = new Point(10,20);// = = 10 .y = = 20 var pt2:Point = new Point();
pt2.x = 10 pt2.y = 20

Calcul de la distance entre deux points

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Vous pouvez utiliser la méthode distance() de la classe Point pour calculer la distance entre deux points dans un espace de coordonnées. Par exemple, le code suivant calcule la distance entre les points d'alignement de deux objets d'affichage, circle1 et circle2, dans le même conteneur d'objet d'affichage :

import flashgeom.*;
var pt1:Point = new Point(circle1.x, circle1.y);
var pt2:Point = new Point(circle2.x, circle2.y);
var distance:Number = Point(distance(pt1, pt2);

Translation d'espaces de coordonnées

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Si deux objets d'affichage résident dans des conteneurs d'objet d'affichage distincts, ils peuventfigurer dans des espaces de coordonnées distincts. Vous pouvez utiliser la méthode localToGlobal() de la classe DisplayObject pour traduire les coordonnées dans le même espace de coordonnées (global), celui de la scène. Par exemple, le code suivant calcule la distance entre les points d'alignement de deux objets d'affichage, circle1 et circle2, dans les différents conteneurs d'objet d'affichage :

import flashgeom.*;
var pt1:Point = new Point(circle1.x, circle1.y); pt1 = circle1.localToGlobal(pt1);
var pt2:Point = new Point(circle2.x, circle2.y); pt2 = circle2.localToGlobal(pt2);
var distance:Number = Pointdistance(pt1,pt2);

De même, pour calculer la distance du point d'alignement d'un object d'affichage nommé target à partir d'un point spécifique de la scène, utilisez la méthode localToGlobal() de la classe DisplayObject :

import flashgeom.*;
var stageCenter:Point = new Point();
stageCenter.x = this(stage.targetWidth/2;
stageCenter.y = this(stage.targetHeight/2;
var targetCenter:Point = new Point(target.x,target.y);
targetCenter = target.localToGlobal(targetCenter);
var distance:Number = Pointdistance(stageCenter,targetCenter);

Déplacement d'un object d'affichage en fonction d'une distance et d'un angle donné

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Vous pouvez utiliser la méthode polar() de la classe Point pour déplacer un objet d'affichage d'une distance et d'un angle spécifique. Par exemple, le code suivant déplace l'objet myDisplayObject en fonction d'une distance de 100 pixels et d'un angle de 60^ :

import flashgeom.*;
var distance:Number = 100 .
var angle:Number = 2 *Math.PI * (90/360);
var translatePoint:Point = Point.polar(distance,angle);
myDisplayObject.x + = translatePoint.x;
myDisplayObject.y + = translatePoint.y;

Autres utilisations de la classe Point

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

VoupeuvezutiliserdesobjetsPoint aveclespropriétéset lesmethodes suivantes:

ClasseMéthodes ou propriétésDescription
DisplayObjectContainerareInaccessibleObjectsUnderPoint() getobject UnderPoint()Utilisée pour renvoyer une liste d'objets sous un point dans un contueur d'objet d'affichage.
BitmapDatahitTest()Utilisée pour définir le pixel dans l'objet BitmapData ainsi que le point pour lequel vous recherchez une zone active.
BitmapDataapplyFilter() copyChannel() merge() paletteMap() pixelDissolve() threshold()Utilisée pour indiquer les positions des rectangles qui définissant les opérations.
MatricedeltaTransformPoint() transformPoint()Utilisée pour définir des points auxquels vous souhaitez appliquer une transformation.
RectanglebottomRight size topLeftUtilisée pour définir ces propriétés.

Utilisation des objets Rectangle

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Un objet Rectangle définit une zone rectangulaire. Un objet Rectangle possède une position, définie par les coordonnées x et y de son angle supérieur gauche, une propriété width et une propriété height. Pour définir les propriétés d'un nouvel objet Rectangle, appelez la fonction constructeur Rectangle(), comme suit :

import flashgeomRectangle;
var rx:Number = 0 var ry:Number = 0 var rwidth:Number = 100 var rheight:Number = 50 var rect1:Rectangle new Rectangle(rx,ry,rwidth,rheight);

Redimensionnement et repositionnement des objets Rectangle

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Il existe de nombreuses façons de redimensionner et de repositionner des objets Rectangle.

Voupez redimensionner directement l'objet Rectangle en modifient ses propriétés × et y . Ce changement n'a aucune incidence sur la largeur ou la hauteur de l'objet Rectangle.

import flashgeomRectangle;
var x1:Number = 0 var y1:Number = 0 var width1:Number = 100 var height1:Number = 50 var rect1:Rectangle = new Rectangle(x1,y1, width1,height1); trace(rect1) // (x = 0 ,y=0,w=100,h=50)
rect1.x = 20 rect1.y = 30 trace(rect1); // (x = 20 ,y=30,w=100,h=50)

Comme l'illustré le code suivant, l'objet Rectangle est repositionné lorsque vous modifie la propriété left ou top correspondante. Les propriétés x et y de l'objet rectangle correspondent respectivement aux propriétés left et top. Néanmoins, la position de l'angle inférieur gauche de l'objet Rectangle ne change pas. Par conséquent, il est redimensionné.

import flashgeomRectangle;
var x1:Number = 0 var y1:Number = 0 var width1:Number = 100 var height1:Number = 50 var rect1:Rectangle = new Rectangle(x1,y1, width1,height1); trace(rect1)// (x = 0 ,y=0,w=100,h=50)
rect1.left = 20 rect1.top = 30 trace(rect1);// (x = 20 ,y=30,w=80,h=20)

De même, comme indiquédans l'exemple suivant, si vous modifie la propriété bottom ou right d'un objet Rectangle, la position de son angle supérieur gauche ne change pas. L'objet Rectangle est redimensionné en conséquence :

import flashgeomRectangle;  
var x1:Number = 0;  
var y1:Number = 0;  
var width1:Number = 100;  
var height1:Number = 50;  
var rect1:Rectangle = new Rectangle(x1, y1, width1, height1);  
trace(rect1) // (x=0, y=0, w=100, h=50)  
rect1.right = 60;  
trect1(bottom = 20;  
trace(rect1); // (x=0, y=0, w=60, h=20) 

Vou puevez également repositionner un objet Rectangle à l'aide de la méthode offset(), comme suit :

import flashgeomRectangle;  
var x1:Number = 0;  
var y1:Number = 0;  
var width1:Number = 100;  
var height1:Number = 50;  
var rect1:Rectangle = new Rectangle(x1, y1, width1, height1);  
trace(rect1) // (x=0, y=0, w=100, h=50)  
rect1-offset(20, 30);  
trace(rect1); // (x=20, y=30, w=100, h=50) 

La méthode offsetPt() fonctionne de la même façon, sauf qu'elle prend un objet Point comme paramètre,只不过 que les valeurs de décalage x et y .

Voupeq ealement redimensionner un objet Rctangle a l'aide de la methode inlrate(), quin inclut deux parametes, dx et dy. Le parametre dx representation le displacement a partir du centre des cotes croit et gauche de I'bject Rectangle, exprme en pixels. Le parametre dy representation le displacement a partir du centre du haut et du bas del'bject Rectangle, exprime en pixels.

import flashgeomRectangle;
var x1:Number = 0 .
var y1:Number = 0 .
var width1:Number = 100 .
var height1:Number = 50 .
var rect1:Rectangle = new Rectangle(x1,y1, width1,height1); trace(rect1) // (x = 0 ,y=0,w=100,h=50)
rect1.inflate(6,4);
trace(rect1); // (x = -6 ,y=-4,w=112,h=58)

La méthode inflatePt() fonctionne de la même façon, sauf qu'elle prend un object Point comme paramètre, plutôt que les valeurs de décalage dx et dy.

Recherche d'unions et d'intersections d'objects Rectangle

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Voussutilizez la methodeunion() pour rechercher la région rectangularie formee par leslimites de deux rectangles:

import flash.display.*;  
import flashgeomRectangle;  
var rect1:Rectangle = new Rectangle(0, 0, 100, 100);  
trace(rect1); // (x=0, y=0, w=100, h=100)  
var rect2:Rectangle = new Rectangle(120, 60, 100, 100);  
trace(rect2); // (x=120, y=60, w=100, h=100)  
trace(rect1.union(rect2)); // (x=0, y=0, w=220, h=160) 

Voussutilizezla methode intersection() pour rechercher la région rectangularie formee par la région commune de deux rectangles:

import flash.display.*;  
import flashgeomRectangle;  
var rect1:Rectangle = new Rectangle(0, 0, 100, 100);  
trace(rect1); // (x=0, y=0, w=100, h=100)  
var rect2:Rectangle = new Rectangle(80, 60, 100, 100);  
trace(rect2); // (x=120, y=60, w=100, h=100)  
trace(rect1.intersection(rect2)); // (x=80, y=60, w=20, h=40) 

Vous utilisez la methode intersects() pour savoir si deux rectangles se recouvre. Vous pouvez également utiliser la methode intersects() pour savoir si un objet d'affichage est dans une certaine région de la scène. Dans l'exemple de code suivant, supposez que l'espace de coordonnées du conteneur d'objet d'affichage contenant lobjet circle soit identique à celui de la scène. L'exemple indique comment utiliser la methode intersects() pour déterminer si un objet d'affichage, circle, recoupe des régions spécifiées de la scène, définies par les objets Rectangle target1 et target2:

import flash.display.*;  
import flashgeomRectangle;  
var circle:Shape = new Shape();  
circle.graphics.lineStyle(2, 0xFF0000);  
circle.graphics.drawCircle(250, 250, 100);  
addChild(circle);  
var circleBounds:Rectangle = circle.getBounds(stage);  
var target1:Rectangle = new Rectangle(0, 0, 100, 100);  
trace(circleBounds.intersects(target1)); // false  
var target2:Rectangle = new Rectangle(0, 0, 300, 300);  
trace(circleBounds.intersects(target2)); // true 

De même, vous pouvez utiliser la méthode intersects() pour savoir si les cadres de délimitation de deux objets d'affichage se chevauchent. Utilisez la méthode getRect() de la classe DisplayObject pour inclure un espace supplémentaire que les traits d'un objet d'affichage ajustent à une région de sélection.

Autres utilisations des objets Rectangle

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Les objets Rectangle sont utilisés dans les propriétés et méthodes suivantes :

ClasseMéthodes ou propriétésDescription
BitmapDataapplyFilter(), colorTransform(), copyChannel(), copyPixels(), draw(), drawWithQuality(), encode(), fillRect(), generateFilterRect(), getColorBoundsRect(), getPixels(), merge(), paletteMap(), pixelDissolve(), setPixels() et threshold()Utilisée comme type de certains paramètres pour définir une région de l'objet BitmapData.
DisplayObjectgetBounds(), getRect(), scrollRect, scale9GridUtilisée comme type de données pour la propriété ou le type de données renvoyé.
PrintJobaddPage()Utilisée pour définir le paramètre printArea.
SpritestartDrag()Utilisée pour définir le paramètre bounds.
TextFieldgetCharBoundaries()Utilisée comme type de valeur renvoyé.
TransformpixelBoundsUtilisée comme type de données.

Utilisation des objets Matrix

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La classe Matrix représentée une matrice de transformation qui détermine le mappage des points d'un espace de coordonnées à l'autre. Pour appliquer diverses transformations graphiques à un objet d'affichage, vous pouvez définir les propriétés d'un objet Matrix, puis appliquer cet objet à la propriété matrix d'un objet Transform que vous appliquez ensuite comme propriété transform de lobjet d'affichage. Ces fonctions de transformation incluent la translation (repositionnement de x et y ), la rotation, le redimensionnement et l'inclinaison.

Meme si vous pouvez définir une matrice en ajustant directement les propriétés (a, b, c, d, tx, ty) d'un objet Matrix, il est plus facile d'utiliser la méthode createBox(). Cette méthode comporte des paramétres qui vous permettent de définir directement les effets de redimensionnement, de rotation et de translation de la matrice réalisante. Par exemple, le code suivant créé un objet Matrix qui redimensionne un objet horizontallyment de 2,0, le redimensionne verticalment de 3,0, le fait pivoter de 45^ , le déplace (par translation) de 10 pixels vers la droite et de 20 pixels vers le bas :

var matrix:Matrix = new Matrix();  
var scaleX:Number = 2.0;  
var scaleY:Number = 3.0;  
var rotation:Number = 2 * Math.PI * (45 / 360);  
var tx:Number = 10;  
var ty:Number = 20;  
matrix.createBox(scaleX, scaleY, rotation, tx, ty); 

Vous pouvez également ajuster les effets de redimensionnement, de rotation et de translation d'un objet Matrix à l'aide des méthodes scale(), rotate() et translate(). Ces méthodes sont combinées aux valeurs de l'objet Matrix existant. Par exemple, le code suivant définit un objet Matrix qui redimensionné un objet d'un facteur de 4 et le fait pivoter de 60^ , car les méthodes scale() et rotate() sont appelées deux fois:

var matrix:Matrix = new Matrix();  
var rotation:Number = 2 * Math.PI * (30 / 360); // 30°  
var scaleFactor:Number = 2;  
matrix_scale(scaleFactor, scaleFactor);  
matrixrotate(rotation);  
matrix_scale(scaleX, scaleY);  
matrixrotate(rotation); 

myDisplayObject.transform.matrix = matrix;

Pour appliquer une transformation par inclinaison à un objet Matrix, ajustez sa propriété b ou c. Lorsque vous ajustez la propriété b, la matrice est inclinée verticalement et lorsque vous ajustez la propriété c, elle est inclinée horizontally. Le code suivant incline l'objet Matrix myMatrix verticalement d'un facteur de 2 :

var skewMatrix:Matrix = new Matrix();  
skewMatrix.b = Math.tan(2);  
myMatrix_concat(skewMatrix); 

Vou puez appliqueur une transformation Matrix à la propriété transform d'un objet d'affichage. Par exemple, le code suivant applique une transformation Matrix à un objet d'affichage nommé myDisplayObject :

var matrix:Matrix = myDisplayObject.transform.matrix;
var scaleFactor:Number = 2;
var rotation:Number = 2 * Math.PI * (60 / 360); // 60^ matrix_scale(scaleFactor, scaleFactor);
matrixrotate(rotation);

myDisplayObject.transform.matrix = matrix;

La première ligne définit un objet Matrix sur la matrice de transformation existante utilisé par l'objet d'affichage myDisplayObject (la propriété matrix de la propriété transformation de l'objet d'affichage myDisplayObject). Les méthodes de la classe Matrix que vous appelez ont ainsi un effet cumulatif sur la position, l'échelle et la rotation actuelles de l'objet d'affichage.

Remarque: la classe ColorTransform est également comprise dans le package flash.geometry. Cette classe sert à définir la propriété colorTransform d'un objet Transform. Etant donné qu'elle n'applique aucune transformation géométrie, elle n'est pas traitée ici. Pour plus d'informations, voir la classe ColorTransform dans le manuel Guide de réference ActionScript 3.0 pour la plate-forme Adobe Flash.

Exemple de géométrie : application d'une transformation de matrice à un objet d'affichage

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

L'exemple d'application DisplayObjectTransformer préSENTe de nombreuses fonctions permettant d'utiliser la classe Matrix pour transformer un objet d'affichage, notamment :

Rotation de l'objet d'affichage
- Redimensionnement de l'objet d'affichage
- Translation (repositionnement) de l'objet d'affichage
- Inclinaison de l'objet d'affichage

L'application fournit une interface permettant d'ajuster les paramètres de la transformation de matrice, comme suit :

ADOBE ACTIONSCRIPT 3.0 - Exemple de géométrie : application d'une transformation de matrice à un objet d'affichage - 1

Lorsque l'utilisateur clique sur le bouton de transformation, l'application applique la transformation appropriée.

ADOBE ACTIONSCRIPT 3.0 - Exemple de géométrie : application d'une transformation de matrice à un objet d'affichage - 2

ADOBE ACTIONSCRIPT 3.0 - Exemple de géométrie : application d'une transformation de matrice à un objet d'affichage - 3

L'objet d'affichage original et l'objet d'affichage pivoté de -45^ et redimensionné de 50%

Pour obtenir les fischiers d'application de cet exemple, voir www.adobe.com/go/learn_programmingAS3samplesflash_fr. Les fischiers d'application DisplayObjectTransformer se trouvent dans le dossier Samples/DisplayObjectTransformer. L'application se compose des fischiers suivants:

FichierDescription
DisplayObjectTransformer.mxml ou DisplayObjectTransformer.flaFichier d'application principal en FLA pour Flash ou en MXML pour Flex
com/example/programmingas3/geometry/MatrixTransformer.asUne classe qui contient des méthodes permettant d'appliquer des transformations de matrice.
img/Un réseau contenant des exemples de fichiers image utilisés par l'application.

Définition de la classe MatrixTransformer

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La classe MatrixTransformer comprend des méthodes statiques qui appliquent des transformations géométriques d'objets Matrix.

Méthode transform()

La méthode transform() comprend des paramètres associés à chaque élément suivant :

  • sourceMatrix—La matrice d'entrée, que la méthode transforme
  • xScale et yScale—Le facteur de redimensionnement x et y
  • dx et dy—Les montants de translation x et y , en pixels
    rotation-Le montant de rotation, en degrés
  • skew—Le facteur d'inclinaison, en pourcentage
  • skewType—Le sens d'inclinaison, "right" ou "left"

La valeur renvoyee est la matrice réalisante.

La méthode transform() appelle les méthodes statiques suivantes de la classe :

  • skew()
  • scale()
  • translate()
  • rotate()

Chacune renvoie la matrice source avec la transformation appliquée.

Méthodes skew()

La méthode skew() incline la matrice en ajustant les propriétés b et c de la matrice. Un paramètre facultatif, unit, déterminé les unités utilisées pour définir l'angle d'inclinaison et, le cas échéant, la méthode convertit la valeur angle en radians :

if(unit = = "degrees")
{ angle = Math.PI 2 angle/360;
}
if(unit = = "gradients")
{ angle = Math.PI 2 angle/100;
}

Un objet Matrix skewMatrix est créé et ajusté pour appliquer la transformation par inclinaison. Au départ, il s'agit de la matrice d'identité, comme suit :

var skewMatrix:Matrix = new Matrix(); 

Le paramètre skewSide déterminé le côté auquel l'inclinaison est appliquée. S'il est défini sur "right", le code suivant définit la propriété b de la matrice :

skewMatrix.b = Math.tan(angle); 

Autrement, le côté inférieur est incliné en ajustant la propriété c de la matrice, comme suit :

skewMatrix.c = Math.tan(angle); 

L'inclinaison résultat est ensuite appliquée à la matrice existante en concatenant les deux matrices, comme indiquédans l'exemple suivant :

sourceMatrix≌(skewMatrix); 
return sourceMatrix; 

Méthode scale()

Comme le montre l'exemple suivant, la méthode scale() ajuste d'abord le facteur de redimensionnement s'il est définissons la forme de pourcentage, puis utilise la méthode scale() de l'objet matrix :

if (percent)
{ xScale = xScale/100; yScale = yScale/100;
}
sourceMatrix.scale(xScale,yScale);
return sourceMatrix;

Méthode translate()

La méthode translate() applique simplement les facteurs de translation dx et dy en appelant la méthode translate() de l'objet matrix, comme suit :

sourceMatrix.translate(dx, dy);  
return sourceMatrix; 

Méthode rotate()

La méthode rotate() convertit le facteur de rotation d'entrée en radians (s'il est fourni en degrés ou dégradés), puis appelle la méthode rotate() de l'objet matrix :

if(unit = = "degrees")
{ angle Math.PI * 2 * angle /360;
}
if(unit = = "gradients")
{ angle Math.PI * 2 * angle /100;
}
sourceMatrixrotate(angle);
return sourceMatrix;

Appel de la méthode MatrixTransformer.transform() depuis l'application

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

L'application contient une interface utilisateur permettant d'obtenir les paramètres de transformation de l'utilisateur. Elle transmet ensuite ces valeurs, avec la propriété matrix de la propriété transform de l'objet d'affichage, à la méthode Matrix.transform(), comme suit:

tempMatrix = MatrixTransformer.transform(tempMatrix, xScaleSlider.value, yScaleSlider.value, dxSlider.value, dySlider.value, rotationSlider.value, skewSlider.value, skewSide); 

L'application applique alors la valeur renvoyee à la propriété matrix de la propriété transform de l'objet d'affichage, déclenchant ainsi la transformation :

img(content.transform.matrix = tempMatrix; 

Chapitre 12 : Utilisation de l'API de dessin

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Bien que l'importance des images et graphiques importés soit évidente, il ne faut pas négliger la fonctionnalité connue sous le nom d'API de dessin, qui permet de tracer des lignes et des formes en ActionScript. Vous pouvez ainsi ouvrir une application avec l'équivalent informatique d'une toile vierge et y créé des images. La possibilité de creator des graphiques ouvre de nouvelles possibilités pour vos applications. Les techniques générées ci-après permettent notamment de creator un programme de dessin, de réaliser des éléments artistiques animés et interactifs ou de générer par programmation vos propres éléments d'interface.

Voir aussi

flash.display Grafics

Principes de base de l'API de dessin

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

L'API de dessin est le nom des fonctionnalités intégrées à ActionScript qui permettent de créé des graphiques vectoriels (lignes, courbes, formes, replissages et dégradés) et de les afficher à l'aide d'ActionScript. Ces fonctionnalités sont prises en charge par la classe flash.display.Graphics. ActionScript permet de dessiner dans une occurrence d'un objet de type Shape, Sprite ou MovieClip, à l'aide de la propriété graphics définie dans chacune de ces classes (la propriété graphics de ces classes est en fait une occurrence de la classe Graphics).

Si vous n'avez pas l'habitude de « dessiner » par code, la classe Graphics comprend plusieurs méthodes qui facilitent le tracé de formes courantes (cercles, ellipses, rectangles et rectangles à coins arrondis). Ces tracés peuvent être des lignes vides ou des formes remplies. Si vous avez besoin de fonctionnalités plus sophistiquées, la classe Graphics compte aussi des méthodes destinées au tracé de lignes et de courbes de Bézier, qui peuvent être utilisées conjointement avec les fonctions trigonométriques de la classe Math pour créé n'importe qu'elle forme.

Les moteurs d'exécution Flash (tels que Flash Player 10, Adobe AIR 1.5 et les versions ultérieures) prennt en charge une nouvelle API de dessin, qui vous permet de tracer intégralement des formes par programmation à l'aide d'une commande unique. Une fois que vous vous étés familiarisé avec la classe Graphics et les tâches décrites dans « Bases d'utilisation de l'API de dessin », passez à « Utilisation avancée de l'API de dessin » à la page 243 pour en savoir plus sur ces fonctions.

Concepts important et terminologie

La liste de référence suivante contient des termes importants relatifs à l'utilisation de l'API de dessin :

Point d'ancrage L'un des deux points d'extrémité d'une courbe de Bézier.

Point de contrôle Point qui définit la direction et la forme d'une courbe de Bézier. Cette ligne courbe ne touche jamais le point de contrôle, mais elle s'arrondit comme si elle était tracée dans la direction de celui-ci.

Espace de coordonnées Représentation graphique des coordonnées containues dans un object d'affichage, par rapport auquel sont positionnés les éléments infant.

Remplissage Partie interieure opaque d'une forme constituée par le remplissage d'une ligne ou d'une forme ne possédant pas de ligne de contour.

Dégrade Transition progressive d'une couleur à une ou plusieurs autres couleurs (par opposition à une couleur unie).

Point Emplacement unique dans un espace de coordonnées. Dans le système de coordonnées en 2 dimensions utilisé dans ActionScript, un point est défini par son emplacement le long de l'axe x et de l'axe y (les coordonnées du point).

Courbe de Bézier quadratique Type de courbe défini par une formule mathématique déterminée. Dans ce type de courbe, la forme de la courbe est calculée à partir des positions des points d'ancrage (les points d'extrémité de la courbe) et d'un point de contrôle qui définit la forme et la direction de la courbe.

Mise à l'échelle Taille relative d'un objet par rapport à sa taille d'origine. Mettre un objet à l'échelle consiste à modifier sa taille en l'étirant ou en le rétrécissant.

Trait Ligne de contour d'une forme constituée par le replissage de cette ligne, ou forme ne possédant pas de replissage.

Translation Conversion des coordonnées d'un point d'un espace de coordonnées à un autre.

Axe Axé horizontal dans le système de coordonnées en 2 dimensions utilisé dans ActionScript.

Axe y Axe vertical dans le système de coordonnées en 2 dimensions utilisé dans ActionScript.

Classe Graphics

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Chaque objet Shape, Sprite et MovieClip possède une propriété graphics qui est une occurrence de la classe Graphics. La classe Graphics compte des propriétés et des méthodes permettant de tracer des lignes, des replissages et des formes. Pour-disposer d'un objet d'affichage qui sera uniquement utilisé comme « toile de fond » pour un dessin, utilisez une occurrence de Shape. Une occurrence de Shape est moins adaptée au dessin que les autres objets, car elle ne compte pas les fonctionnalités (inutiles dans ce type d'utilisation) des classes Sprite et MovieClip. Par contre, si vous souhaitez créé un objet d'affichage qui servira de support à du contenu graphique mais doit également pouvoir containir d'autres objets d'affichage, utilisez une occurrence de Sprite. Pour plus d'informations sur le choix des objets d'affichage en fonction de la tâche prévue, voir « Sélection d'une sous-classe de DisplayObject » à la page 179

Dessin de lignes et de courbes

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Tous les graphiques qu'il est possible de réaliser à l'aide d'une occurrence de la classe Graphics sont des tracés à l'aide de lignes et de courbes. Tous les dessins réalisés en ActionScript doivent donc suivre les mêmes étapes :

  • Définition de styles de ligne et de replissage
  • Définition de la position de dessin initiale
  • Dessin de lignes, courbes et formes (éventuèlement en déplaçant le point de tracage)
    Le cas échéant, création d'un replissage

Définition de styles de ligne et de replissage

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Pour utiliser la propriété graphics d'une occurrence de Shape, Sprite ou MovieClip, vous doivent définir le style (épaisseur et couleur de la ligne, couleur de replissage) à utiliser. A l'instar des outils de dessin d'Adobe* Flash Professional ou de toute autre application de dessin, en ActionScript vous pouvez dessiner avec ou sans trait, et avec ou sans replissage. Pour indiquer l'apparance du trait, utilisez la méthode lineStyle() ou lineGradientStyle(). Pour créé une ligne pleine, utilisez la méthode lineStyle(). Lors de l'appel de cette méthode, les valeurs les plus courantes à indiquer sont les trois premiers paramètres : épaisseur de ligne, couleur et alpha. Par exemple, la ligne de code suivante indicate que la forme myShape doit tracer des lignes de deux pixels d'épaisseur, en rouge (0x990000) et avec une opacité de 75% :

myShape.graphics.lineStyle(2, 0x990000, .75);

La valeur par défaut du paramètre alpha est 1.0 (100%), vous pouvez donc l'omettre si vous souhaitez tracer une ligne entièrement opaque. La méthode lineStyle() gère également deux autres paramètres associés à l'indice de lissage des pixels et au mode de mise à l'échelle. Pour plus d'informations sur ces paramètres, voir la description de la méthode Graphics.lineStyle() dans le manuel Guide de ↔équence ActionScript 3.0 pour la plate-forme Adobe Flash.

Pour creer une ligne degradée, utilisez la methode lineGradientStyle(). Pour plus d'informations sur cette methode, voir « Création de lignes et de replissages en dégradé » à la page 235.

Pour creer une forme remplie,appelez les methodes beginFill(),beginGradientFill(),beginBitmapFill() ou beginShaderFill() avant de debuter le dessin. La plus basique,beginFill(),accepte deux parametes: la couleur de replissage et,le cas échéant,la valeur alpha correspondante.Par exemple,pour tracer une forme avec un replissage vert uni,utilizez le code suivant (on suppose ici que vous dessinez dans un objet nommé myShape):

myShape.graphics.beginFill(0x00FF00);

L'essay d'une méthode de remplissage annule implicitly le remplissage précédement défini avant l'implémentation du nouveau. L'essay d'une méthode qui spécifie un style de trait remplace le style de trait précédent, mais ne modifie pas le remplissage précédement défini, et vice-versa.

Une fois spécifique le style de ligne et de remplissage, l'objet suivant consiste à indiquer le point de départ du dessin. L'occurrence de Graphics possède un point de tracage, tout comme la pointe d'un crayon sur une feuille de papier. Quel que soit l'emplacement du point de tracage, il représenté l'origine de l'action de dessin à partir. Initialement, un objet Graphics débute avec son point de tracage aux points 0,0 dans l'espace de coordonnées de l'objet dans lequel il dessine. Pour que le tracé débute en un autre point,appelez la méthode moveTo ( ) avant d'appeler une des méthodes de dessin. Cet appel peut être comparé à l'action de lever la pointe du crayon du papier et de l'amener à un nouvel emplacement.

Lorsque le point deTRAÇage est en place,utilisez une série d'appels aux méthodes lineTo() (pour tracer des lignes droites) et curveTo() (pour tracer des courbes).

ADOBE ACTIONSCRIPT 3.0 - Définition de styles de ligne et de replissage - 1

Pendant l'opération de dessin, vous pouvez à tout moment appeler la méthode moveTo() pour amener le point deTRAÇAGE à une nouvelle position sans dessiner.

Si vous avez defini une couleur de remplissage, vous pouvez désactiver le remplissage en appelant la méthode endFill() pendant l'opération de dessin. Si vous n'vez pas tracé de forme fermée (autrement dit, si lors de l'appoint de la méthode endFill(), le point deTRAÇAGE ne correspond pas au point de départ de la forme), lorsque vous appelez la méthode endFill(), le moteur d'exécution Flash ferme automatiquement la forme entraçant une ligne droite entre le point deTRAÇAGE actuel et l'emplacement spécifique dans le dernier appel à la méthode moveTo(). Si vous avez début un remplissage et n'vez pas appelé endFill(), tout appel à beginFill() (ou à l'une des autres méthodes de remplissage) ferme le remplissage actif et en début un nouveau.

Dessin de lignes droites

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Lorsque vous appelez la méthode lineTo(), l'objet Graphics trace une ligne droite (en utilisant le style de ligne que vous avez spécifique) entre le point deTRAÇage actuel et les coordonnées que vous transmettez en paramètres à cette méthode. Par exemple, cette ligne de code place le point deTRAÇage aux coordonnées 100, 100 puis trace une ligne jusqu'àu point 200, 200:

L'exemple suivant trace des triangles rouges et verts d'une hauteur de 100 pixels :

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La méthode curveTo() dessines une courbe de Bézier. Elle trace un arc entre deux points (appelés points d'ancrage) courbé en direction d'un troisième point (applé point de contrôle). L'objet Graphics utilise la position de tracage actuelle comme premier point d'ancrage. Lorsque vous appèez la méthode curveTo(), vous transmettez quatre paramétres: les coordonnées x et y du point de contrôle, puis les coordonnées x et y du second point d'ancrage. Par exemple, le code suivant trace une courbe entre le point 100, 100 et le point 200, 200. Le point de contrôle ayant les coordonnées 175, 125, la courbe est orientée vers la droite puis vers le bas :

L'exemple suivant trace des objets circulaires rouges et verts avec une largeur et une hauteur de 100 pixels. Notez qu'en raison même de la nature de l'equation de Bezier, ces cercles ne sont pas parfait :

Dessin de formes à l'aide des méthodes intégrées

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Pour vous permettre de tracer plus commodement des formes courantes (cercles, ellipses, rectangles et rectangles à coins arrondis), ActionScript 3.0 comporte des méthodes qui trabent automatiquement ces formes. Ces méthodes sont drawCircle(), drawEllipse(), drawRect() et drawRoundRect(), et sont toutes définies dans la classe Graphics. Elles peuvent etre utilisées à la place des méthodes lineTo() et curveTo().Notez toutefois qu'il est nécessaire de spécifier des styles de ligne et de replissage avant d'appeler ces méthodes.

L'exemple suivant dessine des carrés bleus, rouges et verts avec une largeur et une hauteur de 100 pixels. Ce code utilise la méthode drawRect() et spécifie que l'opacité de la couleur de replissage est de 50% (0,5):

varsquareSize:uint = 100 var square:Shape new Shape();
square.graphics.beginFill(0xFF0000,0.5);
square.graphics.drawRect(0,0,squareSize,squareSize);
square.graphics.beginFill(0x00FF00,0.5);
square.graphics.drawRect(200,0,squareSize,squareSize);
square.graphics.beginFill(0x0000FF,0.5);
square.graphics.drawRect(400,0,squareSize,squareSize);
square.graphics.endFill();
this.addChild(square);

Dans un objet Sprite ou MovieClip, tout contenu graphique créé à l'aide de la propriété graphics apparait toujours derrière les objets d'affichage infant contenus par cet objet. Par ailleurs, le contenu créé avec la propriété graphics n'est pas un objet d'affichage séparé. Il n'apparait donc pas dans la liste des enfants d'un objet Sprite ou MovieClip. Par exemple, l'objet Sprite suivant reçoit l'instruction de tracer un cercle avec sa propriété graphics, et un objet TextField figure dans sa liste dobjs d'affichage infant :

var mySprite:Sprite = new Sprite();  
mySprite.graphics.beginFill(0xFFCC00);  
mySprite.graphics.drawCircle(30, 30, 30);  
var label:TextField = newTextField();  
label.width = 200;  
label.text = "They call me mellow yellow...";  
label.x = 20;  
label.y = 20;  
mySpriteaddChild.label);  
thisaddChild(mySprite); 

Notez que l'objetTextField apparaît au-dessus du cercle trace avec la propriété graphics.

Dépréciation de lignes et de remplissages en dégradé

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

L'objet Graphics permet aussi de tracer des traits et des replissages avec des dégradés au lieu de couleurs unies. Pour creer un trait dégradé, utilisez la méthode lineGradientStyle(). Pour creer un replissage dégradé, utilisez la méthode beginGradientFill().

Ces deux méthodes recoivent les mêmes paramètres. Les quatre premiers sont obligatoires : type, couleurs, transparencies alpha et rapport. Les quatre suivants sont facultatifs mais peuvent être utiles pour plus de personnalisation.

  • Le premier paramètre spécifique le type de dégradé à créé. Les valeurs acceptables sont GradientType LINEAR ou GradientType.RADIAL.
  • Le deuxieme paramètre indique le tableau de valeurs colorimétriques à utiliser. Dans un dégradé linéaire, les couleurs sont organises de gauche à droite. Dans un dégradé radial, les couleurs sont organises de l'intérieur à l'extérieur. L'ordre des couleurs dans le tableau représenté l'ordre dans lequel elles sont tracées dans le dégradé.
  • Le troisième paramètre indique les valeurs de transparence alpha pour les couleurs correspondantes du paramètre précédent.
  • Le quatrième paramètre spécifique les rapport, c'est-à-dire l'importance de chaque couleur dans le dégradé. Les valeurs acceptables sont de 0 à 255. Ces valeurs ne représentent pas une hauteur ou une largeur, mais plutôt la position au sein du dégradé : 0 représentée le début du dégradé, et 255 la fin. Cette plage de rapport doit augmenter séquentiallyment et compter le même nombre d'éléments que les tableaux des couleurs et des valeurs alpha spécifiés comme deuxième et troisième paramètres.

Le cinquième paramètre, la matrice de transformation, est facultatif mais féquèment utilisé, car il représenté un moyen à la fois puissant et aisé de contrôle l'aspect du dégrade. Ce paramètre accepte une occurrence de l'objet Matrix. Le moyen le plus simple de créé un objet Matrix pour un dégrade consiste à utiliser la méthode createGradientBox() de la classe Matrix.

Définition d'un objet Matrix à utiliser avec un dégradé

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Utilisez les méthodes beginGradientFill() et lineGradientStyle() de la classe flash.display.Graphics pour définir les dégradés à utiliser dans des formes. Lorsque vous définisse un dégradé, vous fournisse une matrice comme l'un des paramètres de ces méthodes.

La façon la plus facile de définir la matrice est d'utiliser la méthode createGradientBox(), de la classe Matrix, qui définit un tableau utilisé pour définir le dégradé. Définissez l'échelle, la rotation et la position du dégradé à l'aide des paramètres transmis à la méthode createGradientBox(). La méthode createGradientBox() reçoit les paramètres suivants:

Largeur de la zone de dégradation: largeur (en pixels) sur laquelle s'étend le dégradation
- Hauteur de la zone de dégradation: hauteur (en pixels) sur laquelle s'etend le dégradation
- Rotation de la zone de dégrade : rotation (en radians) qui sera appliquée au dégrade
- Translation horizontal: distance (en pixels) de déplacement horizontal du dégradé
- Translation vertical: distance (en pixels) de déplacement vertical du dégradé

Par exemple, supposons un dégradé possédant les caractéristiques suivantes :

GradientType LINEAR
- Deux couleurs, vert et bleu, avec le tableau ratios définir sur [0, 255]
- SpreadMethod.PAD
- InterpolationMethod LINEAR_RGB

Les exemples suivantsprésent des dégradés dans lesquels le paramètre rotation de la méthode createGradientBox() varie comme indiqué, mais tous les autres régages restentinchangés:

width = 100; height = 100; rotation = 0; tx = 0; ty = 0;
width = 100; height = 100; rotation = Math.PI/4; // 45^ tx = 0; ty = 0;
width = 100; height = 100; rotation = Math.PI/2; // 90^ tx = 0; ty = 0;

Les exemples suivants presentent les effets sur un dégradé linéaire vert à bleu dans lequel les paramétres rotation, tx et ty de la méthode createGradientBox() varient comme indiqué, mais tous les autres réglages restent inchangés :

width = 50; height = 100; rotation = 0; tx = 0; ty = 0;
width = 50; height = 100; rotation = 0 tx = 50; ty = 0;
width = 100; height = 50; rotation = Math.PI/2; // 90^ tx = 0; ty = 0;
width = 100; height = 50; rotation = Math.PI/2; // 90^ tx = 0; ty = 50;

Les paramètres width, height, tx et ty de la méthode createGradientBox() ont une incidence sur la taille et la position d'un replissage en dégradé radial également, comme indiqué dans l'exemple suivant :

width = 50; height = 100; rotation = 0; tx = 25; ty = 0; 

Le code suivant produit le dernier degradé radial illustré :

import flash.display.Shape;
import flash.display.GradientsType;
import flash.geom.Matrix;
var type:String = GradientType.RADIAL;
var colors:Array = [0x00FF00 , 0x000088];
var alphas:Array = [1,1] .
var ratios:Array = [0,255] ;
var spreadMethod:String = SpreadMethod.PAD;
var interp:String = InterpolationMethod LINEAR_RGB;
var focalPtRatio:Number = 0 .
var matrix:Matrix = new Matrix();
var boxWidth:Number = 50 .
var boxHeight:Number = 100 .
var boxRotation:Number = Math.PI/2; // 90^ var tx:Number = 25 .
var ty:Number = 0 .
matrix.createGradientBox.boxWidth, boxHeight, boxRotation, tx, ty);
var square:Shape = new Shape;
square.graphics.beginGradientFill(type, colors, alphas, ratios, matrix, spreadMethod, interp, focalPtRatio);
square.graphics.drawRect(0, 0, 100, 100);
addChild(square);

Notez que la largeur et la hauteur du degradé sont déterminées par la largeur et la hauteur de la matrice du degradé,只不过 que par celles qui sont dessinées à l'aide de l'objet Graphics. Si vous dessinez avec l'objet Graphics, vous tracez ce qui existe à ces coordonnées dans la matrice du degradé. même si vous utilisez l'une des méthodes de création de forme d'un objet de type Graphics, par exemple drawRect(), le degradé n'est pas étiré en fonction de la taille de la forme dessinée: sa taille doit être spécifiée dans la matrice du degradé.

L'exemple ci-dessous illustré la différence visuelle entre les dimensions de la matrice du dégradé et celles du dessin :

var myShape:Shape = new Shape();  
var gradientBoxMatrix:Matrix = new Matrix();  
gradientBoxMatrix.createGradientBox(100, 40, 0, 0, 0);  
myShape.graphics.beginGradientFill(GradientType LINEAR, [0xFF0000, 0x00FF00, 0x0000FF], [1, 1, 1], [0, 128, 255], gradientBoxMatrix);  
myShape.graphics.drawRect(0, 0, 50, 40);  
myShape.graphics.drawRect(0, 50, 100, 40);  
myShape.graphics.drawRect(0, 100, 150, 40);  
myShape.graphics.endFill();  
this.addChild(myShape); 

Ce code trace trois dégradés avec le même style de replissage, spécifique avec une distribution égale de rouge, vert et bleu. Les dégradés sont tracés à l'aide de la méthode drawRect() avec des largeurs en pixels de 50, 100 et 150 respectivement. La matrice de dégradation qui est spécifique dans la méthode beginGradientFill() est créé avec une largeur de 100 pixels. Le premier dégradation ne couvre donc que la moitié de son spectre, le deuxième le couvre en entier, et le troisième le couvre en entier et possède 50 pixels supplémentaires de bleu à droite.

La méthode lineGradientStyle() fonctionne de façon similaire à beginGradientFill(), si ce n'est qu'outre la définition du dégradé vous devez aussi indiquer l'épaisseur du trait à l'aide de la méthode lineStyle() avant de tracer. Le code suivant trace une boîte avec untrait dégradé rouge, vert et bleu :

var myShape:Shape = new Shape();  
var gradientBoxMatrix:Matrix = new Matrix();  
gradientBoxMatrix.createGradientBox(200, 40, 0, 0, 0);  
myShape.graphics.lineStyle(5, 0);  
myShape.graphics.lineGradientStyle(GradientType LINEAR, [0xFF0000, 0x00FF00, 0x0000FF], [1, 1, 1], [0, 128, 255], gradientBoxMatrix);  
myShape.graphics.drawRect(0, 0, 200, 40);  
this.addChild(myShape); 

Pour plus d'informations sur la classe Matrix, voir « Utilisation des objets Matrix » à la page 224.

Utilisation de la classe Math avec les méthodes de dessin

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Un objet Graphics trace des cercles et des carrés, mais il permet aussi de dessiner des formes plus complexes, en particulier lorsque les méthodes de dessin sont utilisées en combinaison avec les propriétés et les méthodes de la classe Math. La classe Math contient des constantes d'intérêt général en mathématiques, telles que Math.PI (environ 3,14159265...), qui est la constante définitant le rapport entre la circonférence et le diamètre d'un cercle. Elle contient également des méthodes de fonctions trigonométriques, entre autres Math.sin(), Math.cos() et Math.tan(). L'utilisation de ces méthodes et constantes pour le dessin de formes permet d'obtenir des effets visuels plus dynamiques, en particulier en utilisant des répetitions et des récursions.

De nombreuses méthodes de la classe Math attendent des mesures circulaires en radians, et non en degrés. La conversion entre ces deux types d'unités représentée elle-même un cas d'utilisation courante de la classe Math :

var degrees = 121;  
var radians = degrees * Math.PI / 180;  
trace(radians) // 2.111848394913139 

L'exemple suivant cree une onde sinusoidale et une onde cosinusoidale, afin d'illustrer la differenc entre les methodes Math.sin() et Math.cos() pour une meme valeur.

var sinWavePosition = 100 var cosWavePosition = 200 var sinWaveColor:uint = 0xFF0000 var cosWaveColor:uint = 0x00FF00 var waveMultiplier:Number = 10 var waveStretcher:Number = 5 var i:uint;
for(i = 1 ;i < stage.stageWidth; i + + ) { var sinPosY:Number = Math.sin(i / waveStretcher) *waveMultiplier; var cosPosY:Number = Math.cos(i / waveStretcher) *waveMultiplier; graphics.beginFill(sinWaveColor); graphics.drawRect(i,sinWavePosition ^+ sinPosY,2,2); graphics.beginFill(cosWaveColor); graphics.drawRect(i,cosWavePosition ^+ cosPosY,2,2);
}

Animation avec l'API de dessin

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

L'un des avantages de la création de contenu graphique avec l'API de dessin est que ce contenu peut être repositionné à loisir. Tout ce que vous tracez peut être modifié, en modifier simplement les variables utilisées pour ce dessin. Vous pouvez donc obtenir de l'animation en changeant les variables et en retraçant, soit sur un nombre d'images donné, soit à l'aide d'un timer.

Par exemple, le code suivant change l'affichage à chaque nouvelle image (en écouteant l'évenement Event. ENTER_FRAME): il incrémente la valeur de degrés actuelle, puis ordonne à l'objet graphique d'effacer et redessiner avec la nouvelle position.

stage.frameRate = 31;
var currentDegrees:Number = 0;
var radius:Number = 40;
var satelliteRadius:Number = 6;
var container:Sprite = new Sprite();
container.x = stage.width / 2;
container.y = stage.height / 2;
addChild/container);
var satellite:Shape = new Shape();
container.addChild(satellite);
addEventListener(Event.ENTER_FRAME, doEveryFrame);
function doEveryFrame(event:Event):void
{
    currentDegrees += 4;
    var radians:Number = getRadians(currentDegrees)
    var posX:Number = Math.sin(radians) * radius;
    var posY:Number = Math.cos(radians) * radius;
    satellite.graphics.clear();
    satellite.graphics.beginFill(0);
    satellite.graphics.drawCircle(posX, posY, sate);
}
function getRadians(degrees:Number):Number
{
return degrees * Math.PI / 180;
} 

Pour produit un résultat nettement différent, vous pouvez expérimenter en modifiant les valeurs initiales au début du code, currentDegrees, radius et satelliteRadius. Par exemple, essayez en réduisant la valeur de la variable radius et/ou en augmentant la valeur de la variable totalSatellites. Ce n'est qu'un exemple simple de la façon dont l'API de dessin permet de créé du contenu visuel dont la complexité dissimule la simplicité de création.

Exemple d'utilisation de l'API de dessin : générateur algorithmique d'effets visuels

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

L'exemple de générateur algorithmique d'effets visuels trace de maniere dynamique plusieurs « satellites », des cercles qui se déplacent suivant une orbite circulaire. Les fonctionnalités presentées sont les suivantes :

  • Utilisation de l'API de dessin pour tracer une forme simple avec un aspect dynamique
  • Utilisation de l'interaction de l'utilisateur pour modifier les propriétés utilisées pour le dessin
  • Effet d'animation par effacement du contentu et retraçage à chaque nouvelle image.

L'exemple de la section précédente animait un satellite isolé à l'aide de l'événement Event. ENTER_FRAME. Cet exemple le reprend en y ajoutant un panneau de contrôle avec divers curseurs qui actualisent immédiatement l'affichage de plusieurs satellites. Dans cet exemple, le code est formalisé dans des classes externes et le code de création du satellite est imbriqué dans une boucle, en conservant une ↔idence à chaque satellite dans le tableau satellites.

Pour obtenir les fichiers d'application de cet exemple, voir

www.adobe.com/go/learn_programmingAS3samplesflash_fr. Les fichiers de l'application se trouvent dans le dossier Samples/AlgorithmicVisualGenerator. Celui-ci contient les fichiers suivants:

FichierDescription
AlgorithmsVisualGenerator.flaFichier d'application principal de Flash Professional (FLA)
com/example/programmingas3/algorithmsAlgorithmsVisualGenerator.asClasse importante les principales fonctionnalités de l'application : dessin des satellites sur la scène etactualisation des variables utilisées pour ces dessins enréponse aux événements du panneau de contrôle.
com/example/programmingas3/algorithmsControlPanel.asCette classe gère les interactions de l'utilisateur avecles curseurs et distribue les événements appropriés.
com/example/programmingas3/algorithmsSatellite.asCette classe représentée l'objet d'affichage qui tourne sur son orbite autour d'un point central et contient despropriétés relatives à son état de dessin actuel.

Définition des écouteurs

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

L'application commence par创建工作 trois écouteurs. Le premier attend qu'un événement soit distribué par le panneau de contrôle pour signaler qu'une reconstruction des satellites est nécessaire. Le second attend des changements de taille de la scène du fichier SWF. Le troisième attend le passage de chaque image du fichier SWF et son retraçage à l'aide de la fonction doEveryFrame().

Creation des satellites

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Après la définition de ces écouteurs, la fonction build() est appelée. Cette fonction appelle d'abord la fonction clear(), qui efface le contenu du tableau satellites et supprime les évientuelles formes déjà prsentes sur la scène. Cette précaution est nécessaire car la fonction build() peut être appelée à nouveau à la suite d'un événement diffusé par le panneau de contrôle, par exemple en cas de modification des couleurs. Dans ce cas, les satellites doivent être supprimés et recréés.

La fonction cree ensuite les satellites, en definissant les proprietes initiales nécessaires a cette creation, dont la variable position qui definit une position aléatoire sur l'orbite et la variable color, qui dans cet exemple ne change pas une fois que le satellite a ete create.

Lors de la création de chaque satellite, une reférence est ajoutée dans le tableau satellites. Lorsque la fonction doEveryFrame() est appelée, elle actualise tous les satellites du tableau.

Actualisation de la position des satellites

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La fonction doEveryFrame() est au cœur du processus d'animation de l'application. Elle est appelée à chaque image, donc à une fréquence identique à la cadence du fisier SWF. Les variables du dessin changent légarement, ce qui permet d'obtenir un effet d'animation.

La fonction efface d'abord tous les évventuels dessins antérieurs et retrace l'arrière-plan. Elle effectue ensuite une boucle dans le conteneur de chaque satellite et incrémente la propriété position de chaque satellite, puis actualise les propriétés radius et orbitRadius qui peuvent avoir été modifiées par suite d'une action de l'utilisateur dans le panneau de contrôle. Enfin, la nouvelle position de chaque satellite est affichée en appelant la méthode draw() de la classe Satellite.

Notez que la variable de compteur i n'est incrementee que jusqu'à la valeur de la variable visibleSatellites. En effet, si l'utilisateur a limité à l'aide du panneau de contrôle le nombre de satellites affichés, les autres satellites de la boucle ne doivent pas'être redessinés, mais masqués. La boucle chargee de cette action suit immédiatement celle qui est responsable du dessin.

Lorsque la fonction doEveryFrame() se termine, le nombre de satellites visibles (visibleSatellites) est redessené aux nouvelles positions.

Réponse aux interactions de l'utilisateur

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

L'interactivité est assurée par le panneau de contrôle, qui est géré par la classe ControlPanel. Cette classe définit pour chaque curseur un écouteur et des valeurs individuelles minimum, maximum et par défaut. Lorsque l'utilisateur déplace ces curseurs, la fonction changeSetting() est appelée. Elle actualise les propriétés du panneau de contrôle. Si la modification nécessite un nouvel affchage, un événement est distribué et pris en charge dans le fjichier principal de l'application. En fonction de la modification signalée par le panneau de contrôle, la fonction doEveryFrame() redessine chaque satellite sur la base des nouvelles variables.

Améliorations possibles

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Cet exemple est simplement destiné à illustrer la création d'effets visuels avec l'API de dessin. Il utilise relativement peu de lignes de code pour creer une animation interactive qui semble très complexe. même ainsi, cet exemple pourrait être amélioré moyonnant quelques modifications mineures. Voici quelques idées :

  • La fonction doit accreter la valeur colorimétrique du satellite.
  • La fonction doEveryFrame() pourrait réduire ou augmenter progressivement le rayon de l'orbite du satellite.
  • Il n'est pas nécessaire que l'orbite du satellite soit circulaire, la classe Math permet de le déplacer selon une sinusoidale, par exemple.
  • Les satellites pourraient utiliser une détction de collision entre eux.

L'API de dessin peut être considérée comme autre solution pour la création d'effets visuels dans l'environnement de création Flash, en dessinant des formes de base lors de l'exécution. Mais elle permet aussi de créé des effets visuels qu'il serait impossible de creator manuellement. L'API de dessin et quelques notions de mathématiques permettent au développement en ActionScript de donner vie à de nombreuses créations inattendues.

Utilisation avancée de l'API de dessin

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

Flash Player 10, Adobe AIR 1.5 et les moteurs d'exécution Flash ultérieurs prènnet en charge un jeu avancé de fonctions de dessin. Les améliorations de l'API de dessin associées à ces moteurs d'exécution, qui étendent les méthodes de dessin des versions antérieures, vous permettent de définir des ensembles de données pour générer des formes, les modifier lors de l'exécution et créé des effets tridimensionnels. Les améliorations de l'API de dessin consolident les méthodes existantes comme commandes alternatives. Ces commandes s'appuient sur des tableaux de vecteurs et des classes d'énumération pour fournir des ensembles de données aux méthodes de dessin. Les tableaux de vecteurs accélèrent le rendu de formes plus complexes. Les développpeurs peuvent modifier les valeurs des tableaux par programmation pour rendre des formes dynamiques à l'exécution.

Les nouvelles fonctions de dessins de Flash Player 10 sont décrites dans les sections suivantes: « Tracés de dessin » à la page 244, « Définition des règles d'enroulement » à la page 245, « Utilisation des classes de données graphiques » à la page 247 et « A propos de l'utilisation de drawTriangles() » à la page 250.

Voussouhaiterez probabilitem effectuer les taches suivantes a l'aide des fonctions avancées de I'API de dessin dans ActionScript :

  • Stockage des données destinées aux méthodes de dessin à l'aide d'objects Vector
  • Définition de traces pour tracer des formes par programmation en une seule opération
  • Définition de règles d'enroulement pour déterminer le replissage de formes se chevauchant
  • La lecture du contenu graphique vectoriel d'un objet d'affichage, par exemple pour sérialiser et enregistrer les données graphiques, pour générer une feuille Sprite à l'exécution ou pour dessiner une copie du contenu graphique vectoriel.
  • Utilisation de triangles et de méthodes de dessin pour obtenir des effets tridimensionnels

Concepts important et terminologie

La liste de référence suivante énumère les termes importants que vous rencontres dans cette section :

  • Vecteur : tableau de valeurs d'un type de données identique. Un objet Vector peut stocker un tableau de valeurs qu'utilisent des méthodes de dessin pour construire des lignes et des formes par le biais d'une commande unique. Pour plus d'informations sur les objets Vector, voir « Tableaux indexés » à la page 27.
  • Trace: un trace est composé d'un ou de plusieurs segments droits ou incurvés. Le début et la fin de chaque segment sont indiqués par des coordonnées qui fonctionnent à la manière d'épinges Maintenant un fil en place. Un tracé peut être fermé (un cercle, par exemple) ou ouvert, s'il comporte des extrémités distinctes (une ligne onduleuse, par exemple).
  • Enroulement : direction d'un trace tel qu'il est interprêté par le rendu, soit positive (sens horaire) soit négative (sens antihoraire).
  • GraphicsStroke : classe permettant de définir le style de ligne. Bien que le « trait » à proprement parler n'ait pas été inclus dans la nouvelle API de dessin, l'utilisation d'une classe pour désigner un style de ligne avec ses propres propriétés de replissage constitue l'une des améliorations intégrées. Vous pouvez régler dynamiquement le style d'une ligne à l'aide de la classe GraphicsStroke.
  • Objet Fill : objet créé à l'aide de classes d'affichage telles que flash.display.GraphicsBitmapFill et flash.display.GraphicsGradientFill, et transmis à la commande de dessin Graphics.drawGraphicsData(). Les objets Fill et les commandes de dessin optimisées proposent une approche de programmation plus orientée objets pour répliquer Graphics.beginBitmapFill() et Graphics.beginGradientFill().

Tracés de dessin

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

La section sur le dessin de lignes et de courbes (voir « Dessin de lignes et de courbes » à la page 231) a représenté les commandes permettant de tracer une ligne (Graphics.lineTo()) oucourbe (Graphics.curveTo())) unique, puis de la déplacer vers un autre point (Graphics.moveTo()) pour obtenir une forme. Les méthodes

Graphics.drawPath() et Graphics.drawTriangles() acceptent une série d'objets représentant ces mêmes commandes de dessin comme paramètre. Ces méthodes permettent de définir une série de commandes

Graphics.lineTo(), Graphics.curveTo() ou Graphics.moveTo()traitées par le moteur d'exéciution Flash en une seule instruction.

La classe d'énumération GraphicsPathCommand définit une série de constantes qui correspondent aux commandes de dessin. Vous transmettez une série de ces constantes (encapsulées dans une occurrence de Vector) comme paramètre de la méthode Graphics.drawPath(). Vous pouvez ensuite rendre une forme entière ou plusieurs formes à l'aide d'une seule commande. Vous pouvez aussi modifier les valeurs transmises à ces méthodes pour modifier une forme existante.

Outre l'occurrence Vector des commandes de dessin, la méthode drawPath() a besoin d'un ensemble de coordonnées qui correspondent aux coordonnées de chaque commande de dessin. Créez une occurrence de Vector contenant des coordonnées (instances de Number) et transmettez-la à la méthode drawPath() comme second argument (data).

Remarque : les valeurs du vecteur ne sont pas des objets Point. Le vecteur est une série de nombres, dont chaque paire représentée une paire de coordonnées x / y

La méthode Graphics.drawPath() fait correspondre chaque commande à ses valeurs de point respectives (une série de deux ou quatre nombres) pour générer un trace dans l'objet Graphics :

package
{ import flash.display.*; public class DrawPathExample extends Sprite { public function DrawPathExample(){ var squareCommands:Vector. = new Vector.(5, true); squareCommands[0] = GraphicsPathCommand.MOVE_TO; squareCommands[1] = GraphicsPathCommand.LINE_TO; squareCommands[2] = GraphicsPathCommand.LINE_TO; squareCommands[3] = GraphicsPathCommand.LINE_TO; squareCommands[4] = GraphicsPathCommand.LINE_TO; var squareCoord:Vector. = new Vector.(10, true); squareCoord[0] = 20 //x squareCoord[1] = 10 //y squareCoord[2] = 50 . squareCoord[3] = 10 . squareCoord[4] = 50 . squareCoord[5] = 40 . squareCoord[6] = 20 . squareCoord[7] = 40 . squareCoord[8] = 20 . squareCoord[9] = 10 graphics.beginFill(0x442266);//set the color graphics.drawPath(squareCommands, squareCoord); } }

Définition des règles d'enroulement

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

L'API de dessin améliorée prend désormais en charge le concept d'« enroulement » de trace, qui définit la direction de ce dernier. L'enroulement d'un trace est soit positif (sens horaire) soit négatif (sens antihoraire). L'ordre dans lequel le rendu interpréte les coordonnées que fournit le vecteur au paramètre data déterminé l'enroulement.

ADOBE ACTIONSCRIPT 3.0 - Définition des règles d'enroulement - 1

Enroulement positif et négatif A. Les flèches indiquent la direction du tracé. B. Enroulement positif (sens horaire) C. Enroulement négatif (sens antihoraire)

En outre, vous remarquerez que la methode Graphics.drawPath() possede un troisieme parametre facultatif, appelé « winding »:

drawPath(com commands:Vector., data:Vector., winding:String = "evenOdd"):void

Dans ce contexte, le troisième paramètre est une chaîne ou une constante qui détermine la règle d'enroulement ou de replissage de tracés se croissant (les valeurs de constante sont définies dans la classe GraphicsPathWinding sous la forme GraphicsPathWinding.EVEN_ODD ou GraphicsPathWinding.NON_ZERO). La règle d'enroulement est importante lorsque des tracés se croisent.

Règle d'enroulement standard, la règle pair-impair est utilisé par l'API de dessin hériété. C'est aussi la règle par défaut de la méthode Graphics.drawPath(). Lorsqu'elle est appliquée, des tracés qui se croisent alternent entre des replissages ouverts et fermés. Si deux carres utilisant un même replissage se croisent, la zone d'intersection est remplie. En règle générale, les zones adjacentes ne sont pas remplies ou leur replissage n'est pas effacé.

La règle non null, en revanche, se fonde sur l'enroulement (direction du tracé) pour déterminer si les zones définies par des tracés qui se croisent sont remplies. Lorsque des tracés dont l'enroulement est différent se croisent, la zone définie n'est pas remplie, comme avec la règle pair-impair. Si l'enroulement est identique, la zone dont le replissage serait effacé est remplie :

ADOBE ACTIONSCRIPT 3.0 - Définition des règles d'enroulement - 2
Règles d'enroulement associée aux zones d'intersection
A. Règle d'enroulement pair-impair B. Règle d'enroulement non nul

Nom des règes d'enroulement

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

Les noms se réferent à une règle beaucoup plus spécifique qui définit comment ces replissages sont gérés. On afferce aux chemins d'enroulement positifs une valeur +1 et aux négatifs une valeur -1. A partir d'un point au sein d'une surface close d'une forme, tirez un trait qui s'étend indéfiniment. Le nombre de fois que cette ligne traverse un chemin, ainsi que les valeurs combinées de ces chemins, est utilisé pour déterminer le replissage. Pour des enroulements pair-impair, c'est le nombre de fois que la ligne traverse un chemin qui est utilisé. Lorsque le décompte est un nombre impair, la zone est remplie. Lorsqu'il est impair, la zone ne l'est pas. Pour des enroulements non nuls, ce sont les valeurs affectées aux chemins qui sont utilisées. Lorsque les valeurs combinées du chemin ne sont pas nulles, la zone est remplie. Lorsque la valeur combinée est 0, la zone n'est pas remplie.

ADOBE ACTIONSCRIPT 3.0 - Nom des règes d'enroulement - 1
Règles de décompte et replissage d'enroulements
A. Regle d'enroulement pair-impair B. Regle d'enroulement non nul

Utilisation des règes d'enroulement

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

Ces règles de replissage sont complexes mais elles s'avertient nécessaires dans certaines situations. Par exemple, prenons le dessin d'une forme étoilée. Suivant la règle pair-impair standard, la forme nécessiterait dix lignes différentes. Suivant la règle d'enroulement non nul, ces dix lignes sont réduites à cinq. Voici le code ActionScript pour une étoile à cinq lignes et une règle d'enroulement non nul :

graphics.beginFill(0x60A0FF);

graphics.drawPath( Vector.([1,2,2,2,2]), Vector.([66,10,23,127,122,50,10,49,109,127]), GraphicsPathWinding.NON_ZERO);

Et voici la forme de l'étoile :

ADOBE ACTIONSCRIPT 3.0 - Utilisation des règes d'enroulement - 1
Une forme d'etoiel qui utilise differentes régles d'enroulement
A. 10 lignes en pair-impair B. 5 lignes en pair-impair C. 5 lignes non nulles

Et, comme les images sont animées ou utilisées comme textures sur des objets à trois dimensions et qu'elles se recouvent, les règles d'enroulement deviennent plus importantes.

Utilisation des classes de données graphiques

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

L'API de dessin amélioré inclut un ensemble de classes dans le package flash.display qui met en œuvre l'interface IGraphicsData. Ces classes fonctionnent comme des objets de valeur (conteneurs de données) qui représentent les méthodes de l'API de dessin.

Les classes suivantes implémentent l'interface IGraphicsData :

  • GraphicsBitmapFill
  • GraphicsEndFill

  • GraphicsGradientFill

  • GraphicsPath
  • GraphicsShaderFill
  • GraphicsSolidFill
  • GraphicsStroke
  • GraphicsTrianglePath

Ces classes vous permettent de stocker un dessin complet dans un objet Vector de type IGraphicsData (Vector.). Vous pouvez ensuite réutiliser les données graphiques comme source de données pour les autres instances de la forme ou pour stocker les informations de dessin pour une utilisation ultérieure.

Vous remarquerez qu'il existe plusieurs classes de remplissage (Fill) correspondant à chaque style de remplissage, mais une seule classe de trait (Stroke). ActionScript propose une seule classe de trait IGraphicsData car elle définit son style sur la base des classes de remplissage. Ainsi, chaquetrait est en faitdéfini par une combinaison de la classe stroke et d'une classe fill. Pour le reste, l'API de ces classes de données graphiques est identique aux méthodes qu'elles représentent dans la classe flash.display Graphics:

Méthode graphiqueClasse correspondante
beginBitmapFill()GraphicsBitmapFill
beginFill()GraphicsSolidFill
beginGradientFill()GraphicsGradientFill
beginShaderFill()GraphicsShaderFill
lineBitmapStyle()GraphicsStroke + GraphicsBitmapFill
lineGradientStyle()GraphicsStroke + GraphicsGradientFill
lineShaderStyle()GraphicsStroke + GraphicsShaderFill
LineStyle()GraphicsStroke + GraphicsSolidFill
moveTo() lineTo() curveTo() drawPath()GraphicsPath
drawTriangles()GraphicsTrianglePath

En outre, la classe GraphicsPath possede ses propres methodes d'utilitaire (GraphicsPath.moveTo(), GraphicsPath.lineTo(), GraphicsPath.curveTo(), GraphicsPath.widthLineTo() et GraphicsPath.widthMoveTo()) pour simplifier la definition de ces commandes pour une occurrence de GraphicsPath. Ces methodes facilitent la definition ou la mise a jour directe des commandes et des valeurs de données.

Réalisation d'un dessin avec les données graphiques vectorielles

Lorsque vous disposez d'une série d'instances de IGraphicsData, utilisez la méthode drawGraphicsData() de la classe Graphics pour effectuer le rendu des graphiques. La méthode drawGraphicsData() exécute un ensemble d'instructions de dessin à partir d'un vecteur d'instances de IGraphicsData en séquence :

// stroke object  
var stroke: GraphicsStroke = new GraphicsStroke(3);  
stroke.joints = JointStyle.MITER;  
stroke fills = new GraphicsSolidFill(0x102020); // solid stroke 
// fill object  
var fill: GraphicsGradientFill = new GraphicsGradientFill();  
fillcolors = [0x0000FF, 0xEFFFFEE];  
fill.matrix = new Matrix();  
fill.matrix.createGradientBox(70, 70, Math.PI/2);  
// path object  
var path: GraphicsPath = new GraphicsPath(new Vector.<int>(), new Vector.<Number>();  
path Commands.push(GraphicsPathCommand.MOVE_TO, GraphicsPathCommand.LINE_TO, GraphicsPathCommand.LINE_TO);  
path.data.push(125, 0, 50, 100, 175, 0); 
// combine objects for complete drawing  
var drawing:Vector.<IGraphicsData> = new Vector.<IGraphicsData>();  
drawing.push(stroke, fill, path); 

En modifiant une valeur du trace utilisé par le dessin de l'exemple, il est possible de retracer la forme plusieurs fois pour obtenir une image plus complexe :

Bien que les objets IGraphicsData puissant définir des styles de replissage et de trait, ceux-ci ne sont pas obligatoires. Autrement dit, il est possible de définir des styles à l'aide des méthodes de la classe Graphics ou d'utiliser des objets IGraphicsData pour tracer un ensemble enregistré de tracés, et inversement.

Remarque: la méthode Graphics.clear() permet d'effacer un dessin avant d'en commencer un nouveau, à moins que vous ne complétiez le dessin d'origine, comme l'illustrer l'exemple ci-dessus. Lorsque vous modifiez une partie d'un tracé ou d'un ensemble d'objets IGraphicsData, retracez le dessin entier pour visualiser les changements.

Lorsque vous utilisez des classes de données graphiques, le replissage est rendu chaque fois que trois points au moins sont tracés car la forme est nécessairement fermée à ce point. Bien que le replissage ait un effet de fermeture, ce n'est pas le cas du trait. Ce comportement est différent de celui de commandes Graphics.lineTo() ou Graphics.moveTo() utilisées plusieurs fois.

Lecture de données graphiques vectorielles

Flash Player 11.6 et les versions ultérieures, Adobe AIR 3.6 et les versions ultérieures

Dans Flash Player 11.6, Adobe AIR 3.6 et versions ultérieures, vous pouvez utiliser la méthode readGraphicsData() de la classe Graphics non seulement pour tracer le contenu vectoriel d'un objet d'affichage, mais aussi pour obtenir une représentation en données du contenu graphique vectoriel de cet objet. Ceci peut être utilisé pour créé un instantané d'un graphique afin notamment d'enregistrer, de copier ou de créé une feuille Sprite lors de l'exécution.

L'appeil de la méthode readGraphicsData() renvoie une occurrence de Vector contenant des objets IGraphicsData. Il s'agit des mêmes objets que ceux utilisés pour tracer des graphiques vectoriels à l'aide de la méthode drawGraphicsData().

Plusieurs limitations s'appliquent à la lecture des graphiques vectoriels avec la méthode readGraphicsData(). Pour plus d'informations, voir l'entrée readGraphicsData() dans le Guide de référence ActionScript.

A propos de l'utilisation de drawTriangles()

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

Une autre méthode avancée intégrée à Flash Player 10 et Adobe AIR 1.5, Graphics.drawTriangles(), s'apparente à la méthode Graphics.drawPath(). La méthode Graphics.drawTriangles() utilise également un objet Vector. pour spécifique les points permettant de dessiner un trace.

La méthode Graphics.drawTriangles() a néanmoins pour but principal de faciliter la création d'effets tridimensionnels par le biais d'ActionScript. Pour plus d'informations sur l'utilisation de Graphics.drawTriangles() pour produit des effets tridimensionnels, voir « Création d'effets 3D à l'aide de triangles » à la page 375.

Chapitre 13 : Utilisation des images bitmap

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Outre ses possibilités en matière de dessin vectoriel, ActionScript 3.0 permet également de créé des images bitmap ou de manipuler les données de pixels d'images bitmap externes charges dans un fisier SWF. Cette capacité de dire et modifier des valeurs de pixel individuelles permet de creation des effets visuels comme ceux des filtres et d'utiliser les fonctions intégrées de gestion du « bruit » pour créé des textures et des bruits aléatoires.

  • Renaun Erickson: Rendering game assets in ActionScript using blitting techniques (disponible en anglais uniquement)
  • Bitmap programming: chapitre 26 du document Essential ActionScript 3, par Colin Moock (O'Reilly Media, 2007, disponible en anglais uniquement)
  • Mike Jones: Working withSprites in Pushbutton Engine (disponible en anglais uniquement)
  • Flash & Math: Pixel Particles Made Simple (disponible en anglais uniquement)
  • Fixel

Principes de base de l'utilisation des images bitmap

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Tout travail avec des images numériques nécessite de gérer deux types de graphismes : les bitmaps et les graphismes vectoriels. Les images bitmap, également appelées graphismes en points, sont composées de petits carrés (les pixels) organisés en une grille rectangulaire. De leur côté, les graphismes vectoriels sont composés de formes géométriques (lignes, courbes et polygons) générées à l'aide de formules mathématiques.

Les images bitmap sont définies par la largeur et la hauteur de l'image, mesurées en pixels, et par le nombre de bits contenu dans chaque pixel (ce nombre de bits définit le nombre de couleurs que peut composer l'image). Dans le cas d'une image bitmap utilisant le modèle colorimétrique RVB, les pixels sont composés de trois octets : rouge, vert et bleu. Chaque octet contient une valeur comprise entre 0 et 255. C'est la combinaison de ces octets pour chaque pixel qui produit une valeur, un peu comme le mélange des couleurs de base par un peintre. Par exemple, un pixel contenant les valeurs 255, 102 et 0 respectivement pour les octets dévolus au rouge, au vert et au bleu produit un orange vif.

La qualité d'une image bitmap est déterminée en combinant la résolution en pixels de l'image avec sa profondeur de couleur exprimée en bits ou en octets. La résolution définit le nombre de pixels contenus dans l'image. Plus le nombre de pixels est important, plus la résolution est élevé et plus l'image semble bien définie. La profondeur de couleurs définit la quantité d'informations colorimétriques containues par chaque pixel. Par exemple, une image ayant une profondeur de couleur de 16 bits par pixel ne peut pas représentier un nombre de nuances aussi élevé qu'une image ayant une profondeur de couleur de 48 bits. En conséquence, l'image sur 48 bits aura plus de nuances que la version sur 16 bits.

Dans la mesure où les images bitmap dépendent de la résolution, il est liécat de modifier leur échelle, ce qui se remarque particulièrement avec les images bitmap agrandies, qui perdent beaucoup de détails et de qualité.

Format des fichiers bitmap

Les images bitmap existent en divers formats de fisier. Ces formats utilisent différents types d'algorithmes de compression pour réduire la taille des fisiers et optimiser la qualité de l'image en fonction de sa destination. Les moteurs d'exécution Adobe gérènt les formats d'image bitmap BMP, GIF, JPG, PNG et TIFF.

BMP

Le format BMP (pixelisé) est un format d'image par défaut utilisé par le système d'exploitation Microsoft Windows. Il ne fait appel à aucune forme d'algorithmme de compression ; il en résultat généralement des tailles de fichiers assez importantes.

GIF

Le format GIF (Graphics Interchange Format) fut développé à l'origine par CompuServe en 1987, dans le but de transmettre des images en 256 couleurs (codées sur 8 bits). Ce format, qui permet d'obtenir des fischiers de petite taille, est très utilisé pour les images sur le Web. Toutefois, en raison de son nombre limité de couleurs, ce format n'est pas adapté aux photographies, qui nécessitent en général un nombre de nuances plus élevé. Les images GIF autorisent la transparence sur un bit, ce qui permet de prendre les couleurs invisibles (ou transparentes). C'est ainsi que sont produits les fonds transparentes des images de pages Web.

JPEG

Développè par le Joint Photographic Experts Group (JPEG), le format d'image JPEG (souvent noté.JPG) fait appel à un algorithme de compression avec perte pour autoriser une profondeur de couleur de 24 bits avec une taille de fidchier très réduite. En raison de la compression avec perte, chaque fois que l'image est enregistrée elle perd des données, donc de la qualité, mais la taille de fidchier réalisante en est d'autant plus réduite. Le format JPEG est idéal pour les photographies, car il permet d'afficher des millions de couleurs différentes. La possibilité de contrôle le taux de compression appliqué à l'image permet de modifier la qualité de l'image et la taille du fidchier.

PNG

Le format PNG (Portable Network Graphics) a été créé comme autre possibilité gratuite (open source) au format de fichier GIF, qui est breveté. Les fichiers PNG acceptent jusqu'à 64 bits de profondeur de couleur, ce qui permet d'obtenir jusqu'à 16 millions de couleurs. Le format PNG étant relativement récent, les versions ancienne des certains navigateurs ne gérènt pas ces fichiers. Contrairement au JPG, le format PNG utilise une compression sans perte, ce qui signifie qu'aucune donnée de l'image n'est perdue lors de l'enregistrement. De plus, les fichiers PNG acceptent également la transparence alpha, ce qui autorise jusqu'à 256 niveaux de transparence.

TIFF

Le format TIFF (ou Tagged Image File Format) était le format multiplate-forme de besoin avant l'arrivée de PNG. Le format TIFF a un inconvenient qui est la multiplicité de ses variétés : aucun lecteur n'est en mesure detraiter toutes les versions disponibles. De surcroît, les navigateurs Web ne prennant pas en charge ce format actuellément. TIFF peut utiliser une compression avec ou sans pertes et il est en mesure de traiter des espaces de couleurs spécifique au pérophérique tels que CMJN (cyan-magenta-jaune-noir).

Fichiers bitmap transparents et opaques

Les images bitmap qui utilisent le format GIF ou PNG peuvent accompter pour chaque pixel un octet supplémentaire pour le canal alpha. Cet octet de pixel supplémentaire représenté la valeur de transparence du pixel.

Les images GIF n'autorisent la transparence que sur la base d'un bit, ce qui ne permet de spécifier la transparence que pour une seule couleur (dans une palette de 256 couleurs). Par contre, les images PNG acceptent jusqu'à 256 niveaux de transparence. Cette caractéristique est particulièrement intéressante pour « fondre » les images ou le texte avec l'arrête-plan.

ActionScript 3.0 permet de:gérer cet octet supplémentaire de transparence à l'aide de la classe BitmapData. Comme le modele de transparence PNG, ActionScript propose jusqu'à 256 niveaux de transparence.

Concepts important et terminologie

La liste suivante content des termes importants relatifs aux graphiques bitmap :

Alpha Niveau de transparence (ou, plus précisé, d'opacité) d'une couleur ou d'une image. La valeur alpha est frequently appelée valeur du canal alpha.

Couleur ARGB Modèle colorimétrique suivant lequel la couleur de chaque pixel est définie selon ses composants rouge, vert et bleu, ainsi que par sa transparence spécifique comme valeur alpha.

Canal de couleur En général, les couleurs sont représentées par le mélange des couleurs primaires, rouge, vert et bleu (pour les graphiques sur ordinateur). Chaque couleur primaire est considérée comme un canal de couleur. C'est le mélange des proportions de chaque canal de couleur qui détermine la couleur finale.

Codage des couleurs Parfois appelée codage, cette caractéristique détermine la quantité de mémoire vivie dévolue à chaque pixel, ce qui, indirectement, définit le nombre de couleurs qu'il est possible d'afficher dans l'image.

Pixel Unité d'information de base d'une image bitmap (fondamentalement, un point coloré).

Résolution Dimensions d'une image en pixels, qui détermine le niveau de détails fins d'une image. La résolution est féquement exprimée en nombre de pixels pour la largeur et la hauteur.

Couleur RVB Modèle colorimétrique suivant lequel la couleur de chaque pixel est définie selon ses composants rouge, vert et bleu.

Classes Bitmap et BitmapData

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Les principales classes ActionScript 3.0 d'utilisation des images bitmap sont la classe Bitmap, qui permet d'afficher les images bitmap à l'écran, et la classe BitmapData, qui permet d'acceder et de manipuler les données brutes d'une image bitmap.

Voir aussi

flash.display.Bitmap

flash.displayBitmapData

Présentation de la classe Bitmap

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Sous-classe de la classe DisplayObject, la classe Bitmap est la principale classe utilisée en ActionScript 3.0 pour l'affichage d'images bitmap. Ces images sont souvent chargées par le biais de la classe flash.display.Loader ou créées dynamiquement à l'aide du constructeur Bitmap(). En cas de chargement d'une image provenant d'une source externe, un objet Bitmap ne peut contenir que des images aux formats GIF, JPEG ou PNG. L'occurrence de l'objet Bitmap peut être considérée comme enveloppe d'un objet BitmapData devant être affché sur la scene. Une occurrence de Bitmap étant un objet d'affichage, toutes les caractéristiques et fonctionnalités des objets d'affichage peuvent être utilisées pour la manipuler. Pour plus d'informations sur l'utilisation des objets d'affichage, voir « Programming de l'affichage » à la page 156.

Accrochage et lissage des pixels

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Outre les fonctionnalités communés à tous les objets d'affichage, la classe Bitmap dispose de quelques fonctionnalités supplémentaires, propres aux images bitmap.

La propriété pixelSnapping de la classe Bitmap déterminé si un objet Bitmap accroche le pixel le plus proche. Cette propriété accepte l'une des trois constantes définies dans la classe PixelSnapping : ALWAYS, AUTO et NEVER.

La syntaxe de l'accrochage aux pixels est la suivante :

myBitmappixelSnapping = PixelSnapping.ALWAYS;

Lorsque des images bitmap sont redimensionnées, il est souvent qu'elles deviennent floues et distordues. Pour réduire cette distorsion, utilisez la propriété smoothing de la classe BitmapData. Lorsque cette propriété boolée ne sa valeur true, elle adoucit les pixels par un effet d'anticrènelage appliqué aux images redimensionnées. Celles-ci ont alors un aspect plus clair, plus naturel.

Présentation de la classe BitmapData

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La classe BitmapData, qui se trouve dans le package flash.display, peut être comparée à un cliché photographique des pixels d'une image bitmap, que celle-ci soit chargée ou créé dynamiquement. Ce cliché est représenté par une grille de données des pixels de l'objet. La classe BitmapData contient également une série de méthodes permettant de créé et modifier des données de pixels.

Pour instancier un objet BitmapData, utilisez le code suivant :

var myBitmap:BitmapData = new Bitmap(width:Number, height:Number, transparent:Boolean, fillColor:uinit);

Les paramètres width et height déterminent la taille de l'image bitmap. Dans AIR 3 et Flash Player 11 et les versions ultérieures, les limites de taille pour un object BitmapData ont été supprimées. La taille maximale d'une image bitmap dépend du système d'exploitation.

Dans AIR 1.5 et Flash Player 10, la taille maximale d'un objet BitmapData est de 8 191 pixels en largeur ou en hauteur, et le nombre total de pixels ne peut pas excéder 16 777 215 pixels (ainsi, si la largeur d'un objet BitmapData est de 8 191 pixels, sa hauteur maximale doit être de 2 048 pixels). Dans Flash Player 9 et les versions antérieures, ainsi que dans AIR 1.1 et les versions antérieures, la limite est de 2 880 pixels de haut sur 2 880 pixels de large.

Le paramètre transparent indique si l'image bitmap comporte un canal alpha (true) ou non (false). Le paramètre fillColor est une valeur colorimétrique sur 32 bits qui spécifie la couleur d'arrière-plan, ainsi que la valeur de la transparence (si cette dernière est true). L'exemple suivant create un object BitmapData dont l'arrière-plan orange est transparent à 50% :

var myBitmap:BitmapData = new BitmapData(150, 150, true, 0x80FF3300);

Pour afficher un objet BitmapData nouvellement créé, affectez-le à une occurrence de Bitmap. Pour ce faire, vous pouvez soit transmettre l'objet BitmapData sous forme de paramètre du constructeur de l'objet Bitmap, ou l'affector à la propriété bitmapData d'une occurrence de Bitmap existante. Vous devez également affecter cette occurrence de Bitmap à la liste d'affichage en appelant la méthode addChild() ou addChildAt() du conteneur d'objet d'affichage qui contienda cette occurrence de Bitmap. Pour plus d'informations sur l'utilisation de la liste d'affichage, voir « Ajout d'objects d'affichage à la liste d'affichage » à la page 165.

L'exemple suivant create un object BitmapData avec un replissage rouge, et l'affiche dans une occurrence de Bitmap :

var myBitmapDataObject:BitmapData = new BitmapData(150, 150, false, 0xFF0000);
var myImage:Bitmap = new Bitmap(myBitmapDataObject);
addChild(myImage);

Manipulation des pixels

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La classe BitmapData contient des méthodes qui permettent de modifier les valeurs des données de pixels.

Manipulation individuelle de pixels

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Pour modifier une image bitmap au niveau des pixels, il est d'abord nécessaire d'obtenir les valeurs colorimétriques des pixels de la zone à modifier. La méthode getPixel() permet d'obtenir ces valeurs de pixels.

La méthode getPixel() renvoie les valeurs RVB des coordonnées (de pixels) x et y qui lui sont passées en paramétres. Si l'un des pixels comporte des informations de transparence (canal alpha), il est nécessaire d'utiliser la méthode getPixel32(). Cette méthode recupère également une valeur RVB, mais contrairement à ce qui se passé avec getPixel(), la valeur renvoyée par getPixel32() contient des données supplémentaires qui représentent la valeur du canal alpha (transparence) du pixel sélectionné.

Pour simplement modifier la couleur ou la transparence d'un pixel contenu dans un bitmap, il est aussi possible d'utiliser la méthode setPixel() ou setPixel32(). Pour définir la couleur d'un pixel, il suffit de passer les coordonnées x et y et la valeur colorimétrique à l'une de ces méthodes.

Dans l'exemple suivant, setPixel() est utilisé pour tracer une croix sur un fond vert BitmapData. La méthode getPixel() permet ensuite de récapierer la valeur colorimétrique du pixel ayant les coordonnées 50, 50 et de suivre la valeur renvoyée.

import flash.display.Bitmap;
import flash.display.BitmapData;
var myBitmapData:BitmapData = new BitmapData(100, 100, false, 0x009900);
for (var i:uint = 0 .i<100;i++) { var red:uint = 0xFF0000; myBitmapData.setPixel(50,i,red); myBitmapData.setPixel(i,50,red);
}
var myBitmapImage:Bitmap = new Bitmap(myBitmapData); addChild(myBitmapImage);
var pixelValue:uint = myBitmapData.getPixel(50,50); tracepixelValue.toString(16));

Pour dire la valeur d'un groupe de pixels, et non pas d'un pixel isolé, utilisez la méthode getPixels(). Cette méthode génére un tableau d'octets à partir d'une zone rectangulaire de données de pixels, et le passé en paramètre. Chaque élément du tableau d'octets (autrement dit, les valeurs des pixels) est un entier non signé (valeurs non multipliées sur 32 bits).

Inversement, pour modifier (ou définir) la valeur d'un groupe de pixels, utiliser la méthode setPixels(). Cette méthode attend deux paramètres (rect et inputByteArray), qui sont combinés pour produit une zone rectangulaire (rect) de données de pixels (inputByteArray).

Au fur et à mesure de la lecture (ou de l'écriture) des données dans inputByteArray, la méthode

Array.readUnsignedInt() est appelée pour chaque pixel du tableau. Si pour une raison quelconque inputArray ne contient pas un rectangle complet de données de pixels, la méthode interrupt le traitement des données de l'image.

Il est important de comprendre que pour生存 ou modifier des données de pixels, le tableau d'octets attende les valeurs suivantes sur 32 octets : alpha, rouge, vert, bleu (ARVB).

L'exemple suivant utilise les méthodes getPixels() et setPixels() pour copier un groupe de pixels d'un objet BitmapData à un autre :

import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.utils.ByteArray;
import flashgeomRectangle;
var bitmapDataObject1:BitmapData = new BitmapData(100,100,false,0x006666FF);
var bitmapDataObject2:BitmapData = new BitmapData(100,100,false,0x00FF0000);
var rect:Rectangle = new Rectangle(0,0,100,100);
var bytes:ByteArray = bitmapDataObject1.getPixels(rect);
bytes.position = 0 .
bmpdataObject2.setPixels(rect,bytes);
var bitmapImage1:Bitmap = new Bitmap(bitmapDataObject1);
addChild(bitmapImage1);
var bitmapImage2:Bitmap = new Bitmap(bitmapDataObject2);
addChild(bitmapImage2);
bmpImage2.x = 110

Détection de collision au niveau des pixels

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La méthode BitmapData_hitTest() effectue une détction de collision au niveau des pixels entre les données bitmap et celles d'un autre object ou d'un point.

La méthode BitmapData_hitTest() accepte cinq paramètres :

  • firstPoint (Point): ce paramètre référence la position du coin supérieur gauche du premier objet BitmapData sur lequel le test de collision doit être effectué.
  • firstAlphaThreshold (uint) : ce paramètre spécifique la valeur la plus élevé du canal alpha considéré comme étant opaque pour ce test de collision.
  • secondObject (Object) : ce paramètre représenté la zone d'impact. L'objet secondObject peut être un objet de type Rectangle, Point, Bitmap ou BitmapData. Cet objet représenté la zone dans laquelle doit être effectuee la détction de collision.
  • secondBitmapDataPoint (Point) : ce paramètre facultatif définit l'emplacement d'un pixel dans le deuxième objet BitmapData. Utilisez uniquement ce paramètre lorsque la valeur de secondObject est un objet BitmapData. La valeur par défaut est null.

  • secondAlphaThreshold (uint) : ce paramètre facultatif représenté la valeur la plus élevé de canal alpha considérée comme étant opaque dans le deuxième objet BitmapData. La valeur par défaut est 1. Utilisez uniquement ce paramètre lorsque la valeur de secondObject est un objet BitmapData et que les deux objets BitmapData sont transparents.

Lors d'une détction de collision sur des images opaques, n'oubliez pas qu'actionScript traite l'image comme si c'était un rectangle entière opaque (ou un cadre de selection). Par ailleurs, lors de tests de collision au niveau des pixels pour des images qui sont transparentes, les deux images doivent être transparentes. De plus, ActionScript utilise les paramétres de seuil alpha pour déterminer le point auquel les pixels passent de transparentes à opaques.

L'exemple suivant cree trois images bitmap et teste une eventuelle collision de pixels en deux differents points (l'un renvoie false, l'autre true):

import flash.display.Bitmap;
import flash.display.BitmapData;
import flashgeom.Point;
var bmd1:BitmapData = new BitmapData(100, 100, false, 0x000000FF);
var bmd2:BitmapData = new BitmapData(20, 20, false, 0x00FF3300);
var bm1:Bitmap = new Bitmap(bmd1);
this.addChild(bm1);
// Create a red square.
var redSquare1:Bitmap = new Bitmap(bmd2);
this.addChild(redSquare1);
redSquare1.x = 0;
// Create a second red square.
var redSquare2:Bitmap = new Bitmap(bmd2);
this.addChild(redSquare2);
redSquare2.x = 150;
redSquare2.y = 150;
// Define the point at the top-left corner of the bitmap.
var pt1:Point = new Point(0, 0);
// Define the point at the center of redSquare1.
var pt2:Point = new Point(20, 20);
// Define the point at the center of redSquare2.
var pt3:Point = new Point(160, 160);
trace(bmd1.hitTest(pt1, 0xFF, pt2)); // true
trace(bmd1.hitTest(pt1, 0xFF, pt3)); // false

Copie de données bitmap

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Vous disposez de plusieurs méthodes pour copier les données bitmap d'une image à une autre : clone(), copyPixels(),copyChannel(),draw() et drawWithQuality() (la méthode drawWithQuality est disponible dans Flash Player 11.3 et les versions ultérieures et dans AIR 3.3 et les versions ultérieures).

Comme son nom l'indique, la méthode clone() permet de cloner, ou échantillonner, des données bitmap d'un objet BitmapData à un autre. Cette méthode renvoie un nouvel objet BitmapData qui est un clone exact de l'occurrence originale.

L'exemple suivant clone une copie d'un carré orange (parent) et place le clone à côté du carré parent original :

import flash.display.Bitmap;  
import flash.display.BitmapData; 
var myParentSquareBitmap:BitmapData = new BitmapData(100, 100, false, 0x00ff3300);  
var myClonedChild:BitmapData = myParentSquareBitmap clones(); 
var myParentSquareContainer:Bitmap = new Bitmap(myParentSquareBitmap); this.addChild(myParentSquareContainer); 

var myClonedChildContainer:Bitmap = new Bitmap(myClonedChild); this.addChild(myClonedChildContainer); myClonedChildContainer.x = 110

La méthode copyPixels() permet de copier rapidement et aisément des pixels d'un object BitmapData dans un autre. Cette méthode prend un « cliché » rectangulaire (défini par le paramètre sourceRect) de l'image source et le copie dans une autre zone rectangulaire de taille égale. L'emplacement du rectangle ainsi « collé » est défini par le paramètre besoin.

La méthode copyChannel() analyse une valeur de canal de couleur prédéfini (alpha, rouge, vert ou bleu) dans unobjet source BitmapData et la copie dans un canal donné de l'objet BitmapData de destination. Cette méthode n'attecte pas les autres canaux de l'objet BitmapData de destination.

Les méthodes draw() et drawWithQuality() dessinent ou affichent le contenu graphique d'un objet d'affichage source (Sprite, Clip, etc.) dans un nouveau bitmap. Les paramètres matrix, colorTransform,blendMode et clipRect permettent de modifier l'aspect du nouveau bitmap. Cette méthode utilise le programme de rendu vectoriel de Flash Player et AIR pour générer les données.

Pour appeler la méthode draw() ou drawWithQuality(), vous doivent lui transmettre l'objet source (Sprite, Clip ou tout autre objet d'affichage) comme premier paramètre, comme ci-dessous:

myBitmap.draw/movieClip);

Si des transformations (couleur, matrice, etc.) ont ete appliquees a l'objet source apres son chargement, ces transformations ne sont pas copiees dans le nouvel objet. Pour copier les transformations dans le nouveau bitmap, vous devez copier la valeur de la propriete transform de I'objet original dans la propriete transform del'objet Bitmap qui utilise le nouvel objet BitmapData.

Compression des données d'une image bitmap

Flash Player 11.3 et les versions ultérieures, AIR 3.3 et les versions ultérieures

La méthode flash.display.Data encode() permet de compresser de façon native les données d'une image bitmap dans l'un des formats de compression d'image suivants :

  • PNG: utilise la compression PNG, en ayant eventuellement recours à une compression rapide pour augmente la vitesse de compression selon la taille du filchier. Pour utiliser la compression PNG, transmettez un nouvel objet flash.display.PNGEncoderOptions comme second paramètre de la méthode BitmapData encode().

  • JPEG : utilise la compression JPEG, en spécifient éventuèlement la qualité de l'image. Pour utiliser la compression JPEG, transmettez un nouvel object flash.display.JPGEncoderOptions comme second paramètre de la méthode BitmapData.encode().

  • JPEGXR : utilise la compression JPEG Extended Range (XR), en spécifient éventuellesment les paramétres Canal de couleur, Avec perte et Entropie. Pour utiliser la compression JPEGXR, transmettez un nouvel objet flash.display.JPEGXREncoderOptions comme second paramètre de la méthode BitmapData. encode().

Vouss pouvez utiliser cette fonction pour le traitement des images dans le cadre d'un flux de chargement ou de téléchargement sur le serveur.

L'exemple de fragment de code suivant compresse l'objet BitmapData avec JPEGEncoderOptions :

// Compress a BitmapData object as a JPEG file.  
var bitmapData:BitmapData = new BitmapData(640,480,false,0x00FF00);  
var byteArray:ByteArray = newByteArray();  
bitmapData.encode(new Rectangle(0,0,640,480), new flash.display.JPEGEncoderOptions(), byteArray); 

Creation de textures avec les fonctions de bruit aléatoire

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Pour modifier l'aspect d'un bitmap, vous pouvez lui appliquer un effet de bruit à l'aide de la méthode noise() ou de la méthode perlinNoise(). La « neige » qui apparait sur l'écran d'un téléviseur mal régle est du bruit, ou du souffle.

Pour appliquer un effet de bruit à un bitmap, utilisez la méthode noise(). Cette méthode applique une valeur colorimétrique aléatoire aux pixels de la zone spécifique d'une image bitmap.

Cette méthode accepte cinq paramètres :

  • randomSeed (int) : valeur aléatoire de départ qui déterminera le motif. En début du nom de ce paramètre, une même valeur pour ce nombre produit toutes le même résultat. Pour obtenir un résultat veritablement aléatoire, utilisez la méthode Math.random() pour transmettre un nombre aléatoire pour ce paramètre.
  • low (uint): ce paramètre représenté la valeur la plus faible à générer pour chaque pixel (de 0 à 255). Sa valeur par défaut est 0. Les valeurs les plus basses produit un motif de bruitASF, les valeurs les plus élevées produit un motif de plus en plus clair.
  • high (uint): ce paramètre représenté la valeur la plus élevé à générer pour chaque pixel (de 0 à 255). La valeur par défaut est 255. Les valeurs les plus basses produits un motif de bruitASF, les valeurs les plus elevées produits un motif de plus en plus clair.
  • channelOptions (uint) : ce paramètre indique le canal de couleur de l'objet bitmap auquel le motif de bruit sera appliqué. Ce nombre peut être une combinaison quelconque des quatre valeurs des canaux de couleur (ARVB). La valeur par défaut est 7.
  • grayScale (Boolean): lorsque ce paramètre est activé (true), la valeur de randomSeed est appliquée aux pixels du bitmap, ce qui donne concretement un effet de délavé sur toutes les couleurs de l'image. Le canal alpha n'est pas affecté par ce paramètre. La valeur par défaut est false.

L'exemple suivant cree une image bitmap et lui applique un motif de bruit bleu :

package   
{ import flash.display.Sprite; import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.BitmapDataChannel; public class BitmapNoise1 extends Sprite { public function BitmapNoise1() { var myBitmap:BitmapData = new BitmapData(250, 250,false, 0xff000000); myBitmap.noise(500, 0, 255, BitmapDataChannel.BLUE,false); var image:Bitmap = new Bitmap(myBitmap); addChild(image); } } 

Si vous souhaitez créé une texture d'aspect plus organique, utilisez la méthode perlinNoise(). La méthode perlinNoise() produit des textures organiques plus réalisistes, qui sont ideales pour des effets de fumée, de nuage, d'eau, de flamme ou même d'explosion.

Comme la méthode perlinNoise() fait appel à un algorithme, elle nécessite moins de mémoire vivie que les textures à base de bitmaps. Elle peut malgré tout consommer beaucoup de ressources processeur, ce qui risque de ralentir le contenu et de provoquer des actualisations d'écran plus lentes que la cadence nominale, en particulier sur les ordinateurs plus anciens. En effet, les algènithmes de cette méthode effectuent des calculs en virgule flottante.

Cette méthode accepte neuf paramètres (les six premiers sont obligatoires):

  • baseX (Number): déterminée la valeur x (taille) des motifs créés.
  • baseY (Number): déterminée la valeur y (taille) des motifs créés.
  • numOctaves: (uint) : nombre d'octaves ou fonctions de bruit individuelles à combiner pour creer ce bruit. Les nombres d'octaves élevés offrent davantage de détails mais nécessitent également un temps de traitement plus important.
  • randomSeed (int) : la valeur aléatoire de départ fonctionne exactement comme dans la fonction noise(). Pour obtenir un résultat vérifiablement aléatoire, utilisez la méthode Math.random() pour transmettre un nombre aléatoire pour ce paramètre.
  • stitch (Boolean): si la valeur est true, cette méthode tente de lisser les bords de transition de l'image pour creer des textures sans bords définis, en vue d'une utilisation en mosaïque.
  • fractalNoise (Boolean): ce paramètre concerne les bords des dégradés générés par cette méthode. S'il a la valeur true, la méthode génére un bruit fractal qui adoucit le pourtour. S'il a la valeur false, la méthode génére des turbulences. Les dégradés d'une image créé avec des turbulences représentant des discontinuitemes visibles qui permettent de很好地 restituer certains effets visuels comme les flammes ou les vagues.
  • channelOptions (uint) : le paramètre channelOptions fonctionne exactement comme dans la méthode noise(). Il indique le canal de couleur de l'objet bitmap auquel le motif de bruit sera appliqué. Ce nombre peut être une combinaison quelconque des quatre valeurs des canaux de couleur (ARVB). La valeur par défaut est 7.
  • grayScale (Boolean): le paramètre grayScale fonctionne exactement comme dans la méthode noise(). Si ce paramètre est activé (true), la valeur de randomSeed est appliquée aux pixels du bitmap, ce qui donne concretement un effet de délavé sur toutes les couleurs de l'image. La valeur par défaut est false.

  • offsets: (Array): un tableau de points correspondant aux décalages x et y pour chaque octave. En modifiant les valeurs de décalage, vous pouvez faire défiler en continu les calques d'une image. Chaque point du tableau de décalage affecte une fonction de bruit pour une octave spécifique. La valeur par défaut est nu11.

L'exemple suivant create un objet BitmapData de 150 x 150 pixels qui appelle la méthode perlinNoise() pour générer un effet de nuage vert et bleu :

package
{ import flash.display.Sprite; import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.BitmapDataChannel; public class BitmapNoise2 extends Sprite { public function BitmapNoise2() { var myBitmapDataObject:BitmapData = new BitmapData(150, 150, false, 0x00FF0000); var seed:Number = Math.floor(Math.random() * 100); var channels:uint = BitmapDataChannel.Green | BitmapDataChannel.BLUE myBitmapDataobject.perlinNoise(100, 80, 6, seed, false, true, channels, false, null); var myBitmap:Bitmap = new Bitmap(myBitmapDataObject); addChild(myBitmap); } }

Défilament du contenu d'images bitmap

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Supposons que vous avez créé une application cartographique. Chaque fois que l'utilisateur déplace la carte, vous doiventactualiser l'affichage (meme si le plan n'a ete déplaced que de quelques pixels).

Pour obtenir cette fonctionnalité, il est possible de réafficher une nouvelle image contenant le plan actualisé à chaque déplacement. Il est également possible de créé une grande image globale et d'utiliser la méthode scroll().

La méthode scroll() copie une image bitmap affichée et la colla à un nouvel emplacement, spécifique par les paramètres (x, y). S'il se trouve qu'une partie de l'image est située hors écran, l'effect obtenu est celui d'un défilament de l'image. Si cette fonction est combinée avec un timer (ou un événement enterFrame), l'image semble animée.

L'exemple suivant reprend l'exemple précédent et génére une image bitmap de grande taille (dont les trois-quarts sont restitués hors scene). La méthode scroll() est alors appliquée. Grâce à un écouteur pour l'évenement enterFrame, l'image est décalée d'un pixel en diagonale vers le bas. Cette méthode est appelée pour chaque nouvelle image. Les parties de l'image non affichées initialement apparaisent alors peu à peu sur la scene grâce à ce défilament.

import flash.display.Bitmap;
import flash.display.BitmapData;
var myBitmapDataObject:BitmapData = new BitmapData(1000, 1000, false, 0x00FF0000);
var seed:Number = Math.floor(Math.random() * 100);
var channels:uint = BitmapDataChannel.GREEN | BitmapDataChannel.BLUE;
myBitmapDataObject.perlinNoise(100, 80, 6, seed, false, true, channels, false, null);
var myBitmap:Bitmap = new Bitmap(myBitmapDataObject);
myBitmap.x = -750 .
myBitmap.y = -750 .
addChild(myBitmap);
addEventListener(Event.ENTER_FRAME, scrollBitmap);
function scrollBitmap(event:Event):void { myBitmapDataObjectscroll(1, 1); }

Utilisation du mipmapping

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Les mipmaps sont des images bitmap qui sont regroupées et associées à une texture dans le but d'améliorer la qualité et les performances d'affichage à l'exécution. Chaque image bitmap dans le mipmap est une version de l'image bitmap principale, mais à un niveau de détails réduit.

Par exemple, vous pouvez dispose d'un mipmap qui inclut une image principale à une qualité optimale de 64 × 64 pixels. Les images de qualité inférieure dans le mipmap seront de 32 × 32 , 16 × 16 , 8 × 8 , 4 × 4 , 2 × 2 et de 1 × 1 pixels.

La diffusion en continu de texture fait reférence à la capacité de charger tout d'abord les images bitmap de qualité inférieure, puis d'afficher progressivement les images bitmap de qualité supérieure au fur et à mesure de leur chargement. Etant donné que les bitmaps de qualité inférieure sont de petites images, elles se chargeant plus rapidement que l'image principale. Par conséquent, les utilisateurs de l'application peuvent afficher l'image dans une application avant le chargement de l'image bitmap principale de qualité supérieure.

Flash Player 9.115.0 (et les versions ultérieures) et AIR implémente cette technique (dite de mip-mapping), en créant des versions optimisées à diverses échelles de chaque bitmap (en partant de 50% ).

Flash Player 11.3 et AIR 3.3 prenant en charge la diffusion en continu de textures via le paramètre streamingLevels des méthodes Context3D.createCubeTexture() et Context3D.createTexture().

La compression de texture permet d'enregistrer des images de texture au format compressé directement sur le GPU en vue d'économiser la mémoire GPU et la bande passante. En règle générale, les textures sont compressées hors ligne et téléchargeées sur le GPU au format compressé. Néanmoins, Flash Player 11.4 et AIR 3.4 prennant en charge la compression de texture à l'exécution, utile dans certaines situations, notamment lors du rendu des textures dynamiques d'une illustration vectorielle. Pour utiliser la compression de texture à l'exécution, procédez comme suit :

  • Créez l'objet de texture en appelant la méthode Context3D.createTexture(), et en transmettant flash.display3D(Context3DTextureFormat.COMPRESSIONÉ ou flash.display3D(Context3DTextureFormat.COMPRESSIONÉ ALPHA dans le troisième paramètre.

  • A l'aide de l'occurrence flash.display3D.textures.Texture renvoyee par createTexture(), appelez la méthode flash.display3D.textures.Texture.uploadFromBitmapData() ou flash.display3D.textures.Texture.uploadFromByteArray(). Ces méthodes permettent de télécharger et de compresser simultanément la texture.

Les mipmaps sont créées pour les types de bitmap suivants :

  • Une image bitmap (fichiers JPEG, GIF ou PNG) affichée par le biais de la classe Loader d'ActionScript 3.0.
  • Une image bitmap dans la bibliothèque d'un document Flash Professional.
  • Un objet BitmapData.
  • Une image bitmap affichée à l'aide de la fonction loadMovie() d'ActionScript 2.0.

Les mipmaps ne sont pas appliqués aux objets filtrés ni aux clips dont les bitmaps sont en cache. En revanche, ils sont appliqués si un objet d'affchage filtré contient des transformations de bitmap, même si le bitmap se trouve dans un contenu masqué.

Le mipmapping est executé automatiquement, mais les quelques conseils suivants vous permetront d'être certain que vos images bénéficient de cette optimisation :

Pour la lecture video, definissez la propriete smoothing sur true pour l'objet Video (voir la classe Video).
- Pour les bitmaps, il n'est pas nécessaire de définir la propriété smoothing sur true, mais l'activation de cette propriété assure une amélioration visible de la qualité.
- Utilisez des tailles de bitmap divisibles par 4 ou 8 pour les images bidimensionnelles (affichage 640 × 128 , qui peut être réduit comme suit: 320 × 64 > 160 × 32 > 80 × 16 > 40 × 8 > 20 × 4 > 10 × 2 > 5 × 1 ).

Pour les textures tridimensionnelles, utilisez des mipmaps dans lesquels la résolution de chaque image est une puissance de 2 (2^) . Par exemple, la résolution de l'image principale est de 1024× 1024 pixels. Les images de qualite inférieure dans le mipmap seront a 512× 512 , 256× 256 , 128× 128 jusqu'à 1× 1 pixels pour un total de 11 images dans le mipmap.

Notez que le mip-mapping ne gère pas un contentu de bitmap dont la largeur ou la hauteur est impaire.

Exemple d'objet Bitmap : lune en rotation animée

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

L'exemple de lune en rotation animée illustré les techniques d'utilisation des objets Bitmap et des données d'image bitmap (objets BitmapData). L'exemple create une animation d'une lune sphérique en rotation et utilise comme données d'image brutes une image plane de la surface de la lune. Les techniques suivantes sont illustrées :

  • Chargement d'une image externe et accès aux données d'image brutes correspondantes
  • Création d'une animation par copie répétée des pixels de différentes parties d'une image source
  • Création d'une image bitmap par définition de la valeur des pixels

Pour obtenir les fichiers d'application de cet exemple, voir

www.adobe.com/go/learn_programmingAS3samplesflash_fr. Les fichiers d'application de la lune en rotation animée résident dans le dossier Samples/SpinningMoon. L'application se compose des fichiers suivants :

FichierDescription
SpinningMoon.mxml ou SpinningMoon.flaLe fichier d'application principal dans Flex (MXML) ou Flash (FLA).
com/example/programmingas3/moon/MoonSphere.asClasse exécutant le chargement, l'affichage et l'animation de la lune.
moonMap.pngFichier image contenant une photographie de la surface de la lune, charge et utilisé pour créé la lune en rotation animée.

Chargement d'une image externe comme données bitmap

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La première tâche à exécuter dans cet exemple consiste à charger une image externe, une photographie de la surface de la lune. Le chargement est géré par deux méthodes de la classe MoonSphere : le constructeur MoonSphere (), qui lance le processus de chargement, et la méthode imageLoadComplete(), qui est appelée au terme du chargement de l'image externe.

Le chargement d'une image externe est similaire à celui d'un fisier SWF externe : il est réalisé par une occurrencie de la classe flash.display.Loader. Le code ci-après de la méthode MoonSphere () commence à charger l'image :

var imageLoader:Loader = new Loader();

imageLoader(contentLoaderInfo.addEventListener(Event.COMPLET, imageLoadComplete);

imageLoader.load(new URLLRequest("moonMap.png"));

La première ligne déclare l'occurrence de Loader appelée imageLoader. La troisième ligne commence le processus de chargement à PROPREMENT parler en appelant la méthode load() de l'objet Loader. Cette méthode transmet une occurrence URLRequest représentant l'URL de l'image à charger. La deuxième ligne définit l'écouteur d'évenement qui se déclenchera à l'issue du chargement de l'image. Observe que la méthode addEventListener() n'est pas appelée sur l'occurrence de Loader elle-même, mais sur la propriété contentLoaderInfo de l'objet Loader.

L'occurrence de Loader n'envoie pas d'événements en rapport avec le contenu charge. En revanche, sa propriété contentLoaderInfo contient une référence à l'objet LoaderInfo qui est associé au contenu charge dans l'objet Loader (en l'occurrence, l'image externe). L'objet LoaderInfo génére des événements en rapport avec le déroulement et la fin du chargement du contenu externe, notamment l'événement complete (Event.COMPLET) qui déclenché un appel à la méthode imageLoadComplete() au terme du chargement de l'image.

S'il est essentiel de lancer le chargement de l'image externe, il est tout aussi important de savoir comment procéder au terme de cette opération. Comme l'illustrer le code ci-dessus, la fonction imageLoadComplete() est appelée une fois l'image chargée. Cette fonction exécute diverses opérations sur les données chargesées, comme indiqué ultérieurement. Cependant, pour utiliser les données d'image, elle doit pouvoir y acceder. Une image externe chargeée par le biais d'un objet Loader devient une image Bitmap jointe en tant qu'objet d'affichage infant de l'objet Loader. Dans ce cas, la méthode écouteur d'évenement a accès à l'occurrence de Loader dans l'objet événement transmis en tant que paramètre à la méthode. Les premières lignes de la méthode imageLoadComplete() sont les suivantes :

private function imageLoadComplete(event:Event):void { textureMap = event.target/content bitmapData; } 

Notez que le paramètre de l'objet événement s'appléve event et que c'est une occurrence de la classe Event. Chaque occurrence de la classe Event possède une propriété target, qui fait ↔reference à l'objet déclenchant l'événement (en l'occurrence, l'occurrence de LoaderInfo sur laquelle la méthode addEventListener() a été appelée, comme indiqué plus haut). De même, l'objet LoaderInfo possède une propriété content qui, à l'issue du chargement, contient une occurrence de Bitmap相对较 l'image bitmap chargée. Pour afficher l'odore directement à l'écran, vous pouvez joindre cette occurrence de Bitmap (event.target(content) à un conteneur d'objet d'affichage (vous pouvez aussi joindre l'objet Loader à un conteneur d'objet d'affichage). Toutefois, dans cet exemple, le contenu charge n'est pas affchéé à l'écran, il est utilisé en tant que données d'image brutes. Par conséquent, la première ligne de la méthode imageLoadComplete() lit la propriété bitmapData de l'occurrence de Bitmap chargée

(event.target(content bitmapData) et la stocke dans la variable d'occurrence de textureMap, qui est utilisée en tant que source des données d'image pour creator l'animation de la lune en rotation. Ce processus est décrit ci-après.

Creation d'une animation par copie de pixels

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Une animation, dans sa définition la plus simple, est l'illusion d'un mouvement ou d'un changement, créé par la modification graduelle d'une image. Cet exemple a pour but de creator l'illusion d'une lune sphérique tournant sur son axe vertical. Cependant, pour les besoin de l'animation, vous pouvez ne pas tener compte de l'aspect de distorsion sphérique de l'exemple. Examinez l'image chargée et utilisée comme source des données d'image de la lune :

ADOBE ACTIONSCRIPT 3.0 - Creation d'une animation par copie de pixels - 1

Comme vous pouvez le constater, l'image ne representation pas une ou plusieurs sphères ; c'est une photographie rectangulaire de la surface de la lune. La photographie ayant eté pris à l'emplacement exact de l'équateur de la lune, les parties supérieures et inférieures de l'image sont donc étiirées et déformées. Pour supprimer la distorsion de l'image et lui redonnner son aspect sphérique, nous utiliserons un filtre Mappage de déplacement (voir plus bas). Toutefois, l'image source étant un rectangle, il suffit que le code fasse glisser horizontally le photographie de la surface de la lune pour creer l'illusion d'une sphère en rotation.

Observe que l'image contient en fait deux copies juxtaposées de la photographie de la surface de la lune. Cette image représenté l'image source dans laquelle des données ont été copiées plusieurs fois pour creer un effet de mouvement. La juxtaposition de deux copies de l'image facilité la création d'un effet de défilament continu. Examinons en detail le processus d'animation afin de mistrés le comprendre.

Le processus s'applique à deux objets ActionScript distincts. Le premier de ces objets est l'image source chargée qui, dans le code, est représentée par l'occurrence de BitmapData textureMap Comme nous l'avons vu, les données d'image sont insérées dans textureMapès le chargement de l'image externe à l'aide de ce code :

textureMap = event.target/content bitmapData;

Le contenu de textureMap correspond à l'image de la lune rectangulaire. En outre, pour creer la rotation animée, le code utilise l'occurrence de Bitmap sphere, qui representation l'objet d'affichage qui affiche l'objet de la lune à l'écran. A l'instar de textureMap, l'objet sphère contient les données d'image initiales de la méthode imageLoadComplete(), ainsi que le stipule le code suivant:

sphere = new Bitmap();

sphere.capData = new CapsData(capMap.width / 2, textureMap.height);

sphere.tif Data.copyPixels逵Map,

new Rectangle(0, 0, sphere.width, sphere.height),

new Point(0, 0));

Comme vous pouvez le constater, sphere est instancié. La hauteur et la largeur de sa propriété bitmapData (les données d'image brutes qui sont affichées par sphere) sont identiques à celles de textureMap. Autrement dit, le contenu de sphere a la même taille qu'une seule photographie de la lune (puisque l'image textureMap contient deux photographies juxtaposées). Des données d'image sont ensuite insérées dans la propriété bitmapData à l'aide de sa méthode copyPixels(). Les paramètres de l'appeal de la méthode copyPixels() donnent plusieurs indications:

  • Le premier paramètre indique que les données d'image copiees proviennent de textureMap.
  • Le deuxième paramètre, une nouvelle occurrence de Rectangle, détermine qu'elle partie de textureMap est copieé. En l'occurrence, le cliché est un rectangle dont l'origine coïncide avec le coin supérieur gauche de textureMap (ce qu'indiquent les deux premiers paramètres de Rectangle(): 0, 0) et dont la largeur et la hauteur correspondant aux propriétés width et height de sphere.
  • Le troisième paramètre, une nouvelle occurrence de Point avec des valeurs de x et y égales à 0, définit la destination des données de pixel; en l'occurrence, le coin supérieur gauche (0, 0) de sphere bitmapData.

Representé visuellement, le code copie les pixels de textureMap mis en évidence ci-dessous et les colle sur sphere.

Autrement dit le contentu BitmapData de sphere correspond à la partie de textureMap mise en évidence :

ADOBE ACTIONSCRIPT 3.0 - Creation d'une animation par copie de pixels - 2

Pour rappel, il s'agit seulement de l'état initial desphere, le contenu de la première image copiee sur sphere.

Une fois l'image source chargee et sphere creé, il ne reste plus à la méthode imageLoadComplete() qu'à définir l'animation. L'animation est pilotée par une occurrence de Timer, rotationTimer, créée et lancée par le code suivant :

var rotationTimer:Timer = new Timer(15);

rotationTimer.addEventListener(TimerEvent.TIMER, rotateMoon);

rotationTimer.start();

Le code commence par创建工作 l'occurrence de Timer rotationTimer. Le paramètre passé au constructeur Timer() indique que rotationTimer doit déclencher son événement timer toutes les 15 milliseconds. La méthode addEventListener() qui est appelée ensuite stipule que le déclenchement de l'évenement timer

(TimerEvent.TIMER) entraine l'objet de la méthode rotateMoon(). Enfin, l'objet de la méthode start() du timer entraine le démarrage de celui-ci.

De par la définition de rotationTimer, Flash Player appelle la méthode rotateMoon() dans la classe MoonSphere environ toutes les 15 milliseconds, ce qui se traduit par l'animation de la lune. Le code source de la méthode rotateMoon() est le suivant:

private function rotateMoon(event:TimerEvent):void { sourceX += 1; if (sourceX > textureMap.width / 2) { sourceX = 0; } sphere.Data.copyPixels(textureMap, new Rectangle(sourceX, 0, sphere.width, sphere.height), new Point(0, 0)); event.updateAfterEvent(); } 

Ce code effectue trois opérations :

1 La valeur de la variable sourcex (initiallement fixée à 0) est incrémentée d'une unité.

sourceX += 1; 

sourceX permet de déterminer d'ou proviennent, dans textureMap, les pixels copés sur sphère. Ce code déplace donc le rectangle d'un pixel vers la droite sur textureMap. comme le montre l'illustration suivante, après plusieurs cycles d'animation, le rectangle source s'est déplaced de plusieurs pixels vers la droite :

ADOBE ACTIONSCRIPT 3.0 - Creation d'une animation par copie de pixels - 3

Après plusieurs autres cycles, le rectangle se trouve encore plus à droite.

ADOBE ACTIONSCRIPT 3.0 - Creation d'une animation par copie de pixels - 4

C'est sur ce déplacement progressif constant de l'emplacement d'origine des pixels copés que repose l'animation. Par un déplacement lent mais continu de l'emplacement source vers la droite, l'image affichée à l'écran dans sphère semble continulement glisser vers la gauche. C'est pourquoi l'image source (textureMap) doitContainir deux copies de la photographie de la surface de la lune. Comme le rectangle se déplace continuèlement vers la droite, il chevauché généralement les deux photographies et non pas seulement l'une d'elles.

2 Ce lent déplacement vers la droite donne cependant lieu à un problème. Le rectangle finira par atteindre le bord croit de textureMap et ne trouvera plus de pixels à copier sur sphère :

ADOBE ACTIONSCRIPT 3.0 - Creation d'une animation par copie de pixels - 5

Les lignes suivantes du code permettent de résoudre ce problème :

if (sourceX >= textureMap.width / 2)  
{ sourceX = 0; } 

Le code vérifie si sourcex (le bord gauche du rectangle) a atteint le milieu de textureMap. Si tel est le cas, il remet la variable sourcex à 0 ; autrement dit, il la ramène au bord gauche de textureMap, et le cycle recommence :

ADOBE ACTIONSCRIPT 3.0 - Creation d'une animation par copie de pixels - 6

3 Une fois la valeur de sourceX appropriée calculée, la dernière étape du processus d'animation consiste à copier les pixels du nouveau rectangle source sur sphere. Pour ce faire, nous repreneurs le code qui a initialement rempli sphère (voir plus haut), à la différence près que, dans l'appel du constructeur new Rectangle(), le bord gauche du rectangle est place à sourceX:

sphere.capData.copyPixels(capTURE, new Rectangle(sourceX, 0, sphere.width, sphere.height), new Point(0, 0)); 

Pour rappel, ce code est appelé toutes les 15 milliseconds. Comment l'emplacement du rectangle source change constamment et que les pixels sont copés sur sphere, à l'écran, la photographie de la lune représentée par sphere semble glisser continuèlement. En d'autres termes, la lune semble tourner sur elle-même continuèlement.

Définition de l'aspect sphérique

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La lune est bien entendu sphérique, ce n'est pas un rectangle. La photographie rectangulaire de la surface lunaire, qui fait l'objet d'une animation constante, doit donc être convertie en sphère. Cette opération comprend deux étapes : un masque cache tout le contenu excepté une partie circulaire de la photographie et un filtré Mappage de déplacement déforme l'apparace de la photographie, lui donnant un aspect tridimensionnel.

Dans un premier temps, un masque circulaire cache entiement le contenu de l'objet MoonSphere excepte la sphère créé par le filtr. Le code suivant create le masque, une occurrence de Shape, et l'applique a I'occurrence de

MoonSphere :

Comme MoonSphere est un objet d'affichage (fondé sur la classe Sprite), il est possible d'appliquer directement le masque à l'occurrence de MoonSphere à l'aide de sa propriété mask hériteit.

ADOBE ACTIONSCRIPT 3.0 - Définition de l'aspect sphérique - 1

Il ne suffit pas d'occulter des parties de la photographie à l'aide d'un masque circulaire pour creer un effet réaliste de sphère en rotation. En raison de la façon dont la photographie de la surface lunaire a été prise, ses dimensions ne sont pas proportionnelles. les parties supérieures et inférieures de l'image sont déformées et étiées par rapport aux zones équatoriales. Pourdéformer l'apparce de la photographie et lui donner un aspect tridimensionnel, nous allons utiliser un filtr Mappage de déplacement.

Ce type de filtrer permet de déformer une image. En l'occurrence, nous allons déformer la photographie de la lune pour lui donner un aspect plus réaliste, en compressant horizontally les parties supérieures et inférieures de l'image sans toucher à son milieu. En supposant que le filtré intervienne sur une partie carrée de la photographie, la compression du haut et du bas mais pas du milieu aura pour effet de convertir le carré en cercle. L'animation de cette image déformée a un effet secondaire : la distance en pixels parcourue par le milieu de l'image semble supérieure à celle couverte par les parties supérieure et inférieure, d'ou l'impression que le cercle est en fait un objet tridimensionnel (une sphère).

Le code suivant permet de creer un filtr Mappage de displacement appelé displaceFilter:

var displaceFilter:DisplacementMapFilter;

displaceFilter = new DisplacementMapFilter(fisheyeLens, new Point(radius, 0), BitmapDataChannel.RED, BitmapDataChannel.Green, radius, 0); 

Le premier paramètre, fisheyeLens, est l'image de mappage; en l'occurrence, un objet BitmapData créé par programmation. La création de cette image est décrite dans « Création d'une image bitmap par définition de la valeur des pixels » à la page 270. Les autres paramètres décrivent l'emplacement d'application du filtre au sein de l'image filtrée, les canaux colorimétriques utilisés pour régir l'effet de déplacement et leur impact sur celui-ci. Une fois le filtre Mappage de déplacement créé, il est appliqué à sphère, toujours dans la méthode imageLoadComplete():

L'image finale, une fois le masque et le contrôle appliqués, se présente comme suit :

ADOBE ACTIONSCRIPT 3.0 - Définition de l'aspect sphérique - 2

A chaque cycle du processus d'animation de la lune en rotation, le contenu BitmapData de sphère est remplaced par un nouveau cliché des données d'image source. Il est cependant inutilie de réappliquer le filtré à chaque fois car il est appliqué à l'occurrence de Bitmap (l'objet d'affichage)只不过 qu'aux données bitmap (données de pixel brutes). Pour rappel, l'occurrence de Bitmap ne correspond pas aux données bitmap. C'est un objet d'affichage qui affiche ces données à l'écran. Une occurrence de Bitmap peut être assimilée à un projecteur de diapositives, tandis qu'un objet BitmapData seraient une diapositive représentée par le biais du projecteur. Il est possible d'appliquer un filtré directement à un objet BitmapData, ce qui reviendrait à dessiner sur une diapositive pour modifier l'image. Vous pouvez aussi appliquer un filtré à tout objet d'affichage, y compris une occurrence de Bitmap, ce qui équivaudrait à placer un filtré devant l'objet du projecteur pour déformer l'image à l'écran sans modifier la diapositive d'origine. Comme les données bitmap brutes sont accessibles par le biais de la propriété bitmapData d'une occurrence de Bitmap, rien n'empêche de leur appliquer directement le filtré. Dans ce cas, cependant, il est préféable d'appliquer directement le filtré à l'objet d'affichage Bitmap plusot qu'aux données bitmap.

Pour plus d'informations sur l'utilisation du filtré Mappage de déplacement en ActionScript, voir « Filtrage des objets d'affichage » à la page 276.

Creation d'une image bitmap par définition de la valeur des pixels

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Le fait qu'un filtré Mappage de déplacement implique en réalité deux images est un facteur important. L'image source est modifiée par le filtré. Dans cet exemple, il s'agit de l'occurrence de Bitmap sphère. L'autre image utilisée par le filtré est appelée l'image de mappage. Elle n'appeaît pas à l'écran. En revanche, la couleur de ses pixels est utilisé en entrée par la fonction de déplacement : la couleur d'un pixel se trouvant à des coordonnées x, y spécifique détermine le déplacement (changement physique de position) à appliquer au pixel à ces coordonnées x, y dans l'image source.

Dans cet exemple, pour utiliser le filtré Mappage de déplacement en vue de créé un effet sphérique, il est donc nécessaire d'utiliser l'image de mappage appropriée, c'est-à-dire une image au fond gris相當 un cercle rempli d'un dégradé d'une seule couleur (rouge) qui passe, horizontallyment, du foncé au clair, comme illustré ci-dessous :

ADOBE ACTIONSCRIPT 3.0 - Creation d'une image bitmap par définition de la valeur des pixels - 1

Comme une image de mappage et un filtré desiques sont utilisés dans cet exemple, l'image de mappage est créé une seule fois, dans la méthode imageLoadComplete() (autrement dit, à l'issue du chargement de l'image externe).

L'imag de mappage, fisheyeLens, est cree par appel de la methode createFisheyeMap() de la classe MoonSphere :

var fisheyeLens:BitmapData = createFisheyeMap(radius); 

Au sein de la méthode createFisheyeMap(), l'image de mappye est dessinée pixel par pixel à l'aide de la méthode setPixel() de la classe BitmapData. Vous trouvez le code complet de la méthode createFisheyeMap() ci-dessous, suivi d'une presentation détaillée de son fonctionnement :

private function createFisheyeMap(radius:int):BitmapData
{ var diameter:int = 2 * radius;
var result:BitmapData = new BitmapData(diameter, diameter, false, 0x808080);
// Loop through the pixels in the image one by one
for (var i:int = 0 ;i < diameter; i + + ) { for(varj:int = 0 ;j < diameter;j++) { //Calculate the x and y distances of this pixel from //the center of the circle (as a percentage of the radius). var pctX:Number = (i - radius)/radius; var pctY:Number = (j - radius)/radius; // Calculate the linear distance of this pixel from //the center of the circle (as a percentage of the radius). var pctDistance:Number = Math.sqrt(pctX*pctX+pctY*pctY); //If the current pixel is inside the circle, //set its color. if(pctDistance<1) { //Calculate the appropriate color depending on the //distance of this pixel from the center of the circle. var red:int; var green:int; var blue:int; var rgb:uint; red = 128 * (1 + 0.75 *pctX*pctX*pctX/ (1- pctY*pctY)); green = 0 . blue = 0 . rgb = (red<<16|green<<8|blue); // Set the pixel to the calculated color. result.setPixel(i,j,rgb); } } } return result;

En premier lieu, la méthode recoit un paramètre, radius, qui indique le rayon de l'image circulaire à créé. Le code creée ensuite l'objet BitmapData sur lequel sera tracé le cercle. Cet objet, appelé résultat, est renvoyé comme valeur résultante de la méthode. Comme illustré par l'extrait de code ci-dessous, la largeur et la hauteur de l'occurrence de BitmapData résultat créée sont égales au diamètre du cercle. En outre, cette occurrence n'a pas de transparence (le troisième paramètre correspond à false) et elle est pré-remplie par la couleur 0x808080 (gris moyen):

var result:BitmapData = new BitmapData(diameter, diameter, false, 0x808080); 

Le code utilise ensuite deux boucles pour itérer par-dessus chaque pixel de l'image. La boucle extérieure parcourt de droite à gauche chaque colonne de l'image (la variable i représentant la position horizontale du pixel manipulé), alors que la boucle interieure intervient sur chaque pixel de la colonne actuelle, de bas en haut (la variable j représentant la position verticale du pixel actuel). Le code des boucles (le contenu de la boucle interieure étant omis) est illustré ci-dessous:

for(var i:int = 0 ;i< diameter; i + + 1 for(varj:int = 0 ;j< diameter;j++) { ... }
}

Au fur et à mesure de la manipulation des pixels par les boucles, une valeur est calculée à chacun d'eux (la valeur colorimétrique de ce pixel dans l'image de mappage). Ce processus comporte quatre étapes :

1 Le code calcule la distance séparant le pixel actuel du centre du cercle, le long de l'axe x (i - radius). Cette valeur est divisée par le rayon pour obtenir un pourcentage de celui-ci只不过 qu'une distance absolue ((i - radius) / radius). Ce pourcentage est stocké dans une variable appelée pctx. La valeur équivalente sur l'axe y est calculée et stockée dans la variable pcty, comme illustré dans le code ci-dessous:

var pctX:Number = (i - radius) / radius;  
var pctY:Number = (j - radius) / radius; 

2 Une formule trigonométrique standard (le théorème de Pythagore) est utilisé pour calculer la distance linéaire entre le centre du cercle et le point actuel, à partir de pctX et pctY. Cette valeur est stockée dans une variable, pctDistance, comme illustré ci-dessous:

var pctDistance:Number = Math.sqrt(pctX * pctX + pctY * pctY);

3 Le code vérifie ensuite si la distance en pourcentage est inférieure à 1 (ou 100% du rayon; autrement dit, si le pixel concerne se trouve sur le rayon du cercle). Si le pixel figure dans le cercle, une valeur colorimétrique calculée lui est affectée (voir la description à l' étape 4). Dans le cas contraire, ce pixel ne fait l'objet d'aucune manipulation et conserve la couleur par défaut, c'est-à-dire le gris moyen.

if(pctDistance<1)   
{ ...   
} 

4 Une valeur colorimétrique est calculée pour tout pixel se trouvant dans le cercle. La couleur finale est une nuance de rouge qui va du noir (0 % de rouge) sur le bord gauche du cercle au rouge vif (100 % de rouge) sur le bord droit du cercle. La valeur colorimétrique comprend initialement trois parts de couleur (rouge, vert et bleu), comme illustré ci-dessous):

red = 128 * (1 + 0.75 * pctX * pctX * pctX / (1 - pctY * pctY)); 

green = 0

blue = 0

Observe que seule la part rouge de la couleur (variable red) possède une valeur. Les valeurs vert et bleu (variables green et blue) sont illustrées ici par souci de clarté, mais il est possible de les omettre. Cette méthode ayant pour but de créé un cercle contenant un dégradé de rouge, les valeurs vertes et bleues sont superflues.

Une fois les trois valeurs colorimétriques individuelles déterminées, elles sont conjuguées dans une valeur entière unique à l'aide d'un algorithme de décalage de bits, comme illustré ci-dessous :

rgb = (red << 16 | green << 8 | blue); 

En dernier lieu, la valeur colorimétrique calculée est affectée au pixel actuel à l'aide de la méthode setPixel() de l'objet BitmapData result, comme illustré ci-dessous:

result.setPixel(i, j, rgb); 

Décodage asynchrone des images bitmap

Flash Player 11 et les versions ultérieures, Adobe AIR 2.6 et les versions ultérieures

Lorsque you manipulez des images bitmap, vous pouvez decoder et charger ces dernières en mode asynchrone pour optimiser les performances perçues d'une application. Dans de nombreux cas, le decodage asynchrone d'une image bitmap prend autant de temps que le decodage synchrone. L'image bitmap est toutefois decodée dans un thread distinct avant que l'objet Loader associé n'envoié l'évenement COMPLETE. Il est par conséquent possible de decoder en mode asynchrone des images de taille supérieure après leur chargement.

La classe ImageDecodingPolicy du package flash.system permet de stipuler le modele de chargement de bitmap. Le modele de chargement par défaut est synchrone.

Traitement du décodage de bitmapModèle de chargement de bitmapDescription
ImageDecodingPolicy.ON_DEMANDSynchroneLes images chargées sont décodées lorsque l'utilisateur accède aux données de l'image. Ce traitement est ajusté au décodage des images de taille inférieure. Il s'avéré également utile lorsque l'application ne nécessite pas d'effets et de transitions complexes.
ImageDecodingPolicy.ON_LOADAsynchroneLes images chargées sont décodées au chargement, avant la distribution de l'évolution COMPLETE. Ce mode est parfaitement adapté aux images de taille supérieure (supérieure à 10 MP). Si vous développpez une application mobile AIR contenant des transitions de page, faites appel à ce traitement de chargement de bitmap pour optimier les performances perçues de l'application.

Remarque: si le fichier en cours de chargement est une image bitmap et que la méthode de décodage utilisée est ON_LOAD, l'image est décodée de façon asynchrone avant la distribution de l'évenement COMPLETE.

Le code suivant illustrer l'utilisation de la classe ImageDecodingPolicy:

var loaderContext:LoaderContext = new LoaderContext();  
loaderContext(imageDecodingPolicy = ImageDecodingPolicy.ON_LOAD  
var loader:Loader = new Loader();  
loader.load(new URLLRequest("http://www.adobe.com/myimage.png"), loaderContext); 

Vous pouvez continuer à utiliser le traitement de décodage ON_DEMAND avec les méthodes Loader.load() et Loader.loadBytes().Néanmoins, toutes les autres méthodes qui prennt un objet LoaderContext comme argument ignorent toutes les valeurs ImageDecodingPolicy transmises.

L'exemple suivant illustré la différence entre une image décodée en mode synchrone et en mode asynchrone :

package   
{ import flash.display.Loader; import flash.display.Sprite; import flash.events.Event; import flash.net(URLRequest; import flash.system.ImageDecodingPolicy; import flash.system.LoaderContext; public class AsyncTest extends Sprite { private var loaderContext:LoaderContext; private var loader:Loader; private var urlRequest:URLRequest; public function AsyncTest() { //Load the image synchronously loaderContext = new LoaderContext(); //Default behavior. loaderContext(imageDecodingPolicy = ImageDecodingPolicy.ON_DEMAND; loader = new Loader(); loadImageSync(); //Load the image asynchronously loaderContext = new LoaderContext(); loaderContext(imageDecodingPolicy = ImageDecodingPolicy.ON_LOAD; loader = new Loader(); loadImageAsync(); } private function loadImageAsync():void{ trace("Loading image asynchronously..."); urlRequest = new URLRequest("http://www.adobe.com/myimage.png"); urlRequest.useCache = false; loader.load(urlRequest, loaderContext); loader(contentLoaderInfo.addEventListener (Event.COMPLET, onAsyncLoadComplete); 

}
private function onAsyncLoadComplete(event:Event):void{ trace("Async.Image Load Complete");
}
private function loadImageSync():void{ trace("Loading image synchronously..."); urlRequest = new URLRequest("http://www.adobe.com/myimage.png"); urlRequest.useCache = false; loader.load(urlRequest,loaderContext); loader(contentLoaderInfo.addEventListener (Event.COMPLET, onSyncLoadComplete);
}
private function onSyncLoadComplete(event:Event):void{ trace("Sync.Image Load Complete"); }
}

Pour une démonstration de l'effet des diverses stratégies de décodage, voir Thibaud Imbert: Asynchronous bitmap decoding in the Adobe Flash runtimes (disponible en Englais uniquement).

Chapitre 14 : Filtrage des objets d'affichage

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Historiquement, l'application d'effets de filtrés à des images bitmap est du domaine des logiciels spécialisés en retouché d'image, comme Adobe Photoshop et Adobe Fireworks. ActionScript 3.0 comprend le package flash_filters, qui intègre une série de classes de filtrés d'effet d'image bitmap. Ces effets permettent aux développpeurs d'appliquer des filtrés aux images bitmap et objets d'affichage par le biais d'un programme afin d'obtenir une grande partie des effets disponibles dans les applications de retouché graphique.

Principes de base du filtrage des objets d'affichage

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

L'une des façon de rendre une application plus séduisante est de lui ajouter des effets graphiques simples, comme une ombre portée derrière une photo pour creator l'illusion de la 3D, ou un rayonnement autour d'un bouton pour indiquer qu'il s'agit du bouton actif. ActionScript 3.0 comporte dix filtres qui peuvent être appliqués à n'importe quel objet d'affichage ou à une occurrence de BitmapData. Ces filtres sont des effets de base (filtres Ombre portée et Rayonnement) à des effets plus complexes, tels que le filtré Mappage du déplacement et le filtré Convolution matricielle.

Remarque : outre les filtres integres, vous pouvez programmer des effets et filtres personnalisés par le biais de Pixel Bender (voir « Utilisation des shaders de Pixel Bender » à la page 310).

Concepts important et terminologie

La liste de référence suivante content des termes importants relatifs à la création de filtres :

Biseau Effet de rebord créé en éclaircissant les pixels de deux côts contigus et en ascombrissant les pixels des deux côts opposés, afin de creator un effet tridimensionnel de cordure féquement utilisé pour donner à des boutons et autres graphiques un effet,enforcé ou sorti.

Convolution Distorsion des pixels d'une image obtenue en combinant la valeur de chaque pixel avec celle(s) d'un ou plusieurs des pixels voisins, selon divers pourcentages.

Déplacement Décalage des pixels d'une image vers une nouvelle position.

Matrice Grille de chiffres utilisée pour effectuer certains calculs mathématiques, en appliquant ces chiffres à diverses valeurs et en combinant le résultat.

Voir aussi

Package flash.filters

Creation et application de filtrés

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Les filtres permettent d'appliquer divers effets (ombre portée, biseau, flou, etc.) à des images bitmap et à des objets d'affichage. Chaque filtre étant défini sous forme de classe, il suffit pour appliquer un filtre de créé une occurrence d'un objet filtre, ce qui n'est guéré différent de la création de tout autre objet. Àpres avoir créé une occurrence d'un objet filtre, il est facile de l'appliquer à un objet d'affichage à l'aide de la propriété filters de cet objet ou, dans le cas d'un objet BitmapData, de sa méthode applyFilter().

Création d'un filtré

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Pour creer un objet filtre, il suffit d'appeler la fonction constructeur de la classe du filtre voulu. Par exemple, pour creer un objet DropShadowFilter, utilisez le code suivant :

import flash_filters.DropShadowFilter;

var myFilter:DropShadowFilter = new DropShadowFilter();

Bien que cela n'apparaisse pas dans cet exemple, le constructeur de DropShadowFilter() ( comme tous les autres constructeurs des classes de filtres) accepte plusieurs paramètres facultatifs qui permettent de modifier l'aspect de l'effet du filtré.

Application d'un filtré

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Lorsque l'objet filtré a été créé, vous pouvez l'appliquer à un objet d'affichage ou à un objet BitmapData, mais le mode d'application du filtré dépend de l'objet concerné.

Application d'un filtré à un objet d'affichage

Pour appliquer un effet de filtrage à un objet d'affichage, utilisez sa propriété filters. La propriété filters d'un objet d'affichage est une occurrence de l'objet Array, dont les éléments sont les objets filtres appliqués à l'objet d'affichage. Pour appliquer un seul filtre à un objet d'affichage, créez l'occurrence de ce filtre, ajoutez-la à une occurrence d'Array, et affectez cet objet Array à la propriété filters de l'objet d'affichage :

import flash.display.Bitmap;  
import flash.display.BitmapData;  
import flash~-filters.DropShadowFilter; 
// Create a bitmapData object and render it to screen  
var myBitmapData:BitmapData = new BitmapData(100, 100, false, 0xFFFF3300);  
var myDisplayObject:Bitmap = new Bitmap(myBitmapData);  
addChild(myDisplayObject); 
// Create a DropShadowFilter instance.  
var dropShadow:DropShadowFilter = new DropShadowFilter(); 
// Create the filters array, adding the filter to the array by passing it as // a parameter to the Array() constructor.  
var filtersArray:Array = new Array dropShadow); 
// Assign the filters array to the display object to apply the filter. myDisplayObjectfilters = filtersArray; 

Pour affecter plusieurs filtres à l'objet, il suffit d'ajouter tous ces filtres à l'occurrence d'Array avant de l'affector à la propriété filters. Vous pouvez ajouter plusieurs objets à un objet Array en les passant en paramètres à son constructeur. Par exemple, ce code applique un filtr Biseau et un filtr Rayonnement à l'objet d'affichage créé précédemment :

import flash_filters.BevelFilter;  
import flash_filters.GlowFilter; 
// Create the filters and add them to an array.  
var bevel:BevelFilter = new BevelFilter();  
var glow:GlowFilter = new GlowFilter();  
var filtersArray:Array = new Array(bevel, glow); 
// Assign the filters array to the display object to apply the filter. myDisplayObjectfilters = filtersArray; 

Pour creer le tableau des filtres, vous pouze utiliser le constructeur new Array() ( comme dans les exemples precedents) ou la syntaxe litterale Array, en mettant les filtres entre crochets ([]). Par exemple, cette ligne de code :

var filters:Array = new Array dropShadow, blur); 

donne un résultat identique à celle-ci :

var filters:Array = [dropShadow, blur]; 

Si vous appliquez plusieurs filtrés à des objets d'affichage, ils sont appliqués en série, de manière cumulative. Par exemple, si un tableau de filtrés comporte deux éléments, le filtré Biseau puis le filtré Ombre portée, ce dernier est appliqué à la fois au filtré Biseau et à l'objet d'affichage lui-même, du fait que le filtré Ombre portée est en seconde position dans le tableau des filtrés. Si vous souhaitez appliquer des filtrés de manière non cumulative, appliquez chaque filtré à une nouvelle copie de l'objet d'affichage.

Pour affecter uniquement un ou quelques filtres à un objet d'affichage, vous pouvezisser l'occurrence du filtré et l'affeter à l'objet dans la même instruction. Par exemple, le code suivant applique un filtré Flou à un objet d'affichage nommé myDisplayObject :

myDisplayObjectfilters = [new BlurFilter();]; 

Le code précédent cree une occurrencie d'Array en utilisant la syntaxe litterale d'Array (entre crochets), puis cree une nouvelle occurrence de BlurFilter comme element du tableau, et affecte ce dernier a la propriete filters de l'objet d'affichage myDisplayObject.

Suppression des filtrés appliqués à un objet

Pour supprimer tous les filtres d'un objet d'affichage, il suffit d'affector la valeur null à la propriété filters de celui-ci :

myDisplayObjectfilters = null;

Si vous avez appliqué plusieurs filtres à un objet et souhaitez n'en supprimer qu'un, plusieurs étapes sont nécessaires pour modifier le tableau de la propriété filters. Pour plus d'informations, voir « Problèmes potentiels d'utilisation des filtres » à la page 279.

Application d'un filtré à un objet BitmapData

L'application d'un filtré à un objet BitmapData nécessite d'utiliser la méthode applyFilter() de l'objet BitmapData :

var rect:Rectangle = new Rectangle();

var origin:Point = new Point(); 
myBitmapData.applyFilter.sourceBitmapData, rect, origin, new BlurFilter()); 

La méthode applyFilter() applique un filtré à un objet source BitmapData, produitant ainsi une nouvelle image filtrée. Cette méthode ne modifie pas l'image originale, car le résultat de l'application du filtré à celle-ci est enregistré dans l'occurrence de BitmapData pour laquelle la méthode applyFilter() est appelée.

Fonctionnement des filtres

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Le filtrage des objets d'affichage consiste à mettre en cache une copie de l'objet original sous forme d'un bitmap transparent.

Lorsqu'un filtré a été appliqué à un objet d'affichage, le moteur d'exécution conserve en cache l'objet sous forme de bitmap tant que cet objet possède une liste de filtres valide. Le bitmap source est ensuite repris en tant qu'une image originale pour les effets de filtrage suivants.

Tout objet d'affichage comporte généralement deux bitmaps : le premier avec l'objet d'affichage source non filtré d'origine et un autre pour l'image finale après filtrage. L'objet finale est utilisé pour le rendu. Tant que l'objet d'affichage ne change pas, l'objet source ne nécessite aucune actualisation.

Problèmes potentiels d'utilisation des filtres

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Plusieurs sources potentielles de confusion ou de problèmes peuvent survenir lors de l'utilisation de filtres.

Filtres et mise en cache bitmap

Pour appliquer un filtre à un objet d'affichage, vous devez activer la mise en cache sous forme de bitmap pour cet objet. Si vous appliquez un filtre à un objet d'affichage dont la propriété cacheAsBitmap est false, la propriété cacheAsBitmap de l'objet est automatiquement définie sur true. Si vous supprimez tous les filtres appliqués à l'objet d'affichage, la propriété cacheAsBitmap retrouve la valeur précédemment définie.

Modification des filtres à l'execution

Si un ou plusieurs filtrés sont déjà appliqués à un objet d'affichage, vous ne pouvez pas modifier le jeu de filtrés en ajoutant d'autres filtrés ou en supprimant des filtrés existants du tableau de la propriété filters. Pour modifier le jeu de filtrés appliqué ou lui ajouter des filtrés, vous doivent effectuer les modifications requises dans un tableau distinct, puis l'assigner à la propriété filters de l'objet d'affichage pour que les filtrés soient appliqués à l'objet. La procédure la plus simple consiste à dire le tableau de la propriété filters dans une variable Array, puis à effectuer les modifications requises dans ce tableau-temporaire. Vous reassignez alors ce tableau à la propriété filters de l'objet d'affichage. Dans les cas de figure plus complexes, il peut s'avérer nécessaire de conserver un tableau maître distinct de filtrés. Vous effectuez toute modification requise dans ce tableau maître de filtrés, puis vous le réassignez à la propriété filters de l'objet d'affichage après chaque modification.

Ajout d'un autre filtré

Le code suivant illustré le processus d'ajout d'un autre filtré à un objet d'affichage auquel sont déjà appliqués un ou plusieurs filtres. Initialement, un filtré Rayonnement est appliqué à l'objet d'affichage myDisplayObject. Lorsque l'utilisateur clique sur l'objet d'affichage, la fonction addFilters() est appelée. Dans cette fonction, deux filtres supplémentaires sont appliqués à myDisplayObject :

import flash.events.MouseEvent;
import flash.filters.*;
myDisplayObjectfilters = [new GlowFilter();
function addFilters(event:MouseEvent):void { //Make a copy of the filters array. var filtersCopy:Array = myDisplayObject_filters; //Make desired changes to the filters (in this case, adding filters). filtersCopy.push(new BlurFilter()); filtersCopy.push(new DropShadowFilter()); //Apply the changes by reassigning the array to the filters property. myDisplayObject(filters = filtersCopy;
}
myDisplayObject.addEventListener(MouseEvent.CLICK, addFilters);

Suppression d'un filtré dans un jeu de filtres

Si plusieurs filtrés sont appliqués à un objet d'affichage et que vous souhaitez supprimer l'un des filtres sans affecter les autres filtrés appliqués, vous copiez les filtres dans un tableau-temporaire, vous supprimez le filtré superflu du tableau, puis vous réassignez le tableau temporaire à la propriété filters de lobjet d'affichage. La section « Récupération des valeurs et suppression des éléments du tableau » à la page 32 désrit plusieurs techniques de suppression d'un ou de plusieurs éléments de tout tableau.

La technique la plus simple consiste a supprimer le filtre en tete de pile applique a l'objet (en d'autres termes, le dernier filtre applique a ce dernier). Vous utilisez la methode pop () de la classe Array pour supprimer le filtre du tableau :

Pour supprimer le filtré en bas de pile (en d'autres termes, le premier filtré appliqué à l'objet), vous utilisez le même code en substituant la méthode shift() de la classe Array à la méthode pop().

Pour supprimer un filtré figurant au centre d'un tableau de filtrés (sous réserve que le tableau contienne plus de deux filtrés), vous disposez de la méthode splice(). Vous devez connaître l'index (la position dans le tableau) du filtré à supprimer. Par exemple, le code suivant supprime le deuxième filtré (doté de l'index 1) d'un object d'affichage :

Identification de l'index d'un filtré

Voude nevez connaitre l'index du filtrte à supprimer du tableau. A cet effet, il est nécessaire d'identifier (selon le mode de conception de l'application) ou de calculer l'index du filtrte à supprimer.

L'approche recommendée consiste à reconvoir votre application de sorte que le filtré à supprimer occupe systématiquement la même position dans le jeu de filtres. Par exemple, si vous disposez d'un objet d'affichage unique auquel sont appliqués un filtré Convolution et un filtré Ombre portée (dans cet ordre) et que vous souhaitez supprimer le filtré Ombre portée tout en conservant le filtré Convolution, vous connaisssez la position occupée par le filtré (première). Vous savez donc à l'avance qu'elle méthode Array utiliser (soit, dans ce cas, Array.pop() pour supprimer le filtré Ombre portée).

Si le filtrte à supprimer est toujours d'un type déterminé, mais qu'il n'occappe pas systématiquement la même position dans le jeu de filtrres, vous pouvez vérifier le type de données de chaque filtrte du tableau pour identifier le filtré à supprimer. Par exemple, le code suivant identifie le filtrtre Rayonnement dans un jeu de filtrres et le supprime de ce dernier.

Dans un cas de figure plus complexe (si le filtré à supprimer est sélectionné à l'exécution, par exemple), l'approche recommandée consiste à conserver une copie distincte et permanente du tableau de filtres, qui sert de liste maitresse de filtres. Lorsque vous modifiez le jeu de filtres, modifierEZ la liste maitresse, puis appliqueZ ce tableau de filtres en tant que propriété filters de I'objet d'affichage.

Par exemple, dans le code ci-après, plusieurs filtres Convolution sont appliqués à un objet d'affichage pour créé divers effets visuels et l'un de ces filtres est supprimé ultérieurement dans l'application sans affecter les autres filtres. Dans ce cas de figure, le code conserve une copie maitresse du tableau de filtres, ainsi qu'une référence au filtré à supprimer. Rechercher et identifier le filtré approprié est similaire à l'approche précédente, excepté qu'au lieu d'effectuer une copie-temporaire du tableau de filtres, la copie maitresse est manipulée, puis appliquée à l'objet d'affichage.

Si vous adoptez cette approche (qui consiste à comparer une référence stockée à un filtré aux éléments que contient le tableau de filtres pour identifier le filtré à supprimer), vous devez conserver une copie distincte du tableau de filtres. En effet, le code ne fonctionne pas si vous comparez la référence stockée au filtré aux éléments d'un tableau temporaire copié dans la propriété filters de l'objet d'affchage. La raison en est simple : lorsque vous assignez un tableau à la propriété filters, le moteur d'exécution effectue une copie de chaque objet filtré du tableau. Ces copies (plutôt que les objets d'origine) sont appliquées à l'objet d'affchage. Lorsque vous lisez la propriété filters dans un tableau-temporaire, celui-ci contient des réferences aux objets filtré copés只不过 qu'aux objets filtré d'origine. Par conséquent, si vous tentez dans l'exemple précédent de déterminer l'index de filterToRemove en le comparant aux filtres d'un tableau de filtres temporaire, aucune correspondance n'est détectée.

Filtres et transformations d'objets

Les zones filtrées (ombres portées, par exemple) situées hors du cadre de selection d'un objet d'affichage ne sont pas prises en considération pour la détction de clics (chevauchement ou intersection de deux occurrences). La méthode de détction des clics de la classe DisplayObject étant de type vectoriel, il est impossible d'en pratiquer une sur le bitmap résultat. Par exemple, si vous appliquez un contrôle Biseau à une occurrence de bouton, la détction des clics n'est pas possible sur la partie biseautée de l'occurrence.

Le redimensionnement, la rotation et l'inclinaison ne sont pas pris en charge par les filtres; si l'objet d'affichage filtré lui-même est redimensionné (scaleX et scaleY différents de 100%), l'effect de filtrer n'est pas redimensionné avec l'occurrence. La forme originale de l'occurrence est certes pivotée, inclinée ou redimensionnée, mais pas le filtré.

Voues pouvez animer une occurrence avec un filtre afin de creer des effets realistically, ou imbriquer des occurrences et utiliser la classe BitmapData pour animer des filtres afin d'obtenir ces effets.

Filtres et objets bitmaps

Si vous appliquez un filtré à un objet BitmapData, la propriété cacheAsBitmap de cet objet est automatiquement true. Le filtré peut ainsi être appliqué à la copie de l'objet只不过 qu'à ce dernier.

Cette copie est alors placé à l'écran par-dessus l'objet original, aussi près que possible, au pixel près. Si les limites du bitmap original changent, la copie à laquelle le filtrage est appliqué est recrée à partir de l'original au lieu d'être étiérée.

Si vous supprimez tous les filtres de l'objet d'affichage, la propriété cacheAsBitmap retrouvse sa valeur d'origine.

Filtres d'affichage disponibles

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

ActionScript 3.0 comprend dix classes de filtré que vous pouvez appliquer aux objets d'affichage et aux objets BitmapData :

  • filtr Biseau (classe BevelFilter)
  • filtré Flou ( classe BlurFilter)
  • filtré Ombre portée ( classe DropShadowFilter)
  • filtré Rayonnement (classe GlowFilter)
  • filtré Biseau dégradé ( classe GradientBevelFilter)
  • contrôle Rayonnement dégradé ( classe GradientGlowFilter)
  • filtré Matrice de couleurs ( classe ColorMatrixFilter)
  • filtré Convolution ( classe ConvolutionFilter)
  • filtrer Mappage de déplacement ( classe DisplacementMapFilter)
  • ligne Shader ( classe ShaderFilter)

Les six premiers sont des filtres simples pouvant etre utilisés pour des effets spécifiques, avec certains réglages possibles. Ces six filtres peuvent etre appliqués en ActionScript, mais aussi a partir du panneau Filtres de Flash Professional. Par consequenc, meme si vous appliquez des filtres à l'aide d'ActionScript, sous réserve de disposer de Flash Professional, vous pouvez utiliser son interface visuelle pour vérifier rapidement I'effet des différents filtres et de leurs réglages afin de creer I'effet désiré.

Les quatre derniers filtrés sont uniquement disponibles en ActionScript. Ces filtrés (filtrre Matrice de couleurs, filtrer Convolution, filtrre Mappage de déplacement et filtrre Shader) permettent de créé des types d'effet beaucoup plus couples. Plutôt que proposer un effet unique optimisé, ils assurent puissance et souplesse. Par exemple, enCHOISANT differentes valeurs pour sa matrice, il est possible d'utiliser le filtrre Convolution pour creation des effets de flou, de gravure, d'accentuation, mais aussi pour des transformations, la détction de contour des couleurs, etc.

Chacun de ces filtres, qu'il soit simple ou complexe, dispose de propriétés dont les valeurs peuvent être modifiées. En général, il existe deux possibilités pour définir les propriétés d'un filtrte. Tous les filtres permettent de définir leurs propriétés en passant des valeurs en paramètres au constructeur de l'objet filtrte. Que les propriétés du filtrte soient définies ou non par un passage de paramètres, il est aussi possible de modifier ultérieurement ses réglages en changeant les valeurs des propriétés de l'objet filtrte. La plupart des exemples de code définissent directement les propriétés pour faciliter la comprhension de l'exemple. Néanmoins, il est également possible, en général, d'obtenir le même résultat avec moins de lignes de code, en passant les valeurs en paramètres dans le constructeur de l'objet filtrte. Pour plus d'informations sur les caractéristiques de chaque filtrte, ses propriétés et les paramètres constructeurs correspondants, voir les codes associés au package flash_filters dans le manuel Guide de référence ActionScript 3.0 pour la plate-forme Adobe Flash.

Filtre Biseau

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La classe BevelFilter vous permet d'ajouter une cordure en relief à l'objet filtré. Avec ce filtrre, les angles et les côts des objetssemblant ciselés,biseautés.

Les propriétés de la classe BevelFilter permettent de modifier l'apparce du biseau. Vous pouvez définir les couleurs des zones claires etsons, l'adoucisement et les angles des cotés du biseau, ainsi que la tille de ces derniers. Vous pouvez même creer un effet de poinconnage.

L'exemple suivant charge une image externe et lui applique un filtré Biseau.

import flash.display.*;   
import flash.filters.BevelFilter;   
import flash_filters.BitmapFilterQuality;   
import flash_filters.BitmapFilterType;   
import flash.net URLsRequest;   
// Load an image onto the Stage.   
var imageLoader:Loader = new Loader();   
var url:String = "http://www.helpexamples.com/flash/images/image3.jpg";   
var urlReq:URLRequest = new URLRequest(url);   
imageLoader.load(urlReq);   
addChild(imageLoader);   
// Create the bevel filter and set filter properties.   
var bevel:BevelFilter = new BevelFilter();   
beveldistance = 5;   
bevel.angle = 45;   
bevelhighlightColor = 0xFFFFFF00;   
bevelhighlightAlpha = 0.8;   
bevel.sunColor = 0x666666;   
bevel.shadowAlpha = 0.8;   
bevel.curX = 5;   
bevel.curY = 5;   
bevel.strength = 5;   
bevel.quality = BitmapFilterQuality.HIGH;   
bevel.type = BitmapFilterType.INNER;   
bevel.knockout = false;   
// Apply filter to the image.   
imageLoader(filters = [bevel]; 

Filtre Flou

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La classe BlurFilter ajoute un effet de flou à un objet d'affichage et son contenu. Les effets de flou permettent de donner l'impression qu'un objet n'est pas dans le plan de mise au point ou de simuler l'effet d'un mouvement rapide (flou de mouvement). EnChoosingant une valeur faible pour la propriete quality, vous pouvez simuler un effet de photo légerement floue. Le choix d'une valeur élevée pour la propriete quality permit d'obtenir un effet de flou léger proche de celui d'un flou gaussian.

L'exemple suivant create un objet cercle à l'aide de la méthode drawCircle() de la classe Graphics, puis lui applique un contrôle Flou :

import flash.display.Sprite;
import flash.filters.BitmapFilterQuality;
import flash_filters.BlurFilter;
// Draw a circle.
var redDotCutout: Sprite = new Sprite();
redDotCutout.graphics.lineStyle();
redDotCutout.graphics.beginFill(0xFF0000);
redDotCutout.graphics.drawCircle(145, 90, 25);
redDotCutout.graphics.endFill();
// Add the circle to the display list.
addChild(redDotCutout);
// Apply the blur filter to the rectangle.
var blur: BlurFilter = new BlurFilter();
blur.blurX = 10;
blur.blurY = 10;
blur.quality = BitmapFilterQuality.MEDIUM;
redDotCutout_filters = [blur]; 

Filtre Ombre portée

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

L'ombre portée donne l'impression d'une source lumineuse ponctuelle au-dessus de l'objet cible. Il est possible de modifier la position et l'intensité de cette source lumineuse pour produit divers effets d'ombre portée.

La classe DropShadowFilter utilise un algorithme similaire à celui du filtré Flou. La principale différence tient au fait que le filtré Ombre portée possède quelques propriétés supplémentaires qui permettent de simuler diverses caractéristiques d'une source lumineuse (canal alpha, couleur, décalage et luminosité).

Le filtré Ombre portée permet aussi d'appliquer des options de transformation au style de l'ombre portée (ombre interne ou externe, ou mode de masquage).

Le code suivant cree un objet Sprite carré et lui applique un filtre Ombre portée.

import flash.display.Sprite;  
import flash_filters.DropShadowFilter; 
// Draw a box.  
var boxShadow: Sprite = new Sprite();  
boxShadow.graphics.lineStyle(1);  
boxShadow.graphics.beginFill(0xFF3300);  
boxShadow.graphics.drawRect(0, 0, 100, 100);  
boxShadow.graphics.endFill();  
addChild.boxShadow); 
// Apply the drop shadow filter to the box.  
var shadow:DropShadowFilter = new DropShadowFilter();  
shadowdistance = 10;  
shadow.angle = 25; 

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La classe GlowFilter applique un effet d'éclairage aux objets d'affichage afin deuggérer qu'une lumière est braquée à partir du dessous de l'objet pour creer un faible rayonnement.

Comme le filtré Ombre portée, le filtré Rayonnement possède des propriétés qui permettent de modifier la distance, l'angle et la couleur de la source lumineuse en fonction de l'effet désiré. L'objet GlowFilter comporte aussi plusieurs options pour modifier le style de rayonnement, notamment le rayonnement interne ou externe et le mode de masquage.

Le code suivant create un objet Sprite en forme de croix et lui applique un contrôle Rayonnement.

import flash.display.Sprite;
import flash.filters.BitmapFilterQuality;
import flash_filters,GlowFilter;
// Create a cross graphic.
var crossGraphic:$prite = new Sprite();
crossGraphic.graphics.lineStyle();
crossGraphic.graphics.beginFill(0xCCCC00);
crossGraphic.graphics.drawRect(60,90,100,20);
crossGraphic.graphics.drawRect(100,50,20,100);
crossGraphic.graphics.endFill();
addChild(crossGraphic); 
// Apply the glow filter to the cross shape.  
var glow: GlowFilter = new GlowFilter();  
glow.color = 0x009922;  
glow.alpha = 1;  
glow.blurX = 25;  
glow.blurY = 25;  
glowquality = BitmapFilterQuality.MEDIUM; 

crossGraphicfilters = [glow];

Filtre Biseau dégradé

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La classe GradientBevelFilter vous permet d'appliquer un effet de biseau optimisé aux objets d'affichage ou aux objets BitmapData. L'utilisation d'un dégradé de couleurs sur le biseau améliore beaucoup l'effect de relief de celui-ci, en donnant aux côtés un aspect 3D plus réaliste.

L'exemple suivant create un object rectangle à l'aide de la méthode drawRect() de la classe Shape, puis lui applique un filtré Biseau dégradé :

import flash.display.Shape;  
import flash.filters.BitmapFilterQuality;  
import flash_filters.GradientsBevelFilter; 
// Draw a rectangle.  
var box:Shape = new Shape();  
box.graphics.lineStyle();  
box.graphics.beginFill(0xFEFE78);  
box.graphics.drawRect(100, 50, 90, 200);  
box.graphics.endFill(); 
// Apply a gradient bevel to the rectangle.  
var gradientBevel:GradientBevelFilter = new GradientBevelFilter(); 
gradientBevel(distance = 8;  
gradientBevel.angle = 225; // opposite of 45 degrees  
gradientBevelcolors = [0xFFFFFF, 0xFEFE78, 0x8F8E01];  
gradientBevel.alphas = [1, 0, 1];  
gradientBevel.ratios = [0, 128, 255];  
gradientBevel.blurX = 8;  
gradientBevel.blurY = 8;  
gradientBevel.quality = BitmapFilterQuality.HIGH; 

Filtre Rayonnement dégradé

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La classe GradientGlowFilter vous permet d'appliquer un effet de rayonnement optimisé aux objets d'affichage ou aux objets BitmapData. Cet effet donne davantage de contrôle sur le rayonnement, produitant ainsi un effet plus réaliste. De plus, le filtré Rayonnement dégradé permet d'appliquer un rayonnement aux côts intéérieur, extérieur ou supérieur de l'objet.

L'exemple suivant dessine un cercle auquel un filtré Rayonnement dégradé est appliqué. Le montant de flou horizontal et vertical augmente à mesure que le pointeur de la souris s'approche du coin inférieur droit de la scène. Si l'utilisateur clique dans la scène, le niveau de flou augmente.

import flash.events.MouseEvent;  
import flash.filters.BitmapFilterQuality;  
import flash_filters.BitmapFilterType;  
import flash_filters_grad盏GlowFilter; 

Exemple : Combinaison de filtres de base

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

L'exemple de code suivant applique plusieurs filtres de base, en combinaison avec un timer pour la création d'actions répetitives, pour obtenir la simulation d'un feu de circulation.

import flash.display.Shape;
import flash.events.TimerEvent;
import flash.filters.BitmapFilterQuality;
import flash_filters.BitmapFilterType;
import flash_filters.DropShadowFilter;
import flash_filters.GlowFilter;
import flash_filters.GradientBevelFilter;
import flash.utils.Timer;
var count:Number = 1 .
var distance:Number = 8 .
var angleInDegrees:Number = 225 ; // opposite of 45 degrees
var colors:Array = [0xFFFFCC,0xFEFE78,0x8F8E01] .
var alphas:Array = [1,0,1] .
var ratios:Array = [0,128,255] .
var blurX:Number = 8 .
var blurY:Number = 8 .
var strength:Number = 1 .
var quality:Number = BitmapFilterQuality.HIGH .
var type:String = BitmapFilterType.INNER;
var knockout:Boolean = false;

// Draw the rectangle background for the traffic light.  
var box:Shape = new Shape();  
box.graphics.lineStyle();  
box.graphics.beginFill(0xFEFE78);  
box.graphics.drawRect(100, 50, 90, 200);  
box.graphics.endFill(); 

Filtre Matrice de couleurs

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La classe ColorMatrixFilter permet de manipuler les valeurs de couleur et les valeurs alpha des objets filtrés. Il est ainsi possible de creer des changements de saturation, des rotations de teinte (passage d'une palette d'une plage de couleur à une autre), de définir la luminance de la couche alpha et de produit d'autres effets de manipulation des couleurs en utilisant les valeurs d'un canal couleur pour les appliquer aux autres canaux.

Le principe de fonctionnement de ce filtré est le suivant : les pixels de l'image source sont analysés un par un et leurs composants rouge, vert, bleu et alpha sont séparés. Les valeurs de la matrice de couleur sont alors multipliées par chacune de ces valeurs, et les résultats sont ajoutés pour déterminer la valeur colorimétrique réalisante qui sera affichée à l'écran pour ce pixel. La propriété matrix du filtré est un tableau de 20 nombres qui sont utilisés pour le calcul de la couleur finale. Pour plus d'informations sur l'algorithmé实用isé pour calculer les valeurs de couleur, voir la description de la propriété matrix de la classe ColorMatrixFilter dans le manuel Guide de référence ActionScript 3.0 pour la plateforme Adobe Flash.

Filtre Convolution

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La classe ConvolutionFilter permet d'appliquer un large éventail de transformations de traitement d'images aux objets; BitmapData ou aux objets d'affichage, tels que la définition du flou, la détction du contour, l'accentuation, l'estampage et le biseautage.

Le principe de fonctionnement du filtré Convolution est le suivant : les pixels del image source sont analysés un par un pour déterminer la couleur finale de ce pixel sur la base de sa valeur et de celles des pixels adjacent. Une matrice, sous forme d'un tableau de valeurs numériques, indique dans qu'elle mesure la valeur de chaque pixel adjacent particulier affecte la valeur finale.

Le type de matrice le plus frequently utilisé est un tableau de trois par trois. La matrice comporte donc neuf valeurs :

NNN
NPN
NNN

Lorsque le filtré Convolution est appliqué à un pixel donné, il analyse la valeur colorimétrique du pixel lui-même (« P » dans notre exemple) et celles des pixels environnants (« N » dans l'exemple). Toutefois, le choix des valeurs de la matrice permet de spécifique la priorité de certains pixels pour le calcul de l'image réalisante.

Par exemple, la matrice suivante, appliquée à un filtré Convolution, laissera l'image intacte, exactement comme l'image originale :

000
010
000

L'image n'a pas eté modifiée car la valeur du pixel original a une priorité relative de 1 pour déterminer la couleur du pixel final, alors que les pixels environnants ont une priorité relative de 0 (autrement dit, leur couleur n' affecte pas l'image finale).

De même, la matrice suivante provoque un décalage à gauche de tous les pixels d'une image :

000
001
000

Notez que dans cet exemple, le pixel lui-même n'a aucun effet sur la valeur finale du pixel affchéé au même emplacement dans l'image finale : seule la valeur du pixel de droite est utilisé pour déterminer la valeur réalisante de chaque pixel.

En ActionScript, la matrice est une combinaison d'une occurrence de l'objet Array contenant les valeurs et deux propriétés spécifique le nombre de lignes et de colonnes de la matrice. L'exemple suivant charge une image, puis lui applique un filtré Convolution sur la base de la matrice du listing précédent :

// Load an image onto the Stage.
var loader:Loader = new Loader();
var url:URLRequest new URLRequest("http://www.helpexamples.com/flash/images/image1.jpg"); loader.load(url); this.addChildloader);
function applyFilter(event:MouseEvent):void { // Create the convolution matrix. var matrix:Array = [0,0,0, 0,0,1, 0,0,0]; var convolution:ConvolutionFilter new ConvolutionFilter(); convolution.matrixX = 3 . convolution.matrixY = 3 . convolution.matrix matrix; convolution.divisor = 1 . loader_filters = [convolution];

loader.addEventListener(Eventclick,applyFilter);

Un point important n'est pas evident dans ce code : l'effect de valeurs autres que 1 ou 0 dans la matrice. Par exemple, la même matrice avec le chiffre 8 au lieu de 1 dans le coin supérieur droit effectuerait la même action (décalage des pixels vers la gauche). Toutefois, les couleurs de l'image seraient 8 fois plus lumineuses. En effet, les valeurs finale des couleur des pixels sont calculées en multipliant les valeurs de la matrice par celles des couleurs originales des pixels, en additionnant ces valeurs, puis en les divisant par celle de la propriété divisor du filtrte. Notez que, dans cet exemple, la propriété divisor a la valeur 1. En règle générale, pour que la luminosité des couleurs reste à peu pris identique à celle des couleurs de l'image originale, la propriété divisor doit avoir une valeur égale à la somme des valeurs de la matrice. Ainsi, avec une matrice dont la somme des valeurs est 8, et pour un diviseur de 1, l'image réalisante sera environ 8 fois plus lumineuse que l'image originale.

Bien que l'effet de cette matrice ne soit pas très spectaculaire, d'autres valeurs peuvent être utilisées pour créé divers effets. Voici quelques ensembles standard de valeurs de matrice permettant d'obtenir divers effets avec une matrice de trois sur trois :

  • Flou de base (diviseur 5):
0 1 0  
1 1 1  
0 1 0 
  • Détention des contours (diviseur 1):

$$ \begin{array}{l} \begin{array}{c c c} 0, & - 1, & 0 \end{array} \ - 1, \quad 4, \quad - 1 \ 0, - 1, 0 \ \end{array} $$

  • Estampage (diviseur 1):

$$ \begin{array}{l} - 2, - 1, 0 \ \begin{array}{c c c} - 1, & 1, & 1 \end{array} \ \begin{array}{c c c} 0, & 1, & 2 \end{array} \ \end{array} $$

Notez qu'vec la plupart de ces effets, le diviseur est 1. En effet, l'addition des valeurs négatives et des valeurs positives dans la matrice donne 1 (ou 0 dans le cas de la détction des contours, mais la valeur de la propriété divisor ne peut pas etre 0).

Filtre Mappage de déplacement

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La classe DisplacementMapFilter utilise des valeurs de pixel extraites d'un objet BitmapData (appelé image de mappage du déplacement) pour appliquer un effet de déplacement à un nouvel objet. L'image de mappage du déplacement est en général différente de l'occurrence d'objet d'affichage ou BitmapData à laquelle le filtré est appliqué. L'effect de déplacement nécessite de déplacer les pixels de l'image filtrée, autrement dit de les décaler d'un certain niveau. Ce filtrer permet de créé un effet de décalage, de gondole ou de marbrure.

La direction et la valeur du déplacement appliqué à un pixel donné sont déterminées par la valeur colorimétrique de l'image de mappage du déplacement. Pour utiliser ce filtré, il est nécessaire de spécifier l'image de mappage, ainsi que les valeurs suivantes, qui permettent de contröler le calcul du déplacement :

  • Point de mappage : emplacement, dans l'image filtrée, auquel le coin supérieur gauche du filtre de déplacement sera appliqué. Ce paramètre n'est nécessaire que pour appliquer le filtre à une partie de l'image seulement.
  • Composant X: canal couleur de l'imagé de mappage qui affecte la position x des pixels.
  • Composant Y : canal couleur de l'imag de mappage qui affecte la position y des pixels.
  • Echelle X : valeur multipicatrice qui indique le niveau de déplacement sur l'axe x.
  • Echelle Y: valeur multiplicitatrice qui indique le niveau de déplacement sur l'axe y.
  • Mode de filtrage : déterminé la marche à suivre dans le cas d'espaces vides créés par le décalage des pixels. Les options, définies par des constantes dans la classe DisplacementMapFilterMode, sont d'afficher les pixels originaux (mode Ignore), de décaler et transférer les pixels del'autre côté de l'image (mode WRAP, qui est le mode par défaut), d'utiliser le pixel déplacé le plus proche (mode CLAMP) ou de replir ces espaces vides avec une couleur (mode COLOR).

Pour comprendre le fonctionnement d'un filtr de mappage de déplacement, prenons un exemple simple. Dans le code ci-dessous, une image est chargée, puis elle est centree sur la scene et un filtr Mappage de déplacement lui est applique, ce qui déplace horizontally (vers la gauche) les pixels de toute l'image.

import flash.displayBitmapData;
import flash.display.Loader;
import flash.events.MouseEvent;
import flash.filters.DisplacementMapFilter;
import flashgeom.Point;
import flash.net(URLRequest;
// Load an image onto the Stage.
var loader:Loader = new Loader();
var url:URLRequest = new URLRequest("http://www.helpexamples.com/flash/images/image3.jpg"); loader.load(url); this.addChildloader);
var mapImage:BitmapData;
var displacementMap:DisplacementMapFilter;
// This function is called when the image finishes loading.
function setupStage(event:Event):void { // Center the loaded image on the Stage. loader.x = (stage.width - loader.width) / 2; loader.y = (stage.height - loader.height) / 2; // Create the displacement map image. mapImage = new Bitmap(load.width, loader.height, false, 0xFF0000); // Create the displacement filter. displacementMap = new DisplacementMapFilter(); displacementMap.mapBitmap = mapImage; displacementMap.mapPoint = new Point(0, 0); displacementMap_componentX = BitmapDataChannel.RED; displacementMap scaleX = 250 . loader_filters = [displacementMap];

loader(contentLoaderInfo.addEventListener(Event.COMPLET, setupStage);

Les propriétés utilisées pour définir le déplacement sont les suivantes :

  • Bitmap de mappage : le bitmap de déplacement est une nouvelle occurrence de BitmapData, créé par code. Ses dimensions sont identiques à celles de l'image chargée (le déplacement est donc appliqué à toute l'image). Elle est replie de pixels rouges opaques.
  • Point de mappage : cette valeur est définie pour le point 0, 0 (ici encore, le déplacement sera appliqué à toute l'image).
  • Composant X : cette valeur reçoit la constante BitmapDataChannel. RED, ce qui signifie que c'est la valeur de rouge de l'image bitmap de mappage qui déterminera le niveau de déplacement des pixels sur l'axe x.
  • Echelle X: cette valeur est réglée sur 250. L'image de mappage étant entièrement rouge, la valeur totale de déplacement ne décale l'image que faiblement (environ un demi-pixel). Si cette valeur était de 1, l'image ne serait donc décalée que de 0,5 pixel horizontally. EnChoosing une valeur de 250, nous déplaçons l'image d'environ 125 pixels.

Ces valeurs provoquent un déplacement des pixels de l'image filtrée de 250 pixels à gauche. La direction (gauche ou droite) et l'importance du déplacement dépendant de la valeur colorimétrique des pixels de l'image de mappage. Le principe de fonctionnement de ce filtré est le suivant : il analyse un par un les pixels de l'image filtrée (ou tout au moins ceux de la zone à laquelle le filtré est appliqué, ce qui ici signifie toute l'image), et procède comme suit pour chaque pixel :

1 Il détermine le pixel correspondant dans l'image de mappage. Par exemple, pour calculer la valeur de déplacement du pixel du coin supérieur gauche de l'image filtrée, le filtré analyse le pixel correspondant dans le coin supérieur gauche de l'image de mappage.
2 Il déterminé la valeur du canal de couleur spécifique dans le pixel de mappage. Dans cet exemple, le canal de couleur du composant x est le rouge. Le filtr recherche donc la valeur du canal rouge au point en question dans l'image de mappage. L' image de mappage étant un rouge opaque, le canal rouge du pixel a la valeur 0xFF, soit 255. Cette valeur est la valeur de déplacement.
3 Ils comparant ensuite la valeur de déplacement à la valeur mediane (127, à mi-chemin entre 0 et 255). Si la valeur de déplacement est inférieure à la valeur mediane, le pixel est déplaced dans une direction positive (vers la droite pour l'axe x, vers le bas pour l'axe y). Par contre, si la valeur de déplacement est supérieure à la valeur mediane ( comme dans cet exemple), le pixel est déplaced dans une direction négative (vers la gauche pour l'axe x, vers le haut pour l'axe y). Plus précisé, le filtre sousstrait la valeur de déplacement de 127, et le résultat (positif ou négatif) est la valeur relative de déplacement qui est appliquée.
4 Enfin, ils déterminent la valeur réelle de déplacement en calculant le pourcentage de déplacement complet représenté par la valeur de déplacement relatif. Dans cet exemple, un rouge à 100% provoque un déplacement de 100% . Ce pourcentage est ensuite multiplié par la valeur de l'échelle x ou de l'échelle y pour déterminer le nombre de pixels de déplacement à appliquer. Dans cet exemple, la valeur de déplacement est 100% multiplié par un multiple de 250, soit environ 125 pixels à gauche.

Comme nous ne spécifions aucune valeur pour les composants x et y, les valeurs par défaut (qui ne provoquent pas de déplacement) sont utilisées. C'est pourquoit l'image n'est pas déplacée dans le sens vertical.

Dans cet exemple, le paramètre par défaut de mode de filtrage, WRAP, est utilisé, si bien que lorsque les pixels sont déplacés vers la gauche, l'espace laissé vide à droite est rempli par les pixels qui ont été décalés le long du côté gauche de l'image. Vous pouvez modifier cette valeur pour voir les différents effets ainsi obtenus. Par exemple, si vous ajoutez la ligne suivante dans la partie du code qui définit les propriétés de déplacement (avant la ligne loader.filters = [displacementMap]), l'image semble avoir subi un balayage :

displacementMap.mode = DisplacementMapFilterMode.CLAMP;

Le code ci-dessous propose un exemple plus complexe, en utilisant un contrôle Mappage de déplacement pour creer un effet de loupe dans l'image :

import flash.display.Display;
import flash.display.Display.Data;
import flash.display.Display.DataChannel;
import flash.display.Display.GGradientType;
import flash.display.Loader;
import flash.display.Shape;
import flash.events.MouseEvent;
import flash.filters.DisplacementMapFilter;
import flash_filters.DisplacementMapFilterMode;
import flashgeom.Matrix;
import flashgeom.Point;
import flash.net URLsRequest;
// Create the gradient circles that will together form the
// displacement map image
var radius := 50;
var type:String = GradientType LINEAR;
var redColors:Array = [0xFF0000, 0x000000];
var blueColors:Array = [0x0000FF, 0x000000];
var alphas:Array = [1, 1];
var ratios:Array = [0, 255];
var xMatrix:Matrix = new Matrix();
xMatrix.createGradientBox(radius * 2, radius * 2);
var yMatrix:Matrix = new Matrix();
yMatrix.createGradientBox(radius * 2, radius * 2, Math.PI / 2);
var xCircle:Shape = new Shape();
xCircle.graphics.lineStyle(0, 0, 0);
xCircle.graphics.beginGradientFill(type, redColors, alphas, ratios, xMatrix);
xCircle.graphics.drawCircle(radius, radius, radius);
var yCircle:Shape = new Shape();
yCircle.graphics.lineStyle(0, 0, 0);
yCircle.graphics.beginGradientFill(type, blueColors, alphas, ratios, yMatrix);
yCircle.graphics.drawCircle(radius, radius, radius);
// Position the circles at the bottom of the screen, for reference.
this.addChild(xCircle);
xCircle.y = stage.stageHeight - xCircle.height;
this.addChild(yCircle);
yCircle.y = stage.stageHeight - yCircle.height;
yCircle.x = 200;
// Load an image onto the Stage.
var loader:Loader = new Loader();
var url:URLRequest = new URLRequest("http://www.helpexamples.com/flash/images/image1.jpg");
loader.load(url);
this.addChildloader);
// Create the map image by combining the two gradient circles.
var map:BitmapData = new BitmapData(xCircle.width, xCircle.height, false, 0x7F7F7F);
map.draw(xCircle);
var yMap:BitmapData = new BitmapData(yCircle.width, yCircle.height, false, 0x7F7F7F);
yMap.draw(yCircle);
map.copyChannel(yMap, yMap_rect, new Point(0, 0), BitmapDataChannel.BLUE,
BitmapDataChannel.BLUE); 

yMap.dispose();
// Display the map image on the Stage, for reference.
var mapBitmap:Bitmap = new Bitmap(map);
this.addChild(mapBitmap);
mapBitmap.x = 400 .
mapBitmap.y = stage.height - mapBitmap.height;
// This function creates the displacement map filter at the mouse location.
function magnify():void
{ // Position the filter. var filterX:Number = (loader.mouseX)-(map.width/2); var filterY:Number = (loader.mouseY)-(map.height/2); var pt:Point = new Point(filtersX,filterY); var xyFilter:DisplacementMapFilter = new DisplacementMapFilter(); xyFilter.mapBitmap = map; xyFilter.mapPoint = pt; // The red in the map image will control x displacement. xyFilter_componentX BitmapDataChannel.RED; // The blue in the map image will control y displacement. xyFilter_componentY BitmapDataChannel.BLUE; xyFilter_scaleX = 35 . xyFilter_scaleY = 35 . xyFilter_mode = DisplacementMapFilterMode.igneORE; loader_filters = [xyFilter];
}
// This function is called when the mouse moves. If the mouse is
// over the loaded image, it applies the filter.
function moveMagnifier(event:MouseEvent):void { if (loader_hitTestPointloader.mouseX,loader.mouseY)) { magnify(); }
}
loader.addEventListener(MouseEvent.MOUSE_MOVE,moveMagnifier);

Ce code génére d'abord deux cercles en dégradé, qui sont combinés pour former l'image de mappage du déplacement. Le cercle rouge est à l'origine du déplacement sur l'axe x (xyFilter.element n = BitmapDataChannel.red) et le cercle bleu est à l'origine du déplacement sur l'axe y (xyFilter_elementY = BitmapDataChannel.BLUE). Pour vous permettre de comprendre plus aisément l'aspect de l'image de mappage du déplacement, le code affiche les cercles originaux, ainsi que le cercle combiné qui fait office d'image de mappage, en bas de l'écran.

ADOBE ACTIONSCRIPT 3.0 - Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures - 1

ADOBE ACTIONSCRIPT 3.0 - Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures - 2

ADOBE ACTIONSCRIPT 3.0 - Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures - 3

ADOBE ACTIONSCRIPT 3.0 - Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures - 4

Le code charge ensuite une image et, en fonction des déplacements de la souris, applique le filtré de déplacement à la partie de l'image qui est sous la souris. Les cercles dégradés utilisés pour l'image de mappage de déplacement provoquent un effet centrifuge dans la zone à laquelle le filtré est appliqué. Notez que les zones en gris de l'image de mappage du déplacement ne provoquent pas de déplacement. En effet, la valeur du gris est 0 × 7F7F7F . Les canaux bleu et rouge de ce niveau de gris ont donc exactement une valeur Médiane, si bien qu'il n'y a pas de déplacement lorsqu'une zone grise apparait dans l'image de mappage. Il n'y a pas non plus de déplacement au centre du cercle. Bien que cette zone ne soit pas de couleur grise, ses canaux rouge et bleu ont des valeurs identiques à celles des canaux rouge et bleu du gris moyen, et puisque le déplacement est basé sur les valeurs de bleu et de rouge, aucun déplacement n'a lieu.

Filtre Shader

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

La classe ShaderFilter vous permet d'utiliser un effet de filtré personnelisé défini en tant que Shader de Pixel Bender. Parce que l'effet de filtré est écrit en tant que Shader de Pixel Bender, il peut être entièrement personnelisé. Le contenu filtré est transmis au Shader en tant qu'une image d'entrée et le résultat de l'opération du Shader devient le résultat du filtré.

Remarque : le filtrer Shader est pris en charge dans ActionScript à partir de Flash Player 10 et Adobe AIR 1.5.

Pour appliquer un filtré Shader à un objet, vous doivent commencer par créé une occurrence de Shader représentant le Shader de Pixel Bender en cours d'utilisation. Pour plus d'informations concernant la procédure de création d'une occurrence de Shader et la définition d'une image d'entrée et des paramètres correspondants, voir « Utilisation des shaders de Pixel Bender » à la page 310.

Lorsque vous utilisez un Shader en tant que filtre, vous neze tenir compte de trois considérations importantes :

  • Le Shader doit être définir pour accepter au moins une image d'entrée.

  • L'objet filtré (objet d'affichage ou objet BitmapData auquel est appliqué le contrôle) est transmis au shader en tant que première valeur d'image d'entrée. De ce fait, ne définissez pas manuellement la valeur de la première image d'entrée.

  • Si le Shader définit plusieurs images d'entrée, les autres entrées doivent être stipulées manuellement (en définissant la propriété input de toute occurrence de ShaderInput appartenant à l'occurrence de Shader).

Lorsque vous disposez d'un objet Shader pour le Shader, vous créez une occurrence de ShaderFilter. Il s'agit de l'objet filtré en tant que tel utilisé comme tout autre filtré. Pour créé un élément ShaderFilter qui utilise un objet Shader, appelez le constructeur ShaderFilter() et transmettez l'objet Shader en tant qu'argument, comme illustré dans le code suivant :

var myFilter:ShaderFilter = new ShaderFilter(myShader);

Pour-disposer d'un exemple complet d'utilisation d'un filtrer Shader,voir « Utilisation d'un Shader comme filtrre » à la page 328.

Exemple de filtrage des objets d'affichage : Filter Workbench

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

L'exemple Filter Workbench comporte une interface utilisateur qui permet d'appliquer divers filtres à des images et autre contenu visuel et de voir le code résultat, qui peut être utilisé pour générer le même effet en ActionScript. Non seulement cette application fournit un outil permettant d'expérimerer avec les filtres, mais elle illustré également les techniques suivantes :

  • Création d'occurrences de filtrés divers
    Application de plusieurs filtres à un objet d'affichage

Pour obtenir les fischiers d'application de cet exemple, voir www.adobe.com/go/learn_programmingAS3samplesflash_fr. Les fischiers d'application Filter Workbench résident dans le dossier Samples/FilterWorkbench. L'application se compose des fischiers suivants:

FichierDescription
com/example/programmingas3/filterWorkbench/FilterWorkbenchController.asClasse qui fournit la principale fonctionnalité de l'application, notamment permuter le contenu auquel sont appliqués les filtres et appliquer les filtres au contenu.
com/example/programmingas3/filterWorkbench/IFilterFactory.asInterface qui définit les méthodes courantes et implémentées par chacune des classes usine de filtres. Cette interface définit la fonctionnalité commune utilisée par la classe FilterWorkbenchController pour interagir avec chaque classe usine de filtres.
Dans le dossier com/example/programmingas3/filterWorkbench/ :BevelFactory.asBlurFactory.asColorMatrixFactory.asConvolutionFactory.asDropShadowFactory.asGlowFactory.asGradientBevelFactory.asGradientGlowFactory.asJeu de classes, dont chacune implémente l'interface IFilterFactory. Chacune de ces classes permet de créé et de définir les valeurs associées à un type unique de filtre. Les panneux de propriétés des filtres de l'application utiliser ces classes usine pour créé des occurrences des filtres correspondants, que la classe FilterWorkbenchController extrait et applique au contenu d'image.
com/example/programmingas3/filterWorkbench/IFilterPanel.asInterface qui définit les méthodes courantes et implémentées par les classes qui spécifient les panneaux de l'interface utilisé employés pour manipuler les valeurs de filtre dans l'application.
com/example/programmingas3/filterWorkbench/ColorStringFormatter.asClasse d'utilaires qui compte une méthode de conversion d'une valeur de couleur numérique au format chaine hexadecimal.
com/example/programmingas3/filterWorkbench/GradientColor.asClasse servant d'objet de valeur, qui combine en un objet unique les trois valeurs (couleur, alpha et rapport) associées à chaque couleur dans GradientBevelFilter et GradientGlowFilter.
Interface utiliser (Flex)
FilterWorkbench.mxmlFichier principal qui définit l'interface utiliser de l'application.
flexapp/FilterWorkbench.asClasse qui assure la fonctionnalité de l'interface utiliser de l'application principale. Elle sort de classe code-behind au fisquier MXML de l'application.
Dans le dossier flexapp/FilterPanels :BevelPanel.mxmlBlurPanel.mxmlColorMatrixPanel.mxmlConvolutionPanel.mxmlDropShadowPanel.mxmlGlowPanel.mxmlGradientBevelPanel.mxmlGradientGlowPanel.mxmlJeu de composants MXML qui assurent la fonctionnalité de chaque panneau utilisé pourdéfinir les options d'un filtre unique.
flexapp/ImageContainer.asObjet d'affichage qui sert de conteneur à l'image chargée à l'écran.
flexapp/controls/BGColorCellRenderer.asComposant de rendu de cellule personnalisé permettant de modifier la couleur d'arrête-plan d'une cellule dans le composant DataGrid
flexapp/controls/QualityComboBox.asContrôle personnalisé qui définit une liste déroulante modifiable associée au paramètre Qualité dans plusieurs panneaux de filtre.
flexapp/controls/TypeComboBox.asContrôle personnalisé qui définit une liste déroulante modifiable associée au paramètre Type dans plusieurs panneaux de filtre.
Interface utiliser (Flash)
FilterWorkbench.flaFichier principal qui définit l'interface utilisé de l'application.
flashapp/FilterWorkbench.asClasse qui assure la fonctionnalité de l'interface utilisé de l'application principale. Elle sert de classe de document au fischié FLA de l'application.
Dans le dossier flashapp/filterPanels : BevelPanel.as BlurPanel.as ColorMatrixPanel.as ConvolutionPanel.as DropShadowPanel.as GlowPanel.as GradientBevelPanel.as GradientGlowPanel.asJeu de classes qui assure la fonctionnalité de chaque panneau utilisé pour définir les options d'un filtre unique. A chaque classe correspond également un symbole MovieClip dans la bibliothèque du fischié FLA de l'application principale, dont le nom est identique à celui de la classe (par exemple, le symbole « BlurPanel » est lié à la classe définie dans BlurPanel.as). Les composants de l'interface utilisé sont placés et identifiés par nom dans ces symboles.
flashapp/ImageContainer.asObjet d'affichage qui sert de conteneur à l'image chargée à l'écran.
flashapp/BGColorCellRenderer.asComposant de rendu de cellule personnalisé permettant de modifier la couleur d'arrête-plan d'une cellule dans le composant DataGrid
flashapp/ButtonCellRenderer.asComposant de rendu de cellule personnalisé permettant d'insérer un composant Button dans une cellule du composant DataGrid
Contenu d'image filtré
com/example/programmingas3/filterWorkbench/ImageType.asCette classe sert d'objet de valeur contenant le type et l'URL d'un fischié d'image unique, dans lequel l'application peut charger et appliquer des filtres. Cette classe comporte également un jeu de constantes qui représentent les fischiés d'image en tant que tels disponibles.
images/sampleAnimation.swf, images/sampleImage1.jpg, images/sampleImage2.jpgImages et autre contenu visuel auxquels sont appliqués des filtres dans l'application.

Utilisation des filtres ActionScript

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

L'application Filter Workbench est conçue pour vous aider à expérimenter avec divers effets de filtrer et générer le code ActionScript approprié correspondant. Elle vous permet de sélectionner trois fischiers distincts comptant un contenu visuel, tel que des images bitmap et une animation créée par Flash et d'appliquer huit filtres ActionScript distincts à l'image selectionnée, soit seuls, soit combinés à d'autres filtres. L'application comprend les filtres suivants :

  • Biseau (flash_filters.BevelFilter)
  • Flou (flash_filters BlurFilter)
  • Matrice de couleurs (flash_filters.ColorMatrixFilter)
  • Convolution (flash_filters.ConvolutionFilter)
  • Ombre portée (flash_filters.DropShadowFilter)
  • Rayonnement (flash_filters.GlowFilter)
  • Biseau dégradé (flash_filters.GradientBevelFilter)
  • Rayonnement dégradé (flash_filters.GradientGlowFilter)

Lorsqu'un utilisateur a selectionné une image et un filtre à appliquer à celle-ci, l'application affiche un panneau contenant des contrôleires de définition des propriétés du filtre selectionné. Par exemple, l'image suivante illustré l'application dans laquelle est selectionné le filtre Biseau :

Filter Workbench Example

From Programming ActionScript 3.0, Chapter 15: Filtering Visual Objects

Source image:

Bitmap image 1

ADOBE ACTIONSCRIPT 3.0 - Filter Workbench Example - 1

Filter:

Bevel

ADOBE ACTIONSCRIPT 3.0 - Filter Workbench Example - 2

Lorsque l'utilisateur regle les propriétés du filtr, l'aperçu est actualisé en temps réel. L'utilisateur peut également appliquer plusieurs filtrs. Pour ce faire, il personnalise un filtr, clique sur le bouton Apply, personnalise un autre filtr, clique sur le bouton Apply, et ainsi de suite.

Les panneaux de filtré de l'application proposent diverses fonctions et sont soumis à quelques limites :

  • Le filtrte Matrice de couleurs comprend un jeu de contrôleles permettant de manipuler directement des propriétés d'image courantes telles que la luminosite, les contrastes, la saturation et la teinte. Il est également possible de définir des valeurs de matrice de couleurs personalisées.
  • Le filtré Convolution, qui n'est disponible qu'en ActionScript, comprend un jeu de valeurs de matrice de convolution couramment utilisées. Il est également possible de définir des valeurs personnalisées. Toutefois, bien que la classe ConvolutionFilter gère une matrice de n'importe qu'elle taille, l'application Filter Workbench utilise une matrice de 3 × 3 fixe, soit la taille de filtré la plus fraisment utilisé.
  • Le filtré Mappage de déplacement et le filtré Shader, réservés à ActionScript, ne sont pas disponibles dans l'application Filter Workbench.

Creation d'occurrences de filtré

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

L'application Filter Workbench comprend un jeu de classes, une par filtrtre disponible, qui sont utilisées par les divers panneaux pour créé les filtres. Lorsqu'un utiliserseur selectionne un filtrtre, le code ActionScript associé au panneau de filtrtre create une occurrencie de la classe de filtres usine appropriée. (Ces classes portent le nom de classes usine, car elles ont pour objet de creation des occurrences d'autres objets, à l'instar d'une vraie usine qui fabrique des produits).

Lorsque l'utilisateur modifie la valeur d'une propriété dans le panneau, le code correspondant appelle la méthode appropriée dans la classe usine. Chaque classe usine comporte des méthodes spécifique utilisées par le panneau pour creer l'occurrence de filtré appropriée. Par exemple, si l'utilisateur seLECTIONne le filtré Flou, l'application cree une occurrence de BlurFactory. La classe BlurFactory comporte une méthode modifyFilter() qui gère trois paramètres : blurX, blurY et quality. Conjointement, ces paramètres permettent de creer l'occurrence de BlurFilter requise :

private var _filter BlurFilter;
public function modifyFilter(blurX:Number = 4 , blurY:Number = 4 , quality:int = 1 ):void { _filter new BlurFilter(blurX, blurY, quality); dispatchEvent(new Event(Event.CHANGE));
}

En revanche, si l'utilisateur seLECTIONne le filtré Convolution, celui-ci étant beaucoup plusouple, il contrôle un nombre supérieur de propriétés. Dans la classe ConvolutionFactory, le code suivant est appelé lorsque l'utilisateur seLECTIONne une autre valeur dans le panneau des filtres :

private var _filter:ConvolutionFilter;
public function modifyFilter matrixX:Number = 0 . matrixY:Number = 0 . matrix:Array = null divisor:Number = 1.0 bias:Number = 0.0 preserveAlpha:Boolean = true, clamp:Boolean = true, color:uint = 0 alpha:Number = 0.0 ):void
{ _filter = new ConvolutionFiltermatrixX, matrixY, matrix, divisor, bias, preserveAlpha, clamp, color, alpha); dispatchEvent(new Event(Event.CHANGE));
}

Notez que dans chaque cas, lorsque les valeurs du filtré sont modifiées, l'objet usine distribue un événement Event.CHANGE pour avertir les écouteurs de la modification. La classe FilterWorkbenchController, qui applique les filtrés au contenu filtré, recherche cet événement pour s'assurer qu'elle doit extraire une nouvelle copie du filtré et l'appliquer à nouveau au contenu filtré.

La classe FilterWorkbenchController n'a pas besoin de connaître les détails précis de chaque classe usine associé au filtrte. Elle doit juste savoir que le filtrte a été modifié et être en mesure d'acceder à une copie de ce dernier. A cet effet, l'application compte une interface, IFilterFactory, qui définit le comportement requis d'une classe usine de filtres pour que l'occurrence de FilterWorkbenchController de l'application soit en mesure de fonctionner correctement. L'interface IFilterFactory définit la méthode getFilter() utilisé par la classe FilterWorkbenchController :

function getFilter():BitmapFilter;

Notez que la définition de la méthode de l'interface getFilter() stipule de renvoyer une occurrence de BitmapFilter只不过 qu'un type déterminé de filtrre. La classe BitmapFilter ne définit pas de type spécifique de filtrre. BitmapFilter constitue de fait la classe de base sur laquelle se fondent toutes les classes de filtrre. Chaque classe usine de filtres définit une implémentation déterminée de la méthode getFilter(), dans laquelle elle renvoie une référence à l'objet filtré généralé. Par exemple, une version abrégée du code source de la classe ConvolutionFactory est illustrée ci-après:

public class ConvolutionFactory extends EventDispatcher implements IFilterFactory { //----- Private vars ----- private var _filter:ConvolutionFilter; //----- IFilterFactory implementation ----- public function getFilter():BitmapFilter { return _filter; } } 

Dans l'implementation de la classe ConvolutionFactory de la méthode getFilter(), elle renvoie une occurrence de ConvolutionFilter, bien que tout objet qui appelle getFilter() ne sache pas nécessairement que, conformément à la définition de la méthode getFilter() appliquée par ConvolutionFactory, il doit renvoyer toute occurrence de BitmapFilter, soit une occurrence de n'importe qu'elle classe de filtré ActionScript.

Application de filtres aux objets d'affichage

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Comme indiqué précédemment, l'application Filter Workbench utilise une occurrencce de la classe

FilterWorkbenchController (appee e à partir de Maintenant l'« occurence de contrôle »), chargée d'appliquer les filtres à l'objet visuel selectionné. Avant que l'occurrence de contrôle ne puisse appliquer un filtre, elle doit identifier l'image ou le contenu visuel concerné. Lorsque l'utiliseur selectionne une image, l'application appelle la méthode setFilterTarget() de la classe FilterWorkbenchController et transmet l'une des constantes définies dans la classe ImageType:

public function setFilterTarget(targetType:ImageType):void { ... _loader = new Loader(); ... _loader(contentLoaderInfo.addEventListener(Event.COMPLETEX, targetLoadComplete); } 

En se référant à ces informations, l'occurrence de contrôleur charge le fichier indiqué, puis le stocke dans une variable d'occurrence appelée _currentTarget :

private var _currentTarget: DisplayObject;   
private function targetLoadComplete(event:Event):void { ___, ___, ___, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __ 

Lorsque l'utilisateur selectionne un filtr, l'application appelle la méthode setFilter() de l'occurrence de contrôleur en indiquant au contrôleur une referrerce à l'objet Filter Factory approprié, qu'elle stocke dans une variable d'occurrence appelée_filterFactory.

private var _filterFactory:IFilterFactory;
public function setFilterfactory factory:IFilterFactory):void { .. _filterFactory = factory; _filterFactory.addEventListener(Event.CHANGE,filterChange); }

Notez que, comme indiqué précédemment, l'occurrence de contrôleur ne connait pas le type de données précis de l'occurrence de Filter Factory assigné. Elle ne sait qu'une chose, c'est que l'objet implèmente l'occurrence de IFilterFactory, ce qui signifie qu'il possède une méthode getFilter() et distribue un événement change (Event.CHANGE) lorsque le filtré est modifié.

Lorsque l'utilisateur modifie les propriétés d'un filtré dans le panneau des filtres, l'occurrence de contrôleur est avertie de la modification par l'évenement change de Filter Factory, qui appelle la méthode filterChange() de l'occurrence de contrôleur. Cette méthode appelle alors la méthode applyTemporaryFilter():

L'application du filtré à l'objet d'affichage se produit au sein de la méthode applyTemporaryFilter(). Le contrôleur extrait d'abord une ↔reference à l'objet filtré en appelant la méthode getFilter() de Filter Factory.

var currentFilter:BitmapFilter = _filterFactory.getFilter(); 

L'occurrence de contrôleur possède une variable d'occurrence de Array appelée _currentFilters, dans laquelle elle stocke tous les filtres appliqués à l'objet d'affichage. L'étape suivante consiste à ajouter le filtre mis à jour à ce tableau :

_currentFilters.push(currentFilter); 

Le code assigne ensuite le tableau de filtres à la propriété filters de l'objet d'affichage, qui applique à proprement parler les filtres à l'image :

__currentTarget.filters = __currentFilters; 

Enfin, puisque le filtré appliqué en dernier demeure le filtré de « travail », il ne doit pas être appliqué à titre définitif à l'objet d'affichage. Il est donc supprimé du tableau _currentFilters:

_currentFilters.pop(); 

Supprimer ce filtré du tableau n'afecte pas l'objet d'affichage filtré, car un objet d'affichage effectue une copie du tableau de filtres lorsqu'il est assigné à la propriété filters et utilise ce tableau interne au lieu du tableau initial. De ce fait, toute modification du tableau de filtres n'afecte pas l'objet d'affichage tant que le tableau n'a pas été à nouveau assigné à la propriété filters de l'objet d'affichage.

Chapitre 15 : Utilisation des shaders de Pixel Bender

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

Adobe Pixel Bender Toolkit permit aux développpeurs de composer des shaders qui creent des effets graphiques et autres. Le pseudo-code binaire Pixel Bender peut etre execute dans ActionScript pour appliquer l'effet aux données de l'image ou au contenu visuel. L'utilisation des shaders de Pixel Bender vous donne la possibilité de creator des effets visuels personalisés et de Traitser des données au-delà des fonctions incorporees à ActionScript.

Remarque : Pixel Bender est pris en charge depuis Flash Player 10 et Adobe AIR 1.5. Les fusions, filtres et replissages Pixel Bender ne sont pas pris en charge en cas de rendu par le processeur graphique.

Voir aussi

Adobe Pixel Bender Technology Center

Pixel Bender Developer's Guide (disponible en anglais uniquement)

Pixel Bender Reference (disponible en anglais uniquement)

flash.display.Shader

flash_filters.ShaderFilter

Pixel Bender basics for Flash (disponible en anglais uniquement)

Pixel Bender basics for Flex (disponible en anglais uniquement)

Principes de base des shaders de Pixel Bender

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

Adobe Pixel Bender est un langage de programmation qui permet de creer ou de manipuler un contenu d'image. Par le biais de Pixel Bender, vous creez un noyau, également appelé un Shader. Le Shader définit une fonction unique executée séparément sur chacun des pixels d'une image. Le résultat de chaque appel à la fonction est la couleur de sortie aux coordonnées de ce pixel dans l'image. Vous pouvez spécifique des valeurs de paramètre et images d'entrée pour personneliser l'opération. Si un Shader est executé une seule fois, les valeurs de paramètres et d'entrée sont des constantes. Les seuls éléments qui varient sont les coordonnées du pixel dont la couleur est le résultat de l'appel de la fonction.

Dans la mesure du possible, la fonction shader est appelée pour plusieurs coordonnées de pixel de sortie en parallèle. Les performances du Shader sont ainsi optimisées et le traitement s'avéré souvent particulièrement efficace.

ActionScript permet de creer facilement trois types d'effets par le biais d'un Shader :

  • replissage d'un dessin
    mode de fondu
  • filtré

Il est également possible d'executer un Shader en mode autonome. En mode autonome, vous accédez directement au résultat d'un Shader au lieu de prédéfinir l'utilisation prévu. Le résultat correspond à des données d'image, des données binaires ou des données numériques. Il n'est pas nécessaire que les données soient des données d'image. Vous pouze ainsi affecter à un Shader un jeu de données en entrée. Le Shader traite les données et vous accédez au résultat qu'il renvoie.

Pixel Bender est pris en charge depuis Flash Player version 10 et Adobe AIR version 1.5. Les fusions, filtres et replissages Pixel Bender ne sont pas pris en charge en cas de rendu par processeur graphique. Sur un périphérique mobile, les shaders Pixel Bender sont exécutés en cas de rendu par unité centrale. Les performances ne sont toute fois pas à la hauteur de celles d'un poste de travail. De nombreux programmes de Shader ne s'exécutent qu'à quelques images par seconde.

Concepts importants et terminologie

La liste de référence suivante contient des termes importants relatifs à la création et à l'utilisation de shaders de Pixel Bender :

Noyau Pour Pixel Bender, un noyau est équivalent à un Shader. Par le biais de Pixel Bender, votre code définit un noyau, qui définit une fonction unique executée séparément sur chaque des pixels d'une image.

Pseudo-code binaire Pixel Bender Lorsqu'un noyau Pixel Bender est compile, il est transformé en pseudo-code binaire Pixel Bender. L'accès au pseudo-code binaire et son exécution se produit lors de l'exécution.

Language Pixel Bender Langage de programmation utilise pour creer un noyau Pixel Bender.

Pixel Bender Toolkit Application utilise pour creer un fichier de pseudo-code binaire Pixel Bender à partir du code source Pixel Bender. Elle vous permet d'ecrire, de tester et de compiler un code source Pixel Bender.

Shader Dans le cadre de ce document, un Shader est un jeu de fonctionnalités écrites dans le langage Pixel Bender. Le code d'un Shader cree un effet visuel ou efectue un calcul. Dans les deux cas, le Shader renvoie un jeu de données (il s'agit en regle generale des pixels d'une image). Le Shader execute la meme opération sur chaque point de données, à l'exception des coordonnées du pixel de sortie. Le Shader n'est pas ecrit en ActionScript. Il est ecrit dans le langage Pixel Bender et compile en pseudo-code binaire Pixel Bender. Il peut etre integre a un fichier SWF lors de la compilation ou charge en tant que fichier externe lors de I'execution. Dans les deux cas, pour y acceder dans ActionScript, il est nécessaire de creer un objet Shader et de le lien au pseudo-code binaire du Shader.

Entrée du Shader Entrée complexe, généralement composée de données d'image bitmap, fournie à un Shader qui l'utilise dans ses calculs. Pour chaque variable d'entrée définie dans un Shader, une valeur unique (une image unique ou un jeu de données binaires) est utilisé pour l'exécution debout en bout du Shader.

Paramètre de Shader Valeur unique (ou jeu de valeurs limité) fournie à un Shader, qui l'utilise dans ses calculs. Chaque valeur de paramètre est définie pour une exécution de Shader unique et la même valeur est utilisé de bout enbout lors de l'exécution du Shader.

Utilisation des exemples de code

Il peut s'avérer utile de tester les exemples de code fournis. Cette opération nécessite d'exécuter le code et d'afficher les résultats dans le fichier SWF créé. Tous les exemples créé un contenu par le biais de l'API de dessin qui utilise l'effect de Shader ou est modifiée par ce dernier.

La plupart des exemples de code se composent de deux parties. La première partie correspond au code source Pixel Bender associé au Shader utilisé dans l'exemple. Vous doivent commencer par utiliser Pixel Bender Toolkit pour compiler le code source dans un filchier de pseudo-code binaire Pixel Bender. Procedez comme suit pour creer le filchier de pseudo-code binaire Pixel Bender :

1 Ouvrez Adobe Pixel Bender Toolkit. Le cas échéant, dans le menu Build (Développement),CHOISSEZ « Turn on Flash Player warnings and errors » (Activer les avertissements et erreurs Flash Player).

2 Copiez le code Pixel Bender et collez-le dans le panneau de l'éditeur de code de Pixel Bender Toolkit.
3 Dans le menu File (Fichier),CHOISSEZ « Export kernel filter for Flash Player » (Exporter le filtr de noyau associé à Flash Player).
4 Enregistrez le fichier de pseudo-code binaire Pixel Bender dans le même repertoire que le document Flash. Le nom du fichier doit etre identique a celui stipulé dans la description de l'exemple.

La partie ActionScript de chaque exemple est écrite en tant que fichier de classe. Pour tester l'exemple dans Flash Professional :

1 Creez un document Flash vide et enregistrez-le sur votre ordinateur.
2 Créez un nouveau fjichier ActionScript et enregistrez-le dans le même répertoire que le document Flash. Le nom du fjichier doit correspondre au nom de la classe du code. Par exemple, si le code définit une classe MyApplication, enregistrez le fjichier ActionScript sous le nom MyApplication.as.
3 Copiez le code dans le fichier ActionScript et enregistrez le fichier.
4 Dans le document Flash, cliquez sur une partie vide de la scene 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 copieedu texte.
6 Executez le programme en selectionnant Contrôle > Tester l'animation.

Les résultats de l'exemple s'affichent dans la fenêtre d'aperçu.

Ces techniques de test des exemples de code font l'objet d'une description détaillée dans « Utilisation des exemples de code ActionScript » à la page 1145.

Chargement ou intégration d'un Shader

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

La première étape dans l'utilisation d'un Shader de Pixel Bender dans ActionScript consiste à pouvoir acceder au Shader en code ActionScript. comme un Shader est créé à l'aide d'Adobe Pixel Bender Toolkit et rédigé dans le langage Pixel Bender, on ne peut pas y acceder directement dans ActionScript. Il faut plutôt creator une occurrence de la classe Shader qui représenté le Shader de Pixel Bender à ActionScript. L'objet Shader vous permet de trouver les informations concernant le Shader : par exemple, s'il prévoit de receivevoir des paramètres ou des valeurs pour l'image d'entrée. Vous passez l'objet Shader aux autres objets pour utiliser effectivement le Shader. Par exemple, pour utiliser le Shader comme filtré, vous affectez l'objet Shader à la propriété Shader d'un object ShaderFilter. Ou bien, afin d'utiliser le Shader pour replir l'écran dans un dessin, vous passez l'objet Shader comme argument à la méthode

Graphics.beginShaderFill().

Votre code ActionScript peut acceder à un Shader créé par Adobe Pixel Bender Toolkit (un fichier .pbj) de deux façon distinctes :

  • Chargement lors de l'exécution : leESHier shader peut etre charge comme un elément externe a laide d'un objet URLLoader. Cette technique est comparable au chargement d'un elément externe, comme un fichier texte, par exemple. L'exemple suivant montre le chargement à l'exécution d'un fichier de pseudo-code binaire de shader et sa liaison à une occurrence de Shader :

var loader:URLLoader = new URLLoader();
loader.dataFormat URLsLoaderDataFormat.BINARY;
loader.addEventListener(Event.COMPLET, onLoadComplete);
loader.load(new URLRequest("myShader.pbj"));
var shader:Shader;
function onLoadComplete(event:Event):void { // Create a new shader and set the loaded data as its bytecode shader = new Shader(); shader bytecode = loader.data; // You can also pass the bytecode to the Shader() constructor like this: // shader = new Shader(load.data); // do something with the shader
}

  • Intégration au fjichier SWF : le fjichier shader peut être intégré au fjichier SWF lors de la compilation à l'aide de la balise de métadonnées [Embed]. La balise de métadonnées [Embed] n'est disponible que si vous utilisez le kit de développement Flex pour compiler le fjichier SWF. Le paramètre source de la balise [Embed] pointe vers le fjichier du shader et son paramètre mimeType est "application/ octet-stream", comme dans l'exemple ci-dessous :

[Embedsource="myShader.pbj", mimeType = "application/occtet-stream")]
var MyShaderClass:Class;
//...
// create a shader and set the embedded shader as its bytecode
var shader:Shader new Shader();
shader bytecode new MyShaderClass();
// You can also pass the bytecode to the Shader() constructor like this:
// var shader:Shader new Shader(new MyShaderClass());
// do something with the shader

Dans les deux cas, vous liez le pseudo-code brut du Shader (la propriété URLLoader.data ou une occurrence de la classe de données [Embed]) à l'occurrence de Shader. Comme le montrent les exemples précédents, vous pouze affecter le pseudo-code binaire à l'occurrence du Shader de deux façon. Vous pouze transmettre le pseudo-code binaire du Shader sous forme d'argument au constructeur Shader(). Vous pouze également le définir en tant que propriété bytecode de l'occurrence de Shader.

Dès qu'un Shader de Pixel Bender est créé et lie à l'objet Shader, vous pouvez utiliser le Shader pour creer des effets de plusieurs façon. Vous pouvez l'utiliser en tant que filtré, mode de fondu, replissage de bitmap ou comme moyen de traitement autonome d'image bitmap ou autres données. Vous pouvez également utiliser la propriété data de l'objet Shader pour acceder aux métadonnées du Shader, spécifique les images d'entrée et spécifique les valeurs du paramétrage.

Accès aux métadonnées du Shader

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

Tandis qu'il create un noyau de Shader de Pixel Bender, le programmeur peut spécifier des métadonnées sur le Shader dans le code source Pixel Bender. Vous pouvez inspecter le Shader et extraire ses métadonnées pendant que vous l'utilisez dans ActionScript.

Lorsque vous creez une occurrence de Shader et que vous la liez à un Shader de Pixel Bender, un objet ShaderData, qui contient des données sur le Shader, est créé et enregistré dans la propriété data de l'objet Shader. La classe ShaderData ne définit aucune de ses propres propriétés. Toutefois, lors de l'execution, une propriété est ajoutée dynamiquement à l'objet ShaderData pour chaque valeur de métadonnées définie dans le code source du Shader. Le nom attribué à chaque propriété est pareil à celui spécifique dans les métadonnées. Par exemple, supposez que le code source d'un Shader de Pixel Bender contienne la définition des métadonnées suivante:

namespace : "Adobe::Example";

vendor : "Bob Jones";

version : 1;

L'objet ShaderData créé pour ce shader l'est avec les propriétés et valeurs suivantes :

Comme les propriétés de métadonnées sont ajoutées dynamiquement à l'objet ShaderData, vous pouvez utiliser une boucle for...in pour inspector l'objet ShaderData. Cette technique vous permet de vous rendre compte si le shader possède des métadonnées et quelles sont ses valeurs. Outre les propriétés des métadonnées, un objet ShaderData peut avoir des propriétés représentant des entrées et des paramètres qui sont définis dans le shader. Lorsque vous utilisez une boucle for...in pour inspector un objet ShaderData, vérifie le type de données de chaque propriété pour vous rendre compte si la propriété est une entrée (une occurrence de ShaderInput), un paramètre (une occurrence de ShaderParameter) ou une valeur de métadonnées (une occurrence de String). L'exemple ci-dessous montre comment utiliser une boucle for...in pour examiner les propriétés dynamiques de la propriété data d'un shader. Chaque valeur de métadonnées est ajoutée à une occurrence de Vector appelée metadata. Remarquez que cet exemple suppose qu'une occurrence de Shader appelée myShader existe déjà :

var shimmerData:ShaderData = myShader.data;   
var metadata:Vector.<String> = new Vector.<String>();   
for (var prop:String in shimmerData) { if (!( shimmerData[prop] is ShaderInput) && !( shimmerData[prop] is ShaderParameter)) { metadata[metadata.length] = shimmerData[prop]; } }   
// do something with the metadata 

Pour une version de cet exemple, qui extrait également des entrées et des paramètres de Shader, voir « Identification des entrées et des paramètres d'un Shader » à la page 315. Pour plus d'informations sur les propriétés des entrées et des paramètres, voir « Séquence des valeurs des entrées et des paramètres d'un Shader » à la page 315.

Spécification des valeurs des entrées et des paramètres d'un Shader

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

De nombreux shaders de Pixel Bender sont définis pour faire appel à une ou plusieurs images utilisées au cours de son traitement. Par exemple, il est courant pour un Shader d'accepter une image source et de la produit dotée d'un effet particulier. Suivant l'utilisation du Shader, soit la valeur d'entrée est spécifiée automatiquement, soit il faut en fournir une. De la même façon, de nombreux shaders spécifique des paramétres utilisés dans l'individualisation de ce qu'ils produit. Il faut également définir explicitement une valeur pour chaque paramètre avant d'utiliser le Shader.

Voussutilisezlapropietede data del'object Shader pour definir les entrées et les parametres et pour étabrir si un Shader en particulier prévoit des entrées et des paramétres. La propietédata est une occurrence de ShaderData.

Identification des entrées et des paramètres d'un Shader

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

La première étape dans la spécification de valeurs d'entrée et de paramètres d'un Shader consiste à savoir si celui que vous utilisez prévoit de receivevoir des images d'entrée ou des paramètres. Chaque occurrence de Shader possède une propriété data qui contient un objet ShaderData. Si le Shader spécifique des entrées ou des paramètres, on y accède en tant que propriétés de cet objet ShaderData. Les noms des propriétés correspondant aux noms spécifique dans le code source du Shader pour les entrées et les paramètres. Par exemple, si un Shader spécifique une entrée appelée src, l'objet ShaderData possède une propriété appelée src qui représentée cette entrée. Chaque propriété qui représentée une entrée est une occurrence de ShaderInput et chaque propriété qui représentée un paramètre est une occurrence de ShaderParameter.

Idéalement, le programmeur du Shader fournit une documentation pour le Shader afin de déscrire quels sont les paramètres et les valeurs de l'image d'entrée qu'il prévoit, ce qu'ils représentent, les valeurs appropriées, et ainsi de suite.

Toutefois, si le Shader n'est pas documenté et que vous ne disposez pas du code source, vous pouvez inspector les données du Shader pour identifier ces entrées et paramètres. Les propriétés qui représentent ces entrées et paramètres sont ajoutées dynamiquement à l'objet ShaderData. Par conséquent, vous pouze utiliser une boucle for...in pour inspecter l'objet ShaderData afin de savoir si le Shader qui lui est associé spécifique de tels entrées ou paramètres. Comme le décrit la section « Accès aux métadonnées du Shader » à la page 314, on accède également, en tant que propriété dynamique ajoutée à la propriété Shader.data, à toute valeur de métadonnées définie pour un Shader. Lorsque vous utilisez cette technique afin d'identifier entrées et paramètres, vérifie le type de données des propriétés dynamiques. Si une propriété est une occurrence de ShaderInput, elle représentée une entrée. S'il s'agit d'une occurrence de ShaderParameter, elle représentée un paramètre. Sinon, il s'agit d'une valeur de métadonnées. L'exemple ci-dessous montre comment utiliser une boucle for...in pour examiner les propriétés dynamiques de la propriété data d'un Shader. Chaque entrée (objet ShaderInput) est ajoutée à une occurrence de Vector appelée inputs. Chaque paramètre (objet ShaderParameter) est ajouté à une occurrence de Vector appelée parameters. Enfin, toute propriété de métadonnées est ajoutée à une occurrence de Vector appelée metadata. Remarquez que cet exemple suppose qu'une occurrence de Shader appelée myShader existe déjà :

var shimmerData:ShaderData = myShader.data;  
var inputs:Vector.<ShaderInput> = new Vector.<ShaderInput>();  
var parameters:Vector.<ShaderParameter> = new Vector.<ShaderParameter>();  
var metadata:Vector.<String> = new Vector.<String>();  
for (var prop:String in shimmerData)  
{  
    if ( shimmerData[prop] is ShaderInput)  
    {  
        inputs[inputs.length] = shimmerData[prop];  
    }  
else if ( shimmerData[prop] is ShaderParameter)  
{  
        parameters[parameters.length] = shimmerData[prop];  
    }  
else  
{  
        metadata[metadata.length] = shimmerData[prop];  
}  
} 

Spécification des valeurs d'entrée d'un Shader

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

De nombreux shaders prévoient de receivevoir une ou plusieurs images d'entrée qui sont utilisées au cours de son traitement. Toutefois, dans nombre de cas, une entrée est automatiquement spécifiée lorsque l'objet Shader est utilisé. Par exemple, supposons qu'unShader ait besoin d'une entrée et qu'il serve de filtré. Lorsque le filtré est appliqué à un objet d'affichage ou BitmapData, cet objet est défini automatiquement comme entrée. Dans ce cas, on ne spécifie pas explicitement une valeur d'entrée.

Toutefois, dans certains cas, et plus particulièrement si un shader spécifique plusieurs entrées, il faut définiter explicément une valeur pour l'entrée. Toute entrée définie dans un shader est représentée dans ActionScript par un objet ShaderInput. L'objet ShaderInput est une propriété de l'occurrence de ShaderData dans la propriété data de l'objet Shader (voir « Identification des entrées et des paramètres d'unESHader » à la page 315). Par exemple, supposons qu'un shader définisse une entrée appelée src et qu'il soit lié à un objet Shader appelé myShader. Vous accédez alors à l'objet ShaderInput qui correspond à l'entrée src à l'aide de l'identifiant suivant :

myShader.data src

Chaque objet ShaderInput possède une propriété input qui est utilisé pour définir la valeur de l'entrée. On définit la propriété input sur une occurrence de BitmapData pour spécifique des données d'image. On peut aussi définir la propriété input sur BitmapData ou Vector.occurrence de pour spécifique des données binaires ou des nombres. Pour plus d'informations sur l'utilisation d'une occurrence de BitmapData ou Vector. en entree et les restrictions correspondantes, voir ShaderInput .input dans le Guide de référence ActionScript 3.0 pour la plate-forme Adobe Flash.

En plus de la propriété input, un objet ShaderInput possède des propriétés qui peuvent être utilisées pour déterminer quel type d'image prévoit l'entrée. Ces propriétés contiennent elles-mêmes les propriétés width, height et channels. Chaque objet ShaderInput possède également une propriété index qui est utile afin de déterminer si une valeur explicite doit être fournie pour l'entrée. Si un shader prévoit de receivevoir davantage d'entries que le nombre fixé automatiquement, vous pouze alors définir des valeurs pour ces entrées. Pour plus de détails sur les différentes façon d'utiliser un shader et pour savoir si ou qui ou non les valeurs d'entrée sont fixées automatiquement, voir « Utilisation d'un Shader » à la page 320.

Spécification des valeurs de paramètres dans un Shader

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

Certain shaders définissant des valeurs de paramètres qu'ils utilisent dans la création de leur résultat. Par exemple, un shader qui modifie la luminosité d'une image pourrait spécifier un paramètre de luminosité qui déterminé dans chaque mesure l'opération affecte cette luminosité. Un paramètre unique défini dans un shader peut prévoir une ou plusieurs valeurs suivant la façon dont il a été spécifié dans le shader. Tout paramètre défini dans un shader est représenté dans ActionScript par un objet ShaderParameter. L'objet ShaderParameter est une propriété de l'occurrence de ShaderData dans la propriété des données de l'objet Shader. Une description se trouve dans la section « Identification des entrées et des paramètres d'un shader » à la page 315. Par exemple, supposons qu'un shader qui définit un paramètre appelé luminosité soit représenté par un objet Shader appelé myShader. Vous accédez alors à l'objet ShaderParameter correspondant au paramètre luminosité à l'aide de l'identifiant suivant :

myShader.data.brightness

Pour spécifique une ou plusieurs valeurs pour le paramètre, créez un tableau ActionScript contenant la ou les valeurs et affectez-le à la propriété value de l'objet ShaderParameter. La propriété value est définie en tant qu'occurrence d'Array car il est possible qu'un seul paramètre duShader nécessite plusieurs valeurs. Meme si le paramètre du Shader ne prévoit qu'une seule valeur, il vous faut placer la valeur dans un objet Array pour l'affector à la propriété ShaderParameter.value. Le code suivant montre comment définiir une seule valeur pour la propriété value.

myShader.data.brightness.value = [75];

Si le code source Pixel Bender pour le Shader spécifique une valeur par défaut pour le paramètre, un tableau contenant la ou les valeurs par défaut est créé et affecté à la propriété value de l'objet ShaderParameter lorsque l'objet Shader est créé. Dès qu'un tableau est affecté à la propriété value, même s'il s'agit de celui par défaut, la valeur du paramètre peut être modifiée en changeant la valeur de l'élement du tableau. Il n'est pas nécessaire de creator un autre tableau et de l'affector à la propriété value.

L'exemple ci-dessous indique comment définir une valeur de paramètre dans un Shader avec ActionScript. Dans cet exemple, le Shader définit un paramètre appelé color. Ce paramètre color est déclaré en tant que variable float4 dans le code source Pixel Bender, ce qui signifie qu'il s'agit d'un tableau à quatre nombres en virgule flottante. Dans l'exemple, la valeur du paramètre color change constamment. A chaque changement, le Shader est utilisé pour dessiner un rectangle coloré à l'écran. Il en résultat un changement de couleur animé.

Remarque: le code de cet exemple a ete risedge par Ryan Taylor. Merci Ryan de bien vouloir nous en faire profiter. Voupez acceder aux exemples de Ryan et dire ses commentaires à l'adresse www.+ostworthy.com/.

Le code ActionScript repose sur l'utilisation de trois méthodes :

  • init(): dans la méthode init(), le code charge le fischié de pseudo-code binaire Pixel Bender contenant le Shader. Lors du chargement du fischié, la méthode onLoadComplete() est appelée.
  • onLoadComplete(): dans la méthode onLoadComplete(), le code creé l'objet Shader appelé Shader. Il créé également une occurrence de Sprite appelée texture. Dans la méthode renderShader(), le code dessine une fois par image le résultat du Shader dans texture.

  • onEnterFrame(): la méthode onEnterFrame() est appelée une fois par image, créé ainsi un effet d'animation. Dans cette méthode, le code définit la valeur du paramètre du Shader sur la nouvelle couleur, puisappele la méthode renderShader() pour dessiner le résultat du Shader sous forme de rectangle.

  • renderShader(): dans la méthode renderShader(), le code appelle la méthode Graphics.beginShaderFill() pour définiir un replissage de Shader. Il dessine ensuite un rectangle dont le replissage est définir par la sortie du Shader (la couleur généraee). Pour plus d'informations sur ce type d'utilisation d'un Shader, voir « Utilisation d'un Shader comme outil de replissage de dessin » à la page 320.

Vous trouvrez ci-dessous le code ActionScript associé à cet exemple : Utilisez cette classe en tant que classe d'application principale d'un projet ActionScript uniquement dans Flash Builder, ou en tant que classe de document du fichier FLA dans Flash Professional :

package
{ import flash.display.Shader; import flash.display.Sprite; import flash.events.Event; import flash.net URLsLoader; import flash.net URLsLoaderDataFormat; import flash.net URLsRequest; public class ColorFilterExample extends Sprite { private const DELTA_OFFSET:Number = Math.PI * 0.5; private var loader:URLLoader; private var shimmer:Shader; private var texture:Sprite; private var delta:Number = 0 public function ColorFilterExample() { init(); } private function init():void { loader = new URLLoader(); loader.dataFormat = URLLoaderDataFormat.BINARY; loader.addEventListener(Event.COMPLET, onLoadComplete); loader.load(new URLRequest("ColorFilter.pbj")); } private function onLoadComplete(event:Event):void { shimmer = new Shader(load.data); texture = new Sprite(); addChild(texture); addEventListener(Event.ENTER_FRAME, onEnterFrame); } private function onEnterFrame(event:Event):void {

shader.data.color.value[0] = 0.5 + Math.cos(theta - DELTA_OFFSET) * 0.5;
shader.data.color.value[1] = 0.5 + Math.cos(theta) * 0.5;
shader.data.color.value[2] = 0.5 + Math.cos(theta + DELTA_OFFSET) * 0.5;
// The alpha channel value (index 3) is set to 1 by the kernel's default
// value. This value doesn't need to change.
delta += 0.1;
renderShader();
}
private function renderShader():void
{
    texture.graphics.clear();
    texture.graphics.beginShaderFill(shader);
    texture.graphics.drawRect(0, 0, stage.width, stage.height);
    texture.graphics.endFill();
} 

Voutrouvrez ci-dessous le code source du noyau du Shader ColorFilter, utilisé pour la création du fichier « ColorFilter.pbj » de pseudo-code binaire Pixel Bender.

<languageversion : 1.0;>
kernel ColorFilter
< 
    namespace : "boostworthy::Example";
    vendor : "Ryan Taylor";
    version : 1;
    description : "Creates an image where every pixel has the specified color value."; 
>
{
    output pixel4 result;
    parameter float4 color
        < 
            minValue:float4(0, 0, 0, 0);
            maxValue:float4(1, 1, 1, 1);
            defaultValue:float4(0, 0, 0, 1);
        );
    void evaluatePixel()
        {
            result = color;
        }
} 

Si vous utilisez un shader dont les parametes ne sont pas documentés, c'est par le contrôle de la propriété type de l'objet ShaderParameter que vous pouze évaluer le nombre d' éléments et leur type qu'il faut inclure dans le tableau. La propriété type indique le type de données du paramètre tel qu'il est définis dans le Shader lui-même. Pour consulter la liste du nombre et du type d' éléments prevus par chaque type de paramètre, voir le code associé à la propriété ShaderParameter.value dans le Guide de referencia ActionScript 3.0 pour Flash Professional.

Chaque objet ShaderParameter possède également une propriété index qui indique l'emplacement du paramètre dans l'ordre des paramètres du Shader. En plus de ces propriétés, un objet ShaderParameter peut avoir des propriétés supplémentaires qui contiennent des valeurs de métadonnées fournies par le programmeur du Shader. Par exemple, le programmeur peut définir pour un paramètre des valeurs de métadonnées telles que minimum, maximum et des valeurs par défaut. Toutes les valeurs de métadonnées spécifiées par le programmeur sont ajoutées à l'objet ShaderParameter en tant que propriétés dynamiques. Pour passer en revue ces propriétés, utilisez une boucle for...in pour boucler dans les propriétés dynamiques de l'objet ShaderParameter afin d identifier ses métadonnées. L'exemple ci-dessous montre comment utiliser une boucle for...in afin d identifier les métadonnées d'un objet ShaderParameter. Chaque valeur de métadonnées est ajoutée à une occurrence de Vector appelée metadata. Remarquez que cet exemple suppose qu'une occurrence de Shader appelée myShader existe déjà et qu'elle possède un paramètre appelé brightness.

var brightness:ShaderParameter = myShader.data.brightness;  
var metadata:Vector.<String> = new Vector.<String>();  
for (var prop:String in brightness)  
{  
    if (brightness️prop) is String)  
{  
        metadata[metadata.length] = brightness️prop];  
    }  
}  
// do something with the metadata 

Utilisation d'un Shader

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

Dès qu'un Shader de Pixel Bender est disponible dans ActionScript en tant qu'objet Shader, il peut être utilisé de différentes façon :

  • Remplissage d'un dessin par le Shader : le Shader spécifique qu'elle portion d'une forme dessinée utilise l'api du dessin
    Mode de fondu : le Shader spécifique le degré de fondu entre deux objets d'affichage superposés
  • Filtre: le shader définit un filtré qui modifie l'apparce du contenu visuel
  • Traitement d'un Shader autonome : le traitement du Shader se fait sans définir l'utilisation de la sortie. Sur demande, le Shader peut tourner en arrêté-plan de celle sorte que le résultat devient disponible à la fin du traitement. Cette technique peut être utilisé pour générer des données bitmap etTRAITER des données non visuelles.

Utilisation d'un Shader comme outil de replissage de dessin

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

Si vous utilisez un Shader pour creer un replissage de dessin, vous faites appel aux méthodes de l'API de dessin pour creer une forme vectorielle. La sortie du Shader permet de replir la forme, à l'instar de toute image bitmap utilisée en tant que replissage de bitmap par l'API de dessin. Pour creer un replissage de dessin, appelez la méthode beginShaderFill() de l'objet Graphics à l'emplacement du code où vous souhaitez commencer à dessiner la forme. Transmettez l'objet Shader en tant que premier argument à la méthode beginShaderFill(), comme illustré dans le code suivant:

var canvas:Sprite = new Sprite();  
canvas.graphics.beginShaderFill(myShader);  
canvas.graphics.drawRect(10, 10, 150, 150);  
canvas.graphics.endFill();  
// add canvas to the display list to see the result 

Lorsque vous utilisez un Shader en tant qu'outil de replissage de dessin, vous definiresse les valeurs d'image d'entrée et de parametre requises par le Shader.

L'exemple suivant illustrer l'utilisation d'un Shader en tant qu'ouil de replissage de dessin. Dans cet exemple, le Shader create un dégradé à trois sommets. Ce dégradé possède trois couleurs, une par sommet d'un triangle, séparées des autres par un fondu dégradé. En outre, les couleurs pivotent pour creer un effet de rotation de couleur animé.

ADOBE ACTIONSCRIPT 3.0 - Utilisation d'un Shader comme outil de replissage de dessin - 1

Remarque: le code de cet exemple a ete redigé par Petri Leskinen. Merci Petri de bien fouloir nous en faire profiter. Voupez consulter d'autres exemples et didactiens redigés par Petri à l'adresse http://pixelero.wordpress.com/.

Le code ActionScript réside dans trois méthodes :

  • init(): la méthode init() est appelée lors du chargement de l'application. Dans cette méthode, le code définit les valeurs initiales des objets Point qui représentent les sommets du triangle. Il creé également une occurrence de Sprite appelée canvas. Ultérieurement, dans la méthode updateShaderFill(), le code dessine une fois par image le résultat du shader dans canvas. Enfin, le code charge le fichier de pseudo-code binaire du shader.
  • onLoadComplete(): dans la méthode onLoadComplete(), le code creé l'objet Shader appelé Shader. Il définit également les valeurs initiales des paramètres. Enfin, le code ajoute la méthode updateShaderFill() en tant qu'écouteur de l'évenement enterFrame, ce qui signifie qu'il est appelé une fois par image pour créé un effet animé.
  • onEnterFrame(): la méthode updateShaderFill() est appelée une fois par image, ce qui créé l'effect d'animation. Dans cette méthode, le code calculé et définit les valeurs des paramètres du Shader. Il appelle ensuite la méthode beginShaderFill() pour creer un replissage de Shader et appelle d'autres méthodes de l'API de dessin pour dessiner le résultat du Shader dans un triangle.

Vous trouvrez ci-dessous le code ActionScript associé à cet exemple : Utilisez cette classe en tant que classe d'application principale d'un projet ActionScript uniquement dans Flash Builder, ou en tant que classe de document d'un fjichier FLA dans Flash Professional :

package
{ import flash.display Shader; import flash.display.Sprite; import flash.events.Event; import flash_geom.Point; import flash.net URLsLoader; import flash.net URLsLoaderDataFormat; import flash.net URLsRequest; public class ThreePointGradient extends Sprite { private var canvas:Sprite; private var shimmer:Shader; private var loader:URLLoader; private var topMiddle:Point; private var bottomLeft:Point; private var bottomRight:Point; private var colorAngle:Number = 0.0 private const d120:Number = 120 / 180 *Math.PI; // 120 degrees in radians public function ThreePointGradient() { init(); } private function init():void { canvas = new Sprite(); addChild(canvas); var size:int = 400 . topMiddle = new Point(size/2,10); bottomLeft = new Point(0,size-10); bottomRight = new Point(size,size-10); loader = new URLLoader(); loader.dataFormat = URLLoaderDataFormat.BINARY; loader.addEventListener(Event.COMPLET, onLoadComplete); loader.load(new URLLRequest("ThreePointGradient.pbj")); } private function onLoadComplete(event:Event):void { shimmer = new Shader(load.data); shimmer.data.point1.value = [topMiddle.x, topMiddle.y]; shimmer.data.point2.value = [bottomLeft.x, bottomLeft.y]; shimmer.data.point3.value = [bottomRight.x, bottomRight.y]; addEventListener(Event.ENTER_FRAME, updateShaderFill); } private function updateShaderFill(event:Event):void

{ colorAngle + = .06; var c1:Number = 1 / 3 + 2 / 3 * Math.cos(colorAngle); var c2:Number = 1 / 3 + 2 / 3 * Math.cos(colorAngle ^+ d120); var c3:Number = 1 / 3 + 2 / 3 * Math.cos(colorAngle - d120); shader.data.color1.value = [c1,c2,c3,1.0]; shader.data.color2.value = [c3,c1,c2,1.0]; shader.data.color3.value = [c2,c3,c1,1.0]; canvas.graphics.clear(); canvas.graphics.beginShaderFill(shader); canvas.graphics.moveTo(topMiddle.x,topMiddle.y); canvas.graphics.lineTo(bottomLeft.x,bottomLeft.y); canvas.graphics.lineTo(bottomRight.x,bottomLeft.y); canvas.graphics.endFill(); } }

Le code source du noyau du Shader ThreePointGradient, utilise pour la creation du fichier « ThreePointGradient.pbj » de pseudo-code binaire Pixel Bender, est indiqué ci-dessous :

<languageversion : 1.0;>
kernel ThreePointGradient
<namespace : "Petri Leskinen::Example";
vendor : "Petri Leskinen";
version : 1;
description : "Creates a gradient fill using three specified points and colors.";>
{
parameter float2 point1 // coordinates of the first point
<minValue:float2(0, 0);
maxValue:float2(4000, 4000);
defaultValue:float2(0, 0);
};
parameter float4 color1 // color at the first point, opaque red by default
<DEFAULTValue:float4(1.0, 0.0, 0.0, 1.0);
};
parameter float2 point2 // coordinates of the second point
<minValue:float2(0, 0);
maxValue:float2(4000, 4000);
defaultValue:float2(0, 500);
};
parameter float4 color2 // color at the second point, opaque green by default
<DEFAULTValue:float4(0.0, 1.0, 0.0, 1.0); 
>>;
parameter float2 point3 // coordinates of the third point
< minValue:float2(0, 0);
maxValue:float2(4000, 4000);
defaultValue:float2(0, 500);
};
parameter float4 color3 // color at the third point, opaque blue by default
< defaultValue:float4(0.0, 0.0, 1.0, 1.0);
};
output pixel4 dst;
void evaluatePixel()
{
    float2 d2 = point2 - point1;
    float2 d3 = point3 - point1;
    // transformation to a new coordinate system
    // transforms point 1 to origin, point2 to (1, 0), and point3 to (0, 1)
    float2x2 mtrx = float2x2(d3.y, -d2.y, -d3.x, d2.x) / (d2.x * d3.y - d3.x * d2.y);
    float2 pNew = mtrx * (outCoord() - point1);
    // repeat the edge colors on the outside
    pNew.xy = clamp(pNew.xy, 0.0, 1.0); // set the range to 0.0 ... 1.0
    // interpolating the output color or alpha value
    dst = mix(mix(color1, color2, pNew.x), color3, pNew.y);
} 

Remarque: si vous utilisez un replissage de shader alors que le rendu est exécuté par le processeur graphique, la zone remplace s'affiche en cyan.

Pour plus d'informations sur le tracé de forme par le biais de l'API de dessin, voir « Utilisation de l'API de dessin » à la page 230.

Utilisation d'un Shader comme mode de fondu

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

Utiliser un Shader comme mode de fondu s'apparente à l'utilisation des autres modes de fondu. Le Shader définit le résultat de deux objets d'affichage fondus visuellement. Pour utiliser un Shader en tant que mode de fondu, affectez à votre object Shader la propriété blendShader de l'objet d'affichage en premier plan. Affector une valeur autre que null à la propriété blendShader définit automatiquement la propriété blendMode de l'objet d'affichage sur BlendMode.SHADER. Le code suivant illustré l'utilisation d'un Shader en tant que mode de fondu. Notez que cet exemple part du principe qu'un objet d'affichage appelé foreground figure dans le même parent que l'autre containu d'affichage dans la liste d'affichage, sachant que foreground chevauche l'autre containu :

foregroundblendShader = myShader;

Lorsque vous utilisez un shader en tant que mode de fondu, deux entrées au moins doivent être spécifiées. Comme indiqué dans l'exemple, vous ne définissez pas les valeurs d'entrée dans le code. Les deux images fondues sont automatiquement utilisées en tant qu'entrées du shimmer. L'image en premier-plan fait office de seconde image (c'est à cet object d'affichage qu'est appliqué le mode de fondu). Une image d'arrête-plan est créé à partir du composite de tous les pixels figurant derrière le cadre de selection de l'image en premier-plan. Cette image en arrête-plan est définie comme la première image d'entrée. Si vous utilisez un shader qui attend plus de deux entrées, vous en indiquez la valeur à partir de la troisième entrée.

L'exemple suivant illustrer l'utilisation d'un Shader en tant que mode de fondu. Cet exemple utilise un mode de fondu Eclaircir basé sur la luminosité. Ce fondu a pour résultat d'afficher le pixel le plus clair de l'un ou l'autre des objets fondus.

Remarque: le code de cet exemple a ete rédigé par Mario Klingemann. Merci Mario de bien fouloir nous en faire profiter. Pour consulter d'autres exemples de code rédigés par Mario, ainsi que ses commentaires, voir www.quasimondo.com/.

Le code ActionScript important figure dans les deux méthodes suivantes :

  • init(): la méthode init() est appelée lors du chargement de l'application. Dans cette méthode, le code charge le fichier de pseudo-code binaire du Shader.
  • onLoadComplete(): dans la méthode onLoadComplete(), le code creé l'objet Shader appelé Shader. Il dessine ensuite trois objets. Le premier, backdrop, est un arrêtre-plan gris foncé place derrière les objets fondus. Le deuxième, backgroundShape, est une ellipse dégradée verte. Le troisième, foregroundShape, est une ellipse dégradée orange.

L'ellipse foregroundShape est l'objet de premier plan du fondu. L'objet d'arrière-plan du fondu est composée de la section de backdrop et de la section de backgroundShape qui sont recouvertes par le cadre de selection de l'objet foregroundShape. L'objet foregroundShape est affché en première position dans la liste d'affichage. Il recouvre partiellement backgroundShape et totalement backdrop. En raison de ce chevauchement, sans application d'un mode de fondu, l'ellipse orange (foregroundShape) est entièrement affichée et masque une section de l'ellipse verte (backgroundShape):

ADOBE ACTIONSCRIPT 3.0 - Utilisation d'un Shader comme mode de fondu - 1

Toutefois, si le mode de fondu est affiché, la section la plus lumineuse de l'ellipse verte est visible, car elle est plus claire que la section de foregroundShape qui la recouvre :

ADOBE ACTIONSCRIPT 3.0 - Utilisation d'un Shader comme mode de fondu - 2

Vous trouvrez ci-dessous le code ActionScript associé à cet exemple : Utilisez cette classe en tant que classe d'application principale d'un projet ActionScript uniquement dans Flash Builder, ou en tant que classe de document du fichier FLA dans Flash Professional :

package   
{ import flash.display.BlendMode; import flash.display.GGradientType; import flash.display.Graphics; import flash.display.Shader; import flash.display.Shape; import flash.display.Sprite; import flash.events.Event; import flashgeom.Matrix; import flash.net URLsLoader; import flash.net URLsLoaderDataFormat; import flash.net URLsRequest; public class LumaLighten extends Sprite { private var shimmer:Shader; private var loader:URLLoader; public function LumaLighten() { init(); } private function init():void { loader = new URLLoader(); loader.dataFormat = URLLoaderDataFormat.BINARY; loader.addEventListener(Event.COMPLET, onLoadComplete); loader.load(new URLRequest("LumaLighten.pbj")); } private function onLoadComplete(event:Event):void { shimmer = new Shaderloader.data); var backdrop:Shape = new Shape(); var g0:Graphics = backdrop.graphics; g0.beginFill(0x303030); g0.drawRect(0, 0, 400, 200); g0.endFill(); addChild(backdrop); var backgroundShape:Shape = new Shape(); var gl:Graphics =backgroundShape.graphics; var cl:Array = [0x336600, 0x80ff00]; var al:Array = [255, 255]; var r1:Array = [100, 255]; var m1:Matrix = new Matrix(); m1.createGradientBox(300, 200); gl.beginGradientFill(GradientType LINEAR, c1, al, r1, ml); gl.drawEllipse(0, 0, 300, 200); 

g1.endFill();
addChild(backgroundShape);
var foregroundShape:Shape = new Shape(); var g2:Graphics = foregroundShape.graphics; var c2:Array = [0xff8000, 0x663300]; var a2:Array = [255, 255]; var r2:Array = [100, 255]; var m2:Matrix = new Matrix(); m2.createGradientBox(300, 200); g2.beginGradientFill(GradientType LINEAR, c2, a2, r2, m2); g2.drawEllipse(100, 0, 300, 200); g2.endFill(); addChild(backgroundShape); foregroundShapeblendShader = shader; foregroundShapeblendMode = BlendMode.SHADER; }
}
Le code source du noyau du shader LumaLighten,utilise pour la creation du fichier « LumaLighten.pbj » de pseudocode binaire Pixel Bender, est indiqué ci-dessous :

kernel LumaLighten
< namespace:"com.quasimondo.blendModes"; vendor:"Quasimondo.com"; version:1; description:"Luminance based lighten blend mode";
{ input image4 background; input image4 foreground; output pixel4 dst; const float3 LUMA = float3(0.212671, 0.715160, 0.072169); void evaluatePixel() { float4 a = sampleNearest(foreground,outCoord()); float4 b = sampleNearest(background,outCoord()); float luma_a = a.r * LUMA.r + a.g * LUMA.g + a.b * LUMA.b; float luma_b = b.r * LUMA.r + b.g * LUMA.g + b.b * LUMA.b; dst = luma_a > luma_b ? a : b; }

Pour plus d'informations sur l'utilisation des modes de fondu, voir « Application de modes de fondu » à la page 193.

Remarque : lorsqu'un programme shader Pixel Bender est exécuté en tant que fusion dans Flash Player ou AIR, les fonctions d'échantillonnage et outCoord () ne se comportent pas comme dans les autres contextes. En mode de fusion, une fonction d'échantillonnage renvoie toujours le pixel en cours d'évaluation par le Shader. Il est, par exemple, impossible d'ajouter un décalage à outCoord () pour échantillonner un pixel environnant. De même, si vous utilisez la fonction outCoord () dans un contexte autre qu'une fonction d'échantillonnage, ses coordonnées reivoient toujours 0. Il est ainsi impossible de se baser sur la position d'un pixel pour affecter la combinaison des images fusonnées.

Utilisation d'un Shader comme filtre

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

Utiliser un shader comme filtré s'apparente à l'utilisation de tout autre filtré dans ActionScript. Lorsque vous utilisez un Shader en tant que filtré, l'image filtrée (un objet d'affichage ou un objet BitmapData) est transmise au Shader. Le Shader utilise l'image d'entrée pour creer le résultat du filtré, qui correspond généralement à une version modifiée de l'image d'origine. Si l'objet filtré est un objet d'affichage, le résultat du filtré remplace l'objet d'affichage filtré à l'écran. Si l'objet filtré est un object BitmapData, le résultat du Shader devient le contenu de l'objet BitmapData dont la méthode applyFilter() est appelée.

Pour utiliser un Shader en tant que filtré, vous commencez par creator l'objet Shader, comme indiqué à la section « Chargement ou intégration d'un Shader » à la page 312. Vous créez ensuite un objet ShaderFilter lié à l'objet Shader. L'objet ShaderFilter est le filtré appliqué à l'objet filtré. Vous l'appliquerez à un objet à l'instar de n'importe quel filtré. Vous le transmettez à la propriété filters d'un objet d'affichage ou vous appelez la méthode applyFilter() sur un objet BitmapData. Par exemple, le code suivant create un objet ShaderFilter et applique le filtré à un objet d'affichage appelé homeButton.

var myFilter:ShaderFilter = new ShaderFilter(myShader);  
homeButton(filters = [myFilter]; 

Lorsque vous utilisez un Shader en tant que filtre, une entrée au moins doit lui être associée. comme indiqué dans l'exemple, vous ne définisse pas la valeur d'entrée dans le code. L'objet d'affichage filtré ou l'objet BitmapData est défini en tant qu'une image d'entrée. Si vous utilisez un Shader qui attend plus d'une entrée, vous en spécifiez la valeur à partir de la deuxieme entrée.

Dans certains cas, un filtré modifie les dimensions de l'image d'origine. Un effet d'ombre portée standard ajoute par exemple des pixels contenant l'ombre associée à l'image. Lorsque vous utilisez un Shader qui modifie les dimensions de l'image, définiSEE les propriétés leftExtension, rightExtension, topExtension et bottomExtension pour indiquer l'écart approprié.

L'exemple suivant illustrer l'utilisation d'un Shader en tant que filtré. Dans cet exemple, le filtré inverse les valeurs des canaux rouge, vert et bleu d'une image. Il a pour résultat un « négatif » de l'image.

Remarque: cet exemple utilise comme shader le noyau invertRGB.pbk Pixel Bender intégré à Pixel Bender Toolkit. Vous pouvez charger le code source du noyau à partir du réseau d'installation de Pixel Bender Toolkit. Compilez le code source, puis enregistrez le fjichier de pseudo-code binaire dans le même réseau que le code source.

Le code ActionScript important figure dans les deux méthodes suivantes :

  • init(): la méthode init() est appelée lors du chargement de l'application. Dans cette méthode, le code charge le fichier de pseudo-code binaire du Shader.

  • onLoadComplete(): dans la méthode onLoadComplete(), le code creé l'objet Shader appelé Shader. Il créé et dessine ensuite le contentu d'un objet appelé target. L'objet target est un rectangle rempli d'un dégradé linéaire rouge sur la gauche, jaune-vert au centre et bleu sur la droite. Si le contrôle n'est pas appliqué, l'apparace de l'objet est la suivante:

ADOBE ACTIONSCRIPT 3.0 - Utilisation d'un Shader comme filtre - 1

Si le filtré est appliqué, les couleurs sont inversées, auquel cas l'apparence du rectangle est la suivante :

ADOBE ACTIONSCRIPT 3.0 - Utilisation d'un Shader comme filtre - 2

Ce code utilise à titre de Shader le noyau « invertRGB.pbk » Pixel Bender d'exemple intégré à Pixel Bender Toolkit. Le code source figure dans le fichier « invertRGB.pbk », qui resides dans le réseau d'installation de Pixel Bender Toolkit. Compilez le code source et enregistrez le fichier de pseudo-code binaire sous le nom « invertRGB.pbj » dans le même réseau que votre code source ActionScript.

Vous trouvrez ci-dessous le code ActionScript associé à cet exemple : Utilisez cette classe en tant que classe d'application principale d'un projet ActionScript uniquement dans Flash Builder, ou en tant que classe de document du fichier FLA dans Flash Professional :

package   
{ import flash.display.GradientsType; import flash.display.Graphics; import flash.display Shader; import flash.display.Shape; import flash.display.Sprite; import flash(filtersShaderFilter; import flash.events.Event; import flashgeom.Matrix; import flash.net URLsLoader; import flash.net URLsLoaderDataFormat; import flash.net URLsRequest; public class InvertRGB extends Sprite { private var shimmer:Shader; private var loader:URLLoader; public function InvertRGB() { init(); } private function init():void { loader = new URLLoader(); loader.dataFormat = URLLoaderDataFormat.BINARY; loader.addEventListener(Event.COMPLET, onLoadComplete); loader.load(new URLRequest("invertRGB.pbj")); } private function onLoadComplete(event:Event):void { shimmer = new Shaderloader.data); var target:Shape = new Shape(); addChild(target); var g:Graphics = target.graphics; var c:Array = [0x990000, 0x445500, 0x007799]; var a:Array = [255, 255, 255]; var r:Array = [0, 127, 255]; var m:Matrix = new Matrix(); m.createGradientBox(w, h); g.beginGradientFill(GradientType LINEAR, c, a, r, m); g.drawRect(10, 10, w, h); g.endFill(); var invertFilter:ShaderFilter = new ShaderFilter(shader); target_filters = [invertFilter]; } } 

Pour plus d'informations sur l'application de filtres, voir « Création et application de filtres » à la page 277.

Utilisation d'un Shader en mode autonome

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

Lorsque vous utilisez un Shader en mode autonome, son traitement s'exécute indépendamment de l'usage prévu du résultat. Vous spécifie le Shader à exéctuer, définissez les valeurs d'entrée et de paramètres, puis stipulez un objet dans lequel seront placées les données générantes. Vous pouvez utiliser un Shader en mode autonome pour deux raisons :

  • Traitément de données non graphiques : en mode autonome, vous pouvez désirir de transmettre des données binaires ou numériques arbitraires aushade au lieu de données d'image bitmap. Le cas échéant, le résultat du shade peut être renvoyé sous forme de données binaires ou numériques en plus des données d'image bitmap.
  • Traitément en arrêté-plan : lorsque vous exécutez un Shader en mode autonome, il est exécuté en mode asynchrone par défaut. Cela signifie que le Shader s'exécuté en arrêté-plan pendant que votre application continue à tourner et que votre code est averti une fois le traitement du Shader terminé. Vous pouvez utiliser un Shader sans pour autant bloquer l'interface utilisateur de l'application ou tout autre traitement, même si la durée de son exécution est élevé.

Un objet ShaderJob permet d'executer unShader en mode autonome. Vous commencez par creer un objet ShaderJob et vous le liez à l'objet Shader qui representatione le Shader à executer :

var job:ShaderJob = new ShaderJob(myShader); 

Voudefinissez ensuite toute valeur d'entree ou de parametre attendue par le Shader. Si vous executez le Shader en arriere-plan, vous enregistrez également un écouteur associé à l'évenement complete de I'objet ShaderJob. Notre écouteur est appelé lorsque le Shader termine sa tache :

function completeHandler(event:ShaderEvent):void { //do something with the shader result } 
job.addEventListener(ShaderEvent.COMPLET,completeHandler); 

Vou creez ensuite un objet dans lequel est ecrit le résultat de l'opération du Shader, une fois celle-ci terminée. Vous affectez cet objet à la propriété target de l'objet ShaderJob :

var jobResult:BitmapData = new BitmapData(100, 75); 

Affectez une occurrence de BitmapData à la propriété target si vous utilisez lobjet ShaderJob pour executer le traitement de l'image. Si vous traitez des données binaires ou numériques, affectez un objet ByteArray ou une occurrence de Vector. à la propriété target. Si tel est le cas, vous doivent définir les propriétés width et height de lobjet ShaderJob pour stipuler le volume de données à créé dans lobjet target.

Remarque : vous pouvez définir les propriétés Shader, target, width et height de l'objet ShaderJob en une seule étape.

Pour ce faire, transmettez les arguments au constructeur ShaderJob(), comme suit:var job:ShaderJob = new

ShaderJob(myShader, myTarget, myWidth, myHeight);

Lorsque you etes pret a executer le Shader, you appelez la methode start () de l'objet ShaderJob :

job.start(); 

Par défaut, appeler start() entraine l'exécution asynchrone de l'objet ShaderJob. Dans ce cas, l'exécution du programme continue et passé immédiatement à la ligne suivante de code au lieu d'attendre que leShader soit terminé.

Une fois l'opération du Shader terminée, l'objet ShaderJob appelle ses écouteurs d'évenement complete et les avertit.

A ce stade (en d'autres termes, dans le corps de votre écouteur d'évenement complete), l'objet target contient le résultat de l'opération du Shader.

Remarque: au lieu d'utiliser l'objet propriété target, vous pouvez extraire directement le résultat du Shader de l'objet événement qui est transmis à la méthode d'écouteur. L'objet événement est une occurrence de ShaderEvent. L'objet ShaderEvent possède trois propriétés susceptibles d'être utilisées pour acceder au résultat, selon le type de données de l'objet définirant tant que propriété target: ShaderEvent bitmapData, ShaderEvent.jpeg et ShaderEvent.vector.

Vous pouvez également transmettre un argument true à la méthode start(). Dans ce cas, l'opération du shader s'exécuté en mode synchrone. Tout le code (y compris l'interaction avec l'interface utiliser et tout autre événement) est interrompu pendant l'exécution du shader. Une fois le shader terminé, l'objet target en contient le résultat et le programme passée à la ligne de code suivante.

job.start(true);

Chapitre 16 : Utilisation des clips

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La classe MovieClip est la classe de base des animations et des symboles de clip créés dans l'environnement de développement Adobe Flash. Elle possède tous les comportements et toutes les fonctionnalités des objets d'affichage, mais intégre des propriétés et méthodes supplémentaires qui permettent de contrôler son scenario.

Principes de base des clips

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Les clips sont un élément capital pour les créateurs de contenu animé dans l'environnement de création Flash et pour contrôle ce contenu avec ActionScript. Lorsque vous creez un symbole de clip dans Flash, le programme ajoute ce symbole à la bibliothèque du document Flash. Par défaut, ce symbole devient une occurrence de la classe MovieClip et, de ce fait, possède les propriétés et méthodes de cette classe.

Lorsqu'une occurrence d'un symbole de clip est place sur la scene, la progression du scenario de ce clip s'effectue automatiquement (si le clip comporte plusieurs images), sauf si cette lecture est modifiée en ActionScript. Le scenario est l'élement distinctif de la classe MovieClip. Il permet de creator des animations par interpolation de mouvement ou de forme via l'interface de Flash. Par contre, un objet d'affichage issu de la classe Sprite peut uniquement être animé par programmation, en modifient ses valeurs.

Dans les versions précédentes d'ActionScript, la classe MovieClip constitueit la classe de base de toutes les occurrences de la scène. En ActionScript 3.0, un clip est désormais un objet d'affichage parmi d'autres, tous susceptibles de s'afficher à l'écran. S'il n'est pas nécessaire de définir un scenario pour la fonction d'un objet d'affichage, l'utilisation de la classe Shape au lieu de la classe MovieClip peut accroître les performances d'affichage. Pour plus d'informations sur le besoin des objets d'affichage en fonction de la tâche prévue, voir « Sélection d'une sous-classe de DisplayObject » à la page 179.

Concepts important et terminologie

La liste de référence suivante content des termes importants relatifs aux clips :

Fichier SWF AVM1 Fichier SWF créé en ActionScript 1.0 ou ActionScript 2.0, et généralement destiné aux versions 8 ou antérieures de Flash Player.

Fichier SWF AVM2 Fichier SWF creé en ActionScript 3.0 pour Adobe Flash Player 9 ou ultérieur ou Adobe AIR.

Fichier SWF externe Fichier SWF create separation du fichier SWF du projet, et destiné à être charge et lu dans celui-ci.

Image Elément de base du scenario. Comme les images de films, chaque image est une « photographie » et c'est la lecture rapide des images en série qui produit l'effect d'animation.

Scenario Métaphore représentant la série d'images qui compose la série d'animation d'un clip. Le scenario d'un objet MovieClip est l'équivalent du scenario de cet objet dans l'environnement de création Flash.

Tete de lecture Marqueur identifiant la position (l'image) dans le scenario qui est affichee a un moment donné.

Utilisation des objets MovieClip

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Lorsque vous publiiez un fisier SWF, Flash convertit toutes les occurrences de symboles de clips sur la scene en objets MovieClip. Pour qu'un symbole de clip soit disponible en ActionScript, donnez-lui un nom d'occurrence dans le champ Nom de l'occurrence de l'Inspecteur des Propriétés. Lors de la création du fisier SWF, Flash génére le code qui create l'occurrence de MovieClip sur la scène et déclaré une variable avec ce nom d'occurrence. Si les clips que vous avez nommés sont imbriqués dans d'autres clips nommés, ces clips infant sont traités comme des propriétés du clip parent : vous pouze acceder à tous les clips de cette hierarchie en utilisant la syntaxe à point. Par exemple, si une occurrence de clip appelée childClip est imbriquée dans une autre appelée parentClip, vous pouze lancer sa lecture en appelant le code suivant :

parentClip(childClip.play();

Remarque: les occurrences infantes sur la scène dans l'util de programmation de Flash ne sont pas accessibles par le code depuis l'intérieur du constructeur d'une occurrence parent car, à ce stade de l'exécution du code, elles n'ont pas été créées. Avant d'acceder à l'enfant, le parent doit soit créé l'occurrence infant par du code, soit retarder l'accès à une fonction de rappel qui écoute l'enfant en vue de la distribution de son événement Event. ADDED_TO_STAGE.

Si de nombreuses méthodes et propriétés de la classe MovieClip d'ActionScript 2.0 restent les mêmes, d'autres ont changé. Toutes les propriétés qui étaient préfixées d'un trait de soulignement ont été renommées. Par exemple, les propriétés_width et_height sont désormais accessibles sous le nom_width et_height, _xscale et _yscale sous le nomscaleX et scaleY. Pour obtenir la liste complète des propriétés et méthodes de la classe MovieClip, voir le manuel Guide de ↔reference ActionScript 3.0 pour la plate-forme Adobe Flash.

Contrôle de la lecture d'un clip

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Flash utilise la métaphore du scenario pour traduire une animation ou un changement d'etat. Tout élément visuel qui a recours à un scenario est soit un object MovieClip, soit une extension de la classe MovieClip. Bien qu'il soit possible en ActionScript de commander l'accêt ou la lecture d'un clip et le passage à un autre point du scenario, il n'est pas possible de creer dynamiquement un scenario ni d'ajouter du contenu dans une image spécifique. Seul l'outil de programmation Flash le permet.

Pendant la lecture, le clip progresse le long du scenario à une vitesse fixée par la cadence d'image du fichier SWF. Vous pouze également ignorer ce paramètre et le replacer par la propriété Stage.frameRate dans ActionScript.

Lecture et arrêt des clips

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Les méthodes play() et stop() permettent d'effectuer des manipulations simples sur un clip tout au long du scenario. Par exemple, supposons qu'un symbole de clip sur la scène contienne une animation représentant une bicyclette qui traverse l'écran, et dont le nom d'occurrence est bicycle. Si le code suivant est associé à une image-clé du scenario principal,

bicycle.stop();

la bicyclette ne se déplace pas (son animation n'est pas mise en lecture). Le mouvement de la bicyclette peut être déclenché par une action de l'utilisateur. Par exemple, avec un bouton nommé startButton, le code suivant (dans une image-clé du scenario principal) déclenché l'animation si l'utilisateur clique sur ce bouton :

Avance rapide et rembobinage

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Les méthodes play() et stop() ne sont pas les seules méthodes commandant l'animation d'un clip. Vous pouvez également avancer et reculer manuellement la tête de lecture à l'aide des méthodes nextFrame() et prevFrame(). L'appeil de l'une de ces deux méthodes arrêté la lecture et fait avancer le clip ou le rembobine d'une image.

L'utilisation de la méthode play() revient à appeler nextFrame() chaque fois qu'un événement enterFrame est déclenché pour cet objet clip. Vous pouvez donc envisager de dire le clip bicycle en arrêtre en ajoutant un écouteur pour l'événement enterFrame et en indiquant à bicycle, dans la fonction écouteur, de reculer d'une image, comme suit :

En lecture normale, si un clip contient plusieurs images, il tourne en boucle lors de la lecture, c'est-à-dire qu'il revient à l'image 1 une fois qu'il a passé laforthème image. Si vous utilisez prevFrame() ou nextFrame(), ce comportement ne se produit pas automatiquement (l'appele de prevFrame() lorsque la tete de lecture est sur l'image 1 ne déplace pas la tête de lecture à laforthème image). Dans l'exemple ci-dessus, la condition if vérifie si le clip est revenu à la première image et fait alors passer le clip à laforthème image, créé ainsi une boucle continue de lecture en arrêté.

Déplacement vers une autre image et utilisation des étiquettes d'image

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Le déplacement d'un clip à une nouvelle image est une opération simple. Il suffit d'appeler gotoAndPlay() ou gotoAndStop() en spécifient le numéro de l'image cible comme paramètre. Vous pouze également transmettre une chaine correspondant au nom de l'étiquette d'image. Il est possible d attribuer une étiquette à toute image du scenario. Pour ce faire, sélectionnez une image du scenario, puis tapez un nom dans le champ Étiquette d'image de l'Inspecteur des Propriétés.

L'utilisation des étiquettes d'image seulement que des numérios présente des avantages évidents pour créé un clip complexe. Si le nombre d'images, de calques et d'interpolations d'une animation est élevé, envisagez d'étiqueter les images importantes de manière évocatrice, en faisant référence aux changements de comportement dans le clip (par exemple « départ », « marche » ou « course »). Cette technique permet d'améliorer la lisibilité du code et offre plus de souplesse, puisque les appeals ActionScript destinés à une image étiquetée pointent sur une référence uniquement (l'étiquette)只不过 que sur une image numérotée. Si vous decide par la suite de déplacer un segment de l'animation vers une autre image, il ne sera pas nécessaire de modifier le code ActionScript si vous conservez les mêmes étiquettes pour toutes les images au nouvel emplacement.

Pour représentater des étiquettes en code, ActionScript 3.0 compte la classe FrameLabel. Chaque occurrence de cette classe représentée une étiquette d'image unique, et possède une propriété name qui représenté le nom de l'étiquette tel qu'il a été indiqué dans l'Inspecteur des Propriétés, ainsi qu'une propriété frame qui représenté le numéro de l'image pour laquelle l'étiquette est placee dans le scenario.

Pour permettre d'acceder aux occurrences de FrameLabel associées à une occurrence de clip, la classe MovieClip comporte deux propriétés qui reivoient directement des objets FrameLabel. La propriété currentLabels renvoie un tableau composé de tous les objets FrameLabel Presents sur l'ensemble du scenario d'un clip. La propriété currentLabel renvoie une chaine contenant le nom de l'étiquette d'image trouvée récemment sur le scenario.

Supposons que vous ayez créé un clip nommé Robot et que vous ayez étiqueté les différents états de l'animation. Vous pouze définir une condition pour vérifier la propriété/currentLabel afin d'acceder à l'état actuel de Robot, comme dans le code suivant :

if (robot.currentLabel == "walking") { //do something } 

Flash Player 11.3 et AIR 3.3 ont ajoute l'évenement_frameLabel à la classe FrameLabel. Vous pouvez affecter un gestionnaire d'évenement à l'occurrence de FrameLabel qui représenté l'étiquette d'une trame. L'évenement est distribué lorsque la tête de lecture accede à la trame.

L'exemple suivant cree une occurrence de FrameLabel pour la seconde etiquette de trame dans l'objet Array desétiquettes de trames du MovieClip. Il enregistre ensuite un gestionnaire d'événement pour l'événement frameLabel :

var myFrameLabel: FrameLabel = robot.currentLabels[1];  
myFrameLabel.addEventListener(Event.FRAME.Label, onFrameLabel);  
function onFrameLabel(e:Event):void {  
//do something  
} 

Utilisation des séquences

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Dans l'environnement de création Flash, vous pouvez utiliser les séquences pour démarquer une série de scénarios qu'un fichier SWF doit suivre. Grâce au second paramètre de la méthode gotoAndPlay() ou gotoAndStop(), vous pouvez spécifique la séquence sur laquelle la tête de lecture doit se placer. Tous les fichiers FLA commencent par une séquence, à laquelle vous pouvez ajouter le nombre de séquences de votrechoix.

L'utilisation des séquences n'est pas toujours conseillée, car elle présente un certain nombre d'inconvénients. La maintenance d'un document Flash qui contient de nombreuses séquences peut être difficile, en particulier dans les environnements où plusieurs'auteurs intervennent. Un nombre elevé de séquences peut également s'avérer inefficace de point de vue de la bande passante, car le processus de publication implique la fusion de toutes les séquences en un seul scenario. L'ensemble des séquences est alors télécharge en mode progressif, même si elles ne sont jamais lues. C'est pourquoi l'utilisation de plusieurs séquences est largement déconseillée, à moins qu'elle soit nécessaire à l'organisation de plusieurs animations basées sur des scenarios.

La propriété scenes de la classe MovieClip renvoie un tableau des objets Scene représentant toutes les séquences du fichier SWF. La propriété currentScene renvoie un object Scene représentant la série qui est en cours de lecture.

La classe Scene a des propriétés qui contiennent des informations sur la séquence. La propriété labels renvoie un tableau des objets FrameLabel utilisés au sein de la séquence. La propriété name renvoie le nom de la séquence sous forme de chaine. La propriété numFrames renvoie un entier représentant le nombre total d/images dans la séquence.

Creation d'objets MovieClip à l'aide d'ActionScript

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

L'ajout de contenu s'effectue dans Flash en faisant glisser des éléments de la bibliothèque sur la scene. Mais il ne s'agit pas là de la seule méthode. Pour des projets plus complexes, les développements experimentés préférent souvent créé les clips par programmation. Cette approche présente plusieurs avantages : réutilisation facile du code, vitesse de compilation accrue et disponibilité de modifications plus sophistiquées réservées à ActionScript.

La nouvelle API de liste d'affichage d'ActionScript 3.0 simplifie le processus de création dynamique d'objets MovieClip. La possibilité d'instancier directement une occurrence de MovieClip, séparément de son ajust à la liste d'affichage, offre beaucoup de souplesse et de simplicité sans sacrificier tout contrôle.

En ActionScript 3.0, lorsqu'une occurrence de clip (ou de tout autre objet d'affichage) est créé par code, elle est invisible tant qu'elle n'a pas ete aoutuee à laiste d'affichage à l'aide de la methode addChild() ou addChildAt () d'un conteneur d'objets d'affichage Vous pouvez ainsi creer un clip et definir ses propriétés, et meme appeler ses méthodes, avant qu'il apparaisse a I'écran. Pour plus d'informations sur I'utilisation de laiste d'affichage, voir « Utilisation de conteneurs d'objets d'affichage » à la page 165.

Exportation des symboles de bibliothèque pour ActionScript

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Par défaut, il est impossible de creer dynamiquement des occurrences de symboles de clips dans la bibliothèque d'un document Flash (c'est-à-dire de les créer entièrement en ActionScript). En effet, l'exportation de chaque symbole pour une utilisation en ActionScript accroit la taille du fichier SWF. Or, les symboles ne sont pas tous destinés à une utilisation sur la scene. C'est pourquoi, pour qu'un symbole soit disponible en ActionScript, vous doivent indiquer spécifiquement que ce symbole doit être exporté pour ActionScript.

Pour exporter un symbole pour ActionScript :

1 Sélectionnez le symbole dans le panneau Bibliothèque et ouvre sa boîte de dialogue Propriétés.
2 Si nécessaire, activez les paramètres avances.
3 Dans la boîte de dialogue Liaison, activé l'option Exporter pour ActionScript.

Les champs Classe et Classe de base sont alors activés.

Par défaut, le champ Classe contient le nom du symbole sans espaces (par exemple, un symbole nommé « Maison Rouge » devient « MaisonRouge »). Pour spécifique que le symbole doit utiliser une classe personnalisée pour son comportement, saisissez le nom complet de cette classe, package compris. Si vous poulez avoir la possibilité de créé des occurrences du symbole en ActionScript, sans avoir pour autant besoin de comportements supplémentaires, vous pouvez laisser ce nom de classe tel quel.

Par défaut, le champ Classe de base à la valeur flash.display.MovieClip. Si vous voulez que votre symbole étende les fonctionnalités d'une autre classe personnalisée, vous pouze replacer cette valeur par le nom de votre classe, sous réserve que celle-ci étende la classe Sprite (ou MovieClip).

4 Cliquez sur OK pour enregistrer les changements.

A ce stade, si Flash ne detecte pas de filchier ActionScript externe contenant la definition de la classe spécifiée (par exemple, si vous n'avez pas besoin d'ajouter un comportement supplémentaire pour le symbole), un message d'advertisement apparait :

Le chemin de classe ne contient pas de définition pour cette classe. Une définition sera généraee automatiquement dans le fichier SWF lors de l'exportation.

Voupeignere c t a rissment si le symbole de bibliothque ne necessite pas de fonctionnalités en dehors de celles de la classe MovieClip.

Si vous n'indiquez aucune classe pour votre symbole, Flash create pour lui une classe du type de celle-ci :

package   
{ import flash.display MoviesClip; public class ExampleMovieClip extends MovieClip { public function ExampleMovieClip() { } } 

Si vous ne souhaitez pas ajouter des fonctionnalités ActionScript au symbole, ajoutez les propriétés et méthodes nécessaires à la structure de code suivant. Supposons par exemple que vous disposez d'un symbole de clip contenant un cercle de 50 pixels de diamètre, dont le paramètre de liaison est Exporter pour ActionScript et dont la classe est Circle. Le code suivant, lorsqu'il est placé dans un filchier Circle.as, étend la classe MovieClip et fournit au symbole les méthodes supplémentaires getArea() et getCircumference():

package   
{ import flash.display MoviesClip; public class Circle extends MovieClip { public function Circle() { } public function getArea():Number { // The formula is Pi times the radius squared. return Math.PI \* Math.pow((width / 2), 2); } public function getCircumference():Number { // The formula is Pi times the diameter. return Math.PI \* width; } } 

Le code suivant, place dans une image-clé à l'image 1 du document Flash, create une occurrence du symbole et l'affiche à l'écran :

var c:Circle = new Circle();  
addChild(c);  
trace(c.width);  
trace(c.height);  
trace(c.getArea());  
trace(c.getCircumference()); 

Ce code montre comment utiliser l'instanciation ActionScript au lieu de faire glisser des actifs individuels vers la scene. Il cree un cercle qui presente toutes les proprietes d'un clip et possede les methodes personnalises definies dans voitre classe Circle. Il s'agit d'un exemple tout a fait elementaire ; un symbole de bibliothèque peut specifier un nombre illimité de propriétés et de méthodes dans sa classe.

L'instanciation en ActionScript est un processus puissant, car il permet de creer dynamiquement de nombreuses occurrences qu'il serait particulièrement laborieux de creer manuelle. Elle vous apporte en outre une grande souplesse, puisque vous pouvez personnaliser les propriétés de chaque occurrence dés sa création. Pour saisir l'importance de ces avantages, vous pouvez utiliser une boucle pour creer dynamiquement plusieurs occurrences de Circle. ÀpRES avoir ajouté le symbole Circle et la classe correspondante, décrits précédemment, dans la bibliothèque de votre document Flash, placez le code suivant dans une image-clé à l'image 1 :

import flash.geom.ColorTransform;
var totalCircles:uint = 10 var i:uint;
for (i = 0;i < total Circles; i + + ) { // Create a new Circle instance. var c:Circle = new Circle(); // Place the new Circle at an x coordinate that will space the circles // evenly across the Stage. c.x = (stage.stageWidth / totalCircles) * i; // Place the Circle instance at the vertical center of the Stage. c.y = stage.stageHeight / 2; // Change the Circle instance to a random color c.transform.colorTransform = getRandomColor(); // Add the Circle instance to the current timeline. addChild(c);
}
function getRandomColor():ColorTransform
{ // Generate random values for the red, green, and blue color channels. var red:Number = (Math.random() * 512)-255; var green:Number = (Math.random() * 512)-255; var blue:Number = (Math.random() * 512)-255; // Create and return a ColorTransform object with the random colors. return new ColorTransform(1, 1, 1, 1, red, green, blue, 0);

Cet exemple illustré la rapidité avec laquelle vous pouvez creer et personneliser plusieurs occurrences d'un symbole à l'aide de code. Chaque occurrence est positionnée en fonction du compteur de boucle. Ensuite une couleur lui est attribuée au hasard à l'aide de la propriété transform (dont Circle hérite en étendant la classe MovieClip).

Chargement d'un fichier SWF externe

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

En ActionScript 3.0, les fichiers SWF sont charges avec la classe Loader. Pour charger un fisier SWF externe, vous nevez DEFINIR quatre etapes en ActionScript :

1 Créer un objet URLRequest avec l'adresse URL du fichier.
2 Creer un objet Loader.
3 Appeler la méthode load() de l'objet Loader en lui passant en paramètre l'occurrence de l'objet URLsRequest.
4 Appeler la méthode addChild() pour un conteneur d'objet d'affichage (par exemple le scenario principal d'un document Flash) afin d'ajouter l'occurrence de Loader à la liste d'affichage

Le code final se presente ainsi :

var request:URLRequest = new URLRequest("http://www.[yourdomain].com/externalSwf.swf");  
var loader:Loader = new Loader()  
loader.load(request);  
addChildloader); 

Le même code peut être utilisé pour charger un fisquier image externe (image JPEG, GIF ou PNG) en spécifient l'adresse URL de ce fisquier à la place de celle d'un fisquier SWF. Contrairement à un fisquier image, un fisquier SWF peut conténir du code ActionScript. Ainsi, bien que le processus de chargement d'un fisquier SWF soit identique à celui d'une image, le fisquier SWF à l'origine du chargement et le fisquier SWF charge doivent se couver dans le même sandbox de sécurité si vous souhaitez utiliser ActionScript pour communiquer avec le fisquier SWF externe. En outre, si ce fisquier externe contient des classes qui partagent le même espace de noms que les classes du fisquier SWF qui le charge, il peut s'avérer nécessaire de créé un domaine d'application pour le fisquier charge afin d'éviter d'eventuels conflicts d'espace de nom. Pour plus d'informations sur la sécurité et le domaine d'application, voir « Utilisation de domains d'application » à la page 152 et « Chargement de contenu » à la page 1104.

Une fois que le fichier SWF externe est chargé, il devient accessible via la propriété Loader_content. Si ce fichier est publié en ActionScript 3.0, il s'agira soit d'un clip, soit d'un sprite, selon la classe qu'il étend.

Il existe quelques différences entre le chargement d'un fichier SWF dans Adobe AIR pour iOS et le chargement dans d'autres plates-formes. Pour plus d'informations, voir « Chargement de fichiers SWF dans AIR pour iOS » à la page 209.

Considérations relatives au chargement de fichiers SWF de version ancienne

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Si un fjichier SWF externe a ete publié dans une version anterieure d'ActionScript, il faut tener compte de restrictions importantes. Contrairement à un fjichier SWF ActionScript 3.0 qui s'exécute dans AVM2 (ActionScript Virtual Machine 2), un fjichier SWF publié en ActionScript 1.0 ou 2.0 s'exécute dans AVM1 (ActionScript Virtual Machine 1).

Le chargement d'un fjichier SWF ActionScript 1.0 ou 2.0 dans un fjichier SWF ActionScript 3.0 présente d'importantes différences par rapport au chargement d'un fjichier SWF ActionScript 3.0. Flash Player garantit une compatibilité totale avec les versions precedentes et les contenus publiés antérieurement. Tout contenu qui s'exécute dans les versions antérieures de Flash Player s'exécute dans les versions de Flash Player qui géront ActionScript 3.0. Tenez cependant compte des restrictions suivantes :

  • Le code ActionScript 3.0 peut charger un fichier SWF écrit en ActionScript 1.0 ou 2.0. Lorsque le chargement d'un fichier SWF ActionScript 1.0 ou 2.0 aboutit, l'objet charged (la propriété Loader(content) est un objet AVM1Movie. Une occurrence d'AVM1Movie n'est pas identique à une occurrence de MovieClip. C'est un objet d'affichage qui, contrairement à un clip, ne compte pas de méthodes ni de propriétés liées au scenario. Le fichier SWF AVM2 parent ne peut pas acceder aux propriétés, méthodes ou objets de l'objet AVM1Movie charged.
  • Les fischiers SWF écrites en ActionScript 1.0 ou 2.0 ne peuvent pas charger les fischiers SWF écrites en ActionScript 3.0. Cela signifie que les fischiers SWF créés dans Flash 8, Flex Builder 1.5 ou une version antérieure ne peuvent pas charger les fischiers SWF écrites en ActionScript 3.0.

Il existe une seule exception à cette rège : un fichier SWF écrit en ActionScript 2.0 peut être remplaced par un fichier SWF écrit en ActionScript 3.0, sous réserve que le fichier écrit en ActionScript 2.0 n'ait effectué aucun chargement à chaque niveau que ce soit. Pour ce faire, le fichier SWF écrit en ActionScript 2.0 doit appeler loadMovieNum() et transmettre la valeur 0 au paramètre level.

  • En règle générale, les fichiers SWF écrites en ActionScript 1.0 ou 2.0 doivent faire l'objet d'une migration pour fonctionner conjointement avec des fichiers SWF écrites en ActionScript 3.0. Supposons, par exemple, que vous ayez créé un lecteur multimédia avec ActionScript 2.0. Ce lecteur multimédia charge des contenus divers également créés en ActionScript 2.0. Il est impossible de creator un contenu en ActionScript 3.0 et de le charger dans le lecteur multimédia. Vous nevez effectuer une migration du lecteur vers ActionScript 3.0.

Néanmoins, si vous créez un lecteur multimédia en ActionScript 3.0, il peut effectuer de simples chargements de votre contenu en ActionScript 2.0.

Le tableau ci-après récapitule les limites des versions précédentes de Flash Player relatives au chargement de contenus plus récents et à l'exécution de code, ainsi que les restrictions liées à la programmation croisiée entre les fichiers SWF écrites en différentes versions d'ActionScript.

Fonctionnalité prise en chargeFlash Player 7Flash Player 8Flash Player 9 et 10
Peut charger les fichiers SWF pourversion 7 et antérieureversion 8 et antérieureversion 9 (ou 10) et antérieure
Machine virtuelle incluseAVM1AVM1AVM1 et AVM2
Exécuté les fichiers SWF écrits en ActionScript1.0 et 2.01.0 et 2.01.0, 2.0 et 3.0

Dans le tableau ci-dessous, « Fonctionnalité prise en charge » fait ↔ reference au contenu lisible dans Flash Player 9 ou une version ultérieure. Le contenu lisible dans Flash Player version 8 ou antérieure peut être chargé, affiché, executé etprogrammé avec ActionScript 1.0 et 2.0 uniquement.

Fonctionnalité prise en chargeContenu créé en ActionScript 1.0 et 2.0Contenu créé en ActionScript 3.0
Peut charger du contentu et exécuter le code de contentus créé dansActionScript 1.0 et 2.0 uniquementActionScript 1.0 et 2.0 et ActionScript 3.0
Peut programmer le contentu créé dansActionScript 1.0 et 2.0 uniquement (ActionScript 3.0 via LocalConnection)ActionScript 1.0 et 2.0 via LocalConnection ActionScript 3.0

Exemple de clip : RuntimeAssetsExplorer

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La fonctionnalité Exporter pour ActionScript présente des avantages particuliers lorsque des bibliothèques peuvent être réutilisées sur plusieurs projets. Si Flash Player ou AIR exécute un fjichier SWF, les symboles ayant été exportés dans ActionScript sont disponibles pour tous les fjichiers SWF au sein du même sandbox de sécurité que le fjichier SWF qui le charge. De cette manière, un seul document Flash peut générer un fjichier SWF destiné uniquement à accueiller des éléments graphiques. Cette technique est très utile pour les grands projets dans lesquels les concepteurs graphiques charges des éléments visuels peuvent travailler en parallax avec les développpeurs qui créé une « enveloppe » SWF qui chargera les fjichiers SWF des éléments graphiques au moment de l'opération. Cette méthode peut vous servir dans la maintenance d'un ensemble de versions de fjichiers dans lesquelles les actifs graphiques ne sont pas dépendants du développement de la programmation.

L'application RuntimeAssetsExplorer charge tout fichier SWF qui est une sous-classe de RuntimeAsset et permet de consulter les éléments disponibles de ce fichier SWF. Cet exemple illustrate les points suivants :

  • Chargement d'un fichier SWF externe à l'aide de Loader.load()
  • Création dynamique d'un symbole de bibliothèque exporté pour ActionScript
  • Contrôle de la lecture du MovieClip avec ActionScript

Avant de commencer, notez que tous les fichiers SWF devant s'executer dans Flash Player doivent se trouver dans le même sandbox de sécurité. Pour plus d'informations, voir « Sandbox de sécurité » à la page 1087.

Pour obtenir les fichiers d'application associés à cet exemple, téléchargez les exemples Flash Professional. Les fichiers de l'application RuntimeAssetsExplorer se trouvent dans le dossier Samples/Chapters/RuntimeAssetsExplorer.

L'application se compose des fichiers suivants :

FichierDescription
RuntimeAssetsExample.mxml ou RuntimeAssetsExample.flaInterface utilisé de l'application pour Flex (MXML) ou Flash (FLA).
RuntimeAssetsExample.asClasse document pour l'application Flash (FLA).
GeometricAssets.asClasse exemple qui implémente l'interface RuntimeAsset.
GeometricAssets.flaFichier FLa lié à la classe GeometricAssets ( classe de document du fichier FLA) contenant les symboles exportés pour ActionScript.
com/example/programmingas3/runtimeassetexplorer/RuntimesLibrary.asInterface qui définit les méthodes attendues par tous les fichiers SWF d'actifs d'exécution qui seront charges dans l'explorateur.
com/example/programmingas3/runtimeassetexplorer/AnimatingBox.asClasse du symbolde bibliothèque dont la forme est un rectangle pivotant.
com/example/programmingas3/runtimeassetexplorer/AnimatingStar.asClasse du symbolde bibliothèque dont la forme est une étoile pivotante.

Etablissement de l'interface de bibliothèque d'exécution

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Pour que l'explorateur interagisse convenably avec une bibliothèque SWF, la structure des bibliothèques d'éléments doit être formalisée. Pour ce fait, nous allons创建工作 une interface, que l'on pourrait comparer à une classe dans la mesure où elle représenté un modèle de définition des méthodes qui définissent une structure attendue. Par contre, à l'inverse d'une classe, elle ne compeote pas les corps des méthodes. L'interface est un moyen de communication pour la bibliothèque d'éléments et l'explorateur. Chaque fichier SWF d'éléments charge dans le navigateur implémentera cette interface. Pour plus d'informations sur l'utilité des interfaces, voir Interfaces dans Formation à ActionScript 3.0.

L'interface RuntimeLibrary est très simple, puisque nous avons uniquement besoin d'une fonction qui fournisse à l'explorateur un tableau de chemins de classe pour les symboles à exporter disponibles dans la bibliothèque. Cette interface utilise pour ce faire une seule méthode : getAssets().

package com.example.programmingas3+runtimeassetexplorer   
{ public interface RuntimeLibrary { function getAssets():Array; } 

Creation de fichiers SWF de bibliothèque d'actifs

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La définition de l'interface RuntimeLibrary permet de creer plusieurs fischiers SWF de bibliothèque d'actifs, qui pourrait être charges dans un autre fischier SWF. L'élaboration d'une bibliothèque SWF d'actifs repose sur quatre tâches :

  • Création d'une classe pour le fichier SWF de bibliothèque d'actifs
  • Création de classes pour les différents éléments contenus dans la bibliothèque
  • Création des éléments graphiques eux-mêmes
  • Association des éléments graphiques à des classes et publication du fichier SWF de bibliothèque

Creation d'une classe pour implémenter l'interface RuntimeLibrary

Nous allons ensuite创建工作 la classe GeometricAssets qui implémente l'interface RuntimeLibrary, et sera la classe du document FLA. Le code de cette classe est très proche de celui de l'interface RuntimeLibrary, la différence étant que la définition de classe comporte le corps de la méthode getAssets().

package   
{ import flash.display.Sprite; import com.example(programmingas3+runtimeassetexplorer.RunttimeLibrary; public class GeometricAssets extends Sprite implements RuntimeLibrary { public function GeometricAssets() { } public function getAssets():Array { return [ "com.example.programmingas3+runtimeassetexplorer.AznatingBox", "com.example.programmingas3+runtimeassetexplorer.AznatingStar" ]; } } 

Si nous deviens creer une deuxieme bibliothèque d'exécution, nous pourrions créer un autre fichier FLA reposant sur une autre classe (AnimationAssets, par exemple) qui assure sa propre implémentation de getAssets().

Création de classes pour chaque éléments MovieClip

Pour les besoin de cet exemple, nous étendrons simplement la classe MovieClip, sans ajouter de fonctionnalité aux éléments. Le code suivant destiné à AnimatingStar estsemblable à celui de AnimatingBox :

package com.example.programmingas3+runtimeassetexplorer   
{ import flash.display MoviesClip; public class AnimatingStar extends MovieClip { public function AnimatingStar(){ } } 

Publication de la bibliothèque

Nous allons maintainant relier les actifs de classe MovieClip à la nouvelle classe en créé un fjichier FLA et en entrant GeometricAssets dans le champ Classe du document de l'Inspecteur des propriétés. Pour les besoin de cet exemple, nous allons creer deux formes très simples qui utilise une interpolation de scenario pour effectuer une rotation horaire sur 360 images. Les deux symboles animatingBox et animatingStar sont définis pour l'exportation vers ActionScript et leurs champs Classe correspondent aux chemins de classe respectifs spécifiés dans l'implémentation de getAssets(). La classe de base par défaut flash.display.MovieClip est conservée, puisque nous voulons creator des sous-classes pour les méthodes MovieClip standard.

Après définition des paramètres d'exportation de votre symbole, publiez le fichier FLA. Vous disposez maintainant de votre première bibliothèque d'exécution. Ce fichier SWF pourrait être charge dans un autre fichier SWF AVM2, dans lequel les symboles AnimatingBox et AnimatingStar seraient disponibles.

Chargement de la bibliothèque dans un autre fichier SWF

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Le dernier élément fonctionnel à traiter est l'interface utiliser de l'explorateur. Dans cet exemple, le chemin d'accès à la bibliothèque d'exécution est codé en dur dans la variable ASSETS_PATH. Vous pourriez également utiliser la classe FileReference, par exemple pourisser une interface qui recherche un fichier SWF particulier sur le disque dur.

Une fois que la bibliothèque d'exécution est chargée, Flash Player appelle la méthode runtimeAssetsLoadComplete().

private function runtimeAssetsLoadComplete(event:Event):void { var rl: = event.target.content; var assetList:Array = rl.getAssets(); populateDropdown(assetList); stage.frameRate = 60 .
}

Dans cette méthode, la variable rl représenté le fjichier SWF charged. Le code appelle la méthode getAssets() du fjichier SWF charged, obtient la liste des éléments disponibles et remplit un composantComboBox avec cette liste en appelant la méthode populateDropDown(). Cette méthode enregistre le chemin de classe complet de chaque élément. Si l'utilisateur clique sur le bouton Ajouter, l'interface déclenchée la méthode addAsset():

private function addAsset():void
{ var className:String = _assetNameCbo.selectedItem.data; varAssetClass:Class = getDefinitionByName(className)as Class; varmc:MovieClip newAssetClass(); }

qui obtient le chemin de classe de l'objet actuellement sélectionné dans laComboBox (assetNameCboSelectedItem.data), et utilise la fonction getName() (du package flash.utils) pour obtenir une referencia à la classe de l'objet afin de creator une nouvelle occurrence de celui-ci.

Chapitre 17 : Utilisation des interpolations de mouvement

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures, Flash CS3 ou ultérieur requis

La section « Animation des objets » à la page 200 déscrit la procédure d'implementation d'une animation pilotée par un script ActionScript.

Ce chapitre est consacré à une autre technique de création d'une animation : l'interpolation de mouvement. Cette technique vous permet de creer un mouvement en le configurant en mode interactif dans un document par le biais d'Adobe® Flash® Professional. Vous pouvez ensuite utiliser ce mouvement dans votre animation dynamique à base de code ActionScript lors de l'exécution.

Flash Professional générale automatiquement le code ActionScript qui implémente l'interpolation de mouvement et vous permet de le copier et de le réutiliser.

Pour creer des interpolations de mouvement, vous devez dispose d'une licence pour Flash Professional.

Voir aussi

Package fl-motion

Principes de base des interpolations de mouvement

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures, Flash CS3 ou ultérieur requis

Les interpolations de mouvement permettent de creer aisément une animation.

Une interpolation de mouvement modifie les propriétés d'un objet d'affichage, telles que la position ou la rotation, d'une image à l'autre. Elle permet également de modifier l'apparce d'un objet d'affichage en cours de déplacement en lui appliquant divers filtres et propriétés. Vous creez l'interpolation de mouvement en mode interactif dans Flash Professional, ce qui générale le code ActionScript correspondant. Dans Flash, utilisez la commande Copie de mouvement en tant qu'ActionScript 3.0 pour copier le code ActionScript à l'origine de l'interpolation de mouvement. Vous pouvez alors réutiliser le code ActionScript pour creer un mouvement dans votre animation dynamique lors de l'exécution.

Pour plus d'informations sur la création d'une interpolation de mouvement, voir la section Interpolations de mouvement du manuel Utilisation de Flash Professional.

Concepts important et terminologie

La liste de référence suivante contient un terme important relativ à la fonctionnalité étudiée :

Interpolation de mouvement Construction qui génére des images intermediaires d'un objet d'affichage dans des états et à des moments différents, créé ainsi l'impression que le premier état évolue progressivement vers le second état. Une interpolation de mouvement permet de déplacer un objet d'affichage sur la scene, ainsi que de le faire progressivement grandir, rétrécir, pivoter ou changer de couleur.

Copie de scripts d'interpolation de mouvement dans Flash

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures, Flash CS3 ou ultérieur requis

Une interpolation générale des images intermédiaires qui affichent un objet d'affichage dans des états différents dans deux images distinctes d'un scenario. Elle cree l'impression que le contenu de la premiere image se transforme progressivement en contenu de la seconde image. Dans une interpolation de mouvement, le changement d'apparce implique généralement la modification de la position de l'objet d'affichage, créé ainsi un mouvement. Outre le repositionnement de l'objet d'affichage, une interpolation de mouvement peut faire pivoter, incliner ou redimensionner ce dernier, voir lui appliquer des filtres.

Vou creez une interpolation de mouvement dans Flash en déplaçant un objet d'affichage entre des images-clé du scenario. Flash génère automatiquement le code ActionScript qui désrit l'interpolation, que vous pouze copier et enregistrer dans un fisier. Pour plus d'informations sur la création d'une interpolation de mouvement, voir la section Interpolations de mouvement du manuel Utilisation de Flash Professional.

Voupez acceder à la copie de mouvement en tant que commande ActionScript 3.0 dans Flash, de deux façon differentes. La première consiste à utiliser un menu contextual d'interpolation sur la scene, comme suit :

1 Sélectionnéz l'interpolation de mouvement sur la scène.
2 Cliquez dessus avec le bouton croit de la souris (Windows) ou cliquez sur la touche Contrôle (Macintosh).
3 Choisissez Copie de mouvement en tant que ActionScript 3.0...

ADOBE ACTIONSCRIPT 3.0 - Copie de scripts d'interpolation de mouvement dans Flash - 1

La seconde technique consiste a besoin directement la commande dans le menu Edition de Flash, comme suit :

1 Sélectionnéz l'interpolation de mouvement sur la scene.

2 Choisissez Edition > Scenario > Copier le mouvement en tant que ActionScript 3.0.

ADOBE ACTIONSCRIPT 3.0 - Copie de scripts d'interpolation de mouvement dans Flash - 2

Une fois le script copie, collez-le dans un fichier et enregistrez-le.

Une fois l'interpolation de mouvement créée et après avoir copé et enregistré le script, vous pouze la réutiliser sous sa forme actuelle ou la modifier dans votre propre animation dynamique pilotée par un script ActionScript.

Incorporation de scripts d'interpolation de mouvement

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures, Flash CS3 ou ultérieur requis

L'en-tête du code ActionScript copied à partir de Flash recense tous les modules requis pour prendre en charge l'interpolation de mouvement.

Classes d'interpolation de mouvement

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures, Flash CS3 ou ultérieur requis

Les classes principales d'interpolation de mouvement, AnimatorFactory, MotionBase et Motion, appartiennent au package fl-motion. Vous pouriez avoir besoin de classes supplémentaires suivant les propriétés que l'interpolation de mouvement manipule. Par exemple, si l'interpolation de mouvement transforme ou fait pivoter lobjet d'affichage, vous doivent importer les classes flash.geom appropriées. Si des filtres sont appliqués, importez les classes flash.filter. Dans ActionScript, une interpolation de mouvement est une occurrence de la classe Motion. La classe Motion stocke une série d'animation d'images-clés pouvant s'appliquer à un objet visuel. Les données de l'animation comprend les éléments suivants: position, échelle, rotation, inclinaison, couleur, filtres et accélération.

Le code ActionScript suivant a été copied à partir d'une interpolation de mouvement créé dans Flash en vue d'animer un objet d'affchage portant le nom d'occurrence Symbol1_2. Il déclare une variable associée à un objet MotionBase nommé __motion_Symbol1_2. La classe MotionBase est le parent de la classe Motion.

var __motion_Symbol1_2:MotionBase;

Le script cree ensuite I'objet Motion :

__motion_Symbol1_2 = new Motion();

Noms d'objet Motion

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures, Flash CS3 ou ultérieur requis

Dans le cas précédent, Flash a automatiquement generé le nom motion_Symbol1_2 de l'objet Motion. Il a associé le préfixe __motion au nom de l'objet d'affichage. Ainsi, le nom généra automatiquement est basé sur le nom d'occurrence de l'objet cible de l'interpolation de mouvement dans Flash. La propriété durée de l'objet Motion indique le nombre total d'images dans l'interpolation de mouvement:

Par défaut, Flash affecte automatiquement un nom à l'occurrence d'objet d'affichage dont l'interpolation de mouvement est copiee si elle n'en possede pas encore un.

Lorsque vous réutilisez un code ActionScript créé par Flash dans votre propre animation, vous pouze conserver le nom d'interpolation automatiquement génére par Flash ou désirir un autre nom. Si vous modifiez le nom de l'interpolation, n'oubliez pas de répercuter la modification dans l'ensemble du script.

Dans Flash, vous pouvez également affecter le nom de votrechioix à l'objet cible de l'interpolation de mouvement, puis créé l'interpolation de mouvement et copier le script. Quelle que soit l'approche adoptée, assurez-vous que chaque objet Motion de votre code ActionScript possède un nom unique.

Description de l'animation

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures, Flash CS3 ou ultérieur requis

La méthode addPropertyArray() de la classe MotionBase ajoute un tableau de valeurs pour désire chaque propriété interpolée.

Le tableau contient potentiellement un élément par image-clé de l'interpolation de mouvement. Il arrive souvent que certains de ces tableaux contiennent moins d'éléments que le nombre total d'images-clés de l'interpolation de mouvement. Ce cas de figure se produit lorsque la dernière valeur du tableau n'est pas modifiée pour les images restantes.

Si la longueur de l'argument array est supérieure à celle de la propriété durée de l'objet Motion, la méthode addPropertyArray() ajuste en conséquence la valeur de la propriété durée. Elle n'ajoute pas d'image-clé pour les propriétés précédemment ajoutées. Les nouvelles images-clés subsistant pendant la durée des images supplémentaires de l'animation.

Les propriétés x et y de l'objet Motion décrivent la nouvelle position de l'objet interpolé au fur et à mesure de l'exécution de l'animation. Ces coordonnées correspondant aux valeurs les plus susceptibles de changer dans chaque image-clé si la position de l'objet d'affichage évolve. La méthode addPropertyArray() vous permet d'ajouter d'autres propriétés de mouvement. Par exemple, ajoutez les valeurs scaleX et scaleY si l'objet interpolé est redimensionné. Ajoutez les valeurs skewX et skewY s'il est incliné. Ajoutez la propriété rotationConcat s'il fait l'objet d'une rotation.

Utilisez la méthode addPropertyArray() pour définir les propriétés d'interpolation suivantes :

xPosition horizontale du point de transformation de l'objet dans l'espace de coordonnées de son objet parent
yPosition verticale du point de transformation de l'objet dans l'espace de coordonnées de son objet parent
zPosition de profondeur (axe z) du point de transformation de l'objet dans l'espace de coordonnées de son objet parent
scaleXRedimensionnement horizontal, exprimé sous forme de pourcentage de l'objet tel qu'il est appliqué à partir du point de transformation
scaleYRedimensionnement vertical, exprimé sous forme de pourcentage de l'objet tel qu'il est appliqué à partir du point de transformation
skewXAngle d'inclinaison horizontale de l'objet, en degrés, tel qu'il est appliqué à partir du point de transformation
skewYAngle d'inclinaison verticale de l'objet, en degrés, tel qu'il est appliqué à partir du point de transformation
rotationXRotation de l'objet ajusté de l'axe x à partir de son orientation d'origine
rotationYRotation de l'objet ajusté de l'axe y à partir de son orientation d'origine
rotationConcatValeurs de rotation (axe z) de l'objet dans le cadre du mouvement par rapport à l'orientation précédente appliquée à partir du point de transformation
useRotationConcatSi cette propriété est définie, elle entraîne la rotation de l'objet cible lorsque la méthode addPropertyArray() fournit des données de mouvement.
blendModeValeur de la classe BlendMode qui définit le mélange de couleurs de l'objet sous lequel figurent les graphiques
matrix3DPropriété matrix3D si elle a été définie pour l'image-clé. Réservée aux interpolations 3D. Si elle est utilisée, aucune des propriétés de transformation précédentes n'est prise en considération.
rotationZRotation (en degrés) autour de l'axe z de l'objet, à partir de son orientation d'origine par rapport au conteneur parent 3D. Utilisé pour les interpolations 3D au lieu de rotationConcat.

Les propriétés ajoutées au script automatiquement géné ré varient selon les propriétés affectées à l'interpolation de mouvement dans Flash. Vous pouvez ajouter, supprimer ou modifier certaines de ces propriétés lorsque vous personnalisez votre version du script.

Le code suivant affecte des valeurs aux propriétés de l'interpolation de mouvement __motion_Wheel_. Dans ce cas de figure, l'objet d'affichage interpolé ne change pas d'emplacement, mais pivote sur place dans les 29 images de l'interpolation de mouvement. Les diverses valeurs affectées au tableau rotationConcat définitissant la rotation. Les autres valeurs de propriété de cette interpolation de mouvement ne sont pas modifiées.

__motion_Wheel = new Motion();  
__motion_Wheel.duration = 29;  
__motion_Wheel.addPropertyArray("x", [0]);  
__motion_Wheel.addPropertyArray("y", [0]);  
__motion_Wheel.addPropertyArray("scaleX", [1.00]);  
__motion_Wheel.addPropertyArray("scaleY", [1.00]);  
__motion_Wheel.addPropertyArray("skewX", [0]);  
__motion_Wheel.addPropertyArray("skewY", [0]);  
__motion_Wheel.addPropertyArray("rotationConcat",  
[0, -13.2143, -26.4285, -39.6428, -52.8571, -66.0714, -79.2857, -92.4999, -105.714, -118.929, -132.143, -145.357, -158.571, -171.786, -185, -198.214, -211.429, -224.643, -237.857, -251.071, -264.286, -277.5, -290.714, -303.929, -317.143, -330.357, -343.571, -356.786, -370  
]  
);  
__motion_Wheel.addPropertyArray("blendMode", ["normal"]); 

Dans l'exemple suivant, l'objet d'affichage Leaf_1 traverse la scène. Les tableaux de propriétés x et y correspondants contiennent des valeurs différentes pour chacune des 100 images de l'animation. Par ailleurs, l'objet pivote sur son axe z au fur et à mesure qu'il traverse la scène. Les divers éléments du tableau de la propriété rotationZ déterminent la rotation.

motion_Leaf_1 = new MotionBase();   
motion_Leaf_1.duration = 100;   
motion_Symbol1_4.addPropertyArray("y",   
[ 0,5.91999,11.84,17.76,23.68,29.6,35.52,41.44,47.36,53.28,59.2,65.12,71.04, 76.96,82.88,88.8,94.72,100.64,106.56,112.48,118.4,124.32,130.24,136.16,142.08, 148,150.455,152.909,155.364,157.818,160.273,162.727,165.182,167.636,170.091, 172.545,175,177.455,179.909,182.364,184.818,187.273,189.727,192.182,194.636, 197.091,199.545,202,207.433,212.865,218.298,223.73,229.163,234.596,240.028, 245.461,250.893,256.326,261.759,267.191,272.624,278.057,283.489, 288.922,294.354,299.787,305.22,310.652,316.085,321.517,326.95,330.475,334, 337.525,341.05,344.575,348.1,351.625,355.15,358.675,362.2,365.725,369.25, 372.775,376.3,379.825,383.35,386.875,390.4,393.925,397.45,400.975,404.5 , 407.5,410.5,413.5,416.5,419.5,422.5,425.5   
]   
);   
motion_Symboll_4.addPropertyArray("scaleX",[1.00]);   
motion_Symboll_4.addPropertyArray("scaleY",[1.00]);   
motion_Symboll_4.addPropertyArray("skewX",[O]);   
motion_Symboll_4.addPropertyArray("skewY",[O]);   
motion_Symboll_4.addPropertyArray("z", [ 0,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O.OO]   
);   
motion_Symboll_4.addPropertyArray("rotationX",[64.0361]);   
motion_Symboll_4.addPropertyArray("rotationY",[41.9578]);   
motion_Symboll_4.addPropertyArray("rotationZ", [ -18.0336,-17.5536,-17.0736,-16.5936,-16.1136,-15.6336,-15.1536,-14.6736 , -14.1936,-13.7136,-13.2336,-12.7536,-12.2736,-11.7936,-11.3136,-10.8336 , -10.3536,-9.8736,-9.3936,-8.9136,-8.4336,-7.9536,-7.4736,-6.9936,-6.5136 , -6.O336,-7.21542,-8.O39723,-9.O57905,-10.O7609,-11.O9427,-13.O1245,-14.O3063 , -15.O488I,-16.O67,-17.O85I8,-19.O0336,-20.O2154,-21.O3972,-22.O579I,-23.O7609 , -24.O9427,-26.O124S,-27.O3063,-28.O488I,-29.O67,-30.O85I8,-32.O0336,-3I.O77I , -30.O1206,-29.O164,-28.O207S,-27.O25I,-26.O294S,-25.O338,-24.O8I4,I-23.O4249 , -22.O468A,-21.O5IiN,-20.O5SIIaM-I-18.O6AIIbI- - 14.O8IaIbI- - 13.O8IaIbI- - 12.O8IaIbI- - 10.O0IaIIbI- - 10.O0IIbI- - 10.O0IIbI- - 10.O0IIbI- - 10.O0IIbI- - 10.O0IIbI- - 10.O0IIbI- - 10.O0IIbI- - 10.O0IIbI- - 10.O0IIbI- - 10.O0IIbI- - 10.OOIIbI- - 10.OOIIbI- - 10.OOIIbI- - 10.OOIIbI- - 10.OOIIbI- - 10.OOIIbI- - 10.OOIIbI- - 10.OOIIbI- - 10.OOIIbI- - 10.OOIIbI- - 10.OOOIIbI- - 10.OOOIIbI- - 10.OOOIIbI- - 10.OOOIIbI- - 10.OOOIIbI- - 10.OOOIIbI- - 10.OOOIIbI- - 10.OOOIIbI- - 10.OOOIIbI- - 10.OOOIIbI- - 10.OOIIbI- - 10.OOOIIbI- - 10.OOOIIbI- - 10.OOOIIbI- - 10.OOOIIbI- - 10.OOOIIbI- - 10.OOOIIbI- - 10.OOOIIbI- - 10.OOOIIbI- - 10.OOIIbI- - 10.OOIIbI- - 1O.IoIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIO 

Ajout de filtrés

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures, Flash CS3 ou ultérieur requis

Si l'objet cible d'une interpolation de mouvement contient des filtres, ces derniers sont ajoutés par le biais des méthodes initFilters() et addFilterPropertyArray() de la classe Motion.

Initialisation du tableau de filtrés

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures, Flash CS3 ou ultérieur requis

La méthode initFilters() initialise les filtres. Son premier argument est un tableau qui recense les noms de classe entièrement qualifiés de tous les filtres appliqués à l'objet d'affchage. Ce tableau de noms de filtre est généra à partir de la liste de filtres associée à l'interpolation de mouvement dans Flash. Dans votre copie du script, vous pouvez supprimer ou ajouter dans ce tableau n'importe quel filtre du package flash.filters. L'appel suivant initiaise la liste de filtres associée à l'objet d'affchage cible. Il applique les filtres DropShadowFilter, GlowFilter et BevelFilter et copie la liste dans chaque image-clé de l'objet Motion.

__motion BOX.initFilters([flash_filters.DropShadowFilter", "flash_filters.GlowFilter", "flash_filters.BevelFilter"], [0, 0, 0]); 

Ajout de filtres

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures, Flash CS3 ou ultérieur requis

La méthode addFilterPropertyArray() décrit les propriétés d'un filtré initialisé doté des arguments suivants :

1 Son premier argument identifie un filtrer en fonction de son index. L'index se refere à la position du nom de filtrer dans le tableau des noms de classe de filtrer transmis lors d'un appel précédent d'initFilters().
2 Le deuxième argument est la propriété à stocker pour le filtré dans chaque image-clé.
3 Le troisième argument est la valeur de la propriété de filtré indiquée.

Etant donne l'appoint precedent d'initFilters(), les appels suivants de addFilterPropertyArray() affectent la valeur 5 aux propriétés blurX et blurY de DropShadowFilter.DropShadowFilter est le premier élément (index 0) du tableau de filtres initiaisés :

__motion_box.addFilterPropertyArray(0, "blurX", [5]);  
__motion_box.addFilterPropertyArray(0, "blurY", [5]); 

Les trois appels suivants affectent des valeurs aux propriétés qualité, alpha et couleur de GlowFilter (le deuxième élément (index 1) du tableau de filtrés initiaisés):

__motion_box.addFilterPropertyArray(1, "quality", [BitmapFilterQuality.LOW]);  
__motion_box.addFilterPropertyArray(1, "alpha", [1.0]);  
__motion_box.addFilterPropertyArray(1, "color", [0xff0000]); 

Les quatre appelés suivants affectent des valeurs aux propriétés shadowAlpha, shadowColor, highlightAlpha et highlightColor de BevelFilter, le troisième élément (index 2) du tableau de filtres initiaisés :

__motion☑.addFilterPropertyArray(2, "shadowAlpha", [1.00]);  
__motion☑.addFilterPropertyArray(2, "shadowColor", [0x000000]);  
__motion☑.addFilterPropertyArray(2, "highlightAlpha", [1.00]);  
__motion☑.addFilterPropertyArray(2, "highlightColor", [0xFFFFFF]); 

Réglage de la couleur à l'aide de ColorMatrixFilter

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures, Flash CS3 ou ultérieur requis

Une fois ColorMatrixFilter initiaisé, vous pouvez définir les propriétés AdjustColor appropriées pour régler la luminosité, le contraste, la saturation et la teinte de l'objet d'affichage interpolé. En règle générale, le filtrer AdjustColor est appliqué lors de la génération de l'interpolation de mouvement dans Flash. Vous pouze l'ajuster dans votre copie du code ActionScript. L'exemple suivant transforme la teinte et la saturation de l'objet d'affichage au fur et à mesure qu'il se déplace.

motion_Leaf_1.initFilters([ "flash.filters.ColorMatrix" ], [0], -1, -1);  
motion_Leaf_1.addFilterPropertyArray(0, "adjustColorBrightness", [0], -1, -1);  
motion_Leaf_1.addFilterPropertyArray(0, "adjustColorContrast", [0], -1, -1);  
motion_Leaf_1.addFilterPropertyArray(0, "adjustColorSaturation",  
[  
0, -0.589039, 1.17808, -1.76712, -2.35616, -2.9452, -3.53424, -4.12328,  
-4.71232, -5.30136, -5.89041, 6.47945, -7.06849, -7.65753, -8.24657,  
-8.83561, -9.42465, -10.0137, -10.6027, -11.1918, 11.7808, -12.3699,  
-12.9589, -13.5479, -14.137, -14.726, -15.3151, -15.9041, -16.4931,  
17.0822, -17.6712, -18.2603, -18.8493, -19.4383, -20.0274, -20.6164,  
-21.2055, -21.7945, 22.3836, -22.9726, -23.5616, -24.1507, -24.7397,  
-25.3288, -25.9178, -26.5068, -27.0959, 27.6849, -28.274, -28.863, -29.452,  
-30.0411, -30.6301, -31.2192, -31.8082, -32.3973, 32.9863, -33.5753,  
-34.1644, -34.7534, -35.3425, -35.9315, -36.5205, -37.1096, -37.6986,  
38.2877, -38.8767, -39.4657, -40.0548, -40.6438, -41.2329, -41.8219,  
-42.411, -43  
],  
-1, -1);  
motion_Leaf_1.addFilterPropertyArray(0, "adjustColorHue",  
[  
0, 0.677418, 1.35484, 2.03226, 2.70967, 3.38709, 4.06451, 4.74193, 5.41935,  
6.09677, 6.77419, 7.45161, 8.12903, 8.80645, 9.48387, 10.1613, 10.8387, 11.5161,  
12.1935, 12.871, 13.5484, 14.2258, 14.9032, 15.5806, 16.2581, 16.9355, 17.6129,  
18.2903, 18.9677, 19.6452, 20.3226, 21, 22.4286, 23.8571, 25.2857, 26.7143, 28.1429,  
29.5714, 31, 32.4286, 33.8571, 35.2857, 36.7143, 38.1429, 39.5714, 41, 42.4286, 43.8571,  
45.2857, 46.7143, 48.1429, 49.5714, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87,  
90, 93, 96, 99, 102, 105, 108, 111, 114  
],  
-1, -1); 

Association d'une interpolation de mouvement à ses objets d'affichage

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures, Flash CS3 ou ultérieur requis

La dernière tâche consiste à associer l'interpolation de mouvement aux objets d'affichage qu'elle manipule.

La classe AnimatFactory gère l'association entre une interpolation de mouvement et ses objets d'affichage cible.

L'argument du constructeur d'AnimatorFactory correspond à l'objet Motion :

var __animFactory_Wheel:AnimatorFactory = newAnimatorFactory(_motion_Wheel); 

La méthode addTarget() de la classe AnimatorFactory permet d'associer lobjet d'affichage cible à l'interpolation de mouvement correspondante. Le code ActionScript copied à partir de Flash met la ligne addTarget() en commentaire et n'indique pas de nom d'occurrence :

// __animFactory_Wheel.addTarget(, 0);

Dans votre copie, stipulez l'objet d'affichage à associer à l'interpolation de mouvement. Dans l'exemple suivant, les cibles spécifiées sont greenWheel et redWheel :

animFactory_Wheel.AnimatorFactory.addTarget(greenWheel, 0);

```java
animFactory_Wheel AnimationFactory.addTarget(redWheel, 0);

Voussoupiezassocierplusieursobjetdd'affichagea lameme interpolationde mouvementenutilisantplusieursappels deaddTarget().

<h1 id="chapitre-18-utilisation-de-la-cinematique-inverse">Chapitre 18 : Utilisation de la cinematique inverse</h1>

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures, Flash CS4 ou ultérieur requis

La kinématique inverse (IK, Inverse kinematics) est une technique de création fantastique de mouvement réaliste.

IK you permit de creator des mouvements coordonnés au sein d'une chaine de sections connectées appelée squelette IK, de sorte que les sections se déplacent avec réalisme. Les sections du squelette représentent ses os et articulations. A partir de l'extrémité finale du squelette, IK calcule les angles des articulations requises pour atteindre cette dernière.

Calculer manuellement ces angles s'avereait particulièrement complexe. Cette fonctionnalité présente l'avantage de permettre de creator des squelettes en mode interactif dans Adobe® Flash® Professional. Il vous suffit ensuite de les animer par le biais d'ActionScript. Le moteur IK intégré à Flash Professional executée les calculs requis pour déscrire le mouvement du squelette. Vous pouvez restreindre le mouvement à certains paramètres dans votre code ActionScript.

La version Flash Professional CS5 de la cinematique inverse (IK) intègre à présent le concept de reassert de segment, généralement réservé aux applications d'animation haut de gamme. Associée au nouveau moteur physique dynamique, cette fonctionnalité permet de configurer des mouvements réalisistes. Cet effet est par ailleurs visible lors des phases d'exécution et de création.

Pour creer des squelettes de cinematique inverse, you'vedez disposer d'une licence pour Flash Professional.

<h1 id="voir-aussi-16">Voir aussi</h1>

Package fl.ik

<h1 id="principes-de-base-de-la-kinématique-inverse">Principes de base de la kinématique inverse</h1>

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures, Flash CS4 ou ultérieur requis

La kinématique inverse (IK) vous permet de créé une animation réalisée en liant des sections de sorte qu'elles se déplacent les ones par rapport aux autres avec naturel.

L'utilisation d'IK vous permet par exemple de déplacer une jambe pour qu'elle occupe une position déterminée en articulant les mouvements des articulations de la jambe nécessaires à l'obtention de la pose appropriée. IK utilise une structure osseuse chaîné portant le nom de squelette IK. Le package f1. ik vous aide à créé des animations qui ressemblant à un mouvement naturel. Il vous permet d'animer plusieurs squelettes IK en toute transparence sans avoir à maîtriser les concepts physiques sur lesquels s'accuient les algorithmes IK.

Vou creez le squelette IK et les os et articulations qui le composent dans Flash Professional. Vous pouvez ensuite utiliser les classes IK pour les animer lors de l'exécution.

Pour obtenir des instructions détaillées sur la création d'un squelette IK, voir Utilisation de la kinématique inverse dans Utilisation de Flash Professional.

<h1 id="concepts-important-et-terminologie-13">Concepts important et terminologie</h1>

La liste de référence suivante contient des termes importantes relatifs à la fonctionnalité étudiee.

Squelette Chaine kinématique composée d'os et d'articulations, utilisée en animation informatique pour simuler un mouvement réaliste.

Os Segment rigide d'un squelette, équivalent à un os chez un animal.

Cinématique inverse (IK) Processus d'identification des paramètres d'un object souple articulé appelé squelette ou chaîne cinématique.

Articulation Emplacement ou deux os s'unissant, concu pour permettre le mouvement des os ; analogue a une articulation chez un animal.

Moteur physique Package d'algorithmes physiques qui permet d'integrer des actions réalisés à l'animation.

Ressort Qualité d'un segment qui se déplace et réagit lorsque le segment parent est déplace, puis diminuè progressivement par incréements.

<h1 id="aperçu-de-lanimation-de-squelettes-ik">Aperçu de l'animation de squelettes IK</h1>

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures, Flash CS4 ou ultérieur requis

Une fois le squelette IK creé dans Flash Professional, utilisez les classes f1. ik pour restreindre ses mouvements, suivir les événements correspondants et l'animer lors de l'exécution.

La figure ci-dessous illustré le clip wheel. L'essieu est une occurrence d'un squelette IK appelée Axle. La classe IKMover déplace le squelette en le synchronisant avec la rotation d'une roue. Dans le squelette, IKBone, nommé ikBone2, est rattaché à la roue au niveau de l'articulation arrêté.

![](images/9fa7badc4d8612b414d6b8f9240df4aa2ecc164a6f9b3f537442415b610b83ad.jpg)  
A.Roue B.Essieu C.ikBone2

Lors de l'exécution, la roue tourne en association avec l'interpolation de mouvement __motion_Wheel étudiée dans « Description de l'animation » à la page 349. Un objet IKMover lance et contrôle le mouvement de l'essieu. La figure suivante propose deux instantanés du squelette de l'essieu connecté à la roue qui tourne sur différentes images de la rotation.

![](images/2d9c18676b8b867658c97629c68f93bd0b1ee675561c45d7801036466629c0c3.jpg)

Lors de l'exécution, le code ActionScript suivant :

- Extrait des informations relatives au squelette et à ses composants.   
- Instancie un objet IKMover.   
- Déplace l'essieu en konjection avec la rotation de la roue.

import fl.ik.*   
Wheel.addEventListener(Event entering_frame, frameFunc);   
```html
var tree:IKArmature = IKManager.getArmatureByName("Axle");  
var bone:IKBone = tree.getName("ikBone2");  
var endEffector:IKJoint = bone.tailJoint;  
var pos:Point = endEffector.position;  
var ik:IKMover = new IKMover(endEffector, pos);  
ik-limitByDistance = true;  
ikdistanceLimit = 0.1;  
ik-limitByIteration = true;  
ik_iterationLimit = 10; 
function frameFunc(event:Event)  
{  
    if (Wheel != null)  
    {  
        var mat:Matrix = Wheel.transform.matrix;  
        var pt = new Point(90, 0);  
        pt = mat.transformPoint(pt);  
        ik.moveTo(pt);  
    }  
} 

Les classes IK utilisées pour déplacer l'essieu sont les suivantes :

  • IKArmature: décrit le squelette (structure arborescente composée d'os et d'articulations). A créé dans Flash Professional.
  • IKManager : classe qui contient tous les squelettes IK du document, à créé dans Flash Professional.
  • IKBone: segment d'un squelette IK.
  • IKJoint : connexion entre deux os IK.
  • IKMover : lance et contrôle le mouvement IK des squelettes.

Pour obtenir une description détaillée de ces classes, voir ik package (Package ik).

Obtention d'informations sur un squelette IK

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures, Flash CS4 ou ultérieur requis

Commencez par déclarer les variables associées au squelette, à l'os et à l'articulation qui compose les sections à déplacer.

Le code suivant utilise la méthode getsqueletteByName() de la classe IKManager pour affecter la valeur du squelette Axle à la variable IKArmature tree. Le squelette Axle a été précédemment géné dans Flash Professional.

var tree:IKArmature = IKManager.getArmatureByName("Axle"); 

De même, le code suivant utilise la méthode getName() de la classe IKArmature pour affecter à la variable IKBone la valeur de l'os ikBone2.

var bone:IKBone = tree.getBoneByName("ikBone2"); 

L'articulation arriré de l'os ikBone2 correspond à la section du squelette connectée à la roue qui tourne.

La ligne suivante déclare la variable endEffector et l'effecte à la propriété tailjoint de l'sokBone2 :

La variable pos est un point qui stocke la position actuelle de l'articulation endEffector.

var pos:Point = endEffector.position; 

Dans cet exemple, pos correspond à la position de l'articulation raccordée à la roue à l'extrémité de l'essieu. La valeur d'origine de cette variable est extraite de la propriété position de IKJoint.

Instanciation de l'objet IKMover et restriction du mouvement

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures, Flash CS4 ou ultérieur requis

Uneoccurrencede la classeIKMoverdéplace l'essieu.

La ligne suivante instancie l'objet IKMover ik et transmet à son constructeur l'élement à déplacer et le point de départ du mouvement :

var ik:IKMover = new IKMover(endEffector, pos); 

Les propriétés de la classe IKMover vous permettent de restreindre le mouvement d'un squelette. Vous pouvez restreindre le mouvement en fonction de la distance, des iterations et de la durée du mouvement.

Les paires de propriétés suivantes imposent ces restrictions. Les paires se composent d'une valeur boolée qui indique si le mouvement est restreint et d'un entier stipulant la restriction :

Propriété BooleanPropriété IntegerRestriction définitie
limitByDistance:BooleandistanceLimit:intDéfinit la distance maximale en pixels parcourue par le moteur IK par itération.
limitByIteration:BooleaniterationLimit:intDéfinit le nombre maximal d'iterations effectuées par le moteur IK par mouvement.
limitByTime:BooleantimeLimit:intDéfinit la durée maximale, exprimée en milliseconds, affectée au moteur IK pour effectuer le mouvement.

Toutes les valeurs booléennes étant définies sur false par défaut, le mouvement n'est pas restreint, sauf si vous avez explicitement défini une valeur booléenne sur true. Pour imposer une restriction, définissez la propriété appropriée sur true, puis indiquez la valeur de la propriété Integer correspondante. Si vous définissez la restriction sur une valeur sans définiir la propriété Boolean correspondante, elle n'est pas prise en considération. Dans ce cas, le moteur IK continue à déplacer l'objet jusqu'à ce qu'une autre restriction ou la position cible de l'objet IKMover soit atteinte.

Dans l'exemple suivant, la distance maximale parcoursue par le mouvement du squelette est definié sur 0,1 pixel par iteration. Le nombre maximal d'iterations par mouvement est défini sur dix.

ik-limitByDistance = true;  
ikdistanceLimit = 0.1;  
ik-limitByIteration = true  
ik_iterationLimit = 10; 

Mouvement d'un squelette IK

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures, Flash CS4 ou ultérieur requis

L'objet IKMover déplace l'essieu au sein de l'écouteur d'évenement associé à la roue. A chaque événement enterFrame de la roue, une nouvelle position cible du squelette est calculée. Par le biais de sa méthode moveTo(), l'objet IKMover place l'articulation arrêté sur sa position cible ou parcourt une distance aussi longue que possible sans enfreindre les contraintes définies par ses propriétés limitByDistance, limitByIteration et limitByTime.

Wheel.addEventListener(Event.ENTER_FRAME, frameFunc);

function frameFunc(event:Event)  
{  
    if (Wheel != null)  
    {  
        var mat:Matrix = Wheel.transform.matrix;  
        var pt = new Point(90,0);  
        pt = mat.transformPoint(pt);  
        ik.moveTo(pt);  
    }  
} 

Utilisation de ressorts

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures, Flash CS5 ou ultérieur requis

La kinématique inverse prend en charge le ressort de segment dans Flash Professional CS5. Vous pouvez définir les ressorts de segment lors de la phase de création et ajouter ou modifier les attributs correspondants lors de l'exécution. La propriété Spring se rapporte à un segment et aux liaisons correspondantes. Elle possède deux attributs, IKJoint.springStrength, qui définit l'intensité du ressort, et IKJoint.springDamping, qui ajoute une résistance à la valeur d'intensité et modifie la valeur de décroissance du ressort.

L'intensité du ressort est exprimée sous forme de pourcentage compris entre la valeur par défaut, 0 (rigidité absolue) et 100 (élasticité importante contrôle par les lois de la physique). Les segments à ressort réagissant au mouvement de la liaison correspondante. Si aucune autre translation (rotation, x ou y) n'est activée, les paramètres du ressort n'ontaucun impact.

L'amortissement du ressort est exprimé sous forme de pourcentage, compris entre la valeur par défaut, 0 (aucune résistance) et 100 (amortissement important). L'amortissement modifie la durée de l'intervalle qui separe le mouvement initial d'un segment et son retour à une position de repos.

Vérifiez si des ressorts sont associés à un objet IKArmature par le biais de la propriété IKArmature.springsEnabled. Les autres propriétés et méthodes relatives aux ressorts relevant d'objets IKJoint individuels. Une liaison peut être soumise à une rotation angulaire et à une translation le long des axes x et y. Faites appel à IKJoint.setSpringAngle pour positionner l'angle de rotation d'un ressort de liaison et à IKJoint.setSpringPt pour définir la position par translation d'un ressort de liaison.

Cet exemple sélectionne un segment par nom et identifie la propriété tailJoint correspondante. Le code teste le squelette parent pour vérifier si des ressorts sont activés, puis définit les propriétés du ressort de la liaison.

var arm:IKArmature = IKManager.getArmatureAt(0);
var bone:IKBone = arm.getBoneByName("c");
var joint:IKJoint = bone.tailJoint;
if (arm.springEnabled) { joint.springStrength = 50; //medium spring strength joint.springDamping = 10 ;//light damping resistance if (joint.hasSpringAngle) { joint.setSpringAngle(30); //set angle for rotational spring }

Utilisation d'evénements IK

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures, Flash CS4 ou ultérieur requis

La classe IKEvent vous permet de creator un objet événement qui contient des informations sur les événements IK. Une information IKEvent déscrit le mouvement qui s'est arrêté car la durée, la distance ou le nombre maximal d'iterations stipulés ont été dépassés.

Le code suivant indique un écouteur et un gestionnaire d'évenement destinés au suivi des événements de limite de temps. Ce gestionnaire d'évenement signale les propriétés de durée, distance, nombre d'iterations et articulations d'un événement déclenché lorsque la durée maximale de l'objet IKMover est dépassée.

var ikmover:IKMover = new IKMover(endjoint, pos);
ikMover-limitByTime = true;
ikMover.timeLimit = 1000 ikmover.addEventListener(IKEvent.TIME_LIMIT, timeLimitFunction);
function timeLimitFunction(evt:IKEvent):void
{ trace("timeLimit hit"); trace("time is " +evt.time); trace("distance is " +evt(distance); trace("iterationCount is " +evt_iterationcount); trace("IKJoint is " +evt.joint.name);
}

Chapitre 19: Travail en trois dimensions (3D)

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

Les moteurs d'exécution de Flash Player et d'AIR prenant en charge les graphiques 3D de deux manières. Vous pouvez utiliser les objets d'affichage tridimensionnels sur la liste d'affichage de Flash. Cette méthode permet d'ajouter des effets tridimensionnels à du contenu Flash et convient aux objets相对较 peu de polygones. Dans Flash Player 11 et AIR 3 ou les versions ultérieures, vous pouvez effectuer le rendu de séquences 3D complexes à l'aide de l'API Stage3D.

Une fenêtre d'affichage Stage3D n'est pas un objet d'affichage. Les graphiques 3D sont rendus dans une fenêtre d'affichage qui apparaît sous la liste d'affichage de Flash (et au-dessus de tous les plans de fenêtre d'affichage StageVideo). Plutôt que d'utiliser les classes DisplayObject de Flash pour créé une série, utilisez un processus 3D calculable (similaire à OpenGL et Direct3D). Ce processus prend les données et les textures comme entrées et effectue le rendu de la série à l'aide des programmes de shaders que vous fournissez. L'accelération matérielle est utilisée lorsqu'un processeur graphique (GPU) compatible disposant des pilotes pris en charge est disponible sur l'ordinateur client.

Stage3D fournit une API de très bas niveau. Dans une application, vous étés encouragé à utiliser une structure d'application 3D prénant en charge Stage3D. Vous pouvez creatorer votre propre structure d'application, ou utiliser l'une des nombreuses structures commerciales et Open Source déjà disponibles.

Pour plus d'informations sur le développement d'applications 3D à l'aide de Stage3D et sur les structures d'application 3D disponibles, voir Flash Player Developer Center: Stage 3D.

Principes de base des objets d'affichage 3D

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

La principale différence entre un objet en deux dimensions (2D) et un objet en trois dimensions (3D) projeté sur un écran en deux dimensions consiste en l'ajout d'une troisième dimension à l'objet. La troisième dimension permet à l'objet de se rapprocher et de s'éloigner du point de vue de l'utilisateur.

Lorsque vous définissez explicitement la propriété d'un objet d'affichage sur une valeur numérique, l'objet créé automatiquement une matrice de transformation 3D. Vous pouvez intervenir sur cette matrice pour modifier les paramètres de transformation 3D de l'objet.

En outre, la rotation 3D differe de la rotation 2D. En 2D, l'axe de la rotation est systématiquement perpendicular au plan x/y, autrement dit, elle se trouve sur l'axe z. En 3D, l'axe de rotation peut se tracer autour de n'importe lequel des axes, x, y ou z. La définition des propriétés de rotation et de mise à l'échelle d'un objet d'affichage lui permet de se déplacer dans l'espace 3D.

Concepts important et terminologie

La liste de référence suivante contient des termes importants utilisés dans le cadre de la programmation de graphiques en 3 dimensions :

Perspective Dans un plan 2D, representation de lignes paralleles convergeant vers un point de fuite pour donner une illusion de profondeur et de distance.

Projection Génération d'une image 2D d'un object 3D. La projection 3D mappe des points 3D sur un plan 2D.

Rotation Modification de l'orientation (et souvent de la position) d'un objet en faisant déscrie un mouvement circulaire à chacun de ses points.

Transformation Modification de points 3D ou d'ensemble de points par translation, rotation, mise à l'échelle, inclinaison ou une combinaison de ces actions.

Translation Modification de la position d'un objet en déplacant chacun de ses points sur une distance et dans une direction identiques.

Point de fuite Point auquel des lignes parallètes qui s'éloignent semble reconntracer lorsqu'elles sont représentées dans une perspective linéaire.

Vecteur Un vecteur 3D représenté un point ou un emplacement dans l'espace en trois dimensions à l'aide de coordonnées cartésiennes (x,y,z)

Sommet Point.

Maillage texturé Tout point définitissant un objet dans l'espace 3D.

Mappage des coordonnées UV Mode d'application d'une texture ou d'une image bitmap à une surface 3D. Le mappage des coordonnées UV affecte des valeurs à des coordonnées sur une image en tant que pourcentages de l'axe horizontal (U) et de l'axe vertical (V).

valeur T Facteur de mise à l'échelle permettant de déterminer la taille d'un objet 3D lorsque celui-ci se rapproche ou s'éloigne du point de vue actuel.

Culling Rendu, ou non, des surfaces avec un enroulement spécifique. L'utilisation du culling (élimination) permet de masquer des surfaces qui ne sont pas visibles à partir du point de vue actuel.

Présentation des objets d'affichage 3D dans les moteurs d'exécution de Flash Player et d'AIR

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

Dans les versions de Flash Player antérieures à Flash Player 10 et dans les versions d'Adobe AIR antérieures à Adobe AIR 1.5, les objets d'affichage possèdent deux propriétés, x et y, permettant de positionner ces derniers sur un plan 2D. A partir de Flash Player 10 et Adobe AIR 1.5, tout object d'affichage ActionScript est doté d'une propriété z permettant de le positionner le long de l'axe z, qui est généralement utilisé pour indiquer la profondeur ou la distance.

Flash Player 10 et Adobe AIR 1.5 prenrent désormais en charge les effets 3D. Les objets 3D restent cependant essentiellement plats. Tout objet d'affichage, tel qu'un objet MovieClip ou Sprite, effectue en fait son propre rendu en deux dimensions, sur un plan unique. Les fonctions 3D vous permettent de placer, déplacer, faire pivoter et transformer de diverses façon ces objets planaires dans la totalité des trois dimensions. Elles vous permettent également de:gérer les points 3D et de les convertir en coordonnées 2D (x et y), afin que vous puissiez projeter les objets 3D sur un affichage 2D. A l'aide de ces fonctions, vous pouvez simuler de nombreux types d'effets 3D.

Le système de coordonnées 3D utilisé par ActionScript est différent. Lorsque vous utilisez des coordonnées 2D dans ActionScript, la valeur de x augmente au fur et a mesure du déplacement vers la droite le long de l'axe x, et la valeur de y augmente au fur et a mesure du déplacement vers le bas le long de l'axe y. Le système de coordonnées 3D conserve ces conventions et ajoute un axe z dont la valeur augmente au fur et a mesure que vous vous éloignez du point de vue.

ADOBE ACTIONSCRIPT 3.0 - Présentation des objets d'affichage 3D dans les moteurs d'exécution de Flash Player et d'AIR - 1
Directions positives des axes x, y et z dans le système de coordonnées 3D A + axe Z . B . Origine C + axe X . D + axe Y

Remarque: n'oubliez pas que Flash Player et AIR représentent toujours la 3D en calques. Par conséquent, si l'objet A se trouve devant l'objet B dans la liste d'affichage, Flash Player ou AIR rend toujours A devant B, quelles que soient les valeurs sur l'axe z des deux objets. Pour résoudre le conflit entre l'ordre de la liste d'affichage et celui de l'axe z, utilisez la méthode transform.getRelativeMatrix3D() afin d'enregistrer, puis de réorganiser les calques des objets d'affichage 3D. pour plus d'informations, voir « Réorganisation de l'affichage à l'aide d'objets Matrix3D » à la page 374.

Les classes ActionScript suivantes prenent en charge les nouvelles fonctions 3D :

1 La classe flash.display.DisplayObject contient la propriété z et de nouvelles propriétés de rotation et de mise à l'échelle permettant de manipuler les objets d'affichage dans l'espace 3D. La méthode DisplayObject.local3DToGlobal() simplifie la projection de géométrie 3D sur un plan 2D.
2 Vous pouvez utiliser la classe flash.geom.Vector3D en tant que structure de données pour la gestion des points 3D. Elle prend aussi en charge la mathématique vectorielle.
3 La classe flash.geom.Matrix3D prend en charge les transformations complexes de géométrie 3D, telles que la rotation, la mise à l'échelle et la translation.
4 La classe flash.-geom.PerspectiveProjection controle les parametes de mappage de géométrie 3D sur un affichage 2D.

ActionScript propose deux approches différentes pour simuler des images 3D :

1 Agencement et animation d'objets planaires dans l'espace 3D. Cette approche implique l'animation d'objets d'affichage à l'aide de leurs propriétés x, y et z, ou la définition des propriétés de rotation et de mise à l'échelle par le biais de la classe DisplayObject. Il est possible de générer des mouvements plus complexes à l'aide de l'objet DisplayObject.transform.matrix3D. L'objet DisplayObject.transform.perspectiveProjection personnelise le trace des objets d'affichage dans la perspective 3D. Adoptez cette approche pour animer des objets 3D principalement composés de plans. Elle convient aux galleries d'image 3D ou aux objets d'animation 2D agencés dans l'espace 3D, par exemple.

2 Génération de triangles 2D à partir d'une géométrie 3D et rendu de ces triangles avec des textures. Pour ce faire, vous doivent désignir et:gérer des données relatives aux objets 3D, puis les convertir en triangles 2D à des fins de rendu. Il est possible de mapper des textures bitmap sur ces triangles, qui sont ensuite tracés sur un objet graphique à l'aide de la méthode Graphics.drawTriangles(). Cette approche est appropriée pour le chargement des données d'un modele 3D à partir d'un fichier et le rendu du modele à l'écran, ou pour la génération et le tracé d'un terrain 3D en tant que maillages triangulaires, par exemple.

Création et déplacement d'objets d'affichage 3D

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

Pour convertir un objet d'affichage 2D en objet d'affichage 3D, vous devez explicitement définir sa propriété z sur une valeur numérique. Lorsque vous affectez une valeur à la propriété z , un objet Transform est créé pour l'objet d'affichage. La définition des propriétés DisplayObjectrotationX ou DisplayObjectRotationY create également un objet Transform. Celui-ci contient une propriété Matrix3D qui régit la représentation de l'objet d'affichage dans l'espace 3D.

Le code suivant définit les coordonnées d'un object d'affichage appelé « leaf » (feuille):

Voupe visualiser ces valeurs, aie que les propriétés qui en dérivent, dans la propriété matrix3D de I'bject Transform de la feuille :

var leafMatrix:Matrix3D = leaf.transform.matrix3D; 
trace(leafMatrix.position.x);   
trace(leafMatrix.position.y);   
trace(leafMatrix.position.z);   
trace(leafMatrix.position.length);   
trace(leafMatrix.position.lengthSquared); 

Pour plus d'informations sur les propriétés de l'objet Transform, voir la classe Transform. Pour plus d'informations sur les propriétés de l'objet Matrix3D, voir la classe Matrix3D.

Déplacement d'un objet dans l'espace 3D

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

Vou puez déplacer un objet dans l'espace 3D en modifiant la valeur de ses propriétés x, y ou z. Lorsque vous modifiez la valeur de sa propriété z, lobjet semble se rapprocher ou s'éloigner de l'observateur.

Le code suivant modifie la valeur de la propriété z de deux ellipses en réponse à un événement pour leur imprimer un mouvement de va-et-vient le long de leur axe z. ellipse2 se déplace plus rapidement qu'ellipse1: sa propriété z est incrémentede'un multiple de 20 sur chaque événement Frame, alors que la propriété z d'ellipse1 est incrémentede'un multiple de 10 :

var depth:int = 1000 function ellipse1FrameHandler(e:Event):void { ellipse1Back = setDepth(e,ellipse1Back); e.currentTarget.z + = ellipse1Back * 10;
} function ellipse2FrameHandler(e:Event):void { ellipse2Back = setDepth(e,ellipse1Back); e.currentTarget.z + = ellipse1Back * 20;
} function setDepth(e:Event,d:int):int { if(e.currentTarget.z > depth) { e.currentTarget.z = depth; d=-1; } else if (e.currentTarget.z<0) { e.currentTarget.z = 0 . d = 1 · 1

Rotation d'un objet dans l'espace 3D

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

Vou puez faire pivoter un objet de trois façons différentes, selon la définition de sa propriété de rotation : rotationX, rotationY et rotationZ.

La figure ci-dessous illustre deux carres qui ne sont pas soumis à une rotation :

ADOBE ACTIONSCRIPT 3.0 - Rotation d'un objet dans l'espace 3D - 1

Dans la figure suivante, la propriété rotationY du conteneur des carres a ete incrementee pour les faire pivoter sur l'axe y. La rotation du conteneur, ou objet d'affichage parent, des deux carrés fait pivoter leurs ci:

Dans la figure suivante, la propriété rotationX du contueur des carres est modifiée : Elle fait pivoter ceux-ci sur l'axe x.

ADOBE ACTIONSCRIPT 3.0 - Rotation d'un objet dans l'espace 3D - 2

Dans la figure suivante, la propriété rotationz du conteneur des carres a ete incrementee et ceux-ci pivotent sur l'axe z.

ADOBE ACTIONSCRIPT 3.0 - Rotation d'un objet dans l'espace 3D - 3

Un objet d'affichage peut se déplacer et pivoter simultanément dans l'espace 3D.

Projection d'objects 3D sur un affichage 2D

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

La classe PerspectiveProjection du package flashgeom facilité l'application d'une perspective rudimentaire lors du déplacement d'objets d'affichage dans l'espace 3D.

Si vous ne creez pas explicitement une projection de perspective pour votre espace 3D, le moteur 3D utilise un objet PerspectiveProjection par défaut, qui existe sur la racine et est propagated à tous ses enfants.

Les trois propriétés qui définissent le mode d'affichage de l'espace 3D par un object PerspectiveProjection sont les suivantes :

La modification de la valeur de fieldOfView entraine automatiquement la modification de la valeur de focalLength, et inversement, car ces propriétés sont interdépendantes.

La formule permettant de calculator focaLength en fonction de la valeur de fieldOfView est la suivante :

focallength = stageWidth/2 (cos.fieldOfView/2)/sin.fieldOfView/2)

En règle générale, vous modifiez explicément la propriété fieldOfView.

Champ de vision

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

En manipulant la propriété fieldofView de la classe PerspectiveProjection, vous pouze faire en sorte qu'un objet d'affichage 3D semble s'agrandir ou diminuier selon qu'il se rapproche ou s'éloigne de l'observateur, respectivement.

La propriété fieldOfView définit un angle compris entre 0 et 180 degrés qui détermine la puissance de la projection de perspective. Plus la valeur est élevée, plus forté est la distorsion appliquée à un objet d'affichage qui se déplace sur son axe z. Une valeur fieldOfView basse entraine une mise à l'échelle minimale et les objets nesemblant recycler que très légèrement. Une valeur élevéeentraine une plus grande distorsion et une impression plus prononcée de mouvement. La valeur maximale, 179,9999... degrés, produit un effet d'objet où de-poisson extrème. La valeur maximale de fieldOfView est 179,9999..., tandis que 0,00001... est sa valeur minimale. Les valeurs exactes de 0 et 180 sont illégales.

Centre de la projection

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

La propriété projectionCenterreprésenté le point de fuite de la projection de perspective. Elle est appliquée comme décalage du point d'alignement par défaut (0,0) dans l'angle supérieur gauche de la scène.

A mesure qu'il semble s'éloigner de l'observateur, un objet s'incline vers le point de fuite et finit par disparaitre. Imaginez un couloir extrément long. Lorsque vous regardez dans le couloir, les bords des murs convergent vers un point de fuite tout au fond.

Si le point de fuite se trouve au centre de la scène, le couloir disparaît vers un point central. La valeur par défaut de la propriété projectionCenter correspond au centre de la scène. Si, par exemple, vous souhaitez que des éléments apparaissent sur la gauche de la scène et une zone 3D sur la droite de la scène, définisse la propriété

projectionCenter sur un point situé dans la partie droite de la scène pour en faire le point de fuite de votre zone d'affichage 3D.

Distance focale

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

La propriété focaILength representation la distance separating l'origine du point de vue (0,0,0) de l'emplacement de I'bject d'affichage sur son axe z.

Une distance facale elevée est similaire à un téléobjectif: le champ de vision est etroit et les distances entre les objets compressées. Une distance facale courte s'assimile à un objectif à grand angle et se caractérisse par un champ de vision large et une distorsion prononcée. Une distance facale moyenne correspond approximativement à ce que voit l'eel humain.

En règle générale, la propriété focaILength est recalculée dynamiquement pendant la transformation de perspective au fur et à mesure du déplacement de l'objet d'affichage, mais il est possible de la définiir explicitement.

Valeurs par défaut de la projection de perspective

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

L'objet PerspectiveProjection par défaut créé sur la racine possède les valeurs suivantes :

  • fieldOfView : 55
  • perspectiveCenter : stagewidth/2, stageHeight/2
  • focialLength : stageWidth/ 2 * ( cos.fieldOfView/2) / sin.fieldOfView/2 )

Ces valeurs sont appliquées si vous ne créez pas votre propre object PerspectiveProjection.

Vous pouvez instancier votre propre objet PerspectiveProjection dans l'intention de modifier vous-même les propriétés projectionCenter et fieldOfView. Dans ce cas, les valeurs par défaut du nouvel objet sont les suivantes, en supposant que la scène mesure 500 sur 500 par défaut :

  • fieldOfView : 55
  • perspectiveCenter : 250,250
    -身高:180.25m -focalLength : 480.24554443359375

Example : Projection de perspective

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

L'exemple suivant illustrer l'utilisation de la projection de perspective pour creer l'espace 3D. Il indique comment modifier le point de fuite et la projection de perspective de l'espace par le biais de la propriété projectionCenter. Cette modification force un nouveau calcul des propriétés focalLength et fieldOfView, résultat en une distorsion de l'espace 3D.

Cet exemple :

1 create un sprite appelé center, un cercle avec une mire;
2 affecte les coordonnées du sprite center à la propriété projectionCenter de la propriété perspectiveProjection de la propriété transform de la racine;
3 ajoute des écouteurs de l'évenement souris qui appelent des gestionnaires qui modifiert la propriété projectionCenter afin qu'elle suive l'emplacement de l'objet center ;
4 crée quatre boites en accordéon qui forment les murs de l'espace en perspective.

Lorsque vous testez cet exemple, ProjectionDragger.swf, faites glisser le cercle à différents emplacements. Le point de fuite suit le cercle et figure la où vous le déposez. Observe comme les boîtes qui déliment l'espace s'étirent et se distordent plus vous éloignez le centre de projection du centre de la scène.

Pour obtenir les fischiers d'application de cet exemple, voir www.adobe.com/go/learn_programmingAS3samplesflash_fr. Les fischiers d'application ProjectionDragger résident dans le dossier Samples/ProjectionDragger.

package
{ import flash.display.Sprite; import flash.display.Shape; import flashGeom.Point; import flash.events.*; public class ProjectionDragger extends Sprite { private var center : Sprite; private var boxPanel:Shape; private var inDrag:Boolean = false; public function ProjectionDragger():void { createBoxes(); createCenter(); } public function createCenter():void { var centerRadius:int = 20 . center = new Sprite(); // circle center.graphics.lineStyle(1, 0x000099); center.graphics.beginFill(0xCCccc, 0.5); center.graphics.drawCircle(0, 0, centerRadius); center.graphics.endFill(); // cross hairs center.graphics.moveTo(0, centerRadius); center.graphics.lineTo(0, -centerRadius); center.graphics.moveTo(centerRadius, 0); center.graphics.lineTo(-centerRadius, 0); center.x = 175; center.y = 175; center.z = 0; this.addChild(center); center.addEventListener(MouseEvent.MOUSE_DOWN, startDragProjectionCenter); center.addEventListener(MouseEvent.MOUSE_UP, stopDragProjectionCenter); center.addEventListener(MouseEvent.MOUSE_MOVE, doDragProjectionCenter); root.transform.perspectiveProjection.projectionCenter = new Point(center.x, center.y); } public function createBoxes():void { // createBoxPanel(); var boxWidth:int = 50 ; var boxHeight:int = 50 ; var numLayers:int = 12 ; var depthPerLayer:int = 50 ; // var boxVec:Vector. = new Vector.(numLayers); for (var i:int = 0 ; i < numLayers; i++) { this.addChild.createBox(150, 50, (numLayers - i) * depthPerLayer, boxWidth, boxHeight, 0xCCcccFF));

this.addChild.createBox(50, 150, (numLayers - i) * depthPerLayer, boxWidth, boxHeight, 0xFFCCC); this.addChild.createBox(250, 150, (numLayers - i) * depthPerLayer, boxWidth, boxHeight, 0xCCFFCC); this.addChild.createBox(150, 250, (numLayers - i) * depthPerLayer, boxWidth, boxHeight, 0xDDDDDD); } public function createBox(xPos:int = 0, yPos:int = 0, zPos:int = 100, w:int = 50, h:int = 50, color:int = 0xDDDD):Shape { var box:Shape = new Shape(); box.graphics.lineStyle(2, 0x66666); box.graphics.beginFill(color, 1.0); box.graphics.drawRect(0, 0, w, h); box.graphics.endFill(); box.x = xPos; box.y = yPos; box.z = zPos; return box; } public function startDragProjectionCenter(e:Event) { center.startDrag(); inDrag = true; } public function doDragProjectionCenter(e:Event) { if (inDrag) { root.transform.perspectiveProjection.projectionCenter = new Point(center.x, center.y); } } public function stopDragProjectionCenter(e:Event) { center.stopDrag(); root.transform.perspectiveProjection.projectionCenter = new Point(center.x, center.y); inDrag = false; } } 

Pour des projections de perspective plus complexes, utilisez la classe Matrix3D.

Transformations 3D complexes

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

La classe Matrix3D vous permet de transformer des points 3D dans un espace de coordonnées ou de mapper des points 3D d'un espace de coordonnées sur un autre.

Il n'est pas nécessaire de comprendre les mathématiques matricielles pour pouvoir utiliser la classe Matrix3D. Ses méthodes permettent de générer la plupart des opérations de transformation courantes. Il est inutil de vous soucie de la définition explicite ou du calcul de la valeur de chaque élément de la matrice.

Une fois la propriété z d'un objet d'affichage définie sur une valeur numérique, vous pouvez récapérer la matrice de transformation de l'objet par le biais de la propriété Matrix3D de l'objet Transform de l'objet d'affichage :

var leafMatrix:Matrix3D = this.transform.matrix3D;

Les méthodes de l'objet Matrix3D vous permettent d'opérer une translation sur un objet d'affichage, de le faire pivoter et de lemettre à l'échelle, ainsi que de lui appliquer une projection de perspective.

Utilisez la classe Vector3D et ses propriétés x, y et z pour gérer les points 3D. Elle peut également représenter en physique un vecteur spatial, doté d'une direction et d'une magnitude. Les méthodes de la classe Vector3D vous permettent d'effectuer des calculs courants portant sur des vecteurs spatiaux : somme, produit scalaire et produit vectoriel, par exemple.

Remarque : la classe Vector3D n'a aucun rapport avec la classe Vector d'ActionScript. La classe Vector3D contient des propriétés et des méthodes permettant de définir et de manipuler les points 3D, alors que la classe Vector prend en charge les tableaux d'objets typés.

Creation d'objects Matrix3D

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

Vou puevez creer ou recupérer des objets Matrix3D de trois façon principales :

  • Utilisez la méthode constructeur Matrix3D() pour instancier une nouvelle matrice. Le constructeur Matrix3D() gère un objet Vector contenant 16 valeurs numériques et place chacune d'elles dans une cellule de la matrice.

Exampie :

  • Définissez la valeur de la propriété z d'un objet d'affichage. Récupérez ensuite la matrice de transformation de la propriété transform.matrix3D de cet objet.
  • Récupérez l'objet Matrix3D qui réguit l'affichage des objets 3D sur la scène en appelant la méthode perspectiveProjection.toMatrix3D() sur l'objet d'affichage racine.

Application de plusieurs transformations 3D

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

Vouss pouvez appliquer simultanement de nombreuses transformations 3D à l'aide d'un objet Matrix3D. Ainsi, pour faire pivoter,mettre à l'échelle,puis déplacer un cube,vous pourriez appliquer trois transformations distinctes à chacun de ses points. Il est cependant beaucoup plus efficace de précalculer plusieurs transformations dans un même objet Matrix3D et d'appliquer une transformation matricielle unique à chacun des points.

Remarque : l'ordre d'application des transformations matricielles est important. Les calculs matriciels ne sont pas réversibles. Ainsi, l'application d'une rotation puis d'une translation ne donne pas le même résultat que l'opération inverse.

L'exemple suivant illustrde deux façon d'appliquer plusieurs transformations 3D.

package { import flash.display.Sprite; import flash.display.Shape; import flash.display.Graphics; import flashgeom.*;
public class Matrix3DTransformsExample extends Sprite { private var rect1:Shape; private var rect2:Shape;
public function Matrix3DTransformsExample():void { var pp:PerspectiveProjection = this.transform.perspectiveProjection; pp.projectionCenter new Point(275,200); this.transform.perspectiveProjection pp; rect1 new Shape(); rect1.x -70; rect1.y -40; rect1.z 0; rect1.graphics.beginFill(0xFF8800); rect1.graphics.drawRect(0,0,50,80); rect1.graphics.endFill(); addChild(rect1); rect2 new Shape(); rect2.x 20; rect2.y -40; rect2.z 0; rect2.graphics.beginFill(0xFF0088); rect2.graphics.drawRect(0,0,50,80); rect2.graphics.endFill(); addChild(rect2);

doTransforms();
}
private function doTransforms():void { rect1rotationX = 15 . rect1 scaleX = 1.2 . rect1.x + = 100 . rect1.y + = 50 . rect1rotationZ = 10 var matrix:Matrix3D = rect2.transform.matrix3D; matrix.appendRotation(15, Vector3D.X_AXIS); matrix.appendScale(1.2,1,1); matrix.appendTranslation(100,50,0); matrix.appendRotation(10,Vector3D.Z_AXIS); rect2.transform.matrix3D = matrix; }

Dans la méthode doTransforms(), le premier bloc de code utilise les propriétés DisplayObject pour modifier la rotation, la mise à l'échelle et la position d'un rectangle. Le second bloc utilise les méthodes de la classe Matrix3D pour effectuer des transformations identiques.

L'utilisation des méthodes Matrix3D présente un avantage principal : tous les calculs sont déjà effectuels dans la matrice. Ils sont ensuite appliqués une seule fois à l'objet d'affichage, lors de la définition de sa propriété transform.matrix3D. La définition des propriétés DisplayObject améliore quelque peu la lisibilité du code source. Cependant, chaque définition d'une propriété de rotation ou de mise à l'échelle donne lieu à plusieurs calculs et entraîne la modification de plusieurs propriétés de l'objet d'affichage.

Si votre code applique plusieurs fois des transformations complexes identiques à des objets d'affichage, enregistrez l'objet Matrix3D en tant que variable, puis réappliqué-le autant de fois que nécessaire.

Réorganisation de l'affichage à l'aide d'objects Matrix3D

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

Comme indiqué plus haut, l'ordre d'apparition des objets d'affichage dans la liste d'affichage déterminé l'ordre d'apparition à l'affichage, quels que soient leurs axes z relatifs. Si votre animation transforme les propriétés d'objets d'affichage dans un ordre différent de celui de la liste d'affichage, l'ordre d'apparition des objets d'affichage ne correspondra peut-être pas à celui des axes z. Un objet qui devrait sembler plus éloigné de l'observateur risque donc d'apparaître devant un objet plus proche.

Pour avoir la certitude que l'ordre d'apparition des objets d'affichage 3D correspond à leur profondeur relative, procédez comme suit :

1 A l'aide de la méthode getRelativeMatrix3D() de l'objet Transform, extrayez la profondeur relative (z-axes) des objets d'affichage 3D enfant.
2 Supprimez les objets de la liste d'affichage à l'aide de la méthode removeChild().
3 Triez les objets d'affichage en fonction de leurs valeurs d'axe z relatives.
4 Ajoutez a nouveau les enfants à la liste d'affichage en ordre inverse, par le biais de la méthode addChild().

Cette réorganisation garantit que vos objets s'affichent conformément à leurs axes z relatifs.

Le code suivant garantit l'affichage correct d'une boite 3D à six faces. Il réorganise les faces de la boite une fois que des rotations lui ont été appliquées.

public var faces:Array; . . .
public function ReorderChildren() { for(var ind:uint = 0 ;ind < 6 ;ind++) faces[ind].z faces[ind].child.transform.getRelativeMatrix3D(root).position.z; this.removeChild(faces[ind].child); } faces.sortOn("z",Array.NUMERIC|Array.DESCENDING); for (ind = 0 ;ind < 6 ;ind++) { this.addChild(faces[ind].child); }

Pour obtenir les fichiers d'application de cet exemple, voir

www.adobe.com/go/learn_programmingAS3samples.flash_fr. Les fichiers d'application résident dans le dossier Samples/ReorderByZ.

Création d'effets 3D à l'aide de triangles

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

Dans ActionScript, vous effectuez des transformations de bitmap à l'aide de la méthode

Graphics.drawTriangles(), car les modèles 3D sont représentés par un ensemble de triangles dans l'espace. (Flash Player et AIR ne prennet néanmoins pas en charge une mémoire tampon de profondeur, car les objets d'affichage sont toujours essentiellement plats, ou 2D. Pour plus d'informations, voir « Présentation des objets d'affichage 3D dans les moteurs d'exécution de Flash Player et d'AIR » à la page 363.) La méthode Graphics.drawTriangles() est similaire à la méthode Graphics.drawPath(), en ce qu'elle accepte un ensemble de coordonnées pour tracer un tracé triangulaire.

Pour vous familiariser avec l'utilisation de Graphics.drawPath(), voir « Traces de dessin » à la page 244.

La méthode Graphics.drawTriangles() utilise une propriété Vector. pour spécifique l'emplacement des points sur le trace triangulaire:

drawTriangles Vertices:Vector. Number> indices:Vector. int null, uvtData:Vector. Number> = null, culling:String = "none"):void

Le premier paramètre de drawTriangles(), vertices, est le seul paramètre obligatoire. C'est un vecteur de nombres définissant les coordonnées par lesquilles vos triangles sont tracés. Trois ensembles de coordonnées (six nombres) représentent un trace triangulaire. Sans le paramètre indices, la longueur du vecteur doit systématiquement être un facteur de six, car chaque triangle nécessite trois paires de coordonnées (trois ensembles de deux valeurs x/y).

Exemple :

graphics.beginFill(0xFF8000);  
graphics.drawTriangles(  
Vector.<Number>([10,10, 100,10, 10,100,110,10, 110,100,20,100])); 

Ces triangles n'ont pas de points en commun, mais si tel était le cas, le second paramètre de drawTriangles(), indices, permettrait de réutiliser des valeurs du vecteur vertices pour plusieurs triangles.

Lorsque vous utilisez le parametre indices, gardez à l'esprit le fait que les valeurs indices représentent des index de point, pas des index en rapport direct avec les éléments du tableau vertices. En d'autres termes, un index du vecteur vertices tel qu'il est défini par indices correspond en fait à l'index réel divisé par 2. Pour le troisième point d'un vecteur vertices, par exemple, utilisez une valeur indices de 2, même si la première valeur numérique de ce point commence à l'index vectoriel 4.

Par exemple, fusionnez deux triangles de sorte qu'ils aient en commun le bord diagonal, par le biais du paramètre indices :

graphics.beginFill(0xFF8000);   
graphics.drawTriangles( Vector.<Number>([10,10,100,10,10,100,100,100]), Vector.<int>([0,1,2,1,3,2]));

Vous remarquerez que, bien qu'un carré résultat du tracé de deux triangles, seuls quatre points ont été spécifiés dans le vecteur vertices. Grâce à indices, les deux points partagés par les deux triangles sont réutilisés pour chacun d'eux. Le nombre total de sommets passé donc de 6 (12 nombres) à 4 (8 nombres).

ADOBE ACTIONSCRIPT 3.0 - Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures - 1
Carre trace à l'aide de deux triangles à l'aide du paramètre vertices

Cette technique s'avè utile pour les maillages triangulaires plus grands, dans lesquels la plupart des points sont partagés par plusieurs triangles.

Il est possible d'appliquer tous les replissages aux triangles. Ils sont appliqués au maillage triangulaire résultat comme ils le seraient à toute autre forme.

Transformation d/images bitmap

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

Les transformations de bitmap donnent une illusion de perspective ou « texture » à un objet en trois dimensions. Vous pouvez notamment distordre une bitmap en direction d'un point de fuite, afin que l'image semble diminuer à mesure qu'elle se rapproche de celui-ci. Vous pouvez aussi utiliser une bitmap en deux dimensions pour creer une surface sur un objet en trois dimensions, donnant ainsi l'impression qu'il possède une texture ou « enveloppe ».

ADOBE ACTIONSCRIPT 3.0 - Transformation d/images bitmap - 1
Surface en deux dimensions utilisant un point de fuite et objet en trois dimensions enveloppè dans une bitmap

Mappage des coordonnées UV

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

Lorsque vous commenceriez à manipuler les textures, vous souhaitez utiliser le paramètre uvtData de drawTriangles(). Ce paramètre vous permet de définir le mappage des coordonnées UV pour les replissages de bitmap.

Le mappage des coordonnées UV est une méthode d'application d'une texture à des objets. Il repose sur deux valeurs, une valeur U horizontale (x) et une valeur V verticale (y). Ces valeurs sont basées sur des pourcentages et non sur des valeurs de pixels. 0 U et 0 V correspondent au coin supérieur gauche d'une image, 1 U et 1 V à son coin inférieur droit :

ADOBE ACTIONSCRIPT 3.0 - Mappage des coordonnées UV - 1
Emplacements UV 0 et 1 sur une image bitmap

Il est possible d'affector des coordonnées UV aux vecteurs d'un triangle de sorte qu'ils s'associent aux emplacements respectifs sur une image :

ADOBE ACTIONSCRIPT 3.0 - Mappage des coordonnées UV - 2
Coordonnées UV d'une zone triangulaire sur une image bitmap

Les valeurs UV restent en phase avec les points du triangle.

ADOBE ACTIONSCRIPT 3.0 - Mappage des coordonnées UV - 3

Les sommets du triangle se déplacent et l'image bitmap se distord pour que les valeurs UV d'un point individuel restent identiques.

Au fur et à mesure que des transformations 3D ActionScript sont appliquées au triangle associé à la bitmap, celle-ci est appliquée au triangle en fonction des valeurs UV. Par conséquent, au lieu d'utiliser des calculs matriciels, définissez ou réglez les valeurs UV pour créé un effet tridimensionnel.

La méthode Graphics.drawTriangles() accepts également une information facultative pour les transformations tridimensionnelles : la valeur T. La valeur T de uvtData représenté la perspective 3D ou, plus spécifique, le facteur d'échelle du sommet associé. Le mappage des coordonnées UVT ajoute une correction de perspective au mappage des coordonnées UV. Par exemple, si un objet de l'espace 3D est éloigné du point de vue de telle sorte qu'il semble mesurer 50% de sa taille « d'origine», sa valeur T correspond à 0,5. comme les objets de l'espace 3D sont représentés à l'aide de triangles, l'emplacement de ceux-ci le long de l'axe z détermine leur valeur T. L'équation qui représenté la valeur T est la suivante :

Dans cette équation, focaLength représentée une distance fiscale ou un emplacement à l'« écran » calculé qui détermine la quantité de perspective de l'affichage.

ADOBE ACTIONSCRIPT 3.0 - Mappage des coordonnées UV - 4

Distance facale et valeur z

A. point de vue B. écran C. objet 3D D. valeur focalLength E. valeur z

La valeur T permet demettre à l'échelle des formes simples pour donner l'impression qu'elles se trouvent au loin. C'est généralement la valeur utilisée pour convertir les points 3D en points 2D. Dans le cas des données UVT, elle permet aussi de mettre à l'échelle une bitmap entre les points d'un triangle avec perspective.

Lorsque vous définisse des valeurs UVT, la valeur T suit directement les valeurs UV définies pour un sommet. Avec l'inclusion de T, chaque trio de valeurs du paramètre uvtData (U, V et T) correspond à chaque paire de valeurs du paramètre vertices (x et y). Avec les valeurs UV seules, uvtData.length == vertices.length. Avec l'inclusion d'une valeur T, uvtData.length = 1,5*vertices.length.

L'exemple suivant illustrer un plan qui pivote, par le biais de données UVT, dans un espace 3D. Il utilise l'image ocean.jpg et une classe « d'interaction», ImageLoader, qui charge l'image afin qu'il soit possible de l'affector à l'objet BitmapData.

La source de la classe ImageLoader (enregistrez ce code dans le fichier ImageLoader.as) se présente comme suit :

package { import flash.display. import flash.events.; import flash.net(URLRequest; public class ImageLoader extends Sprite { public var url:String; public var bitmap:Bitmap; public function ImageLoader(loc:String = null){ if (loc ! = null){ url = loc; loadImage(); } } public function loadImage():void{ if (url ! = null){ var loader:Loader = new Loader(); loader(contentLoaderInfo.addEventListener(Event.COMPLET, onComplete); loader(contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, onIoError); var req:URLRequest = new URLRequest(url); loader.load(req); } } private function onComplete(event:Object):void { var loader:Loader = Loader(event.targetloader); var info:LoaderInfo = LoaderInfoloader(contentLoaderInfo); this.bitmap = info.content as Bitmap; this DISPatchEvent(new Event(Event.COMPLET)); } private function onIoError(event:IOErrorEvent):void { trace("onIoError: " + event); } } }

Le code ActionScript qui utilise des triangles, le mappage des coordonnées UV et des valeurs T pour que l'image semble pivoter et diminuier au fur et à mesure qu'elle se rapproche d'un point de fuite est indiqué ci-dessous.

Enregistrez-le dans un fichier que vous nommerez Spinning3dOcean.as :

package { import flash.display. import flash.events.; import flash.utils.getTimer;
public class Spinning3dOcean extends Sprite { // plane vertex coordinates (and t values) var x1:Number = -100,y1:Number = -100,z1:Number = 0 ,t1:Number = 0 var x2:Number = 100,y2:Number = -100,z2:Number = 0 ,t2:Number = 0 var x3:Number = 100,y3:Number = 100,z3:Number = 0 ,t3:Number = 0 var x4:Number = -100,y4:Number = 100,z4:Number = 0 ,t4:Number = 0 var focalLength:Number = 200 // 2 triangles for 1 plane, indices will always be the same var indices:Vector.; var container:Sprite; var bitmapData:BitmapData; // texture var imageLoader:ImageLoader; public function Spinning3dOcean():void { indices new Vector.(); indices.push(0,1,3,1,2,3); container new Sprite(); // container to draw triangles in container.x = 200 . container.y = 200 . addChild/container); imageLoader new ImageLoader("ocean.jpg"); imageLoader.addEventListener(Event.COMPLET, onImageLoaded); } function onImageLoaded(event:Event):void { bitmapData imageLoader.bitmap.bitmapData; // animate every frame addEventListener(Event.ENTER_FRAME, rotatePlane); } function rotatePlane(event:Object):void { // rotate vertices over time var ticker getTimer(/400; z2 = z3 = -(z1 = z4 = 100*Math.sin(ticker)); x2 = x3 = -(x1 = x4 = 100*Math.cos(ticker)); // calculate t values

t1 = focalLength/(focalLength + z1);  
t2 = focalLength/(focalLength + z2);  
t3 = focalLength/(focalLength + z3);  
t4 = focalLength/(focalLength + z4);  
// determine triangle vertices based on t values  
var vertices:Vector.<Number> = new Vector.<Number>();  
vertices.push(x1*t1,y1*t1, x2*t2,y2*t2, x3*t3,y3*t3, x4*t4,y4*t4);  
// set T values allowing perspective to change  
// as each vertex moves around in z space  
var uvtData:Vector.<Number> = new Vector.<Number>();  
uvtData.push(0,0,t1, 1,0,t2, 1,1,t3, 0,1,t4);  
// draw  
container.graphics.clear();  
container.graphics.beginBitmapFill(bitmapData);  
container.graphics.drawTriangles(vertices, indices, uvtData);  
} 

Pour tester cet exemple, enregistrez ces deux fischiers de classe dans le même repertoire qu'une image nommée « ocean.jpg ». Vous pouvez constater la transformation appliquée à la bitmap d'origine pour qu'elle semble disparaitre au loin et pivoter dans l'espace 3D.

Culling

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

Le culling est un processus qui détermine quelles surfaces d'un objet en trois dimensions ne doivent pas être rendues par le moteur de rendu car elles ne sont pas visibles à partir du point de vue actuel. Dans l'espace 3D, la surface « arrêté » d'un objet en trois dimensions n'est pas visible à partir du point de vue.

ADOBE ACTIONSCRIPT 3.0 - Culling - 1

L'arrête d'un objet 3D n'est pas visible à partir du point de vue.

A. point de vue B. objet 3D C. arrêté d'un objet en trois dimensions

Par essence, tous les triangles sont systématiquement rendus, quelles que soient leur taille, forme et position. Le culling (élimination) garantit que Flash Player ou AIR rend votre objet 3D correctement. En outre, pour éviter les cycles de rendu superflus, il est parfois souhaitable que le moteur de rendu omette certains triangles. Soit un cube en rotation dans l'espace. A tout moment donné, vous ne voyez jamais plus de trois de ses faces car celles qui ne sont pas visibles font face à l'autre direction, de l'autre côté du cube. comme ces faces ne sont pas visibles, il est inutile que le moteur de rendu les trace. Sans élimination (culling), Flash Player ou AIR rend les faces avant et arrêtè.

ADOBE ACTIONSCRIPT 3.0 - Culling - 2

Certaines faces d'un cube ne sont pas visibles à partir du point de vue actuel.

C'est pourquoi la méthode Graphics.drawTriangles() gère un quatrième paramètre qui permet de définir une valeur de culling :

public function drawTriangles Vertices:Vector. , indices:Vector. = null, uvtData:Vector. = null, culling:String = "none"):void

Le paramètre culling correspond à une valeur de la classe d'énumération TriangleCulling:

TriangleCulling.NONE, TriangleCulling.PROFITIVE et TriangleCulling.NEGATIVE. Ces valeurs sont fonction de la direction du tracé triangulaire définitissant la surface de l'objet. L'API ActionScript qui permet de déterminer le culling considère comme acquis que tous les triangles orientés vers l'extérieur d'une forme 3D sont tracés dans le même sens. Le returnement d'une face de triangle entraîne un changement de direction du tracé. A ce point, il est possible de supprimer le triangle du rendu.

Si la valeur de TriangleCulling est définie sur POSITIVE, les triangles dont le trace a une direction positive (sens horaire) sont supprimés. Si la valeur de TriangleCulling est définie sur NEGATIVE, les triangles dont le trace a une direction négative (sens antihoraire) sont supprimés. Dans le cas d'un cube, les surfaces orientées vers l'avant ont un trace à la direction positive et les surfaces orientées vers l'arrière, un trace à la direction négative.

ADOBE ACTIONSCRIPT 3.0 - Culling - 3

ADOBE ACTIONSCRIPT 3.0 - Culling - 4

Cube « déroule » illustrant le sens du tracé. Lorsque le cube est « enroule », le sens du tracé de la face arrêté est inversé.

Pour comprendre le fonctionnement du processus d'élimination (culling), reprenez l'exemple de la section « Mappage des coordonnées UV » à la page 377 et définissez le paramètre de culling de la méthode drawTriangles() sur TriangleCulling.NEGATIVE :

Vou puez constater que la face « arrriere » de l'image n'est pas rendue lorsque l'objet pivote.

Chapitre 20 : Principes de base de l'utilisation du texte

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Pour afficher du texte à l'écran dans Adobe® Flash® Player ou Adobe® AIR™, utilisez une occurrence de la classe TextField ou les classes Text Engine de Flash. Ces classes vous permettent de créé, d'afficher et demettre en forme du texte. Vous pouvez également utiliser Text Layout Framework (TLF). Il s'agit d'une bibliothèque de composants basée sur les classes Flash Text Engine, mais conçue de manière à offrir une utilisation conviviale. Sur les péripériques mobiles, vous pouvez utiliser la classe StageText pour saisir du texte.

Vou puez etabir le contenu specifique de champs de texte ou désigner la source du texte, puis en définir l'aspect.
Vou puez également repondre aux événements utilisateur (saisie de texte ou clic sur un lien hypertexte).

Les classesTextField et Flash Text Engine vous permettent d'afficher et de gérer le texte dans Flash Player et AIR. Vous disposez de la classeTextField pour creer des objets texte à des fins d'affichage et d'entrée. La classeTextField sert de base à d'autres composants texte tels que textarea et Input. La classe Formatting permet de définir la mise en forme de caractère et paragraphe des objetsTextField et vous pouvez appliquer des feuilles de style en cascade (CSS) à l'aide de la propriétéTextField.styleSheet et de la classe StyleSheet. Vous pouvez affecter directement à un champ de texte un texte au format HTML, qui peutContainir des medias intégrés (clips, fichiers SWF, fichiers GIF, fichiers PNG et fichiers JPEG).

Flash Text Engine (FTE), disponible à partir de Flash Player 10 et Adobe AIR 1.5, propose une prise en charge de bas niveau pour un contrôle sophistiqué des mesures de texte, de la mise en forme et du texte bidirectionnel. Il se caractérisse également par un flux de texte optimisé et une prise en charge des langues enrichie. Bien que vous puissiez utiliser Flash Text Engine pour créé et:gérer des éléments texte, il est essentiellement destiné à générer des composants de manipulation du texte et nécessite des compétences accrues en matière de programmation. Text Layout Framework, qui comprend un composant de manipulation du texte basé sur Flash Text Engine, facile l'utilisation des fonctions avances du nouveau moteur texte. TLF est une bibliothèque extensible reposant entièrement sur ActionScript 3.0. Vous pouvez utiliser le composant TLF existant ou utiliser la structure pour creator votre propre composant de texte.

La classe StageText, disponible à partir d'AIR 3, fournit un champ de saisie de texte natif. Etant donné que ce champ est mis à disposition par le système d'exploitation du périhérique, il fournit l'expérience avec laquelle les utilisateurs d'un périhérique sont le plus familiarisés. Une occurrence de StageText n'est pas un objet d'affichage. Plutôt que de l'ajouter à la liste d'affichage, affectez une scène à une occurrencé, ainsi qu'une zone d'affichage sur cette scène appelée fenêtre d'affichage. L'occurrence de StageText s'affiche face à tous les objets d'affichage.

Pour plus d'informations, voir :

  • « Utilisation de la classeTextField » à la page 385
  • « Utilisation de Flash Text Engine » à la page 410
  • « Utilisation de Text Layout Framework » à la page 440
  • Native text input with StageText (disponible en anglais uniquement)

Concepts important et terminologie

La liste de référence suivante contient des termes importants relatifs à la manipulation du texte :

Feuilles de style en cascade Syntaxe standardisé permettant de définir les styles et la mise en forme du texte structure en XML et en HTML.

Police de péripérisque Police installée sur l'ordinateur de l'utilisateur.

Champ de texte dynamique Champ de texte dont le contenu peut etre modifie en ActionScript, mais pas par l'utilisateur.

Police incorporee Police de caractères dont les données, sous forme vectorielle, sont enregistrées dans le fichier SWF de l'application.

Texte HTML Texte inséré dans un champ de texte en ActionScript qui, outre le contenu à proprement parler, compte des balises HTML de mise en forme.

Champ de saisie de texte Champ de texte dont le contenu peut etre modifie soit en ActionScript, soit par l'utilisateur.

Crenage Reglage de l'espace entre les paires de caractères de sorte à uniformiser l'espacement des mots et à améliorer la lisibilité du texte.

Champ de texte statique Champ de texte créé dans l'environnement de création, dont le contenu ne peut pas etre modifiependant l'execution du fichier SWF.

Métrique des lignes de texte Mesure de la taille des diverses parties du texte figurant dans un champ de texte : ligne de base du texte, hauteur du sommet des caractères, taille des jambages (partie de certaines minuscules qui s'étend sous la ligne de base), etc.

Interlettrage Réglage de l'espacement entre des groupes de lettres ou des blocs de texte en vue d'augmenter ou de réduire la densité pour améliorer la lisibilité du texte.

Chapitre 21 : Utilisation de la classe TextField

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Vouss pouvez utiliser une occurrence de la classe TextField pour afficher du texte ou creer un champ de saisie de texte à l'écran dans Adobe® Flash® Player ou Adobe® AIR™. La classe TextField sert de base à d'autres composants de textels que TextArea ou TextInput.

Le contenu des champs de texte peut être spécifique à l'avance dans le filchier SWF, charge à partir d'un filchier texte ou d'une base de données, ou saisi par l'utilisateur dans votre application. Au sein du champ lui-même, le texte peut être du contenu HTML, avec des images incorporees. Àpres avoir créé une occurrence de champ de texte, vous pouvez utiliser les classes flash.text, telles que TextFormat et StyleSheet, pour contrôler l'aspect du texte. Le package flash.text contient la quasi-totalité des classes relatives à la création, à la gestion et au formatage de texte dans ActionScript.

Pourmettre en forme du texte,il est necessaire de creer un objet TextFormat et de I'affector au champ de texte.Si le champ de texte contient du texte en HTML,vous pouze lui appliquer un objet StyleSheet pour affeter des styles a des éléments spécifiques du texte.L'objet TextFormat ou StyleSheet contient des propriétés qui definissent I'aspect du texte,par exemple sa couleur,sa taille et saGRAisse.L'objet TextFormat attribue des propriétés à l'ensemble du contenu d'un champ de texte,ou a une partie du texte seulement.Par exemple,au sein du même champ de texte,une phrase peut'être en gras et en rouge,puis la suivante en italique et en bleu.

Outre les classes du package flash.text, la classe flash.events.TextEvent permet de répondre aux actions de l'utilisateur liées au texte.

Voir aussi

« Attribution de formats texte » à la page 393
« Affichage du texte HTML » à la page 387
« Application de feuilles de style en cascade » à la page 394

Affichage du texte

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Bien que les outils de programmation tels qu'Adobe Flash Builder et Flash Professional offrent plusieurs options d'affichage du texte (composants liés au texte ou outils texte), la méthode d'affichage de texte par programmation la plus simple consiste à utiliser un champ de texte.

Types de texte

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Le type de texte d'un champ de texte est caractérisé par sa source :

Textedynamique

Le texte dynamique correspond au contenu charge à partir d'une source externe, telles qu'un fichier texte ou xml, ou un service Web.

Saisie de texte

Le texte saisi est le texte entré par l'utilisateur ou du texte dynamique que l'utilisateur peut modifier. Vous pouvez définir une feuille de style pour formater le texte saisi, ou utiliser la classe flash.text.TextFormat pour attribuer au champ de texte des propriétés destinées au texte saisi. Pour plus d'informations, voir « Capture du texte saisi par l'utilisateur » à la page 391.

  • Texte statique

Le texte statique est créé par le biais de Flash Professional uniquement. Vous ne pouvez pas creator une occurrence de texte à l'aide d'ActionScript 3.0. Vous pouvez néanmoins utiliser les classes ActionScript telles que StaticText et TextSnapshot pour manipuler une occurrencie de texte statique existante. Pour plus d'informations, voir « Utilisation du texte statique » à la page 399.

Modification du contentu d'un champ de texte

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Vou puez definir du texte dynamique en affectant une chaine à la propriété flash.text.TextField.text. La chaine est directement affectée à la propriété, comme suit :

myTextField.text = "Hello World"; 

Voupeveegalementaftetera propietetextunevalueurissued'unevariabledefiniedansvotrecode,comedansl'exemple suivant:

package
{ import flash.display.Sprite; import flash.text.*; public class TextWithImage extends Sprite { private var myTextBox:TextField newTextField(); private var myText:String = "Hello World"; public function TextWithImage() { addChild(myTextBox); myTextBox.text myText; } 1

Vous pouvez également attribuer à la propriété text une valeur issue d'une variable distante. Le chargement de valeurs textuelles à partir de sources distances peut se faire de trois manières :

  • Les classes flash.net URLsLoader et flash.net URLsRequest charge des variables à partir d'emplacements locaux ou distants.
  • L'attribut FlashVars est incorpore dans la page HTML qui héberge le fichier SWF et peutockerir des valeurs destinées aux variables de texte.
  • La classe flash.net.SharedObject gère le stockage persistant des valeurs. Pour plus d'informations, voir « Stockage des données locales » à la page 728.

Affichage du texte HTML

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La propriété htmlText de la classe flash.text.TextField permet d'indiquer que la chaine de texte contient des balises HTML de formatting du contentu. Comme le montre l'exemple suivant, vous devez affecter votre chaine à la propriété htmlText (et non à la propriété text) pour que Flash Player ou AIR puisse afficher le texte sous forme HTML :

var myText:String = "

Pour la propriété htmlText, Flash Player et AIR prenant en charge un sous-ensemble de balises et d'entités HTML. La description de propriété flash.text.TextField.htmlText dans le manuel Guide de referencia ActionScript 3.0 pour Flash Professional fournit des informations détaillées sur les balises et entités HTML prises en charge.

Une fois que vous avez spécifique votre contentu à l'aide de la propriété htmlText, vous pouvez utiliser des feuilles de style ou la balise textformat pour gérer le formatage. Pour plus d'informations, voir « Mise en forme du texte » à la page 393.

Utilisation d'images dans des champs de texte

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

L'affichage du contenu sous forme de texte HTML presente un autre avantage : vous pouvez inclure des images dans le champ de texte. Il est possible de référencer une image, locale ou distante, grâce à la balise img et de la faire apparaitre dans le champ de texte associé.

L'exemple suivant create un champ de texte appelé myTextBox et incorpore au texte une image.JPG représentant un œil, image stockée dans le même repertoire que le fichier SWF :

package
{ import flash.display.Sprite; import flash.text.*; public class TextWithImage extends Sprite { private var myTextBox:TextField; private var myText:String = "

La balise img prend en charge les fichiers JPEG,GIF,PNG et SWF.

Défilament du texte dans un champ de texte

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Dans bien des cas, votre texte peut s'avérer plus long que le champ de texte qui le contient. Il se peut également qu'un champ de saisie permette à l'utilisateur de saisir plus de caractères qu'il ne peut en afficher en une seule fois. Les propriétés de défilament de la classe flash.text.TextField permettent de gérer du contenu long, que ce soit verticalément ou horizontallylement.

Ces propriétés sont les suivantes :TextFieldscrollV,TextFieldscrollH, maxScrollV et maxScrollH. Utilisez les pour répondre à des événements tels qu'un clic de souris ou une pression sur une touche.

L'exemple ci-après create un champ de texte de taille fixe et contenant plus de texte que le champ ne peut afficher en une seule fois. Lorsque l'utilisateur clique sur le champ de texte, le texte défile verticalement.

Sélection et manipulation de texte

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Vou puez selectionner du texte, qu'il soit dynamique ou saisi. Les propriétés et méthodes de selection de texte de la classe TextField utilisent des positions d'index pour déterminer l'etendue du texte à manipuler. Vous pouze donc programmerper la selection du texte saisi ou dynamique, même si vous n'en connaissiez pas le contenu.

Remarque: si vousCHOISSES l'option selectionnable associée a un champ de texte statique dans Flash Professional, le champ de texte exporté et place dans la liste d'affichage est un champ de texte dynamique normal.

Sélection du texte

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La propriété flash.text.TextField.selectable a la valeur true par défaut. Vous pouvez en outre sélectionner du texte par code à l'aide de la méthode setSelection().

Par exemple, pour selectionner un texte spécifique dans un champ de texte lorsquel l'utiliseur clique dans ce dernier :

var myTextFieldTextField = newTextField();   
myTextField.text = "No matter where you click on this text field the TEXT IN ALL CAPS is selected.";   
myTextFieldAutoSize =TextFieldAutoSize.Left;   
addChild(myTextField);   
addEventListener(MouseEvent.CLICK, selectText);   
function selectText(event:MouseListener):void { myTextField.setSelection(49, 65); } 

De même, pour que le texte d'un champ de texte soit sélectionné lors son affichage initial, créez une fonction de gestion d'évenement qui sera appelée lorsque le champ de texte sera ajouté à la liste d'affichage.

Capture du texte sélectionné par l'utilisateur

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Les propriétés selectionBeginIndex et selectionEndIndex deTextField, qui sont en lecture seule (et ne peuvent donc pas été utilisées à l'aide de code pour sélectionner du texte), permettant également de capturer la sélection actuelle effectuee par l'utilisateur. Par ailleurs, les champs de texte saisis peuvent utiliser la propriété caretIndex.

Par exemple, ce code renvoie les valeurs d'index du texte sélectionné par l'utilisateur :

var myTextField:TextField = newTextField();   
myTextField.text = "Please select the TEXT IN ALL CAPS to see the index values for the first and last letters.";   
myTextField.autoSize =TextFieldAutoSize.LEFT;   
addChild(myTextField);   
addEventListener(MouseEvent.MOUSE_UP, selectText);   
function selectText(event:events):void { trace("First letter index position: "+ myTextField-selectionBeginIndex); trace("Last letter index position: "+ myTextField-selectionEndIndex); } 

Vous pouvez également appliquer un ensemble de propriétés de l'objet TextFormat à la sélection pour modifier l'aspect du texte. Pour plus d'informations sur l'application d'un ensemble de propriétés TextFormat au texte sélectionné, voir « Formatage de plages de texte au sein d'un champ de texte » à la page 396.

Capture du texte saisi par l'utilisateur

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Par défaut, la propriété type d'un champ de texte est définie sur dynamic. Si vous attribuerez à cette propriété type la valeur input à l'aide de la classeTextFieldType, vous pouvez recueiller la saisie de l'utilisateur et enregistrer cette valeur pour l'utiliser dans d'autres zones de l'application. Les champs de texte saisi sont utiles dans les formulaires et toute autre application qui attend que l'utilisateur définisse une valeur de texte à utiliser ailleurs dans le programme.

Par exemple, le code suivant create un champ de texte de saisie appelé myTextBox. Lorsque l'utilisateur saisit du texte dans le champ, l'évenement textInput est déclenché. Un gestionnaire d'évenement appelé textInputCapture capture la chaine de texte saisie et l'attribute à une variable. Flash Player ou AIR affiche le nouveau texte dans un autre champ de texte appelé myOutputBox.

package
{ import flash.display.Sprite; import flash.display.Stage; import flash.text.*; import flash.events.*; public class CaptureUserRole extends Sprite { private var myTextBox:TextField newTextField(); private var myOutputBox:TextField = newTextField(); private var myText:String = "Type your text here."; public function CaptureUserRole() { captureText(); } public functionropaText():void { myTextBox.type TextField.Type.INPUT; myTextBox/background = true; addChild(myTextBox);

myTextBox.text = myText; myTextBox.addEventListener(TextEvent.TXT_INPUT, textInputCapture);
public function textBoxInputCapture(event:TextEvent):void { var str:String = myTextBox.text; createOutputBox(str);
public function createOutputBox(str:String):void { myOutputBox.background = true; myOutputBox.x = 200 . addChild(myOutputBox); myOutputBox.text = str; }

Restriction de la saisie de texte

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Les champs de texte de saisie sont souvent utilisés dans les formulaires et les boîtes de dialogue des applications. Il peut donc être judicieux de limiter le type de caractères que l'utilisateur peut saisir, ou même de masquer la saisie (pour un mot de passer par exemple). La classe flash.text.TextField possède une propriété displayAsPassword et une propriété restrict qui permettent de contrôler la saisie par l'utilisateur.

La propriété displayAsPassword masque simplement le texte (en l'affichant sous forme d'astérisques) à mesure que l'utilisateur le saisit. Lorsque displayAsPassword a la valeur true, les commandes Couper et Copier, ainsi que les raccourcis clavier correspondants ne fonctionnent pas. Comme le montre l'exemple suivant, vous pouvez attribuer la propriété displayAsPassword, comme vous le fériez pour des propriétés d'arrière-plan et de couleur :

myTextBox.type = TextField.Type.INPUT; myTextBox/background = true; myTextBox.displayAsPassword = true; addChild(myTextBox);

La propriété restrict est légèrement plus compliquée, puisque vous devez spécifique les caractères que l'utilisateur peut saisir dans le champ de texte. Il est possible d'autoriser la saisie delettres spécifiques et de nombres, mais aussi de plages de lettres, de nombres et de caractères. Le code ci-après permet à l'utilisateur de saisir uniquement des lettres majuscules (pas de nombres, ni de caractères spéciaux) dans le champ de texte :

ActionScript 3.0 utilise le tiret pour définir les séries et le caractère circonflexe pour exclure des caractères. Pour plus d'informations sur la définition de restrictions associées à un champ de texte de saisie, voir l'entrée

flash.text.TextFieldrestricted dans le Guide de reférence ActionScript 3.0 pour Flash Professional.

Remarque: si vous utilisez la propriété flash.text.TextFieldrestricted, le moteur d'exécution convertit automatiquement les lettres restreintes en caractères de casse autorisée. Si vous utilisez la propriété fl.text.TLFTextFieldrestricted (c'est-à-dire si vous utilisez un champ de texte TLF), le moteur d'exécution ignore les lettres restreintes.

Mise en forme du texte

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Plusieurs options permettent de programmermer la mise en forme du texte à afficher. Vous pouvez définir ses propriétés directement dans l'occurrence deTextField, par exempleTextField thickness,TextField.textColor etTextField.textHeight. Vous pouvez aussi désigner le contenu du champ de texte à l'aide de la propriété htmlText et utiliser des balises HTML prises en charge, telles que b, i et u. Vous pouvez enfin appliquer des objets Formatting aux,champs de texte contenant du texte brut, ou des objets StyleSheet aux,champs contenant la propriété htmlText. Les objets TextFormat et StyleSheet offrent un meilleur contrôle et davantage de cohérence sur l'aspect du texte pour l'ensemble de l'application. Il est possible de définir un objet TextFormat ou StyleSheet et de l'appliquer à une partie ou à l'ensemble des champs de texte de l'application.

Attribution de formats texte

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La classe TextFormat permet de définir différentes propriétés d'affichage du texte et de les appliquer à tout le containu d'un objetTextField, ou à une plage de texte.

L'exemple suivant applique un objet TextFormat à un objetTextField complet, puis un second objet TextFormat à une plage de texte de cet objetTextField :

var tf垦TextField newTextField();
tf.text "Hello Hello";
var format1:TextFormat new TextFormat();
format1.color = 0xFF0000;
var format2:TextFormat new TextFormat();
format2.Font "Courier";
tf垦TextFormat.format1);
var startRange:uint = 6 .
tf垦TextFormat.format2,startRange);
addChild(tf);

La méthodeTextField.setTextFormat() n' affecte que le texte qui est déjà affché dans le champ de texte. Si le contenu de l'objetTextField change, il peut être nécessaire d'appeler à nouveau la méthode

TextField.setTextFormat() pour réappliquer la mise en forme. Vous pouze également utiliser la propriété deaultTextFormat deTextField pour spécifier le format à utiliser pour le texte saisi par l'utilisateur.

Application de feuilles de style en cascade

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Les champs de texte peuvent contérer du texte brut ou du texte au format HTML. Le texte brut est stocké dans la propriété text de l'occurrence, et le texte HTML dans la propriété htmlText.

Vou puez utilise des déclarations de styles CSS pour définir des styles de texte à appliquer ensuite à différents champs de texte. Une déclaration de style CSS peut être créé par code ou chargee lors de l'execution a partir d'un fjichier CSS externe.

C'est la classe flash.text/styleSheet qui gère les styles CSS. La classe StyleSheet ne reconnait qu'un nombre limite de propriétés CSS. La liste détaillée des propriétés de style prises en charge par la classe StyleSheet figure dans l'entrée flash.textStylesheet du Guide de referrerce ActionScript 3.0 pour Flash Professional.

Comme le montre l'exemple suivant, vous pouvez creer des feuilles de style CSS et les appliquer à du texte HTML au moyen de l'objet StyleSheet :

var style: StyleSheet = new StyleSheet(); 
var styleObj:Object = new Object(); 
styleObj.FontSize = "bold"; 
styleObj.color = "#FF0000"; 
style.setStyle(".darkRed", styleObj); 
var tf:TextField = newTextField(); 
tf styleSheet = style; 

Après la création de l'objet StyleSheet, le code create un objet simple pour conténir un jeu de propriétés de déclaration de style. Il appelle ensuite la méthode StyleSheet.setStyle(), qui ajoute le nouveau style à la feuille de style sous le nom «.darkred ». Puis il applique les formats de la feuille de styles en affectant l'objet StyleSheet à la propriété styleSheet deTextField.

Pour que les styles CSS puisent prendre effet, il est nécessaire d'appliquer la feuille de style à l'objet TextField avant de définir la propriété htmlText.

Par essence, un champ de texte doté d'une feuille de style n'est pas modifiable. Si vous attribuiez une feuille de style à un champ de texte de saisie, le champ de texte affiche les propriétés de la feuille de style, mais le champ de texte ne permet pas à l'utilisateur de saisir du texte. En outre, vous ne pouvez pas utiliser les méthodes ActionScript suivantes sur un champ de texte doté d'une feuille de style :

  • LamethodeTextField.replaceText()
  • La méthodeTextField.replaceSelectedText()
  • La propriétéTextField.defaultTextFormat
  • La méthodeTextField.setTextFormat()

Si un champ de texte est doté d'une feuille de style mais que par la suite la propriété TextField.styleSheet reçoit la valeur null,TextField.text etTextField.htmlText ajoutent des balises et des attributs à leurs contenus afin d'incorpore le formatage de la feuille de style précédement attribuée. Pour préserver la propriété htmlText d'origine, enregistrez-la dans une variable avant d'attribuer la valeur null à la feuille de style.

Chargement de fichiers CSS externes

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

L'utilisation de feuilles de style CSS pour la mise en forme offre plus de possibilités s'il est possible de charger les informations de CSS à partir d'un fjichier externe lors de l'exécution. Si les données CSS sont externes à l'application, il est possible de changer le style visuel du texte sans devoir modifier le code source ActionScript 3.0. En effet, après le déploement de l'application, vous pouvez encore modifier le fjichier CSS externe pour obtenir un nouvel aspect, sans devoir redéployer le fjichier SWF de l'application.

La méthode StyleSheet.parseCSS() convertit une chaine contenant des données CSS en déclarations de style dans l'objet StyleSheet. L'exemple suivant montre comment dire un fisier CSS exter et appliquer ses déclarations de style à un objet TextField.

Voici le contenu du fichier CSS à charger. Il est appelé « example.css »:

p{ font-family:TimesNewRoman,Times,_serial; font-size:14;   
}   
h1{ font-family:Arial,Helvetica,_sans; font-size:20; font-weight:bold;   
}   
. bluetext{ color:#0000CC; 

Voici maintenant le code ActionScript d'une classe qui charge le fichier example.css et en applique les styles au contenu de l'objetTextField :

package   
{ import flash.display.Sprite; import flash.events.Event; import flash.net URLsLoader; import flash.net(URLRequest; import flash.text Stylesheet; import flash.text.TextField; import flash.text.TextFieldAutoSize; public class CSS FormattingExample extends Sprite { var loader:URLLoader; var field:TextField; var exampleText:String = "<h1"This is a headline</h1>" + "<p>This is a line of text. <span class='bluetext'>'+" + "This line of text is colored blue.</span></p>"; public function CSS FormattingExample():void { field = newTextField(); field.width = 300; 

field.autoSize = TextFieldAutoSize.LEFT; field(wordWrap true; addChild.field); var req:URLRequest new URLRequest("example.css"); loader = new URLLoader(); loader.addEventListener(Event.COMPLETET, onCSSFileLoaded); loader.load(req);
public function onCSSFileLoaded(event:Event):void { var sheet:StyleSheet new StyleSheet(); sheet.parseCSS(load.data); field.styleSheet sheet; field.htmlText exampleText; } 1

Lorsque les données de CSS sont chargées, la méthode onCSSFileLoaded() s'exécute et appelle la méthode StyleSheet.parseCSS() pour transférer les déclarations de style à l'objet StyleSheet.

Formatage de plages de texte au sein d'un champ de texte

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La classe flash.text.TextField contient une méthode particulièrement utile, setTextFormat(). La méthode setTextFormat() permet d'affector des propriétés spécifiques à une partie du contenu d'un champ de texte en response à une action de l'utilisateur, par exemple pour rappeler à l'utilisateur que certains champs d'un-formulaire doivent être renseignés, ou encore pour changer l'aspect d'un passage de texte si l'utilisateur seLECTIONne une partie de ce texte.

L'exemple suivant utilise la méthodeTextField.setTextFormat() sur une plage de caractères pour modifier l'aspect d'une partie du contenu de myTextField lorsque l'utiliseur clique dans ce champ de texte :

var myTextField:TextField = newTextField();   
myTextField.text = "No matter where you click on this text field the TEXT IN ALL CAPS changes format.";   
myTextField.autoSize =TextFieldAutoSize.LEFT;   
addChild(myTextField);   
addEventListener(MouseEventCLICK, changeText);   
var myformat:TextFormat = new TextFormat();   
myformat.color = 0xFF0000;   
myformat.size = 18;   
myformat.Underline = true;   
function changeText(event:MouseEvent):void { myTextField.setTextFormat(myformat, 49, 65); } 

Fonctions avancées d'affichage de texte

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Le package flash.text d'ActionScript 3.0 offre plusieurs classes qui permettent de contröler les propriétés du texte affché, notamment les polices intégrées, les paramètres d'anticrénelage, le canal alpha et autres paramètres spécifique. Le Guide de référence ActionScript 3.0 pour Flash Professional fournit des descriptions détaillées de ces classes et de leurs propriétés, notamment des classes CSMSettings, Font et TextRenderer.

Utilisation de polices incorporees

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Si vous spécifiez une police précise pour un objetTextField de votre application, Flash Player ou AIR recherche une police résidente du même nom sur l'ordinateur de l'utilisteur. Si cette police n'est pas chargée sur cet ordinateur, ou s'il existe une police de ce nom mais dans une version légersement différente, le texte peut apparaitre très différents de ce que vous aviez prévu. Par défaut, le texte s'affiche dans la police Times Roman.

Pour que l'utilisateur voie exactement la police voulue, vous pouvez incorporer cette police dans le fichier SWF de votre application. Les polices intégrées serontent de nombreux avantages :

  • Les caractères des polices incorporees sont anticrénelés, ce qui les rend plus agreables à dire, en particulier pour les grandes tailles de texte.
  • Il est possible de faire pivoter les polices incorporees.
  • Il est possible de rendre transparent ou semi-transparent le texte des polices incorporeés.
  • Il est possible d'utiliser le style CSS kerning (crénage) avec les polices incorporees.

Le principal inconvénient des polices incorporeées est l'augmentation de la taille du fichier de l'application.

La méthode exacte à utiliser pour intégrer un fichier de police dans le fichier SWF de l'application varie selon l'environnement de développement.

Une fois la police intégrée, il est possible de faire en sorte que l'objetTextField utilise la police correcte :

  • Mettez la propriété embedFonts de l'objet TextField sur true.
  • Créez un objet TextFormat, donnez à sa propriété fontFamily le nom de la police incorporee, et appliquez l'objet TextFormat auTextField. Dans le cas d'une police incorporee, la propriété fontFamily ne doit containir qu'un seul nom. Elle ne peut pas utiliser une liste de polices séparées par des virgules.
  • Si vous utilise des styles CSS pour les polices d'objects TextFields, donnez à la propriété CSS font-family le nom de la police incorporee. Si vous voulez utiliser une police incorporee, la propriété font-family ne doit containir qu'un seul nom, et non pas une liste de nombres.

Intégration d'une police dans Flash

Flash Professional you permit d'intégrer pratiquement toutes les polices installées sur votre système, notamment les polices TrueType et les polices Postscript Type 1.

Il existe plusieurs façon d'intégrer des polices dans une application. Vous pouvez par exemple :

  • définir la police et les propriétés de style d'un objetTextField sur la Scène, puis en cocher la case Incorporer les polices;
  • créer et référencer un symbole de police ;

  • créé et utiliser une bibliothèque d'exécution partagée contenant les symboles de la police intégrée.

Pour plus d'informations sur l'intégration de polices dans les applications, voir « Polices intégrées pour champs de texte dynamique ou de saisie » dans Utilisation de Flash.

Intégration d'une police dans Flex

Il existe plusieurs façon d'intégrer des polices dans une application Flex. Vous pouvez par exemple :

  • utiliser la balise de métadonnées [Embed] dans un script ;
  • utiliser la déclaration de style @font-face;
  • définir la classe de la police et l'intégrer par le biais de la balise [Embed].

Seules les polices TrueType peuvent directement etre integres dans une application Flex. Les polices dans un autre format, telles que les polices Postscript Type 1,doivent tout d'abord etre integres dans un fichier SWF à l'aide de Flash Professional ; vous pouvez ensuite utiliser ce fichier SWF dans votre application Flex. Pour plus d'informations sur l'utilisation de polices integres dans Flex à partir de fichiers SWF, voir « Intégration de polices à partir de fichiers SWF » dans le manuel Utilisation de Flex 4.

Voir aussi

Incorporation de polices pour assurer la cohérence de l'apparace du texte

Peter deHaan : Embedding fonts (disponible en anglais uniquement)

Divillysausages.com : AS3 Font embedding masterclass (disponible en anglais uniquement)

Contrôle de la netteté, de l'épaissur et de l'anticrènelage

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Par défaut, Flash Player ou AIR déterminé les paramètres de contrôle d'affichage du texte (nettété, épaïseur et anticrénélage) qui s'appliquent lorsque le texte change de taille et de couleur ou s'affiche sur différents arrêtre-plans. Dans certains cas, vous poupez définir ces paramètres, par exemple si le texte est très petit ou très gros, ou s'il s'affiche sur plusieurs arrêtre-plans. La classe flash.text.TextRenderer et les classes associées, telles que CSMSettings, permettent de replacer les paramètres de Flash Player ou d'AIR. Elles offrent un contrôle précis de la qualité d'affichage du texte incorpore. Pour plus d'informations sur les polices intégrées, voir « Utilisation de polices incorporees » à la page 397.

Remarque : la propriété . antiAliasType de la classe flash . text .TextField doit avoir la valeur

AntiAliasType.ADVANCED pour que vous puissiez définir la netteté, l'épaisseur ou la propriété gridFitType, ou pour que vous puissiez utiliser la méthode TextRenderer.setAdvancedAntiAliasingTable().

L'exemple suivant applique des propriétés personalisées de modulation continue du trait (CSM) et de mise en forme au texte affché, en utilisant la police incorporee myFont. Lorsque l'utilisateur clique sur le texte affché, Flash Player ou Adobe AIR applique ces paramètres personalisés :

var format:TextFormat = new TextFormat();   
format.color = 0x336699;   
format.size = 48;   
format.Font = "myFont";   
var myText:TextField = newTextField();   
myTextembedFonts = true;   
myText.autoSize =TextFieldAutoSize.LEFT;   
myText antiAliasType = AntiAliasType.ANTANCED;   
myText.defaultTextFormat = format;   
myText.selectable = false;   
myText.mouseEnabled = true;   
myText.text = "Hello World";   
addChild(myText);   
myText.addEventListener(MouseEvent.CLICK, clickHandler);   
function clickHandler(event:Event):void { var myAntiAliasSettings = new CSMSettings(48, 0.8, -0.8); var myAliasTable:Array = new Array(myAntiAliasSettings); TextRenderer.setAdvancedAntiAaliasingTable("myFont", FontStyle.ITALIC, TextColorType.DARK_COLOR, myAliasTable); } 

Utilisation du texte statique

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Le texte statique est créé dans Flash Professional uniquely. Il est impossible d'instancier du texte statique en ActionScript. Le texte statique est utile si le contenu textuel est court et ne doit pas changer (contrairement au texte dynamique). Vous pouvez assimiler le texte statique à un élément graphique comparable à un cercle ou un carré dessiné sur la Scène dans Flash Professional. Bien que le texte statique offre moins de possibilités que le texte dynamique, ActionScript 3.0 permet de dire les valeurs des propriétés du texte statique à l'aide de la classe StaticText. En outre, vous pouvez utiliser la classe TextSnapshot pour extraire des valeurs du texte statique.

Accès aux champs de texte statique à l'aide de la classe StaticText

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Vous utilisez généralement la classe flash.text.TextStaticText dans le panneau Actions de Flash Professional pour agir sur une occurrence de texte statique placée sur la scène. Vous pouze également travailler dans des fischiers ActionScript qui interagissant avec le filchier SWF contenant le texte statique. Dans les deux cas, il est impossible de creator par code une occurrence de texte statique. Le texte statique est créé dans Flash Professional.

Pour creer une referece a un champ de texte statique existant, you pouze effectuer une iteration sur les elements de la liste d'affichage et affecter une variable. Exemple :

for(var i = 0; i < this.numChildren; i++) {  
var displayItem: DisplayObject = this.getChildAt(i);  
if (displayItem instanceof StaticText) {  
trace("a static text field is item " + i + " on the display list");  
var myFieldLabel: StaticText = StaticText(displayItem);  
trace("and contains the text: " + myFieldLabel.text);  
} 

Lorsque you disposez d'une referrer à un champ de texte statique, vous pouvez utiliser les propriétés de ce champ dans ActionScript 3.0. Le code suivant est associé à une image du scenario et suppose qu'une variable appelée myFieldLabel est affectée à une referrer à un champ de texte statique. Un champ de texte dynamique myField est positionné relativement aux valeurs x et y de myFieldLabel et affiche à nouveau la valeur de myFieldLabel.

var myField:TextField = newTextField();  
addChild(myField);  
myField.x = myFieldLabel.x;  
myField.y = myFieldLabel.y + 20;  
myField.autoSize =TextFieldAutoSize.LEFT;  
myField.text = "and" + myFieldLabel.text 

Utilisation de la classe TextSnapshot

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Pour travailler par programmation avec une occurrence de texte statique existante, utilisez la classe flash.text.TextSnapshot pour modifier la propriete textSnapshot d'un objet flash.display.DisplayObjectContainer. En d'autres termes, creez une occurrence de TextSnapshot à partir de la propriete DisplayobjectContainer.textSnapshot. Vous pouvez alors appliquer des méthodes à cette occurrence afin d'extraire des valeurs ou de selectionner des portions du texte statique.

Par exemple, placez un champ de texte statique contenant le texte « TextSnapshot Example » sur la scene. Ajoutez le code ActionScript suivant à l'image 1 du scenario :

var mySnap:TextSnapshot = this.textSnapshot;
var count:Number = mySnap.charCount;
mySnap.setSelected(0,4,true);
mySnap.setSelected(1,2,false);
var myText:String = mySnap.getSelectedText(false);
trace(myText);

La classe TextSnapshot est utile pour extraire le texte des champs de texte statique dans un filchier SWF charge, au cas où vous souhaiteriez utiliser ce texte comme valeur dans une autre zone de l'application.

ExempleTextField : mise en forme du texte dans le style « article de journal »

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

L'exemple « Article de journal » met en forme le texte pour lui donner l'aspect d'un article de journal. Le texte saisi peut containir un gros titre, un intertitle et le corps de l'article. En fonction d'une largeur et d'une hauteur d'affichage, cet exemple met en forme le gros titre et l'intertitre pour qu'ils occupent toute la largeur disponible. Le texte de l'article est réparti sur plusieurs colonnes.

Cet exemple illustré les techniques de programmation en ActionScript suivantes :

  • Extension de la classe TextField
  • Chargement et application d'un fichier CSS externe
  • Conversion de styles CSS en objets TextFormat
  • Utilisation de la classe TextLineMetrics pour obtenir des informations sur la taille d'affichage du texte

Pour obtenir les fichiers d'application de cet exemple, voir

www.adobe.com/go/learn_programmingAS3samplesflash_fr. Les fichiers de l'application News Layout se trouvent

Dans le dossier Samples/NewsLayout. L'application se compose des fichiers suivants :

FichierDescription
NewsLayout.mxml ou NewsLayout.flaInterface utilisé de l'application pour Flex (MXML) ou Flash (FLA).
com/example/programmingas3/ne wslayout/StoryLayoutComponent.a sClasse Flex UIComponent qui place l'occurrence de StoryLayout.
com/example/programmingas3/ne wslayout/StoryLayout.asPrincipale classe ActionScript chargée d'organiser les composants d'un article pour leur affichage.
com/example/programmingas3/ne wslayout/FormattedTextField.asSous-classe de la classe TextField qui gère son propre objet TextFormat.
com/example/programmingas3/ne wslayout/HeadlineTextField.asSous-classe de la classe FormattedTextField qui ajuste la taille des polices en fonction de la largeur voulue.
com/example/programmingas3/ne wslayout/MultiColumnTextField.asClasse ActionScript qui répartit le texte de l'article sur plusieurs colonnes.
story.cssFichier CSS définitissant les styles du texte pour la mise en page.

Lecture du fichier CSS externe

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

L'application News Layout commence par récapérez le texte de l'article à partir d'un fichier XML local. Elle lit ensuite un fichier CSS externe contenant les informations de mise en forme pour le gros titre, l'intertitre et le texte.

Ce fichier CSS définit trois styles, un style de paragraphe standard pour l'article et les styles h1 et h2, respectivement pour le gros titre et l'intertitre.

p{ font-family: Georgia, "Times New Roman", Times, _serif; font-size: 12; leading: 2; text-align: justify; indent: 24; }   
h1 { font-family: Verdana, Arial, Helvetica, _sans; font-size: 20; font-weight: bold; color: #000099; text-align: left; }   
h2 { font-family: Verdana, Arial, Helvetica, _sans; font-size: 16; font-weight: normal; text-align: left; } 

La technique utilisé pour lire le fisquier CSS externe est identique à celle désrite à la section « Chargement de fischiers CSS externes » à la page 395. Àpres le chargement du fisquier CSS, l'application exécute la méthode onCSSFileLoaded(), représentée ci-dessous.

public function onCSSFileLoaded(event:Event):void { this sheet = new StyleSheet(); this sheet.parseCSS(loader.data); h1Format = getStyle("h1", this sheet); if (h1Format == null) { h1Format = getDefaultHeadFormat(); } h2Format = getStyle("h2", this sheet); if (h2Format == null) { h2Format = getDefaultHeadFormat(); h2Format.size = 16; } pFormat = getStyle("p", this sheet); if (pFormat == null) { pFormat = getDefaultTextFormat(); pFormat.size = 12; } displayText(); } 

La méthode onCSSFileLoaded() create un objet StyleSheet qui analyse les données du filchier CSS. Le texte principal de l'article est affché dans un objet MultiColumnTextField, qui peut utiliser directement un objet StyleSheet.

Toutefois, les champs du gros titre utilisent la classe HeadlineTextField, qui utilise un objet TextFormat pour sa mise en forme.

La méthode onCSSFileLoaded() appelle deux fois la méthode getTextStyle() pour convertir une déclaration de style CSS en un objet TextFormat destiné aux deux objets HeadlineTextField.

public function getTextStyle(styleName:String,ss:stylesheet):TextFormat{ var format:TextFormat null; var style:Object = ss.getStyle(styleName); if (style ! = null) { var colorStr:String style.color; if (colorStr ! = null && colorStr.indexOf("##") = = 0 ) { style.color = colorStr/Substr(1); } format = new TextFormat(styleSIONFamily, style.FontSize, style.color, (style.FontWeight = = "bold"), (style.FontStyle = = "italic"), (style.textDecoration = = "underline"), style.url, style.target, style.textAlign, style.marginLeft, style.marginRight, styleindent, style-leading); if (style.hasOwnProperty("letterSpacing")) { format-letterSpacing style LETTERSpacing; } } return format; }

Les noms de propriétés et la signification de leurs valeurs différent entre les déclarations de style CSS et les objets TextFormat. La méthode getTextStyle() transforme donc les valeurs des propriétés CSS dans les valeurs attendues par l'objet TextFormat.

Disposition des éléments de l'article sur la page

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La classe StoryLayout formate et met en page les champs de texte dévolus au gros titre, à l'intertitre et à l'article dans le style d'une page de journal. La méthode displayText() creé et place les divers champs.

public function displayText():void
{ headlineTxt = new HeadlineTextField(h1Format); headlineTxt(wordWrap true; headlineTxt.x this(paddingLeft; headlineTxt.y this(paddingTop; headlineTxt.width thispreferredWidth; this.addChild(headlineTxt); headlineTxt.fitText(this.headline,1,true); subtitleTxt = new HeadlineTextField(h2Format); subtitleTxt(wordWrap true; subtitleTxt.x this(paddingLeft; subtitleTxt.y headlineTxt.y ^+ headlineTxt.height; subtitleTxt.width thispreferredWidth; this.addChild(subtitleTxt); subtitleTxt.fitText(this.subtitle,2,false); storyTxt = new MultiColumnText(this.numColumns,20, thispreferredWidth,400,true,this.pFormat); storyTxt.x this(paddingLeft; storyTxt.y subtitleTxt.y ^+ subtitleTxt.height + 10; this.addChild(storyTxt); storyTxt.text this(content;

Chaque champ est placé sous le champ précédent en effectuant le calcul suivant : la propriété Y du champ est égale à la propriété Y du champ précédent, plus sa hauteur. Ce calcul dynamique de position est nécessaire, car les objets HeadlineTextField et MultiColumnTextField peuvent changer de hauteur en fonction de leur containu.

Modification de la taille de la police en fonction de la taille du champ

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Sur la base d'une largeur en pixels et d'un nombre maximum de lignes à afficher, l'objet HeadlineTextField modifie la taillie de la police pour adapter le texte aux dimensions du champ. Si le texte est court, la police est de grande taillie, créé ainsi un gros titre de style tabloïde. Si le texte est long, la police est de plus petite taillie.

La méthode HeadlineTextField.fitText() reproduite ci-dessous est chargée du redimensionnement du texte :

public function fitText(msg:String, maxLines:uint = 1, toUpper:Boolean = false, targetWidth:Number = -1):uint
{
    this.text =toUpperCase ? msgtoUpperCase() : msg;
    if (targetWidth == -1)
        {
            targetWidth = this.width;
        }
    var pixelsPerChar:Number = targetWidth / msg.length;
    var点儿 := Math.min(MAX_POINT_SIZE, Math.round(pixelsPerChar * 1.8 * maxLines));
    if (pointSize < 6)
        {
            // the point size is too small
            return点儿;
        }
    this.height(new点儿);
    if (this.numLines > maxLines)
        {
            return shrinkText(--pointSize, maxLines);
        }
    else
        {
            return growText(pointSize, maxLines);
        }
}
public function growText(pointSize:Number, maxLines:uint = 1):Number
{
    if (pointSize >= MAX_POINT_SIZE)
        {
            return点儿;
        }
    this.height(new点儿);
    if (this.numLines > maxLines)
        {
            // set it back to the last size
            this.size = new size;
            return点儿;
        }
    else
        {
            return growText(pointSize + 1, maxLines);
        }
} 

public function shrinkText(pointSize:Number,maxLines:uint = 1 ):Number { if (pointSize MIN_POINT_SIZE) { return pointSize; } this不断扩大(pointSize); if (this.numLines > maxLines) { return shrinkText(pointSize - 1,maxLines); } else { return pointSize; }

La méthode HeadlineTextField.fitText() utilise une technique récursive simple pour dimensionner le texte. Elle estime d'abord un nombre moyen de pixels par caractère pour le texte, puis calcule une taille de départ. Elle change alors la taille de la police et vérifie si le texte a renvoyé des mots à la ligne et si le nombre maximal de lignes est dépasse. Si c'est le cas, elle appelle la méthode shrinkText() pour réduire la taille du texte, et teste à nouveau. Si le nombre de lignes n'est pas trop important, elle appelle la méthode growText() pour augmenter la taille du texte, et teste à nouveau. Ce processus s'interrrompt lorsque l'augmentation de taille du texte d'un seul point créé un nombre de lignes trop élevé.

Répartition du texte sur plusieurs colonnes

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La classe MultiColumnTextField répartit le texte entre plusieurs objetsTextField qui sont organisés comme des colonnes de texte sur une page de journal.

Le constructeur de MultiColumnTextField() creé tout d'abord un tableau d'objectsTextField, un pour chaque colonne :

for(var i:int = 0 .i < cols; i + + { var field:TextField = newTextField(); field multiline = true; field.autoSize = TextFieldAutoSize.NONE; field wordWrap = true; field.width = this.colWidth; field.setTextFormat(this.format); this.fieldArray.push(field); this.addChild.field);
}

Chaque objet TextField est ajoute au tableau et à la liste d'affichage à l'aide de la méthode addChild().

Si la propriété text ou styleSheet de StoryLayout change, la méthode layoutColumns() est appelée pour réafficher le texte. La méthode layoutColumns() appelle la méthode getOptimalHeight() pour déterminer la hauteur correcte en pixels nécessaire pour adapter tout le texte en fonction de la largeur disponible.

public function getOptimalHeight(str:String):int
{ if (field.text = = "" || field.text = = null) { return thispreferredHeight; } else { this-linesPerCol Math.ceil.field.numLines/ this.numColumns); var metrics:TextLineMetrics field.getLineMetrics(0); this.lineHeight metrics.height; var prefHeight:int linesPerCol this.lineHeight; return prefHeight + 4; }

La méthode getOptimalHeight() calcule d'abord la largeur de chaque colonne. Elle définit ensuite la propriété htmlText du premier objetTextField du tableau. La méthode getOptimalHeight() utilise ce premier objetTextField pour connaître le nombre total de lignes renvoyées à la ligne, et en déduit donc le nombre de lignes optimal pour chaque colonne. Elle appelle ensuite la méthodeTextField.getLineMetrics() pour obtenir un objet TextLineMetrics contenant des informations sur la taille du texte de la première ligne. La propriété

TextLineMetrics.height represente la hauteur totale (en pixels) d'une ligne de texte, avec les mesures ascendantes, descendantes et l'inter ligne. La hauteur optimale de l'objet MultiColumnTextField est donc la hauteur de ligne multipliee par le nombre de lignes par colonne, plus 4 pour tener compte de la cordure de deux pixels en haut et en bas de l'objetTextField.

Voici le code complet de la méthode layoutColumns():

public function layoutColumns():void { if (this._text == "" || this._text == null) { return; } var field:TextField = fieldArray[0] asTextField; field.text = this._text; field.setTextFormat(this.format); thispreferredHeight = this.getOptimalHeight.field); var remainder:String = this._text; var fieldText:String = ""; var lastLineEndedPara:Boolean = true; var indent:Number = this.formatIndent as Number; for (var i:int = 0; i < fieldArray.length; i++) { field = this.fieldArray[i] asTextField; field.height = thispreferredHeight; field.text = remainder; field.setTextFormat(this.format); 

var lineLen:int;
if (indent >0 &&!lastLineEndePar&&field.NumLines >0 1 lineLen field.getLineLength(0); if (lineLen >0 1 field.setTextFormat(this.firstLineFormat,0,lineLen); }
}
field.x i* (colWidth ^+ gutter);
field.y = 0 .
remainder "";
fieldText "";
var linesRemaining:int = field.NumLines;
varlinesVisible:int = Math.min(this-linesPerCol,linesRemaining);
for(varj:int = 0 ;j}
field.text fieldText;
field.setTextFormat(this.format);
if (indent >0 &&!lastLineEndePara) { lineLen field.getLineLength(0); if (lineLen >0 1 field.setTextFormat(this.firstLineFormat,0,lineLen); }
}
var lastLine:String field.getText.field[numLines-1]; var lastCharCode:Number lastLine.charCodeAt(lastLine.length-1);

if (lastCharCode == 10 || lastCharCode == 13) { lastLineEndedPara = true; } else { lastLineEndedPara = false; } if ((this.format.align == TextFormatAlign.JUSTIFY) && (i < fieldArray.length - 1)) { if (!lastLineEndedPara) { justifyLastLine.field, lastLine); } } } } 

Lorsque la propriété preferedHeight a ete definie par un appel a la methode getOptimalHeight, la methode layoutColumns() parcourt les objetsTextField et definit la hauteur de chacun avec la valeur preferedHeight. La methode layoutColumns() distribue ensuite le nombre de lignes de texte adapté a chaque champ, de sorte qu'aucun défillement ne se produise dans l'un d'eux et que le texte de chaque champ enchaîne sur celui du champ precedent. Si le style d'alignement du texte a ete defini sur « justifier», la methode justifyLastLine() est appelée pour justifier la ligne finale du texte dans un champ. Dans le cas contraire, la derniere ligne est considérée comme une ligne de fin de paragraphe et n'est donc pas justifiée.

Chapitre 22 : Utilisation de Flash Text Engine

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

Adobe® Flash® Text Engine (FTE), disponible à partir de Flash Player 10 et Adobe® AIR™ 1.5, propose une prise en charge de bas niveau pour un contrôle sophistiqué des mesures de texte, de la mise en forme et du texte bidirectionnel. Il se caractérisse par un flux de texte optimisé et une prise en charge des langues enrichie. Bien qu'il puisse être utilisé pour creer et:gérer de simples éléments de texte, FTE est l'outil de base pour les développpeurs qui souhaitent créé des composants d'édition de texte. En tant que tel, Flash Text Engine nécessite des connaissances avancées en programmation. Pour afficher des éléments de texte simples, voir « Utilisation de la classeTextField » à la page 385.

Text Layout Framework (TLF), qui comprend un composant de manipulation de texte basé sur FTE, propose une méthode d'utilisation de ses fonctions avances plus conviviale. TLF est une bibliothèque extensible reposant entièrement sur ActionScript 3.0. Vous pouvez utiliser le composant TLF existant ou utiliser la structure pour créé votre propre composant de texte. Pour plus d'informations, voir « Utilisation de Text Layout Framework » à la page 440.

Voir aussi

Package flash.text.engine

Création et affichage de texte

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

Les classes qui constituent Flash Text Engine vous permettent de creer, demettre en forme et de contrcler le texte. Les classes suivantes constituent les éléments de base pour la creation et l'affichage de texte avec Flash Text Engine :

  • TextElement/GraphicElement/GroupElement: renferment le contenu d'une occurrence de TextBlock
  • ElementFormat: spécifique les attributs de mise en forme du contenu d'une occurrence de TextBlock
  • TextBlock : classe usine pour la création d'un paragraphe de texte
    TextLine: ligne de texte create à partir de TextBlock

Pour afficher du texte, créez un objet TextElement à partir d'un élément String en utilisant un objet ElementFormat pour définir les caractéristiques de mise en forme. Affectez l'objet TextElement à la propriété content d'un objet TextBlock. Créez les lignes de texte à afficher en appelant la méthode TextBlock.createTextLine(). La méthode createTextLine() renvoie un objet TextLine qui contient le nombre de caractères de la chaine correspondant à la largeur spécifique. Appelez plusieurs fois la méthode jusqu'à ce que la chaine entière s'affiche sous forme de lignes. Une fois toutes les lignes créées, la valeur TextLineCreationResult.COMPLETE est affectée à la propriété textLineCreationResult de l'objet TextBlock. Pour afficher les lignes, ajoutez-les à la liste d'affichage (associées aux valeurs de position x et y appropriées).

Par exemple, le code suivant utilise ces classes FTE pour afficher « Hello World! This is Flash Text Engine! » à l'aide du format et de la police par défaut. Dans cet exemple simple, une seule ligne de texte est généraee.

package
{ import flash.text.engine.*; import flash.display.Sprite; public class HelloWorldExample extends Sprite { public function HelloWorldExample() { var str = "Hello World! This is Flash Text Engine!"; var format:ElementFormat new ElementFormat(); var textElement:TextElement new TextElement(str, format); var textBlock:TextBlock new TextBlock(); textBlock(content textElement; var textLine1:StringLine textBlock.createTextLine(null,300); addChild(textLine1); textLine1.x = 30 . textLine1.y = 30 . } }

Les paramètres requis pour createTextLine() spécifient la ligne où doit commencer la nouvelle ligne et la largeur de cette-ci en pixels. La ligne où doit commencer la nouvelle ligne correspond généralement à la ligne précédente, mais dans le cas de la première ligne, la valeur est null.

Ajout d'objects GraphicElement et GroupElement

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

Vous pouvez affecter un objet GraphicElement à un objet TextBlock en vue d'afficher une image ou un élément graphique. Il vous suffit pour cela de creer une occurrence de la classe GraphicElement à partir d'un graphique ou d'une image, puis d'affeter l'occurrence à la propriété TextBlock(content. Créez la ligne de texte en appelant la méthode TextBlock.createTextline() selon la procédure habituelle. L'exemple suivant créée deux lignes de texte : une avec un objet GraphicElement, l'autre avec un objet TextElement.

package
{ import flash.text.engine.*; import flash.display.Sprite; import flash.display.Shape; import flash.display.Graphics; public class GraphicElementExample extends Sprite { public function GraphicElementExample() { var str:String = "Beware of Dog!"; var triangle:Shape = new Shape(); triangle.graphics.beginFill(0xFF0000,1); triangle.graphics.lineStyle(3); triangle.graphics.moveTo(30,0); triangle.graphics.lineTo(60,50); triangle.graphics.lineTo(0,50); triangle.graphics.lineTo(30,0); triangle.graphics.endFill(); var format:ElementFormat new ElementFormat(); format-fontSize = 20 var graphicElement:GraphicElement new GraphicElement(triangle, triangle.width, triangle.height, format); var textBlock:TextBlock new TextBlock(); textBlock(content graphicElement; var textLine1:TextLine textBlock.createTextLine(null,triangle.width); textLine1.x = 50 . textLine1.y = 110 . addChild(textLine1); var textElement:TextElement new TextElement(str,format); textBlock(content textElement; var textLine2 textBlock.createTextLine(null,300); addChild(textLine2); textLine2.x textLine1.x-30; textLine2.y textLine1.y + 15; } }

Vous pouvez创建工作 un objet GroupElement pour创建工作 un groupe d'objets TextElement et GraphicElement ou d'autres objets GroupElement. Vous pouvez affecter un objet GroupElement à la propriété content d'un objet TextBlock. Le paramètre au constructeur GroupElement() est un vecteur qui pointe vers le texte, le graphique et les éléments qui constituent le groupe. L'exemple suivant regroupe deux éléments graphiques et un élément de texte, et les affecte comme une unité à un bloc de texte.

package   
{ import flash.text.engine.*; import flash.display.Sprite; import flash.display.Shape; import flash.display.Graphics; public class GroupElementExample extends Sprite { public function GroupElementExample() { var str:String = "Beware of Alligators!"; var triangle1:Shape = new Shape(); triangle1.graphics.beginFill(0xFF0000, 1); triangle1.graphics.lineStyle(3); triangle1.graphics.moveTo(30, 0); triangle1.graphics.lineTo(60, 50); triangle1.graphics.lineTo(0, 50); triangle1.graphics.lineTo(30, 0); triangle1.graphics.endFill(); var triangle2:Shape = new Shape(); triangle2.graphics.beginFill(0xFF0000, 1); triangle2.graphics.lineStyle(3); triangle2.graphics.moveTo(30, 0); triangle2.graphics.lineTo(60, 50); triangle2.graphics.lineTo(0, 50); triangle2.graphics.lineTo(30, 0); triangle2.graphics.endFill(); var format: ElementFormat = new ElementFormat(); format-fontSize = 20; var graphicElement1:GraphicElement = new GraphicElement(triangle1, triangle1.width, triangle1.height, format); var textElement:TextElement = new TextElement(str, format); var graphicElement2:GraphicElement = new GraphicElement(triangle2, triangle2.width, triangle2.height, format); var groupVector:Vector.<ContentElement> = new Vector.<ContentElement>(); groupVector.push graphicElement1, textElement, graphicElement2); var groupElement = new GroupElement(groupVector); var textBlock:TextBlock = new TextBlock(); textBlock(content = groupElement; var textLine:TextLine = textBlock.createTextLine(null, 800); addChild(textLine); textLine.x = 100; textLine.y = 200; } } 

Remplacement du texte

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

Vou puez remplacer du texte dans une occurrence de TextBlock en appelant la methode

TextElement.replaceText() en vue de remplacer le texte dans l'objet TextElement que vous avez affecté à la propriété TextBlock(content.

L'exemple suivant utilise replaceText () pour d'abord insérer du texte au début de la ligne, puis pour ajouter du texte à la fin de la ligne et, enfin, pour replacer du texte au milieu de la ligne.

package
{ import flash.text.engine.*; import flash.display.Sprite; public class ReplaceTextExample extends Sprite { public function ReplaceTextExample() { var str:String = "Lorem ipsum dolor sit amet"; var fontDescription:FontDescription = new FontDescription("Arial"); var format:ElementFormat = new ElementFormat(fontDescription); format.size = 14 var textElement:TextElement = new TextElement(str, format); var textBlock:TextBlock = new TextBlock(); textBlock(content = textElement; createLine(textBlock,10); textElement.replaceText(0,0,"A text fragment:"); createLine(textBlock,30); textElement.replaceText(43,43,"..."); createLine(textBlock,50); textElement.replaceText(23,28,"(ipsum)"); createLine(textBlock,70); } function createLine(textBlock:TextBlock,y:Number):void { var textLine:TextLine = textBlock.createTextLine(null,300); textLine.x = 10 ; textLine.y = y; addChild(textLine); } }

La méthode replaceText() remplace le texte spécifique à l'aide des paramètres beginIndex et endIndex par le texte spécifique à l'aide du paramètre newText. Si les valeurs des paramètres beginIndex et endIndex sont les mêmes, la méthode replaceText() insère le texte spécifique à cet emplacement. Dans le cas contraire, elle remplace les caractères spécifiés à l'aide des paramètres beginIndex et endIndex par le nouveau texte.

Gestion des événements dans FTE

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

Comme c'est le cas pour d'autres objets d'affichage, vous pouze ajouter des écouteurs d'évenement à une occurrencé de TextLine. Par exemple, vous pouze savoir à quel moment un utiliser passée la souris sur une ligne de texte ou clique sur la ligne. L'exemple suivant détecte ces deux événements. Lorsque vous passsez la souris sur une ligne, le curseur prend la forme d'un bouton et lorsque vous cliquez sur la ligne, il change de couleur.

package
{ import flash.text.engine.*; import flash.ui.Mouse; import flash.display.Sprite import flash.events.MouseEvent; import flash.events.EventDispatcher; public class EventHandlerExample extends Sprite { var textBlock:TextBlock = new TextBlock(); public function EventHandlerExample():void { var str:String = "I'll change color if you click me."; var fontDescription:FontDescription = new FontDescription("Arial"); var format:ElementFormat = new ElementFormat(fontDescription,18); var textElement = new TextElement(str,format); textBlock(content = textElement; createLine(textBlock); } private function createLine(textBlock:TextBlock):void { var textLine:String = textBlock.createTextLine(null,500); textLine.x = 30 . textLine.y = 30 . addChild(textLine); textLine.addEventListener("mouseOut", mouseOutHandler); textLine.addEventListener("mouseOver", mouseOverHandler); textLine.addEventListener("click", clickHandler); } private function mouseOverHandler(event:MouseEvent):void { Mouse.cursor = "button"; } private function mouseOutHandler(event:MouseEvent):void { Mouse.cursor = "arrow"; } function clickHandler(event:MouseEvent):void { if(textBlock.firstLine) removeChild(textBlock.firstLine);

var新模式: ElementFormat = textBoxBlock(content.elementFormat.clone();  
switch (newFormat.color)  
{  
    case 0x000000:  
       新模式.color = 0xFF0000;  
        break;  
    case 0xFF0000:  
       新模式.color = 0x00FF00;  
        break;  
    case 0x00FF00:  
       新模式.color = 0x0000FF;  
        break;  
    case 0x0000FF:  
       新模式.color = 0x000000;  
        break;  
}  
textBlock(content.elementFormat =新模式);  
createLine(textBlock);

Copie miroir d'événements

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

Vous pouvez également matérialiser les événements d'un bloc de texte (ou d'une portion d'un bloc de texte) dans un diffuseur d' événements. Vous devez tout d'abord créé une occurrence de EventDispatcher, puis l'affector à la propriété eventMirror d'une occurrence de TextElement. Si le bloc de texte n'est constitué que d'un seul élément de texte, le moteur de saisie effectue une copie miroir des événements pour l'intégrality du bloc de texte. Si le bloc de texte est constitué de plusieurs éléments de texte, le moteur de saisie effectue une copie miroir des événements uniquement pour les occurrences de TextElement dont la propriété eventMirror est définie. Dans l'exemple suivant, le texte est constitué de trois éléments : le mot « Click», le mot « here » et la chaine « to see me in italic ». L'exemple affecte un diffuseur d' événements au deuxième élément de texte, le mot « here», et ajoute un écouteur d' événement, la méthode clickHandler(). La méthode clickHandler() met le texte en italique. Elle modifie également le contenu du troisième élément de texte et le remplace par la chaine suivante : « Click here to see me in normal font! »

package
{ import flash.text.engine.*; import flash.ui.Mouse; import flash.display.Sprite; import flash.events.MouseEvent; import flash.events.EventDispatcher; public class EventMirrorExample extends Sprite { var fontDescription:FontDescription new FontDescription("Helvetica", "bold"); var format:ElementFormat = new ElementFormat(fontDescription, 18); var textElement1 = new TextElement("Click ", format); var textElement2 = new TextElement("here ", format); var textElement3 = new TextElement("to see me in italic! ", format); var textBlock:TextBlock new TextBlock(); public function EventMirrorExample() { var myEvent:EventDispatcher new EventDispatcher(); myEvent.addEventListener("click", clickHandler); myEvent.addEventListener("mouseOut", mouseOutHandler); myEvent.addEventListener("mouseOver", mouseOverHandler); textElement2.eventMirror myEvent; var groupVector:Vector. new Vector.; groupVector.push(textElement1, textElement2, textElement3); var groupElement:GroupElement new GroupElement(groupVector); textBlock(content groupElement; createLines(textBlock); } private function clickHandler(event:MouseEvent):void { var newFont:FontDescription new FontDescription(); newFont.FontWeight "bold"; var newFormat:ElementFormat new FontDescription(); newFont.FontSize 18; if(textElement3.text = = "to see me in italic! ") { newFont.FontPosture FontPosture.ITALIC; textElement3.replaceText(0,21,"to see me in normal font!"); } else { newFont.FontPosture FontPosture.NORMAL; textElement3.replaceText(0,26,"to see me in italic!"); } newFormat-fontDescription newFont; textElement1.elementFormat newFormat; textElement2.elementFormat newFormat; textElement3.elementFormat newFormat; createLines(textBlock); }

private function mouseOverHandler(event:事故发生):void { Mouse.cursor = "button"; } private function mouseOutHandler(event:事故发生):void { Mouse.cursor = "arrow"; } private function createLines(textBlock:StringBlock):void { if(textBlock.firstLine) removeChild(textBlock.firstLine); var textLine:StringLine = textBlock.createTextLine(null, 300); textLine.x = 15; textLine.y = 20; addChild(textLine); } } 

Grâce aux fonctions mouseOverHandler() et mouseOutHandler(), le CURSEUR prend la forme d'un bouton lorsqu'il est placé sur le mot « here » et reprend la forme d'une flèche lorsqu'il ne l'est pas.

Mise en forme du texte

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

Un objet TextBlock est un objet usine pour la création de lignes de texte. Le contenu d'un objet TextBlock est affecté via l'objet TextElement. Un objet ElementFormat gère la mise en forme du texte. La classe ElementFormat définit certaines propriétés, telles que l'alignement sur la ligne de base, le crénage, l'interlettrage, la rotation du texte, la taille et la couleur des polices, ainsi que la casse. Elle comprend également la méthode FontDescription, déscribe en detail à la section « Utilisation des polices » à la page 422.

Utilisation de l'objet ElementFormat

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

Le constructeur de l'objet ElementFormat prend des nombreux paramètres facultatifs, dont FontDescription. Vous pouvez également définir ces propriétés en dehors du constructeur. L'exemple suivant illustre la relation des différents objets lors de la définition et de l'affichage d'une ligne de texte simple :

package
{ import flash.display.Sprite; import flash.text.*; public class ElementFormatExample extends Sprite { private var tb:TextBlock = new TextBlock(); private var te:Element; private var ef:ElementFormat; private var fd:FontDescription new FontDescription(); private var str:String; private var tl:TextLine; public function ElementFormatExample() { fd(fontName "Garamond"; ef = new ElementFormat(fd); ef.FontSize = 30 . ef.color = 0xFF0000 . str = "This is flash text"; te = new TextElement(str,ef); tb(content = te; tl = tb.createTextLine(null,600); addChild(t1); } }

Couleur de police et transparence (alpha)

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

La propriété color de l'objet ElementFormat définit la couleur de police. La valeur est un entier représentant les composants RVB de la couleur, par exemple : 0xFF000 pour le rouge et 0x00FF00 pour le vert. La valeur par defaulted est noir (0x000000).

La propriété alpha définit la valeur de transparence alpha d'un élément (TextElement et GraphicElement). La plage des valeurs est comprise entre 0 (complètement transparent) et 1 (complètement opaque), qui est la valeur par défaut. Les éléments dont la propriété alpha est de 0 sont invisibles, mais restent actifs. Cette valeur est multipliee par l'une des valeurs alpha heritees, ce qui rend l'element plus transparent.

var ef:ElementFormat = new ElementFormat();  
ef.alpha = 0.8;  
ef.color = 0x999999; 

Alignement et décalage de la ligne de base

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

La police et la taille du plus grand texte dans une ligne déterminent sa ligne de base dominante. Vous pouvez écraser ces valeurs en définissant TextBlock~-baselineFontDescription et TextBlock~-baselineFontSize. Vous pouvez aligner la ligne de base dominante sur l'une des lignes de bases du texte, à savoir la ligne ascendante, la ligne descendante, ou la ligne de base idéographique supérieure, centrale ou inférieure.

ADOBE ACTIONSCRIPT 3.0 - Alignement et décalage de la ligne de base - 1
A. Ascendante B. Ligne de base C. Descendante D. Hauteur-x

Dans l'objet ElementFormat, trois propriétés déterminent la ligne de base et les caractéristiques d'alignement. La propriété alignementBaseline définit la ligne de base principale d'un objet TextElement ou GraphicElement. Cette ligne de base est la ligne « d'accrochage » .de l'élement, et c'est à cette position que la ligne de base dominante du texte s'aligne.

La propriété dominantBaseline indique la ligne de base de l'objet à utiliser, qui déterminé la position verticale de l'objet sur la ligne. La valeur par défaut est TextBaseline.ROMAN, mais vous pouvez également stipuler que la ligne de base IDEOGRAPHIC_TOP ou IDEOGRAPHIC_bottom doit être dominante.

La propriété baselinenShift déplace la ligne de base selon un nombre de pixels définir sur l'axe y. Dans un texte normal (aucune rotation), une valeur positive déplace la ligne de base vers le bas et une valeur négative la déplace vers le haut.

Casse typographique

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

La propriété TypographicCase de l'objet ElementFormat spécifique la casse du texte : majuscule, minuscule ou petites capitales.

var ef_Upper:ElementFormat = new ElementFormat();  
ef_Upper.typographicCase = TypographicCase.UPPERCASE; 
var ef_SmallCaps:ElementFormat = new ElementFormat();  
ef_SmallCaps.typographicCase = TypographicCase.SMALL_CAPS; 

Rotation du texte

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

Voussoupiez appliquer une rotation au bloc de texte ou aux glyphs d'un segment de texte par incréments de 90^ .La classe TextRotation définit les constantes suivantes pourdéfinir la rotation du bloc de texte et des glyphs:

ConstanteValeurDescription
AUTO“auto”Spécifie une rotation vers la gauche de 90 degrés. Généralement utilisée avec un texte asiatique vertical pour faire pivoter uniquement les glyphs auxquelles il est nécessaire d'appliquer une rotation.
ROTATE_0“rotate_0”Spécifie aucune rotation.
ROTATE_180“rotate_180”Spécifie une rotation de 180 degrés.
ROTATE_270“rotate_270”Spécifie une rotation de 270 degrés.
ROTATE_90“rotate_90”Spécifie une rotation vers la droite de 90 degrés.

Pour appliquer une rotation aux lignes d'un texte, définiSEEz tout d'abord la propriete TextBlock.lineRotation avant d'appler la methode TextBlock.createTextLine() pour creer la ligne de texte.

Pour appliquer une rotation aux glyphs dans un bloc de texte ou un segment, définiSEE la propriete

ElementFormat.textRotation sur le nombre de degrés de rotation des glyphs souhaité. Une glyphe est la forme qui constitue un caractère, ou une partie d'un caractère qui consiste en plusieurs glyphs. La lecture « a » et le point sur un « i », par exemple, sont des glyphs.

La rotation des glyphs est importante dans certaines langues asiatiques, notamment si vous souhaitez appliquer une rotation verticale aux lignes, mais ne pas appliquer de rotation aux caractères dans les lignes. Pour plus d'informations sur la rotation du texte asiatique, voir « Justification du texte asiatique » à la page 426.

Voici un exemple de rotation du texte et des glyphs qu'il contient dans un texte asiatique : Cet exemple utilise également une police japonaise :

package
{ import flash.display.Sprite; import flash.text.*; public class RotationExample extends Sprite { private var tb:TextBlock = new TextBlock(); private var te:Element; private var ef:ElementFormat; private var fd:FontDescription = new FontDescription(); private var str:String; private var tl:TextLine; public function RotationExample() { fd(fontName = "MS Mincho"; ef = new ElementFormat(fd); ef.textRotation = TextRotation.AUTO; str = "This is rotated Japanese text"; te = new TextElement(str,ef); tb.lineRotation = TextRotation.ROTATE_90; tb(content = te; tl = tb.createTextLine(null,600); addChild(t1); } 1

Verrouillage et clonage d'un objet ElementFormat

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

Lorsqu'un objet ElementFormat est affecté à un type de ContentElement, sa propriété locked est automatiquement définie sur true. Tout tentative de modification d'un objet ElementFormat verrouillé renvoie une erreur IllegalOperationError. La meilleure praticque consiste à définir complètement ce type d'objet avant de l'affector à l'occurrence de TextElement.

Si vous souhaitez modifier une occurrence de ElementFormat existante, vous doivent tout d'abord vérifier sa propriété locked. Si elle est définie sur true, utilisez la méthode clone() pour creer une copie déverrouillée de l'objet. Vous pouvez modifier les propriétés de cet objet déverrouillé, puis l'affector à l'occurrence de TextElement. Toute nouvelle ligne créé à partir de cet objet adopte la nouvelle mise en forme. Les lignes précédentes créées à partir de cet objet et utilisant l'ancienne mise en forme ne sont pas modifiées.

package
{ import flash.display.Sprite; import flash.text.*; public class ElementFormatCloneExample extends Sprite { private var tb:TextBlock = new TextBlock(); private var te:Element; private var ef1:ElementFormat; private var ef2:ElementFormat; private var fd:FontDescription = new FontDescription(); public function ElementFormatCloneExample() { fd.FontName = "Garamond"; ef1 = new ElementFormat(fd); ef1.FontSize = 24 var str:String = "This is flash text"; te = new TextElement(str,ef); tb(content te; var tx1:TextLine = tb.createTextLine(null,600); addChild(tx1); ef2 = (ef1.locked)?ef1.clone():ef1; ef2.FontSize = 32 tb(content.elementFormat ef2; var tx2:TextLine = tb.createTextLine(null,600); addChild(tx2); } }

Utilisation des polices

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

L'objet FontDescription est utilisé avec l'occurrence de ElementFormat pour identifier une police et définir certaines de ses caractéristiques. Ces caractéristiques incluent le nom de la police, le poids, la position, le rendu et la méthode de recherche de la police (police de périphérique/police intégrée).

Remarque: FTE ne prend pas en charge les polices Type 1 ou les polices bitmap, telles que Type 3, ATC, CID ou CID basées sur SFNT.

Définition des caractéristiques des polices (objet FontDescription)

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

La propriété fontName de l'objet FontDescription peut être un nom unique ou une liste de noms séparés par des virgules. Par exemple, dans une liste telle que « Arial, Helvetica, _sans », Text Engine recherche tout d'abord « Arial », puis « Helvetica » et finalement « _sans » s'il ne parvient pas à tracer les deux premières polices. La définition des noms de police comprend trois noms de police générées : « _sans », « _serif » et « _typewriter ». Ces noms correspondant à des polices de périphérique spécifique, selon le système de lecture. Il est judiciaux de spécifique ce type de noms par défaut dans toutes les descriptions de police qui utilisent des polices de périphérique. Si la propriété fontName n'est pas spécifique, « _serif » est utilisé comme nom par défaut.

La propriété fontPosture peut être définie sur la valeur par défaut (FontPosture.NORMAL) ou en italique (FontPosture.ITALIC). La propriété fontWeight peut être définie sur la valeur par défaut (FontWeight.NORMAL) ou en caractères gras (FontWeight.BOLD).

var fd1:FontDescription = new FontDescription();  
fd1.getName = "Arial, Helvetica, _sans";  
fd1.FontPosture = FontPosture.NORMAL;  
fd1.FontWeight = FontWeight.BOLD; 

Polices intégrées ou polices de périphérique?

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

La propriété fontLookup de l'objet FontDescription indique si Text Engine recherche une police de péripérisque ou une police intégrée pour rendre le texte. Si une police de péripérisque (FontLookup.DEVICE) est spécifiée, le moteur d'exécution recherche la police sur le système de lecture. Si vous définissez une police intégrée

(FontLookup. EMBEDDED_CFF), le moteur d'exécution recherche une police de ce type portant le nom indiqué dans le fichier SWF. Seules les polices CFF (Compact Font Format) intégrées utilisent ce paramètre. Si la police spécifique est introuvable, une police de périphérique est utilisé.

Les polices de périphérique donnent lieu à des fichiers SWF moins volumineux. Les polices intégrées garantissent une plus grande homogénéité d'une plate-forme à l'autre.

var fd1:FontDescription = new FontDescription();  
fd1.FontLookup = FontLookup.EMBEDDED_CFF;  
fd1.getName = "Garamond, _serial"; 

Mode de rendu et repères

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

Le rendu CFF (Compact Font Format) est disponible à partir de Flash Player 10 et Adobe AIR 1.5. Ce type de rendu de police permet une meilleure lisibilité du texte et un affichage optimisé des caractères de petite taille. Ce paramètre s'applique uniquement aux polices intégrées. La valeur par défaut de FontDescription correspond à ce paramètre (RenderingMode.CFF) pour la propriété renderingMode. Vous pouvez définir cette propriété sur

RenderingMode.NORMAL afin qu'elle corresponde au type de rendu utilisé par Flash Player 7 ou versions antérieures.

Lorsque le rendu CFF est selectionné, une deuxième propriété, cffHinting, permet de contrôler la manière dont les corps horizontally d'une police sont adaptés à la grille de sous-pixels. La valeur par défaut,

CFFHinting.HORIZONTAL_STEM, utilise les repères CFF. Si vous définissez cette propriété sur CFFHinting.NONE, les repères sont supprimés. Ce paramètre convient pour les animations ou les grandes tailles de police.

var fd1:FontDescription = new FontDescription();

fd1.renderingMode = RenderingMode.CFF;

Verrouillage et clonage d'un objet FontDescription

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

Lorsque vous affectez une occurrence de ElementFormat à un objet FontDescription, la propriété locked de ce dernier est automatiquement définie sur true. Toute tentative de modification d'un objet FontDescription verrouillé renvoie une erreur IllegalOperationError. La meilleure praticque consiste à définir complètement ce type dobjet avant de l'affector à l'occurrence de ElementFormat.

Si vous souhaitez modifier un objet FontDescription existant, vous devez tout d'abord vérifier sa propriété locked. Si elle est définié sur true, utilisez la méthode clone() pour creer une copie déverrouillée de l'objet. Vous pouze modifier les propriétés de cet objet déverrouillé, puis l'affector à ElementFormat. Toute nouvelle ligne créé à partir de ce TextElement adopte la nouvelle mise en forme. Les lignes précédentes créées à partir de ce même objet restent inchangées.

package
{ import flash.display.Sprite; import flash.text.*; public class FontDescriptionCloneExample extends Sprite { private var tb:TextBlock = new TextBlock(); private var te:Element; private var ef1:ElementFormat; private var ef2:ElementFormat; private var fd1:FontDescription new FontDescription(); private var fd2:FontDescription; public function FontDescriptionCloneExample() { fd1 denomin "Garamond"; ef1 = new ElementFormat(fd); var str:String "This is flash text"; te = new TextElement(str,ef); tb(content te; var tx1:TextLine tb.createTextLine(null,600); addChild(tx1); fd2 = (fd1.locked)? fd1.clone():fd1; fd2 denomin "Arial"; ef2 = (ef1.locked)? ef1.clone():ef1; ef2:xfDescription fd2; tb(content:xermentFormat ef2; var tx2:TextLine tb.createTextLine(null,600); addChild(tx2); } 1

Contrôle du texte

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

FTE you propose an ensemble de commandes de mise en forme du texte afin de gérer la justification et l'espacement des caractères (crénage et interlettrage). Il existe également des propriétés permettant de détecter les lignes brises et de définir des taquets de tabulation dans les lignes.

Justification du texte

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

En ajustant l'espacement entre les mots, et parfois entre les lettres, toutes les lignes d'un paragraphe possedent une longueur identique. Bien que l'espacement entre les mots et les lettres varie, le texte est aligné des deux côtes. Les colonnes de texte dans les journaux et les magazines sont le plus souvent justifiées.

La propriété lineJustification de la classe SpaceJustifier vous permet de contrôler la justification des lignes dans un bloc de texte. La classe LineJustification définit des constantes en vue de spécifier une option de justification : ALL_BUT_LAST justifie tout le texte, à l'exception de la dernière ligne ; ALL INCLUDING LAST justifie tout le texte, y compris la dernière ligne ; l'options par défaut, UNJUSTIFIED, ne justifie pas le texte.

Pour justifier le texte, définièsez la propriétélineJustification sur une occurrence de la classe SpaceJustifier, puis affectez celle-ci à la propriété textJustifier d'une occurrence de TextBlock. L'exemple suivant créé un paragraphe dans lequel la totalité du texte est justifiée, à l'exception de la dernière ligne.

package
{ import flash.text.engine.*; import flash.display.Sprite; public class JustifyExample extends Sprite { public function JustifyExample() { var str:String = "Lorem ipsum dolor sit amet, consectetur adipisicng elit, " ^+ "sed do eismod tempor incidunt ut labore et dolore magna aliqua. Ut " ^+ "enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut " ^+ "aliquip ex ea commodo consecuat."; var format:ElementFormat new ElementFormat(); var textElement:TextElement new TextElement(str,format); var spaceJustifier:SpaceJustifier new
SpaceJustifier("en",LineJustification.ALL BUT LAST); var textBlock:TextBlock new TextBlock(); textBlock(content textElement; textBlock.textJustifier spaceJustifier; createLines(textBlock); } private function createLines(textBlock:TextBlock):void { var yPos = 20 . var textLine:TextLine textBlock.createTextLine(null,150); while (textLine) { addChild(textLine); textLine.x = 15 . yPos + = textLine.textHeight +2 ; textLine.y=yPos; textLine textBlock.createTextLine(textLine,150); } } }

Pour varier l'espacement entre les lettres et entre les mots, définissez la propriété SpaceJustifier. letterspacing sur true. L'activation de l'espacement entre les lettres peut réduire le nombre d'espaces disgracieux entre les mots, qui se produit parfois lors d'une simple justification.

Justification du texte asiatique

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

Pour justifier un texte asiatique, il faut tenir compte d'autres considérations. Le texte peut être écrit de haut en haut et certains caractères appelés kinsoku ne peuvent pas apparaitre au début ou à la fin d'une ligne. La classe JustificationStyle définit les constantes suivantes, qui spécifique les options de gestion de ces caractères.

PRIORITIZE_LEAST_ADJUSTMENT base la justification sur l'expansion ou sur la compression de la ligne, en fonction de cette qui produit lesassageurs résultats. PUSH_IN_KINSOKU base la justification sur la compression des caractères kinsoku à la fin de la ligne, ou sur l'expansion de la ligne s'il n'existe aucun caractère kinsoku ou si cet espace est insuffisant.

PUSH_OUT_ONLY base la justification sur l'expansion de la ligne. Pour creer un bloc de texte asiatique vertical, definissez la propriete TextBlock.lineRotation sur TextRotation.ROTATE_90, puis definissez la propriete

ElementFormat.textRotation sur TextRotation.AUTO (paramètre par défaut). Si vous définisse la propriété textRotation sur AUTO, les glyphs dans le texte restent verticales au lieu de pivoter sur le côté lors de la rotation de la ligne. Le paramètre AUTO effectue une rotation vers la gauche de 90^ pour les glyphs complètes uniquement, comme le spécifique les propriétés Unicode de la glyphe. L'exemple suivant affiche un bloc de texte japonais vertical et le juste à l'aide de l'option PUSH_IN_KINSOKU.

package
{ import flash.text.engine.*; import flash.displayStage; import flash.display.Sprite; import flash.system.Capabilities; public class EastAsianJustifyExample extends Sprite { public function EastAsianJustifyExample() { var Japanese_text:String = String.fromCharCode( 0x5185,0x95A3,0x5E9C,0x304C,0x300C,0x653F,0x5E9C,0x30A4, 0x30F3,0x30BF,0x30FC,0x30CD,0x30C3,0x30C8,0x30C6,0x30EC, 0x30D3,0x300D,0x306E,0x52D5,0x753B,0x914D,0x4FE1,0x5411, 0x3051,0x306B,0x30A2,0x30C9,0x30D3,0x30B7,0x30B9,0x30C6, 0x30E0,0x30BA,0x793E,0x306E) var textBlock:TextBlock = new TextBlock(); var font:FontDescription = new FontDescription(); var format:ElementFormat = new ElementFormat(); format.FontSize = 12 . format.color = 0xCC0000 . format.textRotation = TextRotation.AUTO; textBlock.baseZero = TextBaseline.IDEOGRAPHIC_CENTER; var eastAsianJustifier:EastAsianJustifier = new EastAsianJustifier("ja", LineJustification.ALL BUT LAST); eastAsianJustifier.justificationStyle = JustificationStyle.PUSH_IN_KINSOKU; textBlock.textJustifier = eastAsianJustifier; textBlock.lineRotation = TextRotation.ROTATE_90; var linePosition:Number = this stage.sizeWidth - 75; if (Capabilities.os.search("Mac OS") > -1) // set fontName: Kozuka Mincho Pro R

font.FontName = String.fromCharCode(0x5C0F, 0x585A, 0x660E, 0x671D) + "Pro R");
else
    font.FontName = "Kozuka Mincho Pro R";
textBlock(content = new TextView(Japaneseertext, format);
var previousLine:TextLine = null;
while (true)
{
    var textLine:TextLine = textBlock.createTextLine(previously, 200);
    if (textLine == null)
        break;
    textLine.y = 20;
    textLine.x = linePosition;
    linePosition -= 25;
    addChild(textLine);
    previousLine = textLine;
} 

Crénage et interlettrage

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

Le créage et l'interlettrage influent sur la distance entre les paires de caractères adjacentes dans un bloc de texte. Le créage contrôle la manière dont les paires de caractères s'assemblent, notamment les paires « WA » ou « Va ». Il est définis dans l'objet ElementFormat. Par défaut, cet effet est activé (Kerning.ON) ; il peut être régle sur OFF ou AUTO, auquel cas le créage n'est appliqué qu'entre les caractères autres que Kanji, Hiragana ou Katakana.

L'interlettrage ajoute ou soustrait un nombre de pixels défini entre les caractères dans un bloc de texte ; cet effet est également définir dans l'objet ElementFormat. L'interlettrage fonctionne avec les polices intégrées et les polices de péripérisque. FTE prend en charge deux propriétés d'interlettrage : trackingLeft, qui ajoute ou soustrait des pixels à gauche d'un caractère, et trackingRight, qui ajoute ou soustrait des pixels à droite d'un caractère. Si vous utilisez le crénage, la valeur d'interlettrage est ajoutée aux valeurs de crénage ou soustraite des valeurs de crénage de chaque paire de caractères.

ADOBE ACTIONSCRIPT 3.0 - Crénage et interlettrage - 1
A. Kerning.OFF B. TrackingRight = 5 , Kerning.OFF C. TrackingRight = -5 , Kerning.OFF D. Kerning.ON E. TrackingRight = -5 , Kerning.ON F. TrackingRight = -5 , Kerning.ON

var ef1:ElementFormat = new ElementFormat();  
ef1.kenning = Kerning.OFF;  
var ef2:ElementFormat = new ElementFormat();  
ef2.kenning = Kerning.ON;  
ef2.trackingLeft = 0.8;  
ef2.trackingRight = 0.8;  
var ef3:ElementFormat = new ElementFormat();  
ef3.trackingRight = -0.2; 

Texte avec retard à la ligne automatique

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

La propriété breakOpportunity de l'objet ElementFormat indique les caractères pouvant être utilisés pour le renvoi lorsque le texte est renvoyé sur plusieurs lignes. La valeur par défaut, BreakOpportunity.AUTO, utilise les propriétés Unicode standard, telles que le saut entre les mots et sur les traits d'union. Le paramètre BreakOpportunity.ALL permet de considérer un caractère comme une opportunité de saut de ligne, ce qui est très utile lors de la création d'effets, tels que le texte le long d'un trace.

var ef:ElementFormat = new ElementFormat();  
ef.breakOpportunity = BreakOpportunity.ALL; 

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

Pour définir des taquets de tabulation dans un bloc de texte, définièsez les taquets de tabulation en créé des occurrences de la classe TabStop. Les paramètres du constructeur TabStop() indiquent la méthode d'alignement du texte avec le taquet de tabulation. Ces paramètres indiquent la position du taquet de tabulation, et pour l'alignement decimal, la valeur d'alignement, exprimée sous forme de châte. En général, cette valeur est un point decimal, mais elle pourrait également être une virgule ou le symbole du dollar, du yen ou de l'euro, par exemple. La ligne de code suivante create un taquet de tabulation appelé tab1.

var tab1:TabStop = new TabStop(TabAlignment.DECIMAL, 50, ".")); 

Après avoir créé les taquets de tabulation d'un bloc de texte, affectez-les à la propriété tabStops d'une occurrence de TextBlock. Etant donné que la propriété tabStops nécessite un vecteur, créez tout d'abord un vecteur, puis ajoutez la tabulation pour l'arrête. Le vecteur vous permet d'affector un ensemble de taquets de tabulation au bloc de texte. L'exemple suivant créé une occurrencie de Vector et lui ajoute un ensemble d'objects TabStop. Affectez ensuite les taquets de tabulation à la propriété tabStops d'une occurrence de TextBlock.

var tabStops:Vector.<TabStop> = new Vector.<TabStop>();  
tabStops.push(table1, tab2, tab3, tab4);  
textBlock.tabStops = tabStops 

Pour plus d'informations sur les vecteurs, voir « Utilisation de tableaux » à la page 25.

L'exemple suivant illustrer l'effect de chacune des options d'alignement de l'objet TabStop.

package {
import flash.text.engine.*;
import flash.display.Sprite;
public class TabStopExample extends Sprite { public function TabStopExample() { var format: ElementFormat = new ElementFormat(); format fontDescription = new FontDescription("Arial"); format.size = 16; var tabStops:Vector. = new Vector.(); tabStops.push( new TabStop(TabAlignment.START, 20), new TabStop(TabAlignment.CENTER, 140), new TabStop(TabAlignment.DECIMAL, 260, "."), new TabStop(TabAlignment.END, 380)); var textBlock.TextBlock = new TextBlock(); textBlock(content = new TextElement( "\tt1\tt2\tt3\tt4\n" + "\tThis line aligns on 1st tab\n" + "\t\t\t\tThis is the end\n" + "\tThe following fragment centers on the 2nd tab:\t\t\n" + "\t\tit's on me\t\t\n" + "\tThe following amounts align on the decimal point:\n" + "\t\t45.00\t\n" + "\t\t75,320.00\t\n" + "\t\t6,950.00\t\n" + "\t\t7.01\t\n", format);
textBlock.tabStops = tabStops; var yPosition:Number = 60; var previousTextLine:TextLine = null; var textLine:TextLine; var i:int; for (i = 0;i < 10;i++) { textBox = textBox.createTextLinepreviousTextLine,1000,0); textBox.x = 20 ; textBox.y = yPosition; addChild(textLine); yPosition + = 25 . previousTextLine = textLine; } } }

Exemple d'utilisation de Flash Text Engine : mise en forme d'un article de journal

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

Cet exemple de code illustrate l'utilisation de FTE (Flash Text Engine) pourmettre en forme une page de journal simple.

Cette page comprend un gros titre, un sous-titre et une section sur plusieurs colonnes.

Creez d'abord un fichier FLA et rattachez le code suivant au cadre ^ 2 de la couche par défaut :

import com.example.programmingas3.newlayout STORYLayout; // frame sc ript - create a 3-columnned arti cle layout  
var story: StoryLayout = new StoryLayout(720, 500, 3, 10);  
story.x = 20;  
story.y = 80;  
addChild/story);  
stop(); 

Dans cet exemple, StoryLayout.as est le script contrôleur. Il définit le contenu, lit les informations de style issues d'une feuille de style externe et les affecte aux objets ElementFormat. Il create ensuite le gros titre, le sous-titre et les éléments de texte sur plusieurs colonnes.

package com.example(programmingas3新的一layout   
{ import flash.display.Sprite; import flash.text/styleSheet; import flash.text.engine.\*; import flash.events.Event; import flash.net URLsRequest; import flash.net URLsLoader; import flash.display.Sprite; import flash.display.Graphics; public class StoryLayout extends Sprite { public var headlineTxt:HeadlineTextField; public var subtitleTxt:HeadlineTextField; public var storyTxt:MultiColumnText; public var sheet:StyleSheet; public var h1_ElFormat:ElementFormat; public var h2_ElFormat:ElementFormat; public var p_ElFormat:ElementFormat; private var loader:URLLoader; public var paddingLeft:Number; public var paddingRight:Number; public var paddingTop:Number; public var paddingBottom:Number; public var preferredWidth:Number; public var preferredHeight:Number; public var numColumns:int; 

public var bgColor:Number = 0xFFFFFF;

public var headline:String = "News Layout Example";

FormattedTextBlock.as est utilisé en tant que classe de base pour la création des blocs de texte. Il comprend également des fonctions permettant de modifier la taille de police et la casse.

package com.example.programmingas3(newslayout
{ import flash.text.engine.*; import flash.display.Sprite; public class FormattedTextBlock extends Sprite { public var tb:TextBlock; private var te:Element; private var ef1:ElementFormat; private var textWidth:int; public var totalTextLines:int; public var blockText:String; public var leading:Number = 1 .25; public var preferredWidth:Number = 720 public var preferredHeight:Number = 100 public function FormattedTextBlock(ef:ElementFormat,text:String,colW:int = 0 ) { this.textWidth = (colW = 0 )?preferredWidth:colW;(blockText txt; ef1 = ef;

tb = new TextBlock(); tb.textJustifier = new SpaceJustifier("en",LineJustification.UNJUSTIFIED,false); te = new TextElement(blockText,thisef1); tb(content = te; this.breakLines();
}
private function breakLines() { var textLine:TextLine null; var y:Number = 0 var lineNum:int = 0 while (textLine tb.createTextLine(textLine, this.textWidth, 0, true)) { textLine.x 0; textLine.y y; y + = this.leading*textLine.height; this.addChild(textLine); } for(var i:int = 0 ;i < this numChildren; i + + 1 { TextLine(this.getChildAt(i)).validity TextLineValidity.STATIC; } this.totalTextLines this numChildren;
}
private function rebreakLines() { this.clearLines(); this.breakLines();
}
private function clearLines() { while(this.numChildren) { this.removeChildAt(0); }

public function不断扩大(size:uint=12):void { if (size > 5) { var ef2:ElementFormat = ef1.clone(); ef2 fontSize = size; te.elementFormat = ef2; this.rebreakLines(); } } public function changeCase(newCase:String = "default"):void { var ef2:ElementFormat = ef1.clone(); ef2.typographicCase = newCase; te.elementFormat = ef2; } } } 

HeadlineTextBlock.as étend la classe FormattedTextBlock et est utilisé pour creer les gros titres. Il contient une fonction destinée à faire tener le texte dans un espace déterminé sur la page.

package com.example.programmingas3newslayout
{ import flash.text.engine.*; public class HeadlineTextField extends FormattedTextBlock { public static var MIN_POINT_SIZE:uint = 6 public static var MAX_POINT_SIZE:uint = 128 public function HeadlineTextField(te:ElementFormat, txt:String,colW:int = 0 } super(te,text); } public function fitText(maxLines:uint = 1 ,targetWidth:Number = -1 ):uint if(targetWidth = -1 } targetWidth = this.width; } var pixelsPerChar:Number = targetWidth/ this.blockText.length; var pointSize:Number = Math.min(MAX_POINT_SIZE, Math.round(pixelsPerChar *1.8*maxLines)); if (pointSize < 6 1 // the point size is too small return pointSize; } this不断扩大(pointSize); if (this.totalTextLines > maxLines)

{ return shrinkText(--pointSize,maxLines); } else { return growText(pointSize,maxLines); } public function growText(pointSize:Number,maxLines:uint = 1 ):Number { if (pointSize MAX_POINT_SIZE) { return pointSize; } this.changeSize(pointSize + 1); if (this.totalTextLines > maxLines) { // set it back to the last size this(changeSize(pointSize); return pointSize; } else { return growText(pointSize + 1,maxLines); } } public function shrinkText(pointSize:Number,maxLines:uint = 1 ):Number { if (pointSize <= MIN_POINT_SIZE) { return pointSize; } this(changeSize(pointSize); if (this.totalTextLines > maxLines) { return shrinkText(pointSize - 1,maxLines); } else { return pointSize; } }

MultiColumnText.as gère la mise en forme du texte dans un format multicolonne. Il illumstre la souplesse d'un objet TextBlock, utilisé comme usine pour creer,mettre en forme et positionner les lignes de texte.

package com.example.programmingas3.newslayout
{ import flash.display.Sprite; import flash.text.engine.*; public class MultiColumnText extends Sprite { private var tb:TextBlock; private var te:TextElement; private var numColumns:uint = 2 . private var gutter:uint = 10 . private var leading:Number = 1.25 private var preferredWidth:Number = 400 private var preferredHeight:Number = 100 private var colWidth:int = 200 public function MultiColumnText(txt:String "",cols:uint = 2 , gutter:uint = 10 ,w:Number = 400 ,h:Number = 100 ef:ElementFormat null):void { this.numColumns Math.max(1, cols); this.gutter Math.max(1,gutter); thispreferredWidth w; thispreferredHeight h; this.setColumnWidth(); var field:FormattedTextBlock new FormattedTextBlock(ef,txt,this.colWidth); var totLines:int field.totalTextLines; field null; var linesPerCol:int Math.ceil(totLines/cols); tb new TextBlock(); te new TextElement(txt,ef); tb(content te; var textLine:TextLine null; var x:Number = 0 . var y:Number = 0 . var i:int = 0 . var j:int = 0 while (textLine tb.createTextLine(textLine,this.colWidth,0,True)) { textLine.x Math.floor(i/(linesPerCol+1))*(this.colWidth+this.gutter); textLine.y y; y+= this.leading*textLine.height;

j++; if(j>linesPerCol) { y = 0 . j = 0 1 } i++; this.addChild(textLine); } } private function setColumnWidth():void { this.colWidth = Math.floor( (thispreferredWidth - ((this.numColumns-1)*this.gutter))/this.numColumns); } } }

Chapitre 23 : Utilisation de Text Layout Framework

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

Présentation de Text Layout Framework

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

Text Layout Framework (TLF) is a bibliography ActionScript evolutive. TLF is based on the mateur texte d'Adobe Flash Player 10 et d'Adobe AIR 1.5. It proposes the functions typographiques et de mise en forme du texte avances qui assure une typographie innovatrice sur le Web. TLF peut être utilisé avec Adobe Flex ou Adobe Flash Professional. Les développpeurs peuvent utiliser ou étrende des composants existants ou faire appel à la structure pour creer leurs propres composants texte.

TLF intégre les fonctionnalités suivantes :

  • Texte bidirectionnel, texte vertical et plus de 30 scripts tels que l'arabe, le chinois, le coréen, l'hébreu, le japonais, le laotien, le thai, le vietnamien, etc.
  • Sélection, modification et distribution du texte sur plusieurs colonnes et conteneurs liés
  • Texte vertical, Tate-Chu-Yoko (texte horizontal placé entre du texte vertical) et justificateur pour la typographie asiatique
  • Contrôles typographiques riches, tels que le crénage, les ligatures, la casse typographique, la casse des chiffres, la largeur des chiffres et les tirets conditionnels
  • Couper, copier, coller, annulation et mouvements de souris et clavier standard de modification
  • API riches de développement destinées à manipuler le contenu, la mise en forme et le balisage de texte, ainsi qu'à créé des composants texte personnalisés
  • Excellente prise en charge des listes, notamment les marques et formats de numérotation personalisés
  • Règles de positionnement et images intégrées

Text Layout Framework est une bibliothèque ActionScript 3.0 basée sur la version de Flash Text Engine (FTE) introduite dans Flash Player 10. Vous pouvez acceder à FTE via le package flash.text.engine, qui fait partie intégrante de l'API (Application Programming Interface) de Flash Player 10.

Toutefois, l'API de Flash Player fournit un accès de bas niveau à FTE, ce qui signifie que certaines tâches nécessités parfois un volume de code relativement important. TLF encapsule le code de bas niveau dans des API simplifiées. Il propose également une architecture conceptuelle qui organise les blocs de construction de base définis par FTE pour former un système convivial.

Contrairement à FTE, TLF n'est pas intégré à Flash Player. Il correspond à une bibliothèque de composants indépendants écrites entièrement en ActionScript 3.0. En raison de l'extensibilité de la structure, il peut être adapté à des environnements déterminés. Flash Professional et le kit de développement (SDK) de Flex contiennent tous deux des composants basés sur la structure TLF.

Voir aussi

Application de marquage TLF "Flow"

Prise en charge des scripts complexes

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

TLF prend en charge les scripts complexes, qui gèrent des fonctionnalités telles que la capacité d'afficher et de modifier les scripts rédigés de droite à gauche. TLF permet également d'afficher et de modifier un mélange de scripts écrites de gauche à droite et de droite à gauche, comme l'arabe et l'hébreu. TLF prend en charge non seulement la mise en forme du texte vertical chinois, coréen et japonais, mais également tate-chu-yoko ( éléments TCY). Les éléments TCY sont des blocs de texte horizontally intégrés à des segments verticaux de texte. Les scripts suivants sont pris en charge :

Latin (anglais, espagnol, français, vietnamien, etc.)
- Arménien, cyrillique, ethiopien, géorgien et grec
Arabe et hebreu
- Ideogrammes Han, Kana (chinois, coreen et japonais) et Hangul Johab (coreen)
Thai, khmer et laotien
Bengali, devanagari, gujarati, gourmoukhhi, kannara, malayalam, oriya, tamoul, telougou et tibétain
- Bouhid, chérokie, deserét, écriture syllabique canadienne, hanounoo, shavian, tagalog, tagbanoua, tifinaghe, vai et yi

Utilisation de Text Layout Framework (TLF) dans Flash Professional et Flex

Voupez creer des composants personalisés dans Flash directement à partir de classes TLF. Flash Professional CS5 intègre en outre une nouvelle classe, fl.text.TLFTextField, qui encapsule la fonctionnalité TLF. La classe TLFTextField permet de creer des champs de texte en ActionScript qui utilisets les fonctions d'affichage de texte avancées de TLF. Créez un objet TLFTextField à l'instar d'un champ de texte par le biais de la classe TextField. Utilisez ensuite la propriété textFlow pour appliquer le formatage avancé à partir des classes de TLF.

Vou puez également creer l'occurrence de TLFTextField sur la scene à l'aide de l'util texte de Flash Professional. Vous pouze alors utiliser ActionScript pour contrôler le formatage et la mise en forme du champ de texte à l'aide de classes TLF. Pour plus d'informations, voir TLFTextField dans le manuel Guide de référence ActionScript 3.0 pour la plate-forme Adobe Flash.

Dans Flex, utilisez les classes TLF. Pour plus d'informations, voir « Utilisation de Text Layout Framework » à la page 441.

Utilisation de Text Layout Framework

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

Si vous travailliez dans Flex ou créez des composants texte personnalisés, faites appel aux classes TLF. TLF est une bibliothèque ActionScript 3.0 entière intégrée à la bibliothèque textLayout.swc. La bibliothèque TLF contient environ 100 classes et interfaces ActionScript 3.0 réparties dans dix packages. Ces packages sont des sous-packages du package flashx.textLayout.

Classes Text Layout Framework

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

Les classes TLF sont regroupées en trois catégories :

  • Classes de formatage et structures de données
  • Classes de rendu
  • Classes d'interaction utiliseur

Classes de formatage et structures de donnéesés

Les packages suivants contiennent les classes de formatage et structures de données de TLF :

  • flashx.textLayoutelements
  • flashx.textLayout.formats
  • flashx.textLayoutconversion

La structure de données principale de TLF correspond à la hierarchie d'enchaînements, définie dans le package d'éléments. Au sein de cette structure, vous pouvez attribuer des styles et attributs à des segments de texte en utilisant le package de formats. Le package de conversion permet de contrôle l'importation et l'exportation du texte dans la structure de données.

Classes de rendu

Les packages suivants contiennent les classes de rendu de TLF :

  • flashx.textLayout.factory
  • flashx.textLayout/container
  • flashx.textLayoutCompose

Les classes de ces packages facilitent le rendu du texte affché par Flash Player. Le package d'usine constitue un moyen simple d'afficher du texte statique. Le package de contueur inclut les classes et les interfaces qui définitent les conteneurs d'affichage du texte dynamique. Le package de composition définit les techniques de positionnement et d'affichage de texte dynamique dans les conteneurs.

Classes d'interaction utilisateur

Les packages suivants contiennent les classes d'interaction utilisateur de TLF :

  • flashx.textLayout_edit
  • flashx.textLayout operations
  • flashx.textLayout.events

Les packages de modification et d'opérations définissant les classes dont vous disposez pour autoriser la modification du texte stocké dans les structures de données. Le package des événements contient les classes de gestion des événements.

Procedure générale de création de texte à l'aide de Text Layout Framework

La procédure suivanté décrit le processus général de création de texte à l'aide de Text Layout Format :

1 Importez du texte formaté dans les structures de données TLF. Pour plus d'informations, voir « Structuration du texte à l'aide de TLF » à la page 446 et « Formatage du texte à l'aide de TLF » à la page 450.

2 Creez un ou plusieurs conteneurs d'objets d'affichage liés destinés au texte. Pour plus d'informations, voir « Gestion des conteneurs de texte à l'aide de TLF » à la page 452.
3 Associez le texte figurant dans les structures de données aux conteneurs et définisse les options de modification et de défillement. Pour plus d'informations, voir « Activation de la sélection, de la modification et de l'annulation de texte à l'aide de TLF » à la page 453.
4 Creez un gestionnaire d'evénement permettant de redistribuer le texte en réponse à des événements de redimensionnement (ou autre). Pour plus d'informations, voir « Gestion des événements à l'aide de TLF » à la page 453.

Example Text Layout Framework : article de journal

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

L'exemple suivant illustrer la mise en forme d'une page de journal simple à l'aide de TLF. Cette page comprend un gros titre, un sous-titre et une section sur plusieurs colonnes :

package   
{ import flash.display.Sprite; import flash.display.StageAlign; import flash.display.StageScaleMode; import flash.events.Event; import flashgeomRectangle; import flashx.layoutcompose.StandardFlowComposer; import flashx.layout/containerContainerController; import flashx.layout/containerScrollPolicy; import flashx.layoutconversion.TextConverter; import flashx.layout-elements.TextFlow; import flashx.layoutFormats.TextLayoutFormat; public class TLFNewsLayout extends Sprite { private var hTextFlow:TextFlow; private var headContainer:Sprite; private var headlineController:ContainerController; private var hContainerFormat:TextLayoutFormat; private var bTextFlow:TextFlow; private var bodyTextContainer:Sprite; private var bodyController:ContainerController; private var bodyTextContainerFormat:TextLayoutFormat; 

La classe TLFNewsLayout utilise deux conteneurs de texte. Le premier affiche un titre et un sous-titre, tandis que le second contient trois colonnes de texte. Pour raison de simplicité, le texte est codé en dur dans l'exemple au format TLF Markup. La variable headlineMarkup contient le titre et le sous-titre, tandis que la variable bodyMarkup contient le corps du texte. Pour plus d'informations sur TLF Markup, voir « Structuration du texte à l'aide de TLF » à la page 446.

Au terme d'une initialisation, la fonction onAddedToStage() imports the title du titre dans un objet TextFlow, qui correspond à la principale structure de données de TLF:

hTextFlow = TextConverter.ImportToFlow(headlineMarkup, TextConverter.TEXT_LAYOUT_format);

Le code suivant permet ensuite de creer un objet Sprite destiné au conteneur, puis de creer un contrôleur et de l'associer au conteneur :

Le contrôleur est initialisé de sorte à définir le formatage, le défilament et autres options. Il contient la géométrie qui définit les limites du conteneur dans lequel est distribué le texte. Un object TextViewFormat contient les options de formatage suivantes :

hContainerFormat = new TextViewFormat();

Le contrôleur est affecté au composéur d'enchaînements et la fonction ajoute le contèur à la liste d'affichage. La composition et l'affichage à proprement parler des contèurs relevant de la méthode resizeHandler(). Une procédure identique permet d'initialiser l'objet TextFlow associé au corps du texte.

La méthode resizeHandler() mesure l'espace disponible pour le rendu des conteneurs et affecte à ces derniers la taille appropriée. Un appel initial de la méthode compose() permet de calculer la hauteur appropriée du contueur de gros titre. La méthode resizeHandler() peut alors placer et afficher le contueur de gros titre par le biais de la méthode updateAllControllers(). Enfin, la méthode resizeHandler() se base sur la taille du contueur de gros titre pour déterminer le positionnement du contueur de corps de texte.

Structuration du texte à l'aide de TLF

TLF représenté le texte sous forme d'arborescence. Chaque nœud de l'arborescence est une occurrence d'une classe définie dans le package d'éléments. Par exemple, le nœud racine de l'arborescence est toujours une occurrence de la classe TextFlow. La class TextFlow représenté un article de texte entier. Un article est un ensemble d'éléments texte ou autre assimilés à une seule unité, appelée enchaimement. Un article unique requiert parfois plusieurs colonnes ou conteneurs de texte pour s'afficher.

Exception faite du nœud racine, les éléments restants sont peu ou prou basés sur des éléments XHTML. Le schéma suivant illustré l'arborescence de la structure :

ADOBE ACTIONSCRIPT 3.0 - Structuration du texte à l'aide de TLF - 1
Arborescence TextFlow

Format TLF Markup

Une maîtrise de la structure de TLF s'avéré également utile lorsque vous utilisez le format TLF Markup. Le format TLF Markup est une représentation XML du texte stocké dans TLF. Bien que la structure prenne également en charge d'autres formats XML, le format TLF Markup est unique, car il est basé spécifique sur la structure de l'arborescence TextFlow. Si vous exportez du code XML à partir d'une arborescence TextFlow à l'aide de ce format de balisage, le code XML est exporté en réserveant sa structure arborescente.

TLF Markup assures the representation of texts plus fidèle dans une arborescence TextFlow. Le langage de balisage associée des balises à chaque élément de base de l'arborescence TextFlow et fournit également des attributs pour toutes les propriétés de formatage intégrées à la classe TextViewFormat.

Le tableau suivant dresse la liste les balises dont vous disposez dans TLF Markup.

ÉlementDescriptionEnfantsClasse
textflowÉlement racine du balisagediv, pTextFlow
divDivision au sein d'un flux TextFlow. Peut contir un groupe de paragraphs.div, list, pDivElement
pParagraphe.a, tcy, span, img, tab, br, gParagraphElement
aLientcy, span, img, tab, br, gLinkElement
tcySegment de texte horizontal (utilisé dans un élément TextFlow vertical)a, span, img, tab, br, gTCYElement
spanSegment de texte au sein d'un paragrapheSpanElement
imgImage dans un paragrapheInlineGraphicElement
tabCaractère de tabulationTabElement
brCaractère de saut. Permet d'arrêtier une ligne au sein d'un paragraphe. Le texte passé à la ligne suivante, mais sans changer de paragraphe.BreakElement
linkNormalFormatDéfinit les attributes de formatage utilisés pour les liens en état normal.TextLayoutFormatTextLayoutFormat
linkActiveFormatDéfinit les attributes de formatage utilisés pour les liens en état actif, c'est-à-dire lorsque l'utiliseur appuie sur un lien avec le bouton de la souris.TextLayoutFormatTextLayoutFormat
linkHoverFormatDéfinit les attributes de formatage utilisés pour les liens en état suspendu, c'est-à-dire lorsque l'utiliseur survole un lien avec la souris.TextLayoutFormatTextLayoutFormat
liComposant d'un élément de liste. Doit résider à l'intérieur d'un élément de liste.div, li, list, pListItemElement
listListe. Les listedes peuvent être imbriquées ou placées les unes à côté des autres. Différents modèles de libellé ou de numérorotation peuvent être appliqués aux éléments de liste.div, li, list, pListItemElement
gÉlement de groupe. Permet de regrouper les éléments dans un paragraphe. Permet d'imbriquer des éléments au-dessous du niveau paragraphe.a, tcy, span, img, tab, br, gSubParagraphGroupElement

Voir aussi

TLF 2.0 Lists Markup (disponible en anglais uniquement)

TLF 2.0 SubParagraphGroupElements andTypeName (disponible en anglais uniquement)

Utilisation des listedes numérotées et des listedes à puce

Les classes ListElement etListItemElement permettent d'ajouter des listedes à puce aux contrôleles de texte. Il est possible d'imbriquer les listedes à puce et de les personneliser en vue d'utiliser plusieurs puces (ou marqueurs), ainsi que la numération automatique et la numération de style contour.

Pour creer des listedans un enchaunement,utilizez la balise < 1 .Voussutilizez ensuite les balises li au sein de la balise < 1 pour chaque element de laiste. La classe ListMarkerFormat permit de personaliser l'aspect des puces.

L'exemple suivant create des listedes simples :

<flow:list paddingRight="24" paddingLeft="24"> <flow:li>Item 1</flow:li> <flow:li>Item 2</flow:li> <flow:li>Item 3</flow:li> </flow:list> 

Comme l'illustrer l'exemple ci-dessous, vous pouvez imbriquer des listedes au sein d'autres listedes :

<flow:list paddingRight="24" paddingLeft="24"> <flow:li>Item 1</flow:li> <flow:list paddingRight="24" paddingLeft="24"> <flow:li>Item 1a</flow:li> <flow:li>Item 1b</flow:li> <flow:li>Item 1c</flow:li> </flow:list> <flow:li>Item 2</flow:li> <flow:li>Item 3</flow:li> </flow:list> 

Pour personneliser le type de marques de la liste, utilisez la propriété listOfStyleType de la classe ListElement. Cette propriété peut posseder n'importe qu'elle valeur définie par la classe ListStyleType (check, circle, decimal et box, par exemple). L'exemple suivant permet de creer des listedes dotées de divers types de marques et d'un incrément de compteur personnelisé:

<flow:list paddingRight="24" paddingLeft="24" styleType="upperAlpha">
    <flow:li>upperAlpha item</flow:li>
    <flow:li>another</flow:li>
    <flow:li>lowerAlpha">
        paddingRight="24" paddingLeft="24" styleType="lowerAlpha">
            <flow:li>lowerAlpha
            item</flow:li>
        </flow:li>another</flow:li>
    </flow:list>
    <flow:list paddingRight="24"
        paddingLeft="24" styleType="upperRoman">
            <flow:li>upperRoman item</flow:li>
        </flow:li>another</flow:li>
    </flow:list>
    <flow:list markerFormat>
        <flow:MarkerFormat>
            <-- -- Increments the list by 2s rather than 1s. -->
            <flow:MarkerFormat counterIncrement="ordered 2"/> </flow:markerFormat>
            <flow:li>lowerRoman item</flow:li>
        </flow:li>another</flow:li>
    </flow:list>
</flow:list markerFormat counterIncrement="ordered 2"/> </flow:markerFormat>
</flow:list markerFormat>
</flow:list markerFormat>
</flow:list markerFormat>
</flow:list markerFormat>
</flow:list markerFormat>
</flow:list markerFormat>
</flow:list markerFormat>
</flow:list markerFormat>
</flow:list markerFormat>
</flow:list markerFormat>
</flow:list markerFormat>
</flow:list markerFormat>
</flow:list markerFormat>
</flow:list markerFormat>
</flow:list markerFormat;
</flow:list markerFormat>
</flow:list markerFormat>
</flow:list markerFormat>
</flow:list markerFormat>
</flow:list markerFormat;
</flow:list markerFormat;
</flow:list markerFormat;
</flow:list markerFormat;
</flow:list markerFormat;
</flow:list markerFormat;
</flow:list markerFormat;
</flow:list markerFormat;
</flow:list markerFormat;
</flow:list markerFormat;
</flow:list markerFormat;
</flow:list markerFormat;
</flow:list markerFormat;
</flow:list markerFormat;
</flow:list markerFormat;
</ flow :Li>lowerRoman item</ flow :li> 

Voussutilize la classe ListMarkerFormat pour definir le compteur.Paralllement à la definition de l'increment d'un compteur, you pouvez personnaliser ce dernier en le reinitialisant à l'aide de la propriété counterReset.

Voupez personaliser plus enore l'aspect des marques de listeda laide des propriétés beforeContent et afterContent de la classe ListMarkerFormat. Ces propriétés s'appliquent au contenu affiché avant et après le content de la marque.

L'exemple suivant ajoute la chaine « XX » avant la marque et la chaine « YY » après ce dernier :

<flow:listSTYLEType="upperRoman" paddingLeft="36" paddingRight="24"> <flow:listsMarkerFormat> <flow:ListsMarkerFormatfontSize="16" beforeContent="XX" afterContent="YY" counterIncrement="ordered -1"/> </flow:listsMarkerFormat> <flow:li>Item 1</flow:li> <flow:li>Item 2</flow:li> <flow:li>Item 3</flow:li> </flow:list> 

La propriété content définit quant à elle d'autres personnalisations du format de la marque. L'exemple suivant illustrer une marque de type chiffre romain en majuscules :

<flow:listLineStyle="disc" paddingLeft="96" paddingRight="24"> <flow:listsMarkerFormat> <flow:listsMarkerFormatfontSize="16" beforeContent="Section" content="counters(ordered,&quot;*&quot;,upperRoman)" afterContent="_:/>} </flow:listsMarkerFormat> <flow:li>Item 1</li> <flow:li>Item 2</li> <flow:li>Item 3</li> </flow:list> 

Comme illustré par l'exemple précédent, la propriété content peut également insérer un suffixe, c'est-à-dire une chaine insérée après la marque, mais avant la propriété afterContent. Pour insérer cette chaine lorsque vous fournissez un contenu XML à l'enchainement, entourez-la d'entities HTML "e;只不过 que de guillements ("")

Voir aussi

TLF 2.0 Lists Markup (disponible en anglais uniquement)

Utilisation de marges dans TLF

Chaque objet FlowElement prend en charge des propriétés de marge destinées à contrôler la position de la zone de contenu de chaque élément, ainsi que l'espace qui sépare les zones de contenu.

La largeur totale d'un élément correspond à la somme de la largeur de son contenu et des propriétés paddingLeft et paddingRight. La hauteur totale d'un élément correspond à la somme de la hauteur de son contenu et des propriétés paddingTop et paddingBottom.

La marge correspond à l'espace qui sépare la cordure du contenu. Les propriétés de marge sont paddingBottom, paddingTop, paddingLeft et paddingRight. Il est possible d'appliquer un replissage à l'objet TextFlow, ainsi qu'aux éléments enfants suivants :

div
img
·li
- list

p

Il est impossible d'appliquer les propriétés de marge aux éléments span.

L'exemple suivant définit les propriétés de marge de l'objet TextFlow :

Les valeurs valides des propriétés de replissage sont un nombre (en pixels), « auto » et « inherit ». La valeur par défaut est « auto », qui signifie que la marge est automatiquement calculée et définie sur 0 pour tous les éléments, à l'exception de ListElement. Pour les objets ListElement, « auto » est défini sur 0, à l'exception du côté début de la liste, qui utilise la valeur de la propriété listAutoPadding. La valeur par défaut de listAutoPadding est de 40, qui donne aux listes un retrait par défaut.

Les propriétés de marge n'héritent par défaut d'aucune valeur. Les valeurs « auto » et « inherit » sont des constantes définies par la classe FormatValue.

Les propriétés de marge peuvent être des valeurs négatives.

Voir aussi

Padding changes in TLF 2.0 (disponible en anglais uniquement)

Formatage du texte à l'aide de TLF

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

Le package flashx.textLayout.formats contient des interfaces et classes qui permettent d'affector des formats à tout objet FlowElement de l'arborescence d'enchaînements. Il existe deux manières d'appliquer le formatage. Vous pouvez affecter individuellement un format donné ou affecter simultanément un groupe de formats par le biais d'un objet de formatage spécial.

L'interface IoceneLayoutFormat rassemble tous les formats susceptibles d'être appliqués à un objet FlowElement. Certains formats s'appliquent à un paragraphe de texte ou conteneur entier mais pas, en toute logique, à des caractères individuels. Ainsi, les formats tels que la justification et les taquets de tabulation s'appliquent à des paragraphs entiers, mais pas à des caractères individuels.

Affectation de formats à une classe FlowElement à l'aide de propriétés

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

Vous pouvez affecter des formats à tout objet FlowElement par le biais de propriétés. La classe FlowElement implémente l'interface ITextLayoutFormat, c'est pourquoi toute sous-classe de la classe FlowElement doit également implémenter cette interface.

Ainsi, le code suivant illustré l'affection de formats individuels à une occurrence de ParagraphElement :

var p:ParagraphElement = new ParagraphElement();  
p.FontSize = 18;  
p.FontFamily = "Arial"; 

Affectation de formats à une classe FlowElement à l'aide de la classe TextViewFormat

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

Vous pouvez appliquer des formats à un objet FlowElement à l'aide de la classe TextViewFormat. Cette classe permet de créé un objet de formatage spécial qui contient toutes les valeurs de formatage requisés. Vous pouvez ensuite affecter cet objet à la propriété.format de n'importe quel objet FlowElement. Les classes TextViewFormat et FlowElement implémentent toutes deux l'interface TextViewFormat. Cette caractéristique garantit que les deux classes contiennent les mêmes propriétés de format.

Pour plus d'informations, voir TextLayoutFormat dans le manuel Guide de referencia ActionScript 3.0 pour la plateforme Adobe Flash.

Héritage des formats

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

Les formats sont hérétés par le biais de l'arborescence d'enchaînements. Si vous affectez une occurrence de TextViewFormat à une occurrence de FlowElement possédant des enfants, la structure déclenché un processus appelé cascade. Dans le cadre d'une cascade, la structure examine de manière récursive chaque nœud de la hierarchie qui hérite de valeurs de l'objet FlowElement. Elle détermine ensuite s'il est nécessaire d'affector les valeurs hérétées à chaque propriété de formatage. La cascade est définie par les règles suivantes :

1 Les valeurs des propriétés sont hérîtées uniquement d'un ancêtre proche (appelez également le parent).
2 Les valeurs des propriétés sont hérétées uniquement si la propriété ne possède aucune valeur (en d'autres termes, la valeur est non définie)..
3 Certains attributs non défiinis n'héritent d'une valeur que si la valeur de l'attribut est définie sur « inherit » ou sur la constante flashx.textLayout.formats.FormatValue.INHERIT.

Par exemple, si vous définisse la valeurfontsize au niveau du flux TextFlow, ce paramètre s'applique à tous les éléments du flux TextFlow. En d'autres mots, les valeurs sont propagatedes en cascade vers le bas de l'arborescence d'enchainements. Vous pouvez cependant replacer la valeur d'un élément donné en lui affectant directement une nouvelle valeur. A titre de contre-exemple, si vous définisse la valeurgroundsColor au niveau TextFlow, les enfants du flux TextFlow n'en hériment pas. La propriété/backgroundColor n'hérite en effet jamais de ses parents au cours d'une cascade. Vous pouvez éviter ce comportement en définissant la propriété/backgroundColor de chaque enfant sur la valeur flashx.textLayout.formats.FormatValue.INHERIT..

Pour plus d'informations, voir TextLayoutFormat dans le manuel Guide de referencia ActionScript 3.0 pour la plateforme Adobe Flash.

Importation et exportation de texte à l'aide de TLF

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

La classe TextConverter du package flashx.layout conversion.* permet d'importer du texte dans TLF et d'en exporter hors de ce dernier. Utilisez cette classe si vous envisagez de charger du texte lors de l'exécution au lieu de le compiler dans le fichier SWF. Cette classe sert également à exporter du texte stocké dans une occurrence de TextFlow dans un objet String ou XML.

Les procédures d'importation et d'exportation sont simples. Il vous suffit d'appeler les méthodes export() ou importToFlow(), qui font toutes deux partie de la classe TextConverter. Ces deux méthodes sont statiques, ce qui signifie que vous les appelez sur la classe TextConverter只不过 que sur une occurrence de cette dernière.

Les classes intégrées au package flashx.textLayoutconversion sont d'une souplesse considérable en ce qui concerne l'emplacement de stockage du texte. Ainsi, si vous stockez le texte dans une base de données, vous pouze l'importer dans la structure pour l'afficher. Grace aux classes du package flashx.textLayout_edit, vous pouze alors modifier le texte et réexporter le texte modifié dans la base de données.

Pour plus d'informations, voir flashx.textLayoutconversion dans le manuel Guide de referrerce ActionScript 3.0 pour la plate-forme Adobe Flash.

Gestion des contenteurs de texte à l'aide de TLF

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

Une fois le texte stocké dans les structures de données TLF, Flash Player peut l'afficher. Le texte stocké dans l'arborescence d'enchainements doit être converti dans un format géré par Flash Player. TLF propose deux méthodes de création d'objets d'affichage à partir d'un enchainement. La première approche, plus simple, est adaptée à l'affichage de texte statique. La seconde, plus complexe, permet de créé du texte dynamique qui peut être sélectionné et modifié. Dans les deux cas, le texte est finalément converti en occurrences de la classe TextLine, qui fait partie du package flash.text.engine de Flash Player 10.

Déciation de texte statique

L'approche simple exploite la classe TextFlowTextLineFactory, qui se trouve dans le package flashx.textLayout.factory. L'avantage de cette approche, hormis sa simplicité, est qu'elle limite l'encombrement mémoire par rapport à l'approche FlowComposer. Il est recommendé d'y faire appel pour le texte statique que l'utilisateur ne doit ni modifier, ni sélectionner, ni faire défilier.

Pour plus d'informations, voir TextFlowTextLineFactory dans le manuel Guide de referencia ActionScript 3.0 pour la plate-forme Adobe Flash.

Creation de texte dynamique et de conteneurs

Un compositeur d'enchainements permet de nouveaux contrôle l'affichage du texte que la classe TextFlowTextLineFactory. Grace à un compositeur d'enchainements, les utilisateurs peuvent, par exemple, selectionner et modifier le texte. Pour plus d'informations, voir « Activation de la seLECTION, de la modification et de l'annulation de texte à l'aide de TLF » à la page 453.

Un compositeur d'enchaînements est une occurrence de la classe StandardFlowComposer du package flashx.textLayoutCompose. Il gère la conversion d'éléments TextFlow en occurrences de TextLine, ainsi que l'insertion de ces occurrences dans un ou plusieurs conteneurs.

ADOBE ACTIONSCRIPT 3.0 - Creation de texte dynamique et de conteneurs - 1
Un composéur IFlowComposer possède un minimum de zéro object ContainerController.

Chaque occurrence de TextFlow possède un objet correspondant qui implèmente l'interface IFlowComposer. Cet objet IFlowComposer est accessible via la propriété TextFlow.flowComposer. Vous pouvez appeler les méthodes définies par l'interface IFlowComposer par le biais de cette propriété. Ces méthodes permettent d'associer le texte à un ou plusieurs conteneurs et de préparer le texte de sorte à l'afficher au sein d'un contueur.

Un contesseur est une occurrence de la classe Sprite, qui est une sous-classe de la classe DisplayObjectContainer. Ces deux classes font partie intégrante de l'API de liste d'affichage Flash Player. Un contesseur est une forme plus avancée du rectangle de selection utilisé par la classe TextLineFactory. A l'instar du rectangle de selection, un contesseur circrightsit la zone dans laquelle s'affichent les occurrences de TextLine. A l'encontre d'un rectangle de selection, à chaque contesseur correspond un objet de « contrôleur ». Le contrôleur gère le défilament, la composition, la liaison, le formatage et la gestion des événements à l'intention d'un contesseur ou d'un ensemble de conteneurs. A chaque contesseur correspond un objet de contrôleur, qui est une occurrence de la classe ContainerController du package flashx.textLayout/container.

Pour afficher du texte, créez unobjet de contrôleur destiné à gérer le conteneur et associez-le au compositer d'enchainements. Une fois le conteneur associé, composez le texte pour pouvoir l'afficher. Les conteneurs gérènt donc deux états, composition et affichage. La composition correspond au processus de conversion du texte issu de l'arborescence d'enchainements en occurrences de TextLine, et de calcul de la position de ces occurrences dans le conteneur. L'affichage correspond au processus de mise à jour de la liste Flash Player.

Pour plus d'informations, voir IFlowComposer, StandardFlowComposer et ContainerController dans le manuel Guide de referencia ActionScript 3.0 pour la plate-forme Adobe Flash.

Activation de la sélection, de la modification et de l'annulation de texte à l'aide de TLF

Flash Player 9.0 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La possibilité de sélectionner ou modifier du texte est contrôle à un niveau de l'enchaînement. Chaque occurrence de la classe TextFlow est associée à un gestionnaire d'interaction. Vous pouvez acceder au gestionnaire d'interaction d'un objet TextFlow par le biais de la propriété TextFlow. interactionManager de ce dernier. Pour activer la selection de texte, affectez une occurrence de la classe SelectionManager à la propriété interactionManager. Pour activer la selection et la modification du texte, affectez une occurrence de la classe EditManager à la place d'une occurrence de la classe SelectionManager. Pour annuler une opération; créez une occurrence de la classe UndoManager et spécifiez en tant qu'argument lorsque vous appelez le constructeur associé à EditManager. La classe UndoManager gère un historique des activités de modification les plus récentes de l'utilisateur et autorise ce dernier à annuler ou rétablier des modifications spécifique. Ces trois classes font partie du package de modification.

Pour plus d'informations, voir SelectionManager, EditManager et UndoManager dans le manuel Guide de referencia ActionScript 3.0 pour la plate-forme Adobe Flash.

Gestion des événements à l'aide de TLF

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

Les objets TextFlow distribuents des événements dans de nombreuses circonstances, à savoir :

  • lors d'un changement de texte ou de mise en forme ;

  • avant le début d'une opération ou après la fin de cette dernière;

  • lors d'un changement d'etat d'un objet FlowElement;
    au terme d'une opération de composition.

Pour plus d'informations, voir flashx.textLayout.events dans le manuel Guide de reférence ActionScript 3.0 pour la plate-forme Adobe Flash.

Voir aussi

TLF FlowElement and LinkElement Events and EventMirrors (disponible en anglais uniquement)

Positionnement des images dans le texte

Pour positionner l'objet InlineGraphicElement dans le texte, vous dispose des propriétés suivantes :

  • Propriété float de la classe InlineGraphicElement
    Propriété clearFloats de la classe FlowElement

La propriété float contrôle le positionnement du graphique et du texte qui l'entoure. La propriété clearFloats contrôle le positionnement des éléments du paragraphe par rapport à l'élement flottant.

Pour contrôler l'emplacement d'une image dans un élément de texte, vous disposez de la propriété float. L'exemple suivant insère une image dans un paragraphe et l'aligne à gauche de sorte que le texte l'habille sur la droite :

Les valeurs valides de la propriété float sont « left », « right », « start », « end » et « none». La classe Float définit ces constantes. La valeur par défaut est « none »

La propriété ClearFloats s'avere utile lorsque vous souhaitez ajuster la position de départ des paragraphs suivants qui habilleraient normalement l'image. Supposons, par exemple, que la largeur d'une image excede celle du premier paragraph. Pour s'assurer que le deuxième paragraph debute après l'image, définiSEEZ la propriete clearFloats.

L'exemple suivant utilise une image dont la hauteur excède celle du texte dans le premier paragraphe. Pour que le deuxième paragraphe débute après l'image dans le bloc de texte, cet exemple définit la propriété clearFloats associée au deuxième paragraphe sur « end »

Les valeurs valides de la propriété ClearFloats sont « left », « right », « end », « start », « none » et « both ». La classe ClearFloats définit ces constantes. Vous pouvez également définir la propriété ClearFloats sur « inherit » (constante définitie par la classe FormatValue). La valeur par défaut est « none »

Voir aussi

TLF Floats (disponible en anglais uniquement)

Chapitre 24 : Utilisation du son

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

ActionScript est donc pour des applications immersives, interactives, et le son est un élément des applications immersives puissant souvent ignoré. Vous pouvez ajouter des effets de son à un jeu video, une réaction acoustique à l'interface utilisateur d'une application, ou même creator un programme qui analyse des fichiers mp3 charges sur Internet, avec du son au cœur de l'application.

Vouss pouvez charger des fichiers audio externes et manipuler l'audio incorpore à un fichier SWF. Vous pouvez contrôler l'audio, créé des représentations visuelles des informations de son et capturer le son du microphone d'un utilisateur.

Voir aussi

Package flash.media

flash.events SampleDataEvent

Principes de base de l'utilisation du son

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Les ordinateurs peuvent capturer et coder l'audio numérique (réprésentation des informations de son de l'ordinateur), le stocker et le recupérer pour le diffuser sur des hauts-parleurs. Il est possible de dire le son à l'aide d'Adobe Flash Player ou Adobe AIR™ et ActionScript.

Lorsque les données audio sont converties au format numérique, elles possèdent différentes caractéristiques (volume du son, son stéreo ou mono). Lorsque vous lisez un son dans ActionScript, vous pouvez régler ces caractéristiques également (augmenter le volume du son ou faire comme s'il provenait d'une certaine direction, par exemple).

Avant de contrôle un son dans ActionScript, les informations de son doivent être chargées dans Flash Player ou AIR. Vous disposez de cinq techniques de chargement des données audio dans Flash Player ou AIR afin de les utiliser avec ActionScript.

  • Vous pouvez charger un fisier audio externe tel qu'un fisier mp3 dans le fisier SWF.
  • Vous pouvez incorporer directement les informations audio dans le fichier SWF lors de sa création.
  • Vous pouvez capturer l'audio à partir d'un microphone connecté à l'ordinateur d'un utilisateur.
  • Vous pouvez diffuser l'audio en continu à partir d'un serveur.
  • Vous pouvez générer et dire l'audio en mode dynamique.

Lorsque you chargez des données audio depuis un fisier de son externe, vous pouvez commencer par dire le début du fisier audio pendant le chargement du reste des données audio.

Meme s'il existe différents formats de fjchier audio utilisés pour coder l'audio numérique, ActionScript 3.0, Flash Player et AIR prennant en charge les fjchiers audio stockés au format mp3. Ils ne peuvent pas charger ni directement des fjchiers audio de formats différents (WAV ou AIFF, par exemple).

Lorsque vous utilisez du son dans ActionScript, vous utilisez probablement plusieurs classes issues du package flash.media. Utilisez la classe Sound pour acceder aux informations audio en chargeant un fjichier audio ou en affectant une fonction à un événement pour échantillonner des données de son, puis en démarrant la lecture. Une fois que vous avez démarré la lecture d'un son, Flash Player et AIR vous permettent d'acceder à un objet SoundChannel. Etant donné qu'un fjichier audio chargeé est un son parmi d'autres que vous lisez sur l'ordinateur d'un utilisateur, chaque son individuel lu utilise son objet SoundChannel ; c'est la sortie combinée de tous les objets SoundChannel mixés qui est lue sur les haut-parleurs de l'ordinateur. Vous utilisez l'occurrence SoundChannel pour contrôle les propriétés du son et arrêté sa lecture. Enfin, si vous souhaitez contrôle l'audio combiné, la classe SoundMixer vous permet de contrôle la sortie mixée.

Voupez ealement utilise dautres classes pour effectuer des taches plus specifiques lorsque you utilise du son dans ActionScript. Pour plus d'informations sur toutes les classes liees au son, voir « Présentation de l'architecture audio » à la page 456.

Concepts important et terminologie

La liste de référence suivante content des termes importantes que vous rencontres peut-être :

Amplitude Distance d'un point sur la courbe audio à partir de la ligne zéro ou d'équilibre.

Débit Quantité de données codées ou diffusées en continu pour chaque seconde d'un fjichier audio. Pour les fjichiers mp3, le débit est généralement exprime en milliers de bits par seconde (kbits/s). Un débit supérieur est souvent synonyme d'une onde acoustique de toute valeur qualité.

Mise en mémoire tampon Réception et stockage de données audio avant leur lecture.

MP3 MPEG-1 Audio Layer 3, ou MP3, est un format de compression audio connu.

Balance horizontale Positionnement d'un signal audio entre les canaux gauche et droit dans un champ acoustique stereo.

Crète Point le plus élevé d'une courbe audio.

Fréquence d'échantillonnage Définit le nombre d'échantillons par seconde extraits d'un signal audio analogue pour creer un signal numérique. La fréquence d'échantillonnage d'un CD audio standard est de 44,1 kHz ou 44 100 échantillons par seconde.

Diffusion en continu Processus consistant à dire les premières sections d'un fichier audio ou video pendant le chargement des dernières sections de ce fichier depuis un serveur.

Volume Intensité d'un son.

Courbe audio Forme d'un graphique des différentes amplitudes d'un signal audio au cours du temps.

Présentation de l'architecture audio

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Vos applications peuvent charger des données audio à partir de cinq sources principales :

Fichiers audio externes charges lors de l'exécution
- Ressources audio incorporees dans le fichier SWF de l'application
- Données audio issues d'un microphone connecté au système de l'utilisateur
- Données audio diffusées en continu depuis une passerelle multimédia telle que Flash Media Server

  • Données audio générées dynamiquement par le biais du gestionnaire d'évenement sampleData

Vou puez charger entiere le sndees audio avant leur lecture, ou bien les dirependant leur chargement.

ActionScript 3.0 prend en charge les fichiers audio stockés au format mp3. Ils ne peuvent pas charger ni directement des fichiers audio de formats différents, tels que WAV ou AIFF. Cependant, à partir de Flash Player 9.0.115.0, les fichiers audio AAC peuvent être charges etlus à l'aide de la classe NetStream. Il s'agit de la même technique que cette utilisée pour le chargement et la lecture de contenu video. Pour plus d'informations sur cette technique, voir « Utilisation de la video » à la page 489.

Vou puez utilise Adobe Flash Professional pour importer des fischiers audio WAV ou AIFF puis les intégrer dans les fischiers SWF de votre application au format mp3. L'util de programmation Flash vous permet également de compresser des fischiers audio intégrés pour réduire leur taille (mais ceci se fait au détriment de la qualité du son). Pour plus d'informations, voir « Importation de sons » dans Utilisation de Flash.

L'architecture audio d'ActionScript 3.0 utilise les classes suivantes dans le package flash.media.

ClasseDescription
flash.media SoundsoundLa classe Sound gère le chargement du son, les propriétés de son de base et lance une lecture audio.
flash.media SoundsoundChannelLorsqu'une application lit un objet Sound, un objet SoundChannel est créé pour contrôler la lecture.L'objet SoundChannel contrôle le volume des canaux de lecture gauche et droit du son. Chaque son lu possède son propre objet SoundChannel.
flash.media SoundsLoaderContextLa classe SoundLoaderContext définit le nombre de secondes de mise en mémoire tampon à utiliser lors du chargement d'un son, et indique si Flash Player ou AIR recherche un fichier de régulation sur le serveur lors du chargement d'un fichier. Un objet SoundLoaderContext est utilisé comme paramètre pour la méthode Sound.load().
flash.media SoundsMixedixerLa classe SoundMixer contrôle les propriétés de lecture et de sécurité de tous lessons dans uneapplication. En effet, plusieurs canaux audio sont mixés au moyen d'un objet SoundMixer commun. Par conséquent, les valeurs de propriété dans l'objet SoundMixer affectent tous les objets SoundChannel en cours de lecture.
flash.media SoundsTransformLa classe SoundTransform contient des valeurs qui contrôle le volume du son et la balance. Vous pouvez appliquer un objet SoundTransform à un objet SoundChannel individuel, à l'objet SoundMixer global, ou à un objet Microphone, entre autres.
flash.media.ID3InfoUn objet ID3Info contient des propriétés qui représentent les informations de métadonnées ID3 souvent stockées dans des fichiers audio mp3.
flash.media.MicrophoneLa classe Microphone représentée un microphone ou un autre périphérique d'entrée de son connecté à l'ordinateur de l'utilisateur. L'entrée audio issue d'un microphone peut être acheminée vers des haut-parleurs locaux ou envoyée à un serveur distant. L'objet Microphone contrôle le gain, la fréquence d'échantillonnage et d'autres caractéristiques de son propre flux de son.
flash.mediaAudioPlaybackModeLa classe AudioPlaybackMode définit les constantes pour la propriété audioPlaybackMode de la classe SoundMixer.

Chaque son charge et lu nécessite sa propre occurrence des classes Sound et SoundChannel. La sortie issue de plusieurs occurrences de SoundChannel est ensuite mixée par la classe SoundMixer globale pendant la lecture.

Les classes Sound, SoundChannel, et SoundMixer ne sont pas utilisées pour les données audio provenant d'un microphone ou d'une transmission de passerelle multimédia en continu (Flash Media Server, par exemple).

Chargement de fichiers audio externes

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Chaque occurrence de la classe Sound permet de charger et de déclencher la lecture d'une ressource audio spécifique. Une application ne peut pas réutiliser un objet Sound pour charger plusieurs sons. Si elle souhaite charger une nouvelle ressource audio, elle doit creer un objet Sound.

Si vous chargez un fisier audio de petite taille (un sonblick associé à un bouton, par exemple), votre application peut creer un objet Sound qui charge automatiquement le fisier audio, comme indiqué ci-dessous :

var req:URLRequest = new URLRequest("click.mp3"); 
var s:Sound = new Soundreq); 

Le constructeur Sound() accepte un objet URLRequest comme premier paramètre. Lorsqu'une valeur pour le paramètre URLRequest est fournie, le nouvel objet Sound commence à charger automatiquement la ressource audio spécifique.

Dans le meilleur des cas, votre application doit surveiller la progression du chargement du son et rechercher les erreurs pendant le chargement. Par exemple, si le son clic est volumineux, il risque de ne pas etre totalement charge lorsque l'utiliseur clique sur le bouton qui déclene le son. Si vous tentez de dire un son non charge, une erreur d'execution risque de se produit. Il est préferable d'attendre la fin du chargement du son avant de permettre aux utilisateurs d'effectuer des actions risquant de lancer la lecture des sons.

Un objet Sound envoie plusieurs événements différents pendant le chargement du son. Notre application peut écouter ces événements pour suivre la progression du chargement et vérifier que le son est complètement chargeant la lecture. Le tableau suivant répertorie les événements pouvant être envoyés par un objet Sound.

EvénementDescription
open (Event. OPEN)Envoyé juste avant le début du chargement du son.
progress (ProgressEvent. PROGRESS)Envoyé régulièrement pendant le chargement du son lorsque des données sont reçues du fichier ou du flux.
id3 (Event. ID3)Envoyé lorsque des données ID3 sont disponibles pour un son mp3.
complete (Event. COMPLETE)Envoyé lorsque toutes les données de la ressource audio ont été chargeés.
ioError (IOErrorEvent. IO_ERROR)Envoyé lorsqu'un fischié audio est introuvable ou lorsque le chargement est interrompu avant la réception de toutes les données audio.

Le code suivant illustré la lecture d'un son après son chargement:

import flash.events.Event;  
import flash.media&Sound;  
import flash.net(URLReques 

var s:Sound = new Sound();
s.addEventListener(Event.COMPLET, onSoundLoaded);
var req:URLRequest new URLRequest("bigSound.mp3");
s.load(req);
function onSoundLoaded(event:Event):void { var localSound:Sound = event.target as Sound; localSound.play();
}

Tout d'abord, l'exemple de code create un objet Sound sans lui donner de valeur initiale pour le paramètre URLRequest. Ensuite, il écoute l'évenement Event. COMPLETE issu de l'objet Sound. La méthode onSoundLoaded() s'exécute alors lorsque toutes les données audio sont chargées. Puis, il appelle la méthode Sound.load() avec une nouvelle valeur URLRequest pour le fichier audio.

La méthode onSoundLoaded() s'exécuté lorsque le chargement du son est terminé. La propriété targete de l'objet Event est une reférence à l'objet Sound. L'objet à la méthode play() de l'objet Sound lance ensuite la lecture du son.

Surveillance du chargement du son

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Les fichiers audio peuvent être très volumineux et leur chargement très long. Flash Player et AIR permettent à votre application de dire dessons avant leur chargement complet. Vous pouvez indiquer à l'utiliser la quantité de données audio ayant été chargeées et la quantité de son déjà lue.

La classe Sound envoie deux événements permettant d'afficher facilement la progression du chargement d'un son : ProgressEvent.PROGRESS et Event.COMPLETE. L'exemple suivant indique comment utiliser ces événements pour afficher les informations de progression concernant le son en cours de chargement :

import flash.events.Event;
import flash.events.ProgessEvent;
import flash.media.Sound;
import flash.net URLsRequest;
var s:Sound = new Sound();
s.addEventListener(ProgressEvent.PROGRESS, onLoadProgress);
s.addEventListener(Event.COMPLET, onLoadComplete);
s.addEventListener(IOErrorEvent.IO_ERROR, onIOError);
var req:URLRequest new URLRequest("bigSound.mp3");
s.load的要求);
function onLoadProgress(event:ProgressEvent):void { var loadedPct:uint = Math.round(100* (event.bytesLoaded / event.bytesTotal)); trace("The sound is " + loadedPct + "% loaded.");
}
function onLoadComplete(event:Event):void { var localSound:Sound = event.target as Sound; localSound.play();
}
function onIOError(event:IOErrorEvent) { trace("The sound could not be loaded:" + event.text);
}

Ce code creé d'abord un objet Sound puis lui ajoute des écouteurs pour les événements ProgressEvent. PROGRESS et Event.COMPLETE. Une fois que la méthode Sound.load() a été appelée et que les premières données sont reçues du fichier audio, un événement ProgressEvent.PROGRESS a lieu et déclenché la méthode onSoundLoadProgress().

Le pourcentage des données audio charges est équivalent à la valeur de la propriété bytesLoaded de l'objet ProgressEvent divisé par la valeur de la propriété bytesTotal. Les mêmes propriétés bytesLoaded et bytesTotal sont disponibles sur l'objet Sound également. L'exemple ci-dessus indique les messages relatifs à la progression du chargement du son, mais vous pouvez facilement utiliser les valeurs bytesLoaded et bytesTotal pourmettre à jour les composants de la barre de progression, tels que ceux intégrés à la structure d'Adobe Flex ou à l'outil de programmation d'Adobe Flash.

Cet exemple indique également comment une application peut reconnaître et répondre à une erreur lors du chargement des fischiers audio. Par exemple, si un fisier audio avec le nom de fisier donné est introuvable, un événement Event.IO_ERROR est envoyé par l'objet Sound. Dans le code précédent, la méthode onIOError() s'exécute et affiche un message d'erreur court lorsqu'une erreur se produit.

Utilisation dessons intégrés

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Utilisez dessons intégrés (au lieu de charger du son depuis un fisier externe) surtout dans le cas de fichiers audio de petite taille servant d'indicateurs dans l'interface utiliser de votre application (dessons qui sontlus lorsquvou cliquez sur des boutons, par exemple).

Lorsque vous incorporez un fichier audio dans votre application, la taille du fichier SWF résultat augmente proportionnellement à la taille du fichier audio. Ceci signifie que lorsque vous incorporez des fichiers volumineux dans votre application, la taille de votre fichier SWF risque de devenir trop importante.

La méthode exacte à utiliser pour incorporer un fichier de police dans le fichier SWF de l'application varie selon l'environnement de développement.

Utilisation d'un fichier audio incorpore dans Flash

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

L'util de programmation Flash vous permet d'importer des sons dans un grand nombre de formats audio et de les stocker comme symboles dans la bibliothèque. Vous pouvez ensuite les affecter à des images dans le scenario ou aux images d'un état de bouton, les utiliser avec des comportements ou directement dans du code ActionScript. Cette section déscrit comment utiliser des sons incorporeés dans du code ActionScript avec l'util de programmation Flash. Pour plus d'informations sur les autres façon d'utiliser des sons incorporeés dans Flash, voir « Importation de sons » dans Utilisation de Flash.

Pour intégrer un fichier son à l'aide de l'outil de programmation Flash :

1 Sélectionnez Fichier > Importer > Importer dans la bibliothèque, puis seLECTIONné un fichier audio et importez-le.
2 Cliquez avec le bouton droit de la souris sur le nom du fichier importé dans le panneau Bibliothèque, et sélectionnez Propriétés. Activez la case à cocher Exporter pour ActionScript.
3 Dans le champ Classe, entrez un nom à utiliser lorsque vous faites reférence à ce son incorpore dans ActionScript. Par défaut, il utilisera le nom du fichier audio dans ce champ. Si le nom du fichier contient un point ( comme dans DrumSound.mp3), vous devez le remplacer par DrumSound ; ActionScript n'autorise pas le caractère point dans les noms de classe. Le champ Classe de base devrait encore afficher flash.media.Sound.

4 Cliquez sur OK. Il se peut qu'une boîte de dialogue indiquant qu'une définition pour cette classe est introuvable dans le chemin de classe apparaisse. Cliquez sur OK et continue. Si vous avez saisi un nom qui ne correspond pas à celui d'une classe contenue dans le chemin de classe de votre application, une nouvelle classe qui hérite de la classe flash.media.Sound est générae automatiquement.
5 Pour utiliser le son incorpore, vous référenciez le nom de classe pour ce son dans ActionScript. Par exemple, le code suivant commence par creator une occurrence de la classe DrumSound générae automatiquement :

var drum:DrumSound = new DrumSound();  
var channel:SoundChannel = drum.play(); 

DrumSound est une sous-classe de la classe flash.media.Sound. Par consequent, elle herite des méthodes et des propriétés de la classe Sound, notamment de la méthode play() comme indiqué ci-dessus.

Utilisation d'un fichier audio intégré dans Flex

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Il existe plusieurs moyens d'intégrer des ressourcesson dans une application Flex. Vous pouvez par exemple :

  • utiliser la balise de métadonnées [Embed] dans un script ;
  • utiliser la directive @Embed dans MXML pour affecter une ressource intégrée en tant que propriété d'un composant, telte que Button ou SoundEffect ;
  • utiliser la directive @Embed dans un fisier CSS.

Cette section déscrit la première option : comment intégrer dessons dans le code ActionScript au sein d'une application Flex à l'aide de la balise de métadonnées [Embed].

Pour intégrer un élément dans le code ActionScript, utilisez la balise de métadonnées [Embed].

Placez le fjichier audio dans le dossier source principal ou dans un autre dossier qui se trouve dans le chemin de création de votre projet. Lorsque le compilateur detecte une balise de métadonnées Embed, il create la classe d'actifs intégrés à votre intention. Vous pouvez acceder à la classe par le biais d'une variable de données de type Class que vous déclarez immédiatement après la balise de métadonnées [Embed].

Le code suivant intégre un son appelé smallSound.mp3 et utilise une variable appelée soundClass pour stocker une reférence à la classe de ressources intégrées associée à ce son. Le code cree ensuite une occurrence de la classe de ressources intégrées, l'attribute comme une occurrence de la classe Sound et appelle la méthode play() sur cette occurrence :

package
{ import flash.display.Sprite; import flash.media Sounds; import flash.media.SoundChannel; public class EmbeddedSoundExample extends Sprite { [Embedsource "smallSound.mp3"] public var soundClass:Class; public function EmbeddedSoundExample() { var smallSound:Sound = new soundClass() as Sound; smallSound.play(); } }

Pour utiliser le son incorpore en vue de définir une propriété d'un composant Flex, elle doit être attribuée comme une occurrence de la classe mx.core SOUNDAsset只不过 que comme une occurrence de la classe Sound. Pour obtenir un exemple similaire qui utilise la classe SoundAsset, voir « Classes des éléments incorpores » dans le manuel Formation à ActionScript 3.0.

Utilisation de fichiers audio de lecture en continu

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Lorsqu'un fjichier audio ou un fjichier video est lu alors que ses données sont encore en cours de chargement, il est lu en continu. Les fjichiers audio externes charges depuis un serveur distant sont souvent lus en continu de façon à ce que l'utilisateur ne doit pas attendre le chargement complet des données audio pour écouter le son.

La propriété SoundMixer.bufferTime représenté le nombre de milliseconds de données audio que Flash Player ou AIR doit rassembler avant la lecture du son. En d'autres termes, si la propriété bufferTime est définitie sur 5000, Flash Player ou AIR charge au moins 5000 milliseconds de données depuis le fichier audio avant le début de la lecture du son. La valeur SoundMixer.bufferTime par défaut est 1000.

Viete application peut ignorer la valeur SoundMixer.bufferTime globale pour un son individuel en specifiant explicitement une nouvelle valeur bufferTime lors du chargement du son. Pour ignorer la durée du tampon par défaut, creez d'abord une occurrence de la classe SoundLoaderContext, définisse sa propriété bufferTime, puis transmettez-la comme paramètre à la méthode Sound.load(), comme indiqué ci-dessous:

import flash.media.Sound;
import flash.media SoundsLoaderContext;
import flash.net(URLRequest;
var s:Sound = new Sound();
var req:URLRequest = new URLRequest("bigSound.mp3");
var context:SoundLoaderContext = new SoundLoaderContext(8000, true);
s.load(req,context);
s.play();

Pendant la lecture, Flash Player ou AIR tente de conserver le tampon audio à la même taille ou à une taille supérieure. Si le téléchargement des données audio est plus rapide que la vitesse de la lecture, cette dernière continue sans interruption. Néanmoins, si la vitesse de chargement des données est ralentie en raison des limites du réseau, la tete de lecture peut atteindre la fin du tampon audio. Dans ce cas, la lecture est suspendue mais elle reprend automatiquement lorsque d'autres données audio sont charges.

Pour savoir si la lecture est suspendue car Flash Player ou AIR attend le chargement des données, utilisez la propriete Sound.isBuffering.

Utilisation de données audio générées de façon dynamique

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

Remarque : Flash Player 10 et Adobe AIR 1.5 seront désormais la possibilité de générer des données audio de façon dynamique.

Plutôt que de charger ou de diffuser en continu un son existant, vous pouze générer des données audio de façon dynamique. Vous pouze générer des données audio lorsque vous affectez un écouteur associé à l'évenement sampleData d'un objet Sound (l'évenement sampleData est défini dans la classe SampleDataEvent du package flash.events). Dans cet environnement, l'objet Sound ne charge pas de données audio à partir d'un fichier. Il agit en fait en tant que socket pour les données audio qui lui sont diffusées en continu par l'intémédiaire de la fonction que vous affectez à cet événement.

Lorsque vous ajoutez un écouteur d'évenement sampleData à un objet Sound, celui-ci demande périodiquement des données à ajouter au tampon audio. Ce tampon contient des données destinées à être lues par l'objet. Une fois appelé, la méthode play() de l'objet Sound distribue l'évenement sampleData lorsqu'il demande de nouvelles données audio. Ceci n'est vrai que si l'objet Sound n'a pas charge de données mp3 à partir d'un fjichier.

L'objet SampleDataEvent comprend une propriété data. Dans votre écouteur d'évenement, vous écrire des objets ByteArray dans cet objet data. Les tableaux d'octets que vous écrire dans cet objet s'ajoutent aux données figurant dans le tampon que lit l'objet Sound. Le tableau d'octets que contient le tampon est un flux de valeurs en virgule flottante comprises en -1 et 1. Chaque valeur représentée l'amplitude d'un canal unique (gauche ou droit) d'un échantillon audio. Le son est échantillonné à 44 100 échantillons par seconde. Chaque échantillon contient un canal gauche et un canal droit, entrelacés sous forme de données en virgule flottante dans le tableau d'octets.

Dans votre fonction gestionnaire, vous utilisez la méthode ByteArray.writeFloat() pour écrire dans la propriété data de l'évenement sampleData. Par exemple, le code suivant génére une onde sinusoidale:

var mySound:Sound = new Sound();
mySound.addEventListener(SampleDataEvent.SAMPLE_DATA, sineWaveGenerator);
mySound.play();
function sineWaveGenerator(event:SampleDataEvent):void { for(var i:int = 0 ;i<8192;i++) { var n:Number = Math.sin((i+event.position)/Math.PI/4); event.data.writeFloat(n); event.data.writeFloat(n); } }

Lorsque vous appelez Sound.play(), l'application commence à appeler votre gestionnaire d'évenement pour demander des données audio d'échantillonnage. Elle continue à envoyer des événements pendant la lecture du son jusqu'à ce que vous cessions de fournir des données ou que vous appeliez la méthode SoundChannel.stop().

La période d'attente de l'évenement varie selon les plates-formes et peut encore changer dans les futures versions de Flash Player et AIR. Plutôt que de vous appuyer sur une période d'attente spécifique, calcuez-la. Pour calculator la période d'attente, utilisez la formule suivante :

(SampleDataEvent.position / 44.1) - SoundChannelObject.position

Fournissez entre 2 048 et 8 192 échantillons à la propriété data de l'objet SampleDataEvent (pour chaque appel du gestionnaire d'évenement). Pour des performances optimes, fournissez autant d'échantillons que possible (8 192 au maximum). Moins vous fournissez d'échantillons, plus il est probable que des bruits parasites se feront entendre pendant la lecture. Ce comportement varie selon les plates-formes et peut se produit dans diverses situations, lors du redimensionnement du navigateur, par exemple. Un code qui fonctionne correctement sur une plate-forme lorsque vous fournissez uniquement 2 048 échantillons ne marchera pas aussi bien sur une autre plate-forme. S'il vous faut le plus court lié à attente possible, envisagez de permettre à l'utilisateur de sélectionner la quantité de données.

Si vous fournisse moins de 2048 échantillons (par appel de l'écouteur d'évenement sampleData), l'application s'arrête à l'issue de la lecture des échantillons restants. L'objet SoundChannel distribue alors un événement SoundComplete.

Modification du son issu de données MP3

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

La méthode SoundExtract vous permet d'extraire des données d'un objet Sound. Vous pouvez utiliser (et modifier) ces données pour acceder en écriture au flux continu dynamique d'un autre objet Sound à des fins de lecture. Ainsi, le code suivant utilise les octets d'un fichier MP3 charge et les transmet par le biais d'une fonction de filtré, upOctave():

var mySound:Sound = new Sound();
var sourceSnd:Sound = new Sound();
var urlReq:URLRequest = new URLRequest("test.mp3");
sourceSnd.load(urlReq);
sourceSnd.addEventListener(Event.COMPLET,loaded);
function loaded(event:Event):void { mySound.addEventListener(SampleDataEvent.SAMPLE_DATA,processSound); mySound.play();
}
function processSound(event:SampleDataEvent):void { var bytes:ByteArray = newByteArray(); sourceSnd.extract(bytes,8192); event.data.writeBytes(upOctave(bytes));
}
function upOctave(bytes:Array) :ByteArray { var returnBytes:ByteArray = newByteArray(); bytes.position = 0 while(bytes.bytesAvailable 0) { returnBytes.writeFloat(bytes.readFloat()); returnBytes.writeFloat(bytes.readFloat()); if (bytes.bytesAvailable >0 { bytes.position + = 8 1 } } return returnBytes;

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

Lorsque you utilisez un écouteur d'évenement sampleData avec un objet Sound, les seules autres méthodes Sound activées sont Sound.extract() et Sound.play(). L'elles autres méthodes ou propriétés donné lieu à une exception. Tous les méthodes et propriétés de l'objet SoundChannel sont toujours activées.

Lecture de sons

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Lire un son charge peut etre aussi simple qu'appeler la methode Sound.play() pour un objet Sound, comme suit : var snd:Sound = new Sound(new URLRequest("smallSound.mp3")); snd.play();

Lorsque vous lisez dessons à l'aide d'ActionScript 3.0, vous pouze effectuer les opérations suivantes :

  • Lire un son à partir d'une position de début spécifique
  • Interrompre un son et reprendre la lecture ultérieurement à partir de la même position

  • Savoir exactement lorsque la lecture d'un son est terminée

  • Suivre la progression de la lecture d'un son
  • Modifier le volume ou la balance pendant la lecture d'un son

Pour effectuer ces opérations pendant la lecture, utilisez les classes SoundChannel, SoundMixer et SoundTransform.

La classe SoundChannel contrôle la lecture d'un seul son. La propriété SoundChannel.position peut etre consideree comme une tete de lecture qui indique le point actuel dans les données audio en cours de lecture.

Lorsqu'une application appelle la méthode Sound.play(), une occurrence de la classe SoundChannel est créé pour contrôler la lecture.

Viete application peut dire un son a partir d'une position de debut spécifique en la transmettant, en termes de milliseconds, comme parametrestartTime de la methode Sound.play(). Elle peut également spécifique un nombre fixe de repétitions du son en succession rapide en transmettant une valeur numérique dans le parametre loops de la methode Sound.play().

Lorsque la méthode Sound.play() est appelée avec un paramètrestartTime et un paramètreloops, le son est lu de façon répetée à partir du même point de début chaque fois, comme indiqué dans le code suivant :

var snd:Sound = new Sound(new URLRequest("repeatingSound.mp3"));

snd.play(1000, 3);

Dans cet exemple, le son est lu à partir d'un point une seconde après le début du son, trois fois de suite.

Pause et reprise d'un son

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Si vous application lit dessons longs (chansons ou podcasts, par exemple), vous pouvez permettre aux utilisateurs d'interrompre et de reprendre leur lecture. Il est impossible d'interrompre litteralement un son pendant la lecture dans ActionScript ; vous pouvez uniquement l'arreter. Neanmoins, un son peut etre lu a partir de n'importe quel point. Vous pouvez enregister la position du son au moment de l'arrêt puis le relire ultérieurement a partir de cette position.

Par exemple, supposons que votre code charge et lit un fisier audio de la façon suivante :

var snd:Sound = new Sound(new URLRequest("bigSound.mp3"));

var channel:SoundChannel = snd.play();

Lors de la lecture du son, la propriété SoundChannel.position indique le point dans le fichier audio qui est en cours de lecture. Notre application peut stocker la valeur de position avant d'arrêter la lecture du son, comme suit :

var pausePosition:int = channel.position;

channel.stop();

Pour reprendre la lecture du son, transmettez la valeur de position stockée precedemment pour relancer le son à partir du même point d'arrêt precedent.

channel = snd.play(pausePosition);

Surveillance de la lecture

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Votre application a peut-etre besoin de savoir lorsque la lecture d'un son s'arrête afin de lancer la lecture d'un autre son ou d'effacer des ressources utilisées pendant la lecture precedente. La classe SoundChannel envoie un événement Event . SOUND_COMPLETE à la fin de la lecture du son. Notre application peut écouter cet événement et effectuer l'action appropriée, comme indiqué ci-dessous :

import flash.events.Event;
import flash.media.Sound;
import flash.net URLsRequest;
var SND:Sound = new Sound();
var req:URLRequest = new URLRequest("smallSound.mp3");
snd.load(req);
var channel:SoundChannel = SND.play();
channel.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete);
public function onPlaybackComplete(event:Event)
{ trace("The sound has finished playing."); }

La classe SoundChannel n'envoie pas d'événements progresspendant la lecture. Pour fournir des informations relatives à la progression de la lecture, votre application peut définir son propre mécanisme de synchronisation et suivre la position de la tete de lecture du son.

Pour calculer le pourcentage d'un son lu, vous pouvez divisor la valeur de la propriété SoundChannel.position par la longueur des données audio en cours de lecture :

var playbackPercent: uint = 100 * (channel.position / snd.length);

Néanmoins, ce code signale uniquement des pourcentages de lecture précis si les données audio ont ete totalement chargées avant le début de la lecture. La propriete Sound.1ength indique la taille des données audio actuellment charges, et non pas la taille eventuelle du fichier audio entier. Pour suivre la progression de la lecture d'un son diffusé en continu qui est always en cours de chargement, sua application doit estimer la taille eventuelle du fichier audio entier et utiliseer cette valeur dans ses calculs. Vous pouvez estimer la longueur eventuelle des données audio a l'aide des proprietes bytesLoaded et bytesTotal de I'objet Sound, comme suit :

var estimatedLength:int = Math.ceil(snd.length / (snd.bytesLoaded / snd.bytesTotal));
var playbackPercent:uint = 100 * (channel.position / estimatedLength);

Le code suivant charge un fisier audio plus volumineux et utilise l'évenement Event. ENTER_FRAME comme mécanisme de synchronisation pour afficher la progression de la lecture. Il fournit régulièrement des informations sur le pourcentage de lecture, qui est calculé de la façon suivante : la valeur de position actuelle divisée par la longueur totale des données audio :

import flash.events.Event;
import flash.media Sounds;
import flash.net(URLRequest;
var snd:Sound = new Sound();
var req:URLRequest = new URLRequest("http://av.adobe.com/podcast/csbu_dev_podcast_epi_2.mp3");
snd.load的要求);
var channel:SoundChannel;
channel = snd.play();
addEventListener(Event.ENTER_FRAME, onEnterFrame);
channel.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete);
function onEnterFrame(event:Event):void { var estimatedLength:int Math.ceil(snd.length / (snd.bytesLoaded / snd.bytesTotal)); var playbackPercentcolon Math.round(100* (channel.position/estimatedLength)); trace("Sound playback is " + playbackPercent + "% complete.");
}
function onPlaybackComplete(event:Event) { trace("The sound has finished playing."); removeEventListener(Event.ENTER_FRAME, onEnterFrame); }

Une fois que le chargement des données audio commence, ce code appelle la méthode SND.play() et stocke l'objet SoundChannel résultat dans la variable channel. Il ajoute ensuite un écouteur d'évenement à l'application principale pour l'évenement Event. ENTER_FRAME et un autre écouteur d'évenement à l'objet SoundChannel pour l'évenement Event.SOUND_COMPLETE qui a lieu à la fin de la lecture.

Chaque fois que l'application atteint une nouvelle image dans son animation, la méthode onEnterFrame() est appelée. La méthode onEnterFrame() estime la longueur totale du fjichier audio en fonction de la quantite de données déjà chargées puis calcule et affiche le pourcentage de lecture actuel.

Une fois que tout le son a eté lu, la méthode onPlaybackComplete() s'exécute, supprimant l'écouteur d'évenement pour l'évenement Event. ENTER_FRAME de façon à ce qu'il ne tente pas d'afficher les mises à jour de progression après la lecture.

L'évenement Event. ENTER_FRAME peut être envoyé plusieurs fois par seconde. Dans certains cas, vous pouvez ne pas afficher la progression de la lecture aussi liéquement. Notre application peut alors définir son propre mécanisme de synchronisation à l'aide de la classe flash.util.Timer ; voir « Utilisation des dates et des heures » à la page 1.

Arrêt de sons diffusés en continu

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Il y a qu'enque chose d'étrange dans le processus de lecture des sons diffusés en continu, c'est-à-dire ceux qui sont lus pendant leur chargement. Lorsque votre application appelle la méthode SoundChannel.stop() sur une occurrencie de SoundChannel qui lit un son diffusé en continu, la lecture du son s'arrêtependant une image puis elle reliance au début du son sur l'image suivante. Ceci a lieu car le chargement du son est always en cours. Pour arrêter à la fois le chargement et la lecture d'un son diffusé en continu, appelez la méthode Sound.close().

Sécurité lors du chargement et de la lecture des sons

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

L'accès aux données audio par votre application peut être limité selon la fonction de sécurité de Flash Player ou AIR. Chaque son est soumis aux restrictions de deux sandbox de sécurité différents, le sandbox pour le contexte lui-même (le sandbox de contexte), et le sandbox pour l'application ou l'objet qui charge et lit le son (le sandbox propriétaire). Pour le contenu de l'application AIR dans le sandbox de sécurité de l'application, tous les sons, y compris leurs charges à partir d'autres domaines, sont accessibles au contenu dans le sandbox de sécurité de l'application. Toutefois, le contenu dans d'autres sandbox de sécurité observe les même règles que le contenu qui s'exécute dans Flash Player. Pour plus d'informations sur le modèle de sécurité de Flash Player en général et la définition des sandbox, voir « Sécurité » à la page 1085.

Le sandbox de contexte contrôle si des données audio détaillées peuvent être extraites du son à l'aide de la propriété id3 ou de la méthode SoundMixer.computeSpectrum(). Il ne limite pas le chargement ou la lecture du fichier audio lui-même.

Le domaine d'origine du fjichier audio définit les limites de sécurité du sandbox de contexte. Généralement, si un fjichier audio se trouve dans le même domaine ou dossier que le fjichier SWF de l'application ou de l'objet qui le charge, ce dernier dispose d'un accès total à ce fjichier audio. Si le son provient d'un domaine différent par rapport à l'application, il peut être intégré dans le sandbox de contexte à l'aide d'un fjichier de régulation.

Viete application peut transmettre un objet SoundLoaderContext avec une propriete checkPolicyFile comme parametre à la methode Sound.load(). Lorsque vous définisse la propriete checkPolicyFile sur true, vous indiquez à Flash Player ou à AIR de rechercher un fjicher de régulation sur le serveur à partir duquel le son est chargé. Si un fjicher de régulation existe et qu'il autorise l'accès au domaine du fjicher SWF de chargement, ce dernier peut charger le fjichier audio, acceder à la propriété id3 de l'objet Sound et appeler la methode

SoundMixer.computeSpectrum() pour lessons charges.

Le sandbox propriétaire contrôle la lecture locale des sons. L'application ou l'objet qui lance la lecture d'un son définit le sandbox propriétaire.

La méthode SoundMixer.stopAll() interrupt lessons dans tous les objets SoundChannel en cours de lecture,tant qu'ils repondent aux criteres suivants:

  • Lessons ont etedemarrés par des objets se trouvant dans le même sandbox propriétaire.
  • Lessons sont issus d'une source possedant un filier de regulation qui autorise l'acces au domaine de l'application ou de I'bject qui appelle la methode SoundMixer.stopAll().

Cependant, dans une application AIR, le contenu du sandbox de sécurité de l'application (contenu installé avec l'application AIR) n'est pas restreint par ces limites de sécurité.

Pour savoir si la méthode SoundMixer.stopAll() interrompra tous lessonslus,voireapplicationpeut appeler la
methodeSoundMixer.areSoundsInaccessible().Si cette methode renvoie une valeur true,certainsdessonslus
ne sont pas sous le contrôle du sandbox proprieteaire actuel et ne seront pas arrêtés par la methode
SoundMixer.stopAll().

La méthode SoundMixer.stopAll() empêche également la tête de lecture de continuer pour tous les sons charges à partir de fichiers externes. Néanmoins, lessons qui sont incorpores dans des fichiers FLA et associés à des images dans le scenario à l'aide de l'outil de programmation Flash risquent d'être relus si l'animation s'est déplacée sur une nouvelle image.

Contrôle du volume du son et de la balance

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Un objet SoundChannel individuel controle les canaux stereo gauche et droit pour un son. Si un son mp3 est un son mono, les canaux stereo gauche et droit de l'objet SoundChannel contiennent des courbes audio identiques.

Vous pouvez connaître l'amplitude de chaque canal stéreo du son lu à l'aide des propriétés leftPeak et rightPeak de l'objet SoundChannel. Ces propriétés indiquent l'amplitude de créé de la courbe audio du son. Elles ne représentent pas le volume de lecture réel. Le volume de lecture réel est une fonction de l'amplitude de l'onde acoustique et des valeurs de volume définies dans l'objet SoundChannel et la classe SoundMixer.

Vous pouvez utiliser la propriété pan d'un object SoundChannel pour indiquer un niveau de volume différent pour chacun des canaux gauche et droit pendant la lecture. La propriété pan peut avoir une valeur comprise entre -1 et 1, où -1 signifie que le canal gauche lit à volume maximal alors que le canal droit est muet, et 1 signifie que le canal droit lit à volume maximal alors que le canal gauche est muet. Les valeurs numériques comprises entre -1 et 1 définissant des valeurs proportionnelles pour les valeurs des canaux gauche et droit, et une valeur de 0 signifie que les deux canaux lisent à un niveau de volume moyen, équilibré.

L'exemple de code suivant create un objet SoundTransform avec une valeur de volume de 0,6 et une valeur de balance horizontal de -1 (volume de canal gauche maximal et dernier volume de canal droit). Il transmet l'objet SoundTransform comme paramètre à la méthode play(), qui l'applique au nouvel object SoundTransform créé pour contrôler la lecture.

var snd:Sound = new Sound(new URLRequest("bigSound.mp3"));

var trans:SoundTransform = new SoundTransform(0.6, -1);

var channel:SoundChannel = snd.play(0, 1, trans);

Vous pouvez modifier le volume et la balance pendant la lecture d'un son en définissant les propriétés pan ou volume d'un objet SoundTransform puis en appliquant cet object comme propriété soundTransform d'un objet SoundChannel.

Vou puez egalent definir des valeurs de balance et de volume global pour tous lessons a la fois a l'aide de la propriete soundTransform de la classe SoundMixer, comme l'indique l'exemple suivant:

Vou puez egalent utilise un objet SoundTransform pour definir des valeurs de balance et de volume global pour un objet Microphone (voir « Capture de l'entrée de son » à la page 476), et pour des objets Sprite et SimpleButton.

L'exemple suivant modifie la balance horizontale du son du canal gauche au canal croit et de nouveau lors de la lecture du son.

import flash.events.Event;
import flash.media.Sound;
import flash.media SoundsChannel;
import flash.media SoundsMixer;
import flash.net URLsRequest;
var snd:Sound = new Sound();
var req:URLRequest = new URLRequest("bigSound.mp3");
snd.load(req);
var panCounter:Number = 0 .
var trans:SoundTransform;
trans = new SoundTransform(1,0);
var channel:SoundChannel = snd.play(0,1,trans);
channel.addEventListener(Event.SOUND_COMPLETE,onPlaybackComplete);
addEventListener(Event.ENTER_FRAME,onEnterFrame);
function onEnterFrame(event:Event):void { trans.pan = Math.sin(panCounter); channel.soundTransform = trans; // or SoundMixer.soundTransform = trans; panCounter + = 0.05 :
}
function onPlaybackComplete(event:Event):void { removeEventListener(Event.ENTER_FRAME,onEnterFrame);

Ce code commence par charger un fisier audio puis cree un objet SoundTransform avec un volume defini sur 1 (volume maximal) et une balance definie sur 0 (balance equilibrée entre gauche et droite). Il appelle ensuite la methode SND.play() en transmettant l'objet SoundTransform comme paramètre.

Lors de la lecture du son, la méthode onEnterFrame() s'exécute de façon répétée. La méthode onEnterFrame() utilise la fonction Math.sin() pour générer une valeur comprise entre -1 et 1 (plage qui correspond aux valeurs acceptables de la propriété SoundTransform.pan). La propriété pan de l'objet SoundTransform est définie sur la nouvelle valeur, puis la propriété soundTransform du canal est définitie pour utiliser l'objet SoundTransform modifié.

Pour exécuter cet exemple, remplacez le nom de fichier bigSound.mp3 par le nom d'un fichier mp3 local. Executez ensuite l'exemple. Le volume du canal gauche devrait augmenter quand celui du canal droit diminue, et vice-versa.

Dans cet exemple, le même effet peut être obtenu en définissant la propriété soundTransform de la classe SoundMixer. Néanmoins, la balance de tous les sons en cours de lecture est affectée (pas seulement le son lu par cet objet SoundChannel).

Utilisation des métadonnées audio

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Les fichiers audio qui utilisent le format mp3 peuvent contir des données supplémentaires relatives au son sous la forme de balises ID3.

Tous les fischiers mp3 ne contiennent pas de métadonnées ID3. Lorsqu'un objet Sound charge un fisier audio mp3, il envoie un événement Event. ID3 si le fisier audio contient des métadonnées ID3. Pour éviter des erreurs d'exécution, votre application doit attendre de recevoir l'événement Event. ID3 avant d'acceder à la propriété Sound. id3 pour un sonCharge.

Le code suivant indique comment savoir si les métadonnées ID3 pour un fichier audio ont été chargées :

import flash.events.Event;
import flash.media.ID3Info;
import flash.media Sounds;
var s:Sound = new Sound();
s.addEventListener(Event.ID3,onID3InfoReceived);
s.load("mySound.mp3");
function onID3InfoReceived(event:Event)
{ var id3:ID3Info = event.target.id3; trace("Received ID3 Info:"); for(var propName:String in id3) { trace(propName ^+ " " ^+ id3[propName]); }
}

Ce code commence par创建工作 un objet Sound et par lui demander d'écouter l'évenement Event.ID3. Lorsque les métadonnées ID3 du fjichier audio sont chargées, la méthode onID3InfoReceived() est appelée. La cible de l'objet Event qui est transmise à la méthode onID3InfoReceived() est l'objet Sound d'origine. Par conséquent, la méthode obtient ensuite la propriété id3 de l'objet Sound puis effectue une iteration sur toutes ses propriétés appelées pour suivre leurs valeurs.

Accès aux données audio brutes

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La méthode SoundMixer.computeSpectrum() permet à une application de dire les données audio brutes pour la courbe audio en cours de lecture. Si plusieurs objets SoundChannel sont en cours de lecture, la méthode SoundMixer.computeSpectrum() indique les données audio combinées de chaque objet SoundChannel mixé.

Les données audio sont renvoyées sous la forme d'un object ByteArray contenant 512 octets de données (chacun d'eux contenant une valeur en virgule flottante comprise entre -1 et 1). Ces valeurs représentent l'amplitude des points dans la courbe audio en cours de lecture. Les valeurs sont fournies en deux groupes de 256 : le premier groupe pour le canal stéreo gauche et le second pour le canal stéreo droit.

La méthode SoundMixer.computeSpectrum() renvoie des données de spectre de fréquences只不过 que des données de courbe audio si le paramètre FFTMode est défini sur true. Le spectre de fréquences indique l'amplitude par fréquence du son, de la plus BASSE à la plus ÉLEVée. Une FFT (Fast Fourier Transform - transformation de Fourier rapide) est utilisé pour convertir les données de courbe audio en données de spectre de fréquences. Les valeurs de spectre de fréquences réalisantes sont comprises entre 0 et 1,414 environ (la racine carrée de 2).

Le diagramme suivant compare les données renvoyées de la méthode computeSpectrum() lorsque le paramètre FFTMode est définir sur true et lorsqu'il est définir sur false. Le son dont les données ont été utilisées pour ce diagramme contient un son de basse de grande intensité dans le canal gauche et un son de tambour dans le canal droit.

ADOBE ACTIONSCRIPT 3.0 - Accès aux données audio brutes - 1

ADOBE ACTIONSCRIPT 3.0 - Accès aux données audio brutes - 2
Valeurs renvoyées par la méthode SoundMixer.computeSpectrum()
A. fftMode=true B. fftMode=false

La méthode computeSpectrum() peut également renvoyer des données qui ont été rééchantillonnées à un débit inférieur. Généralement, ici entraine des données de fréquence ou des données de courbe audio plus lisses, au profit des détails. Le paramètre stretchFactor contrôle la fréquence à laquelle les données de la méthode computeSpectrum() sont échantillonnées. Lorsque le paramètre stretchFactor est définir sur 0 (valeur par défaut), les données audio sont échantillonnées à une fréquence de 44,1 KHz. La fréquence est diminuée de moins à chaque valeur successive du paramètre stretchFactor. Par conséquent, une valeur de 1 indique une fréquence de 22,05 KHz, une valeur de 2 une fréquence de 11,025 KHz, et ainsi de suite. La méthode computeSpectrum() continue à renvoyer 256 octets par canal stéreo lorsqu'une valeur stretchFactor supérieure est utilisé.

La méthode SoundMixer.computeSpectrum() comporte des limites :

  • Etant donné que les données audio issues d'un microphone ou de flux RTMP ne passent pas par l'objet SoundMixer global, la méthode SoundMixer.computeSpectrum() ne renvoie pas de données de ces sources.
  • Si un ou plusieurs sons lus proviennent de sources externes au sandbox de contexte actuel, les restrictions de sécurité provoquent le renvoi d'une erreur par la méthode SoundMixer.computeSpectrum(). Pour plus d'informations sur les limites de sécurité de la méthode SoundMixer.computeSpectrum(), voir « Sécurité lors du chargement et de la lecture des sons » à la page 469 et « Accès aux médias charges comme s'il s'agissait de données » à la page 1111.

Cependant, dans une application AIR, le contenu du sandbox de sécurité de l'application (contenu installé avec l'application AIR) n'est pas restreint par ces limites de sécurité.

Creation d'un visualiser audio simple

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

L'exemple suivant utilise la méthode SoundMixer.computeSpectrum() pour afficher un diagramme de la courbe audio animée avec chaque image :

import flash.display graphics;
import flash.events.Event;
import flash.media Sounds;
import flash.media SoundsChannel;
import flash.media SoundsMixer;
import flash.net URLsRequest;
const PLOT_HEIGHT:int = 200 .
const CHANNEL_LENGTH:int = 256 var snd:Sound new Sound();
var req:URLRequest new URLRequest("bigSound.mp3");
snd.load的要求);
var channel:SoundChannel;
channel = snd.play();
addEventListener(Event.ENTER_FRAME, onEnterFrame);
snd.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete);
var bytes:ByteArray newByteArray();
function onEnterFrame(event:Event):void { SoundMixer.computeSpectrum(bytes,false,0); var g:Graphics this.graphics; g.clear(); g.lineStyle(0,0x6600CC); g.beginFill(0x6600CC); g.moveTo(0,PLOT_HEIGHT); var n:Number = 0 // left channel for (var i:int = 0 ;i<CHANNEL_LENGTH;i++) { n = (bytes.readFloat() * PLOT_HEIGHT); g lineTo(i*2,PLOT_HEIGHT -n); } g.lineTo(CHANNEL_LENGTH*2,PLOT_HEIGHT);

g.endsWith();   
// right channel   
g.lineStyle(0, 0xCC0066);   
g.beginFill(0xCC0066, 0.5);   
g.moveTo(CHANNEL_LENGTH * 2, PLOT_HEIGHT);   
for (i = CHANNEL_LENGTH; i > 0; i--) { n = (bytes.readFloat() * PLOT_HEIGHT); g.lineTo(i * 2, PLOT_HEIGHT - n); } g.lineTo(0, PLOT_HEIGHT); g.endsWith();   
}   
function onPlaybackComplete(event:Event) { removeEventListener(Event.ENTER_FRAME, onEnterFrame); } 

Cet exemple commence par charger et dire un fisier audio puis écoute l'évenement Event. ENTER_FRAME qui déclenchera la méthode onEnterFrame() lors de la lecture du son. La méthode onEnterFrame() commence par appeler la méthode SoundMixer.computeSpectrum(), qui stocke les données d'onde acoustique dans l'objet ByteArray bytes.

La courbe audio est tracée à l'aide de l'API de dessin vectoriel. Une boucle for passée dans les 256 premières valeurs de données, représentant le canal stéreo gauche, et trace une ligne entre chaque point au moyen de la méthode Graphics.lineTo(). Une second boucle for passée dans les 256 valeurs suivantes, en les traçant cette fois dans l'ordre inverse, de droite à gauche. Les tracés de courbe audio résultats peuvent produit un effet miroir-image intéressant, comme illustré sur l'image suivante.

ADOBE ACTIONSCRIPT 3.0 - Creation d'un visualiser audio simple - 1

Capture de l'entrée de son

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La classe Microphone permet à votre application de se connecter à un microphone ou à un autre périphérique d'entrée de son sur le système de l'utilisateur et de diffuser l'audio sur les haut-parleurs de ce système ou d'envoyer les données audio à un serveur distant (Flash Media Server, par exemple). Vous pouvez acceder aux données audio brutes à partir du microphone, puis les enregistrer ou les Traitser. Vous pouvez également envoyer directement l'audio aux haut-parleurs du système ou envoyer des données audio compressées à un serveur distant. Pour envoyer des données à un serveur distant, vous pouvez utiliser le codec Speex ou Nellymoser (le codec Speex est pris en charge depuis Flash Player version 10 et Adobe AIR version 1.5).

Voir aussi

Michael Chaize : AIR, Android, and the Microphone (disponible en anglais uniquement)

Christophe Coenraets : Voice Notes for Android (disponible en anglais uniquement)

Accès à un microphone

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La classe Microphone ne possède pas de méthode constructeur. A la place, vous utilisez la méthode statique Microphone.getMicrophone() pour obtenir une nouvelle occurrence de Microphone, comme indiqué ci-dessous :

Lorsque you appelez la methode Microphone.getMicrophone() sans parametre, le premier perephérique d'entree de son detecté sur le système de l'utilisateur est renvoyé.

Un système peut avoir plusieurs péripériques d'entrée de son qui lui sont associés. Notre application peut utiliser la propriété Microphone names pour obtenir un tableau des noms de tous les péripériques d'entrée de son disponibles. Elle peut ensuite appeler la méthode Microphone.getMicrophone() avec un paramètre index qui correspond à la valeur d'index du nom d'un péripérisque dans le tableau.

Il se peut qu'un système n'ait aucun microphone ni périhérique d'entrée de son qui lui soit associé. Vous pouvez utiliser la propriété Microphone-names ou la méthode Microphone.getMicrophone() pour vérifier si l'utilisateur a installé un périhérique d'entrée de son. Si ce n'est pas le cas, la longueur du tableau names est zéro, et la méthode getMicrophone() renvoie une valeur null.

Lorsque votre application appelle la méthode Microphone.getMicrophone(), Flash Player affiche la boîte de dialogue des paramètres de Flash Player, qui invite l'utilisateur à autoriser ou à refuser l'accès Flash Player à laamera et au microphone sur le système. Une fois que l'utilisateur a fait sonchioïn dans cette boîte de dialogue, un StatusBar est envoyé. La propriété code de cette occurrence de StatusBar indique si l'accès au microphone a été autorisé ou refusé, comme indiquédans cet exemple :

import flash.media.Microphone;
var mic:Microphone = Microphone.getMicrophone();
mic.addEventListener(StatusEvent.StatusUS, this.onMicStatus);
function onMicStatus(event:StatusEvent):void { if (event.code = = "Microphone.Unmuted") { trace("Microphone access was allowed."); } else if (event.code = = "Microphone.Muted") { trace("Microphone access was denied."); }
}

La propriété StatusEvent.code contienda Microphone.Unmuted si I'accès a eté autorisé, ou Microphone.Muted s'il a été refusé.

la propriété Microphone.muted est définie sur true ou sur false lorsque l'utilisateur autorise ou refuse l'accès au microphone, respectivement. Néanmoins, la propriété muté n'est pas définie sur l'occurrence de Microphone tant que StatusEvent n'a pas été distribué. Par conséquent, l'application doit également attendre la distribution de l'évenement StatusEvent STATUS avant de vérifier la propriété Microphone.muted.

Pour que Flash Player affiche la boite de dialogue de paramétrage, la taille de la fenêtre de l'application doit être suffisamment élevé (215 sur 138 pixels au moins). Dans le cas contraire, l'accès est automatiquement refusé.

Un contenu qui s'exécut dans le sandbox de l'application AIR ne nécessite pas l'autorisation de l'utilisateur pour acceder au microphone. Par consequement, les événements d'état associés à l'activation et à la désactivation du microphone ne sont jamais distribués. Etant donné qu'un contenu qui s'exécut dans AIR en dehors du sandbox de l'application ne nécessite pas l'autorisation de l'utilisateur, il est possible de distribuer ces événements d'état.

Acheminement de l'audio du microphone vers des haut-parleurs locaux

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

L'entrée audio issue d'un microphone peut être acheminée vers les haut-parleurs du système local en appelant la méthode Microphone.setLoopback() avec une valeur de paramètre true.

Lorsque le son provenant d'un microphone local est acheminé vers des haut-parleurs locaux, vous risquez de créez une boucle de réaction acoustique pouvant entrainer des grincements d'une grande intensité et endommager ainsi votre matériel. Vous pouvez appeler la méthode Microphone.setUseEchoSuppression() avec une valeur de paramètre true pour réduire (sans éliminer complètement) le risque de réaction acoustique. Adobe vous conseille de toujours appeler Microphone.setUseEchoSuppression(true) avant d'appeler Microphone.setLoopback(true), à moins que vous soyez sur que l'utilisateur lit le son à l'aide d'un casque ou d'un dispositif autre que les haut-parleurs.

Le code suivant indique comment acheminer l'audio d'un microphone local vers les haut-parleurs du système local :

var mic:Microphone = Microphone.getMicrophone();
mic.setUseEchoSuppression(true);
mic.setLoopBack(true);

Modification de l'audio du microphone

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Votre application peut modifier les données audio provenant d'un microphone de deux facons differentes.

Premièrement, elle peut modifier le gain du son entré, qui multiplie les valeurs d'entrée par une quantité spécifiée pour creer un son plus ou moins intense. La propriété Microphone.gain accepte des valeurs numériques comprises entre 0 et 100 inclus. Une valeur de 50 a un role de multiplicitateur de un et spécifique un volume normal. Une valeur de zéro agit comme un multiplicitateur de zéro et interrupt l'audio d'entrée. Les valeurs supérieures à 50 indiquent un volume supérieur à la normale.

Viete application peut eaglement modifier la frquece d'echantillonnage de l'audio d'entree. Des frquesces d'echantillonnage supereues augmentent la qualite du son, mais creent eaglement des flux de donnees plus denses qui utilisent davantage de ressources pour la transmission et le stockage. La propriete Microphone. rate representationla frquece d'echantillonnage audio mesurée en kilohertz (kHz). La frquece d'echantillonnage par defaut est de 8kHz .Voupvez definir la propriete Microphone. rate sur une valeur superieure a 8kHz si voitre microphone prend en charge la frquece superieure.Par exemple, si vous definissez la propriete Microphone. rate sur la valeur 11, la frquece d'echantillonnage est reglee sur 11kHz ; si vous la definissez sur 22, la frquece d'echantillonnage est reglee sur 22kHz , et ainsi de suite. Les frquesces d'echantillonnage disponibles varient en fonction du codec selectionné. Lorsque vous utilisez le codec Nellymoser, vous pouze spécifier les frquesces d'echantillonnage 5, 8, 11, 16, 22 et 44kHz .Lorsque vous utilisez le codec Speex (disponible a partir de Flash Player 10 et Adobe AIR 1.5), vous ne pouze utiliser que 16kHz

Détction de l'activité du microphone

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Pour economiser les ressources de traitement et de bande passante, Flash Player tente de détecter lorsque aucun son n'est transmis par un microphone. Lorsque le niveau d'activité du microphone se situe sous le seuil de niveau de silence pendant longtemps, Flash Player arrête la transmission de l'entrée audio et envoie un simple événement ActivityEvent à la place. Si vous utilisez le codec Speex ( disponible dans Flash Player 10 et versions ultérieures, ainsi que dans Adobe AIR 1.5 et versions ultérieures), définissez le niveau de silence sur 0 afin de vous assurer que l'application transmet les données audio en continu. La fonction de détction d'activité vocale de Speex réduit automatiquement la bande passante.

Remarque: un objet Microphone ne distribuè des événements Activity que si l'application contrôle contrôle actuellément le microphone. Par conséquent, si vous n'appelez pas setLoopBack (true), que vous n'associez pas d'écouteur aux événements de données d'exemple ou que vous ne connectez pas le microphone à un objet NetStream, aucun événement d'activité n'est distribué.

Trois propriétés de la classe Microphone surveillent et contrôle la détéction d'activité :

  • La propriété activitéLevel en lecture seule indique la quantité de son détectée par le microphone, sur une échelle de 0 à 100.
  • La propriété silenceLevel spécifie la quantité de son nécessaire pour activer le microphone et envoie un événement ActivityEvent.ACTIVITY. La propriété silenceLevel utilise également une échelle de 0 à 100, et la valeur par défaut est 10.
  • La propriété silenceTimeout décrit le nombre de milliseconds pendant lequel le niveau d'activité doit rester sous le niveau de silence, jusqu'à ce qu'un événement ActivityEvent. ACTIVITY soit envoyé pour indiquer que le microphone est maintainant désactivé. La valeur silenceTimeout par défaut est 2000.

Les propriétés Microphone.silenceLevel et Microphone.silenceTimeout sont en lecture seule, mais vous pouvez modifier leurs valeurs à l'aide de la méthode Microphone.setSilenceLevel().

Dans certains cas, l'activation du microphone alors qu'une nouvelle activité est détectée peut entraîner un court lié. Vous pouvez laisser le microphone actif en permanence pour supprimer ces déliés d'activation. Notre application peut appeler la méthode Microphone.setSilenceLevel() avec le paramètre silenceLevel défini sur zéro pour indiquer à Flash Player de laisser le microphone actif et de continuer à rassemble des données audio, même lorsque aucun son n'est détected. Inversement, lorsque vous définissez le paramètre silenceLevel sur 100, le microphone n'est pas activé.

L'exemple suivant affiche les informations relatives au microphone et aux événements activity et status envoyés par un objet Microphone :

import flash.events.ActivityEvent;
import flash.events.StatusEvent;
import flash.media.Microphone;
var deviceArray:Array = Microphone-names; trace("Available sound input devices:"); for(var i:int 0;i< deviceArray.length; i + + ) { trace(" "+deviceArray[i]); }
var mic:Microphone = Microphone.getMicrophone(); mic_gain = 60 .
mic RATE = 11 .
mic.setUseEchoSuppression(true);
mic.setLoopBack(true);
mic.setSilenceLevel(5,1000);
mic.addEventListener(ActivityEvent.ACTIVITY,this.onMicActivity);
mic.addEventListener(StatusEvent.Status, this.onMicStatus);
var micDetails:String = "Sound input device name:" ^+ mic.name ^+ '\n';
micDetails + = "Gain:" ^+ mic_gain ^+ '\n';
micDetails + = "Rate:" ^+ mic Rates ^+ "kHz" ^+ '\n';
micDetails + = "Muted:" ^+ mic.muted ^+ '\n';
micDetails + = "Silence level:" ^+ mic.silenceLevel ^+ '\n';
micDetails + = "Silence timeout:" ^+ mic.silenceTimeout +'\n';
micDetails + = "Echo suppression:" ^+ mic.useEchoSuppression +'\n'; trace(micDetails);
function onMicActivity(event:ActivityEvent):void { trace("activating=" ^+ eventactivating ^+ ",activityLevel=" ^+ mic活性Level);
}
function onMicStatus(event:StatusEvent):void { trace("status:level=" ^+ event.level ^+ ",code=" ^+ event.code); }

Lorsque you executez l'exemple ci-dessus, parlez ou faites du bruit dans votre microphone système et observe les instructions trace qui apparaissent dans une console ou une fenêtre de débogage.

Envoi d'audio vers et depuis une passerelle multimédia

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

D'autres fonctionnalités audio sont disponibles lorsqu vous utilisez ActionScript avec une passerelle multimédia de diffusion en continu telle que Flash Media Server.

Votre application peut notamment associer un objet Microphone à un objet NetStream et transmettre directement des données du microphone de l'utilisateur au serveur. Les données audio peuvent également être diffusées en continu du serveur vers une application et lues dans le cadre d'un MovieClip ou au moyen d'un objet Video.

Le codec Speex est pris en charge depuis Flash Player version 10 et Adobe AIR version 1.5. Pour définir le codec utilisé pour les données audio compressées envoyées au serveur multimédia, définièsez la propriété codec de l'objet

Microphone. Cette propriété gère deux valeurs, qui sont enumeratedées dans la classe SoundCodec. La définition de la propriété codec sur SoundCodec. SPEEX sélectionne le codec Speex pour la compression audio. La définition de la propriété codec sur SoundCodec. NELLYMOSER (valeur par défaut) sélectionne le codec Nellymoser pour la compression audio.

Pour plus d'informations, voir la documentation de Flash Media Server disponible en ligne à l'adresse suivante: www.adobe.com/go/learn_fms_docs_fr.

Capture des données audio issues d'un microphone

Flash Player 10.1 et les versions ultérieures, Adobe AIR 2 et les versions ultérieures

Dans Flash Player 10.1 et AIR 2 ou ultérieur, vous pouvez capturer les données issues d'un microphone sous forme de tableau d'octets composé de valeurs à virgule flottante. Chaque valeur représentée un échantillon de données audio monophoniques.

Pour obtenir les données issues d'un microphone, définissee un écouteur associé à l'évenement sampleData de l'objet Microphone. L'objet Microphone distribue les événements sampleData à fréquence régulière au fur et à mesure que le tampon du microphone se remplit d'échantillons audio. La propriété data de l'objet SampleDataEvent correspond à un tableau d'octets d'échantillons audio. Les échantillons sont représentés par des valeurs à virgule flottante, chacune d'elles correspondant à un échantillon audio monophonique.

Le code suivant capture les données audio issues d'un microphone dans un objet ByteArray appelé soundBytes :

var mic:Microphone = Microphone.getMicrophone();
mic.setSilenceLevel(0,DELAY_LENGTH);
mic.addEventListener(SampleDataEvent.SAMPLE_DATA,micSampleDataHandler);
function micSampleDataHandler(event:SampleDataEvent):void{ while(event.data.bytesAvailable){ var sample:Number = event.data.readFloat(); soundBytes.writeFloat(sample); }
}

Vous pouvez réutiliser les octets d'échantillon sous forme d'audio à dire d'un objet Sound. Pour ce faire, définièsez la propriété rate de l'objet Microphone sur 44, à savoir la fréquence d'échantillonnage utilisée par les objets Sound. (Vous pouvez également convertir des échantillons issus de microphone capturés à une fréquence inférieure sur le taux 44kHz requis par l'objet Sound.) N'oubliez pas non plus que l'objet Microphone capture des échantillons monophoniques, alors que l'objet Sound utilise un son stéreo. Ecrirez donc deux fois dans l'objet Sound chaque octet Capture par l'objet Microphone. L'exemple suivant capture 4 secondes de données issues d'un microphone et les lit par le biais d'un objet Sound :

const DELAY_LENGTH:int = 4000 var mic:Microphone Microphone.getMicrophone(); mic.setSilenceLevel(0,DELAY_LENGTH); mic_gain = 100 . mic RATE = 44 . mic.addEventListener(SampleDataEvent.SAMPLE_DATA,micSampleDataHandler); var timer:Timer new Timer(DELAY_LENGTH); timer.addEventListener(TimerEvent.TIMER,timerHandler); timer.start(); function micSampleDataHandler(event:SampleDataEvent):void { while(event.data.bytesAvailable) { var sample:Number event.data floats(); soundBytes.writeFloat(sample); } } var sound:Sound new Sound(); var channel:SoundChannel; function timerHandler(event:TimerEvent):void { mic.removeEventListener(SampleDataEvent.SAMPLE_DATA,micSampleDataHandler); timer.stop(); soundBytes.position = 0 . sound.addEventListener(SampleDataEvent.SAMPLE_DATA,playbackSampleHandler); channel.addEventListener(Event.SOUND_COMPLETE,playbackComplete); channel = sound.play(); } function playbackSampleHandler(event:SampleDataEvent):void { for(var i:int = 0 ;i<8192&&soundBytes.bytesAvailable >0 ;i++) { trace(sample); var sample:Number soundBytes.readFloat(); event.data.writeFloat(sample); event.data.writeFloat(sample); } } function playbackComplete(event:Event):void { trace("Playback finished."); }

Pour plus d'informations sur la lecture de données d'échantillons audio, voir « Utilisation de données audio générées de façon dynamique » à la page 463.

Exemple d'objet Sound : Podcast Player

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Un podcast est un fjichier audio distribué sur Internet, sur demande ou sur abonnement. Les podcasts sont généralement publiés dans un annuaire. Etant donné que les épisodes de podcast peuvent durer d'une minute à plusieurs heures, ils sont généralement diffusés en continu pendant la lecture. Les épisodes de podcast, également appelés éléments, sont généralement fournis au format de fjichier mp3. Les podcasts video sont également courants, mais cet exemple d'application lit uniquement des podcasts audio utilisant des fjichiers mp3.

Cet exemple n'est pas une application agrégatrice de podcasts comprenant toutes les fonctionnalités. Par exemple, elle ne gère pas les abonnements à des podcasts spécifiques et ne memorise pas les podcasts qu'un utiliser a écoutés lors de l'exécution suivante de l'application. Il peut servir de point de départ pour un agrégateur de podcasts comprenant toutes les fonctionnalités.

L'exemple Podcast Player illustrate les techniques de programmation ActionScript suivantes :

  • Lecture d'un fil de syndication et analyse de son contenu XML
  • Création d'une classe SoundFacade pour simplifier le chargement et la lecture des fichiers audio
  • Affichage de la progression de la lecture du son
  • Interruption et reprise de la lecture du son

Pour obtenir les fichiers d'application de cet exemple, voir

www.adobe.com/go/learn_programmingAS3samplesflash_fr. Les fichiers d'application Podcast Player se trouvent dans le dossier Samples/PodcastPlayer. L'application se compose des fichiers suivants:

FichierDescription
PodcastPlayer.mxml ou PodcastPlayer.flaInterface utilisé de l'application pour Flex (MXML) ou Flash (FLA).
comp/example/progammingsa3/podcastplayer/PodcastPlayer.asClasse Document contenant la logique de l'interface utilisé pour le lecteur de podcast (Flash uniquement).
SoundPlayer.mxmlUn composant MXML qui affiche les commandes de lecture et les barres de progression, et contrôle la lecture du son, pour Flex uniquement.
main.cssStyles associés à l'interface utilisé de l'application (Flex uniquement)
image/Icônes permettant le formatage des boutons (Flex uniquement).
comp/example/progammingsa3/podcastplayer/SoundPlayer.asClasse pour le symbole du clip SoundPlayer contenant la logique de l'interface utilisé du lecteur de sons (Flash uniquement).
comp/example/progammingsa3/podcastplayer/PlayButtonRenderer.asComposant de rendu de cellule personalisé permettant d'afficher un bouton de lecture dans une cellule de la grille de données (Flash uniquement).
com/example/progammingsa3/podcastplayer/RSSBase.asUne classe de base qui fournit les méthodes et les propriétés courantes pour la classe RSSChannel et la classe RSSItem.
com/example/programMINGas3/podcastplayer/RSSChannel.asUne classe ActionScript qui contient des données relatives à un canal RSS.
com/example/programMINGas3/podcastplayer/RSSItem.asUne classe ActionScript qui contient des données relatives à un élément RSS.
com/example/programmingas3/podcastplayer/SoundFacade.asLa classe ActionScript principale pour l'application. Elle encapsule les méthodes et les événements des classes Sound et SoundChannel et ajoute une prise en charge pour l'interruption et la reprise de la lecture.
com/example/programmingas3/podcastplayer/URLService.asUne classe ActionScript qui récupère des données d'une URL distante.
playerconfig.xmlUn fjichier XML contenant une liste des fils de syndication qui représentent des chaînes de podcast.
comp/example/progammingesa3/utilis/DateUtil.asClasse permettant le formatage rapide de la date (Flash uniquement).

Lecture de données RSS pour une chaine de podcast

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

L'application Podcast Player commence par litre les informations concernant des chaînes de podcasts et leurs épisodes :

  1. L'application commence par litre un fichier de configuration XML qui contient une liste des chaînes de podcast et affiche la liste des chaînes pour l'utilisateur.
  2. Lorsque l'utilisateur selectionne l'une des chaînes de podcast, il lit le flux RSS pour la chaîne et affiche une liste des épisodes de chaîne.

Cet exemple utilise la classe d'utilitaire URLsLoader pour récapier des données de texte depuis un emplacement distant ou un fisier local. L'application Podcast Player create d'abord un objet URLsLoader pour obtenir une liste des fils de syndication au format XML du fisier playerconfig.xml. Ensuite, lorsque l'utilisateur seLECTIONne un fil de syndication spécifique dans la liste, un nouvel objet URLsLoader est créé pour dire les données RSS de l'URL de ce fil.

Simplification de la lecture et du chargement du son à l'aide de la classe SoundFacade

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

L'architecture audio ActionScript 3.0 est puissant mais complexe. Les applications nécessitant des fonctions de lecture et de chargement de son de base uniquement peuvent utiliser une classe masquant une partie de la complexité en fournissant un ensemble d'appels et d'événements plus simple. Dans l'univers des modèles de conception de logiciel, une telle classe est appelée façade.

La classe SoundFaçade présente une seule interface permettant d'effectuer les tâches suivantes :

  • Chargement de fichiers audio à l'aide d'un objet Sound, d'un objet SoundLoaderContext et d'une classe SoundMixer
  • Lecture de fichiers audio à l'aide des objets Sound et SoundChannel
  • Envoi d'événements de progression de la lecture

  • Interruption et reprise de la lecture du son à l'aide des objets Sound et SoundChannel

La classe SoundFacade essais d'offrir le meilleur de la fonctionnalité des classes de son ActionScript avec moins de complexité.

Le code suivant indique la déclaration de classe, les propriétés de classe et la méthode constructeur SoundFacade():

public class SoundFacade extends EventDispatcher
{ public var s:Sound; public var sc:SoundChannel; public var url:String; public var bufferTime:int = 1000 . public var isLoaded:Boolean = false; public var isReadyToPlay:Boolean = false; public var isPlaying:Boolean = false; public var isStreaming:Boolean = true; public var autoLoad:Boolean = true; public var autoPlay:Boolean = true; public var pausePosition:int = 0 . public static const PLAYProgressString "playProgress"; public var progressInterval:int = 1000 . public var playTimer:Timer; public function SoundFacade(soundUrl:String,autoLoad:Boolean = true, autoPlay:Boolean = true, streaming:Boolean = true, bufferTime:int = -1 ):void { this.url soundUrl; // Sets Boolean values that determine the behavior of this object this.autoLoad autoLoad; this.autoPlay autoPlay; this.isStreaming streaming; // Defaults to the global bufferTime value if (bufferTime < 0 1 bufferTime SoundMixer.bufferTime; } // Kews buffer time reasonable, between O and 30 seconds this.bufferTime Math.min(Math.max(0,bufferTime),30000); if (autoLoad) { load(); }

La classe SoundFacade étend la classe EventDispatcher pour qu'elle puisse envoyer ses propres événements. Le code de classe déclare d'abord les propriétés pour un objet Sound et un objet SoundChannel. La classe stocke également la valeur de l'URL du fjichier audio et une propriété bufferTime à utiliser lors de la lecture du son en continu. De plus, elle accepte des valeurs de paramètre booléennes qui affectent le comportement de lecture et de chargement :

Le parametre autoLoad indique à l'objet que le chargement du son doit commencer des la création de cet objet.
- Le paramètre autoPlay indique que la lecture du son doit commencer des qu'une quantité suffisante de données audio a été chargee. S'il s'agit d'un son diffusé en continu, la lecture commence des qu'une quantité suffisante de données ( comme spécifique par la propriété bufferTime) est chargee.
Le parametre streaming indique que ce fichier audio peut commencer la lecture avant la fin du chargement.

Le paramètre bufferTime prend la valeur -1 par défaut. Si la méthode constructeur detecte une valeur négative dans le paramètre bufferTime, elle définit la propriétébufferTime sur la valeur deSoundMixer.bufferTime.Ceci permet à l'application de prendre la valeur SoundMixer.bufferTime globale, par défaut, comme souhaité.

Si le paramètre autoLoad est défini sur true, la méthode constructeur appelle immédiatement la méthode load() suivante pour commencer le chargement du fichier audio:

public function load():void
{ if (this.isPlaying) { this.stop(); this.s.close(); } this.isLoaded = false; this.s = new Sound(); this.s.addEventListener(ProgressEvent.PROGRESS, onLoadProgress); this.s.addEventListener(Event.Open, onLoadOpen); this.s.addEventListener(Event.COMPLET, onLoadComplete); this.s.addEventListener(Event.ID3, onID3); this.s.addEventListener(IOErrorEvent.IO_ERROR, onIOError); this.s.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onIOError); var req:URLRequest new URLRequest(this.url); var context:SoundLoaderContext = new SoundLoaderContext(this.bufferTime, true); this.s.load(req, context);

La méthode load() create un objet Sound puis ajoute des écouteurs pour tous les événements de son importants. Elle indique ensuite à l'objet Sound de charger le fichier audio, à l'aide d'un objet LoaderContext pour transmettre la valeur bufferTime.

Etant donné que la propriété url peut être modifiée, vous pouze utiliser une occurrence de SoundFacade pour lire différents fichiers audio à la suite : il vous suffit de modifier la propriété url et d'appeler la méthode load() afin de charger le nouveau fichier audio.

Les trois méthodes d'écouteur d'évenement suivantes indiquent comment l'objet SoundFacade suit la progression du chargement et decide quand lancer la lecture du son :

public function onLoadOpen(event:Event):void { if (this.isStreaming) { this.isReadyToPlay = true; if (autoPlay) { this.play(); } } this.delayEvent(event.clone()); }
public function onLoadProgress(event:ProgressEvent):void { this.delayEvent(event.clone()); }
public function onLoadComplete(event:Object):void { this.isReadyToPlay = true; this.isLoaded = true; this.delayEvent(evt.clone()); if (autoPlay && !isPlaying) { play(); }

La méthode onLoadOpen() s'exécuté lorsqu'le chargement du son commence. Si vous pouvez lire le son en mode continu, la méthode onLoadComplete() définit immédiatement l'indicateur isReadyToPlay sur true. L'indicateur isReadyToPlay déterminée si l'application peut lancer la lecture du son, peut-être en réponse à une action utilisateur (clic sur un bouton de lecture, par exemple). La classe SoundChannel gère la mise en mémoire tampon des données audio. Par conséquent, il est inutile de vérifier si suffisamment de données ont été chargées avant d'appeler la méthode play().

La méthode onLoadProgress() s'exécuté régulièrement pendant le chargement. Elle envoie simplement une copie de son objet ProgressEvent pour le code qui utilise cet objet SoundFacade.

Une fois que les données audio ont eté complètement chargées, la méthode onLoadComplete() s'exécuté en appelant la méthode play() pour dessons non diffusés en continu, si nécessaire. La méthode play() est décrite ci-dessous.

public function play(pos:int = 0 ):void
{ if(!this.isPlaying) { if (this.isReadyToPlay) { this.sc = this.s.play(pos); this.sc.addEventListener(Event.SOUND_COMPLETE,onPlayComplete); this.isPlaying = true; this.playTimer = new Timer(thisprogressInterval); this.playTimer.addEventListener(TimerEvent.TIMER,onPlayTimer); this.playTimer.start(); } }

La méthode play() appelle la méthode sound.play() lorsque le son peut être lu. L'objet SoundChannel résultat est stocké dans la propriété sc. La méthode play() create ensuite un objet Timer qui sera utilisé pour envoyer des événements de progression de la lecture à des intervalles réguliers.

Affichage de la progression de la lecture

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La création d'un objet Timer pour surveiller la lecture est une opération complexe que vous doivent coder une seule fois. Le fait d'encapsulator cette logique Timer dans une classe réutilisable telle que la classe SoundFacade permet aux applications d'écouter les mêmes types d'évenements de progression lorsqu'un son est chargeé et lorsqu'il est lu.

L'objet Timer créé par la méthode SoundFacade.play() envoié une occurrence de TimerEvent toutes les secondes. La méthode onPlayTimer() s'exécuté chaque fois qu'un nouveau TimerEvent arrive :

public function onPlayTimer(event:TimerEvent):void
{ var estimatedLength:int = Math.ceil(this.s.length/ (this.s.bytesLoaded / this.s.bytesTotal)); var progEvent:ProgressEvent = new ProgressEvent(PLAYProgress, false, false, this.sc.position, estimatedLength); this DISPatchEvent(progEvent);
}

La méthode onPlayTimer() implémente la technique d'estimation de la taille décrite dans la section « Surveillance de la lecture » à la page 467. Elle creée ensuite une occurrence de ProgressEvent avec un type d'évenement de SoundFacade.PROGRESS, avec la propriété bytesLoaded définitie sur la position actuelle de l'objet SoundChannel et la propriété bytesTotal définitie sur la longueur estimée des données audio.

Interruption et reprise de la lecture

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La méthode SoundFacade.play() désigné le casque. Si la valeur pos est zéro, la lecture du son commence au début.

La méthode SoundFcade.stop() accepte également un paramètre pos, comme indiqué ici:

public function stop(pos:int = 0 ):void
{ if (this.isPlaying) { this.pausePosition = pos; this.sc.stop(); this.playTimer.stop(); this.isPlaying = false; }

Chaque fois que la méthode SoundFacade.stop() est appelée, elle définit le contrôle position de façon à ce que l'application sache où positionner la tête de lecture si l'utilisateur souhaite reprendre la lecture du même son.

Les méthodes SoundFacade.pause() et SoundFacade.resume() indiquées ci-dessous appelant les méthodes SoundFacade.stop() et SoundFacade.play() respectivement, transmettant chaque fois une valeur de paramètre posit.

public function pause():void { stop(this.sc.position); }   
public function resume():void { play(this.pausePosition); } 

La méthode pause() transmet la valeur SoundChannel.position actuelle à la méthode play(), qui la stocke dans la propriété pausePosition. La méthode resume() recommence à dire le même son en utilisant la valeur pausePosition comme point de début.

Extension de l'exemple Podcast Player

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Cet exemple présente un Podcast Player dépouillé qui présente l'utilisation de la classe SoundFacade réutilisable. Vous pouvez ajouter d'autres fonctions pour améliorer l'utilité de cette application, notamment :

  • stocker la liste des fils de syndication et des informations d'utilisation concernant chaque episode dans une occurrence de SharedObject pouvant être utilisé la prochaine fois que l'utilisateur exécute l'application ;
  • permettre à l'utilisateur d'ajouter son fil de syndication à la liste des chaînes de podcast ;
  • memoriser la position de la tete de lecture lorsque l'utiliseur arrête ou quitte un episode de façon à ce qu'il puisse être redémarré à partir de ce point la prochaine fois que l'utiliseur exécute l'application ;
  • télécharger des fichiers mp3 d'episodes pour les écouter hors ligne, lorsque l'utilisateur n'est pas connecté à Internet;
  • ajouter des fonctions d'abonnement qui vérifier régulièrement la présence de nouveaux épisodes dans une chaîne de podcast etmettre à jour la liste des épisodes automatiquement;
  • ajouter une fonctionnalité de recherche de podcasts à l'aide d'une API à partir d'un service d'hebergement de podcasts, tel que Odeo.com.

Chapitre 25 : Utilisation de la video

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La videoa avec Flash est l'une des technologies dominantes d'Internet. Toutefois, l'interface traditionnelle de la videoo, dans un ecran rectangular avec une barre de progression surmontant des boutons de contrôle, n'est que l'un des usages possibles de la videoo. En ActionScript, il est possible de contrcler avec précision le chargement, la presentation et la lecture d'une videoo.

Principes de base de la video

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La possibilité de dire et manipuler des informations video en ActionScript, au même titre que les autres éléments multimédias (images, texte, animations, etc.) est l'une des principales caractéristiques d'Adobe Flash Player et d'Adobe AIR™. Lorsque vous creez un fjichier video Flash (FLV) dans Adobe Flash CS4 Professional, vous avez la possibilité de selectionner un habillage, ou « enveloppe», comportant les commandes de lecture courantes. Toutefois, vous n'êtes pas limité aux options disponibles. ActionScript offre un contrôle précis du chargement, de l'affichage et de la lecture de la video, et vous pouze creatorer toute propre enveloppe ou utiliser une video de façon beaucoup moins traditionnelle. La gestion de la video en ActionScript nécessite de travailler avec une combinaison de plusieurs classes :

  • Classe Video : la zone de contenu video traditionnelle affichée sur la scène est une occurrence de la classe Video. La classe Video est un objet d'affichage, qu'il est donc possible de manipuler à l'aide des mêmes techniques que les autres objets d'affichage (positionnement, application de transformations, de filtrés et de modes de fusion, etc.).
  • Classe StageVideo : la classe Video fait traditionnellement appel au décodage et au rendu logiciels. Si un périhérique gère l'accelération matérielie par processeur graphique, l'utilisation de la classe StageVideo permet à l'application d'exploiter pleinement la presentation à accelération matérielie. L'API StageVideo intègre un ensemble d'événements qui indiquent au code quand passer d'un objet StageVideo à un objet Video et inversement. La video sur la scene impose diverses restrictions mineures en matière de lecture de video. Si l'application gère ces restrictions, mettez en œuvre l'API StageVideo. Voir « Directives et restrictions » à la page 530.
  • Ensemble : lorsque vous chargez un fischierté video qui doit être contrôle en ActionScript, une occurrence de NetStream représentée la source du contenu video (dans ce cas précis, un flux de données video). L'utilisation d'une occurrence de NetStream nécessite d'utiliser également un object NetConnection, qui assure la connexion avec le fischierté video, comme un tunnel qu'emprunteraient les données video.
  • Classe Camera : si vous doivent des données provenant d'uneamera connectée à l'ordinateur de l'utilisateur, une occurrence de Camera représentée la source du contenu video (laamera de l'utilisateur et les données video qu'elle transmet). Nouvelle dans Flash Player 11.4 et AIR 3.4 : vous pouvez utiliser uneamera pour alimenter StageVideo.

Pour charger un fisier video externe, vous pouvez charger ce fisier à partir d'un serveur Web standard (telechargement progressif) ou gérer de la video en flux continu transmise par un serveur spécialisé tel que Flash Media Server d'Adobe.

Concepts important et terminologie

Point de repère Marqueur qu'il est possible de placer en un point spécifique d'un filchier video, notamment pour l'utiliser comme signet pour repérer ce point à partir du début de la video ou pour fournir des données supplémentaires associées à ce moment de la video.

Codage Processus de conversion de données video d'un format dans un autre format video. Par exemple, la conversion d'une video source en haute résolution dans un format plus adapté à la diffusion sur Internet.

Image Elément de base des informations video. Chaque image s'apparente à un cliché photographique représentant un moment précis. La lecture en sequence à vitesse élevée de ces images fixes donne l'illusion du mouvement.

Image-clé Image video qui contient l'ensemble des informations de l'image. Les autres images qui suivent une image-clé ne contiennent que les informations décrivant leurs différences par rapport à l'image-clé, et non pas les informations d'image complètes.

Métadonnées Informations sur un fichier video intégrées à ce fichier et lues après son chargement.

Téléchargement progressif Lorsqu'un fjichier video est transmis par un serveur Web standard, les données video sont chargées en mode progressif, c'est-à-dire en séquences. L'avantage est qu'il est possible de commencer à diffuser la video avant la fin du téléchargement complet. Toutefois, il est alors impossible de passer directement à une partie de la video qui n'a pas encore été chargée.

Diffusion en continu Pour éviter le téléchargement progressif, il est possible d'utiliser un serveur videoé spécial pour diffuser de la videoe sur Internet selon une technique connue sous le nom de diffusion en continu. Avec la diffusion en flux continu, l'ordinateur client ne charge jamais toute la videoe à la fois. Pour accélérer les délais de chargement, l'ordinateur n'a besoin, à un moment donné, que d'une partie de l'ensemble des informations videoe. comme un serveur spécial contrôle la diffusion du contenu videoe, une partie qualconque de celle-ci peut être transmise à tout moment, et il n'est donc pas nécessaire d'attendre qu'elle soit chargée pour y acceder.

Présentation des formats video

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Outre le format video Adobe FLV, Flash Player et Adobe AIR prenant en charge les contenus video et audio codés au format H.264 et HE-AAC des formats de filchier standard MPEG-4. Ces formats diffusent des videos de qualité supérieure à des débits inférieurs. Les développpeurs peuvent utiliser les outils standard, notamment Adobe Premiere Pro et Adobe After Effects, pour creer et partager du contentu video de grande qualité.

TypeFormatContenant
VidéoH.264MPEG-4: MP4, M4V, F4V, 3GPP
VidéoSorenson SparkFichier FLV
VidéoON2 VP6Fichier FLV
AudioAAC+ / HE-AAC / AAC v1 / AAC v2MPEG-4:MP4, M4V, F4V, 3GPP
AudioMp3Mp3
AudioNellymoserFichier FLV
AudioSpeexFichier FLV

Voir aussi

Flash Media Server : codecs pris en charge

Technologie HTTP Dynamic Streaming d'Adobe

Codage video destiné aux péripériques mobiles

AIR sur Android peut decoder un large évventail de videos H.264. Toutefois, seul un jeu partiel réduit de videos H.264 bénéficia d'une lecture fluide sur un téléphone portable. De nombreux téléphones portables ne disposent en effet pas d'une puissance de traitement suffisante. Adobe Flash Player pour périphérique mobile peut decoder les videos H.264 par le biais d'une accélération matérielle intégrée. Ce décodage allie une qualité de lecture supérieure à une consommation réduite.

Le standard H.264 prend en charge plusieurs techniques d'encodage. Seuls les péripériques de pointe assurent une lecture fluide avec des profils et niveaux complexes. La plupart des péripériques peut toutefois dire des videos codées en profil de base. Sur les péripériques mobiles, un jeu partiel de ces techniques exploite l'accelération matérielle. Le profil et les paramètres de niveau définissant ce jeu partiel de paramètres et techniques de codage utilisé par l'encodeur. Pour les développpeurs, il se traduit par la conversion de la video à la résolution sélectionnée, assurant ainsi une lecture fluide sur la plupart des péripériques.

Bien que les résolutions qui exploitent l'accelération matérielle varient d'un périphérique à l'autre, la plupart de ces derniers prend en charge les résolutions standard suivantes.

FormatRésolutions recommandées
4:3640 × 480512 × 384480 × 360
16:9640 × 360512 × 288480 × 272

Remarque : Flash Player prend en charge tous les niveaux et profils du standard H.264. Le respect de ces recommendations assure l'accelération matérielle et une expérience utilisateur optimisée sur la plupart des péripériques. Ces recommendationns ne sont pas obligatoires.

Pour plus d'informations et pour obtenir la liste des paramétres d'encodage dans Adobe Media Encoder CS5, voir Recommendations for encoding H.264 video for Flash Player 10.1 on mobile devices (disponible en anglais uniquement).

Remarque : sous iOS, seules les videos codées avec les codecs Sorenson Spark et On2 VP6 peuvent être lues à l'aide de la classe Video. Vous pouze dire les données videos H.264 dans le lecteur video du périhérique en accédant à l'URL de la video à l'aide de la fonction flash.netNavigateToURL(). Vous pouze également dire les données video H.264 à l'aide de la balise

Compatibilité de Flash Player et AIR avec les fichiers video codés

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Flash Player 7 prend en charge les fichiers FLV codés avec le codec video Sorenson™ Spark™. Flash Player 8 prend en charge les fichiers FLV codés avec l'encodeur Sorenson ou On2 VP6 dans Flash Professional 8. Le codec On2 VP6 prend en charge un canal alpha.

Flash Player 9.0.115.0 et les versions ultérieures prenrent en charge les fischiers dérivés du format contueur standard MPEG-4. Ces fischiers sont les suivants : F4V, MP4, M4A, MOV, MP4V, 3GP et 3G2, s'ils contiennent de la vente H.264 ou de l'audio code au format HE-AAC v2, ou les deux. H.264 produit une qualité video supérieure à un débit inférieur par rapport au même profil d'encodage dans Sorenson ou On2. HE-AAC v2 est une extension du format AAC, format audio standard définis dans la norme video MPEG-4. HE-AAC v2 utilise les techniques de réplique spectrale de bande (SBR - Spectral Band Replication) et de stéreo paramétrique pour optimiser l'efficacité de l'encodage à des vitesses de transfert inférieures.

Le tableau suivant répertorie les codecs pris en charge. Il décrit également le format de fichier SWF correspondant et les versions de Flash Player et d'AIR requises pour les dire:

CodecVersion du format de fichier SWF (version de publication la plus récente prise en charge)Flash Player et AIR (version la plus récente requise pour la lecture)
Sorenson Spark6Flash Player 6, Flash Lite 3
On2 VP66Flash Player 8, Flash Lite 3 Seuls Flash Player 8 et les versions ultérieures prennt en charge la publication et la lecture des vidés On2 VP6.
H.264 (MPEG-4 Part 10)9Flash Player 9 Mise à jour 3, AIR 1.0
ADPCM6Flash Player 6, Flash Lite 3
Mp36Flash Player 6, Flash Lite 3
AAC (MPEG-4 Part 3)9Flash Player 9 Mise à jour 3, AIR 1.0
Speex (audio)10Flash Player 10, AIR 1.5
Nellymoser6Flash Player 6

Présentation des formats de fichiers video Adobe F4V et FLV

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Adobe fournit des formats de fichiers video pour diffuser en contin un contenu à Flash Player et à AIR. Pour une description complète de ces formats de fichiers video, voir www.adobe.com/go/video_file_format_fr.

Format de fichier video F4V

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

A partir de Flash Player Update 3 (9.0.115.0) et AIR 1.0, Flash Player et AIR prennant en charge le format video Adobe F4V qui découle du format ISO MP4. Les sous-ensembles du format prennant en charge des fonctions diverses. Flash Player s'attend à ce qu'un fichier F4V valide commence par l'une des boîtes de haut niveau suivantes :

ftyp

La boîte ftyp identifie les fonctions qu'un programme doit prendre en charge pour diffuser un format de fichier particulier.

moov

La boîte moov est effectivement l'en-été d'un fichier F4V. Elle contient une ou plusieurs autres boîtes qui à leur tour contiennent d'autres boîtes et qui définissent la structure des données F4V. Un fichier F4V ne doit containir qu'une seule boîte moov.

  • mdat

Une boîte mdat contient les données " utiles " pour le fichier F4V. Un fichier F4V ne doit containir qu'une seule boîte mdat. Une boîte moov doit également se trouver dans le fichier parc que l boîte mdat ne peut pas être comprise si elle est seule.

Les fichiers F4V prenent en charge des entiers multioctets dans un ordre d'octets gros-boutiste, dans lequel l'octet le plus significatif parait le premier, à l'adresse la plus BASSE.

Format de fichier video FLV

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Le format de fichier Adobe FLV contient des données audio et video codées pour un acheminement via Flash Player. Vous pouvez utiliser un codeur, tel qu'Adobe Media Encoder ou Sorenson™ Squeeze, pour convertir un fichier video QuickTime ou Windows Media en un fichier FLV.

Remarque : vous pouvez creer des fichiers FLV en important la video dans Flash et en l'exportant sous forme de fichier FLV. Vous pouvez utiliser le module d'exportation FLV pour exporter des fichiers FLV à partir des applications de montage video prises en charge. Pour charger des fichiers FLV à partir d'un serveur Web, enregistrrez l'extension de fichier et le type MIME auprès de votre serveur Web. Pour ce faire, consultez la documentation du serveur. Le type MIME des fichiers FLV est video/x-flv. Pour plus d'informations, voir « A propos de la configuration de fichier FLV pour l'hebergement sur un serveur » à la page 522.

Pour plus d'informations sur les fichiers FLV, voir « Rubriques avancées relatives aux fichiers video » à la page 521.

Vidente externe contre video intégrée

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

L'utilisation des fichiers video externes offre certaines fonctionnalités qui ne sont pas disponibles avec l'utilisation de la video importée :

  • Les clips video de longue durée peuvent être utilisés dans votre application sans ralentir la lecture. Les fischiers video externes utilisent la mémoire cache, ce qui signifie que les fischiers volumineux sont enregistrés en petites parties et sont accessibles dynamiquement. Par conséquent, les fischiers F4V et FLV externes ne nécessitant pas autant de mémoire que les fischiers video intégrés.
  • Un fjichier videoo externe peut avoir une cadence différente de celle du fjichier SWF dans lequel il est lu. Par exemple, vous pouze définir la cadence du fjichier SWF sur 30i/s (images par seconde) et celle de l'image videoo sur 21i/s. Ce réglage vous offre un meilleur contrôle de la videoo que la videoo intégrée, pour assurer une lecture videoo fluide. Il permet aussi de dire les fjichiers videoo à différentes cadences d'images sans avoir à ALTERER un contenu SWF existant.
  • Avec les fichiers video externes, la lecture du contenu SWF n'est pas interrompu lors du chargement du fisier video. Les fichiers video importés peuvent parfois interrompre la lecture du document pour exécuter certaines fonctions, par exemple pour acceder à un lecteur de CD-ROM. Les fichiers video peuvent exécuter des fonctions indépendamment du contenu SWF, sans interrompré la lecture.
  • Le sous-titrage du contenu video est plus facile avec les fichiers FLV externes, car les gestionnaires d'evénements permettent d'acceder aux métadonnées de la video.

Présentation de la classe Video

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La classe Video permet d'afficher un flux video en direct dans une application sans l'imbriquer dans votre fichier SWF. Vous pouvez capturer et dire du contenu video en dire à l'aide de la méthode Camera.getCamera(). Vous pouvez également utiliser la classe Video pour dire les fischiers video en HTTP ou sur le système de fischiers local. Il existe plusieurs façon d'utiliser la classe Video dans vos projets.

  • Chargement dynamique d'un filchier video à l'aide des classes NetConnection et NetStream, et affichage de la video dans un objet Video.
  • Capture du signal provenant de laamera de l'utilisateur. Pour plus d'informations, voir « Utilisation de caméras » à la page 537.
  • Utilisation du composant FLVPlayback.
  • Utilisation de la commande VideoDisplay.

Remarque : les occurrences d'un objet Video sur la scene sont des occurrences de la classe Video.

Bien que la classe Video se trouve dans le package flash.media, elle hérite de la classe flash.display.DisplayObject. Par conséquent, toutes les fonctionnalités des objets d'affichage (transformation de matrice et filtres par exemple) s'appliquent aussi aux occurrences de l'objet Video.

Pour plus d'informations, voir « Manipulation des objets d'affichage » à la page 180, ainsi que les chapitres « Utilisation de la géométrie » à la page 218 et « Filtrage des objets d'affichage » à la page 276.

Chargement de fichiers video

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Le chargement de fichiers video à l'aide des classes NetStream et NetConnection s'effectue en plusieurs étapes. Il est commandé d'ajouter l'objet Video à la liste d'affichage, de joindre l'objet NetStream à l'occurrence de l'objet Video et d'appeler la méthode play() de l'objet NetStream dans l'ordre spécifique :

1 Créez un objet NetConnection. Dans le cas d'une connexion à un fjichier video local ou à un fjichier qui n'utilise pas de serveur, tel que le serveur Flash Media Server 2 d'Adobe, transmettez null à la méthode connect() pour dire les fjichiers video depuis une adresse HTTP ou un lecteur local. Dans le cas d'une connexion à un serveur, définiquee le paramètre sur l'URI de l'application qui contient le fjichier video sur le serveur.

2 Creez un nouvel objet Video qui affiche la video et ajoutez-le à la liste d'affichage sur la scene, comme indiqué dans l'extrait de code suivant :

var vid: Video = new Video();  
addChild(vid); 

3 Créez un objet NetStream en transmettant l'objet NetConnection au constructeur en tant qu'argument. L'extrait de code suivant connecte un objet NetStream à une occurrence de NetConnection et configure les gestionnaires d'évenement pour le flux de données :

var ns:NetStream = new NetStream(nc);   
ns.addEventListener(NetStatusEvent.NET_STATUS,net狀態Handler);   
ns.addEventListener(AsyncErrorEvent.Async_ERROR,asyncErrorHandler);   
function net狀態Handler(event:NetStatusEvent):void { // handle netStatus events, described later }   
function asyncErrorHandler(event:AsyncErrorEvent):void { // ignore error } 

4 Joignez l'objet NetStream à l'objet Video à l'aide de la méthode attachNetStream() de l'objet Video, comme indiquédans l'extrait de code suivant :

vid.attachNetStream(ns); 

5 Appelez la méthode play() de l'objet NetStream avec l'URL du filchier video comme argument pour lancer la lecture de la video. L'extrait de code suivant charge et lit un filchier video appelé « video.mp4 » dans le même repertoire que le filchier SWF :

ns.play("video.mp4"); 

Voir aussi

Flex: Contrôle Spark VideoPlayer

spark_components VideoDisplay

Contrôle de la lecture de la video

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La classe NetStream comporte quatre méthodes principales pour contrôle la lecture-video :

pause(): interrupt la lecture d'un flux video. Si la lecture de la video est déjà interrompue, l'appel de cette méthode n'a aucun effet.

resume(): reprend la lecture d'un flux video interrompu. Si la video est en cours de lecture, l'appel de cette méthode n'a aucun effet.

seek(): recherche l'image-clé la plus proche de l'emplacement spécifique (décalage, exprimé en secondes, par rapport au début du flux).

togglePause(): interrupt ou reprend la lecture d'un flux.

Remarque: il n'existe pas de méthode stop(). Pour arreter la lecture de la video, il est nécessaire de la dette en pause et de returner au début du flux video.

Remarque: la méthode play() ne reprend pas la lecture, elle est destinée au chargement de fichiers video.

L'exemple suivant montré comment contrôle la lecture d'une video à l'aide de divers boutons. Pour executer cet exemple, créez un document et ajoutez quatre occurrences de boutons à l'espace de travail (pauseBtn, playBtn, stopBtn et togglePauseBtn):

var nc:NetConnection = new NetConnection();   
nc.connect(null);   
var ns:NetStream = new NetStream(nc);   
ns.addEventListener(AsyncErrorEvent. ASYNC_ERROR, asyncErrorHandler);   
ns.play("video.flv");   
function asyncErrorHandler(event:AsyncErrorEvent):void { // ignore error }   
var vid:Video = new Video();   
vid.attachNetStream(ns);   
addChild(vid);   
pauseBt.addEventListener (MouseEvent.CLICK, pauseHandler); playBt.addEventListener (MouseEvent.CLICK, playHandler); stopBt.addEventListener (MouseEvent.CLICK, stopHandler); togglePauseBt.addEventListener (MouseEvent.CLICK, togglePauseHandler);   
function pauseHandler(event:MouseEvent):void { ns.pause(); } function playHandler(event:MouseEvent):void { ns.resume(); } function stopHandler(event:MouseEvent):void { // Pause the stream and move the playhead back to // the beginning of the stream. ns.pause(); ns.seek(0); } function togglePauseHandler(event:MouseEvent):void { ns.togglePause(); } 

Un clc sur l'occurrence de bouton pauseBtn pendant la lecture de la videoe provoque la mise en pause de celle-ci. Si la lecture de la videoe est déjà en pause, l'applé de cette méthode n'a aucun effet. Un clc sur l'occurrence de playBtn reprend la lecture de la videoe si celle-ci était en pause, sinon ce bouton n'a aucun effet.

Détection de la fin d'un flux videoo

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Pour afficher le début et la fin d'un flux video, vous doivent ajouter à l'occurrence de NetStream un écouteur pour l'évenement netStatus. L'exemple suivant montre comment écouter les divers codes pendant la lecture de la video :

ns.addEventListener(EventStatusEvent.NET_STATUS,statusHandler); function statusHandler(event:NetStatusEvent):void { trace(event.info.code) } 

Le code précédent affiche le résultat suivant :

NetStream.Play.Start   
NetStream.Bufferer EMPTY   
NetStream.Bufferer.Full   
NetStream.BuffererEMPTY   
NetStream.Bufferer.Full   
NetStream.BuffererEMPTY   
NetStream.Bufferer.Full   
NetStream.Bufferer.flush   
NetStream Play.stop   
NetStream.Bufferer EMPTY   
NetStream.Bufferer Flush 

Les deux codes d'évenement qu'il est nécessaire d'écouter sont « NetStream.Play.Start » et « NetStream.Play.Stop », qui signalent le début et la fin de la lecture de la vente. Le fragment de code suivant utilise une instruction « switch » pour filtrer ces deux codes et émettre un message :

function statusHandler(event:NetStatusEvent):void   
{ switch (event.info.code) { case "NetStream.Play.Start": trace("Start [" + ns.time.toFixed(3) + " seconds]") break; case "NetStream.Play_Stop": trace("Stop [" + ns.time.toFixed(3) + " seconds]") break; }   
} 

En écouteant l'évenement netStatus (NetStatusEvent.NET_STATUS), vous pouvez créé un lecteur video qui chargerà la video suivant dans une liste de lecture une fois la lecture de la video en cours terminée.

Lecture de videos en mode plein écran

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Flash Player and AIR you permutte de creer une aplicaion plein ecran pour la lecture de vretedeo et prennent en charge la mise a l'echelle de la video au mode plein ecran.

Pour le contenu AIR qui s'execute en mode plein écran sur le poste de travail, les options économiqueuseur d'écran et economie d'énergie du système sont désactivées lors de la lecture jusqu'à ce que le signal video s'arrête ou que l'utilisateur quitterle mode plein écran.

Pour plus d'informations sur l'utilisation du mode plein écran, voir « Utilisation du mode Plein écran » à la page 173.

Activation du mode plein écran pour Flash Player dans un navigateur

Avant que vous ne puissiez implémenter le plein écran pour Flash Player dans un navigateur, activez-le via le modele de publication de votre application. Les modèles qui permettent le mode plein écran comprendnent les balises et , qui contiennent un paramètre allowFullScreen. L'exemple suivant affiche le paramètre allowFullScreen dans une balise .

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="fullScreen" width="100%" height="100%" codebase="http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab">
    ...
    <param name="allowFullScreen" value="true" />
    <embed src="fullScreen.swf" allowFullScreen="true" quality="high" bgcolor="#869ca7" width="100%" height="100%" name="fullScreen" align="middle" play="true" loop="false" quality="high" allowScriptAccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.adobe.com/go/getflashplayer">
        </embed>
    ...
</object> 

Dans Flash,CHOISSEZ Fichier · > Parametres de publication,puis dans la boite de dialogue Parametres de publication, cliquez sur Ionglet HTML,puis selectionnee le modele Flash seulement-Autorisation du Plein ecran.

Dans Flex, assurez-vous que le modèle HTML inclut les balises et qui prennant en charge le plein écran.

Activation du mode plein écran

Pour le contenu de Flash Player s'executant dans un navigateur, le mode plein écran de la video est activé en réponse à un clic de souris ou à une pression sur une touche. Par exemple, vous pouze activer le mode plein écran lorsque l'utilisateur clique sur un bouton appelé Plein écran ou selectionne une commande Plein écran dans un menu contextual. Pour répondre à l'utilisateur, ajoutez un écouteur d'évenement à l'objet sur lequel se produit l'action. Le code suivant ajoute un écouteur d'évenement à un bouton sur lequel l'utilisateur clique pour acceder au mode plein écran :

varfullScreenButton:Button = new Button();
fullScreenButton.label "Full Screen";
addChild(fullScreenButton);
fullScreenButton.addEventListener(MouseEvent.CLICK,fullScreenButtonHandler);
functionfullScreenButtonHandler(event:MouseEvent)
{ stage.displayState StageDisplayState.FULLSCREEN;
}

Le code active le mode plein écran en définissant la propriété Stage.displayState sur StageDisplayStateFULLSCREEN. Ce code affiche la totalité de la scène en mode plein écran et met à l'échelle la video selon les proportions de l'espace qu'elle occupe sur la scène.

La propriété fullScreenSourceRect vous permet de spécifique une zone particulière de la scène en vue de l'afficher en mode plein écran. Définissez tout d'abord le rectangle que vous souhaitez afficher en mode plein écran. Ensuite, affectez-le à la propriété Stage.fullScreenSourceRect. Cette version de la fonction

fullScreenButtonHandler() ajoute deux lignes supplémentaires de code qui n'activent le plein écran que pour la video.

private function fullScreenButtonHandler(event: MouseEvent)
{ var screenRectangle:Rectangle = new Rectangle(video.x, video.y, video.width, video.height); stage.fullScreenSourceRect = screenRectangle; stage.displayState = StageDisplayState.FULLSCREEN;
}

Bien que cet exemple invoque un gestionnaire d'évenement en réponse à un clic de souris, la technique d'activation du mode plein écran est la même pour Flash Player et pour AIR. Définissez le rectangle que vous souhaitezbitset à l'échelle, puis définissez la propriété Stage.displayState. Pour plus d'informations, voir le manuel Guide de référence ActionScript 3.0 pour la plate-forme Adobe Flash.

L'exemple complet qui suit ajoute le code permettent de creer la connexion et l'objet NetStream pour la video, puis commence a le litre.

package
{ import flash.net.NetConnection; import flash.net.NetStream; import flash.media Video; import flash.display.StageDisplayState; import fl.control.SButton; import flash.display.Sprite; import flash.events.MouseEvent; import flash.eventsFULLScreenEvent; import flashgeomRectangle; public class FullScreenVideoExample extends Sprite { var fullScreenButton:Button = new Button(); var video:Video = new Video(); public function FullScreenVideoExample() { var videoConnection:NetConnection = new NetConnection(); videoConnection.connect(null); var videoStream:NetStream = new NetStream(videoConnection); videoStream.client = this; addChild(video); video.attachNetStream(videoStream); videoStream.play("http://www.helpexamples.com/flash/video/water.flv"); fullScreenButton.x = 100

public function onMetaData(infoObject:Object):void
{
    // stub for callback function
} 

La fonction onMetaData() est une fonction de rappel pour gérer les métadonnées de la video, si celles-ci existent. Une fonction de rappel est une fonction que le moteur d'exécution appelle en réponse à certains types d'occurrences ou d'événements. Dans cet exemple, la fonction onMetaData() est une souche capable de fournir la fonction. Pour plus d'informations, voir « Ecriture de méthodes de rappel pour les métadonnées et les points de repère » à la page 502

Détection du mode plein écran

Tout utiliser peut désactiver le mode plein écran à l'aide de l'un des raccourcis clavier, notamment en appuyant sur la touche Echap. En ActionScript, vous pouvez désactiver le mode plein écran en définissant la propriété Stage.displayState sur StageDisplayState.NORMAL. Dans l'exemple suivant, le code désactive le mode plein écran lorsque l'évenement netStatus de NetStream.Play_Stop se produit.

videoStream.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); 
private function netStatusHandler(event:NetStatusEvent)  
{  
    if(event.info.code == "NetStream.Play.Stop")  
        stage.displayState = StageDisplayState恢复正常;  
} 

Accélération matérielle en mode plein écran

Lorsque vous modifiez la mise à l'échelle d'une zone rectangulaire de la scene en lui appliquant le mode Plein écran, Flash Player ou AIR utilise l'accelération matérielle, à condition que cette fonction soit disponible et activée. Le moteur d'exécution utilise l'adaptateur video de l'ordinateur pour accélérer la mise à l'échelle de la video ou d'une partie de la scène au mode Plein écran. Dans ces cas, les applications Flash Player peuvent souvent en profiter en basculant sur la classe StageVideo à partir de la classe Video (ou de la classe Camera pour Flash Player 11.4/AIR 3.4 et les versions ultérieures).

Pour plus d'informations sur l'accelération matérielle en mode Plein écran, voir « Utilisation du mode Plein écran » à la page 173. Pour plus d'informations sur StageVideo, voir « Présentation à accelération matérielle par le biais de la classe StageVideo » à la page 528.

Lecture de fichiers video en flux continu

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Pour effectuer une lecture en flux continu à partir d'un serveur Flash Media Server, vous pouvez utiliser les classes NetConnection et NetStream afin d'établier la connexion avec une occurrence de serveur distant et dire le flux spécifique. Pour spécifique un serveur RTMP (Real-Time Messaging Protocol), il suffit de transmettre l'URL RTMP désirée, par exemple « rtmp://localhost/appName/appInstance » à la méthode NetConnection.connect() au lieu de lui transmettre la valeur null. Pour dire un flux video direct ou enregistré à partir du serveur Flash Media Server spécifique, passez soit un identifient (pour le signal video en direct publié par NetStream.publish)), soit le nom du fichier enregistré, à la méthode NetStream.play().

Envoi de video à un serveur

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Si vous souhaitez créé des applications plus complexes avec des objets Video ou Camera, Flash Media Server (FMS) offre diverses possibités de diffusion de flux multimédia ainsi qu'un environnement de développement pour créé des applications multimédia et les distribuer à l'intention d'un public très large. Cette combinaison permet aux développpeurs de créé des applications telles que video à la demande, diffusion d'événements en direct sur le Web et diffusion en flux continu MP3, mais aussi blog video, videomessagerie ou conversation multimédia. Pour plus d'informations, voir la documentation de Flash Media Server disponible en ligne à l'adresse suivante :

www.adobe.com/go/learn_fms_docs_fr.

Présentation des points de repère

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Vou puez integrer des points de repere dans un fichier video F4V ou FLV durant le codage. A l'origine, les points de repere etait integres dans des films pour signaler visuement au projectionniste que la bobine s'approchait de la fin. Dans les formats video Adobe F4V et FLV, un point de repere vous permit de déclencher une ou plusieurs actions dans votre application au moment où il survient dans le flux video.

Vou puezutilierplusieurs types de points de repere avecFlash Video ACTIONScriptpermet d'interagiravec les points de repere que you integrez dans un fichier video lorsque you le creez.

  • Points de repère de navigation : vous intégréz des points de repère de navigation dans le flux et le paquet de métadonnées video lorsque vous codez le filchier video. Les points de repère de navigation permettent aux utilisateurs de rechercher une partie spécifique d'un filchier.
  • Points de repère d'évenement : vous intégrrez des points de repère d'évenement dans le flux et le paquet de métadonnées video lorsque vous codez le fichier video. Il est possible d'écrittre du code pour gérer les événements qui sont déclenchés aux points spécifique pendant la lecture.

  • Points de repère ActionScript : les points de repère ActionScript sont disponibles uniquement pour le composant FLVPlayback de Flash. Les points de repère ActionScript sont des points de repère externes que vous créez et auxquels vous accédez à l'aide du code ActionScript. Du code permet de déclencher ces points de repère en fonction de la lecture video. Ces points de repère sont moins précis que les points de repèvre intégrés (jusqu'à un dixieme de seconde), car le lecteur video les analyse séparément. Si vous avez l'intention de créé une application dans laquelle il sera possible d'atteindre un point de repère, créez et intégrrez les points de repère lors de l'encodage du fichier, au lieu d'utiliser des points de repère ActionScript. Il est préféable d'intégrer les points de repère dans le fichier FLV, car ils sont alors plus précis.

Les points de repère de navigation créé une image-clé à l'emplacement spécifique, pour permettre de déplacer la tête de lecture du lecteur video à cet emplacement. Vous pouze définir des points particuliers dans un fjichier video pour permettre aux utilisateurs d'atteindre un emplacement précis. Par exemple, si votre video contient plusieurs chapitres et segments, vous pouze la contrôle en intégrant des points de repère de navigation dans le fjichier video.

Pour plus d'informations sur le codage de fichiers video Adobe avec des points de repère, voir « Intégration de points de repère » dans Utilisation de Flash.

Voupe acceder aux parametes des points de repere à l'aide de code ActionScript. Les parametes de points de repere font partie de l'objet d'évenement reçu du gestionnaire de rappel.

Le gestionnaire d'évenement NetStream.onCuePoint permet de déclencher certaines actions dans votre code lorsque le fjichier FLV atteint un point de repère spécifique.

Pour synchroniser une action avec un point de repère dans un filiard video F4V, vous doivent récapier les données de point de repère des fonctions de rappel onMetaData() ou onXMPData() et déclencher le point de repère à l'aide de la classe Timer dans ActionScript 3.0. Pour plus d'informations sur les points de repère de F4V, voir « Utilisation d'onXMPData() » à la page 514.

Pour plus d'informations sur l'utilisation des points de repère et des métadonnées, voir « Ecriture de méthodes de rappel pour les métadonnées et les points de repère » à la page 502.

Écriture de méthodes de rappel pour les métadonnées et les points de repère

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Voupe declencher des actions au sein de suaive application lorsque le lecteur recoit des metadonnées spécifiques ou lorsque des points de repere particuliers sont atteints. Lorsque ces événements se produit, vousdezutiliser des méthodes de rappel spécifiques en tant que gestionnaires d'événements. La classe NetStream spécifie les événements de metadonnées suivants qui se produit lors de la lecture : onCuePoint (fichiers FLV uniquement), onImageData, onMetaData, onPlayStatus, onTextData et onXMPData.

Si vous ne creez pas de méthodes de rappel pour ces gestionnaires, le moteur d'exécution Flash risque de générer des erreurs. Par exemple, le code ci-dessous lit le fichier FLV video.flv situé dans le même dossier que le fichier SWF :

var nc:NetConnection = new NetConnection();   
nc.connect(null);   
var ns:NetStream = new NetStream(nc);   
ns.addEventListener(AsyncErrorEvent. ASYNC_ERROR, asyncErrorHandler);   
ns.play("video.flv");   
function asyncErrorHandler(event:AsyncErrorEvent):void { trace(event.text);   
}   
var vid:Video = new Video();   
vid.attachNetStream(ns);   
addChild(vid); 

Le code ci-dessus charge un fjichier videoo local nomme video.flv et attend la distribution de l'evénement asyncError (AsyncErrorEvent.Async_ERROR). Cet événement est distribué lorsqu'une exception est renvoyée par du code asynchrone natif. Dans notre cas, il est distribué lorsque le fjichier videoo contient des métadonnées ou des informations de point de repère et que les écouteurs appropriés n' ont pas été définis. Le code ci-dessus gère l'evénement asyncError et ignore l'erreur si vous n'étés pas intéresse par les métadonnées ou les informations de point de repère. Si vous disposiez d'un fjichier FLV avec des métadonnées et plusieurs points de repère, la fonction trace() afficherait les messages d'erreur suivants:

L'erreur est renvoyée parce que l'objet NetStream n'a pas trové de méthode de rappel pour onMetaData ou onCuePoint. Il existe plusieurs façon de définir ces méthodes de rappel dans une application.

Voir aussi

Flash Media Server : Gestion des métadonnées dans les flux

Définir la propriété « client » de l'objet NetStream comme Object

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

En définissant la propriété client comme étant soit un object, soit une sous-classe de NetStream, vous pouze ré-router les méthodes de rappel de onMetaData et onCuePoint ou les ignorer totalement. L'exemple suivant montre comment utiliser un objet vide poururarer les méthodes de rappel sans écouter l'évenement asyncError:

Pour écouter les méthodes de rappel de onMetaData ou onCuePoint, il est nécessaire de définir des méthodes pour les gérer, comme dans le fragment de code suivant :

var customClient:Object = new Object();   
customClient.onMetaData = dataHandler;   
function dataHandler(infoObject:Object):void { trace("metadata"); } 

Le code ci-dessus écoute la méthode de rappel de onMetaData et appelle la méthode metaDataHandler(), qui renvoie une chaine. Si le moteur d'exécution Flash trouve un point de repère, aucune erreur n'est renvoyée, bien qu'aucune méthode de rappel de onCuePoint ne soit définie.

Créer une classe et définir des méthodes pour gérer les méthodes de rappel

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Le code suivant définit la propriété client de l'objet NetStream comme étant une classe personnalisée, CustomClient, qui définit des gestionnaires pour les méthodes de rappel :

var nc:NetConnection = new NetConnection();  
nc.connect(null);  
var ns:NetStream = new NetStream(nc);  
ns.client = new CustomClient();  
ns.play("video.flv");  
var vid:Video = new Video();  
vid.attachNetStream(ns);  
addChild(vid); 

La classe CustomClient contient le code suivant :

package   
{ public class CustomClient public function onMetaData(infoObject:Object):void trace("metadata"); } } 

La classe CustomClient définit un gestionnaire pour le rappel de onMetaData. Si un point de repère est détecté et que le gestionnaire de rappel de onCuePoint est appelé, un événement asyncError (AsyncErrorEvent. ASYNC_ERROR) est distribué pour informer que flash.net.NetStream n'a pas pu appeler de rappel pour onCuePoint. Pour éviter l' apparition de cette erreur, il est nécessaire de définir soit une méthode de rappel de onCuePoint dans la classe CustomClient, soit un gestionnaire d'événement pour l'événement asyncError.

Etendra la classe NetStream et lui ajouter des méthodes pour gérer les méthodes de rappel

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Le code suivant cree une occurrence de la classe CustomNetStream, qui sera definié ultérieurement :

var ns:CustomNetStream = new CustomNetStream();  
ns.play("video.flv");  
var vid:Video = new Video();  
vid.attachNetStream(ns);  
addChild(vid); 

L'exemple de code suivant définit la classe CustomStream qui étend la classe NetStream, prend en charge la création de l'objet NetConnection nécessaire, et gère les méthodes de rappel de onMetaData et onCuePoint :

package   
{ import flash.net.NetConnection; import flash.net.NetStream; public class CustomNetStream extends NetStream { private var nc:NetConnection; public function CustomNetStream() { nc = new NetConnection(); nc.connect(null); super(nc); } public function onMetaData(infoObject:Object):void { trace("metadata"); } public function onCuePoint(infoObject:Object):void { trace("cue point"); } } 

Si vous souhaitez denomner les méthodes onMetaData() et onCuePoint() de la classe CustomNetStream, utiliser le code suivant :

package
{ import flash.net.NetConnection; import flash.net.NetStream; public class CustomNetStream extends NetStream { private var nc:NetConnection; public var onMetaData:Function; public var onCuePoint:Function; public function CustomNetStream() { onMetaData = dataHandler; onCuePoint = cluePointHandler; nc = new NetConnection(); nc.connect(null); super(nc); } private function dataHandler(infoObject:Object):void { trace("metadata"); } private function cluePointHandler(infoObject:Object):void { trace("cue point"); } }

Etendra la classe NetStream et la rendre dynamique

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Voupez etendre la classe NetStream en creant une sous-classe dynamique afin de pouvoir ajouter dynamique le gestionnaires de rappel de onCuePoint et onMetaData. Le code suivant en fait la démonstration :

var ns:DynamicCustom本网stream = new DynamicCustom本网stream(); ns.play("video.flv"); var vid:Video = new Video(); vid.attachNetStream(ns); addChild(vid);

La classe DynamicCustomNetStream contient le code suivant :

Mémé sans gestionnaire pour le rappel de onMetaData et onCuePoint, aucune erreur n'est renvoyée puisque la classe DynamicCustomNetStream est dynamique. Si vous souhaitez définir des méthodes pour les gestionnaires de rappel de onMetaData() et onCuePoint(), utilisez le code suivant :

var ns:DynamicCustomStream new DynamicCustomStream();
ns.onMetaData = dataHandler;
ns.onCuePoint = cuePointHandler;
ns.play("http://www.helpexamples.com/flash/video/cuepoints.flv");
var vid:Video new Video();
vid.attachStream(ns);
addChild(vid);
function dataHandler(infoObject:Object):void { trace("metadata"); } function pointHandler(infoObject:Object):void { trace("cue point"); }

Définir la propriété « client » de l'objet NetStream comme this

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

En donnant à la propriété client la valeur this, l'application recherche dans la portée des méthodes onMetaData() et onCuePoint(). Le code suivant en est un exemple :

var nc:NetConnection = new NetConnection();  
nc.connect(null);  
var ns:NetStream = new NetStream(nc);  
ns.client = this;  
ns.play("video.flv");  
var vid:Video = new Video();  
vid.attachNetStream(ns);  
addChild(vid); 

Si les gestionnaires de rappel de onMetaData ou onCuePoint sont appelés et qu'il n'exist pas de méthode pour génér le rappel, aucune erreur n'est généraè. Pour génér ces gestionnaires de rappel, créez des méthodes onMetaData() et onCuePoint() dans votre code, comme dans le fragment de code suivant :

function onMetaData(infoObject:Object):void { trace("metadata"); } function onCuePoint(infoObject:Object):void { trace("cue point"); } 

Utilisation des points de repère et des métadonnées

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Les méthodes de rappel NetStream vous permettent de capturer et de Traits les événements de point de repère et de métadonnées lorsque la video est en cours de lecture.

Utilisation des points de repère

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Le tableau ci-dessous déscrit les méthodes de rappel que vous pouze utiliser pour capturer les points de repère F4V et FLV dans Flash Player et AIR.

Moteur d'exécutionF4VFLV
Flash Player 9/ AIR1.0OnCuePoint
OnMetaData
Flash Player 10OnCuePoint
OnMetaDataOnMetaData
OnXMPDataOnXMPData

L'exemple suivant utilise une boucle for...in simple pour effectuer une iteration sur chaque propriété du paramètre infoObject que recoit la fonction onCuePoint(). Ilappe lefonction trace() pour afficher un message lors de la réception de données de point de repere :

var nc:NetConnection = new NetConnection();
nc.connect(null);
var ns:NetStream = new NetStream(nc);
ns.client = this;
ns.play("video.flv");
var vid:Video = new Video();
vid.attachNetStream(ns);
addChild(vid);
function onCuePoint(infoObject:Object):void { var key:String; for (key in infoObject) { trace(key +": "+infoObject[key]); }
}
Le résultat suivant apparait :
parameters:
name: point1
time: 0.418
type: navigation

Ce code utilise l'une des techniques disponibles pour définir lobjet pour lequel la méthode de rappel est executée. Vous pouvez utiliser d'autres techniques; pour plus d'informations, voir « Ecriture de méthodes de rappel pour les métadonnées et les points de repère » à la page 502.

Utilisation des métadonnées de la video

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Voupez utilise les fonctions OnMetaData() et OnXMPData() pour acceder à des informations sur les métadonnées dans votre filchier video, y compris les points de repère.

Utilisation d'OnMetaData()

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Ces métadonnées comprend des informations sur le fjichier video (durée, largeur et hauteur d'image, cadence). Les informations de métadonnées ajoutées à votre fjichier video dépendent du logiciel que vous utilisez pour coder le fjichier video.

Le code précédent génére un résultat similaire à celui-ci :

width: 320  
audiodelay: 0.038  
canSeekToEnd: true  
height: 213  
cuePoints: ,  
audiodatarate: 96  
duration: 16.334  
videodatarate: 400  
framerate: 15  
videocodecid: 4  
audiocodecid: 2 

ADOBE ACTIONSCRIPT 3.0 - Utilisation d'OnMetaData() - 1

Si la video ne contient pas de son, les informations de métadonnées associées à l'audio (telles que audiodatarate) renvoient undefined, car aucune information audio n'est ajoutée aux métadonnées pendant l'encodage.

Dans le code ci-dessus, les informations de point de repère n'était pas affichées. Pour afficher les informations de point de repère, utilisez la fonction suivante, qui affiche de façon récursive les éléments d'un objet :

function traceObject(obj:Object,indent:uint = 0 ):void
{ varindentString:String ""; vari:uint; varprop:String; varval:*; for (i = 0 ;i < _· indent; i + + ) {indentString + = " t" : } for(prop in obj) { val = obj[prop]; if (typeof(val) = = "object") { trace(indentString ^+ " ^ 一 prop ^+ [": [Object]"); traceObject(val,indent +1 ); } else { trace(indentString ^+ " ^ 一 prop ^+ [":" ^+ val); } }

L'utilisation du code ci-dessus pour suivre le paramètre infoObject de la méthode onMetaData() produit le résultat suivant:

width: 320  
audiodatarate: 96  
audiodecid: 2  
videodecid: 4  
videodatarate: 400  
canSeekToEnd: true  
duration: 16.334  
audiodelay: 0.038  
height: 213  
framerate: 15  
cuePoints: [Object]  
0: [Object]  
parameters: [Object]  
lights: beginning  
name: point1  
time: 0.418  
type: navigation  
1: [Object]  
parameters: [Object]  
lights: middle  
name: point2  
time: 7.748  
type: navigation  
2: [Object]  
parameters: [Object]  
lights: end  
name: point3  
time: 16.02  
type: navigation 

L'exemple suivant affiche les métadonnées d'une video MP4. Cet exemple suppose qu'il existe un objet TextArea appelé dataOut sur lequel il écrit les métadonnées.

package   
{ import flash.net.NetConnection; import flash.net.NetStream; import flash.events.NetStatusEvent; import flash.media Video; import flash.displayStageDisplayState; import flash.display.Loader; import flash.display.Sprite; import flash.events.MouseEvent; public class onDataExample extends Sprite { var video: Video = new Video(); public function onDataExample():void { var videoConnection: NetConnection = new NetConnection(); videoConnection.connect(null); var videoStream: NetStream = new NetStream(videoConnection); videoStream.client = this; addChild(video); video.x = 185; video.y = 5; video.attachNetStream(videoStream); videoStream.play("video.mp4"); videoStream.addEventListener (NetStatusEvent.NET_STATUS, netStatusHandler); } public function onMetaData(infoObject:Object):void { for(var propName:String in infoObject) { dataOut.appendText(propName + "=" + infoObject[propName] + "\n"); } private function net狀態Handler(event:NetStatusEvent):void { if(event.info.code == "NetStream.Play.Stop") stage.displayState = StageDisplayState恢复正常; } } 

La fonction onMetaData() a produit le résultat suivant pour cette video :

moovposition=731965  
height=352  
avclevel=21  
videoocodecid=avc1  
duration=2.36  
width=704  
videoframerate=25  
avcprofile=88  
trackinfo=[object Object] 

Utilisation de l'objet Information

Le tableau ci-dessous indique les valeurs possibles pour des métadonnées de video qui sont transmises à la fonction de rappel onMetaData() dans l'objet qu'elle recoivent :

ParamètreDescription
aacaotType d'objet audio AAC; 0, 1 ou 2 pris en charge.
avclevelNuméroes de niveau AVC IDC, tels que 10, 11, 20, 21, et ainsi de suite.
avcprofileNuméroes de profil AVC, tel que 55, 77, 100, et ainsi de suite.
audiocodecidChaîne qui indique le codec audio (technique de codage/décodage) utilisé; par exemple, « .Mp3 » ou « mp4a ».
audiodatarateNombre qui indique le taux d'encodage du son, en ko/s.
audiodelayNombre qui indique la valeur temporelle 0 du fichier FLV d'origine. Le contenu video doit être légèrement retardé pour synchroniser correctement l'audio.
canSeekToEndValeur booléenne définie sur true si le fichier FLV est codé avec une image-clé sur la dernière image, qui permet de rechercher jusqu'à la fin d'un fichier vidéo télécharge progressivement. Elle est définitie sur false si le fichier FLV n'est pas codé avec une image-clé sur la dernière image.
cuePointsTableau d'objects (un par point de repère intégré dans le fichier FLV). Cette valeur n'est pas définitie si le fichier FLV ne contient pas de points de repère. Chaque object possède les propriétés ci-dessous. • type : chaine qui spécifie le type de point de repère : « navigation » ou « event ». • name : chaine représentant le nom du point de repère. • time : nombre correspondant à l'heure du point de repère (en secondes) avec une précision de trois chiffres (milliseconds). • parameters : objet facultatif possédant des paires nom-valeur désignées par l'utilisateur au moment de la création des points de repère.
durationNombre indiquant la durée du fichier video, en secondes.
framerateNombre indiquant la fréquence d/images du fichier FLV.
heightNombre indiquant la hauteur du fichier FLV, en pixels.
seekpointsTableau qui répertorie les images-clés disponibles en tant que cachets d'horodatage, en millisecond. Facultatif.
balisesTableau de paires clé-valeur qui représentée les informations dans l'atome « ilst » (l'équivalent des balises ID3 des fichiers MP4). iTunes utilise ces balises. Elles peuvent être utilisées pour afficher des illustrations, le cas échéant.
trackinfoObjet qui fournit des informations sur toutes les pistes d'un fichier MP4, y compris sur l'ID de description de l'échantillonnage.
videocodecidChaîne indiquant la version codec utilisée pour coder la video. Par exemple : « avc1 » ou « VP6F ».
videodatarateNombre indiquant la vitesse de transmission video du fichier FLV.
videoframerateCadence de la vente MP4.
widthNombre indiquant la largeur du fichier FLV, en pixels.

Le tableau suivant répertorie les valeurs possibles du paramètre videocodecid :

videocodecidNom du codec
2Sorenson H.263
3Screen video (SWF versions 7 et les versions ultérieures uniquement)
4VP6 (SWF versions 8 et les versions ultérieures uniquement)
5VP6 avec canal alpha (SWF versions 8 et les versions ultérieures uniquement)

Le tableau suivant répertorie les valeurs possibles du paramètre audiocodecid:

audiocodecidNom du codec
0non compressé
1ADPCM
2Mp3
4Nellymoser @ 16 kHz mono
5Nellymoser, 8kHz mono
6Nellymoser
10AAC
11Speex

Utilisation d'onXMPData()

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

La fonction de rappel onXMPData() reçoit des informations spécifiques à Adobe Extensible Metadata Platform (XMP) intégrée dans le fjichier video Adobe F4V ou FLV. Les métadonnées XMP contiennent des points de repère et d'autres métadonnées de video. La prise en charge des métadonnées XMP a été intégrée à Flash Player 10 et Adobe AIR 1.5, et est assurée par les versions ultérieures.

L'exemple suivant traite les données de points de repère dans des métadonnées XMP :

package
{ import flash.display.; import flash.net.; import flash.events.NetStatusEvent; import flash.media Video; public class onXMPDataExample extends Sprite { public function onXMPDataExample():void { var videoConnection:NetConnection = new NetConnection(); videoConnection.connect(null); var videoStream:NetStream = new NetStream(videoConnection); videoStream.client = this; var video:Video = new Video(); addChild(video); video.attachNetStream(videoStream); videoStream.play("video.f4v"); } public function onMetaData(info:Object):void { trace("onMetaData fired"); } public function onXMPData(info:Object):void { trace("onXMPData Fired\n"); //trace("raw XMP \n"); //trace(infoObject.data); var cuePoints:Array = new Array(); var cuePoint:Object; var strFrameRate:String; var nTracksFrameRate:Number; var strTracks:String = "" var onXMPXML = new XML(infoObject.data); // Set up namespaces to make referencing easier var xmpDM:Namespace = new Namespace("http://ns.adobe.com/xmp/1.0/DynamicMedia/"); var rdf:Namespace = new Namespace("http://www.w3.org/1999/02/22-rdf-syntax-ns#"); for each (var it:XML in onXMPXML..xmpDM::Tracks) {

var strTrackName:String =
it.rdf::Bag.rdf::li.rdf::Description.@xmpDM::trackName; var strFrameRateXML:String =
it.rdf::Bag.rdf::li.rdf::Description.@xmpDM::frameRate; strFrameRate = strFrameRateXMLsubstr(1,strFrameRateXML.length); nTracksFrameRate = Number(strFrameRate); strTracks + = it; } var onXMPTracksXML:XML = new XML(strTracks); var strCuepoints:String = " . for each (var item:XML in onXMPTracksXML..xmpDM::markers) { strCuepoints + = item; } trace(strCuepoints); }

Pour un fjichier video court appelé startrekintro.f4v, cet exemple produit les lignes de suivi ci-dessous. Les lignes montrent les données des points de repère pour les points de repère de navigation et d'événement dans les métadonnées XMP :

onMetaData fired
onXMPData Fired
<xmpDM:markers xmlns:xmp="http://ns.adobe.com/xap/1.0/"
xmlns:xmpDM "http://ns.adobe.com/xmp/1.0/DynamicMedia/"
xmlns:stDim "http://ns.adobe.com/xap/1.0/sType/Dimensions#"
xmlns:xmpMM "http://ns.adobe.com/xap/1.0/mm/"
xmlns:stEvt "http://ns.adobe.com/xap/1.0/sType/ResourceEvent#"
xmlns:dc "http://purl.org/dc/elements/1.1/" xmlns:rdf "http://www.w3.org/1999/02/22-rdf- syntax-ns#" xmlns:x "adobe:ns:meta/"
xmpDM:type = "FLVCuePoint" xmpDM:cuePointType "Navigation"> xmpDM:type = "FLVCuePoint" xmpDM:cuePointType "Event">

onMetaData fired

Remarque: dans les données XMP, le temps est stocké en unités DVA jusqu'à qu'en secondes Pour calculer le temps du point de repère, divisé z'heure de démarrage par la cadence. Par exemple, l'heure de démarrage de 7695905817600 divisé par une cadence de 254016000000 est égal à 30:30.

Pour voir les métadonnées XMP brutes au complet, qui contiennent la cadence, retirez les identificateurs de commentaires (/) qui precedent les deuxième et troisieme instructions trace() au début de la fonction onXMPData().

Pour plus d'informations sur XMP, voir :

Utilisation des métadonnées de l'image

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

L'évenement onImageData envoie les données d'image sous la forme d'un tableau d'octets par l'intémédiaire d'un canal de données AMF0. Les données peuvent être au format JPEG, PNG ou GIF. Définissez une méthode de rappel onImageData() pourTRAiter ces informations, de la même manière que vous définiriez des méthodes de rappel pour onCuePoint et onMetaData. L'exemple suivant accede aux données d'image et les affiche à l'aide d'une méthode de rappel onImageData():

public function onImageData(imageData:Object):void { // display track number trace(imageData_trackid); var loader:Loader = new Loader(); //imageData.data is aByteArray object loader.loadBytes(imageData.data); addChildloader);
}

Utilisation des métadonnées du texte

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

L'évenement onTextData envoie des données de texte par le biais d'un canal de données AMF0. Les données de texte sont au format UTF-8 et contiennent des informations supplémentaires sur la mise en forme basées sur la Specification Timed Text 3GP. Cette spécification définit un format de sous-titrage normalisé. Définissez une méthode de rappel onTextData() pourTRAiter ces informations, de la même manière que vous définiriez des méthodes de rappel pour onCuePoint ou onMetaData. Dans l'exemple suivant, la méthode onTextData() affiche le numero d'identification de la piste, ainsi que le texte correspondant à la piste.

public function on统计数据(textData:Object):void   
{ // display the track number trace(textData.trackid); // displays the text, which can be a null string, indicating old text // that should be erased trace(textData.text);   
} 

Gestion de l'activité de l'objet NetStream

Flash Player 10.3 et les versions ultérieures, Adobe AIR 2.7 et les versions ultérieures

Vou puez gér le activité de l'objet NetStream de façon à recueillir les informations nécessaires à la prise en charge de l'analyse de l'utilisation de médias. Les fonctions de gestion décrites dans cette section permettent de creator des bibliothèques de mesure de médias contenant des informations non obligatoirement liées au lecteur video affichtant le média. Les développpeurs de vos clients sont ainsi en mesure deCHOISIR leurs lecteurs video favorsis lorsquils utilisent leur bibliothèque. Utilizez la classe NetMonitor pour gérer la creation d'objets NetStream et leur activité dans une application. La classe NetMonitor fournit une liste des objets NetStream actifs existant à un moment donné, et distribue un événement dess qu'un objet NetStream est créé.

Un objet NetStream distribue les événements répertoriés dans le tableau ci-dessous, en fonction du type de matière en cours de lecture :

EvénementTéléchargement progressifDiffusion en continu RTMPDiffusion en continu HTTP
NetStream.Play.StartOuiOuiNon
NetStream.Play_StopOuiOuiNon
NetStream.Play.CompleteOuiOuiNon
NetStreamSeekStart.NotificationOuiOuiOui
NetStreamSeekNotifyOuiOuiOui
NetStream.Unpause.NotificationOuiOuiOui
NetStream.UnpauseNotifyOuiOuiOui
NetStream.Play.TransitionNon applicableOuiNon applicable
NetStream.Play.TransitionCompleteNon applicableOuiNon applicable
NetStream.BufferFullOuiOuiOui
NetStream.BufferFlushOuiOuiOui
NetStream.Buffer_emptyOuiOuiOui

L'objet NetStreamInfo associé à l'occurrence de NetStream stocke également les dernières métadonnées et les derniers objets de données XMP trouvés dans le média.

Lors de la lecture du matériel via la diffusion en continu HTTP, les événements NetStream.Play.Start, NetStream.Play.stop et NetStream.Play.Complete ne sont pas distribués, car l'application contrôle en intégrality le flux du matériel. Un lecteur video doit synthétiser et distribuer ces événements pour les flux HTTP.

De même, les événements NetStream.Play.Transition et NetStream.Play.TransitionComplete ne sont pas distribués pour le téléchargement progressif ou le média HTTP. La commutation dynamique du taux d'échantillonnage est une fonction RTMP. Si un lecteur video qui utilise le flux HTTP prend en charge une fonction similaire, il est alors en mesure de synthétiser et de distribuer des événements de transition.

Voir aussi

Adobe Developer Connection: Measuring video consumption in Flash (disponible en anglais uniquement)

Gestion des événements NetStream

Deux types d'événements fournissent des données d'utilisation utiles : netStatus et mediaTypeData. Il est par ailleurs possible d'utiliser un objet timer pour enregistrer régulierement la position de la tête de lecture du NetStream.

Les événements netStatus fournissant des informations permettant de déterminer la quantité de données diffusées par un utilisateur. Les événements de tampon et de transition de flux RTMFP déclenchent également des événements netStatus.

Les événements媒體 Data fournissant des métadonnées et des informations de données XMP. L'événement Netstream Play.Complete est distribué en tant qu'événement媒體 Data. D'autres données intégrées au flux sont également disponibles via les événements媒體 Data, notamment les points de repère, le texte et les images.

L'exemple suivant explique comment creer une classe permettant de gerer les événements d'etat et de données à partir de n'importe quel objet NetStream actif dans une application. En règle générale, une telle classe charge les données qu'elle souhaite analyser sur un serveur en vue de les stocker.

package com.adobe.example
{ import flash.events.DataSourceEvent; import flash.events.NetMonitorEvent; import flash.events.NetStatusEvent; import flash.net.NetMonitor; import flash.net.NetStream; public class NetStreamEventMonitor { private var netmon:NetMonitor; private var heartbeat:Timer = new Timer(5000); public function NetStreamEventMonitor() { //Create NetMonitor object netmon = new NetMonitor(); netmon.addEventListener(NetMonitorEvent.NET_STREAM_CREATE, newNetStream); //Start the heartbeat timer heartbeat.addEventListener(TimerEvent.TIMER, onHeartbeat); heartbeat.start(); } //On new NetStream private function newNetStream(event:NetMonitorEvent):void trace("New Netstream object"); var stream:NetStream = event.netStream; stream.addEventListener(DataDataEvent.MEDIA_TYPE_DATA, on统计数据); stream.addEventListener(NetStatusEvent.NET_STATUS, onStatus); } //On data events from a NetStream object private function onStreamData(event:NetDataEvent):void { var netStream:NetStream = event.target as NetStream; trace("Data event from " + netStream.info.uri + " at " + event.timestamp); switch(event.infohandler) { case"onMetaData": //handle metadata; break; case"onXMPData": //handle XMP; break; case"onPlayStatus": //handle NetStream.Play.Complete case"onImageData": //handle image break; case"onTextData":

//handle text break; default: //handle other events } } //On status events from a NetStream object private function onStatus( event:NetStatusEvent ):void trace("Status event from " + event.target.info.uri + " at " + event.target.time); //handle status events } //On heartbeat timer private function onHeartbeat( event:TimerEvent ):void var streams:Vector. = netmon.listStreams(); for(var i:int = 0 ;i<streams.length;i++) { trace("Heartbeat on " + streams[i].info.uri + " at " + streams[i].time); //handle heartbeat event } } } } } }

Détection du domaine du lecteur

L'adresse URL et le domaine de la page Web sur laquelle un utilisateur visionne du contenu multimédia ne sont pas toujours immédiatement disponibles. Si le site Web hôte le permet, vous pouvez utiliser la classe ExternalInterface pour obtaining l'URL exacte. Néanmoins, certains sites Web prénant en charge des lecteurs video tiers n'autorisent pas l'utilisation de la classe ExternalInterface. Dans ce cas, vous pouvez obtenir le domaine de la page Web actuelle grâce à la propriété pageDomain de la classe Security. L'adresse URL compte n'est pas divulguée afin d'assurer la sécurité et la confidentialité de l'utilisateur.

Le domaine de la page est disponible via la propriété pageDomain statique de la classe Security :

var domain:String = Security(pageDomain;

Rubriques avancées relatives aux fichiers video

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Les rubriques suivantes abordent certains problèmes d'utilisation des fichiers FLV.

A propos de la configuration de fichier FLV pour l'hebergement sur un serveur

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Pour utiliser des fischiers FLV, il peut être nécessaire de configurer votre serveur pour le format de filchier FLV. Le protocole MIME (Multipurpose Internet Mail Extensions) est une spécification de données normalisée qui permet d'envoyer des fischiers non ASCII via des connexions Internet. Les navigateurs Web et les clients de courrier électronique sont configurés pour interpréter de nombreux types MIME afin qu'ils puissant envoyer et receivevoir de la video, de l'audio, des graphiques et du texte formaté. Pour charger des fischiers FLV à partir d'un serveur Web, il peut être nécessaire d'enregistrer l'extension de filchier et le type MIME auprès de votre serveur Web. Pour plus d'informations, consultez la documentation du serveur. Le type MIME des fischiers FLV est video/x-flv. Les informations complètes du type de filchier FLV seprésentent comme suit :

  • Type Mime : video/x-flv
  • Extension du fichier : .flv
  • Paramètres requis : aucun
    Paramétres facultatifs : aucun
  • Considérations sur l'encodage : les fichiers FLV sont binaires, et une partie des applications peut nécessiter la définition du sous-type application/ octet-stream
    Problèmes de sécurité :aucun
  • Spécifications publiées: www.adobe.com/go/video_file_format_fr

Microsoft a changé la façon dont le multimédia en flux continu est géré par le serveur Web 6.0 IIS (Microsoft Internet Information Services) par rapport à ses versions antérieures. Les versions antérieures d'IIS ne nécessitant aucune modification pour diffuser en continu de la video Flash. Dans IIS 6.0, le serveur Web fourni par défaut avec Windows 2003, le serveur nécessite un type MIME pour reconnaître que les fichiers FLV sont des flux continus multimédia.

Lorsque des fischiers SWF qui diffusent des fischiers FLV externes sont placés sur un serveur Microsoft Windows Server® 2003 et sont affichés dans un navigateur, le fisier SWF est lu correctement, mais la video FLV n'est pas diffusée en continu. Ce problème a une incidence sur tous les fischiers FLV places sur le serveur Windows Server 2003, y compris les fischiers créé avec des versions antérieures de l'outil de programmation Flash et le Kit Macromedia Flash Video Kit pour Dreamweaver MX 2004 d'Adobe. Ces fischiers fonctionnent correctement si vous les testez avec d'autres systèmes d'exploitation.

Pour plus d'informations sur la méthode de configuration de Microsoft Windows 2003 et Microsoft IIS Server 6.0 pour diffuser en continu de la video FLV, voir la page www.adobe.com/go/tn_19439_fr.

Ciblage des fichiers FLV locaux sur Macintosh

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Si vous tentez de dire un fisier FLV local à partir d'un lecteur non système sur un ordinateur Apple® Macintosh® avec un chemin qui utilise une barre oblique (/), il ne sera pas lu. Les lecteurs non système sont par exemple les lecteurs de CD-ROM, les disques durs partitions, les supports de stockage amovibles, les péripériques de stockage connectés, etc.

Remarque : la raison de cet éché est une limitation du système d'exploitation, et non pas de Flash Player ni d'AIR.

Pour qu'un fichier FLV puisse etre lu a partir d'un lecteur non système sur un Macintosh, faites-y reférence à l'aide d'un chemin absolu utilisant une notation à deux points (: au lieu d'une notation à barres obliques (/). La liste suivante montre la différence entre les deux sortes de notation :

  • Notation à barres obliques : myDrive/myFolder/myFLV.flv

Notation à deux points : (Mac OS®) myDrive:myFolder:myFLV.flv

Exemple video : Video Jukebox

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

L'exemple suivant create un jukebox video simple qui charge dynamiquement une liste de fischiers videos à生存 en série. Vous pouvez ainsi creator une application qui permet à l'utilisateur de parcourir une série de didacticiels, ou encore qui permet de définir des publicités à afficher avant la video demandée par l'utilisateur. Cet exemple illustré les fonctions suivantes d'ActionScript 3.0 :

  • Actualisation de la position de la tete de lecture en fonction de la progression dans le fichier video
  • Détention et analyse des métadonnées d'un fichier video
  • Gestion de codes spécifique dans un flux Internet
  • Chargement, lecture, mise en pause et arrêt d'un fichier FLV charge dynamiquement
    Redimensionnement d'un objet video dans la liste d'affichage en fonction des métadonnées du flux reçu

Pour obtenir les fichiers d'application de cet exemple, voir

www.adobe.com/go/learn_programmingAS3samples.flash_fr. Les fichiers de l'application Video Jukebox se trouvent dans le dossier Samples/VideoJukebox. L'application se compose des fichiers suivants :

FichierDescription
VideoJukebox.fla ou VideoJukebox.mxmlLe fichier d'application principal pour Flex (MXML) ou Flash (FLA).
VideoJukebox.asClasse importante les principales fonctionnalités de l'application.
playlist.xmlFichier importante la liste des fischiers video à charger dans le jukebox.

Chargement l'une liste de lecture video externe

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Le fichier externe playlist.xml contient la liste des videos à charger et leur ordre de lecture. Pour charger ce fichier XML, utilisez un objet URLLoader et un objet URLRequest, comme dans le code ci-dessous :

uldr = new URLLoader();  
uldr.addEventListener(Event.COMPLET, xmlCompleteHandler);  
uldr.load(new URLRequest(PLAYLISTXml_url)); 

Ce code est placé dans le constructeur de la classe VideoJukebox, si bien que le fischier est chargé avant l'exécution de la suite du code. Dès que le chargement du fischier XML est terminé, la méthode xmlCompleteHandler() est appelée et analyse le fischier externe dans un objet XML, comme dans le code suivant :

private function xmlCompleteHandler(event:Event):void { playlist = XML(event.target.data); videosXML = playlist(video; main();
}

L'objet XML playlist contient les données XML brutes du fisier externe, alors que videosXML est un objet XMLList qui ne contient que les nœuds video. Le fragment de code suivant est un exemple de contenu du fisier playlist.xml :

<videos>
    <video url="video/caption(video.flv" />
    <video url="video/cuepoints.flv" />
    <video url="video/water.flv" />
</videos> 

Enfin, la méthode xmlCompleteHandler() appelle la méthode main() qui définit les diverses occurrences de composants dans la liste d'affichage, ainsi que les objets NetConnection et NetStream qui permettent de charger les fichiers FLV externes.

Creation de l'interface utiliser

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Pour creer l'interace utiliseur, faites glisser cinq occurences de I'bject Button sur la liste d'affichage et donneez-leur les noms d'occurrence suivants : playButton, pauseButton, stopButton, backButton et forwardButton.

Pour chacune de cesoccurrencesdeButton,afectezun gestionnaire pourI'evénement click, comme dans le fragmentdecode suivant:

playButton.addEventListener(EventListener(EventEvent.CLICK, buttonClickHandler);  
pauseButton.addEventListener(EventListener(EventEvent.CLICK, buttonClickHandler);  
stopButton.addEventListener(EventListener(EventEvent.CLICK, buttonClickHandler);  
backButton.addEventListener(EventListener(EventEvent.CLICK, buttonClickHandler);  
forwardButton.addEventListener(EventListener(EventEvent.CLICK, buttonClickHandler); 

La méthode buttonClickHandler() utilise une instruction switch pour déterminer l'occurrence de bouton sur laquelle l'utilisateur a cliqué, comme dans le code suivant :

private function buttonClickHandler(event:MouseEvent):void { switch (event.currentTarget) { case playButton: ns.resume(); break; case pauseButton: ns.togglePause(); break; case stopButton: ns.pause(); ns.seek(0); break; case backButton: playPreviousVideo(); break; case forwardButton: playNextVideo(); break; } } 

Ajoutez ensuite une occurrence de Slider à la liste d'affichage, et donnez à cette occurrence le nom volumeSlider. Le code ci-dessous définit la propriété liveDragging de l'occurrence de Slider sur true et définit un écouteur d'évenement pour l'évenement change de cette occurrence :

volumeSlider.value = volumeTransform.volume;  
volumeSlider.minimum = 0;  
volumeSlider.maximum = 1;  
volumeSlider snapInterval = 0.1;  
volumeSlider.tickInterval = volumeSlider snapInterval;  
volumeSlider-liveDragging = true;  
volumeSlider.addEventListener (SliderEvent.CHANGE, volumeChangeHandler); 

Ajoutez ensuite une occurrence de ProgressBar à la liste d'affichage, et donnez à cette occurrencie le nom positionBar. Donnez à sa propriété mode la valeur « manual», comme ci-dessous:

positionBar.mode = ProgressBarMode.MANUAL;

Enfin, ajoutez une occurrence de l'objet Label à la liste d'affichage, et donnez à cette occurrence le nom positionLabel. La valeur de cette occurrence de l'objet Label sera définie par l'occurrence de timer.

Détection des métadonnées d'un objet video

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Lorsque Flash Player detecte des métadonnées dans l'une des vidés charges, le gestionnaire de rappel onMetaData() est appelé pour la propriété client de l'objet NetStream. Le code suivant initialise un Object et configure le gestionnaire de rappel spécifique:

client = new Object();  
client.onMetaData = metadataHandler; 

La méthode metadataHandler() copie ses données dans la propriété meta définie par code au préalable. Vous pouvez ainsi acceder à tout moment aux métadonnées de la videoe active, depuis n'importequel point de l'application. L'objet Video sur la scene est ensuite redimensionné selon la taille renvoyées par les métadonnées. Enfin, l'occurrence de positionBar de la barre de progression est déplacée et redimensionné en fonction de la taille de la videoe en cours. Le code suivant est celui de la méthode metadataHandler():

private function metadataHandler(metadataObj:Object):void { meta = metadataObj; vid.width = meta.width; vid.height = meta.height; positionBar.move(vid.x,vid.y ^+ vid.height); positionBar.width = vid.width; }

Chargement dynamique d'une video

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Pour charger dynamiquement chacune des videos, l'application utilise des objets NetConnection et NetStream. Le code suivant create un objet NetConnection et passé la valeur null à la méthode connect(). Cette valeur null signifie que Flash Player va se connecter à une video sur l'ordinateur local只不过 que sur un serveur tel que Flash Media Server.

Le code suivant cree les occurrences de NetConnection et NetStream, definit un écouteur d'évenement pour l'évenement netStatus et affecte l'objet client à la propriété client :

nc = new NetConnection();  
nc.connect(null);  
ns = new HttpStream(nc);  
ns.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);  
ns.client = client; 

La méthode netStatusHandler() est appelée en cas de changement d'etat de la vente. C'est le cas lorsque la lecture de la vente débute ou s'arrête, lorsque le signal est mis en mémoire tampon ou en cas d'impossibilité de trouver un flux video. Le code suivant répertorie l'évenement netStatusHandler():

private functionnetsStatusHandler(event:NetStatusEvent):void   
{ try { switch (event.info.code) { case "NetStream.Play.Start": t.start(); break; case "NetStream.Play_STREAMNotFound": case "NetStream.Play_Stop": t.stop(); playNextVideo(); break; } catch (error:TypeError) { // Ignore any errors. } 

Le code précédent évalue la propriété code de l'objet info et filtré les codes « NetStream.Play.Start »,

« NetStream.Play_STREAMNotFound » et « NetStream.Play.Stop ». Les autres codes sont ignorés. Si le flux Internet débute, le code lance l'occurrence de Timer qui actualise la tête de lecture. Si le flux Internet est introuvable ou est interrompu, l'occurrence de Timer est arrêtée et l'application tente de dire la video suivante dans la liste de lecture.

A chaqueexecutiondeTimer,l'occurrencede la barre de progression positionBaractualise sa position en appelant lamethode setProgress()de la classe ProgressBar,et l'occurrencede LabelpositionLabelestactualisedaveclet tempsécoulé etla durée totalede la videoactive.

private function timerHandler(event:TimerEvent):void   
{ try { positionBar.setProgress(ns.time, meta.duration); positionLabel.text = ns.time.toFixed(1) + " of " meta.duration.toFixed(1) + " seconds"; } catch (error:Error) { // Ignore this error. } 

Contrôle du volume de la video

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Vous pouvez contrôler le volume audio de la video chargée dynamiquement par le bias de la propriété soundTransform de l'objet NetStream. L'application Video jukebox permet de modifier le volume en changeant la valeur de l'occurrence de Slider volumeSlider. Le code suivant montre comment changer le volume en affectant la valeur du composant Slider à unobjet SoundTransform qui est lui-même affecté à la propriété soundTransform de l'objet NetStream :

private function volumeChangeHandler(event:SliderEvent):void { volumeTransform.volume = event.value; ns.soundTransform = volumeTransform; } 

Contrôle de la lecture de la video

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Le reste de l'application contrôle la lecture de la video lorsque la fin du flux video est atteinte ou lorsque l'utilisateur change de video.

La méthode suivante obtient l'adresse URL de la video à partir de l'objet RSSList pour l'index sélection :

private function getVideo():String
{ return videosXML[idx].@url;
}
La methode playVideo() appelle la methode play() de I'objet NetStream pour charger la video selectionnee:
private function playVideo():void
{ var url:String = Video(); ns.play(url);
}

La méthode playPreviousVideo() décrémente l'index video sélectionné, appelle la méthode playVideo() pour charger le nouveau fischié video et rend la barre de progression visible :

private function playPreviousVideo():void { if(idx>0) { idx--; playVideo(); positionBar.Visible = true; }

La méthode finale, playNextVideo(), incrémente l'index video et rappelle la méthode playVideo(). Si la vente en cours est la dernière de la liste de lecture, la méthode clear() est appelée pour l'objet Video et la propriété visible de l'occurrence de la barre de progression est mise à false:

private function playNextVideo():void { if(idx< (videosXML.length() - 1)) { idx++; playVideo(); positionBar.Visible = true; } else { idx++; vid.clear(); positionBar.Visible = false; } 

Présentation à accélération matérielle par le biais de la classe StageVideo

Flash Player 10.2 et les versions ultérieures

Flash Player améliore les performances video par le biais d'une accélération matériel pour le décodage H.264. Vous pouvez optimiser ces performances à l'aide de l'API StageVideo. La video sur la scene permet à l'application d'exploiter la presentation à accélération matériel.

Les moteurs d'exécution suivants prenrent en charge l'API StageVideo :

  • Flash Player 10.2 et les versions ultérieures

Remarque : dans Flash Player 11.4/AIR 3.4 et les versions ultérieures, vous pouvez utiliser l'entréeamera avec StageVideo.

ADOBE ACTIONSCRIPT 3.0 - Flash Player 10.2 et les versions ultérieures - 1

Voutrouvez le code source à télécharger et d'autres informations relatives à la fonction de video sur la scene à l'adresse Getting Started with Stage Video (disponible en anglais uniquement).

ADOBE ACTIONSCRIPT 3.0 - Flash Player 10.2 et les versions ultérieures - 2

Pour consulter un didacticiel de démarrage rapide, voir Working with Stage Video (disponible en anglais uniquement).

Présentation de l'accelération matérielle basée sur la classe StageVideo

La presentation à accélération matérielle, qui comprend la mise à l'échelle de la video, la conversion de la couleur et la fusion, exploite l'optimisation des performances assurée par le décodage à accélération matérielle. Sur les péripériques qui gèrent l'accélération par processeur graphique (matérielle), vous disposez d'un objet flash.media.StageVideo pourrialvédodirectement surle matériel du péripérisque.Un traitement direct permet à l'unité centrale d'executer d'autres tâches pendant que le processeur graphique gère la video. La classe Video existante fait en revanche appel à la presentation logicielle. La presentation logicielle est exécutée dans l'unité centrale et sollicite parfois une proportion élevée des ressources du système.

A l'heure actuelle, peu de périphériques prennt en charge l'accélération par processeur graphique complète. La video sur la scène permet toutefois aux applications d'exploiter pleinement l'accélération matérielle évientuèlement intégrée.

La classe StageVideo ne rend pas obsoilète la classe Video. L'association de ces deux classes assure l'expérience optimale de visualisation de la video autorisée par les ressources du périhérique à un moment donné. L'application exploite l'accelération matérielle en écouteant les événements appropriés et bascule entre les classes StageVideo et Video en fonction des besoin.

La classe StageVideo impose diverses restrictions en matière d'utilisation de la video. Avant demettre en œuvre la classe StageVideo, passes en revue les directives et assurez-vous que l'application est en mesure de les prendre en charge. Si vous acceptez les restrictions, utilisez la classe StageVideo à chaque fois que Flash Player detecte qu'une presentation à accélération matérielle est disponible. Voir « Directives et restrictions » à la page 530.

Plans parallètes : Video sur la scène et liste d'affichage Flash

Le modele de video sur la scene permet a Flash Player de séparer la video de la liste d'affichage. Flash Player divise l'affichage composite entre deux plans Z :

Plan de video sur la scène Le plan de video sur la scène est situé en arrêté-plan. Il n'affiche que la video à accélération matérielle. Ce plan n'est de ce fait disponible que si l'accelération matérielle n'est pas prise en charge par le péripérisque ou qu'elle n'est pas intégrée à ce dernier. En ActionScript, les objets StageVideotraitent les videos lues sur le plan de la video sur la scène.

Plan associé à la liste d'affichage de Flash Les entités qui figurent dans la liste d'affichage de Flash sont combinées sur un planitué devant le plan de la video sur la scène. Ces entités incluent tout élément rendu par le moteur d'exécution, y compris les contrôleles de lecture. Si l'accelération matérielle n'est pas disponible, les videos sont lues sur ce plan uniquement, à l'aide de l'objet de la classe Video. La video sur la scène est always affichée derrière les graphiques de la liste d'affichage Flash.

ADOBE ACTIONSCRIPT 3.0 - Plans parallètes : Video sur la scène et liste d'affichage Flash - 1
Plans d'affichage de la vente

L'objet StageVideo apparait dans une zone rectangulaire sans rotation de l'écran, alignée sur la fenêtre. Il est impossible de superposer les objets dérivère le plan de la video sur la scène. Le plan associé à la liste d'affichage de Flash permet toute fois de superposer d'autres graphiques au plan de la video sur la scène. La video sur la scène et la liste d'affichage s'exécutent simultanément. Vous pouvez de ce fait combiner les deux mécanismes pour créé un effet visuel unifié qui utilise deux plans discrets. Vous pouvez, par exemple, réserver le plan avant aux contrôles de lecture associés à la video sur la scène qui s'exécute en arrêté-plan.

Vidéo sur la scène et codec H.264

Dans les applications Flash Player, la mise en œuvre de l'accelération matérielle de la video se compose de deux étapes :

1 Encodage de la video au format H.264
2 Mise en œuvre de l'API StageVideo

Pour obtenir les autres résultats possibles, exécutez les deux étapes. Le codec H.264 permet d'exploiter pleinement l'accelération matérielle, de la phase de décodage de la video à la phase de presentation.

La video sur la scène élimine la rétro-lecture du proceseur graphique à l'unité centrale. En d'autres termes, le processeur graphique n'envoie plus d'images décodées à l'unité centrale en vue de leur composition avec les objets de la liste d'affichage. Il fusionne只想 directement à l'écran les images décodées et rendues, derrière les objets issus de la liste d'affichage. Cette technique sollicite moins l'unité centrale et la mémoire tout en assurant une fidélité accrue des pixels.

Voir aussi

« Présentation des formats video » à la page 490

Si la video est executée en mode Plein écran, la video sur la scène est toujours disponible, sous réserve que le périphérique p renne en charge l'accelération matérielle. Flash Player s'exécute toutefois aussi au sein d'un navigateur. Dans le contexte du navigateur, le paramètre wmode affecte la disponibilité de la video sur la scène. Tentez d'utiliser systématiquement le paramètre wmode="direct" si vous souhaitez faire appel à la video sur la scène. La video sur la scène est incompatible avec d'autres paramètres wmode si le mode Plein écran est désactivé. Cette restriction signifie qu'à l'exécution, la disponibilité continue de la video sur la scène n'est pas assurée. Si, par exemple, l'utiliseur quitte le mode Plein écran alors que la video sur la scène est en cours de lecture, le contexte de cette dernière correspond à nouveau au navigateur. Si le paramètre wmode du navigateur n'est pas définir sur « direct», la video sur la scène risque de n'être soudainement plus disponible. Flash Player communique les changements de contexte de lecture aux applications par le biais d'une série d'évenements. Si vous mettez en œuvre l'API StageVideo, conservez un objet Video à titre d'objet de secours au cas où la video de la scène ne serait plus disponible.

En raison de son lien direct avec le matériel, la video sur la scene interdit certaines fonctionnalités video. La video sur la scene impose les contraintes suivantes :

  • Pour chaque fischier SWF, Flash Player limite à quatre le nombre d'objects StageVideo capable de visionner simultanément des videos. Selon les ressources matérielles dont dispose le pérophérique, la limite réelle risque toute fois d'être encore inférieure.
  • La video n'est pas synchronisée avec le contenu qu'affiche le moteur d'exécution.
  • La zone d'affichage video ne peut etre qu'un rectangle. Il est impossible d'utiliser des zones d'affichage plus avancées, telles que des formes elliptiques ou irregularités.
  • Il est impossible de faire pivoter la vente.
  • Il est impossible de placer la video dans le cache de bitmaps ou d'utiliser BitmapData pour y acceder.

  • Il est impossible d'appliquer des filtres à la vente.

  • Il est impossible d'appliquer des transformations de couleur à la vente.
  • Il est impossible d'appliquer une valeur alpha à la vente.
  • Les modes de fusion que vous appliquerez aux objets de la liste d'affichage ne s'appliquent pas à la vente sur la scène.
  • Vous pouvez positionner la video uniquement sur les limites de pixels pleines.
  • Bien que le rendu par processeur graphique soit optimisé en fonction du matériel du péripérisque indiqué, il n'est pas identique « au pixel après » d'un péripérisque à un autre. De légères variations risquent de survenir en raison des différences de pilotes et de plates-formes.
  • Quelques péripériques ne prennant pas en charge tous les espaces colorimétriques requis. Par exemple, certains péripériques ne prennant pas en charge BT.709, le standard H.264. Dans ce cas de figure, vous pouvez utiliser BT.601 pour assurer un affichage rapide.
  • Vous ne pouvez pas utiliser la video sur la scène avec des paramètres WMODE tels que normal, opaque ou transparent. La video sur la scène ne prend en charge wMODE=direct que si le mode Plein écran est désactivé. WMODE n'a aucun effet dans Safari 4 ou version ultérieure, et IE 9 ou une version ultérieure.

Dans la plupart des cas, ces restrictions n' affectent pas les lecteurs video. Si vous etes prat a les accepter, utilisez dans la mesure du possible la video sur la scene.

Voir aussi

« Utilisation du mode Plein écran » à la page 173

Utilisation des API StageVideo

La video sur la scène est un mécanisme intégré au moteur d'execution qui optimise la lecture de videos et les performances des péripériques. Le moteur d'execution créée et géré ce mécanisme. En tant que développementeur, il vous incombe de configurer l'application de sorte à l'exploiter pleinement.

Pour utiliser la video sur la scène, vous mettez en œuvre une structure de gestionnaires d'évenement qui déetectant la disponibilité ou la non-disponible de la video sur la scène. Lorsque vous étés averti de la disponibilité de la video sur la scène, vous recupérrez un objet StageVideo de la propriété Stage.stageVideos. Le moteur d'exécution insère dans l'objet Vector un ou plusieurs objets StageVideo. Vous pouvez alors afficher une video en flux continu par le biais de l'un des objets StageVideo fournis,只不过 qu'un objet Video.

Sur Flash Player, lorsque vous étés averti que la video sur la scene n'est plus disponible, réactivez l'utilisation d'un objet Video pour afficher le flux video.

Remarque: il est impossible de creer des objets StageVideo.

Propriété Stage.stageVideos

La propriété Stage.stageVideos est un objet Vector qui permet d'acceder aux occurrences de StageVideo. Selon les ressources matérielles et système disponibles, ce vecteur peut containir jusqu'à quatre objets StageVideo. Il est possible de limiter à un ou zéro les péripériques mobiles.

Si la video sur la scene n'est pas disponible, ce vecteur ne contient pas d'objet. Pour éviter les erreurs d'exécution, voirlez à n'acceder aux membres de cet object vectoriel que si l'évenement StageVideoAvailability le plus récent indique la disponibilité de la video sur la scene.

Evénements StageVideo

La structure de l'API StageVideo propose les événements suivants :

StageVideoAvailabilityEvent.STAGE Video Availability Evénement envoyé en cas de modification de la propriété Stage.stageVideos. La propriété StageVideoAvailabilityEvent.accessibility indique soit AVAILABLE, soit UNAVAILABLE. Cet événement permet de déterminer si la propriété stageVideos contient des objets StageVideo,只不过 que de vérifier directement la longueur de l'objet vectoriel Stage.stageVideos.

StageVideoEvent.RENDER_STATE Envoyé lorsqu'un objet NetStream ou Camera a été associé à un objet StageVideo et est en cours d'exécution. Indique le type de décodage actuellément utilisé : matériel, logiciel ou non disponible (aucune valeur affichée). L'évenement cible contient les propriétés videoWidth et videoHeight, dont l'utilisation est ajustée au redimensionnement de la fenêtre d'affichage de la video.

Important: étant donné qu'elles ne figurent pas dans la liste d'affichage standard, les coordonnées issues de l'objet StageVideo cible utilisent les coordonnées Stage.

VideoEvent.RENDER_STATE Evénement envoyé si un objet Video est en cours d'utilisation. Il indique le type de décodage en cours d'utilisation (matériel ou logiciel). Si cet événement indique un décodage à accélération matérielle, utilisez de préférence un objet StageVideo. L'évenement Video cible contient les propriétés videoWidth et videoHeight, dont l'utilisation est adaptée au redimensionnement de la fenêtre d'affichage de la video.

Flux de travail de mise en œuvre de la fonction StageVideo

Procedez comme suit pourmettre en œuvre la fonction StageVideo :

1 Ecoutez l'évenement StageVideoAvailabilityEvent.STAGEVIDEO_AVAILABILITY pour savoir quand l'objet vectoriel stage.stageVideos a changé. Voir « Utilisation de l'évenement StageVideoAvailabilityEvent.STAGEVIDEO_AVAILABILITY » à la page 533.
2 Si l'évenement StageVideoAvailabilityEvent.STAGEVIDEO_AVAILABILITY indique que la video sur la scène est disponible, utilisez l'objet vectoriel stage.stageVideos à l'intérieur du gestionnaire d'évenement pour acceder à un objet StageVideo.
3 Associez un objet NetStream à l'aide de StageVideo.attachNetStream() ou associez un objet Camera à l'aide de StageVideo.attachCamera().
4 Lisez la video à l'aide de NetStream.play().
5 Ecoutez l'évenement StageVideoEvent. RENDER_STATE sur l'objet StageVideo afin de déterminer l'état de lecture de la video. La réception de cet événement indique également que les propriétés width et height de la video ont été initiaisées ou modifiées. Voir « Utilisation des événements StageVideoEvent. RENDER_STATE et VideoEvent. RENDER_STATE » à la page 535.
6 Ecoutez l'évenement VideoEvent.RENDER_STATE sur l'objet Video. Cet événement indique les mêmes états que l'évenement StageVideoEvent.RENDER_STATE ; vous pouvez donc également l'utiliser pour déterminer si l'accelération par processeur graphique est disponible. La réception de cet événement indique également que les propriétés width et height de la video ont été initiaisées ou modifiées. Voir « Utilisation des événements StageVideoEvent.RENDER_STATE et VideoEvent.RENDER_STATE » à la page 535.

Initialisation des écouteurs d'événements StageVideo

Configurez les écouteurs StageVideoAvailabilityEvent et VideoEvent lors de l'initialisation de l'application. Vous pouvez, par exemple, initiaiser ces écouteurs dans le gestionnaire d'événement

flash.events.Event.ADED_TO_STAGE. Cet événement assure la visibilité de l'application sur la scène :

public class SimpleStageVideo extends Sprite
    private var nc: NetConnection;
    private var ns: NetStream;
public function SimpleStageVideo()
{
    // Constructor for SimpleStageVideo class
    // Make sure the app is visible and stage available
    addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
}
private function onAddedToStage(event:Event):void
{
    // ...
    // Connections
    nc = new NetConnection();
    nc.connect(null);
    ns = new NetStream(nc);
    ns.addEventListener(NetStatusEvent.NET_STATUS, onNetStatus);
    ns.client = this;
    // Screen
    video = new Video();
    video.smoothing = true;
    // Video Events
    // the StageVideoEvent.STAGEVIDEO_STATE informs you whether
    // StageVideo is available
    stage.addEventListener(StageVideoAvailabilityEvent.STAGEVIDEO_AVAILABILITY,
        onStageVideoState);
    // in case of fallback to Video, listen to the VideoEvent.RENDER_STATE
    // event to handle resize properly and know about the acceleration mode running
    video.addEventListener(VideoEvent.RENDER_STATE, videoStateChange);
    // ...
} 

Utilisation de l'évenement StageVideoAvailabilityEvent.STAGEVIDEO Availability

Dans le gestionnaire StageVideoAvailabilityEvent. STAGEVIDEO_AVAILABILITY, optez pour un objet Video ou StageVideo selon la disponibilité de StageVideo. Si la propriété StageVideoAvailabilityEvent. availability est définie sur StageVideoAvailability.AVAILABLE, utilisez StageVideo. Dans ce cas de figure, attendez-vous à ce que le vecteur Stage.stageVideos contienne un ou plusieurs objets StageVideo. Obtenez un objet StageVideo à partir de la propriété Stage.stageVideos et associez-lui l'objet NetStream. Etant donné que les objets StageVideo s'affichent toujours en arrêtre-plan, supprimez tout objet Video existant (toujours affché au premier plan). Ce gestionnaire d'évenement permet égalément d'accuer un écouteur à l'évenement StageVideoEvent. RENDER_STATE.

Si la propriété StageVideoAvailabilityEvent.accessibility est définitie sur StageVideoAvailability.UNAVAILABLE, n'utilise pas l'objet StageVideo et n'accedez pas à l'objet vectoriel Stage(stageVideos. Associiez dans ce cas l'objet NetStream à un objet Video. Ajoutez enfin l'objet StageVideo ou Video à la scene et appelez la méthode NetStream.play().

Le code suivant illustré le traitement de l'évenement

StageVideoAvailabilityEvent.STAGEVIDEO_AVAILABILITY:

private var sv:StageVideo;
private var video:Video;
private function onStageVideoState(event:StageVideoAvailabilityEvent):void { // Detect if StageVideo is available and decide what to do in toggleStageVideo toggleStageVideo(event'availability = = StageVideoAvailability.AVAILABLE); }
private function toggleStageVideo(on:Boolean):void { // To choose StageVideo attach the NetStream to StageVideo if (on) { stageVideoInUse = true; if (sv = = null) { sv = stage.stageVideos[0]; sv.addEventListener(StageVideoEvent.RENDER_STATE, stageVideoStateChange); sv.attachNetStream(ns); } if (classicVideoInUse) { // If you use StageVideo, remove from the display list the // Video object to avoid covering the StageVideo object // (which is always in the background) stage.removeChild (video); classicVideoInUse = false; } else { // Otherwise attach it to a Video object if (stageVideoInUse) stageVideoInUse = false; classicVideoInUse = true; video.attachNetStream(ns); stage.addChildAt(video,0); } if ( !played ) { played = true; ns.play(FILE_NAME); }

Important: la première fois qu'une application accede à l'élement vectoriel au niveau Stage(stageVideos[0], le rectangle par défaut est défini sur 0,0,0,0 et les propriétés de panoramaque et zoom utilisent les valeurs par défaut. Réinitialisez toujours ces valeurs sur les parametres de votrechioix. Vous dispose des propriétés videoWidth et videoHeight de l'évenement cible StageVideoEvent.RENDER_STATE ou VideoEvent.RENDER_STATE pour calculer les dimensions de la fenetre d'affichage de la video.

Téléchargez le code source complet de cet exemple d'application à l'adresse Getting Started with Stage Video (disponible en Englais uniquement).

Utilisation des événements StageVideoEvent.RENDER_STATE et VideoEvent.RENDER_STATE

Les objets StageVideo et Video envoient des événements qui indiquent aux applications tout changement de l'environnement d'affichage. Ces événements sont StageVideoEvent.NDER_STATE et VideoEvent.NDER_STATE.

Un objet StageVideo ou Video distribue un événement d'état de rendu lorsqu'un objet NetStream est associé et que sa lecture débute. Il envoie également cet événement lorsque l'environnement d'affichage est modifié (en cas de redimensionnement de la fenêtre d'affichage de la video, par exemple). Ces notifications permettent de réinitialiser la fenêtre d'affichage sur les valeurs videoHeight et videoWidth actuelles de l'objet événement cible.

Les états de rendu indiqués sont les suivants :

  • RENDER_STATUS_UNAVAILABLE
  • RENDER_STATUS_SOFTWARE
  • RENDER_STATUS_ACCELERATED

Les états de rendu indiquent quand le décodage à accélération matérielle est en cours d'utilisation, qu'elle que soit la classe qui lit actuellement la video. Vérifiez la propriété StageVideoEvent.status pour savoir si le décodage requis est disponible. Si elle est définie sur « unavailable », l'objet StageVideo ne peut pas dire la video. Cet état nécessite que vous associiez à nouveau immédiatement l'objet NetStream à unobjet Video. Les autres états indiquent à l'application les conditions de rendu en cours.

Le tableau ci-dessous décrit les implications de toutes les valeurs d'etat de rendu pour les objets StageVideoEvent et VideoEvent dans Flash Player :

VideoStatus.ACCELERATEDVideoStatus.SOFTWAREVideoStatus.UNAVAILABLE
StageVideoEventLe décodage et la presentation relèvent tous deux du matériel (performances optimales).La presentation relève du matériel, le décodage du matériel (performances satisfaisantes).Aucune ressource du processeur graphique n'est disponible pour Traits la vente et chaque éléments n'est affchéé. Utilisez un objectivité.
VideoEventLa presentation relève du matériel, le décodage du matériel. (Performances satisfaisantes sur un système de bureau moderne uniquement. Elles sont dégradées en mode Plein écran.)La presentation et le décodage relèvent tous deux du matériel. (Performances les moins satisfaisantes. Elles sont dégradées en mode Plein écran.)(S/O)

Espaces colorimétriques

La vente sur la scène fait appel aux capacités matérielles sous-jacentes pour prendre en charge les espaces colorimétriques. Un contenu SWF peut fournir des métadonnées qui indiquent l'espace colorimétrique préféREDe le matériel graphique du péripérisque déterminé toutefois s'il est possible d'utiliser l'espace colorimétrique. Un péripérisque peut prendre en charge plusieurs espaces colorimétriques, tandis qu'un autre péripérisque n'en prend en chargeaucun.Si le matériel ne prend pas en charge l'espace colorimétrique requis,Flash Player tente d'identifier la correspondance la plus proche parmi les espaces colorimétriques gérés.

Pour déterminer les espaces colorimétriques pris en charge par le matériel, faites appel à la propriété StageVideo.colorSpaces. Cette propriété renvoie la liste des espaces colorimétriques pris en charge dans un vecteur String :

var colorSpace:Vector. = stageVideo.colorSpaces();

Pour savoirquel espace colorimétriqueutilise la video en cours de lecture,faites appel àla propriétéStageVideoEvent.colorSpace.Vérifiéez cette propriété dans le gestionnaire associé à l'évenementStageVideoEvent.assistant:

var currColorSpace:String; 

//StageVideoEvent.RENDER_STATE event handler
private function stageVideoRenderState(event:Object):void { //... currColorSpace = (event as StageVideoEvent).colorSpace; //... }

Si Flash Player ne detecte pas de valeur de substitution pour un espace colorimétrique non pris en charge, la video sur la scène utilise l'espace colorimétrique par défaut, BT.601. Ainsi, les flux video à codage H.264 utilisent généralement l'espace colorimétrique BT.709. Si le matériel du périphérique ne prend pas en charge BT.709, la propriété colorSpace renvoie « BT601 ». La valeur StageVideoEvent.colorSpace« unknown » indique que le matériel ne fournit pas de technique d'identification de l'espace colorimétrique.

Si l'application considère que l'espace colorimétrique actif est inacceptable, vous pouvez basculer d'un objet StageVideo à un objet Video. La classe Video prend en charge tous les espaces colorimétriques par le bias d'une composition logicielle.

Chapitre 26 : Utilisation de cameras

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La source des données video peut être uneamera connectée à l'ordinateur de l'utiliseur, et il est possible deGERer en ActionScript l'affichage et la manipulation de ces données. La classe Camera est le mecanisme intégre a ActionScript permettant d'utiliser un ordinateur ou uneamera.

Sur les périphériques mobiles, vous pouvez également utiliser la classe CameraUI. La classe CameraUI ouvre une application deamera indépendante pour permettre à l'utilisateur de capturer un cliché ou d'enregistrer une video. Lorsque l'utilisateur a terminé, votre application peut acceder à l'image ou à la video via un objet MediaPromise.

Voir aussi

Christian Cantrell : How to use CameraUI in a Cross-platform Way (disponible en anglais uniquement)

Michaël CHAIZE : Android, AIR and the Camera (disponible en angeçais uniquement)

Présentation de la classe Camera

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

L'objet Camera permet d'étabrir une connexion avec la camera locale de l'utilisateur et de diffuser le signal video soit localement (à destination de l'utilisateur lui-même) ou à destination d'un serveur tel que Flash Media Server.

La classe Camera permet d'acceder aux informations suivantes sur laamera de l'utilisateur :

  • Quelles cameras installées sur l'ordinateur ou le périphérique de l'utilisateur sont-elles disponibles?
    Installation d'uneamera ou non
  • Si Flash Player est autorisé ou non à acceder à laamera de l'utilisateur
  • Caméra active
    Largeur et hauteur de la video en cours de capture, en pixels

La classe Camera fournit les méthodes et les propriétés qui permettent d'utiliser les objets Camera. Par exemple, la propriété statique Camera names contient le tableau des noms des caméras actuelsment installées sur l'ordinateur. Par ailleurs, la propriété name permet d'afficher le nom de laamera active.

Remarque: si vous diffusez en continu la video émanant d'uneamera via le réseau, vous devez toujours traiter les interruptions du réseau. Ces interruptions se produit pour diverses raisons, en particulier sur les péripériques mobiles.

Affichage du contenu de laamera

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La connexion à uneamera peut nécessiter moins de code que l'utilisation des classes NetConnection et NetStream pour charger un fichier video. Par contre, l'utilisation de la classe Camera peut parfois s'avérer délicate, car avec Flash Player, il est nécessaire d'avoir l'autorisation de l'utiliseur pour se connecter à saamera et la rendre accessible par code.

Le code suivant montre comment utiliser la classe Camera pour étabrir une connexion avec laamera de l'utilisateur :

var cam:Camera = Camera.getCamera();  
var vid:Video = new Video();  
vid.attachCamera(cam);  
addChild(vid); 

Remarque: la classe Camera ne possè de pas de méthode constructeur. Pour créé une nouvelle occurrence de Camera, utilisez la méthode statique Camera.getCamera().

Conception d'une application gérant uneamera locale

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Lors de la programmation d'une application destinée à gérer laamera de l'utilisateur, prenez les précautions suivantes :

  • Vérifie qu'uneamera est installée sur l'ordinateur de l'utilisateur. Gérez le cas de figure dans lequel aucuneamera n'est disponible.
    Pour Flash Player uniquement, vérifie si l'utilisateur a autorisé l'accès à laamera de façon explicite. Pour des raisons de sécurité, le lecteur Flash affiche la boîte de dialogue de paramétrage de Flash Player, qui permet à l'utilisateur d'autoriser ou non l'accès à saamera. Flash Player ne peut donc pas établier une connexion avec laamera d'un utiliser et diffuser un signal video sans la permission de cet utiliser. Si l'utilisateur clique sur le bouton d'autorisation, votre application peut se connecter à saamera. Si l'utilisateur clique sur le bouton de refus, votre application ne pourrait pas étabrir de liaison avec saamera. Dans les deux cas, votre application doit:gérer élegament la réponse.
    Pour AIR uniquely, verifiez que la classe Camera est prise en charge par les profils de périhériques gérés par l'application.
  • Elle n'est pas prise en charge par les navigateurs mobiles.
  • Elle n'est pas pris en charge par les applications AIR mobiles qui font appel au mode de rendu par processeur graphique.
  • Sur les périphériques mobiles, il n'est possible d'activer qu'une seuleamera à la fois.

Voir aussi

Christophe Coenraets : Multi-User Video Tic-Tac-Toe (disponible en angeçais uniquement)

Mark Doherty : Android Radar app (source)

Etablissement d'une connexion avec laamera de l'utilisateur

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Pour étabir une connexion avec laamera de l'utilisateur, la première étape consiste à créé une occurrencie de l'objet Camera, en créé une variable du type Camera et en l'initialisant avec la valeur renvoyee par la methode statique Camera.getCamera().

L'objet suivante consiste à creer un objet Video et à lui affecter l'objet Camera.

La troisième étape consiste à ajouter cet objet Video à la liste d'affichage. Les étapes 2 et 3 sont nécessaires, car la classe Camera n'étend pas la classe DisplayObject, il est donc impossible de l'ajouter directement à la liste d'affichage. Pour afficher le signal video provenant de laamera, vous doivent ensuite creer un autre objet Video et appeler la méthode attachCamera().

Le code suivant illustré ces trois opérations :

var cam:Camera = Camera.getCamera();  
var vid:Video = new Video();  
vid.attachCamera(cam);  
addChild(vid); 

Notez que si aucuneamera n'est installée sur l'ordinateur de l'utiliseur, l'application n'affiche rien.

Pour une application réelle, d'autres tâches sont nécessaires. Pour plus d'informations, voir « Vérification de la présence de caméras » à la page 539 et « Détction de l'autorisation d'acceder à laamera » à la page 540.

Voir aussi

Lee Brimelow : How to access the camera on Android devices (disponible en anglais uniquement)

Vérification de la présence de caméras

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Avant de tenter d'utiliser les méthodes ou propriétés d'une occurrence de Camera, il est préféable de vérifier qu'uneamera est bien installée. Il existe deux techniques pour vérifier la présence d'une ou plusieurs caméras :

  • Tester la propriété statique Camera .names, qui contient le tableau des noms des caméras disponibles. Ce tableau ne compte en général qu'une seule chaine au maximum, car la plupart des utilisateurs ne disposent au moins que d'une seuleamera à la fois. Le code suivant montre comment tester la propriété Camera .names pour vérifier que l'utilisateur dispose d'au moins uneamera :
  • Vérifier la valeur renvoyée de la méthode statique Camera.getCamera(). Si aucuneamera n'est disponible ou installée, la méthode renvoie null, sinon elle renvoie une reférence à un objet Camera. Le code suivant montre comment appeler la méthode Camera.getCamera() pour vérifier que l'utilisateur dispose d'au moins uneamera :

Etant donné que la classe Camera n'etend pas la classe DisplayObject, il est impossible de l'ajouter directement à la liste d'affichage à l'aide de la méthode addChild(). Pour afficher le signal video provenant de laamera, vousdezdonc creator un objet Video et appeler la méthode attachCamera() de I'occurrence de Video.

Ce fragment de code montre comment étabir la connexion avec laamera, s'il en existe une. Dans le cas contraire, Flash Player n'affiche rien :

var cam:Camera = Camera.getCamera();
if (cam != null)
{ var vid:Video = new Video(); vid.attachCamera(cam); addChild(vid);
}

Cameras des périhériques mobiles

La classe Camera n'est pas prise en charge dans le moteur d'exécution de Flash Player sur les navigateurs mobiles.

Dans les applications AIR des péripériques mobiles, vous pouze acceder à la ou aux caméras dont dispose le péripérique. Sur les péripériques mobiles, vous pouze utiliser soit laamera frontale soit laamera arrêté, mais pas les deux en même temps. (Si vous activez une deuxièmeamera, la première est tout d'abord désactivée.) Laamera frontale est mise en miroir horizontally sur iOS; elle ne l'est pas sur Android.

Détection de l'autorisation d'acceder à laamera

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Dans le sandbox de l'application AIR, l'application peut acceder à n'importe qu'elleamera sans autorisation de l'utilisateur. Sur Android, l'application doit toute fois spécifier l'autorisation CAMERA d'Android dans le descriptor d'application.

Avant que Flash Player ne puisse afficher les résultats d'uneamera, l'utiliser doit autoriser Flash Player à acceder à laamera de façon explicite. Lorsque la méthode attachCamera() est appelée, la boîte de dialogue Paramètres de Flash Player est affichée pour permettre à l'utiliser d'autoriser ou refuser à Flash Player l'accès à laamera et au microphone. Si l'utiliser a accordé son autorisation, Flash Player affiche les résultats de laamera dans l'occurrence de l'objet Video sur la scene. Si l'utiliser a refusé, Flash Player ne peut pas connecter à laamera et l'objet Video n'affiche rien.

Pour déterminer si l'utilisateur a accordé à Flash Player l'accès à laamera, vous pouvez écouter l'évenement status de laamera (StatusEvent STATUS), comme dans le code suivant :

var cam:Camera = Camera.getCamera();
if (cam != null)
{ cam.addEventListener(StatusEvent.StatusUS, statusHandler); var vid:Video new Video(); vid.attachCamera(cam); addChild(vid);
}
function statusHandler(event:StatusEvent):void
{ // This event gets dispatched when the user clicks the "Allow" or "Deny" // button in the Flash Player Settings dialog box. trace(event.code); // "Camera.Muted" or "Camera.Unmuted"
}

La fonction statusHandler() est appelée dès que l'utilisateur clique sur Autoriser ou Refuser. Deux méthodes permettent de détecter le bouton qui a été cliqué :

  • Le paramètre event de la fonction statusHandler() possède une propriété code qui contient la châne « Camera.Muted » ou « Camera.Unmuted », Si la valeur est « Camera.Muted», l'utilisateur a refusé l'autorisation et Flash Player ne peut pas acceder à laamera. Le fragment de code suivant en est un exemple :
function statusHandler(event:StatusEvent):void { switch (event.code) { case "Camera.Muted": trace("User clicked Deny."); break; case "Camera.Unmuted": trace("User clicked Accept."); break; } } 
  • La classe Camera contient une propriété en lecture seule appelée muté qu'elle indique si l'utilisateur a refusé l'accès à laamera (true) ou l'a autorisé (false) dans le panneau Confidentialité de Flash Player. Le fragment de code suivant est un exemple :
function statusHandler(event:StatusEvent):void { if (cam.muted) { trace("User clicked Deny."); } else { trace("User clicked Accept."); } } 

En consultant l'évenement d'etat à distribuer, vous pouvez rédigier du code pour gérer l'autorisation ou le refus d'accès à laamera et terminer proprement. Par exemple, si l'utilisateur a refusé, vous pouvez afficher un message lui expliquant qu'il doit donner son autorisation s'il veut participer à une conversation video, ou au contraire veiller à supprimer l'objet Video de la liste d'affichage afin de libérer des ressources système.

Dans AIR, l'autorisation d'utilisation de laamera n'était pas dynamique, un objet Camera ne distribue pas d'évenement d'etat.

Optimisation de la qualité des videos de laamera

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Par défaut, les nouvelles occurrences de la classe Video ont une largeur de 320 pixels sur une hauteur de 240 pixels. Pour optimiser la qualite video, veiliez a donner a vos objets Video les meme dimensions que celles de l'objet Camera. Pour obtaining la largeur et la hauteur de I'objet Camera, utilisez les propriétés width et height de la classe Camera. Vous pouze alors adapter les propriétés width et height de l'objet Video à ces dimensions, ou transmettre celles-ci à la methode constructeur de la classe Video, comme dans le fragment de code ci-dessous:

var cam:Camera = Camera.getCamera();
if (cam != null)
{ var vid:Video = new Video(cam.width, cam.height); vid.attachCamera(cam); addChild(vid);
}

Comme la méthode getCamera() renvoie une reférence à un objet Camera (ou null si aucuneamera n'est présente), vous pouze utiliser les méthodes et les propriétés de cet objet même si l'utilisateur refuse l'accès à laamera. Vous pouze ainsi définir les dimensions de l'occurrence de l'objet Video en fonction de celles de laamera.

var vid:Video;
var cam:Camera = Camera.getCamera();
if (cam = = null) { trace("Unable to locate available cameras.); } else { trace("Found camera:" ^+ cam.name); cam.addEventListener(StatusEvent.StatusUS,statusHandler); vid = new Video(); vid.attachCamera(cam); } function statusHandler(event:StatusEvent):void { if (cam.muted) { trace("Unable to connect to active camera."); } else { // Resize Video object to match camera settings and // add the video to the display list. vid.width = cam.width; vid.height = cam.height; addChild(vid); } // Remove the status event listener. cam.removeEventListener(StatusEvent.StatusUS,statusHandler); }

Pour plus d'informations sur le mode plein écran, voir la section relative au mode plein écran sous « Définition des propriétés de la scene » à la page 171.

Gestion de l'etat de laamera

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La classe Camera contient plusieurs propriétés qui permettent de suivre l'objet Camera. Par exemple, le code ci-dessous affiche plusieurs propriétés de laamera à l'aide d'un object Timer et d'une occurrence de champ de texte dans la liste d'affichage :

var vid:Video;
var cam:Camera = Camera.getCamera();
var tf:TextField = newTextField();
tf.x = 300 tf.autoSize = TextFieldAutoSize.LEFT;
addChild(tf);
if (cam != null) { cam.addEventListener(StatusEvent-status, statusHandler); vid = new Video(); vid.attachCamera(cam);
} function statusHandler(event:StatusEvent):void { if (!cam.muted) { vid.width = cam.width; vid.height = cam.height; addChild(vid); t.start(); } cam.removeEventListener(StatusEvent.status, statusHandler);
}
var t:Timer = new Timer(100);
t.addEventListener(TimerEvent.TIMER, timerHandler);
function timerHandler(event:TimerEvent):void { tf.text = ""; tf.appendText("activityLevel:" + cam活性Level + "\n"); tf.appendText("bandwidth:" + cam-bandwidth + "\n"); tf.appendText("currentFPS:" + cam.currentFPS + "\n"); tf.appendText("fps:" + cam fps + "\n"); tf.appendText("keyFrameInterval:" + cam.keyFrameInterval + "\n"); tf.appendText("loopback:" + cam-loopback + "\n"); tf.appendText("motionLevel:" + cam-motionLevel + "\n"); tf.appendText("motionTimeout:" + cam-motionTimeout + "\n"); tf.appendText("quality:" + cam-quality + "\n");
}

Tous les 1/10 de seconde (100 milliseconds) l'évenement timer de l'objet Timer est diffusé et la fonction timerHandler() actualise le contenu du champ de texte dans la liste d'affichage.

Chapitre 27 : Utilisation de la gestion des droits d'auteur numériques (DRM)

Flash Player 10.1 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

Adobe® Access™ est une solution de protection du content. Elle permet aux propriétaires, aux distributeurs et aux publicitaires d'exploiter de nouvelles sources de revenus en assurant un accès transparent à un contenu Premium. Les éditeurs utilisent Adobe Access pour chiffrer du content, créé des stratégies et délivrer des licences. Adobe Flash Player et Adobe AIR intégrant une bibliothèque DRM, le module Adobe Access. Ce module permet au moteur d'exécution de communiquer avec le serveur de licences Adobe Access et de dire le contenu protégé. Le moteur d'exécution complète ainsi le cycle de vie du contenu protégé par Adobe Access et distribué par Flash Media Server.

Grac à Adobe Access, les fournisseurs de contenu sont en mesure de proposer des contenus libres de droits et des contenus Premium. Imaginons qu'un consommateur souhaite visionner une émission de télévision sans coupure publicitaire. Il s'enregistre et s'acquitte d'un droit auprès de l'éditeur de contenu. Il peut ensuite entrair ses informations d'identification pour acceder au site et visionner l'émission sans publicité.

Prenons à présent l'exemple d'un consommateur qui souhaite visionner un contenu hors connexion lorsqu'il est en déplacement et ne dispose pas d'un accès à Internet. Ce flux de travail hors connexion est pris en charge par les applications AIR. ÀpRES étrene enregistré et acquitté des droits relatifs au contenu auprès de l'éditeur, l'utilisateur peut acceder au contenu et à l'application AIR associée et les télécharger à partir du site Web de l'éditeur. Par le biais de l'application AIR, l'utilisateur peut visionner le contenu hors connexion pendant la période autorisée. Il est également possible de partager le contenu avec d'autres péripériques dans le même groupe de péripériques à l'aide de domaines (nouveauté dans la version 3.0).

Adobe prend également en charge l'accès anonyme, qui ne nécessite pas d'authentication. Par exemple, un éditeur peut avoir recours à un accès anonyme pour distribuer du contenu publicitaire. Un accès anonyme permet en outre à un éditeur d'acceder gratuitement au contenu actuel pendant une période spécifique. Le fournisseur de contenu peut également stipuler et limiter le type et la version du lecteur requis pour le visionnement du contenu.

Lorsqu'un utilisateur tente de dire un contenu protégé dans Flash Player ou Adobe AIR, l'application doit appeler les API DRM. Les API DRM démarrent le flux de travail requis par la lecture du contenu protégé. Via le module Adobe Access, le moteur d'exécution contacte le serveur de licences. Le serveur de licences authentifie l'utilisateur, le cas échéant, et délivre une licence qui autorise la lecture du contenu protégé. Le moteur d'exécution recoit la licence et déchiffre le contenu pour qu'il puisse être lu.

La procédure permettant à l'application de dire un contenu protégé par Adobe Access est décrite ci-après. Il est inutil de maïtriser le chiffrement de contenu ou la gestion des régulations par le biais d'Adobe Access. Nous partons toute fois du principe que vous communiquez avec le serveur de licences Adobe Access pour authenticate l'utilisateur et récapérer la licence. Nous considérons également comme acquis que vous créEZ une application réservée à la lecture de contenu protégé par Adobe Access.

Pour acceder à une presentation d'Adobe Access, notamment la création de régulations, voir la documentation livrée avec le produit.

Voir aussi

flash.net.drm package

Présentation du flux de travail associé au contenu protégé

Flash Player 10.1 et les versions ultérieures, Adobe AIR 2.0 et les versions ultérieures

Important : Flash Player 11.5 et les versions ultérieures intègrent le module Adobe Access ; l'étape de mise à jour (l'appeil de SystemUpdater.update(SystemUpdaterType.DRM)) est donc inutile. Les navigateurs et plates-formes suivants sont concernés :

  • Contrôle ActiveX Flash Player 11.5, pour toutes les plates-formes à l'exception d'Internet Explorer sous Windows 8 sur les processeurs Intel
  • Plug-in Flash Player 11.5, pour tous les navigateurs
  • Adobe AIR (version de bureau et version mobile)

L' étape de mise à jour est toujours requise dans les cas suivants :

  • Internet Explorer sous Windows 8 sur les processeurs Intel
  • Flash Player 11.4 et versions antérieures, à l'exception de Google Chrome 22 et des versions ultérieures (toutes les plates-formes) ou de Google Chrome 21 et des versions ultérieures (Windows)

Remarque : vous pouvez toujours appeler SystemUpdater. update (SystemUpdaterType.DRM) sur un système doté de Flash Player 11.5 ou d'une version ultérieure, mais rien n'est téléchargeé.

Le flux de travail de haut niveau suivant indique comment une application peut recuperer et dire du contenu protégé. Il part du principe que l'application est conscience spécifique pour dire un contenu protégé par Adobe Access :

1 Récupérez les métadonnées du contenu.
2 Executez les mises à jour de Flash Player, s'il y a lieu.
3 Vérifiez si une licence est disponible localement. Si tel est le cas, chargez-la et passez à l' étape 7. Dans le cas contraire, passez à l' étape 4.
4 Vérifiez si l'authentication est obligatoire. Dans le cas contraire, passez à l'étape 7.
5 Si l'authentication est obligatoire, demandez les informations d'identification à l'utilisateur et transmettez-les au serveur de licences.
6 Si l'enregistrement de Domaine est requis, joignez le Domaine (AIR 3.0 et versions ulterieures).
7 Lorsque l'authentication aboutit, teléchargez la licence du serveur.
8 Lisez le contenu.

Si aucune erreur n'est survenue et si l'utilisateur a ete autorise a visionner le contenu, I'bject NetStream distribue un objet DRMStatusEvent. L'application proce de alors a la lecture. L'objet DRMStatusEvent mémorise les informations relatives au voucher, qui identifient les régulations et autorisations de l'utilisateur. Il contient par exemple des informations relatives à la disponibilité du contenu hors connexion ou à la date d'expiration de la licence. L'application peut utiliser ces données pour averrir l'utilisateur de l'etat de ses régulations. Elle peut par exemple afficher dans une barre d'etat le nombre de jours restants pendant lesquels l'utilisateur est autorisé a visionner le contenu.

Si l'utilisateur est autorisé à acceder au contenu hors connexion, le voucher est mis en mémoire cache et le contenu chiffré est télécharge sur la machine de l'utilisateur. L'utilisateur peut acceder au contenu pendant le nombre de jours définis dans la durée de mise en mémoire cache de la licence. La propriété détaill de l'évenement contient "DRM.voucherObtained". L'application decide de l'emplacement local de stockage du contenu pour assurer sa disponibilité hors connexion. Vous pouvez également précharger les vouchers à l'aide de la classe DRMManager.

Remarque : la mise en memoire cache et le préchargement de vouchers sont pris en charge dans AIR et dans Flash Player. Néanmoins, le téléchargement et le stockage du contenu chiffre sont pris en charge uniquement dans AIR.

C'est l'application elle-même qui est chargée de:gérer explicitement les événements d'erreur,notamment lorsque l'utilisateur saisit correctement ses informations d'identification, mais que le voucher qui protège le contenu chiffré limite l'accès au contenu. Un utiliser authentifié ne peut par exemple pas acceder au contenu s'il ne s'est pas acquitté des droits. Ce cas peut également se produit lorsque deux membres inscrites du même editor ettent de partager du contenu que seul l'un d'entre eux a payé.L'application doit informer l'utilisateur de l'erreur et proposer une solution de remplacement.Par exemple,l'application peut donner à l'utilisateur des instructions sur le mode d'inscription et de paiement des droits d'affichage.

Flux de travail détaillé des API

Flash Player 10.1 et les versions ultérieures, AIR 2.0 et les versions ultérieures

Ce flux de travail illustré de manière plus détaillée le flux de travail associé à un contenu protégé. Il désrit les API impliquées dans la lecture du contenu protégé par Adobe Access.

1 Par le biais d'un objet URLsLoader, chargez les octets du filchier de métadonnées du contenu protégé. Définissez cet objet sur une variable, celle que metadata_bytes.

Tout contenu contrôle par Adobe Access contient des métadonnées Adobe Access. Lorsque le contenu est mis en package, ces métadonnées peuvent être enregistrées dans un fisier de métadonnées distinct (.metadata) parallèlement au contenu. Pour plus d'informations, voir la documentation d'Adobe Access.

2 Creez une occurrence de DRMContentData. Placez ce code dans un bloc try-catch :

new DRMContentData(metrica_bytes)

ou metadata_bytes est l'objet URLsLoader obtenu à l'étape 1.

3 (Flash Player uniquely) Le moteur d'exécution recherche le module Adobe Access. S'il ne le trouve pas, une erreur IllegalOperationError avec le code d'erreur DRMSError 3344 ou DRMSError 3343 est renvoyée.

Pour gérer cette erreur, téléchargez le module Adobe Access à l'aide de l'API SystemUpdater. Une fois ce module télécharge, l'objet SystemUpdater distribue un événement COMPLETE. Définissez un écouteur d'évenement qui returne à l'étape 2 lors de la distribution de cet événement. Le code suivant illustré ces étapes :

flash.system.SystemUpdater.addEventListener(Event.COMPLET, updateCompleteHandler);
flash.system.SystemUpdater.update(flash.system.SystemUpdaterType.DRM)

```typescript
private function updateCompleteHandler (event:Event):void { /*redo step 2*/ drmContentData = new DRMContentData(metric_data_bytes); } 

Si le lecteur en tant que tel doit être mis à jour, un événement d'etat est distribué. Pour plus d'informations sur la gestion de cet événement, voir « Ecoute d'un événement de mise à jour » à la page 562.

Remarque : dans les applications AIR, le programme d'installation AIR gère la mise à jour du module Adobe Access et les mises à jour du moteur d'exécution requisés.

4 Creez des écouteurs qui écoute les événements DRMStatusEvent et DRMErrorEvent distribués par l'objet DRMManager :

DRMManager.addEventListener(DRMStatusEvent.DRM_STATUS, onDRMStatus);

DRMManager.addEventListener(DRMErrorEvent.DRM_ERROR, onDRMError);

Dans l'écouteur d'évenements DRMStatusEvent, vérifie que le voucher est valide (valeur autre que null). Dans l'écouteur d'évenements DRMSErrorEvent, gérez les événements DRMSErrorEvents. Voir « Utilisation de la classe DRMStatusEvent » à la page 554 et « Utilisation de la classe DRMSErrorEvent » à la page 559.

5 Chargez le voucher (la licence) requis pour生存 le contenu.

Essayez tout d'abord de charger une licence stockée localement pour dire le contenu :

DRMManger.loadvoucher(drContentData, LoadVoucherSetting.LOCAL_ONLY)

Une fois le chargement terminé, l'objet DRMManager distribue DRMStatusEvent.DRM_Status.

6 Si l'objet DRMVoucher possède une valeur autre que null, le voucher est valide. Passez à l'étape 13.
7 Si l'objet DRMVoucher est défini sur null, vérifie la méthode d'authentication requise par la régulation associée au contenu. Faites appel à la propriété DRMContentData.authenticationMethod.
8 Si la méthode d'authentication est ANONYMOUS, passez à l'objet 13.
9 Si la méthode d'authentication est USERNAME_AND_PASSWORD, l'application doit intégrer un mécanisme permettant à l'utilisateur d'entrée des informations d'identification. Transmettez ces informations d'identification au serveur de licences pour authenticate l'utilisateur :

DRMManger.authENTICate(data.dataServerURL, metadata.domain, username, password)

DRMManager distribue un événement DRMAAuthenticationErrorEvent si l'authentication échoue, un événement DRMAAuthenticationCompleteEvent si elle aboutit. Associez des écouteurs à ces événements.

10 Si la méthode d'authentication est UNKNOWN, une méthode d'authentication personnalisée doit être utilisée. Dans ce cas, le fournisseur de contenu a prévu d'exécuter l'authentication hors bande, c'est-à-dire de ne pas utiliser les API ActionScript 3.0. La procédure d'authentication personnalisée doit produit un jeton d'authentication qu'il est possible de transmettre à la méthode DRMManager.setAuthenticationToken().
11 Si l'authentication échoue, l'application doit returner à l'étape 9. Assurez-vous que l'application intègre un mécanisme permettant de gérer et restreindre les échecks successifs d'authentication. Àpres trois tentatives, vous pouvez, par exemple, afficher un message indiquant à l'utilisateur que l'authentication a échéué et qu'il est impossible de dire le contentu.
12 Pour utiliser le jeton stocké au lieu d'inviter l'utilisateur à entrer des informations d'identification, définièsez-le à l'aide de la méthode DRMManager.setAuthenticationToken(). T'échéchargez ensuite la licence à partir du serveur de licences et lisez le contenu (voir étape 8).

13 (Facultatif) Si l'authentication aboutit, vous pouvez capturer le jeton d'authentication, à savoir un tableau d'octets placé en mémoire cache. Récupérez ce jeton à l'aide de la propriété DRMAuthenticationCompleteEvent_token. Vous pouvez stocker et utiliser le jeton d'authentication pour éviter à l'utilisateur d'avoir à entraîr plusieurs fois les informations d'identification associées au contenu. Le serveur de licences déterminée la période de validité du jeton d'authentication.
14 Si l'authentication aboutit, telechargez la licence du serveur de licences:
DRMManager.loadvoucher(drContentData, LoadVoucherSetting.FORCE_REFRESH)
Une fois le chargement terminé, l'objet DRMManager distribue l'événement DRMStatusEvent.DRM_STATUS. Ecoutez cet événement. Une fois ce dernier distribué, vous pouvez lire le contenu.
15 Lisez la video en creant un objet NetStream, puis en appelant sa methode play(): stream = new NetStream(connection); stream.addEventListener(DRMStatusEvent.DRM_STATUS, drmStatusHandler); stream.addEventListener(DRMErrorEvent.DRM_ERROR, drmErrorHandler); stream.addEventListener(DRMStatusEvent.NET_STATUS, netStatusHandler); stream.client = new CustomClient(); video.attachNetStream(stream); stream.play(videoURL);

Objects DRMContentData et objets session

Lors de la création d'un objet DRMContentData, celui-ci est utilisé en tant qu'objet session qui fait reférence au module DRM de Flash Player. Toutes les API DRMManager qui recoivent cet objet DRMContentData utilisent ce module DRM particulier. Il existe néanmoins deux API DRMManager qui n'utilisent pas l'objet DRMContentData. Voici ces règles :

1 authenticate()
2 setAuthenticationToken()

Etant donné qu'il n'este aucun objet DRMContentData associé, l'invocation de ces API DRMManager fait appel au module DRM le plus recent du disque. Cela peut etre problematique si une mise a jour du module DRM se produit au cours du flux de travail du DRM de I'application. Tenez compte du scenario suivant :

1 L'application create un objet DRMContentDatacontentData1, qui utilise AdobeCP1 comme module DRM.
2 L'application invoque la méthode DRMManager.authENTICate(contentData1.serverURL,...).
3 L'application invoque la méthode DRMManager.loadVoucher(contentData1, ...).

Si une mise à jour du module DRM se produit avant que l'application ne puisse acceder à l'étape 2, la méthode DRMManager.authENTICate() finit par effectuer l'authtenification à l'aide du module DRM AdobeCP2. La méthode loadVoucher() de l'étape 3 échoue, car elle utilise toujours le module DRM AdobeCP1. Il est possible que la mise à jour ait eu lieu suite à l'invocation de la mise à jour du module DRM par une autre application. Vous pouvez éviter ce scenario en invoquant la mise à jour du module DRM au démarrage de l'application.

Evénements DRM

Le moteur d'exécution distribue un grand nombre d'événements lorsqu'une application essaire de dire un contenu protégé :

  • DRMDeviceGroupErrorEvent (AIR uniquement), distribué par DRMManager
  • DRMAuthenticateEvent (AIR uniquement), distribué par NetStream
  • DRMAAuthenticationCompleteEvent, distribué par DRMManager
  • DRMAuthenticationErrorEvent, distribué par DRMManager

  • DRMSError, distribué par NetStream et DRMManager

  • DRMStatusEvent, distribué par NetStream et DRMManager
  • StatusEvent
  • NetStatusEvent (voir « Ecoute d'un événement de mise à jour » à la page 562)

Pour prendre en charge un contenu protégé par Adobe Access, associez des écouteurs aux événements DRM.

Préchargement de vouchers pour une lecture hors connexion

Adobe AIR 1.5 et les versions ultérieures

Voupez precharger les vouchers (licences) requis pour dire le contenu protégé par Adobe Access. Les vouchers précharges permettent aux utilisateurs de visionner le contenu même si leur connexion Internet n'est pas active. (Le processus de préchargement à proprement parler requiert une connexion à Internet.) Faites appel à la méthode preloadEmbeddedMetadata() de la classe NetStream et à la classe DRMManager pour précharger les vouchers. Dans AIR 2.0 et les versions ultérieures, vous pouze précharger directement des vouchers par le biais d'un objet DRMContentData. Il est préféable d'utiliser cette technique, car elle permet de mettre à jour l'objet DRMContentData indépendamment du contenu. (La méthode preloadEmbeddedData() extrait l'objet DRMContentData du contenu.)

Utilisation de l'objet DRMContentData

Adobe AIR 2.0 et les versions ultérieures

La procédure ci-dessous décrit le préchargement du voucher associé à un fisier multimédia protégé par le biais d'un objet DRMContentData.

1 Extrayez les métadonnées binaires associées au contenu mis en package. Si vous utilisez Adobe Access Java Reference Packager, ce fjichier de métadonnées est automatiquement génére avec une extension .metadata. Vous pourriez, par exemple, télécharger ces métadonnées à l'aide de la classe URLsLoader.
2 Creez un objet DRMContentData en transmettant les métadonnées à la fonction constructeur :

var drmData:DRMContentData = new DRMContentData( metadata );

3 Les autres étapes sont identiques au flux de travail décrit à la section « Présentation du flux de travail associé au contenu protégé » à la page 546.

Utilisation de preloadEmbeddedMetadata()

Adobe AIR 1.5 et les versions ultérieures

La procédure suivanté décrit le préchargement du voucher associé à un fichier multimédia protégé par DRM par le biais de preloadEmbeddedMetadata():

1 Téchéargez et stockez le fjichier multimédia. (Il est uniquement possible de précharger les métadonnées du module DRM à partir des fjichiers enregistrrés localement.)
2 Creez les objets NetConnection et NetStream, en fournissant des implémentations pour les fonctions de rappel onDRMContentData() et onPlayStatus() de l'objet client NetStream.
3 Creez un objet NetStreamPlayOptions et definisse la propriété stream sur l'URL du fichier multimédia local.
4 Appelez la méthode NetStream preloadEmbeddedMetadata(), en transmettant l'objet NetStreamPlayOptions identifiant le fichier multimédia à analyser.

5 Si le fjichier multimédia contient des métadonnées DRM, la fonction de rappel onDRMContentData() est invoquée. Les métadonnées sont transmises à cette fonction sous forme d'objet DRMContentData.
6 Utilisez l'objet DRMContentData pour obtenir le voucher à l'aide de la méthode DRMManager loadVoucher().

Si la valeur de la propriété authenticateMethod de l'objet DRMContentData est

flash.net.drm.AuthenticationMethodUsername_AND_PASSWORD, authenticatez l'utiliseur sur le serveur de droits multimédias avant de charger le voucher. Les propriétés serverURL et domain de l'objet DRMContentData peuvent être transmis à la méthode DRMManager authenticate(), de même que les informations d'identification de l'utilisateur.

7 La fonction de rappel onPlayStatus() est invoquée lorsque l'analyse du fjichier est terminée. Si la fonction onDRMContentData() n'a pas ete appelé, le fjichier ne contient pas les métadonnées nécessaires à l'obtention d'un voucher. L'absence de cet appel peut ete additionally signifier qu'Adobe Access ne protège pas ce fjichier.

L'exemple de code pour AIR suivant illustrer le préchargement d'un voucher associé à un fichier multimédia local :

package   
{   
import flash.display.Sprite;   
import flash.events.DRMAuthenticationCompleteEvent;   
import flash.events.DRMAuthenticationErrorEvent;   
import flash.events.DRMErrorEvent;   
import flash.events.DRMStatusEvent;   
import flash.events.NetStatusEvent;   
import flash.net.NetConnection;   
import flash.net.NetStream;   
import flash.net.NetStreamPlayOptions;   
import flash.net.drm.AuthenticationMethod;   
import flash.net.drm.DRMContentData;   
import flash.net.drm.DRMManager;   
import flash.net.drm.LoadVoucherSetting;   
public class DRMPreloader extends Sprite   
{   
    private var videoURL:String = "app-storage:/video.flv";   
    private var userName:String = "user";   
    private var password:String = "password";   
    private var preloadConnection:NetConnection;   
    private var preloadStream:NetStream;   
    private var drmManager:DRMManager = DRMManager.getDRMManager();   
    private var drmContentData:DRMContentData;   
public function DRMPreloader():void {   
    drmManager.addEventListener( DRMAuthenticationCompleteEvent.AUTHENTICATION_COMPLETE, onAuthenticationComplete);   
    drmManager.addEventListener(DRMAuthenticationErrorEvent.AUTHENTICATION_ERROR, onAuthenticationError);   
    drmManager.addEventListener(DRMStatusEvent.DRM_STATUS, onDRMStatus);   
   drmManager.addEventListener(DRMErrorEvent.DRM_ERROR, onDRMError);   
    preloadConnection = new NetConnection();   
    preloadConnection.addEventListener(DRMStatusEvent.NET_STATUS, onConnect);   
    preloadConnection.connect(null);   
}   
private function onConnect( event:NetStatusEvent):void {   
    preloadMetadata();   
} 
private function preloadMetadata():void { preloadStream = new NetStream( preloadConnection ); preloadStream.client = this; var options:NetStreamPlayOptions = new NetStreamPlayOptions(); options.streamName = videoURL; preloadStream.preloadEmbeddedData(options); } public function onDRMContentData(drmMetadata:DRMContentData):void { drmContentData = drmMetadata; if (drmMetadata.authenticationMethod == AuthenticationMethodUsername_AND_PASSWORD) { authenticateUser(); } else { getVoucher(); } } private function getVoucher():void { drmManager.loadVoucher(drmContentData, LoadVoucherSetting.ALLOW_SERVER); } private function authenticateUser():void { drmManager.authENTICate(drmContentData.serverURL, drmContentData.domain, userName, password); } private function onAuthenticationError(event:DRMAAuthentication失误):void { trace("Authentication error: " + event失误ID + ", " + event.sub失误ID); } private function onAuthenticationComplete(event:DRMAAuthenticationCompleteEvent):void { trace("Authenticated to: " + event.serverURL + ", domain: " + event/domain); getVoucher(); } private function onDRMStatus(event:DRMStatusEvent):void { trace("DRM Status: " + event.detail); trace(--Voucher allows offline playback = " + event.isAvailableOffline); trace(--Voucher already cached = " + event.isLocal); trace(--Voucher required authentication = " + !event.isAnonymous); } private function onDRMError(event:DRMErrorEvent):void { trace("DRM error event: " + event失误ID + ", " + event.subErrorID + ", " + event.text); } public function onPlayStatus(info:Object):void { preloadStream.close(); } } 

Membres et événements DRM de la classe NetStream

Flash Player 10.1 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La classe NetStream propose une connexion en flux continu unidirectionnelle entre Flash Player ou une application AIR et Flash Media Server ou le système de fichiers local. (La classe NetStream gère également les téléchargesements en mode progressif.) Un objet NetStream est un canal dans un objet NetConnection. La classe NetStream distribue quatre événements DRM :

EvénementDescription
drmAuthentication (AIR uniquement)Défini dans la classe DRMAuthenticateEvent. Cet événement est distribué lorsqu'un objet NetStream tente de dire un contenu protégé qui requiert l'authentication des informations d'identification de l'utilisateur avant la lecture. Les propriétés de cet événement incluent les propriétés header, usernamePrompt, passwordPrompt et urlPrompt, qui permettent d'obtenir et de définir les informations d'identification des utilisateurs. Cet événement est repété jusqu'à ce que l'objet NetStream reçoive des informations d'identification des utilisateurs valides.
drmErrorDéfini dans la classe DRMErrorEvent et distribué lorsqu'un objet NetStream essaire de dire un contenu protégé et rencontres une erreur DRM. Un objet d'événement associé à une erreur DRM est par exemple distribué lorsque l'autorisation de l'utilisateur échoue. Cette erreur s'est peut-être produit car l'utilisateur ne s'est pas acquitté des droits d'affichage du contenu. Il est également possible que le fournisseur de contenu ne prenne pas en charge l'application d'affichage.
drmStatusDéfini dans la classe DRMStatusEvent. Cet événement est distribué lorsque la lecture du contenu protégé démarre (une fois l'utilisateur authortifié et autorisé à dire le contenu). L'objet DRMStatusEvent contient des informations relatives au voucher. Il mémorise par exemple des informations relatives à la disponibilité hors connexion du contenu ou à la date d'expiration du voucher (au terme de laquelle il est impossible de visionner le contenu).
statusDéfini dans l'événement events.StatusEvent et distribué uniquement lorsque l'application essaire de dire un contenu protégé, en appelant la méthode NetStream.play(). La valeur de la propriété status code est définié sur « DRM.encryptedFLV ».

La classe NetStream comprend les méthodes propres à DRM suivantes, réservées à AIR :

MéthodeDescription
resetDRMVouchers()Supprime toutes les données du voucher DRM placé dans le cache local. L'application doit télécharger à nouveau les vouchers pour que l'utilisateur puisse accéder au contenu chiffré. Par exemple, le code suivant supprime tous les vouchers du cache : NetStream.resetDRMVouchers();
setDRMAuthenticationCredentials()Transmet un jeu d'informations d'identification, à savoir le nom d'utilisateur, le mot de passer et le type d'authentication, à l'objet NetStream à titre d'authentication. Les types d'authentication valides sont « drm » et «proxy». Pour le type d'authentication « drm», les informations d'identification indiquées sont comparées à Adobe Access. Pour le type d'authentication «proxy», les informations d'identification sont comparées aux données stockées sur le serveur proxy et doivent être identiques aux informations requises par ce dernier. Par exemple, une entreprise peut solliciter l'authentication de l'application auprès d'un serveur proxy avant que l'utilisateur puisse accéder à Internet. L'option proxy permet également ce type d'authentication. A moins que l'authentication anonyme ne soit utilisée, au terme de l'authentication proxy, l'utilisateur doit néanmoins s'authentifier auprès d'Adobe Access pour obtenir le voucher et dire le contenu. Vous pouvez utiliser setDRMAuthenticationCredentials() une deuxième fois, avec l'option « drm», pour l'authentication auprès d'Adobe Access.
preloadEmbeddedMetadata()Recherche les métadonnées intégrées dans un fichier multimédia local. Lorsque des métadonnées DRM sont détectées, AIR appelle la fonction de rappel onDRMContentData().

Par ailleurs, dans AIR, un objet NetStream appelle les fonctions de rappel onDRMContentData() et onPlayStatus() suite à un appel à la méthode preloadEmbeddedMetaData(). La fonction onDRMContentData() est appelée lorsque des métadonnées DRM sont détectées dans un fjichier multimédia. La fonction onPlayStatus() est appelée une fois l'analyse du fjichier terminée. Les fonctions onDRMContentData() et onPlayStatus() doivent être définies sur l'objet client affecté à l'occurrence de NetStream. Si vous utilisez le même objet NetStream pour précharger les vouchers et dire un contenu, attendez l'objet onPlayStatus() géné par preloadEmbeddedMetaData() avant de commencer la lecture.

Dans le code suivant pour AIR, le nom d'utilisateur (« administrador »), le mot de passer (« password ») et le type d'authentication (« drm ») sont définis pour authenticateur l'utilisateur. La méthode

setDRMAAuthenticationCredentials() doit fournir des informations d'identification connues et acceptées par le fournisseur de contenu. Ces informations d'identification sont identiques aux données saisies par l'utilisateur pour visionner le contenu. Ce chapitre ne contient pas le code permettant de dire la video et de s'assurer qu'une connexion au flux video a abouti.

var connection:NetConnection = new NetConnection();
connection.connect(null);
var videoStream:NetStream = new NetStream(connection);
videoStream.addEventListener(DRMAuthenticateEvent.DRM_AUTHENTICATE, drmAuthENTICateEventHandler)
private function drmAuthENTICateEventHandler(event:DRMAuthENTICateEvent):void { videoStream.setDRMAuthenticationCredentials("administrator", "password", "drm"); }

Utilisation de la classe DRMStatusEvent

Flash Player 10.1, Adobe AIR 1.0 et les versions ultérieures

Un objet NetStream distribue un objet DRMStatusEvent lorsque la lecture du contenu protégé par Adobe Access débute. (Pour cela, la licence doit être vérifiée, et l'utilisateur doit être authentifié et autorisé à afficher le contenu). L'objet DRMStatusEvent est également distribué lorsqu'un utiliser anonyme est autorisé à acceder au contenu. La licence est vérifiée pour s'assurer que les utiliser anonymes, qui nerequirement pas d'authentication, sont autorisés à dire le contenu. Les utiliser anonymes risquent de ne pas être autorisés à acceder au contenu pour diverses raisons. Un utiliser anonyme ne peut, par exemple, pas acceder au contenu lorsque la licence est arrivée à expiration.

L'objet DRMStatusEvent contient des informations relatives à la licence. Il mémorise par exemple des informations relatives à la disponibilité hors connexion de la licence ou à la date d'expiration du voucher (au terme de laquelle il est impossible de visionner le contenu). L'application peut utiliser ces données pour communiquer l'état des régulations de l'utilisateur et les autorisations correspondantes.

Propriétés DRMStatusEvent

Flash Player 10.1, Adobe AIR 1.0 et les versions ultérieures

La classe DRMStatusEvent comprend les propriétés suivantes. Certaines propriétés ont été introduites dans les versions d'AIR ultérieures à 1.0. Pour obtenir des informations de version détaillées, voir le Guide de referencia d'ActionScript 3.0 pour Flash Professional.

La classe DRMVoucher propose des propriétés pour Flash Player 10.1 similaires à celles qui ne sont pas prises en charge par ce dernier.

PropriétéDescription
contentDataObjet DRMContentData contenant les métadonnées DRM intégrées dans le contentu.
détail (AIR uniquement)Chaîne expliquant le contexte de l'événement d'état. Dans DRM 1.0, l'unique valeur valide est DRM.voucherObtained.
isAnonymous (AIR uniquement)Indique si le contentu protégé avec Adobe Access est disponible sans que l'utiliser n'ait à fournir ses informations d'authentication (true), ou uniquement à condition qu'il fournisse ces informations (false). La valeur false signifie que l'utiliser doit entraun un nom d'utiliser et un mot de passer correspondant aux données connues et attendues par le fournisseur de contentu.
isAvailableOffline (AIR uniquement)Indique si le contentu protégé avec Adobe Access peut être disponible hors connexion (true) ou pas (false). Pour que le contentu protégé numérique soit disponible hors ligne, le voucher correspondant doit être placé dans le cache de l'ordinateur local de l'utiliser.
isLocalIndique si le voucher requis pour la lecture du contentu est mis en cache localement.
offlineLeasePeriod (AIR uniquement)Nombre restant de jours pendant lesquels le contentu peut être visionné hors ligne.
policies (AIR uniquement)Objet personnalisé pouvant containir des propriétés DRM personnalisées.
voucherDRMVoucher.
voucherEndDate (AIR uniquement)Date absolue d'expiration du voucher, après laquelle il est impossible de visionner le contentu.

Création d'un gestionnaire DRMStatusEvent

Flash Player 10.1, Adobe AIR 1.0 et les versions ultérieures

L'exemple suivant create un gestionnaire d'événement qui renvoie des informations sur l'état du contenu chiffré par DRM de l'objet NetStream à l'origine de l'événement. Ajoutez ce gestionnaire d'événement à un objet NetStream qui pointe vers le contenu protégé.

function drmStatusEventHandler(event:DRMStatusEvent):void { trace(event); } function drmStatusEventHandler(event:DRMStatusEvent):void { trace(event); } 

Utilisation de la classe DRMAutenticatedEvent

Adobe AIR 1.0 et les versions ultérieures

L'objet DRMAAuthenticationEvent est distribué lorsqu'un objet NetStream essaire de dire un contenu protégé qui requiert la saisie des informations d'identification de l'utilisateur avant la lecture.

Le gestionnaire DRMAuthenticateEvent est chargé de collecter les informations d'identification requises (nom d'utilisateur, mot de passer et type) et de les transmettre à la méthode

NetStream.setDRMAAuthenticationCredentials() pour qu'elles soient validées. Chaque application AIR doit intégrer un mécanisme de collecte des informations d'identification des utilisateurs. L'application pourrait par exemple proposer à l'utilisateur une interface simple permettant de saisir son nom d'utilisateur et son mot de passer. Veiliez également à intégrer un mécanisme de gestion et de restriction des tentatives d'authentication successives.

Propriétés DRMAuthenticateEvent

Adobe AIR 1.0 et les versions ultéieures

La classe DRMAutenticatedEvent comprend les propriétés suivantes :

PropriétéDescription
authenticationTypeIndique si les informations d'identification fournies sont destinées à une authentication auprès d'Adobe Access (« drm ») ou d'un serveur proxy («proxy»). Par exemple, l'options "proxy" permet à l'application de s'authentifier auprès d'un serveur proxy, s'il y a lieu, avant que l'utilisateur puisse acceder à Internet. A moins que l'authentication anonyme ne soit utilisée, au terme de l'authentication proxy, l'utilisateur doit néanmoins s'authentifier auprès d'Adobe Access pour obtenir le voucher et dire le contenu. Vous pouvez utiliser setDRMAuthenticationcredentials() une deuxieme fois, avec l'options « drm», pour l'authentication auprès d'Adobe Access.
headerEn-tête du fichet de contenu chiffré fourni par le serveur. Il contient des informations relatives au contexte du contenu chiffré.II est possible de transmettre cette chaine d'en-tête à l'application Flash pour autoriser cette dernière à créé une boîte de dialogue nom d'utilisateur/mot de passer. La chaine d'en-tête peut être utilisée comme instructions de la boîte de dialogue. Par exemple, l'en-tête peut indiquer « Saisissez votre nom d'utilisateur et votre mot de passer » .
netstreamObjet NetStream à l'origine de cet événement .
passwordPromptInvite associée au mot de passer, fournie par le serveur. La chaine peut compter des instructions relatives au type de mot de passer requis .
urlPromptInvite associée à une chaine URL, fournie par le serveur. La chaine peut fournir l'emplacement auquel le nom d'utilisateur et le mot de passer sont envoyés .
usernamePromptInvite associée au nom d'utilisateur, fournie par le serveur. La chaine peut compter des instructions relatives au type de nom d'utilisateur requis. Par exemple, un fournisseur de contenu peut exiger une adresse électronique comme nom d'utilisateur .

Les chaînes mentionnées précédemment sont fournies par le serveur FMRMS uniquement. Adobe Access Server n'utilise pas ces chaînes.

Creation d'un gestionnaire DRMAutenticatedEvent

Adobe AIR 1.0 et les versions ultérieures

L'exemple suivant create un gestionnaire d'événement qui transmet un jeu d'informations d'authentication codées en dur à l'objet NetStream à l'origine de l'événement. (Ce chapitre ne contient pas le code permettant de dire la vente et de s'assurer qu'une connexion au flux video a abouti.)

var connection:NetConnection = new NetConnection();
connection.connect(null);
var videoStream:NetStream = new HttpStream(connection);
videoStream.addEventListener(DRMAuthenticateEvent.DRM_AUTHENTICATE, drmAuthENTICateEventHandler)
private function drmAuthENTICateEventHandler(event:DRMAuthENTICateEvent):void { videoStream.setDRMAuthenticationCredentials("administrator","password","drm"); }

Creation d'une interface de collecte des informations d'identification des utilisateurs

Adobe AIR 1.0 et les versions ultérieures

Si un contenu protégé requiert l'authentication de l'utilisateur, l'application AIR doit généralement extraire les informations d'identification de l'utilisateur au moyen d'une interface utilisateur.

Le code suivant est un exemple Flex d'interface utiliser simple permettant de collecter les informations d'identification des utilisateurs. Il se compose d'un objet Panel contenant deux objets TextInput (le premier étant réservé aux noms d'utiliser et le second aux mots de passer). L'objet Panel comporte également un bouton permettant de démarrer la méthode credentials().

<mx:Panel x="236.5" y="113" width="325" height="204" layout="absolute" title="Login"> <mx:TextInput x="110" y="46" id="uName"/> <mx:TextInput x="110" y="76" id="pWord" displayAsPassword="true"/> <mx:Text x="35" y="48" text="Username"/> <mx:Text x="35" y="78" text="Password"/> <mx:Button x="120" y="115" label="Login" click="credentials"/> </mx:Panel> 

La méthode credentials() est une méthode définie par l'utilisateur qui transmet les valeurs de nom d'utilisateur et de mot de passer à la méthode setDRMAAuthenticationCredentials(). Une fois ces valeurs transmises, la méthode credentials() réinitialise les valeurs des objets TextInput.

<mx:Script>
    <![CDATA[ public function credentials():void
        videoStream.setDRMAAuthenticationCredentials(uName, pWord, "drm");
        uName.text = "";
        pWord.text = "";
    }
] ]]>
</mx:Script> 

Pour implémenter ce type d'interface simple, il est possible d'inclure l'objet Panel au sein d'un nouvel état. Le nouvel état provient de l'état de base lorsque l'objet DRMAAuthenticationEvent est envoyé. L'exemple suivant contient un objet VideoDisplay doté d'un attribut source qui pointe vers un filchier FLV protégé. Dans ce cas, la méthode credentials() est modifiée de façon à ce qu'elle renvoie également l'application à son état de base. Pour cela, les informations d'identification de l'utilisateur doivent être transmises et les valeurs de l'objet TextInput réinitialisées.

<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml">
    layout="absolute"
    width="800"
    height="500"
    title="DRM FLV Player"
    creationComplete="initApp()
">
    <mx:states>
        <mx:State name="LOGIN">
            <mx:AddChild position="lastChild">
                <mx:Panel x="236.5" y="113" width="325" height="204" layout="absolute">
                    <mx:TextInput x="110" y="46" id="uName"/>
                <mx:TextInput x="110" y="76" id="pWord" displayAsPassword="true"/>
                <mx:Text x="35" y="48" text="Username"/>
                <mx:Text x="35" y="78" text="Password"/>
                <mx:Button x="120" y="115" label="Login" click="credentials(){
                <mx:Button x="193" y="115" label="Reset" click="uName.text='+};
                pWord.text='+";
            } </mx:Panel>
            </mx:AddChild>
        </mx:State>
</mx:states>
<mx:Script>
    <!--[CDATA[ import flash.events.DRMAuthenticateEvent; private function initApp():void { videoStream.addEventListener(DRMAuthunateEvent.DRM_AUTHENTICATE, drmAuthENTICateEventHandler); }
} 
public function credentials():void { videoStream.setDRMAAuthenticationCredentials(uName, pWord, "drm"); uName.text = ""; pWord.text = ""; currentState=''; } private function drmAuthENTICateEventHandler(event:DRMAAuthenticationEvent):void { currentState='LOGIN'; } ]]; </mx:Script> <mx:VideoDisplay id="video" x="50" y="25" width="700" height="350" autoPlay="true" bufferTime="10.0" source="http://www.example.com/flv/Video.flv" /> </mx:WindowedApplication> 

Utilisation de la classe DRMSError

Flash Player 10.1 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Adobe Flash Player and Adobe AIR distribuents un objet DRMErrorEvent lorsqu'un objet NetStream qui tente de dire un contenu protégé rencontres une erreur DRM. Si les informations d'identification ne sont pas valides dans une application AIR, l'objet DRMAuthENTICATEEvent distribue continuesment un objet jusqu'à ce que l'utilisateur entre des informations d'identification valides ou que l'application refuse toute autre tentative. L'application est chargée d'écouter tout autre événement d'erreur DRM pour détecter, identifier et gérer les erreurs DRM.

Meme si les informations d'identification de l'utiliseur sont valides, il est possible que les conditions du voucher l'empêchent d'afficher un contenu chiffré. Par exemple, un utiliser peut se voir refuser l'accès à un contenu s'il tente de dire ce contenu dans une application non autorisée. Une application non autorisée est une application que l'éditeur du contenu chiffré n'a pas validée. Dans ce cas, un objet DRMErroEvent est distribué.

Des événements d'erreur peuvent également être déclenchés si le contenu est endommagé ou si la version de l'application ne correspond pas aux specifications du voucher. L'application doit intégrer un mécanisme de gestion des erreurs approprié.

Proprietés DRMSError

Flash Player 10.1 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Pour obtenir la liste complète des erreurs, voir Erreurs d'exécution dans le Guide de ↔équence d'ActionScript 3.0 pour Flash Professional. Les erreurs DRM débutent au numéro 3300.

Creation d'un gestionnaire DRMSError

Flash Player 10.1 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

L'exemple suivant create un gestionnaire d'évenement associé à l'objet NetStream à l'origine de l'évenement. Il est appelé si l'objet NetStream rencontres une erreur lors d'une tentative de lecture de contenu protégé. En règle générale, lorsqu'une application detecte une erreur, elle procède à une série d'opérations de nettoyage. Elle informe ensuite l'utilisateur de l'érreur et lui fournit des solutions pour résoudre le problème.

private function drmErrorErrorHandler(event:DRMSError):void{trace(event.toString());} 

Utilisation de la classe DRMManager

Flash Player 10.1 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

La classe DRMManager permet de gérer les vouchers et les sessions du serveur des droits multimédias dans les applications.

Gestion des vouchers (AIR uniquement)

Lorsqu'un utilisateur lit un contenu protégé, le moteur d'exécution obtient et place en mémoire cache la licence requise pour visionner le contenu. Si l'application enregistre le fichier locally et si la licence autorise la lecture hors connexion, l'utilisateur peut visionner le contenu dans l'application AIR. La lecture locale hors connexion est possible même si la connexion au serveur de droits multimédias n'est pas disponible. Vous pouvez pré-placer en mémoire cache le voucher par le biais de DRMManager et de la méthode preloadEmbeddedMetadata() de NetStream. Il est inutil que l'application obtienne la licence nécessaire au visionnement du contenu. Par exemple, votre application peut télécharger le fichier multimédia, puis obtenir le voucher pendant que l'utilisateur est encore en ligne.

Pour précharger un voucher, utilisez la méthode NetStream preloadEmbeddedMetadata() pour Obtir un objet DRMContentData. L'objet DRMContentData contient l'URL et le domaine du serveur de gestion des droits d'auteur pouvant fournir la licence et indique si l'autographication de l'utiliser est requise. Avec ces informations, vous pouze appeler la méthode DRMManager loadVoucher() pour Obtir le voucher et lemettre en cache. La procEDURE de préchargeMENT des vouchers est décrite plus en détails à la section « PréchargeMENT de vouchers pour une lecture hors connexion » à la page 550.

Gestion des sessions

Vou puez eaglement utilise DRMManger pour authentifier l'utiliser aupres d'un serveur de gestion des droits d'auteur et pour gerer les sessions persistantes.

Appelez la méthode DRMManager authenticate() pour étabir une session auprès du serveur de gestion des droits d'auteur. Une fois l'authentication réussie, le DRMManager distribue un objet DRMAuthenticationCompleteEvent qui contient un jeton de session. Vous pouvez enregistrer ce jeton pour étabir les sessions futures de sorte que l'utilisateur n'ait plus besoin de fournir les informations d'identification de son compte. Transmettez le jeton à la méthode setAuthenticationToken() pour étabir une nouvelle session authentifiée. (Les paramètres du serveur généres par le jeton déterminent la date d'expiration du jeton et d'autres attributs. Le code de l'application AIR ne doit pas interpréter la structure de données du jeton, car cette structure est susceptible de changer lors de futures mises à jour d'AIR.)

Il est possible de transférer les jetons d'authentication à d'autres ordinateurs. Pour les protégger, vous pouvez les stocker dans le magasin local chiffré d'AIR. Pour plus d'informations, voir « Stockage local chiffré » à la page 737.

Evénements DRMStatus

Flash Player 10.1 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

Le DRMManager distributes an objet DRMStatusEvent lorsqu'un appel de la méthode loadVoucher() aboutit.

Si un voucher a ete obtenu, la propriete detail (AIR uniquement) de l'objet d'évenement prend la valeur :

< DRM.voucherObtained > et la propriété voucher contient l'objet DRMVoucher.

Si le voucher n'a pas ete obtenu, la propriete detail (AIR uniquement) conserve la valeur :

< DRM.voucherObtained >, mais la propriété voucher est null. Il est impossible d'obtenir un voucher si, par exemple, vous définiquee LoadVoucherSetting sur localOnly et qu'aucun voucher n'a ete place dans la memoire cache locale.

Si l'appeil de la méthode loadVoucher() échoue, en raison d'une erreur de communication ou d'authentication, par exemple, le DRMManager distribue alors un objet DRMSError ou DRMAuthenticationErrorEvent.

Evénements DRMAAuthenticationComplete

Flash Player 10.1 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

Le DRMManager distribue un objet DRMAuthenticationCompleteEvent lorsque l'utilisateur est bien identifié via un appel à la méthode authenticate().

L'objet DRMAAuthenticationCompleteEvent contient un jeton réutilisable qui peut servir àmaintenir l'autentication de l'utilisateur dans plusieurs sessions de l'application. Transmetteze ce jeton à la méthode setAuthenticationToken() du DRMManager pour rétablir la session. (Le creator du jeton définit les attributs du jeton, notamment sa date d'expiration. Adobe ne fournit pas d'API capable d'examiner les attributs du jeton.)

Evénements DRMAAuthenticationError

Flash Player 10.1 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

Le DRMManager distribue un objet DRMAuthenticationErrorEvent lorsqu'un utiliser n'a pas pu s'authentifier via un appel aux méthodes authenticate() ou setAuthenticationToken().

Utilisation de la classe DRMContentData

Flash Player 10.1 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

L'objet DRMContentData contient les propriétés de métadonnées du contenu protégé par Adobe Access. Les propriétés DRMContentData contiennent les informations nécessaires à l'obtention du voucher de licence permettant d'afficher le contenu. La classe DRMContentData permet d'obtenir le fjichier de métadonnées associé au contenu, comme indiqué à la section « Flux de travail détaillé des API » à la page 547.

Pour plus d'informations, voir la classe DRMContentData dans le manuel Guide de referrerce ActionScript 3.0 pour la plate-forme Adobe Flash.

Mise à jour de Flash Player en vue de prendre en charge Adobe Access

Flash Player 10.1 et les versions ultérieures

Important : Flash Player 11.5 et les versions ultérieures intègrent le module Adobe Access ; l'étape de mise à jour (l'appeal de SystemUpdater.update(SystemUpdaterType.DRM)) est donc inutile. Les navigateurs et plates-formes suivants sont concernés :

  • Contrôle ActiveX Flash Player 11.5, pour toutes les plates-formes à l'exception d'Internet Explorer sous Windows 8
  • Plug-in Flash Player 11.5, pour tous les navigateurs
  • Adobe AIR (version de bureau et version mobile)

L' étape de mise à jour est très difficile dans les cas suivants :

  • Internet Explorer sous Windows 8
  • Flash Player 11.4 et versions antérieures, à l'exception de Google Chrome 22 et des versions ultérieures (toutes les plates-formes) ou de Google Chrome 21 et des versions ultérieures (Windows)

Remarque : vous pouvez toujours appeler SystemUpdater. update (SystemUpdaterType.DRM) sur un système doté de Flash Player 11.5 ou d'une version ultérieure, mais rien n'est téléchargeé.

Flash Player doit-disposer du module Adobe Access pour prendre en charge ses fonctions. Lorsque Flash Player tente de dire un contenu protégé, le moteur d'exécution indique si le module ou une nouvelle version de Flash Player doit être téléchargeé. Flash Player permet ainsi aux développpeurs SWF de ne pas faire de mise à jour, le cas échéant.

En règle générale, pour生存 du contenu protégé, les développpeurs SWF mettent à jour le module ou le lecteur Adobe Access requis. Pour effectuer la mise à jour, vous disposez de l'API SystemUpdater, qui permet d'obtenir la version la plus récente du module Adobe Access ou de Flash Player.

L'API SystemUpdater n'autorise qu'une mise à jour à la fois. Le code d'erreur 2202 indique qu'une mise à jour est en cours d'exécution dans l'occurrence active du moteur d'exécution ou une autre occurrence. Ainsi, s'il se produit une mise à jour d'une occurrence de Flash Player dans Internet Explorer, il est impossible d'effectuer une mise à jour d'une occurrence de Flash Player dans Firefox.

Seules les plates-formes de bureau prennant en charge l'API SystemUpdater.

Remarque: pour les versions de Flash Player antérieures à 10.1, utilisez le mecanisme de mise à jour pris en charge par les versions antérieures du lecteur (telechargement et installation manuels à partir du site www.adobe.com ou d'ExpressInstall). Le programme d'ss installation d'AIR gere par ailleurs les mises à jour requises d'Adobe Access, mais non l'API SystemUpdater.

Ecoute d'un événement de mise à jour

Flash Player 10.1 et les versions ultérieures

Lorsqu'une mise à jour du module Adobe Access est nécessaire, l'objet NetStream distribue un événement NetStatusEvent dont la valeur de code correspond à DRM. UpdateNeeded. Cette valeur indique que l'objet NetStream ne peut pas dire le flux protégé par le biais de tout module Adobe Access actuellement installé. Ecoutez cet événement etappelez le code suivant:

SystemUpdater.update flash.system.SystemUpdaterType.DRM)

Ce code met à jour le module Adobe Access installé dans le lecteur. L'accord de l'utilisateur pour cette mise à jour du module n'est pas obligatoire.

Si le module Adobe Access est introuvable, une erreur est renvoyée. Voir l' étape 3 de « Flux de travail détaillé des API » à la page 547.

Remarque: si play() est appelé sur un flux chiffré dans des lecteurs antérieurs à 10.1, un événement NetStatusEvent dont la valeur de code correspond à NetStream.Play_STREAMNotFound est distribué. Pour les lecteurs antérieurs, faites appel au mécanisme de mise à jour pris en charge (telechargement et installation manuels à partir du site www.adobe.com ou d'ExpressInstall).

S'il est nécessaire demettre a jour le lecteur en tant que tel, l'objet SystemUpdater distribue un événement StatusBarEvent dont la valeur de code correspond à DRM.UpdateNeededButIncompatible. Pourmettre a jour le lecteur, l'accord de l'utilisateur est obligatoire. Integrez a l'application une interface permettant a l'utilisateur d'accepter et de démarrer la mise a jour du lecteur.Ecoutez I'évenement StatusBarEvent et appelez le code suivant:

System updater.update flash.system.System updaterType.SYSTEM);

Ce code démarre la mise à jour du lecteur.

D'autres événements associés à la classe SystemUpdater sont passés en revue dans le manuel Guide de référence ActionScript 3.0 pour la plate-forme Adobe Flash.

Une fois la mise à jour du lecteur terminée, l'utilisteur est renvoyé à la page initiale. Le module Adobe Access est téléchargeé et la lecture du flux peut démarrer.

Licences hors bande

Flash Player 11 et les versions ultérieures, Adobe AIR 3.0 et les versions ultérieures

Il est possible d'obtenir les licences hors bande (c'est-à-dire sans se connecter au serveur de licences Adobe Access) en enregistrant le voucher (la licence) sur le disque et dans la mémoire à l'aide de la méthode storeVoucher.

Pour dire une video chiffree dans Flash Player et AIR, le moteur d'execution respectif doit obtenir le voucher DRM correspondant à cette video. Le voucher DRM contient la clé de chiffrement de la video et est géné par le serveur de licences Adobe Access que le client a déployé.

Le moteur d'execution de Flash Player/AIR obtient généralement ce voucher en envoyant une demande de voucher au serveur de licences Adobe Access indiqué dans les métadonnées DRM de la vente (classe DRMContentData).

L'application Flash/AIR peut déclencher cette demande de licence en appelant la méthode

DRMManager. loadVoucher(). Le moteur d'execution de Flash Player ou d'AIR peut par ailleurs solliciter automatiquement une licence au début de la lecture de la video chiffree si aucune licence ne correspond au contenu sur le disque ou dans la memoire. Dans tous les cas, la communication avec le serveur de licences Adobe Access a une incidence sur les performances de l'application Flash/AIR.

DRMManagerstoreVoucher() permit à l'application Flash/AIR d'envoyer les vouchers DRM obtenus hors bande au moteur d'exécution de Flash Player ou d'AIR. Le moteur d'exécution peut alors ignorer le processus de demande de licence et utiliser les vouchers transmis pour dire les videos chiffrées. Il est always nécessaire de générer le voucher DRM via le serveur de licences Adobe Access avant de pouvoir l'obtenir hors bande. Vous avez néanmoins la possibilité d'héberger les vouchers sur un serveur HTTP只想 que sur un serveur de licences Adobe Access public.

DRMManager)Voucher() prend également en charge le partage de vouchers DRM entre plusieurs péripériques. Dans Adobe Access 3.0, cette fonction est appelée « prise en charge de Domaine ». Si vous déploiemment prend en charge ce cas d'utilisation, vous pouvez enregister plusieurs machines dans un groupe de péripériques via la méthode DRMManager.addToDeviceGroup(). S'il existe une machine disposant d'un voucher associé au domaine pour un contenu donné, l'application AIR peut alors extraire les vouchers DRM sérieisés à l'aide de la méthode DRMVoucher.toByteArray(), et il est possible d'importer les vouchers sur les autres machines à l'aide de la méthode DRMManager)Voucher().

Enregistrement de péripérisque

Les vouchers DRM sont liés à la machine de l'utilisateur final. Par conséquent, les applications Flash/AIR nécessitent un ID unique pour que la machine de l'utilisateur puisse faire référence à l'objet de voucher DRM sérieisé approprié. Le scenario suivant déscrit la procédure d'enregistrement d'un périphérique :

Voudevezaupréalableeffectuerlestachessuivantes:

  • Configurez le kit SDK du serveur Adobe Access.
  • Configurez un serveur HTTP en vue d'obtenir des licences pré-généées.
  • Créez une application Flash afin d'accéder au contenu protégé.

La phase d'enregistrement du périhérique implique les actions suivantes :

1 L'application Flash create un ID génére de façon aléatoire.
2 L'application Flash invoque la méthode DRMManager.authENTICate(). L'application doit inclure l'ID génére de façon aléatoire à la demande d'authentication, par exemple inclure l'ID dans le champ Nom d'utilisateur.
3 L'action mentionnée à l'etape 2 pousse Adobe Access à envoyer une demande d'authentication au serveur du client. Cette demande inclut le certificat du péripérisque.

a Le serveur extrait le certificat du péripéhérique et l'ID génééré, puis les enregistrestre.
b Le sous-système du client pré-génére les licences correspondant à ce certificat de périphérique, les enregistré et en autorise l'accès en les associant à l'ID généré.

4 Le serveur répond à la demande via un message « success »
5 L'application Flash enregistre l'ID génére locally dans un objet partagé local (LSO).

Après l'enregistrement du périphérique, l'application Flash utilise l'ID généré de la même manière qu'elle aurait utilisé l'ID de périphérique dans le modele précédent :

1 L'application Flash tente de localiser l'ID génére dans l'objet LSO.
2 Si l'ID génére est detecté, l'application Flash l'utilise lors du téléchargement des licences pré-générées. L'application Flash envoie les licences au client Adobe Access à l'aide de la méthode DRMManagerstoreVoucher().
3 Si l'ID génére est introuvable, l'application Flash suit la procédure d'enregistrement de péripérisque.

Rétablissement des paramètres par défaut

Lorsque l'utilisateur du périphérique invoque l'option de rétablissement des paramètres par défaut, le certificat du périphérique est supprimé. Pour poursuivre la lecture du contenu protégé, l'application Flash doit repeter la procédure d'enregistrement de périphérique. Si l'application Flash envoie une licence pré-chargee absolète, le client Adobe Access la refuse, car la licence a été chiffree pour un ancien ID de périphérique.

Prise en charge de Domaine

Flash Player 11 et les versions ultérieures, Adobe AIR 3.0 et les versions ultérieures

Si les métadonnées du contenu indiquent que l'enregistrement du domaine est requis, l'application AIR peut invoquer une API en vue de se joindre à un groupe de péripériques. Cette action déclenchée une demande d'enregistrement à envoyer au serveur de Domaine. Dès qu'une licence est délivrée à un groupe de péripériques, il est impossible de l'exporter et de la partager avec d'autres péripériques ayant rejoint le groupe.

Les informations concernant le groupe de périhériques sont alors utilisées dans l'objet VoucherAccessInfo du DRMContentData afin de partager les informations requises pour récapuerer et consommer un voucher.

Lecture de contenu chiffré à l'aide de la prise en charge de Domaine

Pour lire du contenu chiffre avec Adobe Access, procédez comme suit :

1 A l'aide de VoucherAccessInfo_deviceGroup, vérifie si l'enregistrement du groupe de péripériques est requis.
2 Si l'authentication est requise :

a Utilisez la propriété DeviceGroupInfo.authenticationMethod pour savoir si l'authentication est requise.
b Si l'authentication est requise, authenticatez l'utilisateur en appliquant l'UNE des procedures suivantes :

  • Obtenez le nom d'utilisateur et le mot de passer de l'utilisateur. Appelez
    DRMManager.authENTICate(deviceGroup.serverURL, deviceGroup.domain, nom d'utilisateur, mot de passer).
  • Obtenez un jeton d'authentication mis en cache/pré-généret etappelez

DRMManager.setAuthenticationToken().

c Appelez DRMManager.addToDeviceGroup().

3 Obtenez le voucher correspondant au contenu en appliquant l'une des procédures suivantes :

a Utilisez la méthode DRMManager.loadVoucher().
b Obtenez le voucher a partir d'un autre périphérique enregistré dans le même groupe de périphériques.

Fournissez le voucher au DRMManager via la méthode DRMManager.storeVoucher().

4 Lisez le contenu chiffré à l'aide de la méthode NetStream.play().

Pour exporter la licence correspondant au contentu, n'importe quel périhérique peut fournir les octets bruts de la licence à l'aide de la méthode DRMoucher. toByteArray() une fois la licence obtene auprès du serveur de licences Adobe Access. Le fournisseur de contenu limite généralement le nombre de périhériques dans un groupe de périhériques. Si vous atteignez cette limite, il est possible que vous deviez appeler la méthode

DRMManager.removeFromDeviceGroup() sur un pérophérique non utilisé avant d'enregistrer le pérophérique actuel.

Aperçu de la licence

L'application Flash peut envoyer une demande d'aperçu de licence, c'est-à-dire qu'elle peut lancer une opération d'aperçu avant de prier l'utilisateur d'acheter le contenu en vue de déterminer si la machine de ce dernier répond aux critères de lecture requis. L'aperçu de licence signifie que le client est en mesure d'afficher un aperçu de la licence (pour connaître les droits octroyés par la licence), mais qu'il ne peut pas afficher un aperçu du contenu (c.-à-d. afficher une petite partie du contenu avant de décidier de l'acheter). Certains des paramètres unique à chaque machine sont les suivants : sorties disponibles et statuts de protection associés, version du moteur d'exécution/client DRM disponible, niveau de sécurité du client DRM, etc. Le mode d'aperçu de licence permet au moteur d'exécution/client DRM de tester la logique métier du serveur de licences et de fournir des informations à l'utilisateur afin que ce dernier puisse prendre une décision. Le client peut donc connaître l'aspect d'une licence valide, sans pour autant receivevoir la clé permettant de déchiffrer le contenu. La prise en charge du mode d'aperçu de licence est facultative et uniquement nécessaire si vous implémentez une application personnalisée qui a recours à cette fonctionnalité.

Diffusion de contenu

Adobe Access ne s'attaché pas au mécanisme de diffusion de contenu, car Flash Player abstraït la couche de mise en réseau et se contente de diffuser le contenu protégé au sous-système de Adobe Access. Il est donc possible de diffuser le contenu via HTTP, diffusion en continu dynamique HTTP, RTMP ou RTMPE.

Il est toute fois possible que des problèmes se produit en raison de la nécessité d'obtenir les métadonnées du contenu protégé (en général sous forme de fichier .metadata) avant qu'Adobe Access ne puisse accuperir une licence pour déchiffrir le contenu. Plus spécifique, avec le protocole RTMP/RTMPE, seules les données FLV et F4V peuvent être diffusées au client via Flash Media Server (FMS). Le client doit par conséquent utiliser d'autres moyens de récapérer l'objet BLOB de métadonnées. Pour résoudre ce problème, il est possible d'héberger les métadonnées sur un serveur Web HTTP et d'implémenter le lecteur video client en vue de récapérer les métadonnées correspondantes, en fonction du contenu en cours de lecture.

private function getMetadata():void{
extrapolated-path-to-metaData = "http://metadatas.mywebserver.com/" ^+ videoame;
varurlRequest:URLRequest newURLRequest(extrapolated-path-to-the-metaData ^+ ".metadata");
varurlStream:URLStream newURLStream();
urlStream.addEventListener(Event.COMPLET, handleMetadata);
urlStream.addEventListener(IOErrorEvent.NETWORK_ERROR, handleIOError);
urlStream.addEventListener(IOErrorEvent.IO_ERROR, handleIOError);
urlStream.addEventListener(IOErrorEvent.VERIFY_ERROR, handleIOError);
try{ urlStream.load(urlRequest); }catch(se:SecurityError){ videoLog.text + = se.toString() ^+ "\n"; }catch(e:Error){ videoLog.text + = e.toString() ^+ "\n"; }

Open Source Media Framework (OSMF) is a structure for application based on ActionScript which laisse une entière liberté et un contrôle absolu à l'utiliser lors de la création d'expériences multiméias enrichies. Pour plus d'informations sur OSMF, consulter la page consacrée aux développpeurs d'OSMF.

Procedure de lecture de contenu protégé

1 Creez une occurrence de MediaPlayer.

2 Enregistrez l'évenement MediaPlayerCapabilityChangeEvent.HAS_DRM_CHANGES dans le lecteur. Cet événement est distribué si le contenu est protégé par DRM.

player.addEventListener(MediaPlayerCapabilityChangeEvent.HAS drm_CHANGES, onDRMCapabilityChange); 

3 Dans le gestionnaire d'evénement, obtenez l'occurrence de DRMTrait. DRMTrait est l'interface par le biais de laquelle vous appelez les méthodes associées au client DRM, telles que authenticate(). Lors du chargement d'un contenu protégé par DRM, OSMF procède à la gestion de droits multimédias en validant les actions, puis distribue des événements d'état. Ajoutez un gestionnaire d'evénement DRMEvent.DRM_STATE_CHANGES à l'interface DRMTrait.

private function onDRMCapabilityChange (event :MediaPlayerCapabilityChangeEvent) :void { if (event.type ==MediaPlayerCapabilityChangeEvent.HAS drm_CHANGES && event.enabled) { drmTrait = player.media.getTrait(MediaTraitType.DRM) as DRMTrait; drmTrait.addEventListener (DRMEvent.DRM_STATE_CHANGE, onDRMStateChange); } } 

4 Gérez les événements DRM dans la méthode onDRMStateChange().

private function onDRMStateChange(event :DRMEvent) :void   
{ trace ("DRMState: ", event.drmState); switch(event.drmState)   
{ case DRMState.AUTHENTICATION_NEEDED: // Identity-based content var authPopup :AuthWindow = AuthWindow.create(_parentWin); authPopup.serverURL = event.serverURL; authPopup.addEventListener("dismiss", function (   ) :void { trace ("Authentication dismissed"); if (_drmTrait != null) { //Ignore authentication. Just //try to acquire a license. _drmTrait.authENTICate(null, null); } }); authPopup.addEventListener("authENTICate", function (event :AuthWindowEvent) :void { 
if(_drmTrait != null) { _drmTrait.authENTICate(event username, event.password); } }; authPopup.show(); break;   
case DRMState.AUTFENTICATING: //Display any authentication message. trace("Authenticating..."); break;   
case DRMState.AUTFENTICATION_COMPLETE: // Start to retrieve voucher and playback. // You can display the voucher information at this point. if(event_token) // You just received the authentication token. { trace("Authentication success Token:\n", event_token); } else // You have got the voucher. { trace("DRM License:"); trace("Playback window period: ", !isNaN(event.period) ? event.period == 0 ? "<unlimited>" : event.period : "<none>"); trace("Playback window end date: ", event_endDate != null ? event_endDate : "<none>"); trace("Playback window start date: ", event_startDate != null ? event.startDate : "<none>"); } break;   
case DRMState.AUTFENTICATION_ERROR: trace("DRM Error:", event.mediaError(errorID + [" + DRMErrorEventRef.getDRMErrorMnemonic (event.mediaError.errorID) + ])"; //Stop everything. player.media = null; break;   
case DRMState.DRM_SYSTEM_UPDATEING: Logger.log("Downloading DRM module..."); break;   
case DRMState.UNINITIALIZED: break;   
} 

Chapitre 28 : Ajout d'un contenu PDF dans AIR

Adobe AIR 1.0 et les versions ultérieures

Les applications qui s'excutent sous Adobe® AIR® peuvent non seulement creer un contenu SWF ou HTML, mais également un contenu PDF. Les applications AIR créé un contenu PDF à l'aide de la classe HTMLLoader, du moteur WebKit et du module d'extension du navigateur Adobe® Reader®. Dans une application AIR, le contenu PDF peut s'endetre sur toute la hauteur et toute la largeur de votre application ou bien sur une partie de l'interface. Les contrôleles du module d'extension du navigateur Adobe Reader affichent les fichiers PDF dans une application AIR. Les modifications apportées à l'interface de la barre d'outils de Reader (les contrôleles de position, d'ancrage et de visibilité, par exemple) sont réactivées lors de l'affichage ultérieur de fichiers PDF dans les applications AIR et le navigateur.

Important : pour afficher un contenu PDF dans AIR, l'utilisateur doit avoir installé Adobe Reader ou Adobe® Acrobat® version 8.1 (ou une version ultérieure).

Détction des capacités PDF

Adobe AIR 1.0 et les versions ultérieures

Si l'utiliser ne dispose pas d'Adobe Reader ou d'Adobe Acrobat 8.1 ou ultérieur, le contenu PDF ne s'affiche pas dans une application AIR. Pour vous rendre compte si un utiliser est en mesure de produit un contenu PDF, il faut d'abord vérifier la propriété HTMLLoader.pdfCapability. Elle est définitie sur l'une des constantes suivantes de la classe HTMLPDFCapability :

ConstanteDescription
HTMLPDFCapability.STATUS_OKUne version appropriée (8.1 ou plus récente) d'Adobe Reader a été décelée et le contenu PDF peut être chargé dans un objet HTMLLoader.
HTMLPDFCapability失误_ERROR_INSTALLED_READER_NOT_foundAucune version d'Adobe Reader n'a été décelée. Un objet HTMLLoader n'est pas en mesure d'afficher le contenu PDF.
HTMLPDFCapability失误_ERROR_INSTALLED_READER_TOO_OLDAdobe Reader a bien été décelé, mais la version est périmée. Un objet HTMLLoader n'est pas en mesure d'afficher le contenu PDF.
HTMLPDFCapability失误_ERROR_INSTALLED_READER_TOO_OLDUne version appropriée (8.1 ou plus récente) d'Adobe Reader a été déetectée mais cette qui est configurée pourTRAitter le contenu PDF est plus ancienne que Reader 8.1. Un objet HTMLLoader n'est pas en mesure d'afficher le contenu PDF.

Sous Windows, si Adobe Acrobat ou Adobe Reader version 7.x (ou une version ultérieure) s'exécute sur le système de l'utilisateur, c'est cette version-là qui est utilisé, même si une version plus récente qui prend en charge les contenus PDF est installée. Dans ce cas, si la valeur de la propriété pdfCapability est HTMLPDFCapability. STATUS_OK, lorsqu'une application AIR tente de charger un contenu PDF, la version la plus ancienne d'Acrobat ou de Reader affiche un message d'avertissement et aucune exception n'est renvoyée dans l'application AIR. Si cette situation est susceptible de se produit chez vos utilisateurs finalaux, pensez à leur fournir des instructions pour qu'ils quittent Acrobat tandis qu'ils exécutent leur application. Vous pourriez afficher ces instructions si le contenu PDF ne se charge pas dans un délié raisonnable.

Sous Linux, AIR recherche Adobe Reader dans le chemin exporté par l'utilisateur (s'il contient la commande acreread) et dans le repertoire /opt/Adobe/Reader.

Le code suivant détecte si un utilisateur est en mesure d'afficher les contenus PDF dans une application AIR. Si tel n'est pas le cas, le code recherche le code d'erreur correspondant à l'objet d'erreur HTMLPDFCapability :

if(HTMLLoader.pdfCapability == HTMLPDFCapability.Status_OK)   
{ trace("PDF content can be displayed");   
}   
else   
{ trace("PDF cannot be displayed. Error code:", HTMLLoader.pdfCapability);   
} 

Chargement du contenu PDF

Adobe AIR 1.0 et les versions ultérieures

Vou puez ajouter un PDF à une application AIR en créé une occurrence de HTMLLoader, en paramétrant ses dimensions et en chargeant le chemin d'un PDF.

L'exemple suivant charge un PDF à partir d'un site externe. Remplacez l'URLRequest par le chemin qui mène à un PDF externe disponible.

var request:URLRequest = new URLRequest("http://www.example.com/test.pdf");  
pdf = new不负Loader();  
pdf.height = 800;  
pdf.width = 600;  
pdf.load(request);  
container.addChild(pdf); 

Voupez ealement charger du contenu depuis des modles d'URL file et des modles d'URL specifiques a AIR, comme app et app-storage. Par exemple, le code suivant charge le fichier test.pdf dans le sous-repertoire du PDF contenu dans le repertoire de l'application :

app:/js_api_reference.pdf

Pour plus d'informations sur les modèles d'URL d'AIR, voir « Modèles d'URI » à la page 845.

Programmation du contenu PDF

Adobe AIR 1.0 et les versions ultérieures

Vouss pouvez utiliser JavaScript pour contrcler le contenu PDF de la meme facon que vous le feriez dans une page Web du navigateur.

Les extensions JavaScript incorporees dans Acrobat fournissent les fonctions suivantes, entre autres :

  • Contrôle de la navigation et de l'agrandissement de la page
  • Traitément des formulaires au sein du document
  • Contrôle des événements multimédia

Des détails complets sur les extensions de JavaScript pour Adobe Acrobat se trouvent sur le site Adobe Acrobat Developer Connection à l'adresse http://www.adobe.com/devnet/acrobat/javascript.html.

Principes de communication HTML-PDF

Adobe AIR 1.0 et les versions ultérieures

JavaScript dans une page HTML peut envoyer un message à JavaScript dans un contenu PDF par un appel à la méthode postMessage() de l'objet DOM représentant le contenu PDF. Par exemple, examinez le contenu PDF intégré ci-dessous :

Le code JavaScript suivant dans le contentu HTML envoie un message au JavaScript du fichier PDF :

pdfObject = document.getElementById("PDFObj");  
pdfObject.postMessage(['testMsg', "hello"]); 

Le fichier PDF peut containir JavaScript pour receivevoir ce message. Vous pouvez ajouter du code JavaScript aux fischiers PDF dans certains contexts au niveau du document, du dossier, de la page, du champ ou du lot. Nous n'aborderons ici que le contexte au niveau du document, celui qui définit les scripts qui sont évalués lorsque le document PDF s'ouvre.

Un fisier PDF peut ajouter une propriete messageHandler à l'objet hostContainer. La propriete messageHandler est un objet qui définit les fonctions du gestionnaire pour répondre aux messages. Par exemple, le code ci-dessous définit la fonction appelée à répondre aux messages provenant du fisier PDF du conteneur hôte. Celui-ci constitue le contenu HTML qui a intégré le fisier PDF :

this.hostContainer.messageHandler = {onMessage: myOnMessage}; 
function myOnMessage(aMessage)  
{  
    if (aMessage[0] == "testMsg")  
    {  
        appalert("Test message: " + aMessage[1]);  
    }  
else  
{  
    appalert("Error");  
} 

Le code JavaScript de la page HTML peut appeler la méthode postMessage() de l'objet PDF contenu dans la page. L'objet de cette méthode envoie un message "Hello from HTML" au JavaScript, au niveau du document, dans le fichier PDF:

<html>
<head>
<title>PDF Test</title>
<script>
function init()
{
pdfObject = document.getElementById("PDFObj");
try {
pdfObject.postMessage([[alert", "Hello from HTML")]};
}
catch (e)
{
alert("Error: \n name = " + e.name + "\n message = " + e.message);
}
}
</script>
</head>
<body onload='init(){
    id="PDFObj"
    data="test.pdf"
    type="application/pdf"
    width="100%" height="100%" />
</body>
</html> 

Pour consulter un exemple plus complexe, ainsi que des informations sur l'utilisation d'Acrobat 8 pour ajouter du code JavaScript à un fisier PDF, voir Programmation croisée du contenu PDF dans Adobe AIR.

Programmation du contenu PDF depuis ActionScript

Adobe AIR 1.0 et les versions ultérieures

Le code ActionScript (dans un contenu SWF) ne peut pas communiquer directement avec JavaScript dans un contenu PDF. Toutefois, ActionScript peut communiquer avec le JavaScript de la page HTML chargee dans un objet HTMLLoader qui charge le contenu PDF. Ce code JavaScript peut communiquer avec le JavaScript dans le fichier PDF chargeé. Pour plus d'informations, voir « Programmation HTML et JavaScript dans AIR » à la page 1019.

Limits connues pour du contenu PDF dans AIR

Adobe AIR 1.0 et les versions ultérièures

Le contenu PDF dans Adobe AIR a les limites suivantes :

  • Le contenu PDF ne peut pas s'afficher dans une fenêtre (un objet NativeWindow) qui est transparente et où la propriété transparent est définie sur true.

  • L'ordre d'affichage d'un filchier PDF s'effectue différemment que les autres objets à afficher dans une application AIR. Bien que le contenu PDF se découpe correctement en respectant l'ordre d'affichage HTML, il s'installera toujours par-dessus le contenu dans l'ordre d'affichage de l'application AIR.

  • Si certaines propriétés visuelles de l'objet HTMLLoader contenant un document PDF sont modifiées, le document PDF devient invisible. Ces propriétés comprennet filters, alpha, rotation et scaling. Si vous modifier ces propriétés, le contentu PDF devient invisible jusqu'à ce que vous les réinitialisez. Le contentu PDF est également invisible si vous modifiez ces propriétés dans les conteneurs d'objets d'affichage qui contiennent l'objet HTMLLoader.
  • Le contenu du PDF n'est visible que lorsque la propriété scaleMode de l'objet Stage de l'objet NativeWindow renferment le contenu PDF est définie sur StageScaleMode.NO Scale. Lorsqu'elle est définie sur une autre valeur, le contenu PDF n'est pas visible.
  • Un cli sur des liens pointant vers le contenu au sein du fichier PDF met à jour la position de défilament du contenu PDF. Un cli sur des liens pointant vers le contenu hors d'un fichier PDF réorienté l'objet HTMLLoader qui contient le PDF, même si la cible d'un lien est une nouvelle fenêtre.
  • Les flux de commentaires PDF ne fonctionnent pas dans AIR.

Chapitre 29 : Principes de base de l'interaction utiliser

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Viete application prend en charge l'interactivite en utilisant ActionScript 3.0 pour reagir a une action utiliseur. Cette section suppose que vous maitrisez le modele d'evénement d'ActionScript 3.0. Pour plus d'informations, voir « Gestion des événements » à la page 129.

Capture des entrées utiliser

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

L'interaction utilisateur, au moyen du clavier, de la souris, de laamera ou d'une combinaison de ces périphériques, est à la base de l'intécrivité. Dans ActionScript 3.0, l'identification et la réponse à l'interaction utilisateur impliquent principalement l'écoute d'évenements.

La classe InteractiveObject, une sous-classe de la classe DisplayObject, fournit la structure d'événements courante et la fonctionnalité nécessaire à la gestion de l'interaction utiliser. Vous ne créez pas directement une occurrence de la classe InteractiveObject. Affichez plutôt des objets tels SimpleButton, Sprite,TextField et ainsi des composants divers de l'outil de programmation Flash et de Flex hériment leur modèle d'interaction utiliser à partir de cette classe. Ils partagent alors une structure commune. Cela signifie que les techniques que vous apprenez et le code que vous écrivez pour:gérer l'interaction utiliser dans un objet dérivé de InteractiveObject sont applicables à tous les autres.

Concepts important et terminologie

Il est important que vous vous familiarisiez avec les termes d'interaction utiliser suivants avant de poursuivre :

Code de caractère Code numérique représentant un caractère dans le jeu de caractères actuel (assocé à une touche tapée sur le clavier). Par exemple, D et d ont des codes de caractères différents même si elles sont créées par la même touche sur un clavier français.

Menu contextual Menu qui apparait lorsqu'un utilisateur clique avec le bouton droit de la souris ou utilise une combinaison clavier-souris particulière. Les commandes de menu contextuel s'appliquent généralement directement à l'élement sur lequel vous avez cliqué. Par exemple, un menu contextuel pour une image peut containir une commande pour afficher l'image dans une fenêtre séparée et une commande pour la télécharger.

Cible d'action Indication qu'un élément sélectionné est actif et qu'il est la cible d'une interaction clavier ou souris.

Code de touche Code numérique correspondant à une touche physique du clavier.

Voir aussi

InteractiveObject

Keyboard

Mouse

ContextMenu

Gestion de la cible d'action

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Un objet interactif peut receiveoir le focus, soit par programmation, soit par le biais d'une action utiliseur. En outre, si la propriete tabEnabled a la valeur true, l'utiliser peut transmettre le focus d'un objet à un autre en appuyant sur la touche Tabulation. La valeur tabEnabled est false par defaut, excepte dans les cas suivants :

  • Pour un objet SimpleButton, la valeur est true.
    Pour un champ de texte d'entrée, la valeur est true.
  • Pour un objet Sprite ou MovieClip dont buttonMode a la valeur true, la valeur est true.

Dans chacune de ces situations, vous pouvez ajouter un écouteur pour FocusEvent. FOCUS_IN ou

FocusEvent. FOCUS_OUT pour éntendre les comportements possibles lors du changement de focus. Si cette technique est praticque pour les champs texte et les formulaires, vous pouvez aussi l'utiliser avec les sprites, les clips et tout autre objet qui hérite de la classe InteractiveObject. L'exemple suivant montre comment activer le changement de focus avec la touche de tabulation et comment répondre à l'évenement focus qui en découle. Dans ce cas, chaque carré change de couleur lorsqu'il recoit le focus.

Remarque : Flash Professional utilise des raccourcis clavier pour gérer le focus. Par conséquent, pour simuler correctement la gestion du focus, les fichiers SWF doivent être testés dans un navigateur ou dans AIR plutilot que dans Flash.

var rows:uint = 10;
var cols:uint = 10;
var rowSpacing:uint = 25;
var colSpacing:uint = 25;
var i:uint;
var j:uint;
for (i = 0;i < rows;i + + ) { for (j = 0;j < cols;j + + ) { createSquare(j * colSpacing,i * rowSpacing,(i * cols) ^+ j); }
function createSquare(startX:Number,startY:Number,tabNumber:uint):void { var square:Sprite = new Sprite(); square.graphics.beginFill(0x000000); square.graphics.drawRect(0,0,colSpacing,rowSpacing); square.graphics.endFill(); square.x = startX;

square.y = startY; square.tabEnabled = true; square.tabIndex tabNumber; square.addEventListener(FocusEvent.FOCUS_IN,/changeColor); addChild(square);
} function/changeColor(event:FocusEvent):void { event.target.transform.colorTransform = getRandomColor();
} function getRandomColor():ColorTransform { //Generate random values for the red, green, and blue color channels. var red:Number = (Math.random() *512)-255; var green:Number = (Math.random() *512)-255; var blue:Number = (Math.random() *512)-255; //Create and return a ColorTransform object with the random colors. return new ColorTransform(1,1,1,1,red,green,blue,0);

Découverte des types de saisie

Flash Player 10.1 et les versions ultérieures, Adobe AIR 2 et les versions ultérieures

Les versions de Flash Player 10.1 et d'Adobe AIR 2 ont introduit la capacité de tester l'environnement d'exécution pour vérifier s'il prend en charge des types de saisie disponibles. ActionScript permet de tester si le périphérique sur lequel le moteur d'exécution est actuellément déployé:

  • prend en charge la saisie par stylet ou à l'aide du doigt (ou bien aucune saisie tactile) ;
  • propose à l'utilisateur un clavier virtuel ou physique (ou bienaucunclavier) ;
  • affiche un curseur (si tel n'est pas le cas, les fonctions qui s'appuient sur le survol d'un objet par le curseur ne fonctionnent pas).

Les API de découverte de la saisie d'ActionScript sont les suivantes :

  • Propriété flash.system.Capabilities(touchscreenType : valeur fournie à l'exécution, qui indique le type de saisie pris en charge dans l'environnement actuel.
  • Classe flash.system.TouchscreenType : classe de constantes de valeur d'énumération pour la propriété Capabilities(touchscreenType.
  • Propriété flash.ui.Mouse.supportsCursor : valeur entrée à l'exécution qui indique si un curseur permanent est disponible ou non.
  • Propriété flash.ui.KeyBoard physicalKeyboardType : valeur entrée à l'exécution qui indique si un clavier physique compte ou un pavé numérique uniquement est disponible, ou bien aucurn clavier.
  • Classe flash.ui.KeyBoardType : classe de constantes de valeurs d'énumération associée à la propriété flash.ui.KeyBoardphysicalKeyboardType.
  • Propriété flash.ui.KeyBoard.hasVirtualKeyboard : valeur entree à l'execution qui indique si l'utilisateur dispose d'un clavier virtuel (au lieu d'un clavier physique ou en plus de ce dernier).

Les API de découverte de saisie permettent d'exploiter les capacités du périhérique de l'utilisateur ou proposent une autre solution lorsque ces capacités n'existant pas. Ces API s'avèrent particulièrement utiles pour développer des applications tactiles et mobiles. Ainsi, si l'interface d'un périhérique mobile possède des boutons de petite taille adaptés à un stylet, vous pouvez proposer une autre interface dotée de boutons de taille supérieure que l'utilisateur peut toucher du doigt. Le code suivant se rapporte à une application dont la fonction createStylusUI() affecte un jeu d'éléments d'interface utilisateur adaptés à l'interaction avec un stylet. Une autre fonction, appelée createTouchUI(), affecte un autre jeu d'éléments d'interface utilisateur adaptés à l'interaction tactile :

Lorsque vous développpez des applications destinées à des environnements de saisie différents, tenez compte du tableau de compatibilité suivant :

EnvironnementsupportsCursortouchscreenType == FINGERtouchscreenType == STYLUStouchscreenType == NONE
Bureau traditionneltruefalsefalsetrue
Péripériques équipés d'un écran tactile à technologie capacitive (tabletes, organiseurs personnels et téléphones qui déetectent une action tactile humaine subtile, tel l'iPhone d'Apple ou le Palm Pre)falsetruefalsefalse
Péripériques équipés d'un écran tactile à technologie résistive (tabletes, organiseurs personnels et téléphones qui déetectent un contact précis à pression elevée, tel le HTC Fuze)falsefalsetruefalse
Péripériques sans écran tactile (telephones et péripériques qui exécutent des applications, mais dont l'écran ne déetecte pas le contact)falsefalsefalsetrue

Remarque: diverses plates-formes gèrent un grand nombre de combinaisons de types de saisie. Référez-vous à ce tableau à titre de référence.

Chapitre 30 : Saisie au clavier

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Viete application peut capturer la saisie au clavier et réagir à celle-ci et peut manipuler un IME pour permettre aux utilisateurs de taper des caractères non ASCII dans les langues codées sur plusieurs octets. Cette section suppose que vous maitrisesz le modèle d'évenement d'ActionScript 3.0. Pour plus d'informations, voir « Gestion des événements » à la page 129.

Pour plus d'informations sur l'identification du clavier pris en charge (physique, virtuel, alphanumericique, numérique à 12 touches, etc.) à l'exécution, voir « Découverte des types de saisie » à la page 576.

Grac à un IME (Input Method Editor), l'utilisateur est en mesure de taper des caractères et des symboles complexes sur un clavier standard. L'utilisation des classes IME permet à l'utilisateur de bénéficier de l'IME système dans une application.

Voir aussi

Capture de la saisie au clavier

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Les objets d'affichage qui hériment de leur modele d'interaction de la classe InteractiveObject peuvent répondre à des événements de clavier à l'aide d'écouteurs d'évenement. Par exemple, vous pouvez placer un écouteur d'évenement sur la scène pour écouter et répondre à une saisie au clvier. Dans le code suivant, un écouteur d'évenement capture une saisie au clvier et le nom et les propriétés de code de la touche sont affichés :

Certaines touches (Ctrl, par exemple) générent des événements, même si elles n'ont pas de représentation de glyphs.

Dans l'exemple de code précédent, l'écouteur d'évenement de clavier a capturé une saisie au clavier pour la scène entière. Vous pouvez également écrire un écouteur d'évenement pour un objet d'affichage spécifique sur la scene ; cet écouteur d'évenement est déclenché lorsque lobjet a le focus.

Dans l'exemple suivant, les frappes de touches apparaissent dans le panneau Sortie uniquement lorsque l'utilateur tape dans l'occurrence deTextField. S'il maintain la touche Maj enforcée, la couleur du contour duTextField devient temporairement rouge.

Ce code suppose qu'il existe une occurrence deTextField appelée t f sur la scene.

tf_border true;
tf.type = "input";
tf.addEventListener(KeyboardEvent.KeyDOWN,reportKeyDown);
tf.addEventListener(KeyboardEvent.key_UP,reportKeyUp);
function reportKeyDown(event:KeyboardEvent):void { trace("KeyPressed:" + String.fromCharCode(event.charCode) + " (key code:" + event.keyCode + " character code:" + event.charCode + ")"); if (event.keyCode = Keyboard.SHIFT) tfBorderColor = 0xF0000 .
}
function reportKeyUp(event:KeyboardEvent):void { trace("Key Released:" + String.fromCharCode(event.charCode) + " (key code:" + event.keyCode + " character code:" + event.charCode + ")"); if (event.keyCode = Keyboard.SHIFT) { tfBorderColor = 0x000000 .

La classe TextField signale également un événement textInput que vous pouvez écouter lorsqu'un utiliser saisit du texte. Pour plus d'informations, voir « Capture du texte saisi par l'utilisteur » à la page 391.

Remarque : dans le moteur d'exécution d'AIR, il est possible d'annuler un événement de clavier. En revanche, dans le moteur d'exécution de Flash Player, un événement de clavier ne peut pas être annulé.

Codes de touches et de caractères

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Les propriétés keyCode et charCode d'un événement clavier permettent de déterminer la touche utilisée et de déclencher d'autres actions. La propriétékeyCode est une valeur numérique qui correspond à la valeur de la touche sur le clavier. La propriété charCode est la valeur numérique de cette touche dans le jeu de caractères actuel (le jeu de caractères par défaut est UTF-8, qui prend en charge ASCII).

La différence principale entre le code de touche et les valeurs de caractères est la suivante : la valeur du code de touche représentée une touche déterminée du clavier (la touche 1 sur le pavé numérique est différente du 1 sur le clavier central, mais cette dernière permet à la fois de générer 1 et &) alors que la valeur du caractère représentée un caractère particulier (les caractères R et r sont différents).

Remarque : pour plus d'informations sur le mappage entre les touches et le code de caractère ASCII correspondant, voir la classe flash.ui.KeyBoard dans le manuel Guide de referrer ActionScript 3.0 pour la plate-forme Adobe Flash.

Les mappings entre les touches et leurs codes de touches dépendent du périphérique et du système d'exploitation. C'est pourquoi vous ne devez pas utiliser de mappings de touches pour déclencher des actions. A la place, utilisez les valeurs de constante prédéfinitionies fournies par la classe Keyboard pour referrercer les propriétés keyCode appropriées. Par exemple, au lieu d'utiliser le mappings de touche pour la touche Maj, utilisez la constante Keyboard.SHIFT ( comme indiqué dans l'exemple de code précédent).

Priorité des événements KeyboardEvent

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Comme avec d'autres événements, la série dévenement de clavier est déterminée par la hierarchie d'objet d'affichage et non par l'ordre dans lequel les méthodes addEventListener() sont affectées dans le code.

Supposons par exemple que vous placiez un champ de texte tf au sein d'un clip nommé container et que vous ajoutiez un écouteur d'évenement pour l'évenement de clavier à chaque occurrence, comme indiqué dans l'exemple suivant :

container.addEventListener(KeyboardEvent.DOWN, reportKeyDown);  
container=tf.button = true;  
container(tf.type = "input");  
container(tf.addEventListener(KeyboardEvent.DOWN, reportKeyDown); 

Etant donné qu'il existe un écouteur sur le champ de texte et sur son conteneur parent, la fonction reportKeyDown() est appelée deux fois pour chaque frappe de touche dans leTextField. Notez que pour chaque touche actionnée, le champ de texte envoie un événement avant que le clip container ne distribue un événement.

Le système d'exploitation et le navigateur Web Traitseront les événements de clavier avant Adobe Flash Player ou AIR. Par exemple, dans Microsoft Internet Explorer, lorsque vous appuyez sur Ctrl+W, vous fermez la fenêtre du navigateur avant qu'un fjichier SWF contenu ne distribue un événement de clavier.

Utilisation de la classe IME

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La classe IME permet de manipuler l'IME du système d'exploitation à partir de Flash Player ou Adobe AIR.

A l'aide d'ActionScript, vous pouvez déterminer les éléments suivants :

  • Si un IME est installé sur l'ordinateur de l'utilisateur (Capabilities.hasIME)
  • Si l'IME est activé ou déactivé sur l'ordinaireur d'utilisateur (IME.enabled)
  • Le mode de conversion utilisé par l'IME actif (IMEconversionMode)

Vouss pouvez associier un champ de saisie de texte à un contexte IME particulier. Lorsque vous passez d'un champ de saisie à un autre, vous pouze également changer l'IME pour utiliser les caractères Hiragana (japonais), des nombres à pleine chasse, des nombres à demi-chasse, la saisie directe, etc.

Un IME permet aux utilisateurs d'entrée des caractères de texte non ASCII des langues codées sur plusieurs octets, telles que le chinois, le japonais et le coréen.

Pour plus d'informations sur les IME, voyagez la documentation du système d'exploitation correspondant à la plate-forme pour laquelle vous développpez l'application. Pour davantage de ressources, voir également les sites Web suivants :

http://www.msdn.microsoft.com/goglobal/

Remarque: si aucun IME n'est actif sur l'ordinateur de l'utilisateur, tout appel aux méthodes ou propriétés IME, autres que Capabilities.hasIME, échoue. Lorsque vous activez manuellement un IME, les appeals ActionScript suivants aux méthodes et aux propriétés IME fonctionnent comme prévu. Par exemple, si vous utilisez un IME japonais, vous doivent l'activer avant d'appeler une méthode ou une propriété IME.

Confirmation de l'installation et de l'activation d'un IME

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Avant d'appeler des méthodes ou propriétés IME, vous devez toujours vérifier si un IME est installé et activé sur l'ordinateur de l'utilisateur. Le code suivant montre comment vérifier que l'utilisateur dispose d'un IME installé et activé avant d'appeler une méthode :

Le code précédent commence par vérifier si un IME est installé à l'aide la propriété Capabilities.hasIME. Si la valeur de la propriété est true, le code vérifie ensuite si l'IME est activé à l'aide de la propriété IME.enabled.

Identification du mode de conversion IME activé

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Lorsque vous construuez une application multilingue, il peut être nécessaire de déterminer le mode de conversion actif dans le système d'exploitation. Le code suivant montre comment vérifier si l'utilisateur dispose d'un IME installé et, le cas échéant, quel mode de conversion IME est activé :

if (Capabilities.hasIME)
{ switch (IMEconversionMode) { case IMECOversionMode.ALPHANUMERIC_FULL: tf.text = "Current conversion mode is alphanumeric (full-width)."; break; case IMECoversionMode.ALPHANUMERIC_HALF: tf.text = "Current conversion mode is alphanumeric (half-width)."; break; case IMECoversionMode.CHINESE: tf.text = "Current conversion mode is Chinese."; break; case IMECoversionMode.JAPANESE_HIRAGANA: tf.text = "Current conversion mode is Japanese Hiragana."; break; case IMECoversionMode.JAPANESE_KATAKANA_FULL: tf.text = "Current conversion mode is Japanese Katakana (full-width)."; break; case IMECoversionMode.JAPANESE_KATAKANA_HALF: tf.text = "Current conversion mode is Japanese Katakana (half-width)."; break; case IMECoversionMode.KOREAN: tf.text = "Current conversion mode is Korean."; break; default: tf.text = "Current conversion mode is " + IMEconversionMode + "."; break; }
} else { tf.text = "Please install an IME and try again.";

Le code ci-dessus commence par vérifier si l'utilisateur dispose d'un IME. Ensuite, il vérifie le mode de conversion actuellément utilisé par l'IME en comparant la propriété IME. Enabled à chacune des constantes de la classe IMECoversionMode.

Définition du mode de conversion IME

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Lorsque vous modifie le mode de conversion de l'IME de l'utilisateur, veillez à ce que le code soit enveloppé dans un bloc try...catch, car la définition du mode de conversion à l'aide de la propriété conversionMode peut donner lieu à une erreur si l'IME ne peut pas définir le mode choisi. Le code suivant illustrer l'utilisation d'un bloc try...catch lors de la définition de la propriété conversionMode:

var statusText:TextField = newTextField;  
statusText.autoSize =TextFieldAutoSize.LEFT;  
addChild(statusText);  
if (Capabilities.hasIME)  
{  
    try {  
        IME.enabled = true;  
        IMEconversionMode = IMEColutionMode.KOREAN;  
        statusText.text = "Conversion mode is " + IMEconversionMode + ".";  
    }  
    catch (error:Error)  
{  
        statusText.text = "Unable to set conversion mode.\n" + error.message;  
    }  
} 

Ce code commence par creator un champ de texte qui sert à afficher un message d'état à l'intention de l'utilisateur. Ensuite, si l'IME est installé, le code l'active et définit le mode de conversion coréen. Si l'ordinateur de l'utilisateur ne dispose pas d'un IME coréen, une erreur est renvoyée par Flash Player ou AIR et interceptée par le bloc try...catch. Le bloc try...catch affiche le message d'erreur dans le champ de texte créé précédemment.

Déactivation de l'IME pour certains champs de texte

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Dans certains cas, il peut être nécessaire de désactiver l'IME de l'utilisateur pendant que ce dernier saisit des caractères. Par exemple, si un champ de texte accepte uniquement des caractères numériques, il peut être préféable d'éviter l'intervention de l'IME pour ne pas ralentir la saisie des données.

L'exemple suivant montre comment écouter les événements FocusEvent. FOCUS_IN et FocusEvent. FOCUS_OUT et désactiver l'IME de l'utilisateur en conséquence :

var phoneTxt:TextField = newTextField();
var nameTxt:TextField = newTextField();
phoneTxt.type =TextField.Type.IN;
phoneTxt.addEventListener(FocusEvent.FOCUS_IN, focusInHandler);
phoneTxt.addEventListener(FocusEvent.FOCUS_OUT, focusOutHandler);
phoneTxtrestrict = "0-9";
phoneTxt.width = 100 .
phoneTxt.height = 18 .
phoneTxt/background = true;
phoneTxt.button = true;
addChild(phones);
nameField.type = TextField.Type.INPUT;
nameField.x = 120 .
nameField.width = 100 .
nameField.height = 18 .
nameField/background = true;
nameField.button = true;
addChild(nameField);
function focusInHandler(event:FocusEvent):void { if (Capabilities.hasIME) { IME.enabled = false; } }
function focusOutHandler(event:FocusEvent):void { if (Capabilities.hasIME) { IME.enabled = true; } }

Cet exemple creé deux champs de saisie de texte, phoneTxt et nameTxt, puis ajoute deux écouteurs d'événement au champ phoneTxt. Lorsque l'utilisateur place le focus sur le champ phoneTxt, un événement FocusEvent. FOCUS_IN est distribué et l'IME est désactivé. Lorsque le focus est retire du champ phoneTxt, l'événement

FocusEvent.FOCUS_OUT est distribué pour reactiver l'IME.

Écoute des événements IME composition

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Les événements IME composition sont distribués lors de la définition d'une chaine de composition. Par exemple, si l'IME de l'utilisateur est activé et que l'utilisateur saisit une chaine en japonais, l'évenement

IMEEvent.IME_COMPOSITION est distribué des que l'utilisateur seLECTIONne la châne de composition. Pour écouter l'événement IMEEvent.IME_COMPOSITION, vous devez ajouter un écouteur d'évenement à la propriété statique ime de la classe System (flash.system.System.ime.addEventListener(.)), comme le montre l'exemple suivant :

var inputTxt:TextField;
var outputTxt:TextField;
inputTxt newTextField();
inputTxt.type = TextField>Type;
inputTxt.width = 200 .
inputTxt.height = 18 .
inputTxt_border = true;
inputTxt/background = true;
addChild(inputTxt);
outputTxt newTextField();
outputTxt.autoSize = TextFieldAutoSize.LEFT;
outputTxt.y = 20 .
addChild(outputTxt);
if (Capabilities.hasIME) { IME.enabled = true; try { IMEconversionMode IMEConversionMode.JAPANESE_HIRAGANA; } catch (error:Error) { outputTxt.text "Unable to change IME."; } System ime.addEventListener(IMEEvent.IME_COMPOSITION, imeCompositionHandler); } else { outputTxt.text "Please install IME and try again."; } function imeCompositionHandler(event:IMEEvent):void { outputTxt.text "you typed:" + event.text; }

Le code ci-dessus creé deux champs de texte et les ajoute à la liste d'affichage. Le premier champ, inputTxt, est un champ de saisie de texte qui permet à l'utilisateur d'entrez du texte japonais. Le second champ, output.txt, est un champ de texte dynamique qui affiche des messages d'erreur à l'utilisateur ou reprend la chaine japonaise que l'utilisateur saisit dans le champ input.txt.

Claviers virtues

Flash Player 10.2 et les versions ultérieures, AIR 2.6 et les versions ultérieures

Les périphériques mobiles, tels que téléphones et tablettes, disposent généralement d'un clavier virtuel et logiciel et non d'un clavier physique. Les classes de l'API Flash permettent d'effectuer les opérations suivantes :

  • détector le moment où le clavier virtuel apparait et le moment où il disparait ;
  • empêcher le clavier de s'afficher;

  • déterminer la zone de la scène cachée par le clavier virtuel;

  • creer des objets interactifs qui affichent le clavier lorsqu'ils prenne t le focus ; (non pris en charge par les applications AIR sous iOS)
  • (AIR uniquement) désactiver le comportement de panoramaque automatique afin que l'application puisse modifier son propre affichage en vue de receivevoir le clavier.

Contrôle du comportement du clavier virtuel

Le moteur d'exécution ouvre automatiquement le clavier virtuel lorsqu l'utilisateur appuie dans un champ de texte ou un objet interactif spécifique configuré. A l'ouverture du clavier, le moteur d'exécution respecte les conventions de la plate-forme native en matière de panoramicique et de redimensionnement du contenu de l'application, afin que l'utilisateur puisse visualiser le texte au fur et à mesure qu'il le tape.

A l'ouverture du clavier, l'objet cible d'action distribue les événements suivants dans l'ordre indiqué :

Evénement softKeyboardActivating: distribué juste avant que le clavier ne commence à se superposer à la scène. Si vous appelez la méthode préventDefault() de l'objet événement distribué, le clavier virtuel ne s'ouvre pas.

Evénement softKeyboardActivate: distribué au terme du traitement de l'évenement softKeyboardActivating. Lorsque l'objet cible d'action distribue cet événement, la propriété softKeyboardRect de l'objet Stage a été mise à jour pour refléter la partie de la scène masquée par le clavier virtuel. Il est impossible d'annuler cet événement.

Remarque : en cas de changement de taille du clavier (si l'utiliseur modifie le type du clavier, par exemple), l'objet cible d'action distribue un second événement softKeyboardActivate.

Evénement softKeyboardDeactivate : distribué lors de la fermeture du clavier virtuel,quel qu'en soit le motif. Il est impossible d'annuler cet événement.

L'exemple suivant ajoute deux objetsTextField sur la scène. L'objetTextField supérieur interdit l'affichage du clavier lorsque vous touchez le champ et le ferme s'il est déjà affchéé. L'objetTextField inférieur illustré le comportement par défaut. L'exemple indique les événements de clavier logiciel distribués par les deux champs de texte.

package   
{   
import flash.display.Sprite;   
import flash.text.TextField;   
import flash.text.TextTextFieldType;   
import flash.eventsSoftKeyboardEvent;   
public class SoftKeyboardEventExample extends Sprite   
{ private var tf1:TextField = newTextField(); private var tf2:TextField = newTextField(); public function SoftKeyboardEventExample() { tf1.width = this.age发展阶段; tf1.type =TextField.TYPE.; tf1border = true; this.addChild(tf1); tf1.addEventListener( SoftKeyboardEvent.SOFT_KEYBOARD_ACTIVATING,preventSoftKe. yboard); tf1.addEventListener( SoftKeyboardEvent.SOFT_KEYBOARD_ACTIVATE,preventSoftKe. yboard); tf1.addEventListener( SoftKeyboardEvent.SOFT_KEYBOARD_DEACTIVATE,preventSoftKeyboard ); 

tf2border = true; tf2.type = TextFieldType(INPUT; tf2.width = this_stage(stageWidth; tf2.y = tf1.y ^+ tf1.height +30 . this.addChild(tf2); tf2.addEventListener( SoftKeyboardEvent.SOFT_KEYBOARD_ACTIVATING,allowSoftKeyboard); tf2.addEventListener( SoftKeyboardEvent.SOFT_KEYBOARD_ACTIVATE,allowSoftKeyboard); tf2.addEventListener( SoftKeyboardEvent.SOFT_KEYBOARD_DEACTIVATE,allowSoftKeyboard);
} private function preventSoftKeyboard(event:SoftKeyboardEvent):void { eventpreventDefault(); this stageFocus null; //close the keyboard,if raised trace("tf1 dispatched:" ^+ event.type ^+ "--" ^+ event.triggerType); } private function allowSoftKeyboard(event:SoftKeyboardEvent) :void { trace("tf2 dispatched:" ^+ event.type ^+ "--" ^+ event.triggerType); 1

Ajout de la prise en charge du clavier virtuel par les objets interactifs

Flash Player 10.2 et les versions ultérieures, AIR 2.6 et les versions ultérieures (non pris en charge sous iOS)

En temps normal, le clavier virtuel ne s'ouvre que si l'utilisateur appuie sur un objetTextField. Vous pouvez configurer une occurrence de la classe InteractiveObject de façon à ouvrir le clavier virtuel lorsqu'il recoit le focus.

Pour configurer une occurrence d'InteractiveObject de façon à ouvrir le clavier logiciel, définièsez la propriété nécesssSoftKeyboard sur true. Dès que l'objet est affecté à la propriété focus de la scène, le clavier logiciel s'ouvre automatiquement. Par ailleurs, vous pouvez afficher le clavier en appelant la méthode requestSoftKeyboard() de l'objet InteractiveObject.

L'exemple suivant explique comment programmer un objet InteractiveObject de façon à ce qu'il se comporte comme un champ de saisie de texte. La classe TextInput déscribe dans l'exemple définit la propriété needsSoftKeyboard de façon à ce que le clavier s'affiche lorsque cela est nécessaire. L'objet écoute alors les événements keyDown et insère le caractère saisi dans le champ.

Cet exemple fait appel au moteur de texte de Flash pour ajouter et afficher le texte saisi, et gère quelques événements importants. Pour plus de simplicité, cet exemple n'implémente pas un champ de texte complet.

package { import flashgeomRectangle; import flash.display.Sprite; import flash.text.engine.TextElement; import flash.text.engine.TextBlock; import flash.events.MouseEvent; import flash.events.FocusEvent; import flash.events.KeyBoardEvent; import flash.text.engine.TextLine; import flash.text.engine.ElementFormat; import flash.events.Event; public class TextInput extends Sprite { public var text:String = ""; public var textSize:Number = 24 . public var textColor:uint = 0x000000 private var bounds:Rectangle new Rectangle(0,0,100,textSize); private var textElement:TextElement; private var textBlock:TextBlock new TextBlock(); public function TextInput( text:String = ") { this.text text; thisscrollRect _bounds; thisFocusRect false; //Enable keyboard support thisneedsSoftKeyboard true; this.addEventListener(MouseEvent.MOUSE_DOWN,onSelect); this.addEventListener(FocusEvent.FOCUS_IN,onFocusIn); this.addEventListener(FocusEvent.FOCUS_OUT,onFocusOut); //Setup text engine textElement new TextElement(text,new ElementFormat(null,textSize,textColor)); textBlock(content textElement; varfirstLine:TextLine textBlock.createTextLine(null,_bounds.width-8); firstLine.x = 4 firstLine.y = 4+ firstLine.totalHeight; this.addChild(firstLine); } private function onSelect(event:MouseEvent):void { stage:focus this; } private function onFocusIn(event:FocusEvent):void { this.addEventListener(KeyboardEvent.KeY_DOWN,onKey); } private function onFocusOut(event:FocusEvent):void { this.removeListener(KeyboardEvent.KeY_UP,onKey); }

private function onKey( event:KeyboardEvent ):void { textBoxElement.replaceText( textBoxElement.text.length, textBoxElement.text.length, String.fromCharCode( event.charCode ) ); updaterText(); }public function set bounds( newBounds:Rectangle ):void{ bounds = newBounds.clone(); drawBackground(); updaterText(); thisscrollRect = _bounds; //force update to focus rect, if needed if( this.stage! null && thisFocusRect && this.stage.Focus = = this) this.stage.Focus = this; } private function updText():void { //clear text lines while( this numChildren >0 ) this.removeChildAt( 0 ); //and recreate them var textLine:TextLine = textBlock.createTextLine( null,_bounds.width - 8); while ( textLine){ textBoxLine.x = 4 ; if( textBoxLinepreviousLine != null ) { textBoxLine.y = textBoxLine.previousLine.y + textBoxLine.previousLine.totalHeight + 2; } else { textBoxLine.y = 4+ textBoxLine.totalHeight; } this.addChild(textLine); textBoxLine = textBoxBlock.createTextLine(textLine,_bounds.width - 8); } } private function drawBackground():void { //draw background and border for the field this.graphics.clear(); this.graphics.beginFill( 0xededed ); this.graphics.lineStyle(1,0x000000); this.graphics.drawRect(_bounds.x + 2,_bounds.y + 2,_bounds.width - 4, bounds.height - 4); this.graphics.endFill(); } }

La classe d'application principale suivante explique comment utiliser la classe TextInput etGER la disposition de l'application lorsque le clavier s'affiche ou lorsque l'orientation du périhérique change. La classe principale create un objet TextInput et définit ses limites de façon à ce qu'il occupe la scène. Cette classe ajuste la taille de l'objet TextInput lorsque le clavier logiciel s'affiche ou lorsque la taille de la scène change. Cette classe écoute les événements du clavier logiciel via l'objet TextInput et redimensionne les événements à partir de la scène. Quelle que soit la cause de l'évenement, l'application déterminé la zone visible de la scène et redimensionne le contrôle de saisie pour le replir. Dans une application réelle, vous auriez besoin d'un algorithmme de mise en forme plus sophistiqué.

package { import flash.display MoviesClip; import flash.events.SoftKeyboardEvent; import flashgeomRectangle; import flash.events.Event; import flash.display.StageScaleMode; import flash.display.StageAlign; public class CustomTextField extends MovieClip { private var customField: TextInput = new TextInput("Input text:"); public function CustomTextField() { this.state scaleMode = StageScaleMode.NO Scale; this.state align = StageAlign.TOP_LEFT; this.addChild( customField ); customField.bounds = new Rectangle( 0, 0, this stage.stageWidth, this.stage.stageHeight ); //track soft keyboard and stage resize events customField.addEventListener(SoftKeyboardEvent.SOFT_KEYBOARD_ACTIVATE, onDisplayAreaChange); customField.addEventListener(SoftKeyboardEvent.SOFT_KEYBOARD_DEACTIVATE, onDisplayAreaChange); this.stage.addEventListener ( Event.RESIZE, onDisplayAreaChange ) ; } private function onDisplayAreaChange( event:Event ):void { //Fill the stage if possible, but avoid the area covered by a keyboard var desiredBounds = new Rectangle( 0, 0, this.stage.stageWidth, this.stage.stageHeight ); if( this.stage.stageHeight - this.stage.softKeyboardRect.height < desiredBounds.height ) desiredBounds.height = this.stage.stageHeight - this.stage.softKeyboardRect.height; customField.bounds = desiredBounds; } }

Remarque: la scène distribue uniquement des événements resize en réponse à un changement d'orientation lorsque la propriété scaleMode est définie sur noScale. Dans d'autres modes, les dimensions de la scène ne changent pas; le contenu est mis à l'échelle pour compenser.

Gestion des changements d'affichage d'une application

AIR 2.6 et les versions ultérieures

Dans AIR, vous pouvez désactiver le comportement de panoramicique et de redimensionnement par défaut associé à l'affichage d'un clavier logiciel en définissant l'objet softKeyboardBehavior dans le descriptor d'application sur none :

none

Lorsque vous désactive le comportement automatique, il vous incombe d'effectuer les réglages nécessaires sur l'affichage de l'application. Un événement softKeyboardActivate est distribué lors de l'affichage du clavier. Lorsque l'événement softKeyboardActivate est distribué, la propriété softKeyboardRect de la scène contient les dimensions de la scène cachée par le clavier ouvert. Utilisez ces dimensions pour déplacer ou redimensionner votre contentu de façon à ce qu'il s'affiche correctement lorsque le clavier est ouvert et que l'utilisateur effectue une saisie. (Lorsque le clavier est fermé, les dimensions du rectangle softKeyboardRect sont toutes égales à zéro.)

Lors de la fermeture du clavier, un événement softKeyboardDeactivate est distribué et vous pouvez réactiver l'affichage normal de l'application.

package { import flash.display MoviesClip; import flash.events.SoftKeyboardEvent; import flash.events.Event; import flash.display.StageScaleMode; import flash.display.StageAlign; import flash.display.InteractiveObject; import flash.text.TextFieldType; import flash.text.TextField; public class PanningExample extends MovieClip { private var textField:TextField = new TextField(); public function PanningExample() { this.stage.scaleMode = StageScaleMode.NO Scale; this.stage align = StageAlign.TOP_LEFT; textBox.y = this.stage.height - 201; textBox.width = this.stage.width; textBox.height = 200 ; textBox.type = TextfieldsType.INPUT; textBox BORDER = true; textBox(wordWrap = true; textBox.multiline = true; this.addChild( textField ); //track soft keyboard and stage resize events textBox.addEventListener(SoftKeyboardEvent.SOFT_KEYBOARD_ACTIVATE, onKeyboardChange); textBox.addEventListener(SoftKeyboardEvent.SOFT_KEYBOARD_DEACTIVATE, onKeyboardChange); thisstage.addEventListener(Event.RESIZE, onDisplayAreaChange); } private function onDisplayAreaChange(event:Event):void

Remarque : sous Android, il existe des cas ou les dimensions exactes du clavier ne sont pas disponibles à partir du système d'exploitation, notamment lorsque le mode plein écran est activé. Dans ces cas, la taille est estimée. Par ailleurs, en mode paysage, le clavier IME plein écran natif est utilisé pour toutes les saisies de texte. Ce clavier IME dispose d'un champ de saisie de texte et cache la totalité de la scène. Il n'existe aucun moyen d'afficher un clavier en orientation paysage qui ne remplit pas l'écran.

Chapitre 31 : Entrées de souris

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Viete application peut creer une interactivite en capturant les entrées de la souris et en réagissant à ces dernières. Cette section suppose que vous maitrisez le modele d'évenement d'ActionScript 3.0. Pour plus d'informations, voir « Gestion des événements » à la page 129.

Pour plus d'informations sur l'identification du type de souris pris en charge (curseur permanent, stylet, action tactile, etc.) à l'exécution, voir « Découverte des types de saisie » à la page 576.

Voir aussi

flash.ui.Mouse

flash.events.MouseEvent

« Saisie tactile, multipoint et par mouvement » à la page 600

Capture des entrées de souris

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Les clics de souris créé des événements souris qui permettent de déclencher une fonctionnalité interactive. Il est possible d'ajouter un écouteur d'évenement à la scene afin d'écouter les événements de souris qui se produit à tout endroit du filchier SWF. Vous pouvez également ajouter des écouteurs d'évenement à des objets sur la scene qui hériment de InteractiveObject (par exemple, Sprite ou MovieClip); ces écouteurs sont déclenchés lorsque vous cliquez sur l'objet.

Comme les événements de clavier, les événements de souris se propagent vers le haut. Dans l'exemple suivant, square étant un enfant de la scène, l'événement est distribué à la fois du sprite square et de l'objet scène en cas de cliç sur le carré :

Dans l'exemple précédent, notez que I'évenement de souris contient des informations sur l'endroit où le cig s'est produit. Les propriétés localx et locally indiquent l'emplacement du cig sur l'enfant le plus bas de la chaine d'affchage. Par exemple, si vous cliquez dans l'angle supérieur gauche de square, les coordonnées locales [0,0] sont signalées car il s'agit du point d'alignement de square. Autrement, les propriétés stageX et stageY se réferent aux coordonnées globales du cig sur la scene. Le même cig signale [50,50] pour ces coordonnées car square y a été déplacé. Ces deux paires de coordonnées peuvent être utiles, selon la façon dont vous souhaitez répondre à l'interaction utilisateur.

Remarque: en mode plein écran, vous pouvez configurer l'application de façon à activer le verrouillage de la souris. Le verrouillage de la souris déactivé le curseur et permet de déplacer la souris sans aucune limite. Pour plus d'informations, voir « Utilisation du mode Plein écran » à la page 173.

L'objet MouseEvent contient aussi les propriétés booléennes-altKey, ctrlKey et shiftKey. Vous pouvez utiliser ces propriétés pour vérifier si l'utilisateur appuie également sur la touche Alt, Ctrl ou Maj au moment du click de la souris.

Glissement de sprites sur la scène

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Vous pouvez autoriser les utilisateurs a faire glisser un objet Sprite sur la scene a l'aide de la methode startDrag() de la classe Sprite. Le code suivant en est un exemple :

import flash.display.Sprite;
import flash.events.MouseEvent;
var circle:Sprite = new Sprite(   );
circle.graphics.beginFill(0xFFCC00);
circle.graphics.drawCircle(0, 0, 40);
var target1:Sprite = new Sprite(   );
target1.graphics.beginFill(0xCCFF00);
target1.graphics.drawRect(0, 0, 100, 100);
target1.name = "target1";
var target2:Sprite = new Sprite(   );
target2.graphics.beginFill(0xCCFF00);
target2.graphics.drawRect(0, 200, 100, 100);
target2.name = "target2";
addChild(target1);
addChild(target2);
addChild(circle);
circle.addEventListener(MouseEvent.MOUSE_DOWN, mouseDown)
function mouseDown(event: TObject):void
        \{
        circle.startDrag(   );
    \}
circle.addEventListener(MouseEvent.MOUSE_UP, mouseReleased);
function mouseReleased(event: TObject):void
    \{
    circle.stopDrag(   );
        \{
        circle.dropTarget.name);
    \} 

Pour plus d'informations, voir la section consacree à la creation d'une interaction de type glissement de souris dans « Modification de la position » à la page 180.

Opération glisser-deposer dans AIR

Vous pouvez activer la prise en charge d'opérations glisser-deposer dans Adobe AIR pour permettre aux utilisateurs de faire glisser des données vers l'application et en dehors de celle-ci. Pour plus d'informations, voir « Opération glisser-deposer dans AIR » à la page 629.

Personnalisation du curseur de la souris

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Le curses de la souris (pointeur de la souris) peut etre masqué ou remplace pour tout objet d'affichage de la scene. Pour masquer ce curseur, appelez le methode Mouse .hide(). Personnalisez le curseur en appelant Mouse .hide(), en écoutant l'evénement MouseEvent.MOUSE_MOVE en provenance de la scène et en définiissant les coordonnées d'un objet d'affichage (voitre curseur personnalisé) sur les propriétés stageX et stageY de l'evénement. L'exemple suivant illustre une exécution de base de cette tâche :

var cursor:Sprite new Sprite();
cursor.graphics.beginFill(0x000000);
cursor.graphics.drawCircle(0,0,20);
cursor.graphics.endFill();
addChild(cursor);
stage.addEventListener(MouseEvent.MOUSE_MOVE,redrawCursor); Mouse.hide();
function redrawCursor(event:MouseEvent):void
{ cursor.x = event stageX; cursor.y = event.stageY; }

Exemple d'entrée de souris : WordSearch

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Cet exemple illustré l'interaction utilisateur en gérant des événements de souris. Les utilisateurs créé autant de mots que possible à partir d'une grille aléatoire de lettres, en se déplaçant horizontally ou verticalément dans la grille, mais en n'utilisant jamais deux fois la même dette. Cet exemple illustré les fonctions suivantes d'ActionScript 3.0 :

  • Elaboration dynamique d'une grille de composants
  • Réponse aux événements souris
  • Suivi du score en fonction de l'interaction utilisateur

Pour obtenir les fischiers d'application de cet exemple, voir www.adobe.com/go/learn_programmingAS3samplesflash_fr. Les fischiers d'application WordSearch se trouvent dans le dossier Samples/WordSearch. L'application se compose des fischiers suivants:

FichierDescription
WordSearch.asClasse responsable les principales fonctionnalités de l'application.
WordSearch.fla ou WordSearch.mxmlLe fichier d'application principal pour Flex (MXML) ou Flash (FLA).
dictionary.txtUn fichier utilisé pour déterminer si les mots sont écrites correctement.

Chargement d'un dictionnaire

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Pour creer un jeu qui implique la recherche de mots, un dictionnaire est necessary. L'exemple inclut un fichier texte appelé dictionary.txt, qui contient une liste de mots séparés par des retours à la ligne. ÀpRES avoir créé un tableau appelé words, la fonction loadDictionary() demandé ce fichier. Une fois chargeé, celui-ci devient une longue chaine. Vous pouvez convertir cette chaine en un tableau de mots grâce à la méthode split(), qui s'arrête à chaque occurrence d'un return à la ligne (code de caractère 10) ou d'une nouvelle ligne (code de caractère 13). Cette analyse a lieu dans la fonction dictionaryLoaded():

words = dictionaryText.split(String.fromCharCode(13, 10));

Creation de l'interface utilisateur

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Une fois les mots stockés, vous pouvez élaborer l'interface utiliser. Créez deux occurrences de bouton : l'une permet de soumettre un mot, l'autre d'affacer le mot en cours de saisie. Dans chaque cas, vous doivent répondre à la saisie utilisé en écoute l'évenement MouseEventEvent . CLICK que le bouton diffuse et en appelant ensuite une fonction.

Dans la fonction setupUI(), ce code cree les écouteurs sur les deux boutons :

submitWordButton.addEventListener(MouseEvent.CLICK, submitWord); clearWordButton.addEventListener(MouseEvent.CLICK, clearWord);

Génération d'un tableau de jeu

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Le tableau de jeu est une grille de lettres aléatoires. Dans la fonction generateBoard(), une grille en deux dimensions est créé en imbriquant une boucle dans une autre. La première boucle incrémente les lignes et la seconde le nombre totale de colonnes par ligne. Chaque cellule créé par ces lignes et ces colonnes contient un bouton qui pourrait une lettuce sur le tableau.

private function generateBoard(startX:Number, startY:Number, totalRows:Number, totalCols:Number, buttonSize:Number):void  
{  
    buttons = new Array();  
    var colCounter: uint;  
    var rowCounter: uint;  
    for (rowCounter = 0; rowCounter < totalRows; rowCounter++)  
{  
        for (colCounter = 0; colCounter < totalCols; colCounter++)  
{  
            var b: Button = new Button();  
            b.x = startX + (colCounter*buttonSize);  
            b.y = startY + (rowCounter*buttonSize);  
            b.addEventListener(MouseEvent.CLICK, letterClicked);  
            b.label = getRandomLetter().toUpperCase();  
            b.setSize(buttonSize, buttonSize);  
            b.name = "buttonRow" + rowCounter + "Col" + colCounter;  
            addChild(b);  
        }  
    } 

Meme si un écouteur est ajouté pour un événement MouseEvent. Click sur une seule ligne (car il est dans une boucle for), il est affecté à chaque occurrence de bouton. Chaque bouton reçoit un nom dérivé de la position de sa ligne et de sa colonne, ce qui permet de référencer facilement la ligne et la colonne de chaque bouton ultérieurement dans le code.

Création de mots à partir de la saisie utiliser

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Les mots peuvent être écrites en sélectionnant deslettres adjacentes verticalément ou horizontally, mais jamais en utilisant deux fois la même lecture. Chaque clic génére un événement de souris au niveau duquel le mot qu'écrit l'utilisateur doit être vérifié pour s'assurer qu'il se poursuit correctement à partir delettres cliquées précédemment. Si ce n'est pas le case, le mot précédent est supprimé et un nouveau estCOMMENCE. Cette vérification s'effectue dans la méthode isLegalContinuation().

private function isLegalContinuation(prevButton:Button, currButton:Button):Boolean { var currButtonRow:Number = Number(prevButton.name.charAt(prevButton.name.indexOf("Row") + 3)); var currButtonCol:Number = Number(prevButton.name.charAt(prevButton.name.indexOf("Col") + 3)); var prevButtonRow:Number = Number(prevButton.name.charAt(prevButton.name.indexOf("Row") + 3)); var prevButtonCol:Number = Number(prevButton.name.charAt(prevButton.name.indexOf("Col") + 3)); return ((prevButtonCol == currButtonCol && Math.abs(prevButtonRow - currButtonRow) <= 1) || (prevButtonRow == currButtonRow && Math.abs(prevButtonCol - currButtonCol) <= 1)); } 

Les méthodes charAt() et indexOf() de la classe String récuperé les lignes et les colonnes du bouton sur lequel l'utilisateur clique actuellément et celui sur lequel il vient de cliquer. La méthode isLegalContinuation() renvoie true si la ligne ou la colonne est la même et que la ligne ou la colonne qui a changé se trouve à un seul incrément de la précédente. Si vous souhaitez modifier les règles du jeu et autoriser une lecture diagonale, vous pouvez supprimer la vérification de la ligne ou de la colonneinchangée. Dans ce cas, la ligne finale serait la suivante :

return (Math.abs(prevButtonRow - currButtonRow) <= 1) && Math.abs(prevButtonCol - currButtonCol) <= 1)); 

Vérification des mots soumis

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Pour terminer le code pour le jeu, des mécanismes permettant de vérifier des mots soumis et de génér le score sont nécessaires. La méthode searchForWord() permet ces deux opérations :

private function searchForWord(str:String):Number
{ if (words && str) { var i:uint = 0 for (i = 0;i < words.length;i++) { var thisWord:String = words[i]; if (str = = words[i]) { return i; } } return -1; } else { trace("WARNING: cannot find words, or string supplied is null"); } return -1;

Cette fonction analyse en boucle tous les mots du dictionnaire. Si le mot de l'utilisateur correspond à un mot du dictionnaire, sa position dans le dictionnaire est renvoyée. La méthode submitWord() vérifie la réponse et met à jour le score si la position est valide.

Personnalisation

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Il existe plusieurs constantes au début de la classe. Vous pouvez modifier ce jeu en changeant ces variables. Il est par exemple possible de modifier le temps de jeu disponible en augmentant la variable TOTAL_TIME. Si vous augmentez légèrement la variable PERCENT_VOWELS, vous pouvez accroître la probabilité de trouver des mots.

Chapitre 32 : Saisie tactile, multipoint et par mouvement

Flash Player 10.1 et les versions ultérieures, Adobe AIR 2 et les versions ultérieures

Les fonctions de gestions des événements tactiles de la plate-forme Flash incluent la saisie par point de contact unique ou multiple sur les péripériques tactiles. Le moteur d'exécution de Flash traite par ailleurs les événements qui combinent les points tactiles multiples et un geste pour creer un mouvement. En d'autres termes, les moteurs d'exécution de Flash interprétenant deux types de saisie :

Saisie tactile Saisie par le biais d'un périhérique à point unique tel un doigt, un stylet ou un autre outil sur un périhérique tactile. Certains périhériques prennet en charge plusieurs points de contacts simultanés par le biais d'un doigt ou d'un stylet.

Saisie multipoint Saisie caractérisée par plusieurs points de contact simultanés.

Mouvement Saisie interprêtée par un périhérique ou un système d'exploitation en réponse à un ou plusieurs événements tactiles. Un utilisateur tourne simultanément deux doigs, par exemple, et le périhérique ou le système d'exploitation interprête cette saisie tactile comme un mouvement de rotation. Certains mouvements sont exécutés à l'aide d'un doigt ou d'un point tactile, tandis que d'autres mouvements enrequirement plusieurs. Le périhérique ou le système d'exploitation déterminé le type de mouvement à affecter à la saisie.

Selon le périhérique de l'utilisateur, la saisie tactile et par mouvement peut être une saisie multipoint. ActionScript propose une API de gestion des événements tactiles, des événements de mouvement et des événements tactiles suivis individuellement dans le cadre de la saisie multipoint.

Remarque: selon le periphérique et le système d'exploitation utilisés, l'écoute des événements tactiles et de mouvement sollicite parfois un volume important de ressources de traitement (equivalent au rendu de plusieurs images par seconde). Il est souvent préféable de faire appel à des événements de souris si les fonctionnalités complémentaires assurees par la saisie tactile ou les mouvements ne sont pas nécessaires. Si vous utilisez des événements tactiles ou de mouvement, envisagez de réduire le nombre de modifications graphiques susceptibles de se produit, en particulier si ces événements peuvent être distribuésrapidement, comme cela se produit lors d'une opération de type panoramicique, rotation ou zoom. Vous pourriez, par exemple, arrêter l'animation au sein d'un composant pendant que l'utilisateur le redimensionne par le biais d'un mouvement de zoom.

Voir aussi

flash.ui.Multitouch

flash.events触摸Event

Paul Trani : Touch Events and Gestures on Mobile (disponible en anglais uniquement)

Mike Jones: Virtual Game Controllers (disposable en anglais uniquement)

Principes de base de la saisie tactile

Flash Player 10.1 et les versions ultérieures, Adobe AIR 2 et les versions ultérieures

Lorsque la plate-forme Flash s'exécute dans un environnement qui prend en charge la saisie tactile, les occurrences d'InteractiveObject peuvent écouter les événements tactiles et les gestionnaires d'appl. En règle générale, les événements tactiles, multipoint et de mouvement sont traités comme tout autre événement en ActionScript (pour obtenir des informations de base sur la gestion des événements en ActionScript, voir « Gestion des événements » à la page 129).

Toutefois, pour que le moteur d'exécution de Flash puisse interpréter une action tactile ou un mouvement, il doit s'exçuter dans un environnement matériel et logiciel qui prend en charge la saisie tactile ou multipoint. Pour visualiser un graphique qui compare les différents types d'écran tactile, voir « Découverte des types de saisie » à la page 576. Par ailleurs, si le moteur d'exécution s'exçute dans une application conteneur (un navigateur, par exemple), celle-ci transmet la saisie au moteur d'exécution. Dans certains cas, l'environnement actuel caractérisé par le matériel et le système d'exploitation prend en charge la saisie multipoint, mais le navigateur qui contient le moteur d'exécution interprete la saisie et ne la transmet pas à ce dernier. Il peut également ignorer totalement la saisie.

Le diagramme suivant illustrer le flux des saisies de l'utilisateur au moteur d'exécution :

ADOBE ACTIONSCRIPT 3.0 - Flash Player 10.1 et les versions ultérieures, Adobe AIR 2 et les versions ultérieures - 1
Flux des saisies de l'utilisateur au moteur d'exécution de la plate-forme Flash

L'API ActionScript de développement des applications tactiles comprend heuresement des classes, méthodes et propriétés destinées à déterminer la prise en charge des saisies tactiles ou multipoint dans l'environnement d'exercution. Vous utilisez l'« API de découverte » chargée de la gestion des événements tactiles pour déterminer la prise en charge de la saisie tactile.

Concepts importants et terminologie

La liste de référence suivante contient des termes importants relatifs à la programmation d'une application de gestion des événements tactile :

API de découverte Méthodes et propriétés destinées à vérifier si l'environnement d'exécution prend en charge les événements tactiles et différents modes de saisie.

Evénement tactile Action de saisie exécutée sur un périhérique tactile basée sur un point de contact unique.

Point tactile Point de contact associé à un événement tactile unique. Meme si un périhérique ne prend pas en charge la saisie par mouvement, il est susceptible de:gérer les points tactiles simultanés multiples.

Sequence tactile Série d'evénements qui représentent la durée de vie d'une action tactile unique. Ces événements comprehennent un début, zéro, une ou plusieurs actions et une fin.

Evénement multipoint Action de saisie executée sur un périhérique tactile basée sur plusieurs points de contact (plusieurs doigts, par exemple).

Evénement de mouvement Action de saisie executée sur un périhérique tactile qui trace un mouvement complexe. Exemple de mouvement : toucher de deux doigs un écran et tracer le périmètre d'un cercle abstraït en déplaçant simultanément ces deux doigs pour indiquer une rotation.

Phases Points horaires distincts du flux d'evénements (le début et la fin, par exemple).

Stylet Instrument d'interaction avec un écran tactile. Un stylet est souvent plus précis que le doigt. Certains péripériques ne géront qu'un type déterminé de stylet. Les péripériques qui reconnaissent la saisie par stylet risquent de ne pas gérer les points de contact multiples et simultanés ou le contact d'un doigt.

Appui-appui bref Type déterminé de mouvement de saisie multipoint caractérisé comme suit : l'utilisateur place un doigt sur un pérophérique tactile, puis appuie brièvement sur ce dernier avec un autre doigt ou un pérophérique de pointage. Ce mouvement simule souvent un clic droit de la souris dans les applications multipoint.

Structure de l'API de gestion de la saisie tactile

De par sa conception, l'API de gestion de la saisie tactile d'actionScript tient compte du fait que le traitement de la saisie tactile varie selon l'environnement matériel et logiciel du moteur d'exécution de Flash. Elle traite principalement trois besoin du développement d'applications tactiles : la découverte, les événements et les phases. La coordination de ces API assure à l'utilisateur une expérience prévisible et réactive, même si le périphérique cible est inconnu lors du développement de l'application.

Découverte

L'API de découverte permet de tester l'environnement matériel et logiciel à l'exécution. Les valeurs renseignées par le moteur d'exécution déterminent les saisies tactiles dont dispose le moteur d'exécution de Flash dans le contexte actuel. Vous disposez également du jeu de propriétés et méthodes de découverte pour définir l'application de sorte qu'elle réagisse aux événements de souris (au lieu des événements tactiles lorsque certains types de saisie tactile ne sont pas pris en charge par l'environnement). Pour plus d'informations, voir « Découverte de la prise en charge des actions tactiles » à la page 603.

Evénements

A l'instar de tout autre événement, ActionScript gère les événements tactiles par le biais d'écouteurs et de gestionnaires d'événement. Toutefois, la gestion des événements tactiles doit également prendre en compte les éléments suivants :

  • Une action tactile peut être interprétable de diverses façon par le périhérique ou le système d'exploitation, soit en tant que séquence d'actions tactiles, soit, globalement, en tant que mouvement.
  • Une action tactile unique sur un périphérique tactile (à l'aide du doigt, d'un stylet ou d'un périphérique de pointage) distribue également toutes un événement de souris. La classe MouseEvent permet d'associer l'événement de souris aux types d'événements. Vous pouvez aussi concevoir l'utilisation de sorte à ne réagir qu'aux événements tactiles. Vous pouvez également créé une application qui réagit aux deux types d'événements.
  • Une application peut réagir à plusieurs événements tactiles simultanés et traiter séparément chacun d'eux.

L'API de découverte permet généralement de Traitser de maniere conditionnelle les événements gerais par l'application, ainsi que leur mode de traitement. Lorsque l'application connait l'environnement d'execution, elle peut appeler le gestionnaire approprié ou déterminer l'objet d'évenement requis quand l'utilisateur interagit avec l'application. L'application peut également indiquer qu'une saisie spécifique ne peut pas être traitée dans l'environnement actuel et proposer à l'utilisateur une autre solution ou des informations. Pour plus d'informations, voir « Gestion des événements tactiles » à la page 604 et « Gestion des événements de mouvement » à la page 609.

Phases

Pour les applications tactiles et multipoint, les objets d'évenements tactiles contiennent des propriétés permettant de suivre les phases de l'interaction utilisateur. Programmez du code Write ActionScript destiné àTRAitter les phases de début, de mise à jour ou de fin de la saisie utilisateur de sorte à fournir un feedback à l'utilateur. Réagissez aux phases d'évenements en modifiant l'aspect des objets visuels lorsque l'utilateur touche et déplace le point de contact à l'écran. Vous pouvez également faire appel aux phases pour suivre des propriétés déterminées d'un mouvement au fur et à mesure que celui-ci évolve.

Pour les événements de point tactile, vérifie la durée de l'appui de l'utilisateur sur un objet interactif donné. Une application peut suivre plusieurs phases de points tactiles simultanées à titre individuel et les traiter en conséquence.

Pour un mouvement, interprétez les informations spécifiques relatives à la transformation du mouvement lorsqu'elle se produit. Suivez les coordonnées du ou des points de contact lorsqu'ils se déplacent à l'écran.

Découverte de la prise en charge des actions tactiles

Flash Player 10.1 et les versions ultérieures, Adobe AIR 2 et les versions ultérieures

Pour définit r'etendue de la saisie tactile traitée par l'application, faites appel aux propriétés de la classe Multitouch. Testez ensuite l'environnement pour vous assurer de la prise en charge des événements gérés par le code ActionScript. Déterminnez tout d'abord le type de saisie tactile pris en charge par l'application. Les options disponibles sont touch point, gesture ou none (interprétez toute saisie tactile comme un clic de souris et n'utilise que des gestionnaires d'évenement de souris). Faites ensuite appel aux propriétés et méthodes de la classe Multitouch pour vous assurer que le moteur d'exécution tourne dans un environnement qui prend en charge la saisie tactile requise par l'application. Testez l'environnement d'exécution pour vérifier s'il prend en charge les types de saisie tactile (l'interprétabletion des mouvements, par exemple) et réagissez en conséquence.

Remarque : la classe Multitouch contient des propriétés statiques, qui n'apartiennent à aucune occurrence de classe. Utilisez-les avec la syntaxe de Multitouch.property, par exemple :

Définition du type de saisie

Etant donné qu'un événement tactile se compose parfois d'un grand nombre d' éléments ou de phases, le moteur d'exécution de Flash doit pouvoir identifier le type de saisie tactile à interpréter. Si le doigt se contente de toucher un écran tactile, le moteur d'exécution distribue-t-il un événement tactile ? Attend-il plutôt un mouvement ? Le moteur d'exécution suit-il l'action tactile en tant qu'événement de bouton de souris enforcé ? Une application qui prend en charge la saisie tactile doit déterminer le type d'événement tactile généré pour le moteur d'exécution de Flash. La propriété Multitouch-inputMode permet de déterminer le type de saisie tactile à l'intention du moteur d'exécution. Le mode de saisie correspond à l'une des trois options suivantes :

Aucun (None) Les événements tactiles ne sont pas gérés différemment. Définissez comme suit cette option : MultitouchModes=MultitouchInputMode.NONE et traitez la saisie à l'aide de la classe MouseEventEvent.

Points tactiles uniques Chaque saisie tactile est interprétée individuellement et tous les points tactiles peuvent être suivis et gérés. Définissez comme suit cette option: MultitouchModes=MultitouchInputMode.TOUCH_POINT ettraitez la saisie à l'aide de la classe TouchEvent.

Saisie par mouvement Le pérophérique ou le système d'exploitation interprête la saisie en tant que mouvement complexe du doigt à l'écran. Le pérophérique ou le système d'exploitation affecte globalement le mouvement à un événement de saisie par mouvement unique. Définissez comme suit cette option :

Multitouch.Mode=Multitouch.Mode.GESTURE et traitez la saisie à l'aide des classes TransformGestureEvent, PressAndTapGestureEvent ou GestureEvent.

Voir « Gestion des événements tactiles » à la page 604 pour visualiser un exemple qui fait appel à la propriété Multitouch. inputMode en vue de définir le type de saisie avant detraiter un événement tactile.

Test de la prise en charge de la saisie tactile

D'autres propriétés de la classe Multitouch proposent des valeurs permettant d'adapter l'application à la prise en charge de la saisie tactile dans l'environnement actuel. Le moteur d'exécution de Flash renseigne les valeurs associées au nombre de points tactiles simultanés autorisés ou aux mouvements disponibles. Si le moteur d'exécution tourne dans un environnement qui ne prend pas en charge la gestion des événements tactiles requise par l'application, proposez une autre solution à l'utilisateur. Assurez par exemple la prise en charge des événements de souris ou affichez des informations relatives aux fonctions disponibles ou non dans l'environnement actuel.

Vou disposez egalement de l'API de prise en charge du clavier, des actions tactiles et de la souris (voir « Découverte des types de saisie » à la page 576).

Pour plus d'informations sur les tests de compatibilité, voir « Résolution des problèmes » à la page 613.

Gestion des événements tactiles

Flash Player 10.1 et les versions ultérieures, Adobe AIR 2 et les versions ultérieures

ActionScript gère les événements tactiles de base comme tout autre événement (les événements de souris, par exemple). Vous pouze écouter une série d' événements tactiles définis par les constantes de type d'événement de la classe TouchEvent.

Remarque : dans le cas d'une saisie multipoint (toucher de plusieurs doigs un périhérique, par exemple), le premier point de contact distribue un événement de souris et un événement tactile.

Pour gérer un événement tactile de base :

1 Activez la gestion des événements tactiles dans l'application en définissant la propriété flash.ui.Multitouch.InputMode sur MultitouchInputMode.TOUCH_POINT.
2 Associez un écouteur d'énements à une occurrence de classe qui hérite des propriétés de la classe InteractiveObject (Sprite ouTextField, par exemple).
3 Indiquez le type d'evénement tactile a gerer.
4 Appelez une fonction de gestionnaire d'évenement en réponse à l'évenement.

Le code suivant affiche par exemple un message lorsque l'utilisateur appuie brièvement sur le carré dessiné sur mySprite sur un écran tactile :

Multitouch=inputMode MultitouchInputMode.TOUCH_POINT;
var mySprite:Sprite = new Sprite();
var myTextField:TextField = newTextField();
mySprite.graphics.beginFill(0x336699);
mySprite.graphics.drawRect(0,0,40,40);
addChild(mySprite);
mySprite.addEventListener(TouchEvent.TOUCH_TAP,taphandler);
function taphandler(evt:TouchEvent):void{ myTextField.text = "I've been tapped"; myTextField.y = 50 . addChild(myTextField);
}

Propriétés des événements tactiles

Lorsqu'il se produit un événement, un objet d'événement est créé. L'objet TouchEvent contient des informations sur l'emplacement et les conditions de l'événement tactile. Vous disposez des propriétés de l'objet d'événement pour récapuerer ces informations.

Le code suivant cree par exemple un objet TouchEvent evt, puis affiche la propriete stagex de Iobjet d'événement (la coordonnée x du point dans l'espace de scene ou s'est produit l'action tactile) dans le champ de texte :

Multitouch.Mode = MultitouchInputMode.TOUCH_POINT;

var mySprite:Sprite = new Sprite();  
var myTextField:TextField = newTextField(); 
mySprite.graphics.beginFill(0x336699);  
mySprite.graphics.drawRect(0,0,40,40);  
addChild(mySprite); 
mySprite.addEventListener(TouchEvent.TOUCH_TAP, taphandler);

function taphandler(evt:TouchEvent):void{ myTextField.text = evt_stageX.toString; myTextField.y = 50 .
addChild(myTextField);
}

Pour plus d'informations sur les propriétés disponibles via l'objet d'évenement, voir la classe TouchEvent.

Remarque: certains environnementes d'exécution ne prennt pas en charge toutes les propriétés TouchEvent. Ainsi, certains périhériques tactiles ne sont pas en mesure de détecter la pression appliquée par l'utilisateur sur l'écran tactile. Ils ne prennt par conséquent pas en charge la propriété TouchEvent的压力. Essayez de tester la prise en charge de propriétés spécifiques pour assurer le fonctionnement de l'application. Pour plus d'informations, voir « Résolution des problèmes » à la page 613.

Phases d'un événement tactile

Vous pouvez suivre les différentes phases des événements tactiles se produit sur un objet interactif, mais aussi en dehors, exactement comme vous le fériez pour des événements de souris. Vous pouvez également suivre les événements tactiles du début à la fin d'une interaction tactile. La classe TouchEvent comporte des valeurs de gestion des événements touchBegin, touchMove et touchEnd.

Vouys disposez par exemple des événements touchBegin, touchMove et touchEnd pour proposer à l'utilisateur un feedback visuel lorsqu'il touche et déplace un objet d'affichage :

Multitouch.InputMode = MultitouchInputMode.TOUCH_POINT;
var mySprite:Sprite new Sprite();
mySprite.graphics.beginFill(0x336699);
mySprite.graphics.drawRect(0,0,40,40);
addChild(mySprite);
var myTextField:TextField = newTextField();
myTextField.width = 200 .
myTextField.height = 20 .
addChild(myTextField);
mySprite.addEventListener(TouchEvent.TOUCH_BEGIN, onTouchBegin);
stage.addEventListener(TouchEvent.TOUCH_MOVE, onTouchMove);
stage.addEventListener(TouchEvent.TOUCH_END, onTouchEnd);
function onTouchBegin(event:TouchEvent){ myTextField.text = "touch begin" + event_touchPointID;
}
function onTouchMove(event:TouchEvent){ myTextField.text = "touch move" + event_touchPointID;
}
function onTouchEnd(event:TouchEvent){ myTextField.text = "touch end" + event_touchPointID;

Remarque: à l'encontre des écouteurs charges de déplacer l'évenement tactile et demettre fin à celui-ci, l'écouteur d'évenements tactiles initial est associé à mySprite. Si l'objet d'affichage précède le doigt de l'utilisateur ou le péripérique de pointage, la scène continue à écouter l'évenement tactile.

ID de point tactile

La propriété TouchEventouchPointID est un composant fondamental de la programmation d'applications qui réagissant à la saisie tactile. Le moteur d'exécution de Flash affecte à chaque point tactile une valeur touchPointID unique. Lorsqu'une application réagit aux phases ou au mouvement d'une saisie tactile, vérifie la valeur touchPointID avant de gérer l'évenement. Les méthodes de déplacement par glissement de la saisie tactile de la classe Sprite utilisent la propriété touchPointID en tant que paramètre pour assurer le traitement de l'occurrence de saisie correcte. La propriété touchPointID vérifie qu'un gestionnaire d'évenement réagit au point tactile approprié. Le gestionnaire d'évenement réagit sinon à n'importe qu'elle occurrence du type d'évenement tactile (tous les événements touchMove, par exemple) sur le périphérique, d'où un comportement imprévisible. La propriété est particulièrement importante lorsque l'utilisateur fait glisser des objets.

La propriétéouchPointIDpermétegérer une séquence entière d'actions tactiles. Une séquence d'actions tactile se compose d'un événement touchBegin, de zéro, un ou plusieurs événements touchMove et d'un événement touchEnd, qui possèdent tous la même valeur touchPointID.

L'exemple suivant définit une variable touchMoveID, qui vérifie que la valeurouchPointID est correcte avant de réagir à un événement de mouvement tactile. Si tel n'est pas le cas, d'autres actions tactiles déclenchent également le gestionnaire d'évenement. Notez que les écouteurs associés aux phases de déplacement et de fin sont situés sur la scene,只不过 que l'objet d'affchage. La scène écoute les phases de déplacement et de fin au cas où l'action tactile de l'utilisateur dépasserait les limites de l'objet d'affchage.

Multitouch.InputMode = MultitouchInputMode.TOUCH_POINT;
var mySprite:Sprite new Sprite();
mySprite.graphics.beginFill(0x336699);
mySprite.graphics.drawRect(0,0,40,40);
addChild(mySprite);
var myTextField:TextField = newTextField();
addChild(myTextField);
myTextField.width = 200 .
myTextField.height = 20 .
var touchMoveID:int = 0 .
mySprite.addEventListener(TouchEvent.TOUCH_BEGIN, onTouchBegin);
function onTouchBegin(event:TouchEvent){ if(touchMoveID ! = 0 { myTextField.text = "already moving. ignoring new touch"; return; } touchMoveID = event_touchPointID; myTextField.text = "touch begin" + event_touchPointID; stage.addEventListener(TouchEvent.TOUCH_MOVE, onTouchMove); stage.addEventListener(TouchEvent.TOUCH_END, onTouchEnd);
} function onTouchMove(event:TouchEvent){ if(event_touchPointID ! = touchMoveID){ myTextField.text = "ignoring unrelated touch"; return; } mySprite.x = event.stageX; mySprite.y = event.stageY; myTextField.text = "touch move" + event_touchPointID;
} function onTouchEnd(event:TouchEvent){ if(event_touchPointID ! = touchMoveID){ myTextField.text = "ignoring unrelated touch end"; return; } touchMoveID = 0 stage.removeEventListener(TouchEvent.TOUCH_MOVE, onTouchMove); stage.removeEventListener(TouchEvent.TOUCH_END, onTouchEnd); myTextField.text = "touch end" + event_touchPointID;

Toucher-glisser

Flash Player 10.1 et les versions ultérieures, Adobe AIR 2 et les versions ultérieures

Deux méthodes ont été ajoutées à classe Sprite en vue de nouveaux prendre en charge les applications tactiles qui géront la saisie des points tactiles : Sprite.startTouchDrag() et Sprite.stopTouchDrag(). Le comportement de ces méthodes est identique à celui de Sprite.startDrag() et Sprite.stopDrag() en matière d'événements de souris. Notez toutes que les méthodes Sprite.startTouchDrag() et Sprite.stopTouchDrag() géront toutes deux les valeurs touchPointID en tant que paramètres.

Le moteur d'exécution affecte la valeurouchPointID à l'objet d'événement pour un événement tactile. Cette valeur peut de réagir à un point tactile spécifique si l'environnement prend en charge les points tactiles multiples et simultanés (meme s'il ne gère pas les mouvements). Pour plus d'informations sur la propriétéouchPointID, voir « ID de point tactile » à la page 606.

Le code suivant illustrer un gestionnaire d'evénement start drag simple et un gestionnaire d'evénement stop drag associé à un événement tactile. La variable bg est un objet d'affichage qui contient mySprite :

mySprite.addEventListener(TouchEvent.TOUCH_BEGIN, onTouchBegin);  
mySprite.addEventListener(TouchEvent.TOUCH_END, onTouchEnd);
function onTouchBegin(e:TouchEvent) {
    e.target.startTouchDrag(e(touchPointID, false, bg.getRect(this));
    trace("touch begin");
}
function onTouchEnd(e:TouchEvent) {
    e.target.stopTouchDrag(e_touchPointID);
    trace("touch end");
} 

Le code suivant illustré un exemple plus avancé qui combine glissement et phases d'évenement tactile :

Multitouch.InputMode = MultitouchInputMode.TOUCH_POINT;
var mySprite:Sprite new Sprite();
mySprite.graphics.beginFill(0x336699);
mySprite.graphics.drawRect(0,0,40,40);
addChild(mySprite);
mySprite.addEventListener(TouchEvent.TOUCH_BEGIN, onTouchBegin);
mySprite.addEventListener(TouchEvent.TOUCH_MOVE, onTouchMove);
mySprite.addEventListener(TouchEvent.TOUCH_END, onTouchEnd);
function onTouchBegin(evt:TouchEvent){ EVT.target.startTouchDrag(evt_touchPointID); EVT.target(scaleX = 1.5 . EVT.target(scaleY = 1.5 :
}
function onTouchMove(evt:TouchEvent){ EVT.target.alpha = 0.5 :
}
function onTouchEnd(evt:TouchEvent){ EVT.target.stopTouchDrag(evt_touchPointID); EVT.target.width = 40 . EVT.target.height = 40 . EVT.target.alpha = 1 ·

Gestion des événements de mouvement

Flash Player 10.1 et les versions ultérieures, Adobe AIR 2 et les versions ultérieures

Traitez les événements de mouvement comme tout événement tactile de base. Vous pouvez écouter une série d' événements de mouvement définis par les constantes de type d'événement dans la classe TransformGestureEvent, la classe GestureEvent et la classe PressAndTapGestureEvent.

Pour gérer un événement tactile de mouvement :

1 Activez la prise en charge de la saisie par mouvement dans l'application en définissant la propriété flash.ui.Multitouch.InputMode sur MultitouchInputMode.GESTURE.
2 Associez un écouteur d'énements à une occurrence de classe qui hérite des propriétés de la classe InteractiveObject (Sprite ouTextField, par exemple).
3 Indiquez le type d'évenement de mouvement à gérer.
4 Appelez une fonction de gestionnaire d'évenement en réponse à l'évenement.

Le code suivant affiche par exemple un message lorsqu l'utilisateur effectue un mouvement de glissement sur le carré dessiné sur mySprite sur un écran tactile :

Multitouch.InputMode = MultitouchInputMode.GESTURE;   
var mySprite:Sprite = new Sprite();   
var myTextField:TextField = newTextField();   
mySprite.graphics.beginFill(0x336699);   
mySprite.graphics.drawRect(0,0,40,40);   
addChild(mySprite);   
mySprite.addEventListener(TransformGestureEvent.GESTURE Swipe, swipehandler);   
function swipehandler(evt:TransformGestureEvent):void {   
myTextField.text = "I've been swiped";   
myTextField.y = 50;   
addChild(myTextField);   
}   
Les événements d'appui double sont gérés de la même façon, mais font appel à la classe GestureEvent :   
Multitouch.InputMode = MultitouchInputMode.GESTURE;   
var mySprite:Sprite = new Sprite();   
var myTextField:TextField = newTextField();   
mySprite.graphics.beginFill(0x336699);   
mySprite.graphics.drawRect(0,0,40,40);   
addChild(mySprite);   
mySprite.addEventListener(GestureEvent.GESTURE TWO_FINGER_TAP,taphandler);   
function taphandler(evt:GestureEvent):void {   
myTextField.text = "I've been two-finger tapped";   
myTextField.y = 50;   
addChild(myTextField);   
}   
Les événements d'appui-appui bref sont également gérés de la même façon, mais font appel à la classe PressAndTapGestureEvent :   
Multitouch.InputMode = MultitouchInputMode.GESTURE;   
var mySprite:Sprite = new Sprite();   
var myTextField:TextField = newTextField();   
mySprite.graphics.beginFill(0x336699);   
mySprite.graphics.drawRect(0,0,40,40);   
addChild(mySprite);   
mySprite.addEventListener(PressAndTapGestureEvent.GESTUREPress_AND_TAP,taphandler);   
function taphandler(evt:PressAndTapGestureEvent):void {   
myTextField.text = "I've been press-and-tapped";   
myTextField.y = 50;   
addChild(myTextField); 

Remarque: certains environnementes d'exécution ne prennt pas en charge tous les types d'évenements GestureEvent, TransformGestureEvent et PressAndTapGestureEvent. Ainsi, certains périphériques tactiles ne sont pas en mesure de détecter un mouvement de glissement à plusieurs doigs. Les événements gestureSwipe de la classe InteractiveObject ne sont donc pas pris en charge par ces périphériques. Essayez de vérifier la prise en charge d'évenements spécifique pour assurer le fonctionnement de l'application. Pour plus d'informations, voir « Résolution des problèmes » à la page 613.

Propriétés des événements de mouvement

Les événements de mouvement géront moins de propriétés que les événements tactiles de base. Vous y accédez de la même façon, par le biais de l'objet d'évenement de la fonction du gestionnaire d'évenement.

Le code suivant fait par exemple pivoter mySprite lorsque l'utilisateur effectue dessus un mouvement de rotation. Le champ de texte indique le facteur de rotation appliqué depuis le dernier mouvement (lorsque vous testez ce code, faites-le pivoter plusieurs fois pour visualiser les changements de valeur):

Multitouch.Mode=MultitouchInputMode.GESTURE;

var mySprite:Sprite = new Sprite();  
var mySpriteCon:Sprite = new Sprite();  
var myTextField:TextField = newTextField();  
myTextField.y = 50;  
addChild(myTextField); 
mySprite.graphics.beginFill(0x336699);   
mySprite.graphics.drawRect(-20,-20,40,40);   
mySpriteCon.addChild(mySprite);   
mySprite.x = 20;   
mySprite.y = 20;   
addChild(mySpriteCon); 
mySprite.addEventListener(TransformGestureEvent.GESTURE_ROTATE, rothandler);

function rothandler(evt:TransformGestureEvent):void{evt.target.parentrotationZ + = EVT.targetrotation;myTextField.text evt.target.parentrotation.toString();1

Remarque: certains environnements d'exécution ne prennt pas en charge toutes les propriétés TransformGestureEvent. Ainsi, certains périphériques tactiles ne sont pas en mesure de détecter la rotation d'un mouvement à l'écran. Ils ne prennt par conséquent pas en charge la propriété TransformGestureEventrotation. Essayez de tester la prise en charge de propriétés spécifique pour assurer le fonctionnement de l'application. Pour plus d'informations, voir « Résolution des problèmes » à la page 613.

Phases de mouvement

Les événements de mouvement peuvent également être suivis par phases, vous permettant ainsi de suivre les propriétés au fur et à mesure que le mouvement est exécuté. Vous pouvez par exemple suivre les coordonnées x lorsqu'un objet est déplace par le biais d'un mouvement de glissement. Utilisez ces valeurs pour tracer une ligne qui relié tous les points de son chemin, une fois le glissement terminé. Vous pouvez également modifier visuellement un objet d'affchage lorsqu'il traverse l'écran par glissement via un mouvement panoramicique. Modifiez à nouveau l'objet une fois le mouvement panoramicique terminé.

Multitouch.InputMode = MultitouchInputMode.GESTURE;
var mySprite new Sprite();
mySprite.addEventListener(TransformGestureEvent.GESTURE_PAN,onPan);
mySprite.graphics.beginFill(0x336699);
mySprite.graphics.drawRect(0,0,40,40);
var myTextField newTextField();
myTextField.y = 200 .
addChild(mySprite);
addChild(myTextField);
function onPan(evt:TransformGestureEvent):void{ EVT.target.localX++;
if (evt.phase GesturePhase.BEGIN){ myTextField.text "Begin"; EVT.target(scaleX = 1.5 . EVT.target(scaleY = 1.5 ·
}
if (evt.phase GesturePhase.UPDATE){ myTextField.text "Update"; EVT.target.alpha = 0.5 :
}
if (evt.phase GesturePhase.END){ myTextField.text "End"; EVT.target.width = 40 . EVT.target.height = 40 . EVT.target.alpha = 1 ·
}

Remarque : la fréquence de la phase de mise à jour varie selon l'environnement du moteur d'exécution. Certaines combinaisons système d'exploitation et matériels ne retransmettent aucune mise à jour.

La phase de mouvement correspond à « all » pour les événements de mouvement simples

Certain objects ne suivant pas chaque phase de l'evénement de mouvement associé. Ils insèrent只不过 la valeur « all » dans la propriété de la phase de l'objet d'événement. Les mouvements simples tels qu'un glissement et un double appui ne suivant pas l'événement en plusieurs phases. Une fois l'événement distribué, la propriété phase de l'objet d'événement interactif qui écoute l'événement gestureSwipe ou gestureTwoFingerTap correspond toujours à all :

Multitouch.InputMode = MultitouchInputMode.GESTURE;
var mySprite = new Sprite();
mySprite.addEventListener(TransformGestureEvent.GESTURE Swipe, onSwipe);
mySprite.addEventListener(GestureEvent.GESTURE TWO_FINGER_TAP, onTwoTap);
mySprite.graphics.beginFill(0x336699);
mySprite.graphics.drawRect(0,0,40,40);
var myTextField = newTextField();
myTextField.y = 200 .
addChild(mySprite);
addChild(myTextField);
function onSwipe(swipeEvt:TransformGestureEvent):void { myTextField.text = swipeEvt.phase // Output is "all"
}
function onTwoTap(tapEvt:GestureEvent):void { myTextField.text = tapEvt.phase // Output is "all"

Résolution des problèmes

Flash Player 10.1 et les versions ultérieures, Adobe AIR 2 et les versions ultérieures

La prise en charge matérielle et logicielle de la saisie tactile évolue rapidement. Leprésent Guide de référence ne dresse pas la liste de tous les péripériques et combinaisons système d'exploitation/logiciels qui prennten en charge la saisie multipoint. Il contient toute fois des conseils relatifs à l'utilisation de l'API de découverte pour déterminer si le péripérisque sur lequel est déployée l'application prend en charge la saisie multipoint, et propose des conseils de résolution des problèmes dans le code ActionScript.

Les moteurs d'exécution de Flash réagissant aux événements tactiles en fonction des informations transmises au moteur d'exécution par le périphérique, le système d'exploitation ou un logiciel contueur (un navigateur, par exemple). Cette dépendance vis-à-vis de l'environnement logiciel complique la presentation de la compatibilité multipoint. L'interprétation d'un mouvement ou d'une action tactile varie parfois selon le périphérique. Une rotation consiste-t-elle en deux doigs qui pivotent simultanément? Ou en un doigt qui trace un cercle à l'écran? Selon l'environnement matériel et logiciel utilisé, le mouvement de rotation peut correspondre à l'un des deux cas de figure ou à une action totalement différente. Le périphérique indique la saisie utilisateur au système d'exploitation, qui transmet cette information au moteur d'exécution. Si le moteur d'exécution tourne dans un navigateur, ce dernier interpréte parfois l'évenement tactile ou de mouvement et ne transmet pas la saisie au moteur d'exécution. Ce comportement est similaire à celui des « touches de fonction »: vous essayez d'utiliser une combinaison de touches déterminée pour demander à Flash Player d'effectuer une action donnée dans le navigateur, au lieu de quoi ce dernier ouvre un menu.

Chaque API et classe indique si elle n'est pas compatible avec certains systèmes d'exploitation. Le cas échéant, passez en revue les entrées consacrées aux API, à commencer par la classe Multitouch :

http://help.adobe.com/fr_FR/FlashPlatform/reference/actionscript/3/flash/pii/Multitouch.html.

Quelques mouvements et actions tactiles courants sont décrites ci-après :

Panoramaque Déplacez un doigt de gauche à droite ou de croite à gauche. Certains périphériques nécessrent l'utilisation de deux doigs pour exécuter un panoramaque.

Rotation Touchez l'écran de deux doigs, puis déplacez-les en formant un cercle ( comme s'ils traçait simultanément un cercle imaginaire sur une surface). Le pivot correspond au point intermédiaire entre les deux points tactiles.

Glissement Deplacez rapidement trois doigts de gauche a droite ou de droite a gauche, de haut en bas ou de bas en haut.

Zoom Touchez l'écran de deux doigs, puis séparez-les pour effectuer un zoom avant ou rapprochez-les pour effectuer un zoom arrière.

Appui-appui bref Déplacez ou appuyez un doigt, puis appuyez brièvement d'un doigt sur la surface.

La documentation de chaque péripérisque passe en revue les mouvements pris en charge et leur mode d'exécution. En règle générale, selon le système d'exploitation, l'utilisateur ne doit pas toucher du doigt le péripérisque entre chaque mouvement.

Si l'application ne réagit pas aux événements tactiles ou aux mouvements, vérifie les éléments suivants :

1 Des écouteurs d'événements tactiles ou de mouvement sont-ils associés à une classe dobjet qui hérite de la classe InteractiveObject ? Seules les occurrences d'InteractiveObject peuvent écouter les événements tactiles et de mouvement.
2 Testez-vous l'application avec Flash Professional CS5? Si tel est le cas, essayez de publier et de tester l'application, car Flash Professional peut interceptor l'interaction.
3 Commencez par des événements simples et identifie les événements pris en charge (l'exemple de code suivant est extrait de l'entrée consacree à l'API de Multitouch.InputMode):

Multitouch=inputMode MultitouchInputMode.TOUCH_POINT;
var mySprite:Sprite = new Sprite();
var myTextField:TextField = newTextField()
mySprite.graphics.beginFill(0x336699);
mySprite.graphics.drawRect(0,0,40,40);
addChild(mySprite);
mySprite.addEventListener(TouchEvent.TOUCH_TAP,tap listener);
function tap listener(e:TouchEvent):void{ myTextField.text = "I've been tapped"; myTextField.y = 50 . addChild(myTextField);
}

Appuyez sur le rectangle. Si cet exemple fonctionne, vous savez que l'environnement prend en charge un appui simple. Vous pouvez ensuite passer aux événements plus complexes.

Tester la prise en charge du mouvement est plus complexe. Un périphérique ou un système d'exploitation donné prend en charge toute combinaison de saisie par mouvement ou ne prend pas en charge du tout ce type de saisie.

Procedez comme suit pour tester simplement le mouvement de zoom :

Multitouch=inputMode = MultitouchInputMode.GESTURE;
stage.addEventListener(TransformGestureEvent.GESTURE_ZOOM,onZoom);
var myTextField = newTextField();
myTextField.y = 200 .
myTextField.text = "Perform a zoom gesture";
addChild(myTextField);
function onZoom(evt:TransformGestureEvent):void{ myTextField.text = "Zoom is supported";
}

Effectuez un mouvement de zoom sur le périphérique et vérifie si le champ de texte contient le message Zoom is supported. L'écouteur d'événements est ajouté à la scène pour vous permettre d'effectuer le mouvement sur toute partie de l'application test.

Procedez comme suit pour tester simplement le mouvement panoramicque :

Multitouch.Mode = Multitouch.Mode.GESTU
stage.addEventListener(TransformGestureEvent.GES
var myTextField = newTextField();
myTextField.y = 200 .
myTextField.text = "Perform a pan gesture";
addChild(myTextField);
function onPan(evt:TransformGestureEvent):void{ myTextField.text = "Pan is supported";
}

Effectuez un mouvement panoramicique sur le périphérique et vérifie si le champ de texte contient le message Pan is supported. L'écouteur d'événements est ajouté à la scène pour vous permettre d'effectuer le mouvement sur toute partie de l'application test.

Certaines combinaisons de système d'exploitation et de périphérique prconnent en charge les deux mouvements, d'autres un seul, autresaucun. En cas de doute, testez l'environnement de déploiemement de l'application.

Problèmes connus

Les problèmes connus liés à la saisie tactile sont les suivants :

1 Mobile Internet Explorer sur un périphérique Windows Mobile effectue un zoom automatique sur un contenu issu d'un fisier SWF :

Pour résoudre ce problème de comportement de zoom dans Internet Explorer, ajoutez le code suivant à la page HTML qui héberge le fichier SWF :

2 Sous Windows 7 (et peut-être d'autres systèmes d'exploitation), l'utiliser doitsterolre le périhérique de pointage (ou les doigs) de I'écran entre les mouvements. Par exemple, pour exécuter une rotation et un zoom sur une image :

  • Executeur le mouvement de rotation.
  • Retirez les doigts de l'écran.
  • Replacez les doigs sur l'écran et effectuez le mouvement de zoom.

3 Sous Windows 7 (et probablement sous d'autres systèmes d'exploitation), les mouvements de rotation et de zoom ne générent pas systématiquement une phase « update »; c'est notamment le cas lorsque l'utilisateur effectue le mouvement très rapidement.
4 Windows 7 Starter Edition ne gère pas la saisie multipoint. Pour plus d'informations, voir les forums d'Adobe Labs : http://forums.adobe.com/thread/579180?tstart=0
Sous Mac OS 10.5.3 et les versions ultérieures, la valeur MultitouchsupportsGestureEvents est always definie sur true, même si le matériel ne prend pas en charge les événements de mouvement.

Chapitre 33 : Opération de copier-coller

Flash Player 10 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Utilisez les classes dans le Presse-papiers de l'interface de programmation pour copier les informations à destination et en provenance du Presse-papiers du système. Les formats des données qui peuvent être transférées en provenance ou à destination d'une application qui s'exécute dans Adobe® Flash® Player ou Adobe® AIR® sont les suivants :

  • Texte
  • Texte au format HTML
  • Données RTF (Rich Text Format)
  • Objects serialises
  • Références d'objet (valides uniquement dans l'application d'origine)
  • Bitmaps (AIR uniqueness)
    Fichiers (AIR uniqueness)
  • Chaines URL (AIR uniquement)

Principes de base de l'opération de copier-coller

Flash Player 10 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

L'API copier-coller contient les classes suivantes :

PackageClasses
flash desktop• Clipboard • ClipboardFormats • ClipboardTransferMode

La propriété statique ClipboardgeneralClipboard representation le Presse-papiers du système d'exploitation. La classe Clipboard fournit des methodes de lecture et d'ecriture des données dans les objets Clipboard.

Les classes HTMLLoader (dans AIR) etTextField implément un comportement par défaut pour les racourcis clavier de copie et collage. Pour implémenter un comportement de racourci copie et collage pour des composants personalisés, vous pouvez vousmettre directement à l'écoute de ces frappes. Vous pouze également utiliser des commandes de menu nativeses encourçées d'équivalents de touches pour répondre indirectement aux frappes.

Un objet Clipboard unique peut servir à rendre disponibles des représentations diverses des mêmes informations afin d'augmenter les possibilités des autres applications à comprendre et à utiliser ces données. Par exemple, une image pourrait être incluse en tant que données d'image, un objet Bitmap sérialisé et un fisier. Le rendu des données dans un format peut être reporté de telle sorte que celui-ci ne soit pas effectivement créé tant que les données de ce format ne sont pas lues.

Lecture en provenance et écriture à destination du Presse-papiers du système

Flash Player 10 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Pour dire le contenu du Presse-papiers du système, appelez la méthode GetData() de l'objet

Clipboard.generalClipboard en lui communiquant le nom du format à dire :

import flash/Desktop.Clipboard;

import flashdesktop.ClipboardFormats;

if(Clipboard.generalClipboard.hasFormat(ClipboardFormats.TXT_format)) {

var text:String = ClipboardgeneralClipboard.getData(ClipboardFormats.TXT-format);

Remarque: un contenu qui s'exécute dans Flash Player ou dans un sandbox non applicatif d'AIR ne peut appeler que la méthode GetData() dans un gestionnaire d'évenement pour un événement paste. En d'autres termes, seul le code en cours d'exécution dans un sandbox d'application AIR peut appeler la méthode GetData() hors d'un gestionnaire d'évenement paste.

Pour écrire dans le Presse-papiers, ajoutez les données à l'objet ClipboardgeneralClipboardboard dans un ou plusieurs formats. Toutonne existante du même format est automatiquement écrasée. Toutefois, prenez l'habitude de vider le Presse-papiers du système avant de lui envoyer de nouvelles données. Vous vous assurez ainsi que les données superflues dans d'autres formats sont également supprimées.

import flash/Desktop.Clipboard;

import flashdesktop.ClipboardFormats;

Remarque: un contenu qui s'exécute dans Flash Player ou dans un sandbox non applicatif d'AIR ne peut appeler que la méthode setData() dans un gestionnaire d'évenement utilisé, tel un événement de clavier ou de souris, ou bien encore un événement copy ou cut. En d'autres termes, seul le code en cours d'exécution dans un sandbox

d'application AIR peut appeler la méthode setData() hors d'un gestionnaire d'évenement utilisateur.

Opération copier-coller HTML dans AIR

Adobe AIR 1.0 et les versions ultérièures

Dans Adobe AIR, l'environnement HTML fournit son propre comportement et son lot d'événements par défaut pour l'opération de copier-coller. Seul le code en cours d'exécution dans le sandbox de l'application est en mesure d'acceder directement au Presse-papiers du système via l'objet ClipboardgeneralClipboard. Le code JavaScript d'un sandbox hors application peut acceder au Presse-papiers via l'objet événement envoyé en réponse à l'un des événements copier-coller envoyé par un élément provenant d'un document HTML.

Les événements copier-coller sont les suivants : copy, cut et paste. L'objet envoyé pour ces événements fournit un accès au Presse-papiers par la propriété clipboardData.

Comportement par défaut

Adobe AIR 1.0 et les versions ultérieures

Par défaut, AIR copie les éléments sélectionnées en réponse à la commande copier qui peut être engendrée soit par un raccourci-clavier, soit par un menu contextuel. Au sein des zones modifiables, AIR coupe du texte en réponse à des commandes couper ou bien colle du texte au curseur ou à la sélection en réponse à la commande coller.

Pour éviter le comportement par défaut, votre gestionnaire d'événement peut appeler la méthode préventDefault() de l'objet événement envoyé.

Utilisation de la propriété clipboardData de l'objet événement

Adobe AIR 1.0 et les versions ultérieures

La propriété clipboardData de l'objet événement envoyé à la suite de l'un des événements copier-coller vous permet de dire des données du Presse-papiers et d'écrire dedans.

Pour écrire dans le Presse-papiers lors de l'exécution d'un événement copier-coller, utilisez la méthode setData() de l'objet clipboardData en faisant passer les données à copier et le type de MIME :

function customCopy(event){ event.clipData.setData("text/plain", "A copied string.")}; 

Pour acceder aux données en cours de collage, vous pouze utiliser la méthode GetData() de l'objet clipboardData en faisant passer le type de MIME du format de données. Les formats disponibles sont indiqués par la propriété types.

function customPaste(event){ var pastedata = event.clipData("text/plain"); }

Il est possible d'acceder à la méthode GetData() et à la propriété types uniquement dans lobjet d'évenement envoyé par l'évenement paste.

L'exemple ci-dessous illustré la façon de replacer le comportement copier-coller par défaut dans une page HTML. Le gestionnaire d' événement copy met en italiques le texte copied et le copied dans le Presse-papiers sous la forme de texte HTML. Le gestionnaire d' événement cut copie les données sélectionnées dans le Presse-papiers et les supprime du document. Le gestionnaire paste insère le contenu du Presse-papiers sous forme de HTML en caractères gras :

Copy and Paste

Formats de données Clipboard

Flash Player 10 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Les formats de Clipboard décrivent les données placées dans un objet Clipboard. Flash Player ou AIR traduit automatiquement les formats de données standard entre types de données ActionScript et formats de Presse-papiers système. De surcroît, les objets application peuvent être transférés au sein des applications basées sur ActionScript et entre celles-ci à l'aide des formats définis par les applications. Un objet Clipboard peut containir des représentations des mêmes informations dans différents formats. Par exemple, un objet Clipboard représentant un sprite pourrait inclure un format de référence pour un usage au sein de la même application, un format sérialisé pour un usage par une autre application qui s'executerait dans Flash Player ou AIR, un format bitmap pour un usage par un éditeur d'images et un format liste de fischiers (peut-être avec un rendu différé pour coder un fisier PNG) pour permettre une copie ou un glissement d'une représentation du sprite vers le système de fischiers.

Formats de données standard

Flash Player 10 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Les constantes qui définissent les noms des formats standard sont fournies par la classe ClipboardFormats :

ConstanteDescription
TEXT_formatLes données au format texte sont transposées en provenance et à destination de la classe String dans ActionScript.
HTML_formatTexte avec balisage HTML.
RICH_TEXT_formatLes données au format RTF sont transposées en provenance et à destination de la classe ByteArray d'ActionScript. Le balisage RTF n'est ni interprétré ni transposé de quelque façon que ce soit.
BITMAP_format(AIR uniquement) Les données au format bitmap sont transposées en provenance et à destination de la classe BitmapData d'ActionScript.
FILE_LIST_format(AIR uniquement) Les données au format liste de fichiers sont transposées en provenance et à destination d'un tableau des objets File d'ActionScript.
URL_format(AIR uniquement) Les données au format URL sont transposées en provenance et à destination de la classe String d'ActionScript.

Lorsqu'il s'agit de copier et de coller des données en réponse à un événement copy, cut ou paste dans un contenu HTML hébergé dans une application AIR, il faut utiliser des types MIME à la place des chaînes ClipboardFormat. Les types MIME de données valides sont les suivants :

Type MIMEDescription
Texte"text/plain"
URL"text/uri-list"
Image bitmap"image/x-vnd.adobe.air.bitmap"
liste de fichiers"application/x-vnd.adobe.air.file-list"

Remarque: les données RTF ne sont pas disponibles depuis la propriété clipboardData de l'objet événement envoyé à la suite d'un événement paste au sein d'un contenu HTML.

Formats de données personalisés

Flash Player 10 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Voupeus ou des formats personalisés définis dans les applications pour transférer des objets en tant que références ou des copies sérialisées. Les références ne sont valides que dans l'application d'origine. Les objets sérialisés peuvent être transférés entre applications, mais ne peuvent être utilisés qu'avac des objets qui demeurent valides lorsqu'ils sont sérialisés et désérialisés. Les objets peuvent généralement être sérialisés si leurs propriétés sont soit des types simples, soit des objets sérialisables. Pour ajouter un objet sérialisé à un objet Clipboard, définitisse le paramètre serialize sur true lorsque vous appelez la méthode Clipboard.setData(). Le nom du format peut être celui d'un format standard ou une chaine arbitraire définie par votre application.

Modes de transfert

Flash Player 10 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Lorsqu'un objet est ecrit dans le Presse-papiers dans un format de données personalisé, les données de l'objet peuvent être lues depuis le Presse-papiers soit comme une reférence, soit comme une copie sérialisée de l'objet d'origine. Quatre modes de transfert déterminent si les objets sont transférés en tant que références ou en tant que copies sérialisées:

Mode de transfertDescription
ClipboardTransferModes ORIGINAL_ONLYSeule une référence est renvoyée. Si aucune référence n'est disponible, une valeur null est renvoyée.
ClipboardTransferModes ORIGINAL_PREFFEREDUne référence est renvoyée, si elle est disponible. Sinon, une copie sérieisable est renvoyée.
ClipboardTransferModes.CLANE_ONLYSeule une copie sérieable est renvoyée. S'il n'y a pas de copie sérieise, une valeur « null » est renvoyée.
ClipboardTransferModes.CLANE_PREFFEREDUne copie sérieable est renvoyée, si elle est disponible. Sinon, une ↔reference est renvoyée.

Lecture et écriture de formats de données personalisés

Flash Player 10 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Lors de l'écriture d'un objet dans le Presse-papiers, vous pouvez utiliser toute chaîne qui ne commence pas par les préfixes réservés air: ou flash: pour le paramètre format. Utilisez la même chaîne que le format pour dire l'objet. Les exemples suivants illustrent la façon de dire et d'écrire des objets dans le Presse-papiers. public function createClipboardObject(object:Object):Clipboard{ var transfer:Clipboard = Clipboard.generalClipboard; transfer.setData("object",object, true); } Pour extraire un objet sérieisé de l'objet Clipboard (à la suite d'une opération déposer ou coller), utilisez le même nom de format et les modes de transfert CLONE_ONLY ou CLONE_PREFFERED. var transfer:Object = clipboardGetData("object", ClipboardTransferMode.CLONE_ONLY); Une reférence est toujours ajoutée à l'objet Clipboard. Pour extraire la reférence de l'objet Clipboard (à la suite d'une opération déposer ou coller), utilisez les modes de transfert ORIGINAL_ONLY ou ORIGINAL_PREFFERED en lieu et place de la copie sérieisée. var transferredObject:Object = clipboard_Data("object", ClipboardTransferModeORIGINAL_ONLY); Les références ne sont valides que si lobjet Clipboard provient de l'application actuelle. Utilisez le mode de transfert ORIGINAL_PREFERRED pour acceder à la référence lorsqu'elle devient disponible et le clone sérieisé lorsque la référence ne l'est pas.

Rendu différé

Flash Player 10 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Si la création d'un format de données est couteuse en ressources informatiques, vous pouvez procéder à un rendu différé en fournissant une fonction qui fournit les données à la demande. La fonction n'est appelée que si le récepteur de l'opération déposer ou coller demande les données dans le format différé. La fonction de rendu est ajoutée à l'objet Clipboard à l'aide de la méthodesettingsDataHandler(). La fonction doit renvoyer les données dans un format approprié. Par exemple, si vous appelez setDataHandler(ClipboardFormat.TXT_format, writeText), alors la fonction writeText() doit renvoyer une chaine. Si un format de données de même type est ajoute à l'objet Clipboard avec la méthode setData(), ces données priment sur la version différée (la fonction de rendu n'est jamais appelée). Selon le cas, la fonction de rendu peut être appelée à nouveau ou non si les mêmes données du Presse-papiers sont à nouveau utilisées. Remarque : sous Mac OS X, le rendu différé ne fonctionne qu'avec des formats de données personalisés. Avec des formats de données standard, la fonction de rendu est appelée immédiatement.

Collage de texte à l'aide d'une fonction de rendu différé

Flash Player 10 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures L'exemple ci-dessous illustré la façon d'implementer une fonction de rendu. Lorsque l'utilisateur appuie sur le bouton Copier, l'application vide le Presse-papiers du système pour s'assurer qu'aucune donnée d'opérations de Presse-papiers précédentes ne subsiste. La méthodeSETSHandler() définit alors la fonction renderData() comme rendu du Presse-papiers. Lorsque l'utilisateur可以选择 la commande Coller du menu contextuel du champ de texte de destination, l'application accède au Presse-papiers et définit le texte de destination. Comme le format des données texte du Presse-papiers a été définie avec une fonction plutôt qu'une chaîne, le Presse-papiers appelle la fonction renderData(). Cette fonction renderData() renvoie le texte dans le texte source qui, lui, est affecté au texte de destination. Notez que si vous editedz le texte source avant d'appuyer sur le bouton Coller, les modifications se retrouveront dans le texte collé, même lorsque l'édition survient après avoir appuyé sur le bouton Copier. Cette situation existe du fait que la fonction de rendu ne copie pas le texte source tant que l'on n'a pas appuyé sur le bouton Coller. Lorsque vous utilisez le rendu différé dans une veritable application, vous pourriez fouvoir stocker ou protégger les données source de manière à éviter ce problème. Example Flash

package {  
import flashdesktop.Clipboard;  
import flashdesktop.ClipboardFormats;  
import flashdesktop.ClipboardTransferMode;  
import flash.display.Sprite;  
import flash.text.TextField;  
import flash.text.TextFormat;  
import flash.text.TextfieldsType;  
import flash.events.MouseEvent;  
import flash.events.Event;  
public class DeferredRenderingExample extends Sprite {  
    private var sourceTextField:TextField;  
    private var destination:TextField;  
    private var copyText:TextField;  
    public function DeferredRenderingExample():void {  
        sourceTextField = createTextField(10, 10, 380, 90);  
        sourceTextField.text = "Neque porro quisquam est qui dolorem " + "ipsum quia dolor sit amet, consectetur, adipisci velit.";  
        copyText = createTextField(10, 110, 35, 20);  
        copyText_htmlText = "<a href='#" + Copy</a>";  
        copyText.addEventListener(MouseEvent.CLICK, onCopy);  
        destination = createTextField(10, 145, 380, 90);  
        destination.addEventListener(Event.PASTE, onPaste);  
    }  
    private function createTextField(x:Number, y:Number, width:Number, height:Number):TextField{  
        var newTxt:TextField = newTextField();  
        newTxt.x = x;  
        newTxt.y = y;  
        newTxt.height = height;  
        newTxt.width = width;  
        newTxt/container = true;  
        newTxt.multiline = true;  
        newTxt(wordWrap = true;  
        newTxt.type =TextField.Type.INPUT;  
        addChild(newTxt);  
        return newTxt;  
    }  
public function onCopy(event:MouseEvent):void {  
        Clipboard.generalClipboard.clear();  
        ClipboardeneralClipboard.setDataHandler(ClipboardFormats.TXT_FORMAT, Data);  
    }  
public function onPaste(event:Event):void { 

sourceTextField.text = ClipboardgeneralClipboard.getData(ClipboardFormats.TXT-format).ToString; } public function renderData():String { trace("Rendering data"); var sourceStr:String sourceTextField.text; if (sourceTextField-selectionEndIndex > sourceTextField-selectionBeginIndex) { return sourceStr.substring(sourceTextField-selectionBeginIndex, sourceTextField-selectionEndIndex); } else { return sourceStr; } } Example Flex

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="326" height="330" applicationComplete="init(){
    <mx:Script>
        <!--CDATA>
            import flashdesktop.Clipboard;
            import flashdesktop.ClipboardFormats;
        }
    public function init(){
        <destination.eventListener("paste",doPaste);
    }
    public function doCopy(){
        <ClipboardgeneralClipboard.clear());
        <ClipboardgeneralClipboard.setDataHandler(ClipboardFormats.TXT_FORMAT, renderData);
    }
    public function doPaste(event:Event):
        <destination.text =
            Clipboard-generalClipboardGetData(ClipboardFormats.TXT_format).ToString;
        }
    public function renderData(){
        <trace("Rendering data");
        return source.text;
    }]]> </mx:Script>
    <mx:Label x="10" y="10" text="Source” /> 
    <mx:TextArea id="source" x="10" y="36" width="300" height="100"> 
        <mx:text>Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit.</mx:text>
    </mx:TextArea>
    <mx:Label x="10" y="181" text="Destination”/> 
    <mx:TextArea id="destination" x="12" y="207" width="300" height="100" /> 
    <mx:Button click="doCopy();" x="91" y="156" label="Copy"/> </mx:Application> 

Chapitre 34 : Saisie via un accéléromètre

Flash Player 10.1 et les versions ultérieures, Adobe AIR 2 et les versions ultérieures

La classe Accelerometer distribue des événements en fonction de l'activité detectée par le capteur de mouvement du péripérique. Ces données représentent l'emplacement du péripérique ou un mouvement de ce dernier le long d'un axe tridimensionnel. Lorsque le péripérique se déplace, le capteur detecte le mouvement et renvoie ses coordonnées d'accelération. Les méthodes de la classe Accelerometer permettent de savoir si l'accéléromètre est pris en charge et de définir la fréquence de distribution des événements d'accélération. Les axes de l'acceleromètre sont normalisés par rapport à l'orientation de l'affichage,只不过 qu'à l'orientation physique du périphérique. Toute modification de l'orientation de l'affichage par le périphérique entraine la réorientation en conséquence des axes de l'acceleromètre. Par consequement, l'axe y est toujours plus ou moins vertical lorsque l'utilisateur tient le téléphone dans une position verticale standard, qu'elle que soit la direction de rotation du téléphone. Si l'orientation automatique est désactivée (lorsque le contenu SWF d'un navigateur est affché en mode Plain écran, par exemple), les axes de l'acceleromètre ne sont pas réorientés lors de la rotation du périphérique.

Voir aussi

flash.sensors.Accelerometer flash.events.AccelerometerEvent

Vérification de la prise en charge de l'accéléromètre

La propriété Accelerometer.isSupported permit de vérifier si l'environnement d'exéciution prend en charge cette fonction :

if (Accelerometer.isSupported)  
{ // Set up Accelerometer event listeners and code. } 

Les versions du moteur d'exécution indiquées pour chaque entrée d'API peuvent acceder à la classe Accelerometer et à ses membres. L'environnement d'exécution actuel déterminne toute fois la disponibilité de la fonction. Vous pouvez, par exemple, compiler du code par le biais des propriétés de la classe Accelerometer pour Flash Player 10.1, mais vous nez fait faire appel à la propriété Accelerometer.isSupported pour vérifier la disponibilité de la fonction Accelerometer sur le périphérique de l'utilisateur. Si Accelerometer.isSupported est défini sur true à l'exécution, la prise en charge de la fonction Accelerometer est active.

Détction des changements de l'accéléromètre

Pour utiliser le capteur de l'acceleromètre, instanciez un object Accelerometer et enregistrez-vous pour receivevoir les événements update qu'il distribue. Un événement update est un object d'évenement Accelerometer. L'évenement possède quatre propriétés, toutes numériques : accelerationX: acceleration le long de l'axe x, mesure en g. L'axe x traverse le périhérique de gauche à droit lorsque l'utilisateur le tient croit. (La partie supérieure du périhérique est alors orientée vers le haut.) L'accelération est positive si le périhérique se déplace vers la droite. accelerationY: acceleration le long de l'axe y, mesurée en g. L'axe y traverse le périphérique de bas en haut lorsque I'utilisateur le tient droit. (La partie supérieure du périphérique est alors orientée vers le haut.) L'accelération est positive si le périphérique se déplace vers le haut par rapport à cet axe. accelerationz: acceleration le long de l'axe z, mesure en g. L'axe z est perpendicular à la face du périhérique. L'acceleration est positive si vous déplacez le périhérique de sorte que sa face soit orientée vers le haut. L'acceleration est négative si la face du périhérique est orientée vers le sol. - timestamp : nombre de millisecondes au moment où se produit l'évenement après l'initialisation du moteur d'exécution. 1g correspond à l'accelération standard due à la gravité, soit environ 9,8~m / s^2 . Exemple de base qui affiche les données de l'accelerometre dans un champ de texte : var accl:Accelerometer; if (Accelerometer.isSupported) { accl = new Accelerometer(); accl.addEventListener(AccelerometerEvent.UPDATE, updaterHandler); } else { accTextField.text = "Accelerometer feature not supported"; } function updaterHandler(evt:AccelerometerEvent):void { accTextField.text = "accelerationX:" ^+ evt.accelerationX.toString("\\n" + "accelerationY:" ^+ evt.accelerationY.toString("\\n" + "accelerationZ:" ^+ evt.accelerationZ.toString() } Pour exploiter cet exemple, voirlez à créé le champ de texte accTextField et à l'ajouter à la liste d'affichage avant d'utiliser le code. Voupe ajuster l'intervalle de temps qu'separe les événements de I'accelerometre en appelant la methode setRequestedUpdateInterval() de I'objet Accelerometer. Cette methode ne gere qu'un seul parametre, interval, qui correspond à la fréquence de mise à jour requise, en millisecond:

var accl:Accelerometer;  
accl = new Accelerometer();  
accl.setRequestedUpdateInterval(1000); 

L'intervalle réel entre les mises à jour de l'acceleromètre peut être supérieur ou inférieur à cette valeur. Toute modification de l'intervalle de mise à jour affecte l'ensemble des écouteurs enregistrés. Si vous n'appelez pas la méthode setRequestedUpdateInterval(), l'application reçoit des mises à jour à la fréquence définie par défaut sur le péripérique. Les données de l'acceleromètre ne sont pas d'une précision absolue. Vous pouvez calculer la moyenne mobile des données récentes pour lisser les données. Ainsi, l'exemple suivant prend en compte les données récentes issues de l'acceleromètre et les données en cours pour arrondir le résultat : var accl:Accelerometer; var rollingX:Number = 0 . var rollingY:Number = 0 . var rollingZ:Number = 0 . const FACTOR:Number = 0.25 . if (Accelerometer.isSupported) { accl = new Accelerometer(); accl.setRequestedUpdateInterval(200); accl.addEventListener(AccelerometerEvent.UPDATE, updaterHandler); } else { accTextField.text = "Accelerometer feature not supported"; } function updateHandler(event:AccelerometerEvent):void { accelRollingAvg(event); accelTextField.text = rollingX ^+ "\\n" ^+ rollingY ^+ "\\n" ^+ rollingZ ^+ "\\n"; function accelRollingAvg(event:AccelerometerEvent):void { rollingX = (event.accelerationX \*FACTOR) ^+ (rollingX \* (1-FACTOR)); rollingY = (event.accelerationY \*FACTOR) ^+ (rollingY \* (1-FACTOR)); rollingZ = (event.accelerationZ \*FACTOR) ^+ (rollingZ \* (1-FACTOR)); Le calcul de la moyenne mobile n'est toutfois desirable que si la frquence de mise a jour de l'accelerometre est elevée.

Chapitre 35 : Opération glisser-deposer dans AIR

Adobe AIR 1.0 et les versions ultérieures Les classes de l'API glisser-deposer d'Adobe AIR™ permettent de prendre en charge les mouvements glisser-deposer dans l'interface utilisateur. Dans ce contexte, un mouvement est une action effectue par l'utilisateur, gérée à la fois par le système d'exploitation et votre application, qui exprime son intention de copier, déplacer oulier des informations. Il se produit un mouvement de glissement vers l'extérieur lorsque l'utilisateur fait glisser un objet hors d'un composant ou d'une application. Il se produit un mouvement de glissement vers l'intérieur lorsque l'utilisateur fait glisser un objet externe vers un composant ou une application. L'API glisser-deposer permet à un utilisateur de faire glisser des données d'une application à l'autre ou d'un composant d'application à l'autre. Parmi les formats de transfert pris en charge figurent : Images bitmap Fichiers - Texte au format HTML - Texte - Données RTF (Rich Text Format) URL Fichiers promis - Objets sérieisés - Références aux objets (valables uniquement dans leur application d'origine)

Principes de base des opérations glisser-déposer dans AIR

Adobe AIR 1.0 et les versions ultérieures Pour obtenir une explication rapide de l'utilisation des opérations glisser-déposer dans une application AIR et des exemples de code correspondants, voir les articles de démarrage rapide dans Adobe Developer Connection : - Prise en charge des opérations glisser déposer et copier-coller (Flex) - Prise en charge des opérations glisser-déposer et copier-coller (Flash) L'API glisser-deposer contient les classes suivantes.

PackageClasses
flash desktop• NativeDragManager • NativeDragOptions • Clipboard • URFLicense • IFilePromise • Les constantes utilisées dans l'API glisser-déposer sont définies dans les classes suivantes: • NativeDragActions • ClipboardFormat • ClipboardTransferModes
flash.eventsNativeDragEvent

Décomposition des mouvements glisser-deposer

Le mouvement glisser-deposer est composé de trois étapes, comme suit : Initialisation Un utiliseur initiale une opération de glisser-deposer en faisant glisser un composant ou un élément de composant tout en maintainant enforcé le bouton de la souris. Le composant source de l'élement glissé porte généralement le nom d'initiateur du glissement et distribue les événements nativeDragStart et nativeDragComplete. Une application Adobe AIR démarre une opération de glissement en appelant la méthode NativeDragManager.doDrag() en réponse à un événement mouseDown ou mouseMove. Si l'opération de glissement commence à l'extérieur d'une application AIR, aucun objet initiateur ne déclenché les événements nativeDragStart ou nativeDragComplete. Glissement Tout en maintainant enforcé le bouton de la souris, l'utiliser déplace le curseur vers un autre composant, une autre application ou le bureau. Pendant la durée du glissement, l'objet initiateur distribue des événements nativeDragUpdate. (Cet événement n'est toute fois pas distribué dans AIR pour Linux.) Lorsque l'utiliser place la souris sur une cible de dépôt potentielle dans une application AIR, la cible distribue un événement nativeDragEnter. Le gestionnaire d'événement peut inspecter l'objet événement pour déterminer si les données glissées sont disponibles dans un format généré par la cible. Si tel est le cas, il autorise l'utiliser à déposer les données sur la cible en appelant la méthode NativeDragManager.acceptDragDrop(). Tant que le mouvement de glissement survole un objet interactif, celui-ci distribue des événements nativeDragOver. Lorsque le mouvement de glissement quitte lobjet interactif, celui-ci distribue un événement nativeDragExit. Dépôt L'utilisateur relâche la souris sur une cible de dépôt appropriée. Si la cible est un composant ou une application AIR, l'objet cible déclène un événement nativeDragDrop. Le gestionnaire d'événement peut accéder aux données transférées à partir de l'objet événement. Si la cible n'est ni un composant, ni une application AIR, le système d'exploitation ou une autre application gère le dépôt. Dans les deux cas de figure, l'objet initiateur distribue un événement nativeDragComplete (sous réserves que le glissement ait début à partir d'AIR). La classe NativeDragManager contrôle les mouvements de glissement vers l'intérieur et l'extérieur. Tous les membres de la classe NativeDragManager étant statiques, ils ne seront pas d'occurrence de cette dernière.

Objet Clipboard

Les données glissées vers une application ou un composant ou à partir de ces derniers sont contenues dans un objet Clipboard. Un objet Clipboard unique peut proposer plusieurs représentations des mêmes informations pour augmenter les chances qu'une autre application comprendne et utilise les données. Une image peut par exemple être incluse en tant que données d'image, objet Bitmap sérialisé ou fichier. Le rendu des données dans un format peut être confié à une fonction de rendu qui n'est pas appelée tant que les données n'ont pas été lues. Une fois le mouvement de glissement démarré, il n'est possible d'acceder à l'objet Clipboard qu'à partir d'un gestionnaire associé aux événements nativeDragEnter, nativeDragOver et nativeDragDrop. Lorsque le mouvement de glissement est terminé, l'objet Clipboard ne peut être ni lu ni réutilisé. Un objet application peut être transféré sous forme de référence et d'objet sérialisé. Les références sont valables uniquement dans leur application d'origine. Les transferts d'objets sérialisés sont valides d'une application AIR à une autre, mais sont réservés aux objets qui demeurent valides lorsqu'ils sont sérialisés et désérialisés. Les objets sérialisés sont convertis au format AMF3 (Action Message Format for ActionScript 3), qui permet de transférer des données sous forme de chaînes.

Utilisation de la structure Flex

Dans la plupart des cas, il est recommendé d'utiliser l'API glisser-deposer d'Adobe Flex™ lors de la création d'applications Flex. La structure Flex propose un jeu de fonctions équivalentes lorsqu'une application Flex est exécutée dans AIR (elle utilise la classe NativeDragManager d'AIR en interne). Flex gère également un jeu plus limité de fonctions lorsqu'une application ou un composant s'exécute dans l'environnement plus restrictif d'un navigateur. Il est impossible d'utiliser les classes AIR dans des composants ou applications qui tournent en dehors de l'environnement d'exécution AIR.

Prise en charge du mouvement de glissement vers l'extérieur

Adobe AIR 1.0 et les versions ultérieures

Pour prendre en charge le mouvement de glissement vers l'extérieur, vous devez creer un objet Clipboard en réponse à un événement mouseDown et l'envoyer à la méthode NativeDragManager.doDrag(). Voitre application peut alors écouter l'événement nativeDragComplete sur l'objet initiateur pour déterminer la marche à suivre lorsque l'utilisateur termine ou abandonne le mouvement.

Préparation des données à transférer

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Pour préparer les données ou un objet à faire glisser, créez un objet Clipboard et ajoutez les informations à transférer dans un ou plusieurs formats. Vous disposez des formats de données standard pour transmettre des données susceptibles d'être converties automatiquement en formats Presse-papiers natifs, ainsi que des formats définis par l'application pour transmettre des objets. Si la conversion d'informations à transférer dans un format déterminé mobilise un volume élevé de ressources de calcul, vous pouvez indiquer le nom d'une fonction de gestionnaire qui executera la conversion. La fonction est appelée sous réserve que le composant ou l'application qui recoit les données mise le format correspondant. Pour plus d'informations sur les formats du Presse-papiers, voir « Formats de données Clipboard » à la page 619. L'exemple suivant illustrer la création d'un objet Clipboard qui comporte une image bitmap en plusieurs formats : un objet Bitmap, un format d'image bitmap natif et un format de liste de fischiers contenant le fisquier source de l'image bitmap :

import flashdesktop.Clipboard;   
import flash.display.Bitmap;   
import flash.filesystem.File;   
public function createClipboard(image:Bitmap, sourceFile:File):Clipboard{ var transfer:Clipboard = new Clipboard(); transfer.setData("CUSTOM_BITMAP", image, true); //Flash object by value and by reference transfer.setData(ClipboardFormats.BITMAP_format, image.bitmapData, false); transfer.setData(ClipboardFormats.FILE_LIST_format, new Array.sourceFile), false); return transfer;   
} 

Démarrage d'une opération de glissement vers l'extérieur

Adobe AIR 1.0 et les versions ultérieures

Pour démarrer une opération de glissement, appelez la méthode NativeDragManager.doDrag() en réponse à un événement mouse down. La méthode doDrag() est statique et gère les paramétres suivants :

ParamètreDescription
initiatorObjet où début le glissement, qui distribue les événements dragStart et dragComplete. Il doit impératifement être interactif.
clipboardObjet Clipboard contenant les données à transférer. L'objet Clipboard est référencé dans l'objet NativeDragEvent distribué lors de la série glisser-déposer.
dragImage(Facultatif) Obj BitmapData à afficher lors du glissement. L'image peut stipuler une valeur alpha. (Remarque : Microsoft Windows applique systématiquement un fondu alpha fixe aux images glissées.)
offset(Facultatif) Obj Point qui stipule le décalage de l'image glissée par rapport à la zone sensible de la souris. Utilisez des coordonnées négatives pour déplacer l'image vers le haut et la gauche par rapport au curseur de la souris. Si vous ne définisse pas de décalage, l'angle gauche de l'image glissée est placé sur la zone sensible de la souris.
actionsAllowed(Facultatif) Obj NativeDragOptions qui indique les actions (copie, déplacement ou liaison) générées par l'opération de glissement. Si vous n'indiquezaucumargument,toutesles actions sont autorisées.L'objet DragOptions est référencé dans les objets NativeDragEvent pour permettre à la cible potentielled'un glissement de vérifier si les actions autorisées sont compatibles avec l'objectif du composant cible. Par exemple, un composant « trash » est susceptible de n'accepter que les mouvements de glissement qui autorisent l'action de déplacement.

L'exemple suivant illustrer le démarrage d'une opération de glissement d'un objet bitmap charge à partir d'un fichier. L'exemple charge une image et, lors d'un événement mouseDown, démarre l'opération de glissement. package { import flashdesktop.NativeDragManager; import mx.core-IIComponent; import flash.display.Sprite; import flash.display.Loader; import flash.system LoadedContext; import flash.net(URLRequest; import flashgeom.Point; import flashdesktop.Clipboard; import flash.display.Bitmap; import flash filesystem.File; import flash.events.Event; import flash.events.MouseEvent; public class DragOutExample extends UIComponent Sprite { protected var fileURL:String = "app:/image.jpg"; protected var display:Bitmap; private function init():void { loadImage(); } private function onMouseDown(event:MouseEvent):void { var bitmapFile:File new File(fileURL); var transferObject:Clipboard createClipboard(display, bitmapFile); NativeDragManager.doDrag(this, transferObject, display.bitmapData, new Point(-mouseX,-mouseY)); } public function createClipboard(image:Bitmap, sourceFile:File):Clipboard { var transfer:Clipboard new Clipboard(); transfer.setData("bitmap", image, true); // ActionScript 3 Bitmap object by value and by reference transfer.setData(DataBoardFormats.BITMAP_FORMAT, image.bitmapData, false); // Standard Bitmap data format transfer的数据(DataBoardFormats.FILE_LIST_FORMAT, new Array.sourceFile), false); // Standard file list format return transfer; } private function loadImage():void { varurl:URLRequest newURLRequest(fileURL); varloader:Loader = newLoader(); loader.load(url,newLoaderContext()); loader contentLoaderInfo.addEventListener(Event.COMPLETEO, onLoadComplete); } private function onLoadComplete(event:Event):void { display event.targetloader.content; var flexWrapper:UIComponent new UIComponent(); flexWrapper.addChild(event.targetloader(content); addChild(flexWrapper); flexWrapper.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown); } 1

Achévement d'un transfert par glissement vers l'extérieur

Adobe AIR 1.0 et les versions ultérieures

Lorsqu'un utilisateur dépose l'objet glissé en relachant la souris, l'objet initiateur distribue un événement nativeDragComplete. Vous pouvez vérifier la propriété dropAction de l'objet événement, puis exécuter l'action appropriée. Par exemple, si l'action correspond à NativeDragAction.MOVE, , vous pourriez supprimer l'objet source de son emplacement d'origine. L'utilisateur peut abandonner un mouvement de glissement en relachant le bouton de la souris lorsque le curseur figure en dehors d'une cible de dépôt appropriée. Le gestionnaire de glissement définit la propriété dropAction d'un mouvement abandonné sur NativeDragAction.NONE.

Prise en charge du mouvement de glissement vers l'intérieur

Adobe AIR 1.0 et les versions ultérieures Pour prendre en charge le mouvement de glissement vers l'intérieur, votre application (ou, le plus souvent, un composant visuel de cette dernière) doit répondre aux événements nativeDragEnter ou nativeDragOver.

Etapes d'une opération de dépôt standard

Adobe AIR 1.0 et les versions ultérieures La série d'événements suivant est caractéristique d'une opération de dépôt : 1 L'utilisateur fait glisser un objet Clipboard vers un composant. 2 Le composant distribue un événement nativeDragEnter. 3 Le gestionnaire d'evénement nativeDragEnter examine l'objet événement pour vérifier les formats de données disponibles et les actions autorisées. Si le composant peutGER le dépôt, il appelle NativeDragManager.acceptDragDrop(). 4 NativeDragManager modifie le curseur de la souris pour indiquer que l'objet peut etre déposé. 5 L'utilisateur dépose l'objet sur le composant. 6 Le composant cible distribue un événement nativeDragDrop. 7 Le composant cible lit les données au format approprié à partir de l'objet Clipboard au sein de l'objet événement. 8 Si le mouvement de glissement a débuté dans une application AIR, l'objet initiateur interactif distribue un événement nativeDragComplete. Si le mouvement a débuté en dehors d'AIR, aucun compte rendu n'est envoyé.

Confirmation d'un mouvement de glissement vers l'intérieur

Adobe AIR 1.0 et les versions ultérieures

Lorsqu'un utilisateur fait glisser un élément Clipboard vers les limites d'un composant visuel, celui-ci distribue les événements nativeDragEnter et nativeDragOver. Pour déterminer si le composant peut accepter l'élement Clipboard, les gestionnaires de ces événements peuvent vérifier les propriétés clipboard et allowedActions de l'objet événement. Pour signaler que le composant peut accepter le dépôt, le gestionnaire d'évenement doit appeler la méthode NativeDragManager.acceptDragDrop() et transmettre une ↔reference au composant récepteur. Si plusieurs écouteurs d'évenement enregistrés appelent la méthode acceptDragDrop(), le dernier gestionnaire de la liste prime. L'objet acceptDragDrop() demeure valide jusqu'à ce que la souris quitte les limites de l'objet qui accepte l'élement, déclenchant ainsi l'évenement nativeDragExit. Si plusieurs actions sont autorisées par le paramètre allowedActions transmis à doDrag(), l'utilisateur peut indiquer l'action autorisée qu'il souhaite exécuter en maintainant enforcée une touche de modification. Le gestionnaire de glissement modifie l'image associée au curseur pour indiquer à l'utilisateur l'action qui se produitait s'il achèvait le dépôt. L'action prévue est signalée par la propriété dropAction de l'objet NativeDragEvent. L'action associée à un mouvement de glissement est définie à titre indicatif uniquement. Les composants impliqués dans le transfert doiventmetre en œuvre le comportement approprié. Pour achieve une action de déplacement, par exemple, l'initiateur du glissement peut supprimer l'élement glissé et la cible du dépôt peut l'ajouter. La cible du glissement peut limiter l'action de dépôt à l'une des trois actions générées en définissant la propriété dropAction de la classe NativeDragManager. Si un utilisateur tente de selectionner une autre action par le biais du clavier, NativeDragManager affiche le curseur unavailable. Définissez la propriété dropAction des gestionnaires associés aux événements nativeDragEnter et nativeDragOver. L'exemple suivant illustrer un gestionnaire associé à l'évenement nativeDragEnter ou nativeDragOver. Ce gestionnaire accepte un mouvement de glissement vers l'intérieur sous réserve que l'objet Clipboard en cours de glissement contienne des données au format texte. import flashdesktopNativeDragManager; import flash.eventsNativeDragEvent; public function onDragIn(event:NativeDragEvent):void{ NativeDragManager.dropAction = NativeDragActions.MOVE; if(event.clipboard.hasFormat(ClipboardFormats.TXT_format)){ NativeDragManager.acceptDragDrop(this); //'this' is the receiving component }

Achévement du dépôt

Adobe AIR 1.0 et les versions ultérieures

Lorsque l'utilisateur dépose un élément glissé sur un objet interactif qui a accepté le mouvement, ce dernier distribue un événement nativeDragDrop. Le gestionnaire de cet événement peut extraire les données de la propriété clipboard de l'objet événement. Si la propriété clipboard contient un format défini par l'application, le paramètre transferMode transmis à la méthode GetData() de l'objet Clipboard déterminée si le gestionnaire de glissement renvoie une ↔reference ou une version sérieisée de l'objet. L'exemple suivant illustrer un gestionnaire associé à l'évenement nativeDragDrop : import flashdesktop.Clipboard; import flash.events.NativeDragEvent; public function onDrop(event:NativeDragEvent):void { if (event.clipboard.hasFormat(ClipboardFormats.TXT_FORMAT)) { var text:String = String(event.clipboard_Data(ClipboardFormats.TXT_format, ClipboardTransferModeORIGINAL_PREFERRED)); } Lorsque le gestionnaire d'évenement se referme, l'objet Clipboard n'est plus valide. Tout tentative d'accès à l'objet ou aux données correspondantes génére une erreur.

Mise à jour de l'apparce visuelle d'un composant

Adobe AIR 1.0 et les versions ultérieures

Un composant peutmettreà joursonapparente visuelle enfonctiondes événementsNativeDragEvent.Le tableaucidessousdécritlestypesdemodificationseffectueesparun composantstandardenréponseàdivers événements:

EvénementDescription
nativeDragStartL'objet interactif initiateur peut utiliser l'événement nativeDragStart pour indiquer visuellement qu'il est la source du mouvement de glissement.
nativeDragUpdateL'objet interactif initiateur peut utiliser l'événement nativeDragUpdate pourmettre à jour son état au cours du mouvement. (Cet événement n'existe pas dans AIR pour Linux.)
nativeDragEnterUn objet interactif récepteur potentiel peut utiliser cet événement pour prendre le focus ou indiquer visuellement s'il peut ou non accepter le dépôt.
nativeDragOverUn objet interactif récepteur potentiel peut utiliser cet événement pour répondre au mouvement de la souris au sein de l'objet interactif (lorsque la souris pénétre dans une zone « sensible » d'un composant complexe tel qu'un plan de rues, par exemple).
nativeDragExitUn objet interactif récepteur potentiel peut utiliser cet événement pour restaurer son état lorsqu'un mouvement de glissement quitter ses limites.
nativeDragCompleteL'objet interactif initiateur peut utiliser cet événement pour mettre à jour le modele de données correspondant (en supprimant un élément d'une liste, par exemple) et restaurer son état visuel.

Suivi de la position de la souris lors d'un mouvement de glissement vers l'intérieur

Adobe AIR 1.0 et les versions ultérieures Si un mouvement de glissement survôle un composant, ce dernier distribue des événements nativeDragOver. Ces événements sont distribués toutes les quelques milliseconds, ainsi qu'à chaque déplacement de la souris. L'objet événement nativeDragOver permet également de déterminer la position de la souris au-dessus du composant. Connaître la position de la souris peut s'avérer utile dans des circonstances où le composant récepteur est complexe, mais ne possède pas de sous-composants. Par exemple, si votre application a affiché une image bitmap contenant une carte de rue et que vous souhaitez développer en évidence les zones de la carte dans lesquelles l'utilisateur a fait glisser des informations, vous pouvez utiliser les coordonnées de la souris indiquées par l'événement nativeDragOver pour assurer le suivi de la position de la souris au sein de la carte.

Opération glisser-deposer dans HTML

Adobe AIR 1.0 et les versions ultérieures Pour faire glisser des données vers une application HTML ou hors de cette dernière (ou vers le code HTML affché dans un objet HTMLLoader et hors de ce dernier), vous disposez des événements glisser-deposer HTML. L'API glisser-deposer HTML vous permet de faire glisser des données vers des éléments DOM ou à partir de ces derniers dans le contenu HTML. Remarque : vous pouvez également utiliser les API NativeDragEvent et NativeDragManager d'AIR en écouteant les événements sur l'objet HTMLLoader qui compte le contentu HTML. L'API HTML est toute fois mistrége au DOM HTML et permet de contrôler le comportement par défaut.

Comportement par défaut des mouvements glisser-déposer

Adobe AIR 1.0 et les versions ultérieures L'environnement HTML définit le comportement par défaut des actions glisser-deposer qui impliquent du texte, des images et des URL. Le comportement par défaut permet de faire glisser ces types de données hors d'un élément. Vous ne pouvez toute fois faire glisser que du texte vers un élément, sous réserve qu'il réside dans une zone modifiable de page. Lorsque vous faites glisser du texte entre des zones modifiables d'une page ou au sein de l'une de ces zones, le comportement par défaut consiste à exéçuter une action de déplacement. Lorsque vous faites glisser du texte vers une zone modifiable à partir d'une zone non modifiable ou de l'extérieur de l'application, le comportement par défaut consiste à exéçuter une action de copie. Voupez rempeler le comportement par defaut en gering vous-meme les événements glisser-deposer. Pour annuler le comportement par defaut, vous necez appeler les methodes preventDefault() des objets distribués suite aux événements glisser-deposer. Vous pouze ensuite inserer des données dans la cible du dépôt et supprimer les données de la source du glissement pour executer l'action selectionnée. Par défaut, l'utilisateur peut seLECTIONner et faire glisser n'importequel texte. Il peut faire glisser des images et des liens. La propriété CSS WebKit, -webkit-user-select, permet de contrôler le mode de selection de tout élément HTML. Par exemple, si vous définissez -webkit-user-select sur none, il est impossible de seLECTIONner les contenus d'élement et, par conséquent, de les faire glisser. La propriété CSS -webkit-user-drag permet également de déterminer s'il est possible de faire glisser un élément global. Le contenu de l'élement est toute fois traité séparément. L'utilisateur peut néanmoins faire glisser une section seLECTIONnée de texte. Pour plus d'informations, voir « CSS dans AIR » à la page 1015.

Evénements glisser-deposer dans HTML

Adobe AIR 1.0 et les versions ultérieures Les événements distribués par l'objet initiateur à l'origine d'un glissement sont indiqués dans le tableau suivant :

EvénementDescription
dragstartDistribué lorsque l'utilisateur démarre l'action de glissement. Le gestionnaire de cet événement peut, le cas échéant, interdire le glissement en appelant la méthode préventDefault() de l'objet événement. Pour déterminer si les données glissées peuvent être copiees, liées ou déplacées, définissez la propriété effectAllowed. Le texte, les images et les liens sélectionnées sont place dans le Presse-papiers par défaut, mais vous pouvez définir d'autres données pour le mouvement de glissement par le biais de la propriété dataTransfer de l'objet événement.
dragDistribué continulement pendant le mouvement de glissement.
dragendDistribué lorsque l'utilisateur relâche le bouton de la souris pour achiever l'action de glissement.

Les événements distribués par une cible de glissement sont les suivants :

EvénementDescription
dragoverDistribué continuèlement tant que le mouvement de glissement ne dépasse pas les limites de l'élémen. Le gestionnaire de cet événement doit définir la propriété dataTransfer.dropEffect pour indiquer si le dépôt entraine une action de copie, de déplacement ou de lien lorsque l'utilisateur relâche la souris.
dragenterDistribué lorsque le mouvement de glissement pénétre dans les limites de l'élement. Si vous modifie toute propriété d'un object dataTransfer dans un gestionnaire d'événement dragenter, ces modifications sont rapidement annulées par l'événement dragover suivant. En revanche, il se produit un bref salarié entre un événement dragenter et le premier événement dragover susceptible d'entrainer le clignotement du curseur si d'autres propriétés sont définies. Dans de nombreux cas de figure, vous pouvez utiliser le même gestionnaire pour les deux événements.
dragleaveDistribué lorsque le mouvement de glissement quitte les limites de l'élement.
dropDistribué lorsque l'utilisateur dépose les données sur l'élement. Seul le gestionnaire de l'événement peut accéder aux données en cours de glissement.

L'objet événement distribué en réponse à ces événements est similaire à un événement souris. Les propriétés d'événement souris telles que (clientX, clientY) et (screenX, screenY) permettent de déterminer la position de la souris. La principale propriété d'un objet événement drag correspond à dataTransfer, qui contient les données en cours de glissement. L'objet dataTransfer en tant que tel dispose des propriétés et méthodes suivantes :

Propriété ou méthodeDescription
effectAllowedEffet autorisé par la source du glissement. Le gestionnaire de l'événement dragstart définit généralement cette valeur. Pour plus d'informations, voir la section « Effets de glissement dans HTML » à la page 640.
dropEffectEffet sélectionné par la cible ou l'utilisateur. Si vous définissez la propriété dropEffect dans un gestionnaire d'événement dragover ou dragenter, AIR met à jour le curseur de la souris pour indiquer l'effet qui se produit lorsque l'utilisateur relâche le bouton de la souris. Si la propriété dropEffect définié ne correspond pas à l'un des effets autorisés, aucun dépôt n'est autorisé et le curseur unavailable s'affiche. Si vous n'avez pas définié de propriété dropEffect en réponse à l'événement dragover ou dragenter le plus récent, l'utilisateur peutCHOISIR L'un des effets autorisés par le biais des touches de modification standard gérées par le système d'exploitation.Lè dernier effet est signalé par la propriété dropEffect de l'objet distribué pour dragend. Si l'utilisateur abandonne le dépôt en relâchant le bouton de la souris hors d'une cible appropriée, la propriété dropEffect est définié sur none.
typesTableau contenant les chaînes de type MIME associées à chaque format de données que contient l'objet dataTransfer.
getData(mimeType)Extrait les données au format stipulé par le paramètre mimeType.La méthodegetData() ne peut être appelée qu'en réponse à l'événement drop.
setData(mimeType)Ajoute des données à l'objet dataTransfer au format stipulé par le paramètre mimeType. Vous pouvez ajouter des données dans divers formats en appelant la méthode setData() pour chaque type MIME. Toute donnée placée dans l'objet dataTransfer par le comportement de glissement par défaut est effacée.La méthode.setData() ne peut être appelée qu'en réponse à l'événement dragstart.
clearData(mimeType)Efface toute donnée au format stipulé par le paramètre mimeType.
setDragImage(image, offsetX, offsetY)Définit une image de glissement personalisée. Vous ne pouze appeler la méthode setDragImage() qu'en réponse à l'événement dragstart et uniquement lorsqu'un élément HTML entier fait l'objet d'un glissement en définissant le style CSS -webkit-user-drag sur element. Le paramètre image peut correspondre à un objet JavaScript Element ou Image.

Types MIME associés à l'évenement glisser-deposer HTML

Adobe AIR 1.0 et les versions ultérieures Les types MIME à utiliser avec l'objet dataTransfer d'un événement glisser-deposer HTML sont indiqués dans le tableau suivant :

Format de"Données"Type MIME
Texte"text/plain"
HTML"text/html"
URL"text/uri-list"
Image bitmap"image/x-vnd.adobe.air.bitmap"
liste de fischiers"application/x-vnd.adobe.air.file-list"

Vous disposez également d'autres chaînes MIME, notamment les chaînes définies par une application. D'autres applications risquent toute fois de ne pas pouvoir reconnaître ou utiliser les données transférées. Il vous incombe d'ajouter des données à l'objet dataTransfer dans le format attendu. Important: seul le code qui s'exécute dans le sandbox d'application peut acceder aux fichiers déposés. Toutte tentative de lecture ou de définition de propriété d'un object File au sein d'un sandbox hors application géné une erreur de sécurité. Pour plus d'informations, voir la section « Gestion des dépôts de fichier dans un sandbox HTML hors application » à la page 644.

Effets de glissement dans HTML

Adobe AIR 1.0 et les versions ultéieures

L'initiateur du mouvement de glissement peut limiter les effets de glissement autorisés en définissant la propriété dataTransfereffectAllowed du gestionnaire de l'événement dragstart. Les valeurs de chaîne suivantes sont prises en charge :

Valeur de chaineDescription
"none"Aucune opération de glissement n'est autorisée.
"copy"Les données sont copiées sur la cible, sans modifier l'original.
"link"Les données sont partagées avec la cible du dépôt par le biais d'un lien associé à l'original.
"move"Les données sont copiées sur la cible et supprimées de l'emplacement d'origine.
"copyLink"Les données peuvent être copiées ou liées.
"copyMove"Les données peuvent être copiées ou déplacées.
"linkMove"Les données peuvent être liées ou déplacées.
"All"Les données peuvent être copiées, déplacées ou liées. All correspond à l'effect par défaut lorsque vous interdisez le comportement par défaut.

La cible du mouvement de glissement peut définir la propriété dataTransfer.dropEffect pour indiquer l'action exécutée si l'utilisateur achève le dépôt. Si l'effet de dépôt fait partie des actions autorisées, le système affiche le curseur de copie, déplacement ou lien approprié. Dans le cas contraire, le système affiche le curseur unavailable. Si aucun effet de dépôt n'est défini par la cible, l'utilisateur peut désigner les actions autorisées par le biais des touches de modification. Le code suivant définit la valeur dropEffect dans les gestionnaires des événements dragover et dragenter :

function doDragStart(event) {
    event.dataTransfer.setData("text/plain", "Text to drag");
    event.dataTransfereffectAllowed = "copyMove";
}  
function doDragOver(event) {
    event.dataTransfer.dropEffect = "copy";
}  
function doDragEnter(event) {
    event.dataTransfer.dropEffect = "copy";
} 

Remarque: bien qu'il soit recommandé de définir systématiquement la propriété dropEffect dans le gestionnaire de l'évenement dragenter, notez que l'évenement dragover suivant réinitialise la valeur par défaut de la propriété. Définissez dropEffect en réponse aux deux événements.

Glissement des données hors d'un élément HTML

Adobe AIR 1.0 et les versions ultérieures

Le comportement par défaut permet de copier par glissement la plupart des contenus d'une page HTML. Vous pouvez contrôler le contentu autorisé à faire l'objet d'un glissement à l'aide des propriétés CSS -webkit-user-select et -webkit-user-drag. Remplacez le comportement glisser-deposer par défaut dans le gestionnaire de l' événement dragstart. Appelez la méthode setData() de la propriété dataTransfer de l'objet événement pour associier vos propres données au mouvement de glissement. Pour indiquer les effets de glissement pris en charge par un objet source lorsque vous ne vous fondez pas sur le comportement par défaut, définisse la propriété dataTransfereffectAllowed de l'objet distribué pour l'évenement dragstart. Vous disposez de n'importe qu'elle combinaison d'effets. Par exemple, si un élément source prend en charge les effets copy et link, définisse la propriété sur copyLink.

Définition des données glissées

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Ajoutez les données associées au mouvement de glissement dans le gestionnaire de l'évenement dragstart par le biais de la propriété dataTransfer. La méthode dataTransfer.setData() permet de placer les données dans le Presse-papiers en transmettant le type MIME et les données à transférer. Par exemple, si vous application contient un élément image doté de l'identifant imageOfGeorge, vous pouvez utiliser le gestionnaire d'évenement dragstart suivant. Cet exemple ajoute des représentations d'une photo de George en plusieurs formats de données, augmentant ainsi les chances d'utilisation des données glissées par d'autres applications. function dragStartHandler(event){ event.dataTransfereffectAllowed = "copy"; vardragImage = document.getElementByld("imageOfGeorge"); vardragFile new air.File(dragImage.src); event.dataTransfer.setData("text/plain","A picture of George"); event.dataTransfer.setData("image/x-vnd.adobe.air.bitmap",dragImage); event.dataTransfer.setData("application/x-vnd.adobe.air.file-list", new ArraydragFile)); } Remarque : lorsque vous appelez la méthode setData() de l'objet dataTransfer, aucune donnée n'est ajoutée par le comportement glisser-deposer par défaut.

Glissement de données dans un élément HTML

Adobe AIR 1.0 et les versions ultérieures

Le comportement par défaut n'autorise que le glissement de texte vers des zones modifiables de la page. Vous pouze indiquer qu'un élément et ses enfants peuventvenir modifiables en incluant l'attribut contentéditable dans la balise de début de l'élement. Vous pouze également rendre un document entier modifiable en définissant la propriété designMode de l'objet Document sur on. Voupez prenre en charge d'autres comportements de glissement vers l'intérieur en gerant les événements dragerter, dragover et drop de tout élément capable d'accepter les données glissées.

Activation du glissement vers l'intérieur

Adobe AIR 1.0 et les versions ultérièures Pour gérer le mouvement de glissement vers l'intérieur, vous devez au préalable annuler le comportement par défaut. Ecoutez les événements dragenter et dragover sur tout élément HTML à utiliser à titre de cible de dépôt. Dans les gestionnaires de ces événements, appepelez la méthode préventDefault() de l'objet événement distribué. Annuler le comportement par défaut permet aux zones non modifiables de receivevoir un dépôt.

Obtention des données déposées

Adobe AIR 1.0 et les versions ultériques Voupeuz acceder aux données deposees dans le gestionnaire de I'evénement ondrop : function doDrop(event){ droppedText = event.dataTransfer_Data("text/plain"); } Utilisez la méthode dataTransfer的数据() pour lire les données dans le Presse-papiers en transmettant le type MIME du format de données à lire. Pour identifier les formats de données disponibles, utilisez la propriété types de l'objet dataTransfer. Le tableau types contient la chaine de type MIME de chaque format disponible. Lorsque vous annulez le comportement par défaut pour les événements dragenter ou dragover, il vous incombe d'insérer toute donnée déposée à l'emplacement approprié dans le document. Il n'existe pas d'API permettant de convertir une position souris en point d'insertion au sein d'un élément. Cette restriction risque de compliquer la mise en œuvre des mouvements de glissement de type insertion.

Exemple : Annulation du comportement de glissement vers l'intérieur HTML par défaut

Adobe AIR 1.0 et les versions ultérièures Cet exemple met en œuvre une cible de dépôt qui affiche un tableau contenant tous les formats de données disponibles dans l'objet déposé. Le comportement par défaut permet d'autoriser le glissement du texte, des liens et des images au sein de l'application. L'exemple remplace le comportement de glissement vers l'intérieur par défaut de l'objet div faisant office de cible du dépôt. La principale étape du processus d'activation du contenu non modifiable de sorte à accepter un mouvement de glissement vers l'intérieur consiste à appeler la méthode préventDefault() de l'objet événement distribué pour les événements dragenter et dragover. En réponse à un événement drop, le gestionnaire convertit les données transférées en élément row HTML et insère la ligne dans un tableau pour l'afficher.

<html>
<head>
<title>Drag-and-drop</title>
<script language="javascript" type="text/javascript" src="AIRAliases.js"></script>
<script language="javascript">
function init(){
    var target = document.getElementById('target');
    target.addEventListener("dragenter", dragEnterOverHandler);
    target.addEventListener("dragover", dragEnterOverHandler);
    target.addEventListener("drop", dropHandler);
    var source = document.getElementById('source');
    source.addEventListener("dragstart", dragStartHandler);
    source.addEventListener("dragend", dragEndHandler);
    emptyRow = document.getElementById("emptyTargetRow");
}
function dragStartHandler(event){
    event.dataTransfereffectAllowed = "copy";
}
function dragEndHandler(event){
    air(trace(event.type + ": " + event.dataTransfer.dropEffect);
}
function dragEnterOverHandler(event){
    event前提是Default();
}
var emptyRow;
function dropHandler(event){
    for(var prop in event){
        air.trace(prop + " = " + event[prop]);
    }
    var row = document.createElement('tr');
    row_innerHTML = "<td>" + event.dataTransferGetData("text/plain") + "<td>" + "<td>" + event.dataTransferGetData("text/html") + "<td>" + "<td>" + event.dataTransferGetData("text.uri-list") + "<td>" + "<td>" + event.dataTransferGetData("application/x-vnd.adobe.air.file-list") + "<td>";
    var imageCell = document.createElement('td');
    if((event.dataTransfer.types.toString().search("image/x-vnd.adobe.air bitmap")) > -1) {
        imageCell.appendChild(event.dataTransferGetData("image/x-vnd.adobe.air bitmap"));
    }
    row.appendChild(imageCell);
    var parent = emptyRow.parentNode;
    parent.insertBefore(row, emptyRow);
}
</script>
</head>
<body onLoad="init()" style="padding:5px">
<div>
    <h1>Source</h1>
</body>
</script> 
<p>Items to drag:</p>
<ul id="source">
    <li>Plain text.</li>
    <li>HTML <b>formatted</b> text.</li>
    <li>A <a href="http://www.adobe.com">URL.</a></li>
    <li><img src="icons/AIRApp_16.png" alt="An image"/>></li>
    <li style="-webkit-user-drag:none;">
        Uses "-webkit-user-drag:none" style.
        </li>
        <li style="-webkit-user-select:none;">
            Uses "-webkit-user-select:none" style.
        </li>
    </ul>
</div>
<div id="target" style="border-style:dashed;">
    <h1 >Target</h1>
    <p>Drag items from the source list (or elsewhere).</p>
    <table id="displayTable" border="1">
        <tr><th>Plain text</th><th>Html text</th><th>URL</th><th>File list</th><th>Bitmap Data</th></tr>
    <tr>
        id="emptyTargetRow"><td>&nbsp;<td>&nbsp;<td>&nbsp;<td>&nbsp;<td>&nbsp;<td>&nbsp;<td>&nbsp;<td>&body><td></body>
    </html> 

Gestion des dépôts de fichier dans un sandbox HTML hors application

Adobe AIR 1.0 et les versions ultérieures Un contenu hors application ne peut pas accepter les objets File qui résultat d'un glissement des fichiers vers une application AIR. Il est également impossible de transmettre l'un de ces objets File à un contenu d'application via un pont de sandbox. (Il est nécessaire d'acceder aux propriétés d'objet pendant la serialisation.) Vous pouvez toute fois continuer à déposer des fichiers dans votre application en écouteant les événements nativeDragDrop AIR de l'objet HTMLLoader. En temps normal, si un utilisateur dépôse un fisier dans un cadre qui héberge un contenu hors application, l'évenement dépôt n'est pas propagé de l'enfant au parent. Toutefois, puisque les événements distribués par l'objet HTMLLoader (qui compte tous les contenus HTML d'une application AIR) ne sont pas intégrés au flux d'évenement HTML, vous pouvez continuer à receivevoir l'évenement dépôt dans un contenu d'application. Pour receivevoir l'évenement associé à un dépôt de fichier, le document parent ajoute un écouteur d'évenement à l'objet HTMLLoader par le biais de la référence fournie par window.htmlLoader:

window.htmlLoader.addEventListener("nativeDragDrop", function(event) { var filelist = event.clip鞘_Data(air.ClipboardFormats.FILE_LIST_FORMAT); air.trace(filelist[0].url); }); 

L'exemple suivant utilise un document parent qui charge une page enfant dans un sandbox distant (http://localhost/). Le parent écoute l'évenement nativeDragDrop sur l'objet HTMLLoader et suit en sortie le modele d'URL file.

<html>
<head>
<title>Drag-and-drop in a remote sandbox</title>
<script language="javascript" type="text/javascript" src="AIRAliases.js"></script>
<script language="javascript">
window.htmlLoader.addEventListener("nativeDragDrop", function(event) {
    var filelist = event.clip鞘的数据(air.ClipboardFormats.FILE_LIST_FORMAT);
    air(trace(fileist[0].url));
})
</script>
</head>
<body>
    <iframe src="child.html"
        sandboxRoot="http://localhost/" documentRoot="app:/"
        frameBorder="0" width="100%" height="100%" />
</iframe>
</body>
</html> 

Le document infant doit partager une cible de dépôt valide en appelant la méthode préventDefault() de l'objet Event dans les gestionnaires d'évenement HTML dragenter et dragover, sous peine que l'évenement dépôt ne se produit jamais.

<html>
<head>
<title>Drag and drop target</title>
<script language="javascript" type="text/javascript">
    function preventDefault(event) {
        event.preventDefault();
    }
</script>
</head>
<body ondragenter="preventDefault(event)" ondragover="preventDefault(event)" />
<div>
<h1>Drop Files Here</h1>
</div>
</body>
</html> 

Dépôt de fichiers promis

Adobe AIR 2 et ultérieur

Un fichier promis est un format de Presse-papiers de type glisser-deposer grâce auquel un utilisateur peut faire glisser un fichier qui n'existe pas encore hors d'une application AIR. Par le biais de fichiers promis, une application pourrait, par exemple, autoriser un utilisateur à faire glisser une icône de proxy vers un dossier du bureau. L'icône de proxy représentée un fichier ou des données dont la disponibilité est connue à une URL donnée. Lorsque l'utiliser dépose l'icône, le moteur d'exécution télécharge les données et écrit le fichier à l'emplacement de dépôt. La classe URFilePromise d'une application AIR permet de glisser-deposer des fischiers auxquels il est possible d'acceder à partir d'une URL. L'implémentation d'URLFilePromise figure dans la bibliothèque principale d'AIR et fait partie du kit de développement d'AIR 2. Utilisez le fisquier aircore.swc ou le fisquier aircore.swf qui réside dans le repertoire SDK frameworks/libs/air. Voupez egalent implacterer voire propre logique de fichier promis par le biais de I'interface IFilePromise (definie dans le package flashdesktop du moteur d'execution). D'un point de vue conceptuel, les fichiers promis sont similaires à un rendu différé qui fait appel à une fonction de gestion des données du Presse-papiers. Utilisez les fichiers promis au lieu d'un rendu différé lorsque vous glissez-déposez des fichiers. La technique de rendu différé entraine parfois des pauses indésirables du mouvement de glissement lors de la génération ou du téléchargement des données. Faites appel au rendu différé pour les opérations de copie et de collage, qui ne prennt pas en charge les fichiers promis.

Restrictions associées à l'utilisation de fichiers promis

Par rapport aux autres formats de données gérés par un Presse-papiers de type glisser-deposer, les fichiers promis sont soumis aux restrictions suivantes : - Si les fichiers promis peuvent être transférés à partir d'une application AIR, il est impossible de les déposer dans une application AIR. - Les fichiers promis ne sont pas pris en charge par tous les systèmes d'exploitation. La propriété Clipboard.supportsFilePromise permet de vérifier si les fichiers promis sont pris en charge sur le système hôte. Si un système ne prend pas en charge les fichiers promis, il vous incombe de proposer un autre mécanisme de téléchargement ou de génération des données de:fichier. - Il est impossible d'utiliser les fichiers promis avec le Presse-papiers de type copier et coller (ClipboardgeneralClipboard).

Voir aussi

flashdesktop.IFilePromise air/Desktop URLsFilePromise

Dépôt de fichiers distants

Adobe AIR 2 et ultérieur

La classe URLFilePromise permet de creer des objets de fichiers promis représentant les fichiers ou données disponibles à partir d'une URL. Ajoutez un ou plusieurs objets de fichiers promis au Presse-papiers en faisant appel au format de Presse-papiers FILE_PROMISE_LIST. Dans l'exemple suivant, un fichier unique, disponible à l'adresse http://www.example.com/foo.txt, est téléchargeé et enregistré à l'emplacement de dépôt sous le nom bar.txt. (Le nom du fichier distant et celui du fichier local ne sont pas nécessairement identiques.) if( ClipboardsupportsFilePromise) { var filePromise:URLFilePromise new URLFilePromise(); filePromise.request new URLRequest("http://example.com/foo.txt"); filePromise-relativePath = "bar.txt"; var fileList:Array new Array(filePromise); var clipboard:Clipboard new Clipboard(); clipboard.setData( ClipboardFormats.FILE_PROMISE_LIST_FORMAT, fileList); NativeDragManager.doDrag(dragSource, clipboard); } Vous pouvez autoriser l'utilisateur à faire glisser simultanément plusieurs fichiers en ajoutant d'autres objets de fichiers promis au tableau affecté au Presse-papiers. Vous pouvez également définir des sous-repertoires dans la propriété relativePath de sorte que certains ou la totalité des fichiers concernés par l'opération soient placés dans un sous-repertoire relatif à l'emplacement du dépôt. L'exemple suivant illustrer la procEDURE de lancement d'une opération de dépôt qui inclut plusieurs fischiers promis. Dans cet exemple, une page html, article.html, est placée dans le Presse-papiers en tant que fischier promis, accompagnée des deux fischiers d'images liés correspondants. Les images sont copées dans un sous-dossier images afin de conserver les liens relatifs. if( ClipboardsupportsFilePromise) { //Create the promise objects var filePromise:URLFilePromise new URLFilePromise(); filePromise.request new URlRequest("http://example.com/article.html"); filePromise-relativePath = "article.html"; var image1Promise:URLFilePromise new URlFilePromise(); image1Promise.request new URlRequest("http://example.com/images/img_1.jpg"); image1Promise(relativePath = "images/img_1.htm1"; var image2Promise:URLFilePromise new URlFilePromise(); image2Promise.request new URlRequest("http://example.com/images/img_2.jpg"); image2Promise(relativePath = "images/img_2.jpg"; //Put the promise objects onto the clipboard inside an array var fileList:Array = new Array(filePromise, image1Promise, image2Promise); var clipboard:Clipboard new Clipboard(); clipboard.setData(ClipboardFormats.FILE_PROMISE_LIST_FORMAT, fileList); //Start the drag operation NativeDragManager.doDrag( dragSource, clipboard); }

Implémentation de l'interface IFilePromise

Adobe AIR 2 et ultérieur

Pour associier des fischiers promis aux ressources auxquelles il est impossible d'acceder par le biais d'un objet URLFilePromise, vous pouvez implémenter l'interface IFilePromise dans une classe personnalisée. L'interface IFilePromise définit les méthodes et propriétés utilisées par le moteur d'exécution AIR pour acceder aux données à écrite dans un fjichier une fois le fjichier promis déposé. Une implementation d'IFilePromise transmet un autre objet au moteur d'exécution AIR qui fournit les données associées au filchier promis. Cet objet doit implémenter l'interface IDataInput, utilisé par le moteur d'exécution AIR pour dire les données. Par exemple, la classe URLFilePromise, qui implémente IFilePromise, fait appel à un objet URLSream en tant que fournisseur de données. AIR peut dire les données en mode synchrone et asynchrone. L'implémentation d'IFilePromise indique le mode d'accès pris en charge en renvoyant la valeur correspondante dans la propriété isAsync. Si un accès asynchrone aux données est proposé, l'objet fournisseur de données doit implémenter l'interface IEventDispatcher et distribuer les événements requis, tels que open, progress et complete. Voussupportezutiliser une classe personnalisee ou l'une des classes integreees suivantes en tant que fournisseur de données associéaun fichier promis: - ByteArray (accès synchrone) - FileStream (accès synchrone ou asynchrone) - Socket (accès asynchrone) - URLSream (accès asynchrone) Pour implémenter l'interface IFilePromise, vous devez fournir le code des fonctions et propriétés suivantes : open(): IDataInput — Renvoise l'objet fournisseur de données à partir duquel sont lues les données associées au fichier promis. L'objet doit implémenter l'interface IDataInput. Si les données sont proposées en mode asynchrone, l'objet doit également implémenter l'interface IEventDispatcher et distribuer les événements requis (voir « Utilisation d'un fournisseur de données asynchrone dans un fichier promis » à la page 650). - get relativePath(): String — Fournit le chemin d'accès, nom inclus, du fichier créé. Le chemin est résolu relativement à l'emplacement de dépôt choisi par l'utilisateur dans le cadre de l'opération de glisser-deposer. Pour vous assurer que le chemin utilise le caractère de séparation adapté au système d'exploitation hôte, faites appel à la constante File separators lorsque vous définisse des chemins contenant des repertoires. Vous pouze ajouter une fonction de définition (setter) ou utiliser un paramètre constructeur pour autoriser la définition du chemin à l'exécution. - get isAsync():Boolean — Indique au moteur d'exécution AIR si l'objet fournisseur de données fournit des données en mode asynchrone ou synchrone. - close():void — Fonction appelée par le moteur d'exécution une fois les données entièrement lues ou si une erreur empêche leur lecture complete. Vous pouvez faire appel à cette fonction pour nettoyer les ressources. - reportError(e:ErrorEvent):void — Fonction appelée par le moteur d'exécution s'il se produit une erreur lors de la lecture des données. Toutes les méthodes IFilePromise sont appelées par le moteur d'exécution dans le cadre d'une opération de glisser-deposer qui concerne le fichier promis. En règle générale, la logique de l'application ne devrait pas appeler directement ces méthodes.

Utilisation d'un fournisseur de données synchrone dans un fichier promis

Adobe AIR 2 et ultérieur

La technique d'implémentation de l'interface IFilePromise la plus simple consiste à utiliser un objet fournisseur de données synchrone tel que ByteArray ou un objet FileStream synchrone. Dans l'exemple suivant, un objet ByteArray est créé, rempli de données et renvoyé lorsque la méthode open() est appelée. package { import flashdesktop.IFilePromise; import flash.events.ErrorEvent; import flash.utils.ByteArray; import flash.utils.IMDataInput; public class SynchronousFilePromise implements IFilePromise { private const fileSize:int = 5000 //size of file data private var filePath:String = "SynchronousFile.txt"; public function get relativePath():String { returnfilePath; } public function get isAsync():Boolean { return false; } public function open():IDataInput { var fileContents:ByteArray newByteArray(); //Create some arbitrary data for the file for(var i:int = 0 ;i

Utilisation d'un fournisseur de données asynchrone dans un fichier promis

Adobe AIR 2 et ultérieur

Lorsque vous utilisez un objet fournisseur de données asynchrone, la propriété isAsync d'IFilePromise doit etre définie sur true et l'objet renvoyé par la méthode open () doit implémenter l'interface IEventDispatcher. Le moteur d'execution écoute plusieurs événements, permettant ainsi d'utiliser divers objets intégrés en tant que fournisseurs de données. Les événements progress sont, par exemple, distribués par les objets FileStream et URLSream, alors que les événements socketData sont distribués par les objets Socket. Le moteur d'exécution écoute les événements appropriés qui émanent de tous ces objets. Les événements suivants étayent le processus de lecture des données à partir de l'objet fournisseur de données : Event OPEN — Indique au moteur d'exécution que la source de données est préte. - ProgressEvent.PROGRESS — Indique au moteur d'exécution que les données sont disponibles. Le moteur d'exécution lit le volume de données disponibles dans l'objet fournisseur de données. - ProgressEvent.SOCKET_DATA — Indique au moteur d'exécution que les données sont disponibles. L'évenement socketData est distribué par les objets basés sur un socket. Pour les autres types d'objets, distribuez un événement progress. (Le moteur d'exécution écoute les deux événements pour savoir quand les données peuvent être lues.) Event.COMPLETE — Indique au moteur d'exécution que la lecture des données est terminée. Event.CLOSE — Indique au moteur d'exécution que la lecture des données est terminée. (A ce titre, le moteur d'exécution écoute les événements close et complete.) - IOErrorEvent.IOERROR — Indique au moteur d'exécution qu'il s'est produit une erreur lors de la lecture des données. Le moteur d'exécution abandonne la création de fichier et appelle la méthode close() d'IFilePromise. SecurityErrorEvent.SECURITY_ERROR — Indique au moteur d'exécution qu'il s'est produit une erreur liée à la sécurité. Le moteur d'exécution abandonne la création de fichier et appelle la méthode close() d'IFilePromise. - HTTPStatusEvent(HTTP_STATUS — Utilisé en conjunction avec httpResponseStatus par le moteur d'exécution pour s'assurer que les données disponibles représentent le contenu requis,只不过 qu'un message d'erreur (une page 404, par exemple). Les objets basés sur le protocole HTTP doivent distribuer cet événement. - HTTPStatusEvent(HTTP_RESPONSE_STATUS — Utilisé en conjunction avec httpStatus par le moteur d'exécution pour s'assurer que les données disponibles représentent le contenu requis. Les objets basés sur le protocole HTTP doivent distribuer cet événement. Le fournisseur de données doit distribuer ces événements dans l'ordre suivant : 1 événement open 2 événements progress ou socketData 3 événement complete ou close Remarque: les objets intégrés, FileStream, Socket et URLStream, distribuent automatiquement les événements appropriés. L'exemple suivant create un fichier promis en faisant appel à un fournisseur de données asynchrone personnelisé. La classe du fournisseur de données constitue une extension de ByteArray (pour la prise en charge d'Input) et implémente l'interface IEventDispatcher. A chaque événement associé à l'horloge, l'objet génére un bloc de données et distribue un événement « progress » pour averrir le moteur d'exécution que les données sont disponibles. Lorsque le volume de données produit est suffisant, l'objet distribue un événement « complete » package { import flash.events.Event; import flash.events.EventDispatcher; import flash.events.IEventDispatcher; import flash.events.ProGRESSEvent; import flash.events.TimerEvent; import flash.utils.ByteArray; import flash.utils.Timer; [Event(name = "open",type = "flash.events.Event Opens")] [Event(name = "complete",type = "flash.events.Event.COMPLET E)] [Event(name = "progress",type = "flash.events.ProGRESSEvent"] [Event(name = "ioError",type = "flash.events.IOErrorEvent")] [Event(name = "securityError",type = "flash.events.SecurityErrorEvent")] public class AsyncDataProvider extends ByteArray implements IEventDispatcher { private var dispatcher:EventDispatcher new EventDispatcher(); public var fileSize:int 0 //The number of characters in the file private const chunkSize:int 1000 //Amount of data written per event private var dispatchDataTimer:Timer new Timer(100); private var opened:Boolean false; public function AsyncDataProvider() { super(); dispatchDataTimer.addEventListener(TimerEvent.TIMER,统计数据); } public function begin():void{ dispatchDataTimer.start(); } public function end():void { dispatchDataTimer.stop(); } private function generateData(event:Event):void { if(!opened) { var open:Event new Event(Event.Open); dispatchEvent(open); opened true; } else if (position + chunkSize } else { var complete:Event = new Event(Event.COMPLET); dispatchEvent( complete ); } //IEventDispatcher implementation public function addEventListener(type:String, listener:Function, useCapture:Boolean=false, priority:int=0,useWeakReference:Boolean=false):void { dispatcher.addEventListener(type, listener,useCapture,priority,useWeakReference); } public function removeEventListener(type:String, listener:Function, useCapture:Boolean=false):void { dispatcher.removeEventListener(type, listener,useCapture); } public function dispatchEvent(event:Object):Boolean { return dispatcherdispatchEvent(event); } public function hasEventListener(type:String):Boolean { return dispatcher.hasEventListener(type); } public function willTrigger(type:String):Boolean { return dispatcher.willTrigger(type); } } Remarque: puisque la classe AsyncDataProvider utilisé dans l'exemple constitue une extension de ByteArray, elle ne peut pas etendre également EventDispatcher. Pour implémenter l'interface IEventDispatcher, la classe fait appel à un objet EventDispatcher interne et transmet à ce dernier les appeals de la méthode IEventDispatcher. Vous pouvez également etendre EventDispatcher et implémenter IDataInput (voire implémenter les deux interfaces). L'implémentation asynchrone d'IFilePromise est quasiment identique à l'implémentation synchrone, à quelques différences près : isAsync renvoie true et la méthode open() renvoie un objet de données asynchrone : package { import flashdesktop.IFilePromise; import flash.events.ErrorEvent; import flash.events.EventDispatcher; import flash.utils.IDataInput; public class AsynchronousFilePromise extends EventDispatcher implements IFilePromise { private var fileGenerator:AsyncDataProvider; private const fileSize:int = 5000 ; //size of file data private varfilePath:String = "AsynchronousFile.txt"; public function get relativePath():String { returnfilePath; } public function get isAsync():Boolean { return true; } public function open():IDataInput { fileGenerator = new AsyncDataProvider(); fileGenerator.size = FileSize; fileGenerator.begin(); return fileGenerator; } public function close():void { fileGenerator.end(); } public function reportError(e:ErrorEvent):void { trace("Something went wrong:" ^+ e失误ID ^+ " - " ^+ e.type + ", " ^+ e.text); } }

Chapitre 36 : Utilisation des menus

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Faites appel aux classes de l'API de menus contextuels pour modifier le menu contextual des applications Web Flex et Flash Player. Les classes de l'API de menus natifs permettent de définir des menus en incrustation, contextuels, de fenêtre et d'application dans Adobe® AIR*.

Principes de base des menus

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Pour obtenir une explication rapide de la création de menus natifs dans une application AIR et des exemples de code, voir les articles de démarrage rapide suivants dans Adobe Developer Connection : - Ajout de menus natifs à une application AIR (Flex) - Ajout de menus natifs à une application AIR (Flash) Les classes de menus natifs vous permettent d'acceder aux fonctions de menu natif du système d'exploitation sur lequel s'exécute votre application. Des objets NativeMenu peuvent être utilisés pour les menus d'application (sous Mac OS X), les menus de fenêtre (sous Windows et Linux), les menus contextuels et les menus en incrustation. En dehors d'AIR, vous dispose des classes de menus contextuels pour modifier le menu contextual automatique affché par Flash Player lorsqu'un utiliser clique avec le bouton droit de la souris ou en Maintenant la touche Commande enforcée sur un objet de votre application. (Aucun menu contextual automatique ne s'affiche pour les applications AIR.)

Classes de menus

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Les classes de menus sont les suivantes :
PackageClasses
flash.display• NativeMenu • NativeMenultem
flash.ui• ContextMenu • ContextMenultem
flash.events• Event • ContextMenuEvent

Types de menus

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures AIR prend en charge les types de menus suivants : Menu contextuels Un menu contextual s'affiche lorsque l'utilisateur clique avec le bouton droit de la souris ou en Maintenant la touche Commande enfoncée sur un objet interactif dans du contenu SWF ou sur un élément de document dans du contenu HTML. Un menu contextuel s'affiche automatiquement dans le moteur d'exécution Flash Player. Vous disposez des classes ContextMenu et ContextMenuItem pour ajouter vos propres commandes au menu. Vous pouvez également supprimer certaines des commandes intégrées, mais pas toutes. Dans le moteur d'exécution AIR, vous pouvez creator un menu contextual à l'aide de la classe NativeMenu ou ContextMenu. Un contenu HTML dans AIR vous permit d'utiliser les API Webkit HTML et JavaScript pour ajouter des menus contextuels aux éléments HTML. **Menu d'application (AIR uniquement)** Un menu d'application est un menu global qui s'applique à la totalité de l'application. Les menus d'application sont pris en charge par Mac OS X, mais pas par Windows ni Linux. Sous Mac OS x, le système d'exploitation créée automatiquement un menu d'application. Vous pouvez utiliser l'API de menus d'AIR pour ajouter des éléments et des sous-menus aux menus standard. Vous pouvez ajouter des écouteurs pour:gérer les commandes de menu existantes et vous pouvez supprimer des éléments existants. Menu de fenêtre (AIR uniquement) Un menu de fenêtre est associé à une fenêtre unique et s'affiche sous la barre de titre. Pour ajouter des menus à une fenêtre, vous creez un objet NativeMenu et l'effectez à la propriété menu du l'objet NativeWindow. Les menus de fenêtre sont pris en charge par les systèmes d'exploitation Windows et Linux, mais pas par Mac OS X. Les menus de fenêtre natifs ne peuvent être utilisés qu'avac les fenêtres disposant d'un chrome système. Menu d'icones de la barre d'etat système et du Dock (AIR uniquement) Similaires aux menus contextuels, les menus d'icone sont affectés à l'icone d'une application dans le Dock de Mac OS X ou dans la zone de notification de la barre des tâches de Windows et Linux. Les menus d'icones de la barre d'etat système et du Dock utilisent la classe NativeMenu. Sous Mac OS X, les éléments du menu sont ajoutés au-dessus des éléments standard du système d'exploitation. Sous Windows et Linux, le menu standard n'existe pas. Menu en incrustation (AIR uniquement) Un menu en incrustation AIR est similaire à un menu contextual mais il n'est pas nécessairement associé à un objet ou composant d'application spécifique. Vous pouvez afficher des menus en incrustation n'importe où dans une fenêtre en appelant la méthode display() de tout objet NativeMenu. Menu personalisés Les menus natifs sont dessinés entière par le système d'exploitation et, en tant que tels, existent en dehors des modèles de rendu Flash et HTML. Au lieu d'utiliser des menus natifs, vous pouvez créé des menus personalisés non natifs à l'aide de MXML, ActionScript, ou JavaScript (dans AIR). Les menus de ce type doivent s'afficher complètement dans le contenu d'une application. **Menus Flex** La structure Adobe® Flex™ propose a ensemble de composants de menu Flex. Les menus Flex sont dessinés par le moteur d'exécution只不过 que par le système d'exploitation et ne sont pas des menus nats. Il est possible d'utiliser un composant de menu Flex pour des fenêtres Flex sans chrome système. Autre avantage, vous pouvez spécifique des menus par déclaration au format XML. Si vous utilisez la structure Flex, faites appel aux classes de menu Flex pour les menus de fenêtre只不过 qu'aux classes natives. Les menus par défaut suivants sont proposés par le système d'exploitation ou une classe AIR intégrée : - Menu d'application sous Mac OS X - Menu d'icone du Dock sous Mac OS X - Menu contextual associé au texte et aux images sélectionnés dans du contenu HTML - Menu contextuel associé au texte sélectionné dans un objetTextField (ou un objet étendantTextField)

Présentation des menus contextuels

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Dans du contenu SWF, il est possible d'associer un menu contextuel à tout objet qui hérite des propriétés ou méthodes de InteractiveObject en affectant un objet menu à sa propriété(contextMenu. Plusieurs commandes sont incluses par défaut, notamment des commandes d'avance, de recul, d'impression, de qualité et de zoom. Dans le moteur d'exécution AIR, l'objet menu affecté à(contextMenu peut être de type NativeMenu ou ContextMenu. Dans le moteur d'exécution Flash Player, seule la classe ContextMenu est disponible. Voupe ouc couter les evenements des menus natifs ou des menus contextuels lorsque you utilisez les classes ContextMenu et ContextMenuItem ; les deux sont distribués. L'un des avantages des propriétés de l'objet ContextMenuEvent est que contextualMenuOwner identifie I'objet auquel le menu est associé et mouseTarget identifie I'objet sur lequel I'utilisateur a cliqué pour ouvrir le menu. Ces informations ne sont pas disponibles avec I'objet NativeMenuEvent. L'exemple suivant create un sprite et l'ajoute à un menu contextual edited simple :
var sprite:Sprite = new Sprite();   
sprite.contextMenu = create CONTEXTMenu()   
private function create CONTEXTMenu():ContextMenu{ var editContextMenu:ContextMenu = new ContextMenu(); var cutItem:ContextMenuItem = new ContextMenuItem("Cut") cutItem.addEventListener(ContextMenuItem event.MENU_ITEM_SELECT,doCutCommand); editContextMenu.customItems.push-cutItem); var copyItem:ContextMenuItem = new ContextMenuItem("Copy") copyItem.addEventListener(ContextMenuItem event.MENU_ITEM_SELECT,doCopyCommand); editContextMenu.customItems.push(copyItem); var pasteItem:ContextMenuItem = new ContextMenuItem("Paste") pasteItem.addEventListener(ContextMenuItem event.MENU_ITEM_SELECT,doPasteCommand); editContextMenu.customItems.push(pasteItem); return editContextMenu   
}   
private function doCutCommand(event:ContextMenuItem):void{trace("cut");}   
private function doCopyCommand(event:ContextMenuItem):void{trace("copy");}   
private function doPasteCommand(event:ContextMenuItem):void{trace("paste");} 
Remarque: contrairement au contenu SWF affiché dans un environnement de navigateur, dans AIR, les menus contextuels ne possèdent pas de commandes intégrées.

Personnalisation d'un menu contextual Flash Player

Dans un navigateur ou un fjichier de projection, les menus contextuels associés à un contenu SWF contiennent systématiquement des éléments intégrés. Vous pouvez supprimer toutes ces commandes par défaut du menu, à l'exception des commandes Paramètres et A propos. Lorsque vous définisse la propriété Stage showDefaultContextMenu sur false, ces commandes sont supprimées du menu contextual. Pour creer un menu contextual personnelé pour un objet d'affichage particulier, créez une occurence de la classe ContextMenu, appelez la méthode hideBuiltInItems() et affectez cette occurence à la propriété(contextMenu de cette occurrence de DisplayObject. L'exemple suivant créé un carré dessiné dynamiquement avec une commande de menu contextual qui permet de modifier sa couleur au hasard : var square:Sprite = new Sprite(); square.graphics.beginFill(0x000000); square.graphics.drawRect(0,0,100,100); square.graphics.endFill(); square.x = square.y = 10; addChild(square); var menuItem:ContextMenuItem = new ContextMenuItem("Change Color"); menuItem.addEventListener(ContextMenuItem event MENU_ITEM_SELECT,changeColor); var customContextMenu:ContextMenu = new ContextMenu(); customContextMenu.hideInItems(); customContextMenu(customItems.push(menuItem); square.contextMenu = customContextMenu; function changeColor(event:ContextMenuEvent):void { square.transform.colorTransform = getRandomColor(); } function getRandomColor():ColorTransform { return new ColorTransform(Math.random(),Math.random(),Math.random(),1,(Math.random() \* 512)-255,(Math.random() \*512)-255,0); }

Structure de menu natif (AIR)

Adobe AIR 1.0 et les versions ultérieures La structure des menus natifs est par nature hierarchique. Les objects NativeMenu contiennent des objets infant NativeMenuItem. Les objects NativeMenuItem qui représentent des sous-menus peuvent eux aussi contirn des objets NativeMenu. L'objet menu du niveau supérieur ou racine de la structure represente la barre de menus des menus d'application et de fenetre. (Les menus contextuels, dicones et en incrustation ne possedent pas de barre de menus.) Le schéma suivant illustrer la structure d'un menu typique. Le menu racine représenté la barre de menus et contient deux éléments de menu référentçant les sous-menus Fichier et Modifier. Le sous-menus Fichier de cette structure contient deux éléments de commande et un élément référentçant le sous-menus Ouvrir l'objet recent qui, lui-même, contient trois éléments. Le sous-menus Modifier contient trois commandes et un séparateur. ![](images/d31a2e8216f958195193abc166643c79e838efa756e897675edd8f90800592d7.jpg) Pour définit un sous-menu, vous doivent désposer d'un objet NativeMenu et d'un objet NativeMenuItem. L'objet NativeMenuItem définit le libellé affché dans le menu parent et permet à l'utilisateur d'ouvrir le sous-menu. L'objet NativeMenu sort de conteneur des éléments du sous-menu. Par le biais de sa propriété submenu, l'objet NativeMenuItem reflèction l'objet NativeMenu. Vous trouvrez un exemple de code qui cree ce menu à la section « Exemple de menu natif : menu de fenetre et d'application (AIR) » à la page 666.

Evénements de menu

Adobe AIR 1.0 et les versions ultérieures Les objets NativeMenu et NativeMenuItem distribuents tous des événements préparing, displaying, et select: Preparing : lorsque l'objet est sur le point de démarrer une interaction utilisateur, le menu et les sous-menus correspondants distribuent un événement préparing à tout écouteur enregistré. Parmi les interactions figurent l'ouverture du menu et la sélection d'une option par le biais d'un raccourci clavier. Remarque: l'évenement préparing n'est disponible que dans Adobe AIR 2.6 et les versions ultérieures. Displaying: juste avant son affichage, un menu et ses options distribuent un événement displaying à tout écouteur enregistré. Les événements préparing et displaying permettent de mettre à jour le contenu du menu ou l'apparace de l'options avant son affichage à l'intention de l'utilisateur. Par exemple, dans l'écouteur de l'évenement displaying d'un menu « Ouvrir un fichier récent », vous pourriez modifier les options de menu en fonction de la liste actuelle de documents affichés récemment. Si vous supprimez l'option de menu dont le raccourci clavier a déclenché un événement préparing, l'interaction de menu est annulée et aucun événement select n'est distribué. Les propriétés target et currentTarget de l'évenement correspondant toutes deux à l'objet auquel est associé l'écouteur, c'est-à-dire au menu en tant que tel ou à l'une de ses options. L'événement préparing est distribué avant l'événement displaying. Vous écoutez généralement l'un des deux événements, mais non les deux à la fois. Sélection: lorsque l'utilisateur désit une commande, l'élement distribue un événement select à tout écouteur enregistré. Les sous-menus ou les séparateurs ne distribuent jamais d'événements select car il est impossible de les sélectionner. Un événement select remonte d'un élément de menu vers son menu conteneur ou jusqu'au menu racine. Vous pouvez écouter les événements select directement sur un élément ou plus haut dans la structure de menu. Lorsque vous écoutez un événement select sur un menu, vous pouze identifier l'élement sélectionné à l'aide de la propriété target de l' événement. Lorsque l'événement remonte dans la hierarchie de menu, la propriété currentTarget de l'objet événement identifie l'objet menu actuel. Remarque: les objects ContextMenu et ContextMenuItem distribuènt des événements menuItemSelect et menuSelect, ainsi que des événements select, préparing et displaying.

Equivalents clavier des commandes de menus natifs (AIR)

Adobe AIR 1.0 et les versions ultérieures

Voupez afferet un équivalent clavier (parfois appelé accéléateur) à une commande de menu. L'élément de menu distribue un événement select à tout écouteur enregistré lorsque l'utiliseur appuie sur la touche ou la combinaison de touches. Le menu contenant l'élement doit appartenir au menu de l'application ou de la fenêtre active pour la commande à appeler. L'équivalent clavier se compose de deux parties : une chaine représentant la touche principale et un tableau de touches de modification sur lesquelles il est également nécessaire d'appuyer. Pour affercer une touche principale, définièsez la propriété keyEquivalent de l'objet de menu sur la chaine à caractère unique correspondant à cette touche. Si vous utilisez une majuscule, la touche Maj est automatiquement ajoutée au tableau de touches de modification. Sous Mac OS X, la touche Commande (Keyboard.COMMAN) est la touche de modification par défaut. Sous Windows et Linux, il s'agit de la touche Ctrl (Keyboard.CONTROL). Ces touches par défaut sont automatiquement ajoutées au tableau de touches de modification. Pour utiliser d'autres touches de modification, affectez un nouveau tableau contenant les codes de touche souhaits à la propriété keyEquivalentModifiers. Le tableau par défaut est remplaça. Que vous utilisiez les touches de modification par défaut ou votre propre tableau de touches de modification, la touche Maj est ajoutée si la chaine que vous affectez à la propriété keyEquivalent est une dette majuscule. Les constantes correspondant aux codes de touche à utiliser pour les touches de modification sont définies dans la classe Keyboard. La chaîne d'équivalent clavier affectée est automatiquement affichée en regard du nom de l'élément de menu. Le format varie selon le système d'exploitation et les préférences système de l'utilisateur. Remarque: si vous affectez la valeur Keyboard. COMMAND à un tableau de touches de modification sous Windows, notamment clavier n'est affché dans le menu. En revanche, il est impératif d'utiliser la touche Ctrl pour activer la commande de menu. L'exemple suivant affecte I'équivalent clavier Ctrl+Maj+G à un élément de menu :
var item:NativeMenuItem = new NativeMenuItem("Ungroup");  
item.keyEquivalent = "G"; 
L'exemple suivant affecte l'equivalent clavier Ctrl+Maj+G en définissant directement le tableau de modification :
var item:NativeMenuItem = new NativeMenuItem("Ungroup");  
item.keyEquivalent = "G";  
item.keyEquivalentModifiers = [Keyboard.CONTROL]; 
Remarque : les équivalents clavier sont uniquement déclenchés pour les menus d'application et de fenêtre. Un équivalent clavier ajouté à un menu contextuel ou à un menu en incrustation est indiqué dans le libellé du menu, mais la commande de menu associée n'est jamais appelée.

Mnémoniques (AIR)

Adobe AIR 1.0 et les versions ultérieures

Les mnémoniques font partie de l'interface clavier du système d'exploitation pour les menus. Linux, Mac OS X et Windows permettent d'ouvrir des menus et de selectionner des commandes par le biais du clavier mais il existe quelques petites différences. Sous Mac OS X, l'utilisateur saisit la ou les deux premières lettres du menu ou de la commande et appuie sur Entrée. La propriété mnemonicIndex est ignoreré. Sous Windows, seule une dette est significative. Par défaut, elle correspond au premier caractère du libellé mais si vous affectez une mnémonique à un élément de menu, la dette désignée devient le caractère significatif. Si deux éléments d'un menu possèdent le même caractère significatif (qu'une mnémonique ait été affectée ou non), l'interaction avec le menu à partir du clavier change légèrement. Plutôt que d'appuyer sur une seule dette pour sélectionner le menu ou la commande, l'utilisateur appuie sur la dette autant de fois que nécessaire pourmettre en évidence l'élement souhaité, puis il appuie sur la touche Entrée pour confirmer la sélection. Pour garantir un comportement cohérent, il est préfébable d'affector une seule mnémonique à chaque élément d'un menu sous Windows. Sous Linux, aucune mnemonique n'est fournie par defaut. Pour fournir une mnemonique, vous devez définir la valeur de la propriété mnemonicIndex d'un élément de menu. Sécífiez le caractère mnémonique en tant qu'index dans la chaîne de libellé. L'in dex du premier caractère d'un libellé est 0. Ainsi pour utiliser le « r » comme mnémonique d'un menu intitulé « Format », vous définissez la propriété mnémonicIndex sur 2.
var item:NativeMenuItem = new NativeMenuItem("Format");  
item.mnemonicIndex = 2; 

Etat d'un élément de menu

Adobe AIR 1.0 et les versions ultérieures

Les éléments de menu possèdent deux propriétés d'etat : checked (coché) et en股本d (actév): checked Définissez cette propriété sur true pour afficher une coche en regard du libellé de l'élement.
var item:NativeMenuItem = new NativeMenuItem("Format");  
item.checked = true; 
enabled Faites basculer la valeur entre true et false pour vérifier si la commande est activée. Les éléments désactivés sont affichés « en grisé » et ne distribuient pas d'énements select.
var item:NativeMenuItem = new NativeMenuItem("Format");  
item.enabled = false; 

R attachment d'un objet à un élément de menu

Adobe AIR 1.0 et les versions ultérieures

La propriété data de la classe NativeMenuItem vous permit de referrer un objet arbitraire dans chaque élément. Par exemple, dans un menu « Ouvrir un fjichier recent», vous pourriez affecter lobjet File associé à chaque document à chaque éléments de menu.
var file:File = File.applicationStorageDirectory resolverPath("GreatGatsby.pdf")  
var menuItem:NativeMenuItem = docMenu.addItem(new NativeMenuItem(file.name));  
menuItem.data = file; 

Déception de menus natifs (AIR)

Adobe AIR 1.0 et les versions ultérieures Cette rubrique explique comment creer les differents types de menus natifs pris en charge par AIR.

Création d'un objet menu racine

Adobe AIR 1.0 et les versions ultérieures Pour creer un objet NativeMenu en tant que racine du menu, utilisez le constructeur NativeMenu :
var root: NativeMenu = new NativeMenu(); 
Dans les menus d'application et de fenêtre, le menu racine représenté la barre de menus et doit uniquement contérer des éléments donnant accès à des sous-menus. Les menus en incrustation et les menus contextuels ne possèdent pas de barre de menus. Le menu racine peut donc contérer des commandes et des séparateurs, ainsi que des sous-menus. Une fois le menu créé, vous pouze lui ajouter des éléments de menu. Les éléments figurent dans le menu dans l'ordre dans lequel vous les ajoutez, à moins que vous ne les ajoutiez à un index spécifique à l'aide de la méthode addItem ( ) d'un objet menu. Affectez le menu en tant que menu d'application, de fenêtre, d'icone ou contextuel ou affichez-le en tant que menu en incrustation, comme indiqué dans les sections suivantes :

Définition d'un menu d'application ou de fenêtre

Le code doit prendre en charge à la fois les menus d'application (gérés sous Mac OS) et les menus de fenêtre (gérés sous d'autres systèmes d'exploitation). var root:NativeMenu = new NativeMenu(); if (NativeApplicationsupportsMenu) { NativeApplication nativeApplicationmenu root; } else if (NativeWindowsupportsMenu) { nativeWindow menu root; Remarque: Mac OS définit, pour chaque application, un menu contenant des éléments standard. L'affection d'un nouvel objet NativeMenu à la propriété menu de l'objet NativeApplication remplace le menu standard. Libre à vous de conserver ce menu standard只不过 que de le replacer. Adobe Flex contient une classe FlexNativeMenu qui permet de creer facilement des menus pris en charge sur toutes les plateformes. Si vous utilisez Flex Framework, faites appel aux classes FlexNativeMenu au lieu de la classe NativeMenu.

Définition d'un menu contextuel associé à un objet interactif

interactiveObject.contextMenu = root;

Définition d'un menu d'icone du Dock ou d'un menu d'icone de la barre d'état système

Le code doit prendre en charge à la fois les menus d'application (gérés sous Mac OS) et les menus de fenêtre (gérés sous d'autres systèmes d'exploitation). if (NativeApplicationsupportsSystem TrayIcon) { System TrayIcon(NativeApplication.nativeApplication.icon).menu root; } else if (NativeApplicationsupportsDockIcon) { DockIcon(NativeApplication.nativeApplication.icon).menu root; Remarque: Mac OS X définit un menu standard pour l'icone du Dock d'une application. Lorsque vous affectez un nouvel objet NativeMenu à la propriété menu de l'objet DockIcon, les éléments de ce menu sont affichés au-dessus des éléments standard. Il est impossible de supprimer ou de modifier les éléments standard ou d'y acceder.

Affichage d'un menu en incrustation

root.display(stage, x, y);

Voir aussi

Développement d'applications AIR multiplateformes

Creation d'un sous-menu

Adobe AIR 1.0 et les versions ultérieures

Pour creer un sous-menu, vous ajoutez un objet NativeMenuItem au menu parent, puis vous affectez l'objet NativeMenu définitant le sous-menu sur la propriété submenu de l'objet. AIR you propose deux méthodes de creation des éléments de sous-menu et de l'objet menu associé : Vou puez creer un element de menu et son objet menu associé en une seule opération à l'aide de la méthode addSubmenu(): var editMenuItem:NativeMenuItem = root.addSubmenu(new NativeMenu(), "Edit"); Vou puez aussi creator l'objet de menu et ensuite seulement affecter l'objet menu à sa propriété submenu : var editMenuItem:NativeMenuItem = root.addItem("Edit", false);editMenuItem.submenu = new NativeMenu();

Création d'une commande de menu

Adobe AIR 1.0 et les versions ultérieures

Pour creer une commande de menu, ajoutez un objet NativeMenuItem à un menu et ajoutez un écouteur d'évenement réferencerant la fonction qui met en œuvre la commande de menu : var copy: NativeMenuItem = new NativeMenuItem("Copy", false); copy.addEventListener(Event.SELECT, onCommand); editMenu.addItem.copy); Vou puez ecouter I'evenement select sur I'elément commande meme ( comme illustrer dans I'exemple) ou sur un objet menu parent. Remarque : les éléments de menu qui représentent des sous-menus et des séparateurs ne distribuient pas d'événements select et vous ne pouvez donc pas les utiliser en tant que commandes.

Creation d'un séparateur de menu

Adobe AIR 1.0 et les versions ultérieures

Pour creer un séparateur, créez un objet NativeMenuItem, en définissant le paramètre isSeparator sur true dans le constructeur. Ajoutez ensuite le séparateur au menu à l'emplacement approprié: var separatorA:NativeMenuItem = new NativeMenuItem("A", true);editMenu.addItem(separatorA); Le libellé spécifique pour le séparateur, le cas échéant, n'est pas affché.

A propos des menus contextuels dans un contenu HTML (AIR)

Adobe AIR 1.0 et les versions ultérieures

Dans un contenu HTML affché à l'aide de l'objet HTMLLoader, l'évenement contextmenu permet d'afficher un menu contextual. Par défaut, un menu contextual est affché automatiquement lorsque l'utilisateur appelle l'évenement contextmenu sur le texte sélectionné (en cliquant avec le bouton droit de la souris ou en cliquant tout en appuyant sur la touche Commande). Pour empêcher l'affichage du menu par défaut, écoutez l'évenement contextmenu et appelez la méthode préventDefault() de l'objet événement : functionshow CONTEXTMenu(event){ eventpreventDefault(); } Vous pouvez ensuite ouvrir un menu contextuel personnalisé à l'aide des techniques DHTML ou en affichtant un menu contextuel natif AIR. Dans l'exemple suivant, un menu contextuel natif s'affiche sur appel de la méthode display() du menu en réponse à l'évenement HTML(contextmenu:
<html>
<head>
<script src="AIRAliases.js" language="JavaScript" type="text/javascript"></script>
<script language="javascript" type="text/javascript">
function showContextMenu(event) {
    eventpreventDefault();
    contextMenu.displaywindow-nativeWindow stage, event.clientX, event.clientY);
}
function createContextMenu(){
    var menu = new airNativeMenuItem();
    var command = menu.addItem(new airNativeMenuItem("Custom command"));
    command.addEventListener(air.Event.SELECT, onCommand);
    return menu;
}
function onCommand(){
    air.trace("Context command invoked.");
}
var CONTEXTMenu = createContextMenu();
</script>
</head>
<body>
<p oncontextmenu="showContextMenu(event)" style=-khtml-user-select:auto; ">Custom context menu.</p>
</body>
</html> 

Affichage de menus natifs en incrustation (AIR)

Adobe AIR 1.0 et les versions ultérieures

Vous pouvez afficher tout objet NativeMenu à tout moment et à tout emplacement au-dessus d'une fenetre en appelant la méthode display() du menu. Cette méthode exigeant une referencia à la scene, seul le contenu figurant dans le sandbox de l'application peut afficher un menu en incrustation. La méthode suivante affiche le menu défini par l'objet NativeMenuPopupMenu en réponse à un clic de souris :
private function onMouseClick(event:事故发生):void{PopupMenu.display(event.target.stage, event.targetX, event.targetY); 
Remarque: il est inutile d'afficher le menu directement en response à un événement. N'importe qu'elle méthode peut appeler la fonction display().

Gestion des événements de menu

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Un menu distribue des événements lorsque l'utilisateur seLECTIONne le menu ou l'un de ses éléments.

Récapitulatif des événements associés aux classes de menu

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Ajoutez des écouteurs d'évenement à des menus ou à des éléments individuels pour gérer les événements de menu.
ObjectEvénements distribués
NativeMenu (AIR)Event.PREPARING (Adobe AIR 2.6 et les versions ultérieures)
Event.DISPLAYING
Event.SELECT (propagé à partir des sous-menus et éléments infant)
NativeMenultem (AIR)Event.PREPARING (Adobe AIR 2.6 et les versions ultérieures)
Event.SELECT
Event.DISPLAYING (propagé à partir du menu parent)
ContextMenuContextMenuItem.MENU_SELECT
ContextMenultemContextMenuItem.MENU_ITEM_SELECT
Event.SELECT (AIR)

Evénements de menu select

Adobe AIR 1.0 et les versions ultérieures Pour gérer un click sur un élément de menu, ajoutez à l'objet NativeMenuItem un écouteur d'évenement relatif à l'évenement select:
var commandX:NativeMenuItem = new NativeMenuItem("Command X");  
commandX.addEventListener(Event.SELECT, doCommandX) 
Comme les événements select remontent jusqu'àux menus conteneur, vous pouvez aussi les écouter sur un menu parent. Lorsque vous écoutez au niveau d'un menu, vous pouvez utiliser la propriété target de l'objet événement pour déterminer la commande de menu SéLECTIONNée. L'exemple suivant suit la trace du libellé de la commande séLECTIONnée : var colorMenuItem:NativeMenuItem = new NativeMenuItem("Choose a color"); var colorMenu:NativeMenu = new NativeMenu(); colorMenuItem.submenu colorMenu; var red:NativeMenuItem = new NativeMenuItem("Red"); var green:NativeMenuItem = new NativeMenuItem("Green"); var blue:NativeMenuItem = new NativeMenuItem("Blue"); colorMenu.addItem(red); colorMenu.addItem(green); colorMenu.addItem(blue); if (NativeApplicationsupportsMenu){ NativeApplication-nativeApplication menu.addItem(colorMenuItem); NativeApplication-nativeApplication menu.addEventListener(Event.SELECT, colorChoice); } else if (NativeWindowsupportsMenu){ var windowMenu:NativeMenu = new NativeMenu(); this.state-nativeWindow menu = windowMenu; windowMenu.addItem(colorMenuItem); windowMenu.addEventListener(Event.SELECT, colorChoice); } function colorChoice(event:Event):void { var menuItem:NativeMenuItem = event.target as NativeMenuItem; trace(menu.item.label + " has been selected"); Si vous utilisez la classe ContextMenuItem, vous pouvez écouter l'évenement select ouMenuItemSelect. L'évenement menuItemSelect donne des informations complémentaires sur l'objet auquel appartient le menu contextualuel, mais ne remonte pas jusqu'àux menus conteneur.

Evénements de menu displaying

Adobe AIR 1.0 et les versions ultérieures Pour gérer l'ouverture d'un menu, vous pouvez ajouter un événement displaying, qui est distribué avant l'affichage d'un menu. L'événement displaying permet demettre à jour le menu, par exemple en ajoutant ou supprimant des éléments, ou en actualisant l'état, activé ou coché, d'éléments individuels. Vous pouvez également écouter l'événement menuSelect à partir d'un objet ContextMenu. Dans AIR 2.6 et les versions ultérieures, vous disposez de l'évenement préparing pourmettre à jour un menu en réponse à l'affichage d'un menu ou à la selection d'une option par le biais d'un raccourci clavier.

Exemple de menu natif : menu de fenêtre et d'application (AIR)

Adobe AIR 1.0 et les versions ultérieures L'exemple suivant creé le menu affié à la section « Structure de menu natif (AIR) » à la page 657. De par sa conception, ce menu fonctionne sous Windows, qui prend uniquement en charge les menus de fenêtre, et sous Mac OS X, qui prend uniquement en charge les menus d'application. Pour faire la distinction, le constructeur de la classe MenuExample vérifie les propriétés supportsMenu statiques des classes NativeWindow et NativeApplication. Si NativeWindowsupportsMenu est défini sur true, le constructeur create un objet NativeMenu pour la fenêtre, puis cree et ajoute les sous-menus File et Edit. Si NativeApplicationsupportsMenu est défini sur true, le constructeur cree les menus File et Edit, et les ajoute au menu existant que propose le système d'exploitation Mac OS X. L'exemple suivant illustré également la gestion des événements de menu. L'évenement select est géré au niveau des éléments et au niveau du menu. Chaque menu du chainage allant du menu contenant l'objet selectionné au menu racine répond à l'évenement select. L'évenement displaying est utilisé avec le menu « Ouvrir un fjicher recent ». Juste avant l'ouverture du menu, ses éléments sont actualisés à partir du tableau recent Documents (qui, dans cet exemple, resteinché). Bien que cette procédure ne soit pas illustrée dans cet exemple, vous pouvez également écouter des événements displaying sur des éléments individuels. package { import flash.display.Nativemenu; import flash.display.NativemenuItem; import flash.display.Nativewindow; import flash.display.Sprite; import flash.events.Event; import flash.filesystem.File; import flash.scdtypNativeApplication; public class MenuExample extends Sprite { private var recentDocuments:Array = new Array(new File("app-storage:/GreatGatsby.pdf"), new File("app-storage:/WarAndPeace.pdf"), new File("app-storage:/Iliad.pdf")); public function MenuExample() { var fileMenu:NativemenuItem; var editMenu:NativemenuItem; if (NativeWindowsupportsMenu){ stage.nativewindowmenu new NativeMenu(); stage.nativewindowmenu.addEventListener(Event.SELECT,selectCommandMenu); fileMenu stage.nativewindowmenu.addItem(new NativeMenuItem("File")); fileMenu.submenu createFileMenu(); editMenu stage.nativewindowmenu.addItem(new NativeMenuItem("Edit")); editMenu.submenu createEditMenu(); } if (NativeApplicationsupportsMenu){ NativeApplication.nativewindowmenu.addEventListener(Event.SELECT, selectCommandMenu); fileMenu NativeApplication.nativewindowmenu.addItem(new NativeMenuItem("File")); fileMenu.submenu createFileMenu(); editMenu NativeApplication.nativewindowmenu.addItem(new NativeMenuItem("Edit")); editMenu.submenu createEditMenu(); }
public function createFileMenu():NativeMenu {
    var fileMenu:NativeMenu = new NativeMenu();
    fileMenu.addEventListener(Event.SELECT, selectCommandMenu);
    var newCommand:NativeMenuItem = fileMenu.addItem(new NativeMenuItem("New"));
    newCommand.addEventListener(Event.SELECT, selectCommand);
    var saveCommand:NativeMenuItem = fileMenu.addItem(new NativeMenuItem("Save"));
    saveCommand.addEventListener(Event.SELECT, selectCommand);
    var openRecentMenu:NativeMenuItem =
        fileMenu.addItem(new NativeMenuItem("Open Recent"));
    openRecentMenu.submenu = new NativeMenu();
    openRecentMenu.submenu.addEventListener(Event.DISPLAYING,
            updateRecentDocumentMenu);
    openRecentMenu.submenu.addEventListener(Event.SELECT, selectCommandMenu);
    return fileMenu;
}
public function createEditMenu():NativeMenu {
    var editMenu:NativeMenu = new NativeMenu();
    editMenu.addEventListener(Event.SELECT, selectCommandMenu);
    var copyCommand:NativeMenuItem = editMenu addItem(new NativeMenuItem("Copy"));
    copyCommand.addEventListener(Event.SELECT, selectCommand);
    copyCommand.keyEquivalent = "c";
    var pasteCommand:NativeMenuItem =
        editMenu.addItem(new NativeMenuItem("Paste");
    pasteCommand.addEventListener(Event.SELECT, selectCommand);
    pasteCommand.keyEquivalent = "v";
    editMenu.addItem(new NativeMenuItem("", true));
    var preferencesCommand:NativeMenuItem =
        editMenu.addItem(new NativeMenuItem("Preferences"));
    preferencesCommand.addEventListener(Event.SELECT, selectCommand);
    return editMenu;
}
private function updateRecentDocumentMenu(event:Event):void {
    trace("Updating recent document menu.");
    var docMenu:NativeMenu = NativeMenu(event.target);
    for each (var item:NativeMenuItem in docMenu.items) {
        docMenu.removeItem(item);
    }
    for each (var file:File in recentDocuments) {
        var menuItem:NativeMenuItem =
            docMenu.addItem(new NativeMenuItem(file.name));
        menuItem.data = file;
        menuItem.addEventListener(Event.SELECT, selectRecentDocument);
    }
} 
private function selectCommand(event:Event):void { trace("Selected command: " + event.target.label); } private function selectCommandMenu(event:Event):void { if (event.currentTarget.parent != null) { varMenuItem:NativeMenuItem = findItemForMenu(NativeMenu(event.currentTarget)); if (menuItem != null) { trace("Select event for \\"" + event.target.label + "\\" command handled by menu: " + menuItem.label); } } else { trace("Select event for \\"" + event.target.label + "\\" command handled by root menu.)); } private function findItemForMenu(menu:NativeMenu):NativeMenuItem { for each (var item:NativeMenuItem in menu.parent.items) { if (item != null) { if (item.submenu == menu) { return item; } } } } return null; } } 

Chapitre 37: Icones de la barre des tâches dans AIR

Adobe AIR 1.0 et les versions ultérieures La plupart des systèmes d'exploitation disposent d'une barre des tâches, comme le Dock de Mac OS X, pouvant conténir une icône en vue de représentier une application. Adobe® AIR® dispose d'une interface permettant d'interagir avec l'icone de la barre des tâches de l'application par le biais de la propriété NativeApplication nativeApplication.icon. - Utilisation des icônes de la barre d'état système et du Dock (Flex) - Utilisation des iconones de la barre d'etat système et du Dock (Flash)

Voir aussi

flash desktop. Native Application flash/Desktop.DockIcon flash desktop\System TrayIcon

A propos des icones de la barre des tâches

Adobe AIR 1.0 et les versions ultérieures AIR create l'objet NativeApplication.nativeApplication.icon automatiquement. Selon le système d'exploitation, le type d'objet est soit DockIcon soit System TrayIcon. Les propriétés NativeApplicationsupportsDockIcon et NativeApplicationsupportsSystem TrayIcon vous permettent de déterminer les sous-classes InteractiveIcon prises en charge par AIR sur le système d'exploitation actuel. La classe de base InteractiveIcon fournit les propriétés width, height et bitmaps, qui vous permettent de modifier l'image utilisée pour l'icone. En revanche, l'accès aux propriétés spécifique à l'objet DockIcon ou System TrayIcon sur le mauvais système d'exploitation générale une erreur d'exécution. Pour définitir ou modifier l'image utilisée pour une icône, créez un tableau contenant une ou plusieurs images, puis affectez-le à la propriété NationaleApplication.nativeApplication.icon.bitmaps. La taille des icônes de la barre des tâches peut varier d'un système d'exploitation à l'autre. Pour éviter la dégradation de l'image provoquée par la mise à l'échelle, vous pouvez ajouter plusieurs tailles d'image au tableau bitmaps. Si vous fournissez plusieurs images, AIR sélectionne la taille plus proche de la taille d'affichage actuelle de l'icône de la barre des tâches et, le cas échéant, met ces images à l'échelle. Dans l'exemple suivant, l'image d'une icône de la barre des tâches est définie à l'aide de deux images : NativeApplication nativeApplication.icon.bitmaps = [bmp16x16 bitmapData, bmp128x128 bitmapData]; Pour modifier l'image d'une icône, affectez un tableau contenant la ou les nouvelles images à la propriété bitmaps. Voupez animer l'icone en modifient l'image en réponse à un événement enterFrame ou timer. Pour supprimer l'icone de la zone de notification sous Windows et Linux, ou pour restaurer l'apparance de l'icone par défaut sous Mac OS X, définissez bitmaps sur un tableau vide : NativeApplication nativeApplication.icon.bitmaps = [];

Icones du Dock

Adobe AIR 1.0 et les versions ultérieures AIR prend en charge les icônes du Dock lorsque la propriétéNativeApplicationsupportsDockIcon est définie sur true. La propriétéNativeApplication.nativeApplication.icon représenté l'icone de l'application sur le Dock (et non l'icone de la fenêtre). Remarque: AIR ne permet pas de modifier les icônes de fenêtre sur le Dock sous Mac OS X. Par ailleurs, les modifications apportées à l'icone du Dock de l'application ne sont appliquées que lorsqu'une application est en cours d'exécution; l'icone retrouverse son aspect normal lorsque vous quitterz l'application. Adobe AIR 1.0 et les versions ultérieures Vous pouvez ajouter des commandes au menu du Dock standard en créé un objet NativeMenu contenant les commandes, puis en l'affectant à la propriété NativeApplication.nativeApplication.icon MENU. Les éléments du menu s'affichent au-dessus des options de menu de l'icone du Dock standard.

Rebond de l'icone du Dock

Adobe AIR 1.0 et les versions ultérieures You pouvez faire rebondir l'icone du Dock en appelant la méthode NativeApplication nativeApplication.icon.bounce(). Si vous définisse le paramètre bounce() priority sur informational, l'icone rebondit une fois. Si vous définisse ce paramètre sur critical, l'icône rebondit jusqu'à ce que l'utilisateur active l'application. Les constantes du paramètre priority sont définies dans la classe NotificationType. Remarque: l'icone ne rebondit pas si l'application est déjà active.

Evénements de l'icone du Dock

Adobe AIR 1.0 et les versions ultérieures Lorsque vous cliquez sur l'icone du Dock, l'objet NativeApplication distribue un événement invoke. Si l'application n'est pas en cours d'exécution, le système lance l'application. Sinon, l'évenement invoke est renvoyé à l'occurrence de l'application en cours d'exécution.

Icones de la barre d'etat système

Adobe AIR 1.0 et les versions ultérièures AIR prend en charge les iconônes de la barre d'etat système lorsque la propriété NativeApplicationsupportsSystem TrayIcon est définié sur true, ce qui n'est actuellément le cas que sous Windows et la plupart des distributions Linux. Sous Windows et Linux, les icones de la barre d'etat système s'affichent dans la zone de notification de la barre des tâches. Par défaut, aucune icone n'est affichée. Pour afficher une icone, affectez un tableau contenant des objets BitmapData à la propriété bitmaps de l'icone. Pour modifier l'image d'une icone, affectez un tableau contenant les nouvelles images à la propriété bitmaps. Pour supprimer l'icone, définisse la propriété bitmaps sur null. Adobe AIR 1.0 et les versions ultériées Voupe aouter un menu a licon de la barre d'etat syste en creant un objet NnativeMenu, puis en l'ffectant a la propriete NativeApplication.nativeApplication.ion MENU (le systeme d'exploitation ne fournit aucun menu par defaut). Pour acceder au menu de licon de la barre d'etat syste, cliquez sur licon avec le bouton droit de la souris.

Info-bulles de l'icone de la barre d'etat système

Adobe AIR 1.0 et les versions ultériées Pour ajouter une info-bulle à une icône, définissez la propriété tooltip : NativeApplication-nativeApplication.icon/tooltip = "Application name";

Evénements de l'icone de la barre d'état système

Adobe AIR 1.0 et les versions ultériques L'objet System TrayIcon lié par la propriété NativeApplication.nativeApplication.icon distribue un événement Screen MouseEvent pour les événements click, mouseDown, mouseUp, rightClick, rightMouseDown et rightMouseUp. Vous pouvez utiliser ces événements, ainsi que le menu d'une icône, pour autoriser les utilisateurs à interagir avec votre application lorsque celle-ci ne dispose pas de fenêtres visibles.

Exemple : Création d'une application ne disposant d'aucune fenêtre

Adobe AIR 1.0 et les versions ultériques L'exemple suivant cree une application AIR qui dispose d'une icone de la barre d'etat système, mais d'aucune fenetre visible. (Ne définissez pas la propriété visible de l'application sur true dans le descriptoreur d'application, sous peine que la fenêtre ne soit visible au démarrage de l'application.) package { import flash.display.Loader; import flash.display.Nativemenu; import flash.display.NativemenuItem; import flash.display.Nativewindow; import flash.display.Sprite; import flash.scdtyp.DockIcon; import flash.scdtyp.SystemTrayIcon; import flash.events.Event; import flash.net URLsRequest; import flash.scdtyp.NativApplication; public class SysTrayApp extends Sprite { public function SysTrayApp():void{ NativeApplication.nativApplication.autoExit = false; var icon:Loader = new Loader(); var iconMenu:Nativemenu = new Nativemenu(); var exitCommand:NativemenuItem = iconMenu.addItem(new NativemenuItem("Exit")); exitCommand.addEventListener(Event.SELECT, function(event:Event):void { NativeApplication.nativApplication.icon.bitmaps = []; NativeApplication.nativApplication.exit(); }); if (NativeApplicationsupportsSystemTrayIcon){ NativeApplication.nativApplication.autoExit = false; icon.contentLoaderInfo.addEventListener(Event.COMPLETET,iconLoadComplete); icon.load(new URLRequest("icons/AIRApp_16.png")); var systray:SystemTrayIcon NativeApplication.nativApplication.icon as SystemTrayIcon; systray.tooltip = "AIR application"; systraymenu = iconMenu; } if (NativeApplication SupportsDockIcon){ icon.contentLoaderInfo.addEventListener(Event.COMPLETET,iconLoadComplete); icon.load(new URLRequest("icons/AIRApp_128.png")); var dock:DockIcon = NativeApplication.nativApplication.icon as DockIcon; dockmenu = iconMenu; } } private function iconLoadComplete(event:Event):void { NativeApplication.nativApplication.icon.bitmaps = [event.target/content.bitmapData]; } } Remarque: si vous utilisez le composant WindowedApplication de Flex, vous doivent désignir l'attribut visible de la balise WindowedApplication sur false. Cet attribut prime sur le paramètre défini dans le descriptor d'application. Remarque : dans cet exemple, nous supposons qu'il existe des fichiers image nommés AIRApp_16.png et AIRApp_128.png dans un sous-repertoire icon de l'application. (Les fichiers d'icone d'exemple, que vous pouvez copier dans le dossier de votre projet, sont inclus dans le kit de développement AIR.)

Icônes et boutons de la barre des tâches de la fenêtre

Adobe AIR 1.0 et les versions ultérieures

Les icones des fenêtres s'affichent normalement dans une zone de la fenêtre, appelée barre des tâches ou Dock, pour permettre aux utilisateurs d'acceder aisément à l'arrière-plan ou aux fenêtre minimisées. Le Dock de Mac OS X affiche l'icone correspondant à votre application, ainsi qu'une icône pour chaque fenêtre minimisée. Les barres des tâches de Microsoft Windows et Linux affichent un bouton contenant l'icône et le titre du programme de chaque fenêtre standard dans votre application.

Mise en surbrillance du bouton de la fenêtre dans la barre des tâches

Adobe AIR 1.0 et les versions ultérieures

Lorsqu'une fenêtre se trouve dans le chrome, vous pouvez informer l'utilisateur qu'un événement important ayant trait à la fenêtre s'est produit. Sous Mac OS X, vous pouvez informer l'utilisateur en faisant rebondir l'icone de l'application du Dock ( comme déscrit à la section « Rebond de l'icone du Dock » à la page 671). Sous Windows et Linux, vous pouvezmettre en surbrillance le bouton de la barre des tâches de la fenêtre en appelant la méthode notifyUser() de l'occurrence de NativeWindow. Le paramètre type transmis à la méthode déterminé l'urgence de la notification : - NotificationType.CRITICAL: l'icone de la fenêtre clignote jusqu'à ce que l'utilisateur ramène la fenêtre au premier plan. - NotificationType.INFORMATIONAL: l'icone de la fenetre est mise en surbrillance et change de couleur. Remarque : sous Linux, seul le type de notification informationnel est pris en charge. La transmission de la valeur du type à la fonction notifyUser() a le même effet. L'instruction suivante met en surbrillance le bouton de la barre des tâches d'une fenêtre : stage.nativeWindow.notifyUser(NotificationType.CRITICAL); L'appe l de la methode NativeWindow.notifyUser() d'un système d'exploitation qui ne prend pas en charge la notification au niveau de la fenetre n'a aucun effet. Utilisez la propriété NativeWindowsupportsNotification pour déterminer si la notification de fenêtes est prise en charge.

Création de fenêtres sans icônes ni boutons dans la barre des tâches

Adobe AIR 1.0 et les versions ultérieures

Sous Windows, les fenêtres de type utiliser ou légère ne s'affichent pas dans la barre des tâches. Les fenêtres invisibles n'apparaissent pas non plus dans la barre des tâches. Etant donné que la fenêtre initiale est nécessairement de type normale, pour creer une application dont aucune fenêtre ne s'affiche dans la barre des tâches, vous devez fermer la fenêtre initiale ou la laisser invisible. Pour fermer toutes les fenêtes de votre application sans quitter l'application, définitissez la propriété autoExit de l'objet NativeApplication sur false avant de fermer la dernière fenêtre. Pour simplement éviter que la fenêtre initiale soit visible, ajoutez false à l'élement du fjichier descriptor d'application (et ne définitissez pas la propriété Visible sur true, ni n'apelez la méthode activate() de la fenêtre). Dans les nouvelles fenêtres ouvertes par l'application, définissez la propriété type de l'objet NativeWindowInitOption transmis au constructeur de fenêtres sur NativeWindowType.UTILITY ou sur NativeWindowType.LIGHTWEIGHT. Sous Mac OS X, les fenêtres minimisées apparaissent sur la barre des tâches du Dock. Vous pouvez désactiver l'affichage de l'icone minimisée en masquant la fenêtre au lieu de la minimiser. L'exemple suivant écoute un événement de changement nativeWindowDisplayState et l'annule si la fenêtre est minimisée. Le gestionnaire définit la propriété visible de la fenêtre sur false : private function preventMinimize(event:NativeWindowDisplayStateEvent):void{ if(event.afterDisplayState = = NativeWindowDisplayState.MINIMIZED){ event.preventDefault(); event.target.Visible = false; } } Sous Mac OS X, si une fenêtre est minimisée sur le Dock lorsque vous définissez la propriété visible sur false, l'icone du Dock n'est pas supprimée. L'utilisateur peut toujours cliquer sur l'icone pour faire réapparaitre la fenêtre.

Chapitre 38 : Utilisation du système de fichiers

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Flash® Player propose des fonctionnalités de lecture et d'écriture de filchier de base, par le biais de la classe FileReference. Pour des raisons de sécurité, l'utilisateur doit systématiquement accorder son autorisation pour que vous puissiez dire ou écrire un filchier dans Flash Player. Adobe® AIR® assure un accès plus complèt au système de fichiers de l'ordinateur hôte que Flash Player. L'API du système de fichiers AIR vous permet d'acceder aux fichiers et aux répertoires et de les géné, de créé des fichiers et des repertoires, d'écrire des données dans les fichiers, etc.

Voir aussi

flash.net.FileReference flash.net.FileReferenceList flash.filesystem.File flash.filesystem.FileStream

Utilisation de la classe FileReference

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Un objet FileReference représenté un fisier de données stocké sur un client ou un serveur. Les méthodes de la classe FileReference permettent à votre application de charger et d'enregistrer localement des fisiers de données et de transférer ces derniers entre la machine locale et un serveur distant. La classe FileReference propose deux approaches distinctes pour charger, transférer et enregistrer les fischiers de données. Depuis son introduction, la classe FileReference comprend les méthodes browse(), upload() et download(). La méthode browse() permet à l'utiliser de selectionner un fisier. La méthode upload() permet de transférer les données du fisier vers un serveur distant. La méthode download() permet d'extraire les données du serveur et de les enregistrer dans un fisier local. Depuis Flash Player 10 et Adobe AIR 1.5, la classe FileReference intégre les méthodes load() et save(). Gréace aux méthodes load() et save(), vous pouvez également accéder aux fischiers locaux et les enregistrer directement. L'utilisation de ces méthodes est similaire aux méthodes du même nom dont disposent les classes URLLocator et Loader. Remarque: la classe File, qui estend la classe FileReference, et la classe FileStream proposent d'autres fonctions de manipulation des fichiers et du système de fichiers local. Les classes File et FileStream sont prises en charge dans AIR uniquement et non dans Flash Player.

FileReference, classe

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Chaque objet FileReference représenté un fisier de données localhébergé sur la machine locale. Les propriétés de la classe FileReference contiennent des informations sur la taille, le type, le nom, l'extension, le creator, la date de création et la date de modification du fisier. Remarque : la propriété creator est prise en charge sous Mac OS uniquement. Toutes les autres plates-formes renvoient la valeur null. Remarque: la propriété extension est prise en charge par Adobe AIR uniquement. Pour creer une occurrencie de la classe FileReference, procedez comme suit, au choix : - Utilisez l'opérateur new, comme indiqué dans le code suivant: import flash.net.FileReference; var fileRef: FileReference = new FileReference(); - Appelez la méthode FileReferenceListbrowse(), qui ouvre une boite de dialogue et invite l'utilisateur à selectionner un ou plusieurs fichiers à télécharger. Elle create ensuite un tableau d'objets FileReference si l'utilisateur réussit à selectionner un ou plusieurs fichiers. Une fois l'objet FileReference créé, vous pouvez procéder comme suit : - Appelez la méthode FileReferencebrowse(), qui ouvre une boite de dialogue et invite l'utilisateur à selectionner un fjichier unique dans le système de fjichiers local. Cette opération est généralement effectuee avant d'appeler la méthode FileReference.upload() ou FileReference.load(). La méthode FileReference.upload() charge le fjichier sur un serveur distant. La méthode FileReference.load() ouvre un fjichier local. - Appelez la méthode FileReference.download(). La méthode download ouvre une boîte de dialogue qui permet à l'utilisateur de sélectionner l'emplacement d'enregistrement d'un nouveau fjichier. Elle télécharge ensuite les données du serveur et les stocke dans le nouveau fjichier. - Appelez la méthode FileReference.load(). Cette méthode commence le chargement de données à partir d'un fichier précédent selectionné à l'aide de la méthode browse(). Il est impossible d'appeler la méthode load() tant que l'opération browse() n'est pas terminée (c'est-à-dire lorsque l'utilisateur seLECTIONne un fichier). - Appelez la méthode FileReference.save(). Cette méthode ouvre une boîte de dialogue et invite l'utilisateur à seLECTIONner un emplacement de fichier unique sur le système de fichiers local. Elle permet ensuite d'enregistrer les données à l'emplacement spécifique. Remarque : vous ne pouvez executer qu'une seule méthode browse (), download() ou save () à la fois, car une seule boîte de dialogue peut être ouverte à un moment donné. Les propriétés de l'objet FileReference, telles que name, size ou modificationDate, ne sont pas définies tant que l'un des événements suivants ne s'est pas produit : - La méthode FileReferencebrowse() ou FileReferenceListbrowse() a été appelée et l'utilisateur a sélectionné un fjichier dans la boîte de dialogue. - La méthode FileReference.download() a été appelée et l'utilisateur a stipulé un nouvel emplacement de fichier par le biais de la boîte de dialogue. Remarque : lors d'un téléchargement, seule la propriété FileReference.name est renseignée avant la fin du téléchargement. Une fois que le fjchier est telecharged, toutes les propriétés sont disponibles. Lors de l'exécution des appeals de la méthode FileReferencebrowse(), FileReferenceListbrowse(), FileReference.download(), FileReference.load() ou FileReference.save(), la plupart des lecteurs poursuivient la lecture du fisier SWF, ainsi que la distribution d'événements et l'exécution du code. Pour les opérations de chargement ou téléchargement, un fjichier SWF peut uniquement acceder aux fjichiers de son propre domaine, ce qui comprend tous les domains spécifiés par un fjichier de régulation. Vous devez placer un fjichier de régulation sur le serveur contenant le fjichier, si ce serveur ne se trouve pas sur le même domaine que le fjichier SWF ayant initiaé le chargement ou le téléchargement. Voir FileReference.

Chargement de données à partir d'un fichier

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures La méthode FileReference.load() vous permet de charger des données en mémoire à partir d'un fjichier local. Remarque: le code doit tout d'abord appeler la méthode FileReference.browse() pour que l'utilisateur puisse selectionner le fichier à charger. Cette restriction ne s'aplique pas au contenu qui s'exécut dans le sandbox de sécurité de l'application Adobe AIR. La méthode FileReference.load() renvoie une valeur immédiatement après avoir été appelée, mais les données en cours de chargement ne sont pas disponibles tout de suite. L'objet FileReference distribue des événements pour appeler les méthodes d'écouteur à chaque étape du processus de chargement. L'objet FileReference distribue les événements suivants pendant le processus de chargement. - Evénement open (Event. OPEN): distribué lorsqu'lopération de chargement commence. - Evénement progress (ProgressEvent.PROGRESS): distribué régulierement lorsque le fichier lit des octets de données. - Evénement complete (Event.COMPLETE) : distribué en cas de réussite de l'opération de chargement. - Evénement ioError(IOErrorEvent.IO_ERROR) : distribué si le processus de chargement échoue en raison d'une erreur d'entrée/sorting lors de l'ouverture ou de la lecture des données du fjichier. Une fois que l'objet FileReference distribue l'évenement complete, il est possible d'acceder aux données chargesés comme un élément ByteArray dans la propriété data de l'objet FileReference. L'exemple suivant indique comment inviter l'utilisateur à seLECTIONner un filchier, puis à charger les données de ce dernier en mémoire :
package   
{ import flash.display.Sprite; import flash.events.*; import flash.net.FileFilter; import flash.net.FileReference; import flash.net(URLRequest; import flash.utilsByteArray; public class FileReferenceExample1 extends Sprite { private var fileRef:FileReference; public function FileReferenceExample1() { fileRef = new FileReference(); fileRef.addEventListener(Event.SELECT, onFileSelected); fileRef.addEventListener(Event.CANCEL, onCancel); fileRef.addEventListener(IOErrorEvent.IO_ERROR, onIOError); fileRef.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError); var textTypeFilter:FileFilter = new Filter("Text Files (.txt, *.rtf)", "*.txt;*.rtf"); fileRefbrowse([textTypeFilter]); } public function onFileSelected(evt:Event):void { fileRef.addEventListener(ProgressEvent.PROGRESS, onProgress); fileRef.addEventListener(Event.COMPLET, onComplete); fileRef.load(); } public function onProgress(evt:ProgressEvent):void { trace("Loaded " + EVT.bytesLoaded + " of " + EVT.bytesTotal + " bytes.")}; public function onComplete(evt:Event):void { trace("File was successfully loaded.", trace(fileRef.data)); } public function onCancel(evt:Event):void { trace("The browse request was canceled by the user.", } public function onIOError(evt:IOErrorEvent):void { trace("There was an IO Error.", } public function onSecurityError(evt:Event):void { trace("There was a security error.", } } 
Le code d'exemple creé tout d'abord l'objet FileReference nommé fileRef, puis appelle sa méthode browse(). La méthode browse ouvre une boîte de dialogue et l'utilisateur est invité à Sélectionner un fischiér. Une fois le fischiér sélectionné, le code appèle la méthode onFileSelected(). Cette méthode ajoute des écouteurs aux événements progress et complete, puis appèle la méthode load() de l'objet FileReference. Les autres méthodes de gestionnaire de cet exemple se contentent de générer des messages qui indiquent le déroulement de l'opération de chargement. Lorsque le chargement est terminé, l'application affiche le contenu du fischiérCharge à l'aide de la méthode trace(). Dans Adobe AIR, la classe FileStream propose d'autres fonctionnalités de lecture des données dans un fjichier local (voir « Lecture et écriture de fjichiers » à la page 715).

Enregistrement de données dans des fichiers locaux

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures La méthode FileReference.save() vous permet d'enregistrer des données dans un fjichier local. Elle commence par ouvrir une boîte de dialogue qui permet à l'utilisateur d'entrée un nouveau nom de fjichier et l'emplacement d'enregistrement du fjichier. Une fois le nom de fjichier et l'emplacement seLECTIONnés, les données sont écrites dans le nouveau fjichier. Lorsque le fjichier est enregistré, les propriétés de l'objet FileReference sont renseignées avec les propriétés du fjichier local. Remarque: le code ne doit appeler la méthode FileReference.save() qu'en réponse à un événement utilisateur, tel qu'un événement de typeblick de souris ou pression de touche. Dans le cas contraire, une erreur est renvoyée. Cette restriction ne s'applique pas au contenu qui s'exécutés dans le sandbox de sécurité de l'application Adobe AIR. La méthode FileReference.save() est renvoyée juste après son appel. L'objet FileReference distribue ensuite des événements pour appeler les méthodes d'écouteur à chaque étape du processus d'enregistrement de fichier. L'objet FileReference distribue les événements suivants au cours du processus d'enregistrement de fichier : - Evénement select (Event.SELECT): distribué lorsqu'el'utilisateur indique l'emplacement et le nom du nouveau fichier à enregistrer. - Evénement cancel (Event.CANCEL): distribué lorsqu'el'utilisateur clique sur le bouton Annuler dans la boîte de dialogue. - Evénement open (Event .OPEN) : distribué lorsqu'lopération d'enregistrement commence. - Evénement progress (ProgressEvent.PROGRESS): distribué régulièrement pendant l'enregistrement des octets de données dans le fjichier. - Evénement complete (Event.COMPLETE) : distribué en cas de réussite de l'opération d'enregistrement. - Evénement ioError(IOErrorEvent.IO_ERROR): distribué si le processus d'enregistrement échoue en raison d'une erreur d'entrée/sortie lors d'une tentative d'enregistrement des données dans le fichier. Le type d'objet transmis dans le paramètre data de la méthode FileReference.save() déterminé le mode d'écriture des données dans le fjichier : - S'il s'agit d'une valeur String, les données sont enregistrées au format texte UTF-8. - S'il s'agit d'un objet XML, elles sont écrites dans un fichier XML en conservant l'ensemble du formatage. - S'il s'agit d'un objet ByteArray, leur contenu est écrit directement dans le fichier sans conversion. - S'il s'agit d'un autre type d'objet, la méthode FileReference.save() appelle la méthode toString() de l'objet, puis enregistre la valeur String résultat dans un filchier texte UTF-8. S'il est impossible d'appeler la méthode toString() de l'objet, une erreur est renvoyée. Si la valeur du paramètre data est null, une erreur est renvoyée. Le code suivant estend l'exemple precedent pour la méthode FileReference.load(). Une fois les données lues dans le fjchier, cet exemple invite l'utilisateur a entrer un nom de fjchier, puis enregistre les données dans un nouveau fjchier : package
{ import flash.display.Sprite; import flash.events.*; import flash.net.FileFilter; import flash.net.FileReference; import flash.net(URLRequest; import flash.utils.ByteArray; public class FileReferenceExample2 extends Sprite { private var fileRef:FileReference; public function FileReferenceExample2() { fileRef = new FileReference(); fileRef.addEventListener(Event.SELECT, onFileSelected); fileRef.addEventListener(Event.CANCEL, onCancel); fileRef.addEventListener(IOErrorEvent.IO_ERROR, onIOError); fileRef.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError); var textTypeFilter:FileFilter = new Filter("Text Files (.txt, .rtf)", "*.txt;*.rtf"); fileRefbrowse([textTypeFilter]); } public function onFileSelected(evt:Event):void { fileRef.addEventListener(ProgressEvent.PROGRESS, onProgress); fileRef.addEventListener(Event.COMPLETE, onComplete); fileRef.load(); } public function onProgress(evt:ProgressEvent):void { trace("Loaded " + EVT.bytesLoaded + " of " + EVT.bytesTotal + " bytes.")}; public function onCancel(evt:Event):void { trace("The browse request was canceled by the user.")}; public function onComplete(evt:Event):void { trace("File was successfully loaded.", fileRef.removeEventListener(Event.SELECT, onFileSelected); fileRef.removeEventListener(ProgressEvent.PROGRESS, onProgress); fileRef.removeEventListener(Event.COMPLET, onComplete); fileRef.removeEventListener(Event.CANCEL, onCancel); saveFile(); } public function saveFile():void { fileRef.addEventListener(Event.SELECT, onSaveFileSelected); fileRef.save(fileRef.data,"NewFileName.txt"); } 
public function onSaveFileSelected(evt:Event):void { fileRef.addEventListener(ProgressEvent.PROGRESS, onSaveProgress); fileRef.addEventListener(Event.COMPLET, onSaveComplete); fileRef.addEventListener(Event.CANCEL, onSaveCancel); }   
public function onSaveProgress(evt:ProgressEvent):void { trace("Saved +evt.bytesLoaded + of +evt.bytesTotal + bytes.)); }   
public function onSaveComplete(evt:Event):void { trace("File saved.)); fileRef.removeEventListener(Event.SELECT, onSaveFileSelected); fileRef.removeEventListener(ProgressEvent.PROGRESS, onSaveProgress); fileRef.removeEventListener(Event.COMPLET, onSaveComplete); fileRef.removeEventListener(Event.CANCEL, onSaveCancel); }   
public function onSaveCancel(evt:Event):void { trace("The save request was canceled by the user.)); }   
public function onIOError(evt:IOErrorEvent):void { trace("There was an IO Error."));   
public function onSecurityError(evt:Event):void { trace("There was a security error.")); } 
Au terme du chargement des données à partir du fichier, le code appelle la méthode onComplete(). La méthode onComplete() supprime les écouteurs associés aux événements de chargement, puis appelle la méthode saveFile(). La méthode saveFile() appelle la méthode FileReference.save(). La méthode FileReference.save() ouvre une nouvelle boite de dialogue dans laquelle l'utilisateur entre un nouveau nom de fichier et l'emplacement d'enregistrement de ce dernier. Les autres méthodes d'écouteur d'évenement tracent le déroulement du processus d'enregistrement du fichier jusqu'à ce qu'il soit terminé. Dans Adobe AIR, la classe FileStream propose d'autres fonctionnalités d'écriture des données dans un fjichier local (voir « Lecture et écriture de fjichiers » à la page 715).

Chargement de fichiers sur un serveur

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Pour charger des fischiers sur un serveur, commencez par appeler la methode browse() pour permettre à l'utilisateur de selectionner un ou plusieurs fischiers. Àpres l'applé de la methode FileReference.upload(), le fisquier sélectionné est transféré sur le serveur. Si l'utilisateur sélectionne plusieurs fischiers à l'aide de la methode FileReferenceListbrowse(),FlashPlayer create un tableau de fichiers selectionnés appelé FileReferenceList.fileList. Vous pouvez alors utiliser la méthode FileReference.upload() pour charger chaque fjichier individuellement. Remarque : l'utilisation de la méthode FileReference.browse() ne vous permet de charger qu'un seul fjichier à la fois. Pour autoriser l'utilisateur à charger plusieurs fjichiers, faites appel à la méthode FileReferenceList.browse(). Par défaut, la boîte de dialogue de sélection de fidchier du système d'exploitation permet à l'utilisateur de désirir tout type de fidchier sur l'ordinateur local. Les développpeurs peuvent toute fois filtrer les types de fidchier à l'aide de la classe FileFilter, en transmettant un tableau d'occurrences de filtres de fidchiers à la méthode browse():
var imageTypes:FileFilter = new FileFilter("Images (.jpg, .jpeg, .gif, .png)", "*.jpg; *.gif; *.png");
var textTypes:FileFilter = new FileFilter("Text Files (.txt, .rtf)", "*.txt; *.rtf");
var allTypes:Array = new Array(imageTypes, textTypes);
var fileRef:FileReference = new FileReference();
fileRefbrowse(allTypes); 
Lorsque l'utilisateur a selectionné les fischiers et clique sur le bouton Ouvrir dans la boîte de dialogue de selection système, l'évenement Event. SELECT est distribué. Si vous selectionnez le fjchier à charger à l'aide de la méthode FileReferencebrowse(), le code suivant envoie le fjchier à un serveur Web :
var fileRef:FileReference = new FileReference();  
fileRef.addEventListener(Event.SELECT, selectHandler);  
fileRef.addEventListener(Event.COMPLET, completeHandler);  
try{  
    var success:Boolean = fileRef.browse();  
}  
catch (error:Error)  
{  
    trace("Unable to browse for files ");  
}  
function selectHandler(event:Event):void{  
    var request:URLRequest = new URLRequest("http://www.[yourdomain].com/fileUploadScript.cfm")  
    try{  
        fileRef.upload(request);  
    }  
    catch (error:Error)  
{  
        trace("Unable to upload file ");  
    }  
}  
function completeHandler(event:Event):void{  
    trace("uploaded");  
} 
![](images/fc41af23d05184d3776e6eda4ecbc6439cd9ee4e9c5898c1c5402caddc15e09c.jpg) Avec la méthode FileReference.upload(), vous pouvez envoyer des données au serveur en utilisant les propriétés URLRequest.method et URLRequest.data en vue d'envoyer des variables à l'aide de la méthode POST ou GET. Si vous tentez de charger un fisier à l'aide de la méthode FileReference.upload(), les événements suivants sont distribués: - Evénement open (Event .OPEN) : distribué lorsqu'lopération de chargement commence. - Evénement progress (ProgressEvent.PROGRESS): distribué régulièrement pendant le chargement des octets de données du fichier. - Evénement complete (Event.COMPLETÉ): distribué en cas de réussite de l'opération de chargement. - Evénement httpStatus (HTTPStatusEvent HTTP_STATUS): distribué lorsque le processus de chargement échoue en raison d'une erreur HTTP. - Evénement httpResponseStatus (HTTPStatusEvent. HTTP_RESPONSE_STATUS): distribué si un appel de la méthode upload() ou uploadUncoded() tente d'accéder aux données via HTTP, et si Adobe AIR est capable de détecter et de renvoyer le code d'état de la requête. - Evénement securityError (SecurityErrorEvent.SECURITY_ERROR): distribué lorsqu'une opération de chargement échoue en raison d'une violation de la sécurité. - Evénement uploadCompleteData (DataEvent.INSERT_DATA) : distribué après réception des données par le serveur suite à un chargement réussi. - Evénement ioError(IOErrorEvent.IO_ERROR): distribué si le processus de chargement échoue pour l'une des raisons suivantes: - Une erreur d'entree/sortie se produit dans Flash Player pendant la lecture, l'ecriture ou la transmission du fichier. - Le fjichier SWF tente de charger un fjichier sur un serveur nécessitant une authentification (un nom d'utilisateur et un mot de passer, par exemple). Au cours du chargement, Flash Player ne permet pas aux utilisateurs d'entre des mots de passer. - Le paramètre url contient un protocole incorrect. La méthode FileReference.upload() doit utiliser HTTP ou HTTPS. Flash Player n'offre pas une prise en charge complète des serveurs nécessitant une authentification. Seuls les fichiers SWF s'executant dans un navigateur, via le module d'extension du navigateur ou le contrôle Microsoft ActiveX®, peuvent fournir une boîte de dialogue pour inviter l'utilisateur à entrer un nom et un mot de passer d'authentication, et ce uniquement pour les téléchargements. Le transfert de fichiers échoue si le chargement est effectué à l'aide du module d'extension ou du contrôle ActiveX, ou si un changement/téléchargement est effectué par le biais du lecteur autonome ou externe. Pour creer un script serveur dans ColdFusion de maniere a accepter les chargements de fichier en provenance de Flash Player, vous pouze utiliser un code semble à celui-ci: Ce code ColdFusion charge le fjichier envoyé par Flash Player et l'enregistre dans le même compétre que le modele ColdFusion, en écrasant tout fjichier existant du même nom. Cet exemple presente le minimum de code nécessaire à l'acceptation du chargement d'un fjichier ; ce script ne doit pas ettre utilisé dans un environnement de production. Ajoutez de préfrence un mecanisme de validation des données pour garantir que les utilisateurs chargent uniquement des types de fjichiers autorisés, telle une image plutot qu'un script cote serveur potentiellement dangereux. Le code ci-après présente le chargement de fischiers via PHP, avec validation des données. Le script limite le nombre de fischiers charges dans le repertoire cible à 10, vérifie que le fisquier fait moins de 200 Ko et autorise uniquement le chargement et l'enregistrement de fischiers JPEG, GIF ou PNG.
<?php
$MAXIMUM_FILESIZE = 1024 * 200; // 200KB
$MAXIMUM_FILE_COUNT = 10; // keep maximum 10 files on server
echo exif_imagetype($FILES['Filedata']);
if (FILES['Filedata']['size'] <=MAXIMUM_FILESIZE)
{
    move上传ased_file($FILES['Filedata']['tmp_name'],
        "/temporary/".$FILES['Filedata']['name']);
    type = exif_imagetype("/temporary/".FILES['Filedata']['name']);
    if (type == 1 ||type == 2 || $type == 3)
        {
            rename("\\temporay/".$FILES['Filedata']['name'],
            "/images/".$FILES['Filedata']['name']);
        }
    else
        {
            unlink("\\temporay/".$FILES['Filedata']['name']);
        }
}
$directory = opendir("\\images/O");
$file = array();
while (file = readdir(directory))
{
    array.push(files, array("\/O/file, filetime("\\images/O/$file"));
}
usort($files, sorter);
if (count(files) >MAXIMUM_FILE_COUNT)
{
    files_to_delete = array_splice(files, 0, count(files) -MAXIMUM_FILE_COUNT);
    for (i = 0;i < count(files_to_delete);i++)
        {
            unlink(files_to_delete[i] [0]);
        }
    }
}
print_r($files);
closedir($directory);
function sorter(a,b)
{
    if (a[1] ==b[1])
        {
            return 0;
        }
    else
        {
            return (a[1] <b[1]) ? -1 : 1;
        }
}
?> 
Vou puez transmetre des variables supplémentaires au script de chargement a l'aide de la methode de requete POST ou GET. Pour envoyer des variables POST au script de chargement, vous pouze utiliser le code suivant:
var fileRef:FileReference = new FileReference();  
fileRef.addEventListener(Event.SELECT, selectHandler);  
fileRef.addEventListener(Event.COMPLETec, completeHandler);  
fileRefbrowse();  
function selectHandler(event:Event):void  
{  
    var params:URLVariables = new URLVariables();  
    params.date = new Date();  
    params.ssid = "94103-1394-2345";  
    var request:URLRequest = new  
URLRequest("http://www.yourdomain.com/FileReferenceUpload/fileupload.cfm");  
    request.method = URLLRequestMethod.MAX;  
    request.data = params;  
    fileRef.upload(request, "Custom1");  
}  
function completeHandler(event:Event):void  
{  
    trace("uploaded");  
} 
L'exemple précédent create un objet URLsVariables à transmettre au script côté serveur distant. Dans les versions précédentes d'ActionScript, il était possible de transmettre des variables au script de chargement en passant des valeurs dans la chaine de requête. ActionScript 3.0 vous permit de transmettre des variables au script distant à l'aide de l'objet URLRequest. Vous pouvez ainsi transmettre des données à l'aide de la méthode POST ou GET, ce qui simplifie et rationalise le transfert de gross volumes de données. Pour spécifique si les variables sont transmises à l'aide de la méthode de requête GET ou POST, il est possible de définir la propriété URLRequest.method sur URLRequestMethod. GET ou URLRequestMethod. POST, respectivement. ActionScript 3.0 vous permet de remplacer le nom de champ par défaut du filchier à charger (Filedata) en ajoutant un deuxième paramètre à la méthode upload(), comme illustré dans l'exemple précédent (dans lequel la valeur par défaut Filedata est remplaçée par Custom1). Par défaut, Flash Player ne tentative pas d'effectuer un chargement de test ; vous pouvez toute fois le faire en transmettant la valeur true comme troisieme paramètre de la méthode upload(). L'objet du test est de vérifier que le chargement veritable se fera sans problème et que l'authentication du serveur, si nécessaire, réussira. Remarque : actuellement, le test du chargement s'effectue uniquement dans les versions Windows de Flash Player. Le script serveur qui gère le chargement doit attendre une requête HTTP POST importante les éléments suivants : - Content-Type avec la valeur multipart/form-data. - Content-Disposition avec comme attribut name « Data » et comme attributename le nom du fichier d'origine. Pour spécifique un attribut name, transmettez une valeur pour le paramètre uploadDataFieldName dans la méthode FileReference.upload(). - Le contenu binaire du fichier. Voici un exemple de requête HTTP POST: POST /handler.asp HTTP/1.1 Accept: text/* Content-Type: multipart/form-data; boundary = - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - User-Agent: Shockwave Flash Host: www.mydomain.com Content-Length: 421 Connection: Keep-Alive Cache-Control: no-cache --Ij5ae0ae0KM7GI3KM7ei4cH2ei4gL6 Content-Disposition: form-data; name="Filename" sushi.jpg - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Content-Disposition: form-data; name="Filedata"; filename="sushi.jpg" Content-Type: application/octet-stream Test File ---Ij5ae0ae0KM7GI3KM7ei4cH2ei4gL6 Content-Disposition: form-data; name="Upload" Submit Query ---Ij5ae0ae0KM7GI3KM7ei4cH2ei4gL6 (actual file data,,) L'exemple de requête HTTP POST suivant envoie trois variables POST: api_sig, api_key et auth_token, puis utilise la valeur de champ de données "photo": POST /handler.asp HTTP/1.1 Accept: text/\* Content-Type: multipart/form-data; boundary = - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1j5ae0ae0KM7GI3KM7ei4cH2ei4gL6 User-Agent: Shockwave Flash Host: www.mydomain.com Content-Length: 421 Connection: Keep-Alive Cache-Control: no-cache Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7 Content-Disposition: form-data; name "Filename" sushi.jpg -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- �--- Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7 Content-Disposition: form-data; name "api_sig" XXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXxx XXXXXXXXXXXXXXXXXXXXXXXXXx XXXXXXXXXXXXXXXXXXXXXXXXXx XXXXXXXXXXXXXXXXXXXXXXXXXx XXXXXXXXXXXXXXXXXXXXXXXXXx XXXXXXXXXXXXXXXXXXXXXXXXXx XXXXXXXXXXXXXXXXXXXXXXXXXx XXXXXXXXXXXXXXXXXXXXXXXXXx XXXXXXXXXXXXXXXXXXXXXXXXXx XXXXXXXXXXXXXXXXXXXXXXXXXx XXXXXXXXXXXXXXXXXXXXXXXXXx XXXXXXXXXXXXXXXXXXXXXXXXXx XXXXXXXXXXXXXXXXXXXXXXXXXx XXXXXXXXXXXXXXXXXXXXXXXXXx XXXXXXXXXXXXXXXXXXXXXXXXXx XXXXXXXXXXXXXXXXXXXXXXXXXx XxxxxxxxxX

Téléchargement de fichiers à partir d'un serveur

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Voupez autoriser les utilisateurs à télécharger des fischiers à partir d'un serveur grâce à la méthode FileReference.download(), qui prend deux paramétres: request et defaultFileName. Le premier paramètre est l'objet URLRequest contenant l'URL du filchier à télécharger. Le second est facultatif; il permet de spécifique un nom de filchier par défaut qui apparaître dans la boite de dialogue de téléchargement. Si vous ignorez le second paramètre, defaultFileName, le nom de filchier utilisé est dérivé de l'URL. Le code suivant télécharge un fisier nommé index.xml à partir du même réseau que le fisier SWF :
var request:URLRequest = new URLRequest("index.xml");  
var fileRef:FileReference = new FileReference();  
fileRef.download(request); 
Pour utiliser comme nom par défaut currentnews.xml au lieu d'index.xml, spécifiez le paramètre defaultFileName, comme illustré par le fragment de code suivant : var request:URLRequest = new URLRequest("index.xml"); var fileToDownload:FileReference = new FileReference(); fileToDownload.download(request, "currentnews.xml"); Le changement de nom du fichier peut s'avérer utile si le nom du fichier sur le serveur est peu évocateur ou génération automatique. Il est également judicieux de spécifique le paramètre defaultFileName lorsque vous téléchargez un fichier à l'aide d'un script côté serveur, au lieu d'effectuer un téléchargement direct. Par exemple, il est nécessaire de spécifique le paramètre defaultFileName si vous utilisez un script côté serveur qui télécharge des fischiers en fonction des variables URL qui lui sont transmises. Autrement, le nom par défaut du fichier téléchargeé est le nom du script côté serveur. Vous pouvez également envoyer des données au serveur avec l'appoint de la méthode download() en ajoutant des paramétres à l'URL pour que le script serveur les analyse. L'extrait de code ActionScript 3.0 ci-après télécharge un document en fonction des paramétres transmis à un script ColdFusion :
package   
{ import flash.display.Sprite; import flash.net.FileReference; import flash.net(URLRequest; import flash.net(URLRequestMethod; import flash.net URLsVariables; public class DownloadFileExample extends Sprite { private var fileToDownload:FileReference; public function DownloadFileExample() { var request:URLRequest = new URLRequest(); request.url = "http://www.[yourdomain].com/downloadfile.cfm"; request.method = URLRequestMethod.GET; request.data = new URLsVariables("id=2"); fileToDownload = new FileReference(); try { fileToDownload.download(request, "file2.txt"); } catch (error:Error) { trace("Unable to download file."); } } } 
Le code suivant presente le script ColdFusion download.cfm, qui telécharge l'un des deux fichiers stockés sur le serveur en fonction de la valeur d'une variable URL :

Classe FileReferenceList

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures La classe FileReferenceList permet à l'utilisateur de selectionner un ou plusieurs fischiers à charger dans un script côté serveur. Le chargement de fischiers est géré par la méthode FileReference.upload(), qui doit être appelée pour chaque fisquier sélectionné. Le code suivant cree deux objets Filter (imageFilter et textFilter) et les transmet sous forme de tableau à la méthode FileReferenceList browse(). Ainsi, la boite de dialogue du système d'exploitation propose deux types de fichiers possibles.
var imageFilter:FileFilter = new FileFilter("Image Files (*.jpg, *.jpeg, *.gif, *.png)", "*.jpg;*.jpeg;*.gif;*.png");
var textFilter:FileFilter = new FileFilter("Text Files (*.txt, *.rtf)", "*.txt; *.rtf");
var fileRefList:FileReferenceList = new FileReferenceList();
try
{
    var success:Boolean = fileRefList.browse(new Array(imageFilter, textFilter));
}
catch (error:Error)
{
    trace("Unable to browse for files.")
}
} 
L'utilisation de la classe FileReferenceList pour autoriser le chargement de fischiers estsemblable à l'utilisation de FileReferencebrowse(), à la différence que FileReferenceList permet de sélectionner plusieurs fischiers. En cas de selection de fischiers multiples, il est nécessaire de charger chacun des fischiers choisis à l'aide de FileReference.upload(), comme le montre le code suivant:
var fileRefList:FileReferenceList = new FileReferenceList();  
fileRefList.addEventListener(Event.SELECT, selectHandler);  
fileRefListbrowse();  
function selectHandler(event:Event):void  
{  
    var request:URLRequest = new URLRequest("http://www[yourdomain].com/fileUploadScript.cfm");  
    var file:FileReference;  
    var files:FileReferenceList = FileReferenceList(event.target);  
    var selectedFileArray:Array = files.fileList;  
    for (var i uint = 0; i < selectedFileArray.length; i++)  
    {  
        file = FileReference(selectFileArray[i]);  
        file.addEventListener(Event.COMPLET, completeHandler);  
        try  
            {  
                file.upload(request);  
            }  
            catch (error:Error)  
            {  
                trace("Unable to upload files.")
            }  
        }  
}  
function completeHandler(event:Object):void  
{  
    trace("uploaded");  
} 
Comme l'évenement Event.COMPLETE s'ajoute à chaque objet FileReference dans le tableau, Flash Player appelle la méthode completeHandler() à la fin du chargement de chacun des fichiers.

Utilisation de l'interface de programmation du système de fichiers AIR

Adobe AIR 1.0 et les versions ultérieures L'API du système de fichiers Adobe AIR comprend les classes suivantes : Fichier - FileMode - FileStream L'API du système de fichiers vous permet d'exécuter entre autres les opérations suivantes : - Copier, créer, supprimer et déplacer des fichiers et des répertoires - Obténir des informations sur les fichiers et les répertoires Lire et écrire des fichiers

Principes de base des classes File d'AIR

Adobe AIR 1.0 et les versions ultérièures

Pour obtenir une explication rapide de l'utilisation du système de fichiers dans AIR et des exemples de code correspondants, voir les articles de démarrage rapide suivants dans Adobe Developer Connection : Building a text-file editor (Flash) (disponible en anglais uniquement) - Développement d'un éditeur de fichier texte (Flex) - Développement d'une application de recherche dans des repertoires (Flex) - Lecture et écriture à partir d'un fichier de préférences XML (Flex) - Compression de fichiers et de données (Flex) Adobe AIR propose des classes permettant de creer et de gerer des fichiers et des dossiers, ainsi que d'y acceder. Ces classes, qui resident dans le package flash.filesystem, s'utilisent comme suit :
Classes FileDescription
FileObjet File représentant le chemin d'accès à un fisier ou un réseau. Vous utilisez un object File pour创建工作 un pointeur vers un fisier ou un dossier, ce qui initiate une interaction avec le fisier ou le dossier.
FileModeLa classe FileMode définit des constantes chaîne qui sont utilisées dans le paramètre fileMode des méthodes open() et openAsync() de la classe FileStream. Le paramètre fileMode de ces méthodes déterminé les fonctionnalités à la disposition de l'objet FileStream une fois le fisier ouvert, notamment l'écriture, la lecture, l'ajout en fin de fisier et la mise à jour.
FileStreamObjetFileStream permettant d'ouvrir des fisiers à des fins de lecture ou d'écriture. Une fois créé un objet File pointant vers un fisier nouveau ou existant, vous transmettez ce pointeur à l'objet FileStream dans le but d'ouvrir ce fisier et d'écrire ou de dire des données.
Certaines méthodes de la classe File possèdent des versions synchrone et asynchrone : - File.copyTo() et File.copyToAsync() - File(deleteDirectory() et File(deleteDirectoryAsync()) - File(deleteFile() et File(deleteFileAsync()) - File.getDirectoryListing() et File.getDirectoryListingAsync() - File.moveTo() et File.moveToAsync() - File.moveToTrash() et File.moveToTrashAsync() En outre, les opérations FileStream s'executent en mode synchrone ou asynchrone selon que l'objet FileStream ouvre le fjichier par appel de la méthode open() ou openAsync(). Les versions asynchrones vous permettent d'initier des processus s'executant en arrêtre-plan et de distribuer des événements lorsqu'ils sont terminés (ou lorsqu'un événement erreur se produit). Un autre code peut s'exécuter pendant que ces processus asynchrones se déroulent en arrêtre-plan. Lorsque vous utilisez la version asynchrone de ces opérations, vous doivent configurer des fonctions d'écouteur d'évenement, à l'aide de la méthode addEventListener() de l'objet File ou FileStream qui appelle la fonction. Les versions synchrones permettent d'écrite du code plus simple qui ne repose pas sur la configuration d'écouteurs d'évenement. Cependant, commeaucun autre code ne peut s'executer pendant l'exécution d'une méthode synchrone, il est possible que des processus importants tels que I'animation et le rendu des objets d'affichage soient retardés.

Utilisation des objets File dans AIR

Adobe AIR 1.0 et les versions ultérieures Un objet File est un pointeur vers un fichier ou un repertoire du système de fichiers. La classe File étend la classe FileReference. La classe FileReference, qui est disponible dans Adobe® Flash® Player et AIR, représenté un pointeur vers un fisier. La classe File ajoute des propriétés et des méthodes qui ne sont pas exposées dans Flash Player (dans un fisier SWF s'exçutant dans un navigateur), pour des raisons de sécurité.

Présentation de la classe File

Adobe AIR 1.0 et les versions ultérieures La classe File permet d'effectuer les opérations suivantes : - Obtenir le chemin d'accès à des répertoires particuliers, notamment le réseau de l'utilisateur, le réseau de documents de l'utilisateur, le réseau de lancement de l'application et le réseau d'application - Copier des fichiers et des répertoires - Déplacer des fichiers et des repertoires - Supprimer des fichiers et des répertoires (ou les transférer dans la corbeille) - Afficher la liste des fichiers et repertoires que contient un repertoire - Créer des fichiers et des dossiers temporaires Une fois qu'un objet File pointe vers un chemin de fichier, vous pouvez l'utiliser pour dire et écrire des données de fichier, à l'aide de la classe FileStream. Un objet File peut pointer vers le chemin d'un fisier ou d'un repertoire qui n'existe pas encore. Vous pouvez utiliser un tel objet File pour creer un fisier ou un repertoire.

ChemindesobjectsFile

Adobe AIR 1.0 et les versions ultérieures Tout objet File possède deux propriétés qui définiennent son chemin :
PropriétéDescription
nativePathIndique le chemin d'accès à un fisier en fonction de la plate-forme. Par exemple, sous Windows, un chemin se présente sous la forme « c:\Sample directory\test.txt » alors que sous Mac OS, il correspond à « /Sample directory/test.txt ». La propriété nativePath utilise la barre oblique inverse (\\) comme séparateur de répertoires sous Windows et la barre oblique normale (/) sous Mac OS et Linux.
urlCette propriété peut utiliser le modèle d'URL file pour pointer vers un fisier. Par exemple, sous Windows, un chemin se présente sous la forme « file:///c:/Sample%20directory/test.txt » alors que sous Mac OS, il correspond à « file:///Sample%20directory/test.txt ». Outre file, le moteur d'exécution propose d'autres modèles d'URL particuliers, qui sont décrits à la section « Modèles d'URL AIR pris en charge » à la page 702.
La classe File comprend des propriétés statiques de pointage vers les repertoires standard sous Mac, Windows et Linux. Parmi ces propriétés figurent : - File.applicationStorageDirectory : repertoire de stockage spécifique à chaque application AIR installée. Ce repertoire est adapté au stockage des actifs d'applications dynamiques et des préférences utilisateur. Il est recommendé de stocker les volumes élevés de données dans un autre repertoire. Sous Android et iOS, le réseau de stockage de l'application est supprimé lorsque l'utilisateur désinstallé l'application ou lorsqu'il decide d'effacer les données de l'application. Ce n'est toute fois pas le cas sur d'autres plates-formes. - File.applicationDirectory: répertoire dans lequel est installée l'application (et qui contient tout actif installé). Sur certains systèmes d'exploitation, l'application est stockée dans un fischié de package unique, plutôt que dans un répertoire physique. Dans ce cas de figure, il est parfois impossible d'acceder au contenu via le chemin natif. Le répertoire d'application est disponible en lecture seule. - File desktopDirectory: répertoire du poste de travail de l'utilisateur. Si une plate-forme ne définit pas de répertoire de poste de travail, un autre emplacement du système de fichiers est alors utilisé. - File/documentsDirectory: répertoire de documents de l'utilisateur. Si une plate-forme ne définit pas de répertoire de documents, un autre emplacement du système de fichiers est alors utilisé. - File.userDirectory: repertoire de l'utilisateur. Si une plate-forme ne définit pas de repertoire utilisé, un autre emplacement du système de fichiers est alors utilisé. Remarque: si une plate-forme ne définit pas d'emplacement standard pour les repertoires de poste de travail, de documents ou d'utilisateur, File/documentsDirectory, File desktopDirectory et File.userDirectory peuvent pointer vers le même repertoire. La valeur de ces propriétés varie selon le système d'exploitation. Par exemple, le chemin natif vers le réseau du poste de travail de l'utilisateur est différent sur Mac et Windows. La propriété File desktopDirectory pointe néanmoins vers un chemin de réseau approprié sur chaque plate-forme. Pour développer des applications qui fonctionnent correctement sur toutes les plateformes, utilisez ces propriétés comme base pour réféencer d'autres fidchiers et répertoires dont se sert l'application. Utilisez ensuite la méthode resolvePath() pour affiner le chemin. Par exemple, le code suivant pointe vers le filchier preferences.xml dans le réseau de stockage de l'application : var prefersFile:File = File.applicationStorageDirectory; prefsFile = prefetchFile resolverPath("preferences.xml"); Bien que la classe File vous permette de pointer vers un chemin de fichier déterminé, les applications risquent alors de ne pas fonctionner sur toutes les plates-formes. Par exemple, le chemin C:\Documents and Settings\joe\ne fonctionne que sous Windows. C'est pourquoi il est préféable d'utiliser les propriétés statiques de la classe File, telles que File/documentsDirectory. Emplacements de répertoire standard
Plate-formeType de répertoireEmplacement de système de fichiers typique
AndroidApplication/data/data/
Stockage d'application/data/data/air.IDApplication/NomFichier/Local Store
Cache/data/data/applicationID/cache
Bureau/mnt/sdcard
Documents/mnt/sdcard
Temporaire/data/data/IDApplication/cache/FlashTmp.randomString
Utilisateur/mnt/sdcard
iOSApplication/var/mobile/Applications/uid/filename.app
Stockage d'application/var/mobile/Applications/uid/Library/ApplicationSupport/applicationID/Local Store
Cache/var/mobile/Applications/uid/Library/Caches
Bureaunon accessible
Documents/var/mobile/Applications/uid/Documents
Temporaire/private/var/mobile/Applications/uid/tmp/FlashTmpNNN
Utilisateurnon accessible
LinuxApplication/opt/NomFichier/share
Stockage d'application/home/NomUtilisateur/.appdata/IDApplicationID/Local Store
Bureau/home/NomUtilisateur/Desktop
Documents/home/NomUtilisateur/ Documents
Temporaire/tmp/FlashTmp.randomString
Utilisateur/home/NomUtilisateur
MacApplication/Applications/NomFichier.app/Contents/Resources
Stockage d'application/Utilisateurs/nomUtilisateur/Bibliothèque/Préférences/applicationid/Local Store (AIR 3.2 et versions ultérieures)chemin/Bibliothèque/Application Support/applicationid/Local Store (AIR 3.3 et versions ultérieures), où le chemin est soit/Utilisateurs/nomUtilisateur/Bibliothèque/Containers/bundle-id/Data (environnement de sandbox), soit /Utilisateurs/nomUtilisateur(exécution en dehors d'un environnement de sandbox)
Cache/Users/NomUtilisateur/Library/Caches
Bureau/Utilisateurs/nomUtilisateur/Desktop
Documents/Utilisateurs/nomUtilisateur/Documents
Temporaire/private/var/folders/JY/randomString/TemporaryItems/FlashTmp
Utilisateur/Utilisateurs/nomUtilisateur
Plate-formeType de réseauEmplacement de système de fischiers typique
WindowsApplicationC:\Program Files\NomFichier
Stockage d'applicationC:\Documents and settings\NomUtilisateur\ApplicationData\IDApplication\Local Store
CacheC:\Documents and settings\NomUtilisateur\Local Settings\Temp
BureauC:\Documents and settings\NomUtilisateur\Desktop
DocumentsC:\Documents and settings\NomUtilisateur\Mes documents
TemporaireC:\Documents and settings\NomUtilisateur\Local Settings\Temp\randomString.mp
UtilisateurC:\Documents and settings\NomUtilisateur
Les chemins natifs de ces répertoires varient en fonction du système d'exploitation et de la configuration de l'ordinateur. Les chemins indiqués dans ce tableau représentent des exemples typiques. Pointez toujours vers ces répertoires par le biais des propriétés statiques appropriées de la classe File, afin que l'application fonctionne correctement qu'elle que soit la plate-forme. Dans une application AIR réelle, les valeurs des variables IDApplication et NomFichier indiquées dans le tableau sont extraites du descriptor d'application. Si vous stipULEZ un ID d'éditeur dans le descriptor d'application, il est ajouté à la fin de l'ID d'application dans ces chemins. La valeur de NomUtilisateur correspond au nom du compte de l'utilisateur qui installe l'application.

Pointage d'un objet File vers un repertoire

Adobe AIR 1.0 et les versions ultérieures Vou dispossez de plusieurs méthodes pour configurer un objet File afin qu'il pointe vers un réseau.

Pointage vers le réseau d'accueil de l'utilisateur

Adobe AIR 1.0 et les versions ultérieures Voupe un objet File vers le repertoire d'accueil de l'utiliser.Le code suivant configue I'bject File afin qu'il pointe vers le sous-repertoire AIR Test du repertoire d'accueil :
var file:File = File.userDirectoryResolvedPath("AIR Test"); 

Pointage vers le repertoire de documents de l'utilisteur

Adobe AIR 1.0 et les versions ultérieures Voupez pointer un objet File vers le repertoire de documents de l'utiliseur. Le code suivant configure un objet File afin qu'il pointe vers le sous-repertoire AIR Test du repertoire de documents :
var file:File = File/documentsDirectory resolverPath("AIR Test"); 

Pointage vers le repertoire du poste de travail

Adobe AIR 1.0 et les versions ultérieures Voussouvez pointer un objet File vers le poste de travail. Le code suivant configure un objet File afin qu'il pointe vers le sous-repertoire AIR Test du poste de travail :
var file:File = File/DesktopDirectory resolverPath("AIR Test"); 

Pointage vers le repertoire de stockage d'une application

Adobe AIR 1.0 et les versions ultérieures

Vous pouvez pointer un objet File vers le repertoire de stockage d'une application. A toute application AIR est associé un chemin unique qui définit son repertoire de stockage. Ce repertoire est spécifique à chaque application et utilisateur. Vous pouvez y stocker des données spécifiques à l'application et à l'utilisateur, notamment des données utilisateur ou des fichiers de préférences. Par exemple, le code suivant pointe un objet File vers un fisier de préférences, refs.xml, qui resides dans le repertoire de stockage de l'application : var file:File = File.applicationStorageDirectory; file = file resolverPath("refs.xml"); L'emplacement du repertoire de stockage de l'application est généralement déterminé par le nom d'utilisateur et l'ID d'application. Les emplacements suivants au sein du système de fichiers sont indiqués ci-après à des fins de débogage d'application. Utilisez toujours la propriété File.applicationStorage ou le modele d'URI app-storage: pour résoudre les fichiers dans ce repertoire : - Sous Mac OS: dépend de la version AIR: AIR 3.2 et versions antérieures : /Utilisateurs/nom utilisateur/Bibliothèque/Préférences/applicationID/Local Store/ AIR 3.3 et versions ulterieures : chemin/Bibliotheque/Application Support/applicationID/Local Store, où chemin est soit /Utilisateurs/nomUtilisateur/Bibliothèque/Containers/bundle-id/Data (environnement de sandbox), soit /Utilisateurs/nomUtilisateur (exécution en dehors d'un environnement de sandbox) Par example (AIR 3.2): /Users/babbage/Library/Preferences/com.example.TestApp/Local Store - Sous Windows, dans le réseau Documents and Settings, dans : C:\Documents and Settings\nom d'utilisateur\Application Data\IDapplication\Local Store\ Example : C:\Documents and Settings\babbageApplication Data\com.example.TestApp\Local Store - Sous Linux, dans: /home/nom d'utilisateur/.appdata/IDapplication/Local Store/ Example : /home/babbage/.appdata/com.example.TestApp/Local Store - Sur Android, dans : /data/data/IDPackageAndroid/IDapplication/Local Store Example: /data/data/air.com.example.TestApp/com.example.TestApp/Local Store Remarque: si une application possède un identifiant d'éditeur, ce dernier figure également dans le chemin du réseau de stockage de l'application. L'URL (et la propriété url) d'un objet File créé à l'aide de File.applicationStorageDirectory utilise le modele d'URL app-storage (voir « Modèle d'URL AIR pris en charge » à la page 702), comme l'illustré l'exemple suivant : var dir:File File.applicationStorageDirectory; dir = dirresolvePath("preferences"); trace(dir.url); //app-storage:/preferences

Pointage vers le repertoire de l'application

Adobe AIR 1.0 et les versions ultérieures

Vous pouvez pointer un objet File vers le réseau dans lequel une application est installée, ou réseau d'application. Vous pouvez reférer ce réseau à l'aide de la propriété File.applicationDirectory. Il permet d'examiner le fjichier descripteur d'application ou d'autres ressources installées avec l'application. Par exemple, le code suivant pointe un objet File vers le réseau images du réseau d'application :
var dir:File = File.applicationDirectory;  
dir = dirResolvedPath("images"); 
L'URL (et la propriété url) d'un objet File créé à l'aide de File.applicationDirectory utilise le modèle d'URL app (voir « Modèles d'URL AIR pris en charge » à la page 702), comme l'illustré l'exemple suivant :
var dir:File = File.applicationDirectory;  
dir = dirResolvedPath("images");  
trace(dir.url); // app:/images 
Remarque: sur Android, il est impossible d'acceder aux fichiers du package d'application par le biais de nativePath. La propriété nationalePath est une chaine vide. Accedez toujours aux fichiers que contient le repertoire de l'application par le biais de l'URL,只不过 que d'un chemin natif.

Pointage vers le repertoire du cache

Adobe AIR 3.6 et les versions ultérieures

Voupe pointer un objet File vers le repertoire temporaire ou de cache du système d'exploitation en utilisant la propriete File.cacheDirectory. Ce repertoire contient des fischiers temporaires qui ne sont pas nécessaires à l'execution de l'application et dont la suppression ne cause pas de problèmes ni de pertes de données pour l'utiliseur. Dans la plupart des systèmes d'exploitation, le réseau de cache est un réseau temporaire. Sous iOS, le réseau de cache correspond au réseau Caches de la bibliothèque d'applications. Les fichiers de ce réseau ne sont pas sauvégardés sur le stockage en ligne et peuvent être supprimés par le système d'exploitation si l'espace de stockage disponible sur le périhérique est insuffisant. Pour plus d'informations, voir « Contrôle de la sauvégarde et de la mise en cache des fichiers » à la page 702.

Pointage vers la racine du système de fichiers

Adobe AIR 1.0 et les versions ultérieures

La méthode File.getRootDirectories() répertorie tous les volumes racine, tels que C: et les volumes montés, sur un ordinateur Windows. Sous Mac et Linux, cette méthode renvoie le réseau racine unique de l'ordinateur (le réseau « / »). La méthode StorageVolumeInfo.getStorageVolumes() propose des informations plus détaillées sur les volumes de stockage montés (voir « Utilisation des volumes de stockage » à la page 713). Remarque : il est impossible d'acceder en lecture à la racine du système de fichiers sur Android. La méthode renvoie un objet File qui pointe vers le réseau par le biais du chemin natif « / », mais les propriétés de cet objet n'ont pas de valeur précise. Par exemple, spaceAvailable correspond toujours à 0.

Pointage vers un repertoire explicite

Adobe AIR 1.0 et les versions ultérieures

Voupe pointer I'bject File vers un repertoire explicite en definissant sa propriete nativePath, comme l'illustre I'exemple ci-dessous (sous Windows) :
var file:File = new File();  
file.nativePath = "C:\\AIR Test"; 
Important : utiliser cette technique pour pointer vers un chemin explicite risque de générer un code qui ne fonctionne pas sur toutes les plates-formes. Ainsi, l'exemple précédent ne fonctionne que sous Windows. Les propriétés statiques de l'objet File, telles que File.applicationStorageDirectory, permettent de localiser un réseau qui fonctionne sur toutes les plates-formes. Utilisez ensuite la méthode resolvePath() (voir la section suivante) pour acceder à un chemin relatif.

Adobe AIR 1.0 et les versions ultérieures

La méthoderesolvePath() permet d'obtenir un chemin relatif à un autre chemin donné. Par exemple, le code suivant configure un objet File afin qu'il pointe vers le sous-répertoire « AIR Test » du réseau d'accueil de l'utilisateur :
var file:File = File.userDirectory;  
file = file resolverPath("AIR Test"); 
En outre, la propriété url d'un objet File permet de pointer celui-ci vers un repertoire base sur une chaine d'URL, comme illustré ci-dessous: var urlStr:String = "file://C:/AIR Test/"; var file:File new File() file.url urlStr; Pour plus d'informations, voir la section « Modification de chemins de fichier » à la page 702.

Sélection d'un réseau par l'utilisateur

Adobe AIR 1.0 et les versions ultérieures

La classe File comprend la méthode browserForDirectory(), qui présente une boîte de dialogue système dans laquelle l'utilisateur peut sélectionner un réseau à affecter à l'objet. La méthode browserForDirectory() est asynchrone. L'objet File distribue un événement select si l'utilisateur seLECTIONne un réseau et clique sur le bouton Ouvrir, ou un événement cancel si l'utilisateur clique sur le bouton Annuler. Par exemple, le code suivant permet à l'utilisateur de sélectionner un réseau et renvoie le chemin de celui-ci une fois la sélection effectuee :
var file:File = new File();  
file.addEventListener(Event.SELECT, dirSelected);  
file)browseForDirectory("Select a directory");  
function dirSelected(e:Event):void {  
    trace(file.nativePath);  
} 
Remarque: sur Android, la méthode browseForDirectory() n'est pas prise en charge. Appeler cette méthode n'a pas d'effet et un événement d'annulation est immédiatement distribué. Pour que les utilisateurs puisent selectionner un réseau, utilisez plutôt une boîte de dialogue personnalisée définie par l'application.

Pointage vers le réseau d'appoint de l'application

Adobe AIR 1.0 et les versions ultérieures Vou puez déterminer l'emplacement du réseau à partir duquel une application est appelée en consultant la propriété/currentDirectory de l'objet InvokeEvent distribué lors de l'appel de l'application. Pour plus d'informations, voir la section « Capture des arguments de ligne de commande » à la page 912.

Pointage d'un objet File vers un fichier

Adobe AIR 1.0 et les versions ultérieures Il existe plusieurs manières de définir le fjichier vers lequel pointe un objet File.

Pointage vers un chemin de fichier explicite

Adobe AIR 1.0 et les versions ultérieures Important : pointer vers un chemin explicite risque de générer un code qui ne fonctionne pas sur toutes les plateformes. Ainsi, le chemin C:/foo.txt ne fonctionne que sous Windows. Les propriétés statiques de l'objet File, telles que File.applicationStorageDirectory, permettent de localiser un réseau qui fonctionne sur toutes les plateformes. Utilisez ensuite la méthode resolvePath() (voir « Modification de chemins de fichier » à la page 702) pour acceder à un chemin relatif. La propriété url d'un objet File permet de pointer celui-ci vers un fisier ou un réseau base sur une chaîne d'URL, comme illustré ci-dessous : var urlStr:String = "file://C:/AIR Test/test.txt"; var file:File = new File() file.url = urlStr; Yououpouvezaussi transmettrelURLàlafonction constructeurFile(), commeillustréci-dessous:
var urlStr:String = "file:///C:/AIR Test/test.txt";  
var file:File = new File(urlStr); 
La propriété url renvoie systématiquement la version URI de l'URL (les espaces sont replacés par 920 , par exemple):
file.url = "file:///c:/AIR Test";  
trace(file.url); // file:///c:/AIR%20Test 
Vouss pouvez aussi utiliser la propriété nativePath d'un objet File pour définir un chemin explicite. Par exemple, le code suivant, executé sur un ordinateur Windows, définit un objet File sur le fichier test.txt du sous-repertoire AIR Test du lecteur C: :
var file:File = new File();  
file.nativePath = "C:/AIR Test/test.txt"; 
Vou puevez aussi transmettre ce chemin à la fonction constructeur File(), comme illustré ci-dessous :
var file:File = new File("C:/AIR Test/test.txt"); 
Utilisez la barre oblique (/) comme délimueur de chemin avec la propriété natione Path. Sous Windows, vous pouvez également utiliser la barre oblique inverse (\), mais l'application ne fonctionnera pas sur d'autres plateformes. Pour plus d'informations, voir la section « Modification de chemins de fichier » à la page 702.

Énumération des fichiers d'un réseau

Adobe AIR 1.0 et les versions ultérieures

La méthode getDirectoryListing() d'un objet File permet d'obtenir un tableau d'objects File pointant vers les fichiers et sous-repertoires situés au niveau racine d'un réseau. Pour plus d'informations, voir la section « Enumeration de répertoires » à la page 709.

Sélection d'un fichier par l'utilisateur

Adobe AIR 1.0 et les versions ultérieures

La classe File comprend les méthodes suivantes, qui doivent une boîte de dialogue système dans laquelle l'utilisateur peut seLECTIONner un fjichier à affecter à l'objet : - browseForOpen() - browseForSave() - browseForOpenMultiple() Toutes ces méthodes sont asynchrones. Les méthodes browseForOpen() et browseForSave() distribuènt l'évenancement select lorsque l'utilisateur séLECTIONne un fjichier (ou, dans le cas de browseForSave(), un chemin cible). Avec les méthodes browseForOpen() et browseForSave(), lors de la sélection, l'objet File pointe vers les fjichiers sélectionnés. La méthode browseForOpenMultiple() distribue un événement selectMultiple lorsque l'utilisateur sélectionne des fjichiers. L'évenancement selectMultiple est de type FileListEvent et possède une propriété files, c'est-à-dire un tableau d'objets File (pointant vers les fjichiers sélectionnés). Par exemple, le code suivant présente une boîte de dialogue d'ouverture de filchier à l'utilisateur, lui permettant ainsi de seLECTIONner un filchier : var fileToOpen:File File/documentsDirectory; selectTextFile(fileToOpen); function selectTextFile(root.File):void { var txtFilter:FileFilter = new Filter("Text","*.as;*.css;*.html;*.txt;*.xml"); root.browseForOpen("Open", [txtFilter]); root.addEventListener(Event.SELECT, fileSelected); } function fileSelected(event:Event):void { trace(fileToOpen.nativePath); } Si une autre boîte de dialogue de navigation est ouverte dans l'application lors de l'appel d'une méthode browse, le moteur d'exécution renvoie une exception Error. Remarque: sur Android, les méthodes browseForOpen() et browseForOpenMultiple() permettent de sélectionner des fichiers d'image, video et audio uniquement. La boîte de dialogue browseForSave() affiche elle aussi les fichiers multiméias uniquement, même si l'utilisateur peut saisir un nom de fichier arbitraire. Pour ouvrir et enregistrer des fichiers d'un autre type, envisagez l'utilisation de boîtes de dialogue personnalises au lieu de ces méthodes.

Modification de chemins de fichier

Adobe AIR 1.0 et les versions ultérieures

Voupez egalent modifier le chemin d'un objet File existant en appelant la methode resolvePath() ou en intervenant sur la propriete native Path ou url de l'objet, comme l'illustrent les exemples suivants (sous Windows):
var file1:File = File/documentsDirectory;  
file1 = file1 resolverPath("AIR Test");  
trace(file1.nativePath); // C:\Documents and Settings\userName\My Documents\AIR Test  
var file2:File = File/documentsDirectory;  
file2 = file2 resolverPath("\\..");  
trace(file2.nativePath); // C:\Documents and Settings\userName  
var file3:File = File/documentsDirectory;  
file3.nativePath += "/subdirectory";  
trace(file3.nativePath); // C:\Documents and Settings\userName\My Documents\subdirectory  
var file4:File = new File();  
file4.url = "file:///c:/AIR Test/test.txt";  
trace(file4.nativePath); // C:\AIR Test\test.txt 
Si vous faites appel à la propriété nativePath, utilisez la barre oblique (/) comme caractère de séparation des repertoires. Sous Windows, vous pouvez également utiliser la barre oblique (\), mais évitez de le faire, sous peine de générer un code qui ne fonctionne pas sur toutes les plates-formes.

Modèles d'URL AIR pris en charge

Adobe AIR 1.0 et les versions ultérieures

Lorsque you définissez la propriété url d'un objet File dans AIR, vous pouvez utiliser les modèles d'URL suivants :
Modèle d'URLDescription
filePermet de spécifique un chemin relatif à la racine du système de fichiers. Exemple : file:///c:/AIR Test/test.txt LaAPE URL spécifique qu'un modele d'URL file se présente comme suit : file://<hôte>/<chemin>. <hôte> peut correspondre à la chaîne vide, ce qui signifie « la machine à partir de laquelle l'URL est interprétable ». C'est pourquois les modèles d'URL file comportent souvent trois barres obliques (//).
appPermet de spécifique un chemin relatif au répertoire racine de l'application installée (le répertoire contenant le fichier application.xml de l'application installée). Par exemple, le chemin suivant pointe vers le sous-répétaire images du répertoire de l'application installée : app : /images
app-storagePermet de spécifique un chemin relatif au répertoire de stockage de l'application. Pour chaque application installée, AIR définit un répertoire de stockage d'application unique. C'est un emplacement pratique auquel stocker des données spécifiques à l'application concernée. Par exemple, le chemin suivant pointe vers le fichier prefs.xml, qui réside dans le sous-répétaire settings du répertoire de stockage de l'application : app-storage : /settings/prefs.xml

Contrôle de la sauvégarde et de la mise en cache des fichiers

Adobe AIR 3.6 et les versions ultérieures, iOS et OS X uniquement

Certain systèmes d'exploitation, notamment iOS et Mac OS X, offrent aux utilisateurs la possibilité de sauvegarder automatiquement les fichiers d'application sur un serveur de stockage distant. En outre, iOS présente des restrictions concernant la sauvegarde des fichiers et l'emplacement de stockage des différents types de fichier. Les points suivants seront de façon succincte comment rester en conformite avec les directives d'Apple concernant la sauvegarde et le stockage des fichiers. Pour plus d'informations, voir les sections suivantes. - Pour spécifique qu'un fjchier n'a pas besoin d'être sauvegarde et (iOS uniquement) peutetre supprimé par le systeme d'exploitation si le periphérique manque d'espace de stockage, enregistrez le fjcher dans le repertoire de cache (File.cacheDirectory). Il s'agit de l'emplacement de stockage par default sous iOS, et il doitetre utilisé pour la plupart des fjchiers qui peuventetre regenerés ou retélécharges. - Pour spécifique qu'un fjichier n'a pas besoin d'être sauvégâdre, mais qu'il ne doit pas être supprimé par le système d'exploitation, enregistrez-le dans l'un des répertoires de la bibliothèque d'applications, comme le réseau de stockage des applications (File.applicationStorageDirectory) ou le réseau de documents (File/documentsDirectory). Définissez la propriété préventBackup de l'objet File sur true. Apple demande de procéder de cette manière pour tout contenu qu'il est possible de générer ou télécharger à nouveau, mais qui est nécessaire au bon fonctionnement de votre application lors d'une'utilisation hors ligne.

Spcification des fichiers à sauvegarder

Afin d'économiser l'espace de sauvegarde et de réduire le traffic réseau, les directives d'Apple pour les applications iOS et Mac spécifient que seuls les fichiers contenant des données saisies par l'utilisateur ou des données qu'il n'est pas possible de générer ou de télécharger à nouveau doivent être marqués comme « à sauvegarder ». Par défaut, tous les fichiers des dossiers de la bibliothèque d'applications sont sauvégardés. Sous Mac OS X, il s'agit du répertoire de stockage des applications. Sous iOS, cela inclut le réseau de stockage de l'application, le réseau d'application, le réseau Bureau, le réseau de documents et le réseau de l'utilisateur (car ces répertoires sont mappés sur les dossiers de la bibliothèque d'applications sur iOS). Par conséquent, tous les fichiers de ces répertoires sont sauvégardés par défaut sur serveur de stockage. Si vous enregistrez dans l'un de ces emplacements un fjichier que votre application peut recrêer, il est recommendé de lui appliquer un marqueeur de sorte que le système d'exploitation ne le sauvegarde pas. Pour indiquer qu'un fjichier ne doit pas'être sauvégarde, définiSEE la propriété préventBackup de l'objet File sur true. Remarque : sous iOS, tout fisier se trouvant dans l'un des dossiers de la bibliothèque d'applications (meme si sa propriété préventBackup a la valeur true) est marqué comme un fisier persistant que le système d'exploitation ne doit pas supprimer.

Contrôle de la mise en cache et de la suppression des fichiers

Les directives d'Apple concernant les applications iOS spécifique que, dans la mesure du possible, tout contenu qu'il est possible de regénérer doit pouvoir être supprimé par le système d'exploitation si l'espace de stockage est insuffisant sur le pérophérique. Sous iOS, les fichiers des dossiers de la bibliothèque d'applications ( comme le réseau de stockage de l'application ou le réseau de documents) sont marqués comme permanents et ne sont pas supprimés par le système d'exploitation. Enregistrez les fichiers que l'application peut régérer et qui peuvent être supprimés sans risque si l'espace de stockage est insuffisant dans le réseau de cache de l'application. Pour acceder au réseau de cache, utilisez la propriété statique File.cacheDirectory. Sous iOS, le réseau de cache correspond au réseau de cache de l'application (/Library/Caches). Sous d'autres systèmes d'exploitation, ce réseau est mapped sur un réseau comparable. Par exemple, sous Mac OS X, il est également mapped sur le réseau Caches de la bibliothèque d'applications. Sous Android, le réseau de cache est mapped sur le réseau de cache de l'application. Sous Windows, le réseau de cache est mapped sur le réseau temp du système d'exploitation. Sous Android et sous Windows, il s'agit du même réseau que celui auquel accès un appel aux méthodes createTempDirectory() et createTempFile() de la classe File.

Détermination du chemin relatif entre deux fichiers

Adobe AIR 1.0 et les versions ultérieures

La méthode getRelativePath() vous permet de déterminer le chemin relatif entre deux fischiers :
var file1:File = File/documentsDirectory resolverPath("AIR Test");  
var file2:File = File/documentsDirectory  
file2 = file2 resolverPath("AIR Test/bob/test.txt");  
trace(file1.getRelativePath(file2)); // bob/test.txt 
Le deuxième paramètre de la méthode getRelativePath(), useDotDot, permet le renvoi de la syntaxe .. dans les résultats, pour représentier les dépertoires parent : var file1:File = File/documentsDirectory; file1 file1 resolverPath("AIR Test"); var file2:File = File/documentsDirectory; file2 file2 resolverPath("AIR Test/bob/test.txt"); var file3:File = File/documentsDirectory; file3 file3 resolverPath("AIR Test/susan/test.txt"); trace(file2.getRelativePath(file1, true)); // ../.. trace(file3.getRelativePath(file2, true)); // ../../bob/test.txt

Obtention des versions canoniques des noms de fichier

Adobe AIR 1.0 et les versions ultérieures

Les noms de fichier et de chemin ne respectent pas la casse sous Windows et Mac OS. Dans l'exemple suivant, deux objets File pointent vers un même fichier :
File/documentsDirectory resolverPath("test.txt"); File/documentsDirectory resolverPath("TeSt.TxT"); 
Les noms de document et de répertoire, en revanche, respectent la casse. Ainsi, l'exemple suivant considère comme acquis qu'il existe un dossier appelé AIR Test dans le répertoire documents :
var file:File = File/documentsDirectory resolverPath("AIR test");   
trace(file.nativePath); // ... AIR test   
file.canonicalize();   
trace(file.nativePath); // ... AIR Test 
La méthode canonicalize() convertit l'objet nativePath afin qu'il utilise la combinaison correcte de majuscules et de minuscules dans le nom de fichier ou de répertoire. Sur les systèmes de fichiers sensibles à lacke (teils que Linux), lorsque plusieurs noms de fichier ne diffèrent que par la casse, la méthode canonicalize() ajusté le chemin de sorté qu'il corresponde au premier fichier déprétré (dans l'ordre déterminé par le système de fichiers). Voussous: var path:File = new File(); path.nativePath = "C:\AIR\~1"; path.canonicalize(); trace(path.nativePath); // C:\AIR Test

Utilisation de packages et de liens symboliques

Adobe AIR 1.0 et les versions ultérieures

Divers systèmes d'exploitation prennant en charge les fichiers de package et les fichiers de lien symbolique : Packages—Sous Mac OS, les repertoires peuvent être désignés comme packages et apparaisent dans le Finder sous la forme d'un fichier unique只不过 que d'un repertoire. Liens symboliques—Mac OS, Linux, et Windows Vista prennet en charge les liens symboliques. Les liens symboliques permettent à un fischié de pointer vers un autre fischié ou répertoire du disque. Bien que similaires aux alias, les liens symboliques diffèrent toutefois de ceux-ci. Un alias est systématiquement identifié en tant que fischié (plutôt que répertoire). La lecture d'un alias (ou raccourci) ou l'écriture dans celui-ci n'a aucune incidence sur le fischié ou le répertoire d'origine vers lequel il pointe. En revanche, un lien symbolique se comporte exactement comme le fischié ou le répertoire vers lequel il pointe. Il peut être identifié en tant que fischié ou répertoire. La lecture d'un lien symbolique ou l'écriture dans celui-ci affecte le fischié ou le répertoire vers lequel il pointe, pas le lien symbolique lui-même. De plus, sous Windows, la propriété isSymbolicLink d'un objet File référencrant un point de jonction (utilisé dans le système de fischiers NTFS) est définie sur true. La classe File comprend les propriétés isPackage et isSymbolicLink qui permettent de vérifier si un objet File reférence un package ou un lien symbolique. Le code suivant effectue une itération sur le réseau du poste de travail de l'utilisteur, répertioriant les sous-repertoires qui ne sont pas des packages : var desktopNodes:Array = File/DesktopDirectory.getDirectoryListing(); for (var i:uint = 0 ; < desktopNodes.length; i + + ) { if (desktopNodes[i].isDirectory && !desktopNodes[i].isPackage) { trace(desktopNodes[i].name); } } Le code suivant effectue une itération sur le repertoire du poste de travail de l'utilisateur, repertioriant les fichiers et repertoires qui ne sont pas des liens symboliques : var desktopNodes:Array = File/DesktopDirectory.getDirectoryListing(); for(var i:uint = 0 ;i< desktopNodes.length; i + + ) { if(!desktopNodes[i].isSymbolicLink) { trace(desktopNodes[i].name); } } La méthode canonicalize() modifie le chemin d'un lien symbolique de sorte qu'il pointe vers le fichier ou le répertoire auquel le fichier ou le répertoire fait ↔reference. Le code suivant effectue une iteration sur le ↑é repertoire du poste de travail de l'utilisateur et identifie les chemins ↔référencés par des fichiers qui sont des liens symboliques : var desktopNodes:Array = File/DesktopDirectory.getDirectoryListing(); for (var i:uint = 0 ; < desktopNodes.length; i + + ) { if (desktopNodes[i].isSymbolicLink) { var linkNode:File = desktopNodes[i] as File; linkNode.canonicalize(); trace(linkNode.nativePath); }

Determination de l'espace disponible sur un volume

Adobe AIR 1.0 et les versions ultérieures

La propriété空間Available d'un objet File représenté l'espace disponible utilisable, en octets, à l'emplacement de l'objet. Par exemple, le code suivant vérifie l'espace disponible dans le repertoire de stockage d'application : trace(File.applicationStorageDirectory.spaceAvailable); Si l'objet File référence un réseau, la propriété spaceAvailable indique l'espace que peuvent utiliser les fischiers dans le réseau. Si l'objet File référence un fjichier, la propriété spaceAvailable indique l'espace maximal que peut occuper le fjichier. Si l'emplacement de fjichier n'existe pas, la propriété spaceAvailable est définie sur 0. Si l'objet File référence un lien symbolique, la propriété spaceAvailable est définie sur l'espace disponible à l'emplacement vers lequel pointe le lien symbolique. En règle générale, l'espace disponible pour un réseau ou un fjichier correspond à l'espace disponible sur le volume contenant ce réseau ou fjichier. Cependant, l'espace disponible peut tener compte de quotas et de limites par réseau. Lors de l'ajout d'un fichier ou d'un réseau à un volume, l'espace nécessaire est généralement supérieur à la taille réelle du fichier ou à la taille du contenu du réseau. Il se peut, par exemple, que le système d'exploitation requiert de l'espace supplémentaire pour stocker des informations d'index. Les secteurs de disque requis utilisent peut-être de l'espace en plus. En outre, l'espace disponible change dynamiquement. Il est donc impossible d'allouer tout l'espace indiqué au stockage des fischiers. Pour plus d'informations sur l'écriture dans le système de fischiers, voir la section « Lecture et écriture de fischiers » à la page 715. La méthode StorageVolumeInfo.getStorageVolumes() propose des informations plus détaillées sur les volumes de stockage montés (voir « Utilisation des volumes de stockage » à la page 713).

Ouverture de fichiers dans l'application système définie par défaut

Adobe AIR 2 et ultérieur

AIR 2 permet d'ouvrir un fichier dans l'application enregistrée à cet effet par le système d'exploitation. Une application AIR peut ainsi ouvrir un fichier DOC dans l'application enregistrée à cet effet. Faites appel à la méthode openWithDefaultApplication() d'un objet File pour ouvrir le fichier. Le code suivant ouvre par exemple le fichier test.doc sur le bureau de l'utilisateur dans l'application associée par défaut aux fichiers DOC :
var file:File = File/Desktop;  
file = file resolverPath("test.doc");  
file.openWithDefaultApplication(); 
Remarque : sous Linux, le type MIME du fichier, plutot que son extension, détermine l'application associée par défaut à un fichier. Le code suivant permet à l'utilisateur d'acceder à un fichier MP3 et de l'ouvrir dans l'application associée par défaut à la lecture des fischiers MP3 :
var file:File = File/documentsDirectory;  
var mp3Filter:FileFilter = new FileFilter("MP3 Files", "*.mp3");  
filebrowseForOpen("Open", [mp3Filter]);  
file.addEventListener(Event.SELECT, fileSelected);  
function fileSelected(e:Event):void {  
    file.openWithDefaultApplication();  
} 
Il est impossible d'utiliser la méthode openWithDefaultApplication() pour les fichiers qui résident dans le repertoire de l'application. AIR you interdit d'utiliser la methode openWithDefaultApplication() pour ourir certains fichiers. Sous Windows, AIR you interdit d'ouvrir les fichiers de type EXE ou BAT, par exemple. Sous Mac OS et Linux, AIR you empêche d'ouvrir les fichiers qui s'exécutent dans une application spécifique (y compris Terminal et AppletLoader sous Mac OS, ainsi que csh, bash ou ruby sous Linux). Tenter d'ouvrir l'un de ces fichiers par le bias de la methode openWithDefaultApplication() renvoie une exception. Pour obtenir la liste complète des types de fichiers concernés, voir la rubrique du guide de référence du langage consacrée à la methode File.openWithDefaultApplication(). Remarque: cette limitation n'este pas pour une application AIR installee a l'aide d'un programme d installation natif (application de bureau etendue).

Obtention d'informations sur le système de fichiers

Adobe AIR 1.0 et les versions ultérieures

La classe File comprend les propriétés statiques suivantes, qui fournissant des renseignements utiles sur le système de fichiers :
PropriétéDescription
File.lineEndingSéquence de caractères de fin de ligne utilisée par le système d'exploitation hôte. Sous Mac OS et Linux, il s'agit du caractère de nouvelle ligne. Sous Windows, il s'agit du retour chariot suivi du caractère de nouvelle ligne.
File separatorsSéparateur d'élement de chemin utilisé par le système d'exploitation hôte. Sous Mac OS et Linux, il s'agit de la barre oblique (/). Sous Windows il s'agit de la barre oblique inverse (\).
FilesystemCharsetCodage appliqué par défaut aux fichiers par le système d'exploitation hôte. Ce codage relève du jeu de caractères utilisé par le système d'exploitation et correspond à la langue en vigueur sur celui-ci.
La classe Capabilities comprend également des informations système qui peuvent être utiles lors de la manipulation des fichiers :
PropriétéDescription
Capabilities.hasIMESpécifie si le lecteur s'exécute sur un système qui dispose (true) ou non (false) d'un éditeur de méthode d'entrée (IME).
Capabilities.languageIndique le code de langue du système sur lequel s'exécute le lecteur.
Capabilities.osSpécifie le système d'exploitation actuel.
Remarque: faites preuve de prudence lorsque vous utilisez Capabilities. os pour déterminer les caractéristiques du système. S'il existe une propriété plus spécifique pour déterminer une caractéristique du système, utilisez-la. Vous risquez sinon d'écrite un code qui ne fonctionne pas correctement sur toutes les plates-formes. Considerons par exemple le code qui suit : var separator:String; if (Capabilities.os.indexOf("Mac") > -1) { separator = "/"; } else { separator = "\\"; } Ce code cause des problèmes sous Linux. Il est préféable d'utiliser simplement la propriété File.separator.

Utilisation de repertoires

Adobe AIR 1.0 et les versions ultérieures

Le moteur d'exécution vous permet de manipuler les répertoires du système de fichiers local. Pour plus de détails sur la création d'objets File qui pointent vers des répertoires, voir la section « Pointage d'un objet File vers un réseau » à la page 696.

Création de répertoires

Adobe AIR 1.0 et les versions ultérieures

La méthode File.createDirectory() permet de创建工作 un repertoire. Par exemple, le code suivant创建工作 le repertoire AIR Test en tant que sous-répertoire du repertoire d'accueil de l'utilisateur :
var dir:File = File.userDirectoryresolvePath("AIR Test");  
dir.createDirectory(); 
Si le repertoire existe, la méthode createDirectory() n'agit pas. Par ailleurs, dans certains modes, un objet FileStream create des repertoires à l'ouverture des fischiers. Les repertoires qui n'existant pas sont créés lorsque vous instanciez une occurrence de FileStream en définissant le paramètre fileMode du constructeur FileStream() sur Mode.APPEND ou Mode.WRITE. Pour plus d'informations, voir la section « Flux de travail pour la lecture et l'écriture de fischiers » à la page 715.

Création d'un réseau temporaire

Adobe AIR 1.0 et les versions ultérieures

La classe File comprend la méthode createTempDirectory(), qui creé un réseau dans le réseau temporaire système, comme l'illustrer l'exemple suivant:
var temp:File = File.createTempDirectory(); 
La méthode createTempDirectory() creé automatiquement un réseau temporaire unique (ce qui vous évite d'avoir à déterminer un nouvel emplacement unique). Vous pouvez utiliser un réseau temporaire pour stocker provisoirement des fischiers temporaires utilisés au cours d'une session de l'application. Vous remarquerez que la méthode createTempFile() permet de créé des fischiers temporaires uniques dans le réseau temporaire système. Voupez eventuellement supprimer le repertoire temporaire avant de fermer l'application, car cette operation n'est pas automatiquement effectue sur tous les périhériques.

Énumération de répertoires

Adobe AIR 1.0 et les versions ultérieures

Les méthodes getDirectoryListing() ou getDirectoryListingAsync() d'un objet File permettant d'obtenir un tableau d'objets File pointant vers les fichiers et sous-répertoires d'un réseau. Par exemple, le code suivant répertorie le contenu du réseau de documents de l'utilisateur (sans examiner les sous-répertoires): var directory:File = File/documentsDirectory; var contents:Array = directory.getDirectoryListing(); for(var i:uint = 0 ;iCopie et déplacement de repertoires

Adobe AIR 1.0 et les versions ultérieures

Vou puez copier ou deplacer un repertoire, en utilisant les mêmes méthodes que pour un fichier. Par exemple, le code suivant copie un repertoire en mode synchrone :
var sourceDir:File = File/documentsDirectory resolverPath("AIR Test");  
var resultDir:File = File/documentsDirectory resolverPath("AIR Test Copy");  
sourceDir.copyTo(resultDir); 
Lorsque vous définissez le paramètre overwrite de la méthode copyTo() sur true, tous les fischiers et dossiers d'un réseau cible existant sont supprimés et remplacés par les fischiers et dossiers du réseau source (meme si le réseau cible n'este pas dans le réseau source). Le repertoire sur lequel vous définisse le paramètre newLocation de la méthode copyTo() spécifie le chemin d'accès au repertoire résultat, et non le repertoire parent qui contendra le repertoire résultat. Pour plus d'informations, voir la section « Copie et déplacement de fichiers » à la page 711.

Suppression du contenu d'un repertoire

Adobe AIR 1.0 et les versions ultérieures

La classe File comprend les méthodes deleteDirectory() et deleteDirectoryAsync(). Ces méthodes suppliment des repertoires. La première s'exécute en mode synchrè et la seconde en mode asynchronè (voir la section « Principes de base des classes File d'AIR » à la page 692). Elles comprend toutes deux le paramètre deleteDirectoryContents (qui accepte une valeur booléeenne). Lorsque ce paramètre est défini sur true (la valeur par défaut correspond à false), l'appel de la méthode supprime les répertoires non vides ; sinon, seuils les répertoires vides sont supprimés. Par exemple, le code suivant supprime en mode synchrone le sous-repertoire AIR Test du repertoire de documents de l'utilisateur :
var directory:File = File/documentsDirectory resolverPath("AIR Test");  
directory.deleteDirectory(true); 
Le code suivant supprime en mode asynchrone le sous-répertoire AIR Test du réseau de documents de l'utilisateur :
var directory:File = File/documentsDirectory resolverPath("AIR Test");  
directory.addEventListener(Event.COMPLET, completeHandler)  
directory.deleteDirectoryAsync(true); 
function completeHandler(event:Event):void{ trace("Deleted.") } 
Vous disposez également des méthodes moveToTrash() et moveToTrashAsync(), qui permettent de déplacer un réseau vers la corbeille système. Pour plus d'informations, voir la section « Déplacement d'un fichier vers la corbeille » à la page 713.

Utilisation des fichiers

Adobe AIR 1.0 et les versions ultérieures

L'API de fichiers d'AIR vous permet d'ajouter des fonctionnalités de manipulation des fichiers de base à vos applications. Vous pouze ainsi acceder à des fichiers en lecture ou en écriture, copier et supprimer des fichiers, etc. Comme vos applications ont accès au système de fichiers local, voir le chapitre « Sécurité AIR » à la page 1122, si ce n'est déjà fait. Remarque : vous pouvez associer un type de fichier à une application AIR (afin qu'un double-clic sur le fichier entraine l'ouverture de l'application). Pour plus d'informations, voir la section « Gestion des associations de fichiers » à la page 920.

Obtention d'informations sur les fichiers

Adobe AIR 1.0 et les versions ultérieures

La classe File comprend les propriétés suivantes qui fournissent des informations sur un fichier ou un repertoire vers lequel pointe un objet File :
Propriété FileDescription
creationDateDate de création du fichier sur le disque local.
creatorObsolesse. Utilisez la propriété extension. (Cette propriété renvoie le type de creator Macintosh du fichier, qui est uniquement utilisé dans les versions de Mac OS antérieures à Mac OS X.)
downloaded(AIR 2 et les versions ultérieures) Indique si le fichier ou le réseau référencé a été téléchargeé (depuis Internet) ou non. Cette propriété est utile uniquement sur les systèmes d'exploitation dans lesquels les fichiers peuvent être marqués comme télécharges :• Windows XP Service Pack 2 et versions ultérieures, et Windows Vista• Mac OS 10.5 et versions ultérieures
existsIndique si le fichier ou réseau référencé existe.
extensionExtension de fichier, partie du nom qui suit (sans l'inclure) le point (« . »). Si le nom de fichier ne comprend pas de point, l'extension est null.
iconObjet Icon contenant les icones définies pour le fichier.
isDirectoryIndique si l'objet File ↔ reference un réseau.
modificationDateDate de la dernière modification du fichier ou du réseau sur le disque local.
nameNom du fichier ou réseau (y compris l'eventuelle extension de fichier) sur le disque local.
nativePathChemin complet dans la représentation du système d'exploitation hôte (voir la section « Chemin des objets File » à la page 693).
parentDossier qui contient le dossier ou fichier représenté par l'objet File. Cette propriété est null si l'objet File ↔ reference un fichier ou un réseau dans la racine du système de fichiers.
sizeTaille du fichier sur le disque local, en octets.
typeObsolesse. Utilisez la propriété extension. (Sur le Macintosh, cette propriété correspond au type de fichier de quatre caractères qui est uniquement utilisé dans les versions de Mac OS antérieures à Mac OS X).
urlURL du fichier ou du réseau (voir la section « Chemin des objets File » à la page 693).
Pour plus d'informations sur ces propriétés, voir l'entrée consacrée à la classe File dans le manuel Guide de référence ActionScript 3.0 pour la plate-forme Adobe Flash.

Copie et déplacement de fichiers

Adobe AIR 1.0 et les versions ultérieures

La classe File comprend deux méthodes permettant de copier des fischiers ou des répertoires: copyTo() et copyToAsync(). Elle propose également deux méthodes permettant de déplacer des fischiers ou des répertoires: moveTo() et moveToAsync(). Les méthodes copyTo() et moveTo() s'exécutent en mode synchrone, les méthodes copyToAsync() et moveToAsync() en mode asynchrone (voir la section « Principes de base des classes File d'AIR » à la page 692). Pour copier ou déplacer un fisier, vous définissez deux objets File. L'un pointe vers le fisier à copier ou déplacer et appelle la méthode copy ou move. L'autre pointe vers le chemin de destination (résultant). Le code suivant copie le fichier test.txt qui resides dans le sous-répertoire AIR Test du répertoire de documents de l'utilisateur vers le fichier copy.txt dans le même répertoire : var original:File = File/documentsDirectory resolverPath("AIR Test/test.txt"); var newFile:File = File resolverPath("AIR Test/copy.txt"); original.copyTo(newFile, true); Dans cet exemple, la valeur du deuxième paramètre, overwrite, de la méthode copyTo() est définitie sur true. Si vous définisse le paramètre overwrite sur true, tout fjichier cible existant est replacé. Ce paramètre est facultatif. Si vous le définisse sur false (valeur par défaut), un événement IOErrorEvent est distribué si le fjichier cible existe (et le fjichier n'est pas copiedé). La version « Async » des méthodes copy et move s'exécuté en mode asynchrone. La méthode addEventListener() permet de surveiller la fin de la tâche ou les erreurs, comme l'illustré le code suivant : var original = File/documentsDirectory; original = original resolverPath("AIR Test/test.txt"); var destination:File = File/documentsDirectory; destination = destination resolverPath("AIR Test 2/copy.txt"); original.addEventListener(Event.COMPLET, fileMoveCompleteHandler); original.addEventListener(IOErrorEvent.IO_ERROR, fileMoveIOErrorEventHandler); original.moveToAsync(destination); function fileMoveCompleteHandler(event:Event):void { trace(event.target); // [object File] } function fileMoveIOErrorErrorHandler(event:IOErrorEvent):void { trace("I/O Error."); } La classe File comprend également les méthodes File.moveToTrash() et File.moveToTrashAsync(), qui déplacent un fjichier ou un réseau vers la corbeille système.

Suppression d'un fichier

Adobe AIR 1.0 et les versions ultérieures

La classe File comprend les méthodes deleteFile() et deleteFileAsync(). Ces méthodes suppriment des fichiers. La première s'exécute en mode synchrè et la seconde en mode asynchronè (voir la section « Principes de base des classes File d'AIR » à la page 692). Par exemple, le code suivant supprime, en mode synchrone, le fichier test.txt du repertoire de documents de l'utilisateur :
var file:File = File/documentsDirectory resolverPath("test.txt");  
file.deleteFile(); 
Le code suivant supprime, en mode asynchrone, le fichier test.txt du repertoire de documents de l'utilisateur : var file:File = File/documentsDirectory resolverPath("test.txt"); file.addEventListener(Event.COMPLETET,completeHandler) file(deleteFileAsync(); function completeHandler(event:Event):void{ trace("Deleted.") } Vous disposez également des méthodes moveToTrash() et moveToTrashAsync(), qui permettent de déplacer un fichier ou un réseau vers la corbeille système. Pour plus d'informations, voir la section « Déplacement d'un fichier vers la corbeille » à la page 713.

Déplacement d'un fichier vers la corbeille

Adobe AIR 1.0 et les versions ultérieures La classe File comprend les méthodes moveToTrash() et moveToTrashAsync(). Ces méthodes envoient un fichier ou un repertoire dans la corbeille système. La première s'exécute en mode synchrone et la seconde en mode asynchrone (voir la section « Principes de base des classes File d'AIR » à la page 692). Par exemple, le code suivant déplace, en mode synchrone, le fichier test.txt du repertoire de documents de l'utilisateur vers la corbeille système :
var file:File = File/documentsDirectory resolverPath("test.txt");  
file.moveToTrash(); 
Remarque: sur les systèmes d'exploitation qui ne prennt pas en charge le concept de dossier de corbeille récuperable, ces fichiers sont immédiatement supprimés.

Création d'un fichier temporaire

Adobe AIR 1.0 et les versions ultérieures La classe File comprend la méthode createTempFile(), qui creé un fisier dans le réseau temporaire système, comme l'illustré l'exemple suivant:
var temp:File = File.createTempFile(); 
La méthode createTempFile() creé automatiquement un filchier-temporaire unique (ce qui vous évite d'avoir à déterminer un nouvel emplacement unique). Vouss pouvez utiliser un fjichier temporaire pour stocker provisorement des informations utilisées au cours d'une session de l'application. Vous remarquerez que vous disposez également de la méthode createTempDirectory(), qui permet de creator un réseau temporaire unique dans le réseau temporaire système. Vou puez eventuellement supprimer le fichier temporaire avant de fermer l'application, car cette operation n'est pas automatiquement effectuée sur tous les périhériques.

Utilisation des volumes de stockage

Adobe AIR 2 et ultérieur AIR 2 permet de détecter le montage ou le démontage des volumes de stockage de masse. La classe StorageVolumeInfo définit unobjet storageVolumeInfo singleton. L'objet StorageVolumeInfo storingVolumeInfo distribue un événement storageVolumeMount lors du montage d'un volume de stockage. Il distribue également un événement storageVolumeUnmount lors du démontage d'un volume. La classe StorageVolumeChangeEvent définit ces événements. Remarque: sur les distributions récentes de Linux, l'objet StorageVolumeInfo ne distribue les événements storageVolumeMount et storageVolumeUnmount que pour les péripériques physiques et les lecteurs réseau montés à des emplacements déterminés. La propriété storageVolume de la classe StorageVolumeChangeEvent est un objet StorageVolume. La classe StorageVolume définit les propriétés de base du volume de stockage : - drive:metre de lecteur d'un volume sous Windows (null sous les autres systèmes d'exploitation) - fileSystemType: type du système de fichiers sur le volume de stockage (« FAT », « NTFS », « HFS » ou « UFS », par exemple). - isRemoveable: indique si un volume peut être retire (true) ou non (false). - isWritable: indique si un volume est inscribable (true) ou non (false). name : nom du volume - rootDirectory: objet File correspondant au repertoire racine du volume La classe StorageVolumeChangeEvent comprend également une propriété rootDirectory, à savoir un objet File qui reférence le réseau racine du volume de stockage monté ou démonté. La propriété storageVolume de l'objet StorageVolumeChangeEvent n'est pas définie (autrement dit, elle correspond à null) si le volume est démontré. Vous pouvez toutes acceder à la propriété rootDirectory de l'évenement. Le code suivant indique le nom et le chemin d'un volume de stockage lorsqu'il est monté :
StorageVolumeInfo.StorageVolumeInfo.addEventListener(StorageVolumeChangeEvent.STORAGEVolumes,
    _MOUNT, onVolumeMount);
function onVolumeMount(event:StorageVolumeChangeEvent):void
{
    trace(event.StorageVolume.name, event.rootDirectory.nativePath);
} 
Le code suivant indique le chemin d'un volume de stockage lorsqu'il est démontré :
StorageVolumeInfo.StorageVolumeInfo.addEventListener(StorageVolumeChangeEvent.STORAGEVolumes _UNMOUNT, onVolumeUnmount);   
function onVolumeUnmount(event:StorageVolumeChangeEvent):void   
{ trace(event.rootDirectory.nativePath);   
} 
L'objet StorageVolumeInfo storingVolumeInfo comprend une méthode getStorageVolumes(). Cette méthode renvoie un vecteur d'objets StorageVolume qui correspondant aux volumes de stockage actuellement montés. Le code suivant indique comment afficher le nom et le réseau racine de tous les volumes de stockage montés :
var volumes:Vector.<StorageVolume> = new Vector.<StorageVolume>;  
volumes = StorageVolumeInfo(storageVolumeInfo.getStorageVolumes();  
for (var i:int = 0; i < volumes.length; i++)  
{  
    trace(volumes[i].name, volumes[i].rootDirectory.nativePath);  
} 
Remarque : sur les distributions récentes de Linux, la méthode getStorageVolumes () renvoie des objets correspondant à des périhériques physiques et à des lecteurs réseau montés à des emplacements déterminés. La méthode FileRootDirectories() recense les répertoires racine (voir « Pointage vers la racine du système de fichiers » à la page 698). Les objets StorageVolume (énumerés par la méthode StorageVolumeInfo.getStorageVolumes()) proposent toutefois plus d'informations sur les volumes de stockage. Vous disposez de la propriété spaceAvailable de la propriété rootDirectory d'un objet StorageVolume pour obtenir l'espace disponible sur un volume de stockage. (Voir « Determination de l'espace disponible sur un volume » à la page 706.)

Voir aussi

StorageVolume StorageVolumeInfo

Lecture et écriture de fichiers

Adobe AIR 1.0 et les versions ultérieures La classe FileStream permiet aux applications AIR de dire et d'ecrire dans le système de fichiers.

Flux de travail pour la lecture et l'écriture de fichiers

Adobe AIR 1.0 et les versions ultérieures Le flux de travail de lecture et décriture de fichier est décrit ci-après.

Initialisez un objet File pointant vers le chemin.

Cet objet File représenté le chemin du fichier que vous souhaitez utiliser (ou d'un fichier que vous créées ultérieurement).
var file:File = File/documentsDirectory;  
file = file resolverPath("AIR Test/testFile.txt"); 
Cet exemple utilise la propriété File/documentsDirectory et la méthode resolvePath() d'un objet File pour initialiser celui-ci. Toutefois, vous pouvez pointer un objet File vers un fichier de plusieurs autres façon. Pour plus d'informations, voir la section « Pointage d'un objet File vers un fichier » à la page 700. Initialize un objet FileStream.

Appelez la méthode open() ou openAsync() de l'objet FileStream.

La méthode que vous appelez varie selon que vous souhaitez ouvrir le fjchier en mode synchrone ou asynchrone. Utilisez l'objet File comme parametre file de la méthode open. Pour le parametre fileMode, spécifie une constante de la classe FileMode qui définit le mode d'utilisation du fjchier. Par exemple, le code suivant initiaise un objet FileStreamutilisé pour creer un fisier et, évientuellesment, replacer les données existantes :
varFileStream:FileStream = new FileStream();  
fileStream.open(file, FileMode.WRITE); 
Pour plus d'informations, voir les sections « Initialisation d'un objet FileStream et ouverture et fermeture de fichiers » à la page 717 et « Modes d'ouverture FileStream » à la page 716.

Si vous avez ouvert le fichier en mode asynchrone (à l'aide de la méthode openAsync(), ajoutez et définiquee des écouteurs d'évenement pour l'objet FileStream.

Ces méthodes d'écouteurs d'événements réagissant aux événements distribués par l'objet FileStream dans divers cas de figure. Parmi ces cas de figure figurent notamment la lecture de données dans le fichier, la génération d'erreurs E/S ou l'écriture de l'intégrality des données. Pour plus d'informations, voir la section « Programmation asynchrone et événements générés par un objet FileStream ouvert en mode asynchrone » à la page 721. Incluez du code permettant de dire et d'écrit des données, le cas échéant. La classe FileStream propose de nombreuses méthodes relatives à la lecture ou l'écriture (elles commencent toutes par « read » ou « write »). La méthode que vous désissez pour生存 et écrire des données varie en fonction du format des données dans le fjichier cible. Par exemple, si les données du filchier cible sont au format texte UTF, vous pouvez utiliser les méthodes readUTFBytes() et writeUTFBytes(). Pour manipuler les données en tant que tableaux d'octets, utiliser les méthodes readByte(), readBytes(), writeByte() et writeBytes(). Pour plus d'informations, voir la section « Format de données et besoin des méthodes de lecture et d'écriture » à la page 722. Si vous avez ouvert le fichier en mode asynchrone, veillez à ce qu'un volume suffisant de données soit disponible avant d'appeler une méthode de lecture. Pour plus d'informations, voir la section « Mémoire tampon de lecture et propriété bytesAvailable d'un objet FileStream » à la page 719. Si, avant d'acceder en écriture à un fichier, vous souhaitez vérifier la quantité d'espace disque disponible, vous pouvez consulter la propriété空間Available de l'objet File. Pour plus d'informations, voir la section « Déstermination de l'espace disponible sur un volume » à la page 706. Appelez la méthode close() de l'objet FileStream lorsque vous avez terminé de manipuler le fichier. D'autres applications peuvent alors acceder à ce dernier. Pour plus d'informations, voir la section « Initialisation d'un objet FileStream et ouverture et fermeture de fichiers » à la page 717. Voutrouvez un exemple d'application utilisant la classe FileStream pour acceder en lecture et en écriture à des fichiers dans les articles suivants du Centre des développementes Adobe AIR : - Développement d'un éditeur de fichier texte - Développement d'un éditeur de fichier texte - Lecture et écriture à partir d'un fisquier de préférences XML

Utilisation des objets FileStream

Adobe AIR 1.0 et les versions ultérieures La classe FileStream définit des méthodes permettant d'ouvrir des fichiers et d'y acceder en lecture ou en écriture.

Modes d'ouverture FileStream

Adobe AIR 1.0 et les versions ultérieures Les méthodes open() et openAsync() d'un objet FileStream comprément le paramètre fileMode, qui définit certaines propriétés d'un flux de fichier, pour indiquer notamment : - s'il est possible d'acceder au fichier en lecture ; - s'il est possible d'acceder au fichier en écriture ; - si les données sont systématiquement ajoutées à la fin du fichier (lors de l'écriture); - que faire lorsque le fichier n'existe pas (et que ses répertoires parent n'existent pas). Les différences modes de fichier disponibles (que vous pouvez spécifier dans le parametre fileMode des méthodes open() et openAsync()) sont les suivants:
Mode de:fichierDescription
FileMode.READIndique que le:fichier est ouvert à des fins de lecture seulement.
FileMode.WRITEIndique que le:fichier est ouvert à des fins d'écriture. Si le:fichier n'existe pas, il est créé à l'ouverture de l'objet FileStream.M. S'il existe, les données existantes sont supprimées.
FileMode.APPENDIndique que le:fichier est ouvert et qu'il est possible d'ajouter des données en fin de:fichier. Si le:fichier n'existe pas, il est créé. S'il existe, les données existantes ne sont pas replacées. L'écriture commence à la fin du:fichier.
FileMode.UPDATEIndique que le:fichier est ouvert à des fins de lecture et d'écriture. Si le:fichier n'existe pas, il est créé. Choisissez ce mode pour un accès en lecture/écriture aléatoire au:fichier. Vous pouvez dire à partir de tout emplacement du:fichier. Lorsque vous écrivez dans celui-ci, seuils les octets écrites replacent les octets existants (aucun autre octet n'était affecté).

Initialisation d'un objet FileStream et ouverture et fermetre de fichiers

Adobe AIR 1.0 et les versions ultérieures

Lorsque vous ouvrez un objet FileStream, vous autorisez un accès en lecture ou en écriture à un fjichier. Pour ouvrir un objet FileStream, vous transmettez un objet File à sa méthode open() ou openAsync():
var myFile:File = File/documentsDirectory resolverPath("AIR Test/test.txt");  
var myFileStream:FileStream = new FileStream();  
myFileStream.open(myFile, FileMode.READ); 
Le paramètre fileMode (le deuxième des méthodes open() et openAsync()) détermine si le fichier est ouvert à des fins de lecture, écriture, ajust en fin de fichier ou mise à jour. Pour plus d'informations, voir la section précédente, « Modes d'ouverture FileStream » à la page 716. Si vous ouvrez le fjichier en mode asynchrone à l'aide de la méthode openAsync(), configurez des écouteurs d'évenement pour:gérer les événements asynchrones:
var myFile:File = File/documentsDirectory resolverPath("AIR Test/test.txt");   
var myFileStream:FileStream = new FileStream();   
myFileStream.addEventListener(Event.COMPLET,completeHandler);   
myFileStream.addEventListener(ProgressEvent.PROGRESS,progressHandler);   
myFileStream.addEventListener(IOErrorEvent.IO_Error,errorHandler);   
myFileStream.open(myFile,FileMode.READ);   
function completeHandler(event:Object):void { //...   
}   
function progressHandler(event:ProgressEvent):void { //...   
}   
function errorHandler(event:IOErrorEvent):void { //...   
} 
Le fichier est ouvert en mode synchrone ou asynchrone, selon que vous utilisez la methode open () ou openAsync (). Pour plus d'informations, voir la section « Principes de base des classes File d'AIR » à la page 692. Si vous définissez le paramètre fileMode sur fileMode. READ ou fileMode. UPDATE dans la méthode d'ouverture de l'objet FileStream, les données sont lues et insérées dans la mémoire tampon de lecture lors l'ouverture de l'objet FileStream. Pour plus d'informations, voir la section « Mémoire tampon de lecture et propriété bytesAvailable d'un objet FileStream » à la page 719. Vou puez appeler la methode close() d'un objet FileStream pour fermer le fichier associé, ce qui le met à la disposition d'autres applications.

Propriété position d'un objet FileStream

Adobe AIR 1.0 et les versions ultérieures

La propriété position d'un object FileStream déterminé l'emplacement de lecture ou d'écriture des données de la méthode de lecture ou d'écriture suivante. Préalablement à une opération de lecture ou d'écriture, définitse la propriété position sur une position valide dans le fichier. Par exemple, le code suivant écrit la chaine "hello" (au codage UTF) à la position 8 dans le fichier :
var myFile:File = File/documentsDirectory resolverPath("AIR Test/test.txt");  
var myFileStream:FileStream = new FileStream();  
myFileStream.open(myFile, FileMode.UPDATE);  
myFileStream.position = 8;  
myFileStream.writeUTFBytes("hello"); 
Lorsque vous ouvrez initialement un objet FileStream, la propriété position est définie sur 0. Avant une opération de lecture, la valeur de la propriété position doit être comprise entre 0 et le nombre maximal d'octets du fjichier (autrement dit, une position existante dans le fjichier). La valeur de la propriété position est uniquement modifiée dans les cas suivants : - Vous définissez explicitement la propriété position. - Vous appelez une méthode de lecture. - Vous appelez une méthode d'écriture. Lorsque vous appelez une méthode de lecture ou d'écriture d'un objet FileStream, la propriété position est immédiatement incrémentede nombre d'octetslus ou écrites. Selon la méthode de lecture utilisée, la propriété position est incrémentede nombre d'octets que vous spécifie pour la lecture ou du nombre d'octets disponibles. Lorsque, par la suite, vous appelez une méthode de lecture ou d'écriture, elle commence la lecture ou l'écriture à la nouvelle position.
var myFile:File = File/documentsDirectory resolverPath("AIR Test/test.txt");  
var myFileStream:FileStream = new FileStream();  
myFileStream.open(myFile, FileMode_UPDATE);  
myFileStream.position = 4000;  
trace(myFileStream.position); // 4000  
myFileStream.writeBytes(myArray, 0, 200);  
trace(myFileStream.position); // 4200 
Il existe cependant une exception : si un objet FileStream est ouvert en mode d'ajout en fin de fjichier, la propriété position ne change pas à la suite de l'appel d'une méthode d'écriture. (Dans ce mode, les données sont toujours ajoutées à la fin du fjichier,quelle que soit la valeur de la propriété position.) Si un fjchier est ouvert en mode asynchrone, l'opération d'ecriture ne se termine pas avant l'execution de la ligne de code suivante. Vous pouvez néanmoins appeler successivement plusieurs méthodes asynchrones : le moteur d'exécution les exécute dans l'ordre.
var myFile:File = File/documentsDirectory resolverPath("AIR Test/test.txt");   
var myFileStream:FileStream = new FileStream();   
myFileStream.openAsync(myFile,FileMode.WRITE);   
myFileStream.writeUTFBytes("hello");   
myFileStream.writeUTFBytes("world");   
myFileStream.addEventListener(Event.CLOSE,closeHandler);   
myFileStream.close();   
trace("started.");   
closeHandler(event:Event):void   
{ trace("finished."); } 
La sortie de suivi de ce code est la suivante : started. finished. Il est possible de specifier la valeur de la propriété position immédiatement après l'appoint d'une méthode de lecture ou d'écriture (ou à tout moment). L'opération de lecture ou d'écriture suivant définit la propriété position immédiatement après unappoint de l'opération writeBytes() et que la position est définiée sur cette valeur (300) même à l'issue de l'opération d'écriture :
var myFile:File = File/documentsDirectory resolverPath("AIR Test/test.txt");  
var myFileStream:FileStream = new FileStream();  
myFileStream.openAsync(myFile, FileMode.UPDATE);  
myFileStream.position = 4000;  
trace(myFileStream.position); // 4000  
myFileStream.writeBytes(myArray, 0, 200);  
myFileStream.position = 300;  
trace(myFileStream.position); // 300 

Mémoire tampon de lecture et propriété bytesAvailable d'un objet FileStream

Adobe AIR 1.0 et les versions ultérieures

Lors de l'ouverture d'un objet FileStream doté de fonctionnalités de lecture (le paramètre fileMode de sa méthode open() ou openAsync() étant défini sur READ ou UPDATE), le moteur d'exécution stocke les données dans une mémoire tampon interne. L'objet FileStream commence la lecture et l'insertion des données dans la mémoire tamponès l'ouverture du fjichier (par appel de la méthode open() ou openAsync() de l'objet FileStream). Si un fjichier est ouvert en mode synchrone (à l'aide de la méthode opén(), vous pouvez définir le pointeur position sur n'importe qu'elle position valide (dans les limites du fjichier) et commencer à dire tout volume de données (dans les limites du fjichier), comme l'illustré le code suivant (qui considère comme acquis que le fjichier contient au moins 100 octets):
var myFile:File = File/documentsDirectory resolverPath("AIR Test/test.txt");  
var myFileStream:FileStream = new FileStream();  
myFileStream.open(myFile, FileMode.READ);  
myFileStream.position = 10;  
myFileStream.readBytes(myByteArray, 0, 20);  
myFileStream.position = 89;  
myFileStream.readBytes(myByteArray, 0, 10); 
Qu'un fjichier soit ouvert en mode synchrone ou asynchrone, les méthodes de lecture lisent systématiquement les octets « disponibles », représentés par la propriété bytesAvailable. En mode de lecture synchrone, tous les octets du fjichier sont disponibles en permanence. En mode asynchrone, les octets deviennent disponibles à partir de la position indiquée par la propriété position, dans une série de replissages asynchrones de la mémoire tampon signalés par des événements progress. En mode synchrone, la propriete bytesAvailable representation systematique le nombre d'octets compris entre la propriete position et la fin du fichier (tous les octets du fichier sont always dispensables pour la lecture). En mode asynchrone, vous devez vous assurer que la mémoire tampon de lecture contient suffisamment de données avant d'appeler une méthode de lecture. Dans ce mode, au fur et à mesure de la lecture, les données du fichier sont ajoutées à la mémoire tampon, à partir de la position spécifique au début de l'opération de lecture, et la propriété bytesAvailable est incrémentede chaque octet lu. La propriété bytesAvailable indique le nombre d'octets disponibles entre l'octet situé à la position spécifique par la propriété position et la fin de la mémoire tampon. L'objet FileStream envoie régulièrement un événement progress. En mode asynchrone, l'objet FileStream distribue régulièrement l'évenement progress à mesure que des données sont disponibles dans la mémoire tampon de lecture. Par exemple, le code suivant insère des données dans un objet ByteArray, bytes, au fur et à mesure de leur insertion dans la mémoire tampon de lecture :
var bytes:ByteArray = newByteArray();   
var myFile:File = File/documentsDirectory resolverPath("AIR Test/test.txt");   
var myFileStream:FileStream = new FileStream();   
myFileStream.addEventListener(ProgressEvent.PROGRESS, progressHandler);   
myFileStream.openAsync(myFile, Mode READ);   
function progressHandler(event:ProgressEvent):void { myFileStream.readBytes(bytes, myFileStream.position, myFileStream.bytesAvailable); } 
En mode asynchrone, seules les données que contient la mémoire tampon de lecture peuvent être lues. En outre, les données sont supprimées de la mémoire tampon au fur et à mesure de leur lecture. Avant d'appeler une opération de lecture, vous doivent donc vous assurer que les données existent dans la mémoire tampon de lecture. Par exemple, le code suivant lit 8000 octets de données à partir de la position 4000 dans le fichier : var myFile:File = File/documentsDirectory resolverPath("AIR Test/test.txt"); var myFileStream:FileStream = new FileStream(); myFileStream.addEventListener(ProgressEvent.PROGRESS,progressHandler); myFileStream.addEventListener(Event.COMPLET,completed); myFileStream.openAsync(myFile,FileMode.READ); myFileStream.position = 4000; var str:String = ""; function progressHandler(event:Event):void { if (myFileStream.bytesAvailable > 8000) { str + = myFileStream.readMultiByte(8000,"iso-8859-1"); } Lors d'une opération d'écriture, l'objet FileStream n'insère pas de données dans la mémoire tampon de lecture. Au terme de l'opération (toutes les données de la mémoire tampon d'écriture étant écrites dans le fjichier), l'objet FileStream commence une nouvelle mémoire tampon de lecture (en supposant que l'objet FileStream ouvert associé possède des fonctionnalités de lecture) et commence à insérer des données dans la mémoire tampon de lecture à partir de la position spécifique par la propriété position. La propriété position peut correspondre à la position du dernier octet écrit, mais elle est différente si l'utilisateur lui affecte une autre valeur après l'opération d'écriture.

Programmation asynchrone et événements généres par un objet FileStream ouvert en mode asynchrone Adobe AIR 1.0 et les versions ultérieures

Lorsqu'un fisier est ouvert en mode asynchrone (à l'aide de la méthode openAsync)), la lecture et l'écriture de fisiers sont asynchrones. Un autre code ActionScript peut s'exéctuer au fur et à mesure de l'insertion de données dans la mémoire tampon de lecture et de l'écriture de données de sortie. Voude nevez donc you enregister pour les événements generes par l'objet FileStream ouvert en mode asynchrone. En vous enregistrant pour l'évenement progress, vous pouvez être averti des que de nouvelles données sont disponibles à des fins de lecture, comme l'illustré le code suivant : var myFile:File = File/documentsDirectory resolverPath("AIR Test/test.txt"); var myFileStream:FileStream = new FileStream(); myFileStream.addEventListener(ProgressEvent.PROGRESS,progressHandler); myFileStream.openAsync(myFile,FileMode.READ); var str:String = ""; function progressHandler(event:ProgressEvent):void { str + = myFileStream.readMultiByte(myFileStream.bytesAvailable,"iso-8859-1"); } Vousspuvez lire la totalite desdonnées en youen registrar pour I'evénement complete, comme I'illustré le code suivant:
var myFile:File = File/documentsDirectory resolverPath("AIR Test/test.txt");   
var myFileStream:FileStream = new FileStream();   
myFileStream.addEventListener(Event.COMPLET, completed);   
myFileStream.openAsync(myFile, FileMode.READ);   
var str:String = "";   
function completeHandler(event:Event):void { str = myFileStream.readMultiByte(myFileStream.bytesAvailable, "iso-8859-1"); } 
De même que des données en entrée sont mises en mémoire tampon à des fins de lecture asynchrone, les données que vous écrivez dans un flux asynchrone sont mises en mémoire tampon et écrites dans le fjichier de manière asynchrone. Alors que des données sont écrites dans un fjichier, l'objet FileStream distribue régulièrement un objet OutputProgressEvent. Un objet OutputProgressEvent comprend une propriété bytesPending définie sur le nombre d'octets restants à écrire. Vous pouze vous enregistrer pour l'évenement outputProgress afin d'être averti lorsque cette mémoire tampon est écrité dans le fisquier, peut-être pour afficher une boîte de dialogue de progression. Toutefois, cette opération n'est généralement pas nécessaire. Vous pouze notamment appeler la méthode close() sans vous soucier des octets non écrites. L'objet FileStream continue d'écrire des données et l'évenement close est envoyé une fois le dernier octet écrit dans le fisquier et le fisquier sous-jacent fermé.

Format de données etCHOix des methododes de lecture et d'ecriture

Adobe AIR 1.0 et les versions ultérieures

Tout fjchier est un ensemble d'octets sur disque. Dans ActionScript, les données d'un fjchier peuvent tous jours etre representees sous la forme d'un objet ByteArray. Par exemple, le code suivant lit les données d'un fjchier et les insere dans un objet ByteArray nomme bytes :
var myFile:File = File/documentsDirectory resolverPath("AIR Test/test.txt");   
var myFileStream:FileStream = new FileStream();   
myFileStream.addEventListener(Event.COMPLET,completeHandler);   
myFileStream.openAsync(myFile,FileMode.READ);   
var bytes:ByteArray = new ArrayList();   
function completeHandler(event:Object):void { myFileStream.readBytes(bytes,0,myFileStream.bytesAvailable); } 
De même, le code suivant écrit les données de l'objet ByteArray bytes dans un fisier :
var myFile:File = File/documentsDirectory resolverPath("AIR Test/test.txt");  
var myFileStream:FileStream = new FileStream();  
myFileStream.open(myFile, FileMode.WRITE);  
myFileStream.writeBytes(bytes, 0, bytes.length); 
Cependant, you souhaitez rarement stocker les données dans un objet ByteArray ActionScript. Les fichiers de données sont souvent dans un format de fichier spécifique. Il se peut par exemple que les données du fichier soient au format texte et que vous souhaitiez les représentier dans un objet String. C'est pourquoi la classe FileStream comprehend des méthodes de lecture et d'écriture de données de types autres que les objets ByteArray. Par exemple, la méthode readMultiByte() permet de dire des données dans un fichier et de les stocker dans une chaine, comme l'illustré le code suivant : var myFile:File = File/documentsDirectory resolverPath("AIR Test/test.txt"); var myFileStream:FileStream = new FileStream(); myFileStream.addEventListener(Event.COMPLET, completed); myFileStream.openAsync(myFile,FileMode.READ); var str:String = ""; function completeHandler(event:Event):void { str = myFileStream.readMultiByte(myFileStream.bytesAvailable,"iso-8859-1"); } Le deuxième paramètre de la méthode readMultiByte() spécifie le format texte utilisé par ActionScript pour interpréter les données (« iso-8859-1 », en l'occurrence). Adobe AIR prend en charge les encodages de produits de caractères standard (voir Jeux de caractères pris en charge). La classe FileStream comprehend également la méthode readUTFBytes(), qui lit des données de la mémoire tampon de lecture et les insère dans une chaine à l'aide du jeu de caractères UTF-8. Les caractères du jeu de caractères UTF-8 sont de longueur variable. N'utilise donc pas readUTFBytes() dans une méthode répondant à l'évenement progress car les données situées à la fin de la mémoire tampon de lecture sont susceptibles de représentier un caractère incomplet. (Cette règle s'applique également à l'utilisation de la méthode readMultiByte() avec un codage de caractères de longueur variable.) Lorsque l'objet FileStream distribue l'évenement progress, vous nevez donc dire l'ensemble complet de données. Vou disposez également de méthodes d'écriture similaires, writeMultiByte() et writeUTFBytes(), pour manipuler les objets String et les fischiers de texte. Les méthodes readUTF() et writeUTF() (à ne pas confondre avec readUTFBytes() et writeUTFBytes()) permettent également la lecture ou l'écriture de données dans un fjichier, mais elles considèrent comme acquis que des données indiquant la longueur des données texte précédent ces dernières, ce qui n'est pas une pratique courante dans les fjichiers de texte standard. Certains fichiers de texte UTF commencent par un caractère « UTF-BOM » (de l'anglais Byte Order Mark) qui définit le boutisme, ainsi que le format de codage (UTF-16 ou UTF-32). Voutrouvez un exemple de lecture et d'ecriture dans un fichier de texte à la section « Exemple : Lecture et insertion d'un fichier XML dans un objet XML » à la page 725. Les méthodes readObject() et writeObject() facilitent le stockage et la récupération de données pour les objets ActionScript complexes. Les données sont codées au format AMF (ActionScript Message Format). Adobe AIR, Flash Player, Flash Media Server et Flex Data Services comprend des API permettant de manipuler les données dans ce format. Il existe d'autres méthodes de lecture et d'écriture, notamment readDouble() et writeDouble(). Cependant si vous les utiliserez, assurez-vous que le format de fichier correspond au format des données définies par ces méthodes. Les formats de fjichier sont souvent plus complexes que de simples formats de texte. Par exemple, un fjichier MP3 contient des données compressées qui peuvent uniquement etre interprétées par le biais des algorithmes de décompression et de décodage spécifique à ce format. Les fjichiers MP3 peuvent également comprendre des balises ID3 qui contiennent des informations de métabalise concernant le fjichier (tel que le titre et l'interprête d'une chanson). Il existe plusieurs versions du format ID3, mais le plus simple (ID3 version 1) est presenté à la section « Exemple : Lecture et écriture de données en mode aléatoire » à la page 726. D'autres formats de fichier (pour les images, bases de données, documents d'application, etc.) ont une structure de données différente. Vous doivent comprendre celle-ci pour pouvoir les utiliser dans ActionScript.

Utilisation des méthodes load() et save()

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures Flash Player 10 a ajoute les méthodes load() et save() dans la classe FileReference. Ces méthodes sont également prsentes dans AIR 1.5, et la classe File hérite des méthodes de la classe FileReference. L'objet de ces méthodes est de fournir aux utilisateurs un moyen sécurisé pour charger et enregistrer les données des fischiers dans Flash Player. Toutefois, les applications AIR peuvent également les utiliser pour charger et enregistrer les fischiers de façon asynchrone. Par exemple, le code suivant enregistrure une chaine dans un fichier texte :
var file:File = File.applicationStorageDirectory resolverPath("test.txt");  
var str:String = "Hello.";  
file.addEventListener(Event.COMPLET, fileSaved);  
file.save(str);  
function fileSaved(event:Event):void {  
    trace("Done ");} 
Le paramètre data de la méthode save() peut prendre une valeur String, XML ou ByteArray. Lorsque l'argument est une valeur String ou XML, la méthode enregistre le fichier sous forme de fichier texte au format UTF-8. Lorsque cet exemple de code s'exécute, l'application présente une boîte de dialogue qui permet à l'utilisateur de seLECTIONner la destination du filchier enregistré. Le code suivant charge une chaine à partir d'un fichier texte UTF-8 : var file:File = File.applicationStorageDirectory resolverPath("test.txt"); file.addEventListener(Event.COMPLETET,loaded); file.load(); var str:String; function loaded(event:Event):void { var bytes:Array file.data; str = bytes.readUTFBytes(bytes.length); trace(str); } La classe FileStream offre plus de fonctionnalités que celles fournies par les méthodes load() et save(): - La classe FileStream yous permiet de dire et d'ecrige des donnees de facon synchrone et asynchrone. - La classe FileStream vous permet d'écrire dans un fisier de façon incrémentielle. - La classe FileStream en vous permet d'ouvrir un fjichier en mode aléatoire (lecture et écriture dans toute section du fjichier). - La classe FileStream vous permet de spécifier le type d'accès au fischier disponible pour le fischier via la définition du paramètre fileMode de la méthode open() ou openAsync(). - La classe FileStream vous permet d'enregistrer des données dans des fichiers sans présence à l'utiliser une boite de dialogue Ouvrir ou Enregistrer. Lors de la lecture de données avec la classe FileStream, you pouze utiliser directement des types autres que des tableaux d'octets.

Exemple : Lecture et insertion d'un fichier XML dans un objet XML

Adobe AIR 1.0 et les versions ultérieures

Les exemples suivants expliquent comment acceder en lecture et en écriture à un fisier de texte contenant des données XML. Pour dire le fichier, initialisez les objets File et FileStream, appelez la méthode readUTFBytes() de l'objet FileStream et convertisse la chaîne en objet XML :
var file:File = File/documentsDirectory resolverPath("AIR Test/preferences.xml");  
varFileStream:FileStream = new FileStream();  
fileStream.open(file, FileMode.READ);  
var prefersXML:XML = XML(fileStream.readUTFBytes(fileStream.bytesAvailable));  
fileStream.close(); 
De même, pour écrire dans le fichier, il suffit de définir les objets File et FileStream appropriés, puis d'appeler une méthode d'écriture de l'objet FileStream. Transmettez la version chaine des données XML à la méthode d'écriture, comme l'illustré le code suivant : var refsXML:XML = true; var file:File File/documentsDirectoryresolvePath("AIR Test/preferences.xml"); fileStream new FileStream(); fileStream.open(file,FileMode.WRITE); var outputString:String = '\n'; outputString + = refsXML.toXMLString(); fileStream.writeUTFBytes(outputString); fileStream.close(); Ces exemple utilisent les méthodes readUTFBytes() et writeUTFBytes(), car il est considéré comme acquis que les fichiers sont au format UTF-8. Si tel n'est pas le case, vous devrez peut-être recourir à une autre méthode (voir la section « Format de données etCHOIS des methodes de lecture et d'ecriture » à la page 722). Les exemples précédents utilisent des objets FileStream ouverts en mode synchrone. Vous pouvez aussi ouvrir des fischiers en mode asynchrone (ce type d'opération nécessite l'utilisation de fonctions d'écouteur d'évenement pour répondre aux événements). Par exemple, le code suivant illustrer comment dire un fischier XML en mode asynchrone :
var file:File = File/documentsDirectory resolverPath("AIR Test/preferences.xml");  
varFileStream:FileStream = new FileStream();  
FileStream.addEventListener(Event.COMPLET, processXMLData);  
FileStream.openAsync(file, FileName.READ);  
var prefersXML:XML;  
function processXMLData(event:Event):void {  
    prefersXML = XML(fileStream.readUTFBytes(fileStream.bytesAvailable));  
   FileStream.close();  
} 
La méthode processXMLData() est appelée lorsque le fjichier est intégralement lu et inséré dans la mémoire tampon de lecture (autrement dit, lorsque l'objet FileStream distribue l'évenement complete). Elle appelle la méthode readUTFBytes() pour obtenir une version chaine des données lues, puis elle cree un objet XML, prefixesXML, base sur cette chaine. Pour acceder à un exemple d'application possédant ces fonctionnalités, voir Lecture et écriture à partir d'un fichier de préférence XML.

Exemple : Lecture et écriture de données en mode aléatoire

Adobe AIR 1.0 et les versions ultérieures

Les fichiers MP3 peuvent renfermer des balises ID3, autrement dit, des sections en début ou fin de fichier contenant des métadonnées identifient l'enregistrement. Il existe différentes versions du format de balise ID3. L'exemple suivant explique comment acceder en lecture et écriture à un fichier MP3 contenant le format ID3 le plus simple (ID3 version 1.0) par le biais d'un « accès aléatoire aux données », c'est-à-dire en lisant et écrivant des données à des emplacements arbitraires dans le fichier. Dans un fjichier MP3 contenant une balise ID3 version 1, les données ID3 figurent dans les 128 derniers octets du fjichier. Lorsque vous accedez à un fichier en mode de lecture/éditure aléatoire, il est important de définir le paramètre fileMode de la méthode open() ouopenAsync() sur FileMode.UPDATE:
var file:File = File/documentsDirectory resolverPath("My Music/Sample ID3 v1.mp3");  
var fileStr:FileStream = new FileStream();  
fileStr.open(file, FileMode.UPDATE); 
Vous pouvez ainsi acceder au fichier en lecture et écriture. A l'ouverture du fichier, vous pouvez définir le pointeur position sur 128 octets avant la fin du fichier :
fileStr.position = file.size - 128; 
Ce code définit la propriété position sur cet emplacement du fichier car le format ID3 v1.0 stipule que les balises ID3 sont stockées dans les derniers 128 octets du fichier. La Specification définit également les informations suivantes : - Les 3 premiers octets de la balise représentent la chaine "TAG". - Les 30 caractères suivants représentent le titre de la piste MP3, sous forme de chaine. - Les 30 caractères suivants représentent le nom de l'interprête, sous forme de chaîne. - Les 30 caractères suivants représentent le nom de l'album, sous forme de chaîne. - Les 4 caractères suivants représentent l'année, sous forme de chaine. - Les 30 caractères suivants représentent le commentaire, sous forme de chaine. L'octet suivant contient un code identifiant le genre de la piste. - Toutes les données/texte sont au format ISO 8859-1. La méthode id3TagRead() vérifie les données après leur lecture (sur envoi de l'évenement complete): function id3TagRead():void { if (fileStr.readMultiByte(3, "iso-8859-1").match(/tag/i)) { var id3Title:String = fileStr.readMultiByte(30, "iso-8859-1"); var id3Artist:String = fileStr.readMultiByte(30, "iso-8859-1"); var id3Album:String = fileStr.readMultiByte(30, "iso-8859-1"); var id3Year:String = fileStr.readMultiByte(4, "iso-8859-1"); var id3Comment:String = fileStr.readMultiByte(30, "iso-8859-1"); var id3GenreCode:String = fileStr.readByte().toString(10); } } Vous pouvez également écrire dans le fjichier en mode aléatoire. Par exemple, vous pourriez analyser la variable id3Title pour vérifier que l'utilisation des majuscules est correcte (à l'aide des méthodes de la classe String), puis écrire une chaine modifiée, newVal, dans le fjichier, comme l'illustrer l'exemple suivant :
fileStr.position = file.length - 125; // 128 - 3  
fileStr.writeMultiByte(newTitle, "iso-8859-1"); 
Conformément à la norme ID3 version 1, la chaine newVal doit comprendre 30 caractères et être replie à droit par le code de caractère 0 (String.fromCharCode(0)).

Chapitre 39 : Stockage des données locales

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures La classe SharedObject permet de stocker des volumes réduits de données sur l'ordinateur client. Dans Adobe AIR, vous disposez également de la classe EncryptedLocalStore pour stocker des volumes réduits de données utilisateur confidentielles sur l'ordinateur local dans une application AIR. Il est également possible de dire et d'écrit des fischiers dans le système de fischiers et, dans Adobe AIR, d'acceder aux fischiers de base de données locaux. Pour plus d'informations, voir « Utilisation du système de fischiers » à la page 676 et « Utilisation des bases de données SQL locales dans AIR » à la page 741. Diverses considérations liées à la sécurité affectent les objets partages. Pour plus d'informations, voir « Objets partages » à la page 1120 dans « Sécurité » à la page 1085.

Objets partages

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Un objet partagé, parfois appelé cookie Flash, est un fichier de données qui peut être créé sur votre ordinateur par les sites que vous visitez. Les objets partages servent le plus souvent à optimiser la navigation sur le Web, par exemple en vous permettant de personnaliser l'aspect d'un site Web que vous consultez liéquement.

A propos des objets partagés

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Les objets partagés fonctionnent comme des cookies de navigation. La classe SharedObject permet de stocker des données sur le disque dur local de l'utilisateur et d'applécer ces données pendant la même session ou dans le cadre d'une session ultérieure. Les applications peuvent acceder uniquement à leurs propres données SharedObject, et ce, uniquement si elles sont executées sur le même Domaine. Les données ne sont pas transmises au serveur et les applications executées dans d'autres domaines ne peuvent pas y acceder. En revanche, les applications du même Domaine sont en mesure d'y acceder.

Comparaison des objets partagés avec les cookies

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Les cookies et les objets partages sont très similaires. Comme la plupart des programmateurs Web connaissent le fonctionnement des cookies, la comparaison des cookies et des objets SharedObjects locaux peut s'avérer utile. Les cookies conformes au standard RFC 2109 possèdent habituèlement les propriétés suivantes : - Ils possèdent une date d'expiration, souvent fixée par défaut à la fin d'une session. - Ils sont désactivables par le client en fonction de sites spécifique. - La limite totale de cookies est de 300, avec 20 cookies maximum par site. Leur taille est habituèlement limitée à 4 Ko chacun. - Ils sont parfois considérés comme une menace à la sécurité et sont, par conséquent, parfois désactivés sur le client. - Ils sont stockés dans un emplacement spécifique par le navigateur client. - Ils sont transmis du client au serveur via HTTP. Par contre, les objets partagés possèdent les propriétés suivantes : - Ils n'expirent pas par défaut. - Par défaut, leur taille est limite à 100 Ko chacun. - Ils peuvent enregistrer des types de données simples (como String, Array et Date). - Ils sont stockés à un emplacement spécifique par l'application (dans le réseau de base de l'utilisateur). - Ils ne sont jamais transmis entre le client et le serveur.

A propos de la classe SharedObject

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures La classe SharedObject permet de creer et de supprimer des objets partages, ainsi que de détecter la taille actuelle d'un objet SharedObject en cours d'utilisation.

Création d'un objet partagé

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Pour creer un objet SharedObject, faites appel à la méthode SharedObject.getLocal(), dont la syntaxe est la suivante :
SharedObject.getLocal("objectName" [, pathname]): SharedObject 
L'exemple suivant create un objet partagé dénommé mySO :
public var mySO:SharedObject; 
mySO = SharedObject.getLocal("preferences"); 
Cette opération cree un fisier sur l'ordinateur du client dénommé preferences.sol. Le terme local fait reférence à l'emplacement de l'objet partagé. Dans ce cas, Adobe* Flash* Player enregistre le fichier SharedObject localement dans le réseau de base du client. A la création d'un objet partagé, Flash Player create un nouveau réseau pour l'application et le domaine dans son sandbox. Il creé également un filchier *.sol qui enregistre les données SharedObject. L'emplacement par défaut de ce filchier est un sous-repertoire du réseau de base de l'utilisateur. Le tableau suivant indique les emplacements par défaut de ce réseau :
Système d'exploitationEmplacement
Windows95/98/ME/2000/XPc:/Documents and Settings/username/ApplicationData/Macromedia/Flash Player/#SharedObjects
Windows Vista/Windows 7c:/Users/name/AppData/Roaming/Macromedia/FlashPlayer/#SharedObjects
Macintosh OS X/Users/name/Library/Preferences/Macromedia/FlashPlayer/#SharedObjects/web_domain/path_to.application/application/n_name/object_name.sol
Linux/Unix/home/name/.macromedia/FlashPLAYER/#SharedObjects/web_doma in/path_to_apply/application_name/object_name.sol
Sous le réseau #SharedObjects se trouve un réseau nommé de façon aléatoire. Sous ce dernier se trouve un réseau correspondant au nom d'hôte, puis le chemin vers l'application et finalement le fichier *.sol. Par exemple, si vous demandez un application nommée MyApp.swf sur l'hôte local et dans un sous-repertoire nommé /sos, Flash Player enregistre le fichier *.sol à l'emplacement suivant sur Windows XP: c:/Documents and Settings/fred/Application Data/Macromedia/Flash Player/#SharedObjects/KROKWXRK/#localhost/sos/MyApp.swf/data.sol Remarque: si vous ne fournisse pas de nom dans la méthode SharedObject.getLocal(), Flash Player nomme le fichier undefined.sol. Par défaut, Flash peut enregistrer des objets SharedObject persistants localement, d'une taille maximale de 100 Ko par domaine. Cette valeur est configurable par l'utilisateur. Lorsque l'application tente d'enregistrer un objet partagé d'une taille supérieure à 100 Ko, Flash Player affiche la boîte de dialogue Stockage local, qui permet à l'utilisateur d'autorisier ou de refuser une augmentation du volume de stockage local pour le domaine qui demande l'accès.

Spécification d'un chemin

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Le paramètre facultatif pathname permet de spécifique l'emplacement du fichier SharedObject. Ce fichier doit etre un sous-repertoire du repertoire SharedObject de ce domaine. Par exemple, si vous demandez une application sur I'hote local et specifiez ce qui suit : mySO = SharedObject.getLocal("myObjectFile", "/"); Flash Player écrit le fichier SharedObject dans le réseau /#localhost (ou /localhost si l'application est hors ligne). Cela s'avéré utile si vous souhaitez plusieurs applications sur le client pour pouvoir acceder au même objet partagé. Dans ce cas, le client peut exécuter deux applications Flex, qui spécifique un chemin vers l'objet partagé qui est la racine du domaine ; le client peut ensuite acceder au même objet partagé à partir des deux applications. Pour partager des données entre plusieurs applications sans persistance, vous pouvez utiliser l'objet LocalConnection. Si vous spécifiez un réseau inexistant, Flash Player ne cree pas de fichier SharedObject.

Ajout de données à un objet partagé

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Vous ajoutez des données à un filier *.sol d'objet SharedObject à l'aide de sa propriété data. Pour ajouter de nouvelles données à l'objet partagé, utilisez la syntaxe suivante : sharedObject_name.data_variable = value; L'exemple suivant ajoute les propriétés userName, itemNumbers et adminPrivileges et leurs valeurs à un objet SharedObject :
public var userName: String = "Reiner";  
public var itemsArray: Array = new Array(101, 346, 48)  
public var userNameIsAdmin: Boolean = true;  
mySO.datauserName = userName;  
mySO.data.itemNumbers = itemsArray;  
mySO.data_adminPrivileges = currentUserIdAdmin; 
Après avoir affecté des valeurs à la propriété data, vous nevez demander à Flash Player les écrire dans le fjichier SharedObject. Pour forcer Flash Player à écrire les valeurs dans le fjichier SharedObject, utilisez la méthode SharedObject.flush(), comme suit : mySO.flush(); Si vous n'appelez pas la méthode SharedObject.flush(), Flash Player écrit les valeurs dans le filchier à la fermeture de l'application. Cependant, cette méthode ne permet pas à l'utilisateur d'augmenter l'espace disponible nécessaire à Flash Player pour enregistrer les données si la taille de ces dernières est supérieure aux paramétres par défaut. La meilleure pratique consiste donc à appeler SharedObject.flush(). Si vous utilisez la methode flush() pour écrire des objets partages sur le disque dur de l'ordinateur, vous devez vérifier avec soin si l'utilisateur a explicitement désactivé le stockage local à l'aide du Gestionnaire de paramètres de Flash Player (www.macromedia.com/support/documentation/fr/flashplayer/help/settingsmanager07.html), comme illustré dans cet exemple :
var so: SharedObject = SharedObject.getLocal("test"); trace("Current SharedObject size is " + so.size + " bytes.", so.flush(); 

Stockage d'objets dans les objets partagés

YououpoezstockerdesobjetsimplescommeArraysouStringsdanslapropietede id'bjectSharedObject. L'exemple suivant est une class ActionScript qui définit des méthodes contrôlant l'interaction avec lobjet partagé. Ces méthodes permettent à l'utilisateur d'ajouter et de supprimer des objets de lobjet partagé. Cette classe stocke une collection ArrayList collection qui contient des objets simples.
package { import mxcollections.toArrayCollection; import flash.net.SharedObject; public class LSOHandler { private var mySO:SharedObject; private var ac:ArrayCollection; private var lsoType:String; // The parameter is "feeds" or "sites". public function LSOHandler(s:String) { init(s); } private function init(s:String):void { ac = new ArrayList(); lsoType = s; mySO = SharedObject.getLocal(lsoType); if (getObjects()) { 
ac = getObjects(); } public function getObjects():ArrayCollection{ return mySO.data[lsoType]; public function addObject(o:Object):void { ac.addItem(o); updateSharedObjects(); private function updateSharedObjects():void { mySO.data[lsoType] ac; mySO.flush(); 1 L'application Flex suivant create une occurrence de la classe ActionScript pour chacun des types d'objets partagés dont elle a besoin. Elle appelle ensuite des méthodes sur cette classe lorsqu'elutilisateur ajoute ou supprime des blogs ou des URL de site.
<?xml version="1.0"?>
<-- lsos/BlogAggregator.mxml -->
<mx:Application
    xmlns:local="*/
    xmlns:mx="http://www.adobe.com/2006/mxml"
    creationComplete="initApp()
        backgroundColor="#FFFFFF">
        <mx:Script>
            <!-- CDATA>
                import mx.collectioningsArrayCollection;
                import mx.utils.ObjectUtil;
                import flash.net.SharedObject;
            [Bindable]
            public var welcomeMessage:String;
            [Bindable]
            public var localFeeds:ArrayCollection = new ArrayList(); 
            [Bindable]
            public var localSites:ArrayCollection = new ArrayList(); 
            public var lsofeeds:LSOHandler;
            public var lsosites:LSOHandler;
            private function initApp():void {
                lsofeeds = new LSOHandler("feeds");
                lsosites = new LSOHandler("sites");
                if (lsofeeds.getObjects()) {
                    localFeeds = lsofeeds.getObjects(); 
} if (lsosites Objects()) { localSites = lsosites.Object(); } //Adds a new feed to the feeds DataGrid. private function addFeed():void { //Construct an object you want to store in the //LSO. This object can contain any number of fields. var o:Object = {name:ti1.text,url:ti2.text, date:new Date(); lsofeeds.addObject(o); //Because the DataGrid's dataProvider property is //bound to the ArrayCollection, Flex updates the //DataGrid when you call this method. localFeeds lsofeeds.Object(); //Clear the text fields. ti1.text '; ti2.text '; } //Removes feeds from the feeds DataGrid. private function removeFeed():void { //Use a method of ArrayCollection to remove a feed. //Because the DataGrid's dataProvider property is //bound to the ArrayCollection, Flex updates the //DataGrid when you call this method. You do not need //to update it manually. if (myFeedsGridmentionedIndex > - 1 ) { localFeeds.removeItemAt(myFeedsGridmentionedIndex); } } private function addSite():void { var o:Object = {name:ti3.text, date:new Date(); lsosites.addObject(o); localSites = lsosites Objects(); ti3.text = ^ . } private function removeSite():void { if (mySitesGridmentionedIndex > - 1 ) { localSites.removeItemAt(mySitesGridmentionedIndex); } } ]>
<mx:HBox>
    <mx:FormItem label="Name">
        <mx:TextInput id="ti1" width="100"/>
    </mx:FormItem>
    <mx:FormItem label="Location">
        <mx:TextInput id="ti2" width="300"/>
    </mx:FormItem>
    <mx:Button id="bl" label="Add Feed" click="addFeed(){
        </mx:HBox>
    <mx:FormItem label="Existing Feeds">
        <mx:DataGrid
            id="myFeedsGrid"
            dataProvider="{{localFeeds}}
            width="400"/>
        </mx:FormItem>
        <mx:Button id="b2" label="Remove Feed" click="removeFeed(){
            </mx:Form>
    </mx:Panel>
</mx:Panel title="Sites">
    <mx:Form id="siteForm">
        <mx:HBox>
            <mx:FormItem label="Site">
                <mx:TextInput id="ti3" width="400"/>
            </mx:FormItem>
            <mx:Button id="b3" label="Add Site" click="addSite(){
                </mx:HBox>
            <mx:FormItem label="Existing Sites">
                <mx:DataGrid
                    id="mySitesGrid"
                    dataProvider="{{localSites}}
                    width="400"/>
            </mx:FormItem>
            <mx:Button id="b4" label="Remove Site" click="removeSite(){
                </mx:Form>
            </mx:Panel>
</mx:Application> 

Stockage des objets typés dans les objets partagés

Voupe stocker des occurrences ActionScript typées dans des objets partages. Pour ce faire, il vous suffit d'appeler la méthode flash.net.registerClassAlias() pour enregister la classe. Si vous creez une occurrence de votre classe et que vous la stockez dans les données membres de votre object partagé, puis que vous lisiez ce dernier, vous obtenez une occurrencie typée. Par défaut, la propriété objectEncoding de l'objet SharedObject prend en charge le codage AMF3 et décompressse votre occurrence stockée à partir de l'objet SharedObject; l'occurrence stockée conserve le même type spécifique lorsque vous avez appelé la méthode registerClassAlias().

(iOS uniquement) Empêcher la sauvégarde sur le cloud des objets partagés locaux

Adobe AIR 3.7 et ultérieur, iOS uniquement Voupez definir la proprieté SharedObjectpreventBackup de maniere a controller si les objets locaux partages sont sauvegardes sur le service iOS de sauvegarde sur le cloud. Apple demande de procesder de cette maniere pour tout contenu qu'il est possible de generer ou telecharger a nouveau, mais qui est necessaire au bon fonctionnement de votre application lors d'une utilisation hors ligne.

Création de plusieurs objets partagés

Vou puez creer plusieurs objets partages pour la meme application Flex. Pour ce faire, affectez a chacun d'entre eux un nom d'occurrence different, comme indiquedans I'exemple suivant:
public var mySO: SharedObject = SharedObject.getLocal("preferences");  
public var mySO2: SharedObject = SharedObject.getLocal("history"); 
Cette action entraine la creation des fichiers preferences.sol et history.sol file dans le repertoire local de l'application Flex.

Création d'un SharedObject sécurisé

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Lorsque vous creez un SharedObject local ou distant à l'aide de getLocal() ou getRemote(), un paramètre facultatif nommé secure déterminé si l'accès à lobjet partagé se limite aux fischiers SWF diffusés via une connexion HTTPS. Si ce paramètre a la valeur true et que votre fischier SWF est diffusé sur HTTPS, Flash Player create un nouvel objet sécurisé ou obtient une ↔reference à un objet partagé sécurisé existant. Cet objet partagé sécurisé peut uniquement être lu ou écrit par des fischiers SWF reçus via des connexions HTTPS appelant SharedObject.getLocal() avec le paramètre secure régle sur true. Si ce paramètre a la valeur false et que votre fischier SWF est diffusé sur HTTPS, Flash Player create un nouvel objet partagé ou obtient une ↔reference à un objet partagé existant. Cet objet partagé peut être lu ou écrit par des fischiers SWF reçus via des connexions autres que HTTPS. Si vous fichier SWF est diffusé via une connexion autre que HTTPS et que vous essayez de régler ce paramètre sur true, la création d'un objet partagé (ou l'accès à un objet partagé sécurisé précédemment créé) échoue, une erreur est renvoyée et l'objet partagé devient null. Si vous tentez d'exécuter l'extrait de code suivant à partir d'un connexion non HTTPS, la méthode SharedObject.getLocal() renvoie une erreur : try { var so:SharedObject = SharedObject.getLocal("contactManager",null,true); } catch (error:Error) { trace("Unable to create SharedObject."); } Quelle que soit la valeur de ce paramètre, les objets partages créés sont comptabilisés dans la quantité d'espace disque total autorisée pour un domaine.

Affichage du contenu d'un objet partagé

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Des valeurs sont stockées dans un objet partagé, au sein de la propriété data. Vous pouvez passer en boucle chaque valeur d'une occurrence d'objet partagé à l'aide de la boucle for..in, comme le montre l'exemple suivant : var so:SharedObject = SharedObject.getLocal("test"); so.data.hello = "world"; so.data.foo = "bar"; so.datatimezone = new Date().timezoneOffset; for (var i:String in so.data) { trace(i +":\t" + so.data[i]); }

Destruction d'objets partagés

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Pour détruire un objet SharedObject sur le client, faites appel à la méthode SharedObject.clear(). Cette action ne détruit pas les repertoires du chemin par défaut pour les objets partagés de l'application. L'exemple suivant supprime le fichier SharedObject du client :
public function destroySharedObject():void{ mySO.clear(); } 

Example SharedObject

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures L'exemple suivant illustrer le stockage d'objets simples, tel un objet Date, dans un objet SharedObject sans avoir a sérialiser et désérialiser manuellement ces objets. L'exemple suivant commence par un souhait de bienvenue en tant que nouveau visiter. Lorsque vous cliquez sur Déconnexion, l'application stocke la date actuelle dans un objet partagé. La prochaine fois que vous lancez cette application ou que vous actualisez la page, l'application vous souhaite la bienvenue avec un rappel de l'heure à laquelle vous给你们 étés déconnecté. Pour voir l'application en action, lancez-la, cliquez sur Déconnexion, puis réactualisez la page. L'application affiche la date et l'heure auxquelles vous avez cliué sur le bouton Déconnexion lors de votre précédente visite. Vous pouvez supprimer à tout moment les informations stockées en cliquant sur le bouton Supprimer le LSO.
<?xml version="1.0"?>
<!-- lsos/WelcomeMessage.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" initialize="initApp(){
    <mx:Script></! [CDATA[public var mySO:SharedObject;
        [Bindable]
        public var welcomeMessage:String;
    public function initApp():void {
        mySO = SharedObject.getLocal("mydata");
        if (mySO.data.visitDate==null) {
            welcomeMessage = "Hello first-timer!"
        } else {
            welcomeMessage = "Welcome back. You last visited on " + getVisitDate();
        }
    }
    private function getVisitDate():Date {
        return mySO.data.visitDate;
    }
    private function storeDate():void {
        mySO.data.visitDate = new Date();
        mySO.flush();
    }
    private function deleteLSO():void {
        // Deletes the SharedObject from the client machine.
        // Next time they log in, they will be a 'first-timer'.
        mySO.clear();
    }
    }></mx:Script>
    <mx:Label id="label1" text={'welcomeMessage'}>/>
    <mx:Button label="Log Out" click="storeDate"/>
    <mx:Button label="Delete LSO" click="deleteLSO"/>
</mx:Application> 

Stockage local chiffré

La classe EncryptedLocalStore (ELS) fournit un mécanisme de stockage local chiffré que vous pouvez utiliser comme mémoire cache pour stocker les données privées d'une application. Les données du magasin local chiffré ne peuvent pas être partagées entre les applications. L'objet du magasin local chiffré est de permettre à une application de stocker les éléments facilement recréés tels que les informations d'identification et autres informations privées. Les données du magasin local chiffré ne doivent pas être considérées comme étant permanentes, comme nous l'indiquons dans les rubriques « Restrictions du magasin local chiffré » et « Recommendations d'utilisation » ci-dessous. Remarque: outre le magasin local chiffre, AIR assure également le chiffrement du contenu stocké dans les bases de données SQL. Pour plus d'informations, voir la section « Utilisation du chiffrement avec les bases de données SQL » à la page 787. Voupeutis i t s t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t 0 Sur les plates-formes de bureau, AIR utilise DPAPI sous Windows, KeyChain sous Mac OS et iOS, et KeyRing ou KWallet sous Linux pour associer le magasin local chiffré à chaque application et chaque utilisateur. Le magasin local chiffré utilise le chiffrement AES-CBC 128 bits. Sur Android, les données enregistrées par la classe EncryptedLocalStorage ne sont pas chiffrées. Elles sont protégées par la sécurité de niveau utilisé fournie par le système d'exploitation. Le système d'exploitation Android afferce à chaque application un ID utilisateur distinct. Les applications peuvent uniquement acceder à leurs propres fichiers et aux fichiers créés dans des emplacements publics (teils que la carte de stockage amovible). Notez que sur les péripériques Android associés à une racine, les applications s'executant avec des privilèges racines PEUVENT acceder aux fichiers d'autres applications. Sur ce type de péripérisque, le magasin de stockage local ne fournit pas un niveau élevé de protection de données. Les informations stockées dans le magasin local chiffré sont réservées au contenu d'application AIR dans le sandbox de sécurité de l'application. Une version mise à jour d'une application AIR conserve un accès à toute donnée existante stockée dans le magasin local chiffré, sauf si : - Lors de l'ajout des éléments, le paramètre stronglyBound était définir sur true. La version existante et la version mise a jour sont toutes deux publiées avant AIR 1.5.3 et la mise a jour est dotée d'une signature de migration.

Restrictions du magasin local chiffre

Les données stockées dans le magasin local chiffre sont protégées par les informations d'identification du compte sur le système d'exploitation de l'utilisateur. Sauf s'il se connecte sous le nom de cet utiliser, aucun autre utiliser ne peut acceder aux données du magasin. Les données ne sont toute fois pas protégées contre les accès par d'autres applications executées par un utiliseriateur authenticate. Puisque l'utilisateur doit être authentifié pour que ces attaquesAboutissent, les données privées de ce dernier demeurent protégées, à moins que le compte utiliser en tant que tel ne soit plus sécurisé. Toutefois, les données que votre application ne souhaite pas partager avec d'autres utilisateurs, telles que les clés d'obtention de licence ou de gestion des droits numériques, ne sont pas sécurisées. L'ESL n'est donc pas adapté au stockage d'informations de ce type. Il convient uniquement au stockage des données privées d'un utiliser, telles que les mots de passer. Les données stockées dans l'ELS risquent d'être perdues pour diverses raisons. L'utilisateur pourrait par exemple désinstaller l'application et supprimer le fichier chiffré. L'identifient d'éditeur pourrait également être modifié suite à une mise à jour. L'ELS doit de ce fait êtreTraits comme une mémoire cache privée et non un emplacement de stockage de données permanent. L'utilisation du paramètre stronglyBound étant déconseillée, ne le définisse pas sur true. Définir ce paramètre sur true ne constitue pas une mesure de protection complémentaire des données. L'accès aux données est par ailleurs perdu lorsque l'application est mise à jour, même si l'identifiant d'éditeur ne change pas. Les performances du magasin local chiffre risquent d'être plus lentes si les données stockées dépassent 10 Mo. Lorsque you désinstallez une application AIR, le programme de désinstallation ne supprime pas les données stockées dans le magasin local chiffré.

Recommendations d'utilisation

Les recommendations d'utilisation de l'ELS sont les suivantes : - Stockez dans l'ELS les données utilisateurs confidentielles telles que les mots de passage (définissez le paramètre stronglyBound sur false). - Ne stockez pas dans l'ELS des données secretes d'applications telles que les clés DRM ou les jetons de licence.. - Intégrez dans l'application une technique de création des données stockées dans l'ELS en cas de perte des données stockées dans ce dernier. Vous pouze, par exemple, inviter l'utilisateur à saisir à nouveau les informations d'identification du compte si besoin est. - N'utilisez pas le paramètre stronglyBound. - Si vous définissez stronglyBound sur true, n'effectuez pas la migration des éléments stockés lors d'une mise à jour. Créez à nouveau les données une fois la mise à jour terminée. - Ne stockez que des volumes relativement faibles de données. Stockez les volumes plus importants de données dans une base de données SQL AIR avec chiffrement.

Voir aussi

flash.data.EncryptedLocalStore

Ajout de données au magasin local chiffré

La méthode statique addItem() de la classe EncryptedLocalStore permet de stocker des données dans le magasin local. Les données sont stockées dans une table de hachage, dans laquelle les chaînes font office de clés et les données stockées de tableauux d'octets. Par exemple, le code suivant stocke une chaine dans le magasin local chiffré :
var str:String = "Bob";  
var bytes:Array = new ArrayList();  
bytes.writeUTFBytes(str);  
EncryptedLocalStore.setItem("firstname", bytes); 
Le troisième paramètre de la méthode setItem(), stronglyBound, est facultatif. Si ce paramètre est défini sur true, le magasin local chiffré lie l'objet stocké aux bits et à la signature numérique de l'application AIR qui effectue le stockage :
var str:String = "Bob";  
var bytes:Array = new ArrayList();  
bytes.writeUTFBytes(str);  
EncryptedLocalStore.setItem("firstname", bytes, false); 
Si un élément est stocké alors que stronglyBound est définir sur true, les appels suivants de getItem() n'aboutissent que si l'application AIR à l'origine de l'appoint est identique à l'application qui effectue le stockage (en d'autres termes, si aucune donnée des fichiers résident dans le repertoire de l'application n'a été modifiée). Si l'application AIR à l'origine de l'appoint n'est pas identique à l'application de stockage, une exception Error est renvoyée lorsque vous appelez getItem() pour un élément à liaison forte. Si vous mettez à jour votre application, elle n'est plus en mesure de dire les données à liaison forte précédemment écrites dans le magasin local chiffré. La définition de stronglyBound sur true sur les péripériques mobiles est ignorée; ce paramètre est toujours considéré comme false. Si le paramètre stronglyBound est défini sur false (valeur par défaut), il suffit que l'identifient d'éditeur resté identique pour que l'application puisse dire les données. Les bits de l'application peuvent changer (sous réserve d'être signés par le même éditeur), mais ne doivent pas nécessairement correspondre exactement aux bits de l'application qui a stocké les données. Les applications mises à jour dotées du même identifiant d'éditeur que l'application originale continuant à acceder aux données. Remarque: en pratique, définir stronglyBound sur true n'assure aucune protection complémentaire des données. Un utilisateur « malveillant » pourrait en effet modifier une application en vue d'acceder aux éléments stockés dans l'ELS. Que stronglyBound soit défini sur true ou false, les données sont par ailleurs aussi bien protégées contre les menace externes émanant de personnes autres que les utilisateurs. De ce fait, il est déconseilé de définir stronglyBound sur true.

Accès aux données stockées dans le magasin local chiffré

Adobe AIR 1.0 et les versions ultériques Pour extraire une valeur du magasin local chiffre, utilisez la méthode EncryptedLocalStore getItem(), comme dans l'exemple suivant: varstoredValue:ByteArray = EncryptedLocalStore getItem("firstname"); trace(storedValue.readUTFBytes(storedValue.length)); // "Bob"

Suppression de données du magasin local chiffré

Adobe AIR 1.0 et les versions ultériques Pour supprimer une valeur du magasin local chiffré, utiliser la méthode EncryptedLocalStore.removeItem(), comme dans l'exemple suivant: EncryptedLocalStore.removeItem("firstname"); Pour supprimer toutes les valeurs du magasin local chiffré, appelez la méthode EncryptedLocalStore.reset(), comme dans l'exemple suivant: EncryptedLocalStore reset();

Chapitre 40 : Utilisation des bases de données SQL locales dans AIR

Adobe AIR 1.0 et les versions ultérieures Adobe® AIR® permet de creator et d'utiliser des bases de données SQL locales. Le moteur d'exécution inclut un moteur de base de données SQL avec prise en charge de nombreuses fonctionnalités SQL standard, à l'aide du système de base de données SQLite open source. Une base de données SQL locale peut être utilisé pour le stockage des données persistantes locales. Par exemple, elle peut servir pour les données d'application, les paramètres utiliser d'application, des documents ou tout autre type de données que votre application doit enregistrer locally.

A propos des bases de données SQL locales

Adobe AIR 1.0 et les versions ultérieures Pour obtenir une explication rapide de l'utilisation de bases de données SQL et des exemples de code correspondants, voir les articles de démarrage rapide suivants dans Adobe Developer Connection : - Utilisation asynchrone d'une base de données SQL locale (Flex) - Utilisation asynchrone d'une base de données SQL locale (Flex) - Utilisation d'une base de données chiffree (Flex) - Utilisation asynchrone d'une base de données SQL locale (Flash) - Utilisation synchrone d'une base de données SQL locale (Flash) - Utilisation d'une base de données chiffree (Flash) Adobe AIR comprehend un moteur de base de données relationnelle de type SQL qui fonctionne au sein du moteur d'execution. Les données sont stockées localement dans des fischiers de bases de données dans l'ordinateur sur lequel l'application AIR s'exécute (par exemple, dans le disque dur de l'ordinateur). L'execution de la base de données et le stockage des fischiers de données s'effectuant localement, une application AIR peut utiliser une base de données qu'une connexion réseau soit disponible ou non. Le moteur de base de données SQL locale du moteur d'exécution constitue ainsi un mécanisme pratique pour le stockage des données d'application locales persistantes, en particulier si vous maitrises les bases de données relationnelles et SQL.

Cas d'utilisation des bases de données SQL locales

Adobe AIR 1.0 et les versions ultérieures La fonctionnalité de base de données SQL locale de l'application AIR peut répondre à tout objectif de stockage des données d'application sur l'ordinateur local d'un utiliser. Adobe AIR inclut plusieurs mécanismes de stockage local des données, chacunprésentant des avantages distincts.Voici quelques utilisations possibles d'une base de données SQL locale dans votre application AIR: - Avec une application orientée données (par exemple, un carnet d'adresses), une base de données peut être utilisée pour stocker les données de l'application principale. - Avec une application orientée documents, dans laquelle les utilisateurs seront des documents à enregistrer et évientuèlement à partager, chaque document peut être enregistré sous forme de fichier de base de données, à l'emplacement désigné par l'utilateur. (Notez, toute fois, que si la base de données n'est pas chiffree, toute application AIR peut ouvrir le fichier de bases de données. Le chiffrement est donc recommendé pour tous les documents potentiellement sensibles.) - Avec une application réseau, il est possible d'utiliser une base de données pour stocker un cache local des données d'application ou pour stocker temporairement des données lorsque la connexion réseau n'est pas disponible. Un mécanisme de synchronisation peut dans ce cas être créé pour synchroniser la base de données locale avec le magasin de données en réseau. - Quelle que soit l'application, une base de données peut etre utiliser pour stocker les parametes d'application des utilisateurs individuels, tels que les informations relatives aux applications ou aux options des utilisateurs, comme la taille et la position de la fenetre.

Voir aussi

Christophe Coenraets : Employee Directory on AIR for Android (disponible en anglais uniquement) Raymond Camden : jQuery and AIR - Moving from web page to application (disponible en anglais uniquement)

A propos des fichiers de bases de données et des bases de données AIR

Adobe AIR 1.0 et les versions ultérieures Une base de données SQL locale Adobe AIR individuelle est stockée sous la forme d'un seul fjichier dans le système de fjichiers de l'ordinateur. Le moteur de base de données SQL du moteur d'exécution gère la création et le formatage des fjichiers de base de données, de même que la manipulation et la récapération des données dans un fjichier de base de données. Le moteur d'exécution ne spécifie pas comment ni où les données de la base de données sont stockées dans le système de fjichiers, mais chaque base de données est stockée dans son intégrality dans un seul fjichier. Vous spécifie l'emplacement de stockage du fjichier de base de données dans le système de fjichiers. Une même application AIR peut acceder à une ou plusieurs bases de données distinctes (c'est-à-dire à des fjichiers de base de données distincts). Le moteur d'exécution stockant chaque base de données sous forme d'un seul fjichier dans le système de fjichiers, vous pouvez localiser votre base de données selon vos besoin, en fonction de la conception de votre application et des contraintes d'accès aux fjichiers du système d'exploitation. Chaque utiliser peut disposer d'un fjichier de base de données distinct pour ses données spécifique, ou tous les utilisateurs de l'application peuvent acceder à un fjichier de bases de données sur un ordinateur dans le cas de données partagées. Les données étant stockées localement sur un seul ordinateur, elles ne sont pas automatiquement partagées avec les utilisateurs d'autres ordinateurs. Le moteur de la base de données SQL locale ne permet pas d'exécuter des instructions SQL sur une base de données distante ou basée sur un serveur.

A propos des bases de données relationnelles

Adobe AIR 1.0 et les versions ultérieures Une base de données relationnelle est un mécanisme de stockage (et de récapération) des données sur un ordinateur. Les données sont organises en tables : les lignes représentent les enregistements ou les éléments, et les colonnes (parfois appelées « champions ») divisent chaque enregistrement en valeurs individuelles. Par exemple, une application de carnet d'adresses peut containir une table nommée « amis ». Chaque ligne de la table représentée alors un ami stocké dans la base de données. Les colonnes de cette table représentent des données telles que le prénom, le nom, la date de naissance, etc. Pour chaque ligne de la table, la base de données stocke une valeur distincte dans chaque colonne. Les bases de données relationnelles sont conçues pour stocker des données complexes, chaque élément étant associé ou relié à des éléments d'un autre type. Dans une base de données relationnelle, toute donnée représentant une relation « un à plusieurs » (ou un seul enregistrement peut être relié à plusieurs enregistrements de types différents) doit être répartie parmi les différentes tables. Par exemple, si vous souhaitez stocker plusieurs numérios de téléphone pour chaque ami dans votre application de carnet d'adresses, il s'agit d'une relation « un à plusieurs ». La table « amis » contiendrait alors toutes les informations personnelles de chaque ami. Une table distincte « numérios de téléphone » contiendrait tous les numérios de téléphone de tous les amis. Outre le stockage des données de vos amis et de leurs numérores de téléphone, chaque table a besoin d'un élément de données qui lui permette de relier les deux tables (pourmettre en correspondance les enregistements individuels des amis et leurs numérores de téléphone). Ces données sont appelées clé primaire (identifiant unique qui différenceie chaque ligne de la table des autres lignes de cette même table). La clé primaire peut être une « clé naturelle», c'est-à-dire un élément de données qui différenceie naturellement chaque enregistrement d'une table. Dans le cas de la table « amis», si vous savez qu'aucun de vos amis n'a la même date de naissance, vous pouvez utiliser la colonne date de naissance comme clé primaire (clé naturelle) de cette table. S'il n'existe pas de clé naturelle, vous pouvez creator une colonne de clé primaire distincte telle que « ID ami » (valeur artificielle utilisée par l'application pour différencier les lignes). L'utilisation d'une clé primaire permet de définir les relations existant entre plusieurs tables. Supposons par exemple que la colonne « ID ami » de la table « amis » contienne un numéro unique pour chaque ligne (chaque ami). La table reliée « numérios de téléphone » peut être structurée sur deux colonnes : l'une contenant l'identifant de l'amà à qui le nombre de téléphone appartiennent, l'autre contenant le numéro de téléphone lui-même. Ainsi,quel que soit le nombre de numérios de téléphone d'un ami, tous peuvent être stockés dans la table « numérios de téléphone » et reliés à l'amà associé via la clé primaire « ID ami ». Lorsque la clé primaire d'une table est utilisé dans une table reliée pour spécifique la connexion entre les enregistements, la valeur de la table reliée est appelée clé étrangère. Contrairement à de nombreuses bases de données, le moteur de base de données locales de l'application AIR ne vous permit pas de creator des contraintes de clé étrangère. Ces contraintes vérifier automatiquement qu'une valeur de clé étrangère mise à jour ou insérée correspond à une ligne de la table de clés primaires. Les relations entre les clés étrangères sont toute fois un élément important de la structure d'une base de données relationnelle, et les clés étrangères doivent être utilisées lors de la création de relations entre les tables de votre base de données.

A propos de SQL

Adobe AIR 1.0 et les versions ultérieures Le langage SQL (Structured Query Language) est utilisé avec les bases de données relationnelles pour manipuler et récapaciter les données. SQL est davantage un langage DESCRIPTIF qu'un langage PROCEDURAL. Au lieu de donner à l'ordinateur des instructions sur la façon dont les données doivent être récapacERées, une instruction SQL décrit le jeu de données désiré. Le moteur de base de données déterminée lui comment récapacER ces données. Le langage SQL a été normalisé par l'institut ANSI (American National Standards Institute). La base de données SQL locale d'Adobe AIR prend en charge la plupart des standards SQL-92. Pour consulter des descriptions spécifiques du langage SQL pris en charge dans Adobe AIR, voir « Prise en charge de SQL dans les bases de données locales » à la page 1154.

A propos des classes de base de données SQL

Adobe AIR 1.0 et les versions ultérieures Pour travailler avec des bases de données SQL locales dans ActionScript 3.0, vous utilisez les occurrences des classes suivantes du package flash.data :
ClasseDescription
flash.data.SQLConnectionPermet de creator et d'ouvrir des bases de données (fichiers de base de données), de même que des méthodes pour effectuer des opérations au niveau des bases de données et pour contröler leurs transactions.
flash.data.SQLStatementReprésente une seule instruction SQL (une unique requête ou commande) exécutée sur une base de données, avec la définition du texte de l'instruction et les valeurs des paramètres.
flash.data.SQLResultPermet de récapérer des informations ou les résultats provenant de l'exécution d'une instruction, par exemple le résultat des lignes provenant d'une instruction SELECT, le nombre de lignes affectées par une instruction UPDATE ou DELETE, etc.
Pour obtenir les informations du schéma décrivant la structure d'une base de données, utilisez les classes suivantes du package flash.data :
ClasseDescription
flash.data.SQLSchemaResultSert de conteneur aux résultats du schéma de la base de données générés par un appel à la méthode SQLConnection.loadSchema().
flash.data.SQLTableSchemaFournit des informations dérivant une table spécifique dans une base de données.
flash.data.SQLViewSchemaFournit des informations dérivant une vue spécifique dans une base de données.
flash.data.SQLIndexSchemaFournit des informations dérivant une colonne spécifique dans une table ou une vue d'une base de données.
flash.data.SQLTriggerSchema aFournit des informations dérivant un déclencheur spécifique dans une base de données.
Les autres classes du package flash.data fournissant des constantes utilisées avec les classes SQLConnection et SQLColumnSchema :
ClasseDescription
flash.data.SQLModeDéfinit un ensemble de constantes représentant les valeurs possibles du paramètre openMode des méthodes SQLConnection.open() et SQLConnection.openAsync().
flash.data.SQLcolumnNameStyleDéfinit un ensemble de constantes représentant les valeurs possibles de la propriété SQLConnection.columnsNameStyle.
flash.data.SQLTransactionLockTypeDéfinit un ensemble de constantes représentant les valeurs possibles du paramètre option de la méthode SQLConnection.begin().
flash.data.SQLCollationTypeDéfini un ensemble de constantes représentants les valeurs possibles de la propriété SQLColumnSchema.defaultCollationType et du paramètre defaultCollationType du constructeur SQLColumnSchema().
De plus, les classes suivantes du package flash.events représentent les événements (et les constantes prises en charge) que vous utilisez :
ClasseDescription
flash.events.SQLEventDéfinit les événements distribués par une occurrence de SQLConnection ou SQLStatement lorsque l'une de ses opérations s'exécute avec succès. Chaque opération est associée à une constante de type d'événement définie dans la classe SQLEvent.
flash.events.SQLErrorEventDéfinit l'événement distribué par une occurrence de SQLConnection ou SQLStatement lorsque l'une de ses opérations provoque une erreur.
flash.events.SQLUpdateEventDéfinit l'événement distribué par une occurrence de SQLConnection lorsque les données d'une table de l'une de ses bases de données connectées changent du fait de l'exéciution d'une instruction SQL INSERT, UPDATE ou DELETE.
Enfin, les classes suivantes du package flash mistakes fournissent des informations sur les erreurs des opérations de base de données :
ClasseDescription
flash.errors.SQLErrorFournit des informations sur une erreur d'opération de base de données, y compris l'opération tentée et la cause de son échec.
flash.errors.SQLErrorOperati onDéfinit un ensemble de constantes représentant les valeurs possibles de la propriété operation de la classe SQLError, indiquant l'opération de base de données ayant provoqué une erreur.

A propos des modes d'exécution synchrone et asynchrone

Adobe AIR 1.0 et les versions ultérieures Lorsque vous écrivez du code pour travailler avec une base de données SQL locale, vous spécifie que les opérations de cette base de données doivent s'exécuter dans l'un des deux modes d'exéciution suivants : asynchrone ou synchrone. En général, les exemples de code montrent comment effectuer chaque opération des deux manières. Vous pouvez donc utiliser l'exemple répondant le besoin à vos besoins. En mode d'exécution asynchrone, vous envoyez une instruction au moteur d'exécution et ce dernier distribue un événement lorsque l'opération demandée se termine ou échoue. Vous commencerz par indiquer au moteur de base de données d'effectuer une opération. Celui-ci travaille en arrêtère-planpendant que l'application poursuit son événement. Enfin, lorsque l'opération est terminée (ou lorsqu'elle échoue), le moteur de base de données dénées distribue un événement. Notre code, déclenché par l'événement, effectue les opérations consécutives. Cette approche présente un avantage important: le moteur d'exécution effectue les opérations de base de données en arrêtère-planpendant que le code de l'application principale poursuit son événement. Si l'opération de base de données prend un certain temps, l'exécution de l'application n'est pas interrompue. Plus important encore, l'utilisateur peut continuer à interagir avec elle sans que l'écran ne se fige. Toutefois, la réduction du code d'opérations asynchrones peut se révêler plus complexe que la réduction d'autres codes. Cette complexité survient généralement lorsque plusieurs opérations dépendantes doivent être réparties entre diverses méthodes d'écouteur d'événement. De façon conceptuelle, il est plus simple de coder les opérations sous forme d'une seule série d'étapes (ensemble d'opérations synchrones)只不过 que sous forme d'un ensemble d'opérations divisées en plusieurs méthodes d'écouteur d'évenement. Outre les opérations de base de données asynchrones, Adobe AIR vous permet également d'exécuter des opérations de base de données de façon synchrèe. Dans ce mode, les opérations ne s'exécutent pas en arrêtère-plan mais dans la même série d'exécution que le reste du code de l'application. Vous indiquez au moteur de base de données d'effectuer une opération. Le code s'interrrompt alors à ce stade pendant que le moteur de base de données effectue son travail. Lorsque l'opération est terminée, l'exécution se poursuit avec la ligne suivante de votre code. L'exécution asynchrone ou synchrone des opérations est définie au niveau de l'occurrence de SQLConnection. L'utilisation d'une seule connexion de base de données ne permet pas d'exécuter certaines opérations ou instructions de façon synchrone et d'autres de façon asynchrone. Pour indiquer si une occurrence de SQLConnection fonctionne en mode d'exécution synchrone ou asynchrone, appelez une méthode SQLConnection pour ouvrir la base de données. Si vous appelez SQLConnection.open(), la connexion opère en mode d'exécution synchrone, et si vous appelez SQLConnection.openAsync(), le mode d'exécution asynchrone est utilisé. Lorsqu'une occurrence de SQLConnection est connectée à une base de données à l'aide de open() ou openAsync(), elle est figée en mode d'exécution synchrone ou asynchrone, sauf si vous fermez et rouvre la connexion à la base de données. Chaque mode d'exécution a ses propres avantages. Bien que similaires dans la plupart de leurs aspects, chaque mode présente des différences que vous doivent pour les exploiter correctement. Pour plus d'informations et pour obtenir des suggestions quant au besoin de chaque mode, voir la section « Utilisation des opérations de base de données synchrones et asynchrones » à la page 782.

Creation et modification d'une base de données

Adobe AIR 1.0 et les versions ultérieures

Pour que votre application puisse ajouter ou récapierer des données, elle doit pouvoir acceder à une base de données avec des tables définies. Cette section déscrit la création d'une base de données et de la structure de ses données. Bien que moins frequently utilisé que l'insertion et la récapération de données, ces tâches sont nécessaires pour la plupart des applications.

Voir aussi

Mind the Flex : Updating an existing AIR database (disponible en anglais uniquement)

Creation d'une base de données

Adobe AIR 1.0 et les versions ultérieures

Pour creer un fichier de base de données, you commencce par creer une occurrence de SQLConnection. Vous appelez sa methode open () pour l'ouvr in mode d'execution synchrone, ou sa methode openAsync () pour l'ouvr in mode d'execution asynchrone. Les methodes open () et openAsync () sont utilisées pour ouvrir une connexion à une base de données. Si vous transmettez une occurrencie de File faisant reference à un emplacement de fichier non existant pour le parametre reference (premier parametre), la methode open () ou openAsync () create un fichier de base de données à cet emplacement et ouvre une connexion à la nouvelle base de données. Quelle que soit la méthode appelée pour creer une base de données, open() ou openAsync(), le nom du fjichier de la base de données peut être tout nom de fjichier valide, avec n'importequelle extension. Si vous appelez la méthode open() ou openAsync() en définissant null pour le paramètre reference, une nouvelle base de données en mémoire est créé et non un fjichier de base de données sur disque. Le code suivant montre le processus de creation d'un fichier de base de données (nouvelle base de données) en mode d'exécution asynchrone. Dans ce cas, le fichier de base de données est enregistré dans le « Pointage vers le répertoire de stockage d'une application » à la page 697, sous le nom « DBSample.db »: import flash.data.SQLConnection; import flash.events.SQLErrorEvent; import flash.events.SQLEvent; import flash.filesystem.File; var conn:SQLConnection = new SQLConnection(); conn.addEventListener(SQLEvent. OPEN,openHandler); conn.addEventListener (SQLErrrorEvent. ERROR, errorHandler); // The database file is in the application storage directory var folder:File File.applicationStorageDirectory; var dbFile:File folderresolvePath("DBSample.db"); conn.openAsync(dbFile); function openHandler(event:SQLEvent):void { trace("the database was created successfully"); } function errorHandler(event:SQLErrrorEvent):void { trace("Error message:",event(error_message); trace("Details:",event.error.Details); }
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="init(){
    <mx:Script>
        <!--CDATA>
            import flash.data.SQLConnection;
            import flash.events.SQLErrorEvent;
            import flash.events.SQLEvent;
            import flash.filesystem.File;
        }
        private function init():void
            {
                var conn:SQLConnection = new SQLConnection();
                conn.addEventListener(SQLEvent Opens, openHandler);
                conn.addEventListener(SQLErrorEvent_ERROR, errorHandler);
            }
            // The database file is in the application storage directory
            var folder:File = File.applicationStorageDirectory;
            var dbFile:File = folderresolvePath("DBSample.db");
            conn.openAsync(dbFile);
        }
        private function openHandler(event:SQLEvent):void
            {
                trace("the database was created successfully");
            }
        }
        private function errorHandler(event:SQLErrrorEvent):void
            {
                trace("Error message:", event.error_message);
                trace("Details:", event.error.Details);
            }
        }]]> </mx:Script>
</mx:WindowedApplication> 
Remarque: bien que la classe File vous permette de pointer vers un chemin de fichier natif déterminé, les applications risquent alors de ne pas fonctionner sur toutes les plates-formes. Par exemple, le chemin C:\Documents and Settings\joe\test.db ne fonctionne que sous Windows. C'est pourquoit il est recommendé d'utiliser les propriétés statiques de la classe File, telles que File.applicationStorageDirectory, ainsi que la méthode resolvePath() ( comme illustré par l'exemple précédent). Pour plus d'informations, voir « Chemin des objets File » à la page 693. Pour exécuter des opérations en mode synchrone, lorsque vous ouvrez une connexion à la base de données avec l'occurrence de SQLConnection, appelez la méthode `open()` . L'exemple suivant montre comment créé et ouvrir une occurrence de SQLConnection qui exécute ses opérations de façon synchrone : import flash.data.SQLConnection; import flash.errors.SQLError; import flash.filesystem.File; var conn:SQLConnection = new SQLConnection(); // The database file is in the application storage directory var folder:File = File.applicationStorageDirectory; var dbFile:File = folderresolvePath("DBSample.db"); try { conn.open(dbFile); trace("the database was created successfully"); } catch (error:SQLError) { trace("Error message:", error.message); trace("Details:", error/details); }

Creation de tables de base de données

Adobe AIR 1.0 et les versions ultérieures

La création d'une table dans une base de données implique l'exécution d'une instruction SQL sur cette base de données, selon la procédure utilisée pour exécuter une instruction SQL telle que SELECT, INSERT, etc. Pour créé une table, vous utilisez une instruction CREATE TABLE, qui inclut les définitions des colonnes et les contraintes de la nouvelle table. Pour plus d'informations sur l'exécution d'instructions SQL, voir la section « Utilisation des instructions SQL » à la page 757. L'exemple suivant montre la création d'une table nommée « employees » dans un filchier de base de données existant, en mode d'execution asynchrone. Notez que ce code présuppose l'existence d'une occurrence de SQLConnection nommée conn, déjà instanciée et connectée à une base de données. import flash.data.SQLConnection; import flash.data.SQLStatement; import flash.events.SQLErrrorEvent; import flash.events.SQLEvent; //...create and open the SQLConnection instance named conn... var createStmt:SQLStatement new SQLStatement(); createStmt.sqlConnection = conn; var sql:String = "CREATE TABLE IF NOT EXISTS employees(" ^+ empId INTEGER PRIMARY KEY AUTOINCREMENT, ^+ firstName TEXT, ^+ lastName TEXT, ^+ salary NUMERIC CHECK (salary >0 ) ^+ ")"; createStmt.text sql; createStmt.addEventListener(SQLEvent.RESULT, createResult); createStmt.addEventListener(SQLErrrorEvent ErforOR, createError); createStmt.execute(); function createResult(event:SQLEvent):void { trace("Table created"); } function createError(event:SQLErrrorEvent):void { trace("Error message:", event(error_message); trace("Details:", event.error_details); }
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="init(){
    <mx:Script>
        <!--CDATA>
            import flash.data.SQLConnection;
            import flash.data.SQLStatement;
            import flash.events.SQLErrorEvent;
            import flash.events.SQLEvent;
        }
        private function init(){
            // ... create and open the SQLConnection instance named conn ...
            var createStmt:SQLStatement = new SQLStatement();
            createStmt.sqlConnection = conn;
            var sql:String =
                "CREATE TABLE IF NOT EXISTS employees (" +
                " empId INTEGER PRIMARY KEY AUTOINCREMENT, " +
                " firstName TEXT, " +
                " lastName TEXT, " +
                " salary NUMERIC CHECK (salary > 0)" +
                ")");
            createStmt.text = sql;
            createStmt.addEventListener(SQLEvent.RESULT, createResult);
            createStmt.addEventListener(SQLErrorEvent ErfOR, createError);
            createStmt.execute();
        }
        private function createResult(event:SQLEvent):void
            {
                trace("Table created");
            }
        private function createError(event:SQLErrrorEvent):void
            {
                trace("Error message:", event.error_message);
                trace("Details:", event(error_details));
            }
        ]
    );
</mx:Script>
</mx:WindowedApplication> 
L'exemple suivant illustrer la création d'une table nommée « employees » dans un fisier de base de données existant, en mode d'execution synchrone. Notez que ce code présuppose l'existence d'une occurrence de SQLConnection nommée conn, déjà instanciée et connectée à une base de données. import flash.data.SQLConnection; import flash.data.SQLStatement; import flash.errors.SQLError; //...create and open the SQLConnection instance named conn... var createStmt:SQLStatement new SQLStatement(); createStmt.sqlConnection = conn; var sql:String = "CREATE TABLE IF NOT EXISTS employees(" ^+ empId INTEGER PRIMARY KEY AUTOINCREMENT, ^+ firstName TEXT," ^+ lastName TEXT," ^+ salary NUMERIC CHECK (salary >0 ) " + ")"; createStmt.text sql; try { createStmt.execute(); trace("Table created"); } catch (error:SQLError) { trace("Error message:",error.message); trace("Details:",error.Details); }
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="init(){
    <mx:Script>
        <!--CDATA>
            import flash.data.SQLConnection;
            import flash.data.SQLStatement;
            import flash.errors.SQLError;
        }
        private function init():void
            {
                // ... create and open the SQLConnection instance named conn ...
            var createStmt:SQLStatement = new SQLStatement();
            createStmt.sqlConnection = conn;
            var sql:String =
                "CREATE TABLE IF NOT EXISTS employees (" +
                " empId INTEGER PRIMARY KEY AUTOINCREMENT, " +
                " firstName TEXT, " +
                " lastName TEXT, " +
                " salary NUMERIC CHECK (salary > 0)" +
                ")");
            createStmt.text = sql;
            try
            {
                createStmt.execute();
                trace("Table created");
            }
            catch (error:SQLError)
            {
                trace("Error message:", error.message);
                trace("Details:", error.Details);
            }
        }
    }]]> </mx:Script>
</mx:WindowedApplication> 

Manipulation des données de bases de données SQL

Adobe AIR 1.0 et les versions ultérieures

Lorsque vous utilisez des bases de données SQL locales, vous effectuez certaines tâches courantes. Ces tâches incluent la connexion à une base de données et l'ajout et la récapération de données dans ses tables. Vous doivent également être conscient(e) de différents problèmes lorsque vous effectuez ces tâches, par exemple l'utilisation des types de données et la gestion des erreurs. Notez également que plusieurs tâches de base de données sont effectuées moins féquèment mais doivent souvent l'être avant de vous attaquer à ces tâches plus courantes. Par exemple, pour pouvoir vous connecter à une base de données et récapérer des données dans l'une de ses tables, vous devez créé la base de données et la structure de ses tables. Ces tâches de configuration initiales moins féquentes sont traitées à la section « Création et modification d'une base de données » à la page 746. Vous pouvez désirer des opérations de base de données de façon asynchrone, ce qui signifie que le moteur de base de données s'exécute en arrêté-plan et vous avertit en distribuant un événement lorsque l'opération réussit ou échoue. Vous pouvez également effectuer ces opérations de façon synchrone. Dans ce cas, les opérations de base de données sont exécutées l'une après l'autre et l'ensemble de l'application (y compris l'actualisation de l'écran) attend la fin des opérations avant d'exéctuer le reste du code. Pour plus d'informations sur l'utilisation des modes d'exécution asynchrone ou synchrone, voir la section « Utilisation des opérations de base de données synchrones et asynchrones » à la page 782.

Connexion à une base de données

Adobe AIR 1.0 et les versions ultérieures

Avant d'effectuer toute opération sur une base de données, commencez par ouvrir une connexion au filchier de cette base de données. Une occurrence de SQLConnection permet de représentier une connexion à une ou plusieurs bases de données. La première base de données connectée par une occurrence de SQLConnection est appelée base de données « principale ». Cette base de données est connectée par la méthode open ( ) (en mode d'exécution synchrone) ou par la méthode openAsync ( ) (en mode d'exécution asynchrone). Si vous ouvrez une base de données via l'opération asynchrone openAsync(), enregistrez l'évenement open de l'occurrence de SQLConnection pour être averti(e) lorsque l'opération openAsync() se termine. Enregistrez l'évenement error de l'occurrence de SQLConnection pour savoir si l'opération a échoué. L'exemple suivant montre comment ouvrir un fisquier de base de données existant pour uneexecution asynchrone. Le fisquier de base de données est nommé « DBSample.db » et reside dans le « Pointage vers le repertoire de stockage d'uneapplication » à la page 697. import flash.data.SQLConnection; import flash.data.SQLMode; import flash.events.SQLErrrorEvent; import flash.events.SQLEvent; import flash.filesystem.File; var conn:SQLConnection = new SQLConnection(); conn.addEventListener(SQLEvent. OPEN,openHandler); conn.addEventListener (SQLErrrorEvent. ERROR, errorHandler); // The database file is in the application storage directory var folder:File = File.applicationStorageDirectory; var dbFile:File = folderresolvePath("DBSample.db"); conn.openAsync(dbFile,SQLMode.UPDATE); function openHandler(event:SQLEvent):void { trace("the database opened successfully"); } function errorHandler(event:SQLErrrorEvent):void { trace("Error message:", event(error_message); trace("Details:", event(error.Details)); }
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="init(){
    <mx:Script>
        <!--CDATA>
            import flash.data.SQLConnection;
            import flash.data.SQLMode;
            import flash.events.SQLErrorEvent;
            import flash.events.SQLEvent;
            import flash.filesystem.File;
        }
        private function init():void
            {
                var conn:SQLConnection = new SQLConnection();
                conn.addEventListener(SQLEvent Opens, openHandler);
                conn.addEventListener(SQLErrorEvent_EROR, errorHandler);
            }
        }
        private function openHandler(event:SQLEvent):void
            {
                trace("the database opened successfully");
            }
        }
        private function errorHandler(event:SQLErrrorEvent):void
            {
                trace("Error message:", event.error_message);
                trace("Details:", event.error_details);
            }
        }]]> </mx:Script>
</mx:WindowedApplication> 
L'exemple suivant illustrer l'ouverture d'un fichier de base de données existant pour une exécution synchrone. Le fichier de base de données est nommé « DBSample.db » et réside dans le « Pointage vers le réseau de stockage d'une application » à la page 697. import flash.data.SQLConnection; import flash.data.SQLMode; import flash.errors.SQLError; import flash.filesystem.File; var conn:SQLConnection = new SQLConnection(); // The database file is in the application storage directory var folder:File = File.applicationStorageDirectory; var dbFile:File = folderresolvePath("DBSample.db"); try { conn.open(dbFile,SQLMode.UPDATE); trace("the database opened successfully"); } catch (error:SQLError) { trace("Error message:", error.message); trace("Details:", error.Details); } Notez que dans l'appoint de méthode openAsync() de l'exemple asynchrone et dans l'appoint de méthode open() de l'exemple synchrone, le second argument est la constante SQLMode_UPDATE. La définition de SQLMode_UPDATE pour le second paramètre (openMode) oblige le moteur d'éjection à distribuer une erreur si le fichier spécifique n'est pas. Si vous transmettez SQLMode_CREATE pour le paramètre openMode (ou si vous laissez le paramètre openMode désactifé), le moteur d'éjection tente de créé un fichier de base de données lorsque le fichier spécifique n'est pas. Toutefois, s'il existe, le fichier est ouvert, ce qui revient à utiliser SQLMode.Update. Vous pouvez également spécifique SQLMode.Read pour le paramètre openMode afin d'ouvrir une base de données existante en lecture seule. Dans ce cas, les données peuvent être récapurées dans la base de données, mais ne peuvent pas être ajoutées, supprimées ou modifiées.

Utilisation des instructions SQL

Adobe AIR 1.0 et les versions ultérieures

Une instruction SQL individuelle (requête ou commande) est représentée dans le moteur d'exécution par un objet SQLStatement. Pour creer et executer une instruction SQL, procédez comme suit :

Creez une occurrence de SQLstatement.

L'objet SQLStatement représenté l'instruction SQL dans votre application.
var selectData:SQLStatement = new SQLStatement(); 

Spcificiez surquelle base de données la requete doit s'executer.

Pour ce faire, définitisse la propriété sqlConnection de lobjet SQLStatement sur l'occurrence de SQLConnection connectée à la base de données désirée.
// A SqlConnection named "conn" has been created previously  
selectData.sqlConnection = conn; 

Définissez la veritable instruction SQL.

Creez le texte de l'instruction sous forme d'occurrence de String et affectez-la à la propriété text de l'occurrence de SQLStatement.
selectData.text = "SELECT col1, col2 FROM my_table WHERE col1 = :param1"; 

Définissez les fonctions gérant le résultat de l'exéciution (mode d'exéciution asynchrone uniquement).

Utilisez la méthode addEventListener() pour enregistrer les fonctions en tant qu'écouteurs des événements résultat et error de l'occurrence de SQLStatement.
// using listener methods and addEventListener()
selectData.addEventListener(SQLEvent.RESULT, resultHandler);
selectData.addEventListener(SQLErrrorEvent失误, errorHandler);
function resultHandler(event:SQLEvent):void
{
    // do something after the statement execution succeeds
}
function errorHandler(event:SQLErrrorEvent):void
{
    // do something after the statement execution fails
} 
Voupez egelement specifie des methodes d'ecouteur d'evenements a laide d'un objet Responder. Dans ce cas, creez l'occurrence de Responder et associez-la aux methodes d'ecouteur d'evenement.
// using a Responder (flash.net.Responder)  
var selectResponder = new Responder(onResult, onError);  
function onResult(result:SQLResult):void { // do something after the statement execution succeeds }  
function onError(error:SQLError):void { // do something after the statement execution fails } 
Si le texte de l'instruction comprend des définitions de paramètres, donnez les valeurs de ces paramètres. Pour affecter les valeurs des paramètres, utilisez la propriété de tableau associatif parameters de l'occurrence de SQLStatement.
selectData.params[":param1"] = 25; 

Executez l'instruction SQL.

Appelez la méthode execute() de l'occurrence de SQLStatement.
// using synchronous execution mode  
// or listener methods in asynchronous execution mode  
selectData.Execute(); 
En outre, si vous utilisez une occurrence de Responder à la place des écouteurs d'évenement en mode d'exécution asynchrone, transmettez cette occurrence à la méthode execute().
// using a Responder in asynchronous execution mode  
selectData.Execute(-1, selectResponder); 
Voutrouvez des exemples spécifiques de ces procédures aux rubriques suivantes :
« Récupération de données dans une base de données » à la page 761 
« Insertion de données » à la page 771 
« Modification ou suppression de données » à la page 777 

Utilisation de paramètres dans des instructions

Adobe AIR 1.0 et les versions ultérieures

L'ajout d'un paramètre dans une instruction SQL permet de creer une instruction SQL réutilisable. Lorsque vous ajoutez des paramètres à une instruction, les valeurs de cette-ci peuvent changer (les valeurs ajoutées à une instruction INSERT, par exemple), mais le texte de base de l'instruction ne change pas. C'est pourquoi l'ajout de paramètres constitue un avantage en termes de performances et simplifie le codage des applications.

Présentation des paramètres d'instruction

Adobe AIR 1.0 et les versions ultérieures

Il est非常喜欢 qu'une application utilise plusieurs fois une même instruction SQL, avec de légères variations. Prenons par exemple le cas d'une application de suivi de stock qui permet à l'utiliser d'ajouter de nouveaux articles dans la base de données. Le code de l'application qui ajoute un article de stock dans la base de données exécute une instruction SQL INSERT qui ajoute veritablement les données dans la base de données. Toutefois, chaqueexecution de l'instruction présente une légère variation. En particulier, les vérables valeurs insérées dans la table différent puisqu'elles sont spécifiques à l'article ajouté au stock. Lorsqu'une instruction SQL est utilisé plusieurs fois avec des valeurs différentes dans l'instruction, la meilleure approche consiste à utiliser une instruction SQL incluant des paramètres只不过 que des valeurs litterales dans le texte SQL. Un paramètre est un espace réservé dans le texte de l'instruction qui est remplaced par une valeur réelle à chaque exécution de l'instruction. Pour utiliser des paramètres dans une instruction SQL, vous créez une occurrence de SQLStatement standard. Dans le cas de la veritable instruction SQL affectée à la propriété text, utilisez des espaces réservés aux paramètres只不过 que des valeurs litterales. Définissez ensuite la valeur de chaque paramètre en définitissant la valeur d'un élément dans la propriété parameters de l'occurrence de SQLStatement. La propriété parametes étant un tableau associatif, définiSEE une valeur déterminée à l'aide de la syntaxe suivante : statement.params [parameter_identityer] = value; parameter_identityer est une chaine si vous utilisez un paramètre nommé ou un index de nombres entiers si vous utilisez un paramètre non nommé.

Utilisation de paramètres nommés

Adobe AIR 1.0 et les versions ultérièures

Un paramètre peut être un paramètre nommé. Un paramètre nommé a un nom spécifique que la base de données utilise pourmettre en correspondance sa valeur avec l'emplacement de l'espace réservé dans le texte de l'instruction. Un nom de paramètre se compose du caractère « : » ou « @ » suivi d'un nom, comme dans les exemples suivants :
:itemName @firstname 
Le code suivant décrit l'utilisation des paramètres nommés : var sql:String = "INSERT INTO inventoryItems(name,productCode)" ^+ "VALUES(:name,:productCode)"; var addItemStmt.SQLStatement new SQLStatement(); addItemStmt.sqlConnection = conn; addItemStmt.text sql; // set parameter values addItemStmt.params[":name"] = "Item name"; addItemStmt.params[":productCode"] = "12345"; addItemStmt.execute();

Utilisation de paramètres non nommés

Adobe AIR 1.0 et les versions ultérieures

En alternative à l'utilisation de paramètres nommés, vous pouvez utiliser des paramètres non nommés. Pour utiliser un paramètre non nommé, vous désignez un paramètre dans une instruction SQL en utilisant un caractère « ? » . Un index numérique est affecté à chaque paramètre, par ordre d'apparition des paramètres dans l'instruction, en commençant par l'index 0 pour le premier paramètre. L'exemple suivant est une version différente de l'exemple précédent, à l'aide de paramètres non nommés : var sql:String = "INSERT INTO inventoryItems(name,productCode)" ^+ "VALUES (?, ?) ); var addItemStmt.SQLStatement = new SQLStatement(); addItemStmt.sqlConnection = conn; addItemStmt.text = sql; // set parameter values addItemStmt.params[0] = "Item name"; addItemStmt.params[1] = "12345"; addItemStmt.execute();

Avantages de l'utilisation de paramètres

Adobe AIR 1.0 et les versions ultérieures

L'utilisation de paramètres dans une instruction SQL présente plusieurs avantages : Performances optimisées L'exécution d'une occurrence de SQLStatement avec paramètres est plus efficace que celle d'une occurrence qui create dynamiquement le texte SQL à chaque exécution. L'amélioration des performances est due au fait que l'instruction n'est préparée qu'une seule fois mais peut ensuite être exécutée à plusieurs reprises avec des valeurs différentes de paramètres, sans qu'il soit nécessaire de recompiler l'instruction SQL. Typage explicite des données Les paramètres autorisent la substitution avec type de valeurs inconnues au moment de la construction de l'instruction SQL. L'utilisation des paramètres est le seul moyen de garantir la classe de stockage d'une valeur transmise à la base de données. Lorsque les paramètres ne sont pas utilisés, le moteur d'exécution tente de convertir toutes les valeurs de leur représentation texte en une classe de stockage en fonction de l'affinity du type de la colonne associée. Pour plus d'informations sur les classes de stockage et l'affinity des colonnes, voir « Prise en charge des types de données » à la page 1177. Sécurité renforcée Les paramètres sont également utilisés comme mesure de sécurité pour prévenir toute technique malveillante appelée attaque par injection de code SQL. Dans une attaque par injection de code SQL, l'utiliseur entre du code SQL dans un emplacement accessible (par exemple dans un champ de saisie). Si le code de l'application construit une instruction SQL en concatenant directement la saisie de l'utiliseur dans le texte SQL, le code SQL saisi par l'utiliseur est exécuté sur la base de données. L'exemple suivant illustré la concatenation de la saisie de l'utiliseur dans le texte SQL. N'utilisez pas cette technique :
// assume the variables "username" and "password"  
// contain user-entered data  
var sql:String = 
    "SELECT userName \(" + "
    "FROM users \(" + 
    "WHERE username = '' + username + ''' + 
    " AND password = '' + password + '''";  
var statement:SQLStatement = new SQLStatement();  
statement.text = sql; 
Le fait d'utiliser des paramètres d'instruction只不过 que la concatenation de valeurs saisies par utiliser dans le texte d'une instruction permet d'éviter les attaques par injection de code SQL. L'attaque par injection de code SQL ne peut se produit car les valeurs des paramètres sont traitées explicitement sous forme de valeurs substituées au lieu de devenir une partie du texte de l'instruction litterale. L'exemple suivant est l'alternative recommendée :
// assume the variables "username" and "password"  
// contain user-entered data  
var sql:String = 
    "SELECT userName \(" + "FROM users \(" + "WHERE username = :userName \(" + " AND password = :password";  
var statement:SQLStatement = new SQLStatement();  
statement.text = sql;  
// set parameter values  
statement.params["username"] = username;  
statement.params["password"] = password; 

Récupération de données dans une base de données

Adobe AIR 1.0 et les versions ultérieures La recupération de données dans une base de données comprend deux étapes. Vous executez d'abord une instruction SQL SELECT, en décrivant le jeu de données désiré de la base de données. Vous accédez ensuite aux données récapérées et vous les affichez ou les manipulez selon les besoin de votre application.

Exécution d'une instruction SELECT

Adobe AIR 1.0 et les versions ultérieures Pour extraire des données existantes d'une base de données, utilisez une occurrence de SQLStatement. Affectez l'instruction SQL SELECT appropriee à la propriété text de I'occurrence, puis appelez sa methode execute(). Pour plus d'informations sur la syntaxe de l'instruction SELECT, voir « Prise en charge de SQL dans les bases de données locales » à la page 1154. L'exemple suivant décrit l'exécution d'une instruction SELECT pour récapier des données dans une table nommée « products», en mode d'exécution asynchrone: var selectStmt:SQLStatement = new SQLStatement(); // A SQLConnection named "conn" has been created previously selectStmt.sqlConnection = conn; selectStmt.text = "SELECT itemId, itemName, price FROM products"; selectStmt.addEventListener(SQLEvent.RESULT, resultHandler); selectStmt.addEventListener(SQLErrorEvent_EROR, errorHandler); selectStmt.exec(); function resultHandler(event:SQLEvent):void { var result:SQLResult = selectStmt.Result(); var numResults:int = result.data.length; for (var i:int = 0 ; i < numResults; i++) { var row:Object = result.data[i]; var output:String = "itemId: " + row.itemId; output += "; itemName: " + row.itemName; output += "; price: " + row.price; trace(output); } } function errorHandler(event:SQLErrrorEvent):void { // Information about the error is available in the // event(error property, which is an instance of // the SQLError class. } L'exemple suivant déscrit l'exécution d'une instruction SELECT pour récapérer des données dans une table nommée « products», en mode d'exécution synchrone:
var selectStmt:SQLStatement = new SQLStatement();   
// A SQLConnection named "conn" has been created previously   
selectStmt.sqlConnection = conn;   
selectStmt.text = "SELECT itemId, itemName, price FROM products";   
try { selectStmt.exec(); var result:SQLResult = selectStmtResultSet(); var numResults:int = result.data.length; for (var i:int \(= 0\) ; i < numResults; i++) { var row:Object = result.data[i]; var output:String = "itemId: " + row.itemId; output += "; itemName: " + row.itemName; output += "; price: " + row.price; trace(output); } catch (error:SQLError) { // Information about the error is available in the // error variable, which is an instance of // the SQLError class. } \\(<?xml version="1.0" encoding="utf-8"?> <mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="init()"> <mx:Script> <! [CDATA[ import flash.data.SQLConnection; import flash.data.SQLResult; import flash.data.SQLStatement; import flash mistakes.SQLError; import flash.events.SQLErrorEvent; import flash.events.SQLEvent; private function init():void { var selectStmt:SQLStatement = new SQLStatement(); // A SQLConnection named "conn" has been created previously selectStmt.sqlConnection = conn; selectStmt.text = "SELECT itemId, itemName, price FROM products"; try { selectStmt.exec(); var result:SQLResult = selectStmt.RESULT(); 
var numResults:int = result.data.length; for(var i:int 0;i < numResults; i + + ) { var row:Object = result.data[i]; var output:String = "itemId:" ^+ row.itemId; output + = " ; itemName:" ^+ row.itemName; output + = " ; price:" ^+ row.price; trace(output); } catch (error:SQLError) { // Information about the error is available in the // error variable, which is an instance of // the SQLError class. } } ]]>
En mode d'exécution asynchrone, lorsque l'instruction se termine, l'occurrence de SQLStatement déclenché un événement résultat (SQLEvent.RESULT) indiquant que l'instruction s'est exécutée avec succès. Sinon, lorsqu'un objet Responder est transmis en tant qu'argument à la méthode execute(), la fonction du gestionnaire de résultats de l'objet Responder est appelée. En mode d'exécution synchrone, l'exécution s'interrrompt jusqu'à la fin de l'opération execute(), puis passé à la ligne de code suivante.

Accès aux données du résultat de l'instruction SELECT

Adobe AIR 1.0 et les versions ultérieures

Lorsque l'exécution de l'instruction SELECT est terminée, l'étape suivante consiste à acceder aux données récapurées. Pour récapérer les données du résultat de l'instruction SELECT executée, appelez la méthode getResult() de l'objet SQLStatement : var result:SQLResult = selectStatement的结果(); La méthode getResult() renvoie un objet SQLResult. La propriété data de l'objet SQLResult est un tableau qui contient les résultats de l'instruction SELECT : var numResults:int = result.data.length; for(var i:int = 0 ;i < numResults; i + + 1 { //row is an Object representing one row of result data var row:Object = result.data[i]; } Chaque ligne de données du jeu de résultats de l'instruction SELECT devient une occurrence de l'objet dans le tableau data. Cet objet a les propriétés dont les noms correspondent aux noms des colonnes du jeu de résultats. Les propriétés contiennent les valeurs provenant des colonnes du jeu de résultats. Par exemple, supposons qu'une instruction SELECT spécifie un jeu de résultats avec trois colonnes nommées « itemId », « itemName » et « price». Pour chaque ligne du jeu de résultats, une occurrence d'Object est créé avec les propriétés nominées itemId, itemName et price. Ces propriétés contiennent les valeurs de leurs colonnes respectives. Le code suivant définit une occurrence de SQLStatement dont le texte est une instruction SELECT. L'instruction récapèvre les lignes contenant les valeurs des colonnes firstName et lastName de toutes les lignes d'une table nominée employées. Cet exemple utilise le mode d'exécution asynchrone. Lorsque l'exécution est terminée, la méthode selectResult() est appelée, et vous accédez aux lignes de données résultats à l'aide de la méthode SQLStatement(Result) et vous les affichez à l'aide de la méthode trace(). Notez que ce code présuppose l'existence d'une occurrence de SQLConnection nommée conn, déjà instanciée et connectée à la base de données. Il suppose également que la table « employees » a déjà été créé et contient des salariés. import flash.data.SQLConnection; import flash.data.SQLResult; import flash.data.SQLStatement; import flash.events.SQLErrrorEvent; import flash.events.SQLEvent; // ... create and open the SQLConnection instance named conn ... // create the SQL statement var selectStmt:SQLStatement = new SQLStatement(); selectStmt.sqlConnection = conn; // define the SQL text var sql:String "SELECT firstName,lastname " + " FROM employees"; selectStmt.text sql; // register listeners for the result and error events selectStmt.addEventListener(SQLEvent.RESULT,selectResult); selectStmt.addEventListener(SQLErrrorEvent ErforR,selectError); // execute the statement selectStmt.execute(); function selectResult(event:SQLEvent):void { // access the result data var result:SQLResult selectStmt_Result(); var numRows:int = result.data.length; for(var i:int = 0 ;i< numRows;i++) { var output:String ""; for(varcolumnName:String in result.data[i]) { output + = columnName ^+ "":" ^+ result.data[i][columnN} trace("row[" ^+ i.toString() ^+ "]\t",output); } function selectError(event:SQLErrrorEvent):void { trace("Error message:","event(error_message); trace("Details:",event.error.Details); }
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="init(){
    <mx:Script>
        <!--CDATA>
            import flash.data.SQLConnection;
            import flash.data.SQLResult;
            import flash.data.SQLStatement;
            import flash.events.SQLErrorEvent;
            import flash.events.SQLEvent;
        }
        private function init():void
            {
                // ... create and open the SQLConnection instance named conn ...
            // create the SQL statement
            var selectStmt:SQLStatement = new SQLStatement();
            selectStmt.sqlConnection = conn;
            // define the SQL text
            var sql:String =
                "SELECT firstName, lastName + "
                "FROM employees";
                selectStmt.text = sql;
            // register listeners for the result and error events
            selectStmt.addEventListener(SQLEvent.RESULT, selectResult);
            selectStmt.addEventListener(SQLErrorEvent失误, selectError);
            // execute the statement
            selectStmt.execute();
        }
    }
private function selectResult(event:SQLEvent):void
{
    // access the result data
    var result:SQLResult = selectStmt.getResults();
    var numRows:int = result.data.length;
    for (var i:int = 0; i < numRows; i++)
        {
            var output:String =
            ;
            for (varcolumnName:String in result.data[i])
                {
                output +=columnName + ": " + result.data[i][columnName] + "; ";
            }
            trace("row[" + i.toString() +"]\t", output);
        }
    }
} private function selectError(event:SQLErrrorEvent):void
{
    trace("Error message:", event.error_message);
    trace("Details:", event.error_details);
} ]
</mx:Script>
</mx:WindowedApplication> 
Le code suivant déscrit les mêmes techniques que le précédent, mais avec le mode d'exécution synchrone. L'exemple définit une occurrence de SQLStatement dont le texte est une instruction SELECT. L'instruction récuple les lignes contenant les valeurs des colonnes firstName et lastName de toutes les lignes d'une table nommée employees. Vous accédez aux lignes de données résultats à l'aide de la méthode SQLStatement.Result() et vous les affichez à l'aide de la méthode trace(). Notez que ce code présuppose l'existence d'une occurrence de SQLConnection nommée conn, déjà instanciée et connectée à la base de données. Il suppose également que la table « employees » a déjà été créé et contient des données. import flash.data.SQLConnection; import flash.data.SQLResult; import flash.data.SQLStatement; import flash.errors.SQLError; // ... create and open the SQLConnection instance named conn ... // create the SQL statement var selectStmt:SQLStatement = new SQLStatement(); selectStmt.sqlConnection = conn; // define the SQL text var sql:String = "SELECT firstName, lastName + FROM employees"; selectStmt.text = sql; try { // execute the statement selectStmt.execute(); // access the result data var result:SQLResult = selectStmt_Result(); var numRows:int = result.data.length; for (var i:int = 0 ;i< numRows; i + + 1 var output:String = " . for(varcolumnName:String in result.data[i]) { output + = columnName ^+ :" ^+ result.data[i][columnName] ^+ ";"; } trace("row[" ^+ i.toString() ^+ ]\t",output); } catch (error:SQLError) { trace("Error message:",error.message); trace("Details:",error.Details); }
<?xml version="1.0" encoding="utf-8"?>   
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="init(){
    <mx:Script>
        <!-- CDATA[ import flash.data.SQLConnection; import flash.data.SQLResult; import flash.data.SQLStatement; import flash mistakes.SQLError; private function init():void { // ... create and open the SQLConnection instance named conn ... // create the SQL statement var selectStmt:SQLStatement = new SQLStatement(); selectStmt.sqlConnection = conn; // define the SQL text var sql:String = "SELECT firstName, lastName " + "FROM employees"; selectStmt.text = sql; try { // execute the statement selectStmt.execute(); // access the result data var result:SQLResult = selectStmt的结果(); var numRows:int = result.data.length; for (var i:int = 0; i < numRows; i++) { var output:String = ""; for (varcolumnName:String in result.data[i]) { output +=columnName + ": "; output += result.data[i][columnName] + "; "; } trace("row[" + i.toString() +"]\t", output); } catch (error:SQLError) { trace("Error message:", error.message); trace("Details:", error.Details); } } ]] > </mx:Script> </mx:WindowedApplication> 

Définition du type des données du résultat de l'instruction SELECT Adobe AIR 1.0 et les versions ultérieures

Par défaut, chaque ligne renvoyée par une instruction SELECT est créé en tant qu'occurrence d'objet dont les noms de propriétés correspondant aux noms de colonnes du jeu de résultats et la valeur de chaque colonne à la valeur de la propriété associée. Toutefois, avant d'exécuter une instruction SQL SELECT, vous pouvez définir la propriété itemClass de l'occurrence de SQLStatement sur une classe. En définissant la propriété itemClass, chaque ligne renvoyée par l'instruction SELECT est créé sous la forme d'une occurrence de la classe désignée. Le moteur d'exécution affecte les valeurs des propriétés aux valeurs des colonnes de résultats en mettant en correspondence les noms de colonnes du jeu de résultats SELECT et les noms des propriétés de la classe itemClass. Toute classe affectée en tant que propriété itemClass doit avoir un constructeur qui ne requiert aucun paramètre. En outre, la classe doit avoir une seule propriété pour chaque colonne renvoyée par l'instruction SELECT. Le fait qu'une colonne de la liste SELECT ne présente pas de nom de propriété correspondant dans la classe itemClass est considéré comme une erreur.

Récupération partielle des résultats d'une instruction SELECT Adobe AIR 1.0 et les versions ultérieures

Par défaut, l'exécution d'une instruction SELECT récapère simultanément toutes les lignes du jeu de résultats. Une fois l'instruction terminée, vous traitez généralement les données récapérées d'une manière ou d'une autre, par exemple en créant des objets ou en affichtant les données à l'écran. Si l'instruction renvoie un très grand nombre de lignes, le traitement simultané de toutes les données peut se révêler très exigeant pour l'ordinateur, qui à son tour peut ne pas redessiner l'interface pour l'utilisateur. Pour améliorer les performances de votre application, vous pouvez demander au moteur d'exécution de ne renvoyer simultanément qu'un nombre spécifique de lignes de résultats. Les données de résultats initiales sont ainsi renvoyées plus rapidement. Vous pouze également diviser les lignes du résultat en quelques, de sorte que l'interface utilisateur soit mise à jour après le traitement de chaque jeu de lignes. Notez que cette technique n'est pratique qu'en mode d'exécution asynchrone. Pour récapérer les résultats partiers de SELECT, donnez une valeur au premier paramètre de la méthode SQLStatement.execute() (parametre prefetch). Le paramètre prefetch indique le nombre de lignes à récapérer à la première écution de l'instruction. Lorsque vous appelez la méthode execute() d'une occurrence de SQLStatement, spécifie la valeur du paramètre prefetch afin que seul ce nombre de lignes soit récapéré: var stmt:SQLStatement = new SQLStatement(); stmt.sqlConnection = conn;
stmt.text = "SELECT ..."; 
stmt.addEventListener(SQLEvent.Result, selectResult); 
stmt.execute(20); // only the first 20 rows (or fewer) are returned L'instruction déclenché l'évenement résultat, qui indique que le premier jeu de lignes de résultat est disponible. La propriété data de l'occurrence de SQLResult résultat contient les lignes de données, et sa propriété complete de chaque s'il reste d'autres lignes de résultat à récapierer. Pour récapierer ces autres lignes, appelez la méthode next() de l'occurrence de SQLStatement. comme la méthode execute(), le premier paramètre de la méthode next() sert à indiquer le nombre de lignes à récapierer lors du prochain déclenchement de l'évenement de résultat.
function selectResult(event:SQLEvent):void   
{ var result:SQResults = stmt.getResuit(); if(result.data != null) { //... loop through the rows or perform other processing... if(!resultcomplete) { stmt.next(20); // retrieve the next 20 rows } else { stmt.removeEventListener(SQLEvent.RESULT,selectResult); } } 
L'occurrence de SQLStatement déclenché un événement résultat chaque fois que la méthode next() renvoie un jeu suivant de lignes de résultat. Par conséquent, la même fonction d'écouteur peut être utilisé pour continuer à traitier les résultats (par des appeals à next()) jusqu'à ce que toutes les lignes aient été récapucérées. Pour plus d'informations, voir les descriptions des méthodes SQLStatement.execute() (description du paramètre prefetch) et SQLStatement.next().

Insertion de données

Adobe AIR 1.0 et les versions ultérieures

L'ajout de données dans une base de données implique l'exécution d'une instruction SQL INSERT. Lorsque l'exécution de l'instruction est terminée, vous pouze acceder à la clé primaire de la ligne nouvellement insérée si la base de données en a généraune.

Exécution d'une instruction INSERT

Adobe AIR 1.0 et les versions ultérieures

Pour ajouter des données dans une table de base de données, créez et executez une occurrence de SQLStatement dont le texte est une instruction SQL INSERT. L'exemple suivant utilise une occurrence de SQLStatement pour ajouter une ligne de données dans la table des employés déjà existante. Cet exemple décrit l'insertion de données en mode d'exécution asynchrone. Notez que ce code présuppose l'existence d'une occurrence de SQLConnection nommée conn, déjà instancière et connectée à une base de données. Il suppose également que la table « employees » a déjà été créé.
import flash.data.SQLConnection;   
import flash.data.SQLResult;   
import flash.data.SQLStatement;   
import flash.events.SQLErrorEvent;   
import flash.events.SQLEvent;   
// ... create and open the SQLConnection instance named conn ...   
// create the SQL statement   
var insertStmt:SQLStatement = new SQLStatement();   
insertStmt.sqlConnection = conn;   
// define the SQL text   
var sql:String = "INSERT INTO employees (firstname,lastname,salary)" + "VALUES ('Bob','Smith',8000)";   
insertStmt.text = sql;   
// register listeners for the result and failure (status) events   
insertStmt.addEventListener(SQLEvent.RESULT,insertResult);   
insertStmt.addEventListener(SQLErrorEvent失误,insertError);   
// execute the statement   
insertStmt.execute();   
function insertResult(event:SQLEvent):void { trace("INSERT statement succeeded"); }   
function insertError(event:SQLErrrorEvent):void { trace("Error message:",event(error_message); trace("Details:",event.error_details); }   
<?xml version="1.0" encoding="utf-8"?>   
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="init()"> <mx:Script> <![CDATA[ import flash.data.SQLConnection; import flash.data.SQLResult; import flash.data.SQLStatement; import flash.events.SQLErrrorEvent; import flash.events.SQLEvent; private function init():void { // ... create and open the SQLConnection instance named conn ... // create the SQL statement var insertStmt:SQLStatement = new SQLStatement(); insertStmt.sqlConnection = conn; // define the SQL text var sql:String = "INSERT INTO employees (firstname,lastname,salary)" + 
"VALUES ('Bob', 'Smith', 8000"); insertStmt.text = sql; // register listeners for the result and failure (status) events insertStmt.addEventListener(SQLEvent.RESULT, insertResult); insertStmt.addEventListener(SQLErrrorEvent失误, insertError); // execute the statement insertStmt.execute(); } private function insertResult(event:SQLEvent):void { trace("INSERT statement succeeded"); } private function insertError(event:SQLErrrorEvent):void { trace("Error message:", event(error_message); trace("Details:", event.error.Details); } } ]] > </mx:Script> </mx:WindowedApplication> 
L'exemple suivant ajoute une ligne de données à la table des employés existante, en mode d'exécution synchrone. Notez que ce code présuppose l'existence d'une occurrence de SQLConnection nommée conn, déjà instantiée et connectée à une base de données. Il suppose également que la table « employees » a déjà été créée. import flash.data.SQLConnection; import flash.data.SQLResult; import flash.data.SQLStatement; import flash.errors.SQLError; //...create and open the SQLConnection instance named conn ... //create the SQL statement var insertStmt:SQLStatement new SQLStatement(); insertStmt.sqlConnection = conn; //define the SQL text var sql:String "INSERT INTO employees (firstname,lastname,salary)" ^+ "VALUES('Bob','Smith',8000)"; insertStmt.text sql; try { //execute the statement insertStmt.execute(); trace("INSERT statement succeeded"); } catch (error:SQLError) { trace("Error message:",error.message); trace("Details:",error.Details); }
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="init(){
    <mx:Script>
        <!--CDATA>
            import flash.data.SQLConnection;
            import flash.data.SQLResult;
            import flash.data.SQLStatement;
            import flash.errors.SQLError;
        }
        private function init():void
            {
                // ... create and open the SQLConnection instance named conn ...
            // create the SQL statement
            var insertStmt:SQLStatement = new SQLStatement();
            insertStmt.sqlConnection = conn;
            // define the SQL text
            var sql:String =
                "INSERT INTO employees (firstname,lastname,salary)" +
                    "VALUES ('Bob','Smith',8000)"};
            insertStmt.text = sql;
            try
            {
                // execute the statement
                insertStmt.execute();
                trace("INSERT statement succeeded");
            }
            catch (error:SQLError)
            {
                trace("Error message:", error.message);
                trace("Details:", error.Details);
            }
        }
    }]]> </mx:Script>
</mx:WindowedApplication> 

Récupération de la clé primaire d'une ligne insérée, généree par la base de données

Adobe AIR 1.0 et les versions ultérieures

Après l'insertion d'une ligne de données dans une table, il arrive souvent que le code doive connaître la clé primaire généraee par la base de données ou une valeur d'identificateur de ligne pour la ligne nouvellement insereee. Par exemple, après avoir insereé une ligne dans une table, vous pouze en ajouter d'autres dans une table associée. Dans ce cas, vous pouze insérer la valeur de la clé primaire en tant que clé étrangère de la table associée. La clé primaire d'une ligne nouvellement insérée peut être récapurée par le biais de l'objet SQLResult généraé par l'instruction exécutée. Il s'agit du mêmeobjet qui est utilisé pour acceder aux données du résultat apres l'exécution d'une instruction SELECT. Comme pour toute instruction SQL, lorsque l'exécution d'une instruction INSERT se termine, le moteur d'exécution cree une occurrence de SQLResult. Pour acceder à l'occurrence de SQLResult, vous appelez la méthode getResult() de l'objet SQLStatement si vous utilisez un écouteur d'événements ou le mode d'exécution synchrone. Si vous utilisez le mode d'exécution asynchrone et que vous transmettez une occurrence de Responder à l'appel de la méthode execute(), l'occurrence de SQLResult est transmise en tant qu'argument à la fonction du gestionnaire de résultat. Dans tous les cas, l'occurrence de SQLResult a une propriété, lastInsertRowID, qui contient l identificateur de la dernière ligne insérée si l'instruction SQL executée est une instruction INSERT. L'exemple suivant montre comment acceder à la clé primaire d'une ligne insérée en mode d'exécution asynchrone : insertStmt.text = "INSERT INTO..."; insertStmt.addEventListener (SQLEvent RESULT, resultHandler); insertStmt.execue(); function resultHandler(event:SQLEvent):void { // get the primary key var result:SQResult insertStmt=result(); var primaryKey:Number result.lastInsertRowID; //do something with the primary key } L'exemple suivant montre comment acceder à la clé primaire d'une ligne insérée en mode d'execution synchrone : insertStmt.text = "INSERT INTO..."; try { insertStmt.execute(); // get the primary key var result:SQResultsult = insertStmt的结果(); var primaryKey:Number = result.lastInsertRowID; //do something with the primary key } catch (error:SQLError) { // respond to the error Notez que l'identificateur de ligne peut ou non correspondre à la valeur de la colonne désignée en tant que colonne de clé primaire dans la définition de la table, en fonction des règles suivantes : - Si la table est définié avec une colonne de clé primaire dont l'affinité (son type de données) est INTEGER, la propriété lastInsertRowID contient la valeur insérée dans cette ligne (ou celle généraee par le moteur d'exécution s'il s'agit d'une colonne AUTOINCREMENT). - Si la table comporte plusieurs colonnes de clés primaires (clé composite) ou une seule colonne de clés primaires dont l'affinity n'est pas INTEGER, la base de données génére une valeur d'identificateur de ligne entier en arrêté-plan. La valeur générae est celle de la propriété lastInsertRowID. - La valeur est toujours l'identificateur de laforthème ligne insérée. Si une instruction INSERT provoque un déclencheur qui à son tour insère une ligne, la propriété lastInsertRowID contient l'identificateur de laforthème ligne insérée par le déclencheur et non la ligne créé par l'instruction INSERT. La conséquence de ces règles est la suivante : pour obtenir une colonne de clés primaires définie de façon explicite dont la valeur est générae par une commande INSERT via la propriété SQLResult. lastInsertRowID, définièse la colonne en tant que colonne INTEGER PRIMARY KEY. Meme si la table ne comprend pas de colonne INTEGER PRIMARY KEY explicite, il est également possible d'utiliser l'identificateur de ligne générae par la base de données comme clé primaire de la table (définition des relations avec les tables associées). La valeur de colonne de l'identificateur de ligne est disponible dans toute instruction SQL via l'utilisation des noms de colonne spéciaux ROWID, _ROWID_ ou OID. Vous pouvez creator une colonne de clé étrangère dans une table associée et utiliser la valeur de l'identificateur de ligne en tant que valeur de colonne de clé étrangère comme vous le fériez dans le cas d'une colonne INTEGER PRIMARY KEY explicitement déclarée. Ainsi, si vous utilisez une clé primaire arbitraire plutôt qu'une clé naturelle, et tant que la génération par le moteur d'exécution d'une valeur de clé primaire à votre place ne vous dérange pas, l'utilisation d'une colonne INTEGER PRIMARY KEY ou d'un identificateur de ligne générae par le système comme clé primaire de la table ne présente que peu de différence quant à la définition d'une relation de clé étrangère entre les deux tables. Pour plus d'informations sur les clés principales et les identificateurs de ligne générés, voir « Prise en charge de SQL dans les bases de données locales » à la page 1154.

Modification ou suppression de données

Adobe AIR 1.0 et les versions ultérieures La procédure d'exécution des autres opérations de manipulation des données est identique à celle utilisée pour exécuter une instruction SQL SELECT ou INSERT (voir « Utilisation des instructions SQL » à la page 757). Substituez simplement une autre instruction SQL dans la propriété text de l'occurrence de SQLStatement : - Pour modifier les données existantes d'une table, utilisez une instruction UPDATE. - Pour supprimer une ou plusieurs lignes de données dans une table, utilisez une instruction DELETE. Pour consulter une description de ces instructions, voir « Prise en charge de SQL dans les bases de données locales » à la page 1154.

Utilisation de plusieurs bases de données

Adobe AIR 1.0 et les versions ultérieures La méthode SQLConnection.attach() permet d'ouvrir une connexion à une autre base de données sur une occurrence de SQLConnection pour laquelle une base de données est déjà ouverte. Nommez la base de données reliée à l'aide du paramètre name dans l'appel de la méthode attach(). Lorsque vous écrivez des instructions pour manipuler cette base de données, vous pouze alors utiliser ce nom dans un préfixe (sous la forme nom-base de données_nom-table) pourrialifier les noms de table dans vos instructions SQL, indiquant ainsi au moteur d'exécution que la table est disponible dans la base de données nommée. Voupez executer une meme instruction SQL incluant des tables de plusieurs bases de données connectees à la meme occurrence de SQLConnection. Si une transaction est creeé sur l'occurrence de SQLConnection, cette transaction s'applique à toutes les instructions SQL executées à l'aide de cette occurrence de SQLConnection. Cela est vrai qu'elle que soit la base de données reliée sur laquelle l'instruction s'exécute. Voupez egalent creer plusieurs occurrences de SQLConnection dans une application, chacune connectee a une ou plusieurs bases de données. Toutefois, si vous utilisez cette technique, n'oubliez pas qu'une transaction de bases de données n'est pas partagée entre les occurrences de SQLConnection.Par consequent, si vous vous connectez au meme fichier de base de données a I'aide de plusieurs occurrences de SQLConnection, ne vous attendez pas a ce que les modifications de données des deux connexions s'appliquent de façon prevue.Par exemple, si deux instructions UPDATE ou DELETE s'executent sur la meme base de données par l'interneniaire d'occurrences de SQLConnection differentes et qu'une erreur survient après une operation, les données de la base peuvent etre laissees dans un etat intermediaire eventuelflement non reversible et affercter I'integritde la base de données (donc del'application).

Gestion des erreurs de base de données

Adobe AIR 1.0 et les versions ultérieures En général, la gestion des erreurs de base de données est similaire à celle des autres erreurs d'exécution. Il est préféable d'écrire du code préparé aux erreurs susceptibles de survenir, et de répondre aux erreurs只不过 que de laisser ce role au moteur d'exécution. De façon générale, les erreurs de base de données potentielles se divisent en trois catégories : les erreurs de connexion, les erreurs de syntaxe SQL et les erreurs de contrainte.

Erreurs de connexion

Adobe AIR 1.0 et les versions ultérieures La plupart des erreurs de base de données sont des erreurs de connexion et peuvent survenir durant n'importe qu'elle opération. Si certaines strategies permettent d'éviter les erreurs de connexion, il est rarement simple de récapérer correctement d'une erreur de connexion si la base de données est une partie sensible de votre application. La plupart des erreurs de connexion sont liés aux interactions entre le moteur d'exécution et le système d'exploitation, le système de fichiers et le fisier de la base de données. Par exemple, une erreur de connexion se produit si l'utilisateur n'est pas autorisé à creator un fisier de base de données dans un emplacement particulier du système de fichiers. Les stratégies suivantes permettent d'éviter les erreurs de connexion : Utilisation de fichiers de base de données spécifiques aux utilisateurs Au lieu d'utiliser un seul fichier de base de données pour tous les utilisateurs de l'application sur un même ordinateur, donnez à chaque utiliser son propre fichier de base de données. Ce fichier doit etre situé dans un repertoire associé au compte de l'utiliseur. Par exemple, il peut etre place dans le repertoire de stockage de l'application, le dossier Mes documents de l'utiliseur, sur le bureau de celui-ci, etc. Prise en compte des différents types d'utilisateurs Testez votre application avec les différents types de comptes d'utilisateur, sur des systèmes d'exploitation différents. Ne supposez pas que l'utilisateur possède des privilèges d administrateur sur l'ordinateur. De même, ne partez pas du principe que la personne qui a installé l'application est l'utilisateur qui l'execute. Prise en compte des divers emplacements des fichiers Si vous autorisez l'utilisateur à spécifique l'emplacement d'enregistrement d'un fjichier de base de données ou à seLECTIONner le fjichier à ouvrir, tenez compte des emplacements de fichiers auxquels les utilisateurs peuvent acceder. Pensez en outre à limiter les emplacements dans lesquels les utilisateurs peuvent stocker des fjichiers de base de données (ou à partir desquels ils peuvent en ouvrir). Par exemple, vous pouze autoriser uniquement les utilisateurs à ouvrir les fichiers situés dans l'emplacement de stockage de leur compte d'utilisateur. Si une erreur de connexion se produit, elle survendra probablement lors de la première tentative de creation ou d'ouverture de la base de données. Cela signifie que l'utilisteur ne peut effectuer aucune opération de base de données dans l'application. Pour certains types d'erreurs, par exemple les erreurs d'autorisation ou de lecture seule, une technique de récapuration possible consiste à copier le fichier de base de données dans un emplacement différent. L'application peut copier les fichiers de bases de données dans un emplacement pour lequel l'utilisateur est autorisé à créé et à écrire dans des fichiers, et utiliser cet emplacement à la place.

Erreurs de syntaxe

Adobe AIR 1.0 et les versions ultérieures Une erreur de syntaxe se produit lorsquel l'application tente d'exéçuter une instruction SQL qui n'est pas correctement rédigée. Les instructions SQL de base de données locales étant créées sous forme de chaine, la vérification de la syntaxe SQL au moment de la compilation n'est pas possible. Toutes les instructions SQL doivent être exécutées pour vérifier leur syntaxe. Pour éviter les erreurs de syntaxe SQL, utilisez les stratégies suivantes : Test approfondi de toutes les instructions SQL Si possible, testez vos instructions SQL séparément lors du développement de votre application avant de les coder sous forme de texte d'instruction dans le code de l'application. De plus, utilisez une approche de test de code telle que le test des unités pour creer un ensemble de tests vérissant chaque option possible et chaque variation du code. Utilisation des paramètres d'instruction au lieu de la concatenation (création dynamique) de code SQL Le fait d'utiliser des paramètres et d'éviter la construction dynamique d'instruction SQL permet d'utiliser le même texte d'instruction SQL à chaqueexecutiond'une instruction. En conséquence, le test de vos instructions est plus simple et les variations possibles sont limitées. Si vous doivent:générer une instruction SQL de façon dynamique, réduisez au strict minimum ses parties dynamiques. De même, validez soignement toutes les saisies éventuelles des utilisateurs afin de vous assurer qu'elles n'entraineront pas d'erreur de syntaxe. Pour récapérer d'une erreur de syntaxe, une application a besoin de code complexe pour pouvoir examiner l'instruction SQL et en corriger la syntaxe. En respectant les stratégies précédentes, votre code peut identifier toute source potentielle d'erreur de syntaxe SQL au moment de l'exécution (par exemple la saisie de l'utilisateur dans une instruction). Pour récapérer d'une erreur de syntaxe, donnez des consignes à l'utilisateur. Indiquez-lui ce qu'il doit faire pour que l'instruction s'exécute correctement.

Erreurs de contrainte

Adobe AIR 1.0 et les versions ultérieures Les erreurs de contrainte se produit lorsqu'une instruction INSERT ou UPDATE tente d'ajouter des données dans une colonne. L'erreur survient si les nouvelles données ne respectent pas l'une des contraintes définies pour la table ou la colonne. L'ensemble des contraintes possibles comprend : Contrainte unique Indique que pour toutes les lignes d'une table, il ne peut pas y avoir de valeurs en double dans une colonne. Alternativement, lorsque plusieurs colonnes sont combinées dans une contrainte unique, la combinaison des valeurs de ces colonnes ne doit pas être dupliquée. En d'autres termes, pour la ou les colonnes uniques spécifiées, chaque ligne doit être distincte. Contrainte de clé primaire En termes de données autorisées et interdites par une contrainte, une contrainte de clé primaire est identique à une contrainte unique. Contrainte non nulle Spécifie qu'une colonne ne peut pas stocker de valeur NULL et, par conséquent, qu'elle doit avoir une valeur pour chaque ligne. Contrainte de vérification Permet de spécifique une contrainte arbitraire pour une ou plusieurs tables. La règle qui définit que la valeur d'une colonne doit être comprise entre certaines limites est une contrainte de vérification courante (par exemple que la valeur d'une colonne numérique doit être supérieure à 0). Un另一种 type courant de contrainte de vérification spécifique les relations entre les valeurs des colonnes (par exemple que la valeur d'une colonne doit être différente de la valeur d'une autre colonne pour la même ligne). Contrainte de type de données (affinité des colonnes) Le moteur d'exécution impose le type de données des valeurs des colonnes et une erreur se produit en cas de tentative de stockage d'une valeur de type incorrect dans une colonne. Toutefois, les valeurs sont très souvent converties de manière à correspondre au type de données déclaré de la colonne. Pour plus d'informations, voir la section « Utilisation des types de données des bases de données » à la page 781. Le moteur d'exécution n'impose pas de contrainte sur les valeurs des clés étrangères. En d'autres termes, ces valeurs de clé étrangère ne doivent pas obligatoirement correspondre à une valeur de clé primaire existante. Outre les types de contraintes prédéfinies, le moteur d'exécution SQL prend en charge l'utilisation de déclencheurs. Un déclencheur estsemblable à un gestionnaire d'évenement. Il s'agit d'un jeu d'instructions prédéfini qui est exécuté lorsqu'une certaine action se produit. Par exemple, un déclencheur peut être défini pour s'exécuter lorsque des données sont insérées ou supprimées dans une table particulière. Une utilisation possible d'un déclencheur consiste à examiner les modifications apportées aux données et à provoquer une erreur lorsque les conditions spécifiées ne sont pas satisfaites. Ainsi, un déclencheur peut avoir le même objectif qu'une contrainte, et les stratégies qui permettent d'éviter les erreurs et de récapierer à partir d'erreurs de contrainte s'appliquent également aux erreurs générées par les déclencheurs. Toutefois, l'identificateur des erreurs générées par les déclencheurs diffère de celui des erreurs de contrainte. L'ensemble des contraintes s'appliquant à une table particulière est déterminé lors de la conception d'une application. La conception soignée des contraintes simplifie la conception de l'application quand au fait d'éviter et de récapérer à partir d'erreurs de contrainte. Les erreurs de contrainte sont toutfois difficibles à prévoir et à éviter systématiquement. Les anticipations sont difficles car les erreurs de contrainte n'apparaissent pas avant l'ajout de données dans l'application. Des erreurs de contraintes surviennent lorsque des données sont ajoutées dans une base de données après sa création. Ces erreurs sont souvent dues aux relations entre les nouvelles données et les données existantes dans la base de données. Les strategies suivantes permettent d'éviter de nombreuses erreurs de contrainte : Planification rigoureuse des contraintes et de la structure de la base de données L'objet des contraintes est d'imposer des règles d'application et de protéger l'intégrité des données de la base de données. Lorsque vous planifiez votre application, prévoyez la structure que doit avoir votre base de données pour prendre en charge cette application. Dans le cadre de ce processus, identifiez les règles devant s'appliquer à vos données, par exemple si certaines valeurs sont obligatoires, si une valeur est définie par défaut, si les valeurs en double sont autorisées, etc. Ces règles vous guident dans la définition des contraintes des bases de données. Définition explicite des noms des colonnes Il est possible d'écrite une instruction INSERT sans spécifique de façon explicite les colonnes dans lesquelles les valeurs doivent être insérées, mais cette technique comporte un risque inutile. En nommant explicitement les colonnes dans lesquelles des valeurs doivent être insérées, vous pouvez autoriser des valeurs générées automatiquement, des colonnes avec des valeurs par défaut et des colonnes autorisant les valeurs NULL. Cela vous permet en outre de vous assurer qu'une valeur explicite est insérée dans toutes les colonnes NOT NULL. Utilisation de valeurs par défaut Chaque fois que vous spécifiez une contrainte NOT NULL pour une colonne, spécifiez autant que possible une valeur par défaut dans la définition de la colonne. Le code de l'application peut également fournir des valeurs par défaut. Par exemple, votre application peut vérifier si une variable String est null et lui affecter une valeur avant de l'utiliser pour définir une valeur de paramètre d'instruction. Validation des données saisies par l'utilisateur Vérifiez les données saisies par l'utilisateur en amont pour vous assurer qu'elles respectent les contraintes, en particulier dans le cas des contraintes NOT NULL et CHECK. Bien évidemment, une contrainte UNIQUE est plus difficile à vérifier puisqu'elle demanderait l'exécution d'une requête SELECT pour déterminer si les données sont uniques. Utilisation de déclencheurs Vous pouvez écrire un déclencheur qui valide (et évientuèlement remplace) les données insérées ou prend d'autres mesures pour corriger les données non valides. Cette validation et cette correction permettent d'éviter les erreurs de contrainte. Les erreurs de contrainte sont dans tous les cas plus difficiles à prévenir que les autres types d'erreurs. Bien heuresusement, plusieurs strategies permettent de récapérez à partir d'erreurs de contrainte sans affecter la stabilité de l'application ni la rendre inutilisable : Utilisation d'algorithmes de conflit Lorsque vous définissez une contrainte sur une colonne et que vous créEZ une instruction INSERT ou UPDATE, vous avez la possibilité de spécifier un algorithme de conflit. Un algorithme de conflit définit la mesure que la base de données doit prendre en cas de violation d'une contrainte. Le moteur de bases de données peut avoir lechioix entre plusieurs actions possibles. Il peutmettre fin à une seule instruction ou à l'ensemble d'une transaction. Il peut ignorer l'erreur. Il peut même supprimer les anciennes données et les replacer par celles que le code tente de stocker. Pour plus d'informations, voir la section « ON CONFLICT (algorithms de conflit) » dans « Prise en charge de SQL dans les bases de données locales » à la page 1154. Réduction de commentaires de correction L'ensemble des contraintes susceptibles d'affector une commande SQL particulière peut être identifié en amont. Vous pouvez par conséquent anticiper les erreurs de contrainte pouvant se produit avec chaque instruction. Ces connaissances vous permettent de développer une logique d'application répondant à une erreur de contrainte. Par exemple, supposons qu'une application comprendne un-formulaire de saisie de données pour l'entrée de nouveaux produits. Si la colonne du nom des produits de la base de données est définie avec une contrainte UNIQUE, l'insertion d'une nouvelle ligne de produit dans la base de données peut provoquer une erreur de contrainte. Par conséquent, l'application est conçue pour anticiper une telle erreur. Lorsque l'erreur se produit, l'application avertit l'utilisateur, en lui indiquant que le nom du produit spécifique est déjà utilisé et en l'invitant àCHOISIR un autre nom. Une autre reponse possible consiste à autoriser l'utilisateur à consulter les informations relatives au produit portant le même nom.

Utilisation des types de données des bases de données

Adobe AIR 1.0 et les versions ultérieures

Lorsqu'une table est créé dans une base de données, l'instruction de création définit l'affinity, ou le type de données, pour chaque colonne de cette table. Bien que les déclarations d'affinity puissant être omises, il est préféable de déclarer explicitement l'affinity des colonnes dans vos instructions SQL CREATE TABLE. En règle générale, tout object stocké dans une base de données par une instruction INSERT est renvoyé sous forme d'occurrence du même type de données lorsque vous exécutez une instruction SELECT. Toutefois, le type de données de la valeur récapurée peut différer selon l'affinity de la colonne de la base de données dans laquelle la valeur est stockée. Lorsqu'une valeur est stockée dans une colonne, si son type de données ne correspond pas à l'affinity de la colonne, la base de données tente de convertir cette valeur en fonction de cette affinity. Par exemple, si une colonne de base de données est déclarée avec une affinité NUMERIC, la base de données tente de convertir les données insérées en classe de stockage numérique (INTEGER ou REAL) avant de stocker les données. Si les données ne peuvent pas être converties, la base de données renvoie une erreur. Selon cette règle, si la chaîne « 12345 » est insérée dans une colonne NUMERIC, la base de données la convertit automatiquement en la valeur entière 12345 avant de la stocker dans la base de données. Lorsqu'elle est récapurée par une instruction SELECT, la valeur est renvoyée sous forme d'occurrence d'un type de données numérique (tel que Number)只不过 que sous la forme d'une occurrence de String. Le meilleur moyen d'éviter une conversion non désirable du type de données est de respecter deux régles. D'abord, définitisse chaque colonne avec l'affinity correspondant au type de données à stocker. Ensuite, insérez uniquement les valeurs dont le type de données correspond à l'affinity définie. Le respect de ces régles présente deux avantages. Les données ne sont pas converties de façon imprévue lors de leur insertion (ce qui peut eventuelsment en modifier le sens). De plus, lorsque vous recupérrez les données, elles sont renvoyées avec leur type de données d'origine. Pour plus d'informations sur les types d'affinités de colonne disponibles et l'utilisation des types de données dans une instruction SQL, voir « Prise en charge des types de données » à la page 1177.

Utilisation des opérations de base de données synchrones et asynchrones

Adobe AIR 1.0 et les versions ultérieures Les sections précédentes ont décrit les opérations de bases de données courantes, telles que la récapération, l'insertion, la mise à jour et la suppression de données, ainsi que la création d'un fichier de bases de données, de tables et d'autres objets dans une base de données. Les examples montraient comment effectuer ces opérations de façon asynchrone et synchronize. Nous vous rappelons qu'en mode d'exécution asynchrone, vous demandez au moteur de base de données d'effectuer une opération. Celui-ci travaillée ensuite en arrêtère-plan pendant que l'application poursuit son exécution. Lorsque l'opération est terminée, le moteur de base de données déclenché un événement pour vous le signaler. Le principal avantage de l'exécution asynchrone est que le moteur d'exécution effectue les opérations de base de données en arrêtère-plan pendant que l'application principale poursuit son exécution. Cela est d'autant plus précieux lorsque l'exécution de l'opération prend beaucoup de temps. D'un autre cotoé, les opérations en mode d'execution synchrone ne s'excutent pas en arrriere-plan. Vous indiquez au moteur de base de données d'effectuer une opération. Le code s'interrrompt à ce stade pendant que le moteur de base de données effectue son travail. Lorsque l'opération est terminée, l'exécution se poursuit avec la ligne suivante de votre code. Une seule connexion de base de données ne permet pas d'exécuter certaines opérations ou instructions de façon synchrone et d'autres de façon asynchrone. Vous précise si une occurrence de SQLConnection s'exécute en mode synchrone ou asynchrone lors de l'ouverture de la connexion à la base de données. Si vous appelez SQLConnection.open(), la connexion opère en mode d'exéduction synchrone, et si vous appelez SQLConnection.openAsync(), le mode d'exéduction asynchrone est utilisé. Dès qu'une occurrence de SQLConnection est connectée à une base de données par une méthode open() ou openAsync(), elle fonctionne définitivement en mode synchrone ou asynchrone.

Utilisation des opérations de base de données synchrones

Adobe AIR 1.0 et les versions ultérieures Le code utilisé pour executer et répondre aux opérations en mode d'exécution synchrone et celui utilisé en mode exécution asynchrone ne présente que peu de différences. Les principales différences entre les deux approches sont de deux types. Le premier est l'exécution d'une opération qui dépend d'une autre opération (telles que les lignes de résultat de SELECT ou la clé primaire d'une ligne ajoutée par une instruction INSERT). Le second type de différence est la gestion des erreurs.

Ecriture de code pour les opérations synchrones

Adobe AIR 1.0 et les versions ultéieures La principale différence entre une exécution synchrone et asynchrone est qu'en mode synchrone, la réduction du code prend la forme d'une suite d'étapes. Par contre, dans le code asynchrone, vous enregistrez des écouteurs d'évenement et vous répartissez souvent les opérations entre les méthodes des écouteurs. Lorsqu'une base de données est connectée en mode synchrone, vous pouvez executer successivement une série d'opérations de base de données dans un seul bloc de code. L'exemple suivant illustré cette technique : var conn:SQLConnection = new SQLConnection(); // The database file is in the application storage directory var folder:File File.applicationStorageDirectory; var dbFile:File folder resolverPath("DBSample.db"); // open the database conn.open(dbFile, OpenMode.UPDATE); // start a transaction conn.begin(); // add the customer record to the database var insertCustomer:SQLStatement new SQLStatement(); insertCustomer.sqlConnection conn; insertCustomer.text = "INSERT INTO customers (firstname,lastname)" + "VALUES ('Bob','Jones')"; insertCustomer.execute(); var customerId:Number insertCustomer.RESULT().lastInsertRowID; // add a related phone number record for the customer var insertPhoneNumber:SQLStatement new SQLStatement(); insertPhoneNumber.sqlConnection conn; insertPhoneNumber.text = "INSERT INTO customerPhoneNumbers (customerId,number)" ^+ "VALUES (:customerId,'800-555-1234')"; insertPhoneNumber.params["customerId"] = customerId; insertPhoneNumber.execute(); // commit the transaction conn.commit(); Comme vous pouvez le constater, vous appelez les mêmes méthodes pour effectuer les opérations de base de données, que vous utilisiez le mode synchrone ou asynchrone. Les principales différences entre les deux approches sont l'exécution d'une opération dépendant d'une autre opération et la gestion des erreurs.

Exécution d'une opération dépendant d'une autre opération

Adobe AIR 1.0 et les versions ultérieures

Lorsque vous étés en mode synchrone, il n'est pas nécessaire d'écrire du code qui écoute un événement pour déterminer la fin d'une opération. Vous pouvez supposer que, lorsque l'opération d'une ligne de code se termine avec succès, l'exécution passée à la ligne de code suivante. Par conséquent, pour effectuer une opération dépendant du succès d'une autre, écrire simplement le code dépendant immidiatement après l'opération dont il dépend. Par exemple, pour coder une application de sorte qu'elle commence une transaction, executée une instruction INSERT, récapère la clé primaire de la ligne insérée, insère cette clé primaire dans une autre ligne d'une autre table et finisse par valider la transaction, l'ensemble du code peut être écrit sous la forme d'une série d'instructions. L'exemple suivant illustré ces opérations : var conn:SQLConnection = new SQLConnection(); // The database file is in the application storage directory var folder:File File.applicationStorageDirectory; var dbFile:File folder resolverPath("DBSample.db"); // open the database conn.open(dbFile, SQLMode.UPDATE); // start a transaction conn.begin(); // add the customer record to the database var insertCustomer:SQLStatement new SQLStatement(); insertCustomer.sqlConnection conn; insertCustomer.text = "INSERT INTO customers (firstname,lastname)" + "VALUES ('Bob','Jones')"; insertCustomer.execute(); var customerId:Number insertCustomer.RESULT().lastInsertRowID; // add a related phone number record for the customer var insertPhoneNumber:SQLStatement new SQLStatement(); insertPhoneNumber.sqlConnection conn; insertPhoneNumber.text = "INSERT INTO customerPhoneNumbers (customerId,number)" ^+ "VALUES (:customerId,'800-555-1234')"; insertPhoneNumber.params[":customerId"] = customerId; insertPhoneNumber.execute(); // commit the transaction conn.commit();

Gestion des erreurs en mode synchrone

Adobe AIR 1.0 et les versions ultérieures

En mode synchrone, vous n'ecoutez pas un événement d'erreur pour déterminer si une opération a échoué. A l'inverse, vous renfermez le code susceptible de déclencher des erreurs dans un jeu de blocs try...catch..finally. Vous enveloppez le code rejoit l'erreur dans le bloc try. Vous écrivez les actions à effectuer en réponse à chaque type d'erreur dans des blocs catch distincts. Vous placez le code qui doit toujours s'exécuter, sans tener compte de la réussite ou de l'éché (par exemple, la fermeture d'une connexion à la base de données devenue inutile) dans un bloc finally. L'exemple suivant démontré l'utilisation des blocs try...catch..finally pour la gestion des erreurs. Il développement l'exemple précédent en ajoutant du code de gestion d'erreur: var conn:SQLConnection = new SQLConnection(); // The database file is in the application storage directory var folder:File File.applicationStorageDirectory; var dbFile:File folder resolverPath("DBSample.db"); // open the database conn.open(dbFile,SQLMode.UPDATE); // start a transaction conn.begin(); try { // add the customer record to the database var insertCustomer:SQLStatement new SQLStatement(); insertCustomer.sqlConnection conn; insertCustomer.text = "INSERT INTO customers (firstname,lastname)" + "VALUES ('Bob','Jones')"; insertCustomer.execute(); var customerId:Number insertCustomerResultSet().lastInsertRowID; // add a related phone number record for the customer var insertPhoneNumber:SQLStatement new SQLStatement(); insertPhoneNumber.sqlConnection conn; insertPhoneNumber.text = "INSERT INTO customerPhoneNumbers (customerId,number)" ^+ "VALUES(:customerId,'800-555-1234')"; insertPhoneNumber.params["customerId"] = customerId; insertPhoneNumber.execute(); // if we've gotten to this point without errors, commit the transaction conn.commit(); } catch (error:SQLError) { // rollback the transaction conn.rollback();

Présentation du modele d'exécution asynchrone

Adobe AIR 1.0 et les versions ultériques

Les développpeurs partent souvent du principe qu'en mode asynchrone, il est impossible de lancer l'exécution d'une occurrence de SQLStatement lorsqu'une autre occurrence de SQLStatement est déjà en cours d'exécution sur la même connexion de base de données. En fait, cette hypothèse est faisse. Lorsqu'une occurrence de SQLStatement s'exécuté, vous ne pouvez pas modifier la propriété text de l'instruction. Toutefois, si vous utilisez une occurence de SQLStatement distincte pour chaque instruction SQL à exécuter, vous pouvez appeler la méthode execute () d'une occurrence de SQLStatement pendant l'exécution d'une autre sans provoquer d'erreur. Lorsque vous exécutez en interne des opérations de base de données en mode asynchrone, chaque connexion de base de données (chaque occurrence de SQLConnection) possède sa propre file d'attente ou liste d'opérations à exécuter. Le moteur d'exécution effectue chaque opération l'une après l'autre, selon leur ordre d'apparition dans la file d'attente. Lorsque vous créEZ une occurrence de SQLStatement et appelez sa méthode execute(), cette opération d'exécution d'instruction est ajoutée à la file d'attente de la connexion. Si aucune opération n'est en cours d'exécution sur cette occurrence de SQLConnection, l'exécution de l'instruction commence en arrêté-plan. Supposons maintainant, que dans le même bloc de code, vous créiez une autre occurrence de SQLStatement et appeliez sa méthode execute(). Cette seconde opération d'exécution d'instruction est ajoutée à la file d'attente derrière la première instruction. Dès que l'exécution de la première instruction est terminée, le moteur d'exécution passa à la prochaine opération de la file d'attente. Le traitement des opérations successives de la file d'attente s'effectue en arrêté-plan, même lorsque l'évenement résultat de la première opération est déclenché dans le code de l'application principale. Le code suivant illustré cette technique :
// Using asynchronous execution mode  
var stmt1:SQLStatement = new SQLStatement();  
stmt1.getConnection = conn; 
// ... Set statement text and parameters, and register event listeners ...
stmt1.execute(); 
// At this point stmt1's execute() operation is added to conn's execution queue.  
var stmt2:SQLStatement = new SQLStatement();  
stmt2.sqlConnection = conn; 
// ... Set statement text and parameters, and register event listeners ...
stmt2.execute(); 
// At this point stmt2's execute() operation is added to conn's execution queue. // When stmt1 finishes executing, stmt2 will immediately begin executing // in the background. 
L'exécution automatique des instructions successives en attente a un effet secondaire important pour la base de données. Lorsqu'une instruction dépend du résultat d'une autre opération, vous ne pouvez pas l'ajouter en file d'attente (en d'autres termes, vous ne pouze pas appeler sa méthode execute()) avant que la première opération ne soit terminée. La raison en est qu'aupres avoir appelé la méthode execute() de la seconde instruction, vous ne pouze plus modifier les propriétés text et parameters de l'instruction. Dans ce cas, vous nevez attendre l'évenement indiquant que la première opération est terminée avant de commencer la suivante. Par exemple, si vous souhaitez exécuter une instruction dans le contexte d'une transaction, l'exécution de cette instruction dépend de l'opération d'ouverture de la transaction. ÀpRES l'appeL à la méthode SQLConnection.begin() pour ouvrir la transaction, vous nevez attendre que l'occurrence de SQLConnection déclenché son événement begin. A ce stade seulement vous pouze appeler la méthode execute() de l'occurrence de SQLStatement. Dans cet exemple, le moyen le plus simple d'organiser l'application pour s'assurer que les opérations s'exécutent correctement consiste à créé une méthode enregistrée en tant qu'écouteur de l'évenement begin. Le code qui appelle la méthode SQLStatement.execute() est placé dans cette méthode d'écouteur.

Utilisation du chiffrement avec les bases de données SQL

Adobe AIR 1.5 et les versions ultérieures Toutes les applications Adobe AIR partagent le même moteur de base de données locale. Par conséquent, toute application AIR peut se connecter, dire et écrire dans un fisier d'une base de données non chiffree. Depuis Adobe AIR 1.5, AIR a la capacité de creer et de se connecter à des fisiers d'une base de données chiffree. Lorsque vous utilisez une base de données chiffree, l'application doit fournir la clé de chiffrement appropriée pour se connecter à cette base de données. Si la clé de chiffrement fournie n'est pas correcte (ou s'il n'y a pas de clé), l'application ne peut pas connecter à la base de données. Elle ne peut donc pas dire les données de la base de données ni y écrire ou modifier des données. Pour utiliser une base de données chiffrée, vous doivent laisser en tant que base de données chiffrée. Avec une base de données chiffrée existante, vous pouvez ouvrir une connexion à la base de données. Vous pouze également modifier la clé de chiffrement d'une base de données chiffrée. Mises à part la création et la connexion aux bases de données chiffrées, les techniques de travail sont les mêmes que pour une base de données non chiffrée. En particulier, l'exécution des instructions SQL est identique, que la base de données soit chiffrée ou non.

Utilisation d'une base de données chiffrée

Adobe AIR 1.5 et les versions ultérieures Le chiffrement se révèle très utileès que vous souhaitez limiter l'accès aux informations stockées dans une base de données. Dans Adobe AIR, la fonction de chiffrement de base de données peut être utilisé dans plusieurs objectifs. Voici quelques exemple pour lesquels l'utilisation d'une base de données chiffrée peut être utile : - Cache en lecture seule de données d'application privées et téléchargeées depuis un serveur Stockage d'application local de données privées synchronisées avec un serveur (données envoyées et charges depuis le serveur) - Fichiers chiffrés utilisés en tant que format de fichier pour les documents créés et modifiés par l'application Les fichiers peuvent être réservés à un utiliser, donc privés, ou conçus pour être partages par tous les utilisateurs de l'application. - Toute autre utilisation d'un magasin local de données, par exemple les utilisations décrites à la section « Cas d'utilisation des bases de données SQL locales » à la page 741, où les données peuvent être réservées aux personnes disposant d'un accès à l'ordinateur ou aux fichiers de la base de données. Comprétre la raison pour laquelle vous souhaitez utiliser une base de données chiffrée vous permet de désirier l'architecture de votre application. Le chiffrement risque en particulier d'affector la manière dont l'application créé, obtient et stocke la clé de chiffrement de la base de données. Pour plus d'informations sur ces considérations, voir « Considérations relatives à l'utilisation du chiffrement avec une base de données » à la page 791. Parallelement à l'utilisation d'une base de données chiffree, le magasin local chiffre permet également de préserver la confidentialité des données sensibles. Grace au magasin local chiffre, vous stockez une valeur ByteArray unique avec une clé String. Seule l'application AIR qui stocke la valeur peut y acceder, et ceci uniquement sur l'ordinateur sur lequel elle est stockée. Avec le magasin local chiffre, il n'est pas nécessaire de creatorer votre propre clé de chiffrement. Pour ces raisons, le magasin local chiffre convient davantage au stockage aisé d'une seule valeur ou d'un ensemble de valeurs facilement encodé dans un object ByteArray. Une base de données chiffree convient mieux aux grands ensembles de données où l'interrogation et le stockage de données structurées sont souhaitables. Pour plus d'informations sur l'utilisation du magasin local chiffre, voir « Stockage local chiffre » à la page 737.

Creation d'une base de données chiffrée

Adobe AIR 1.5 et les versions ultéieures

Pour utiliser une base de données chiffrée, son fjichier doit être chiffré lors de sa création. Lorsqu'une base de données a été créé sans chiffrement, elle ne peut plus être chiffrée par la suite. De la même façon, une base de données chiffrée ne peut pas开发商 non chiffrée. Si nécessaire, vous pouvez modifier la clé de chiffrement d'une base de données chiffrée. Pour plus d'informations, voir la section « Modification de la clé de chiffrement d'une base de données » à la page 790. Si votre base de données n'est pas chiffrée et que vous souhaitez utiliser le chiffrement de bases de données, vous pouvez creator une nouvelle base de données chiffrée, puis y copier la structure et les données des tables existantes. La création d'une base de données chiffree est très similaire à la création d'une base de données non chiffree, désrite à la section « Création d'une base de données » à la page 746. Vous commencerz par creator une occurrence de SQLConnection représentant la connexion à la base de données. Vous créez la base de données en appelant la méthode open() ou openAsync() de l'objet SQLConnection, en spécifient un fjichier qui n'existe pas encore pour l'emplacement de la base de données. La seule différence lors de la création d'une base de données chiffree est que vous fournissez une valeur au parametre encryptionKey (cinquième paramètre de la méthode open() et sixieme paramètre de la méthode openAsync(). Un objet ByteArray contenant exactement 16 octets constitue une valeur valide du parametre encryptionKey. Les exemples suivants illustrrent la création d'une base de données chiffrée. Pour plus de simplicité, la clé de chiffrement est codée en dur dans le code de l'application dans ces exemples. Toutefois, cette technique est fortement déconseillée car elle n'est pas sécurisée. var conn:SQLConnection = new SQLConnection();
var encryptionKey:ByteArray = newByteArray();  
encryptionKey.writeUTFBytes("Some16ByteString"); // This technique is not secure! 
// Create an encrypted database in asynchronous mode
conn.openAsync(dbFile, SQLMode.CREATE, null, false, 1024, encryptionKey); 
// Create an encrypted database in synchronous mode conn.open(dbFile, SQLMode.CREATE, false, 1024, encryptionKey); 
Vous trouvez un exemple décrivant un moyen conseilé de générer une clé de chiffrement à la section « Exemple : Génération et utilisation d'une clé de chiffrement » à la page 792.

Connexion à une base de données chiffrée

Adobe AIR 1.5 et les versions ultérieures

Comme la création d'une base de données chiffree, la procEDURE qui permet d'ouvrir une connexion à une base de données chiffree est la même que pour une base de données non chiffree. Cette procEDURE est détaillée à la section « Connexion à une base de données » à la page 754. Vous faites appel à la méthode open() pour ouvrir une connexion en mode d'exécution synchrone, à la méthode openAsync() pour ouvrir une connexion en mode d'exécution asynchronous. La seule différence est que, pour ouvrir une base de données chiffree, vous spécifie la valeur correcte du paramètre encryptionKey (cinquième paramètre de la méthode open() et sixiéme paramètre de la méthode openAsync(). Si la clé de chiffrement fournie n'est pas correcte, une erreur se produit. Dans le cas de la méthode open(), une exception SQLError est renvoyée. Dans le cas de la méthode openAsync(), l'objet SQLConnection distribue un événement SQLErrorEvent, dont la propriété errorcontient un objet SQLError. Dans les deux cas, l'objet SQLError généra par l'excection a une valeur de propriété errorID 3138. Cet ID d'erreur correspond au message d'erreur « Le fjichier ouvert n'est pas un fjichier de base de données » L'exemple suivant décrit l'ouverture d'une base de données chiffree en mode d'execution asynchrone. Pour plus de simplicité, dans cet exemple, la clé de chiffrement est codée en dur dans le code de l'application. Toutefois, cette technique est fortement déconseillée car elle n'est pas sécurisée. import flash.data.SQLConnection; import flash.data.SQLMode; import flash.events.SQLErrorEvent; import flash.events.SQLEvent; import flash.filesystem.File; var conn:SQLConnection = new SQLConnection(); conn.addEventListener(SQLEvent. OPEN, openerHandler); conn.addEventListener (SQLErrorEvent. ERROR,errorHandler); var dbFile:File File.applicationStorageDirectoryresolvePath("DBSample.db"); var encryptionKey:ByteArray newByteArray(); encryptionKey.writeUTFBytes("Some16ByteString"); // This technique is not secure! conn.openAsync(dbFile,SQLMode.UPDATE,null,false,1024,encryptionKey); function openHandler(event:SQLEvent):void { trace("the database opened successfully"); } function errorHandler(event:SQLErrrorEvent):void { if (event(error_errorID = = 3138 { trace("Incorrect encryption key"); } else { trace("Error message:",event-errormessage); trace("Details:",event-error.Details); } L'exemple suivant décrit l'ouverture d'une base de données chiffree en mode d'execution synchrone. Pour plus de simplicité, dans cet exemple, la clé de chiffrement est codée en dur dans le code de l'application. Toutefois, cette technique est fortement déconseillée car elle n'est pas sécurisée. import flash.data.SQLConnection; import flash.data.SQLMode; import flash.filesystem.File; var conn:SQLConnection = new SQLConnection(); var dbFile:File File.applicationStorageDirectoryresolvePath("DBSample.db"); var encryptionKey:ByteArray newByteArray(); encryptionKey.writeUTFBytes("Some16ByteString"); // This technique is not secure! try { conn.open(dbFile,SQLMode.UPDATE,false,1024,encryptionKey); trace("the database was created successfully"); } catch (error:SQLError) { if (error(errorID = = 3138 ) { trace("Incorrect encryption key"); } else { trace("Error message:",error(message); trace("Details:",error.Details); } Vous trouvrez un exemple décrivant un moyen conseilé de générer une clé de chiffrement à la section « Exemple : Génération et utilisation d'une clé de chiffrement » à la page 792.

Modification de la clé de chiffrement d'une base de données

Adobe AIR 1.5 et les versions ultérieures

Vous pouvez modifier ultérieurement la clé de chiffrement d'une base de données chiffrée. Pour modifier la clé de chiffrement d'une base de données, commencez par ouvrir une connexion à la base de données en créé une occurrence de SQLConnection, puis appelez sa méthode open() ou openAsync(). Lorsque la connexion à la base de données est établie, appelez la méthode reencrypt() en transmettant la nouvelle clé de chiffrement en tant qu'argument. Comme la plupart des opérations de base de données, le comportement de la méthode reencrypt () varie selon si la connexion à la base de données utilise le mode d'exécution synchrone ou asynchrone. Si vous utilisez la méthode open () pour vous connecter à la base de données, l'opération reencrypt () s'exécuté de façon synchrone. Lorsque l'opération est terminée, l'exécution se poursuit avec la ligne suivante du code :
var newVal:ByteArray = newByteArray(); // ... generate the new key and store it in newValconn.reencrypt(newKey); 
À l'inverse, si la connexion à la base de données est établie avec la méthode openAsync(), l'opération reencrypt() est asynchrone. L'objet SQLConnection distribue un événement reencrypt. Vous utilisez un écouteur d'évenement pour connaître le moment où le rechnffrement se termine:
var newKey:ByteArray = newByteArray(); // ... generate the new key and store it in newVal conn.addEventListener(SQLEvent.REENCRYPT, reencryptHandler); conn.reencrypt(newKey); function reencryptHandler(event:SQLEvent):void { // save the fact that the key changed } 
L'opération reencrypt () s'exécute dans sa propre transaction. Si l'opération est interrompue ou échoue (par exemple, si l'application est fermée avant la fin de l'opération), la transaction est annulée. Dans ce cas, la clé de chiffrement d'origine demeure en vigueur pour la base de données. La méthode reencrypt() ne peut pas être utilisée pour supprimer le chiffrage d'une base de données. La transmission d'une valeur null ou d'une clé de chiffrement qui ne correspond pas à un object ByteArray de 16 octets à la méthode reencrypt() provoque une erreur.

Considérations relatives à l'utilisation du chiffrement avec une base de données

Adobe AIR 1.5 et les versions ultérieures La section « Utilisation d'une base de données chiffree » à la page 787 présente plusieurs cas de figure pour lesquels l'utilisation d'une base de données chiffree peut être nécessaire. À l'évidence, les besoin de confidentialité différent selon les différents cas d'utilisation des applications (les scénarios presentés, ainsi que d'autres). L'architecture du chiffrement dans votre application joue un role important sur le contrôle de la confidentialité des données d'une base de données. Par exemple, si vous utilisez une base de données chiffree pour assurer la confidentialité des données personnelles, même vis-à-vis des autres utilisateurs de l'ordinateur, la base de données de chaque utiliser a besoin de sa propre clé de chiffrement. Pour une sécurité optimale, votre application peut générer la clé à partir d'un mot de passer saisi par l'utiliseur. Baser la clé de chiffrement sur un mot de passer peutpermé d'être certain que les données demeurent inaccessibles, même si une autre personne utilise le compte de l'utiliseur sur l'ordinateur. À l'extrème opposé, supposons à présent que vous souhaitiez qu'un fichier de bases de données soit lisible par tout utiliser de votre application, mais pas par les utilisateurs d'autres applications. Dans ce cas, chaque copie installée de l'application doit pouvoir acceder à une clé de chiffrement partagée. Vous pouvez conceiveir votre application, et en particulier la technique utilisée pour générer la clé de chiffrement, en fonction du niveau de confidentialité désiré pour les données de l'application. Voici une liste de quelques suggestions de conception répondant à divers niveaux de confidentialité des données : - Pour qu'une base de données soit accessible à tout utiliser autorisé à acceder à l'application sur n'importe quel ordinateur, utilisez une seule clé disponible pour toutes les occurrences de l'application. Par exemple, lors de sa première écution, l'application peut télécharger la clé de chiffrement partagée sur un serveur en utilisant un protocole sécurisé de type SSL. Elle peut ensuite enregistrer la clé dans le magasin local chiffré pour l'utiliser ultérieurement. Une autre alternative consiste à chiffrer les données par utiliser sur l'ordinateur, puis de synchroniser ces données à l'aide d'un magasin de données distant, tel qu'un serveur, pour rendre les données portables. Pour qu'un seul utilisateur puisse acceder à la base de données sur n'importe quel ordinateur, générez la clé de chiffrement en utilisant un secret propre à l'utilisateur (par exemple un mot de passer). En particulier, n'utilise pas de valeur associée à un ordinateur particulier (par exemple une valeur stockée dans le magasin local chiffré) pour générer la clé. Une autre alternative consiste à chiffrer les données par utilisateur sur l'ordinateur, puis de synchroniser ces données à l'aide d'un magasin de données distant, tel qu'un serveur, pour rendre les données portables. - Pour qu'un seul utilisateur puisse acceder à la base de données sur un seul ordinateur, générez la clé à partir d'un mot de passage et d'une valeur généraee arbitrairement, appelée salt. Un exemple de cette technique est disponible à la section « Exemple : Génération et utilisation d'une clé de chiffrement » à la page 792. Voici d'autres considérations relatives à la sécurité qu'il est important de ne pas oublier lors de la conception d'une application utilisant une base de données chiffree : - Un système est autant sécurisé que ce que peut l'être son lien le plus faible. Si vous utilisez un mot de passer saisi par l'utilisateur pour générer une clé de chiffrement, pensez à imposer une longueur minimale et des contraintes de complexité pour les mots de passer. Un mot de passer court qui utilise seulement des caractères de base est facile à deviner. - Le code source d'une application AIR est stocké sur l'ordinateur de l'utilisateur en texte brut (dans le cas de contenu HTML) ou dans un format binaire facile à décompiler (dans le cas de contenu SWF). Le code source étant accessible, les deux éléments à ne pas oublier sont : - Ne jamais coder en dur la clé de chiffrement dans votre code source - Toujours partir du principe qu'un attaquant peut aisément découvert la technique utilisée pour générer une clé de chiffrement (par exemple un générateur de caractères aléatoire ou un algorithme de hachage particulier) - Le chiffrement de base de données d'AIR utilise le chiffrement AES (Advanced Encryption Standard) avec le mode CBC-MAC (CCM). Pour être sécurisé, ce chiffrement combiné la clé saisie par l'utilisateur avec une valeur salt. Un exemple de cette technique est disponible à la section « Exemple : Génération et utilisation d'une clé de chiffrement » à la page 792. - Lorsque vous choisissez de chiffrer une base de données, tous les fischiers disque utilisés par le moteur de base de données en combinaison avec celle-ci sont chiffrés. Toutefois, le moteur de base de données stocke certaines données temporaires en mémoire cache pour améliorer les performances en lecture et écriture au cours des transactions. Toutes les données qui seront en mémoire ne sont pas chiffrées. Si un attaquant peut acceder à la mémoire utilisé par l'application AIR, par exemple avec un débogueur, les données de la base de données ouverte et non chiffrée sont disponibles.

Exemple : Génération et utilisation d'une clé de chiffrement

Adobe AIR 1.5 et les versions ultérièures

Cet exemple d'application présente une technique de génération de clé de chiffrement. Cette application est conscience pour assurer le plus haut niveau de confidentialité et de sécurité aux données des utilisateurs. Un point essentiel de la sécurisation des données privées consiste à obliger l'utilisateur à saisir un mot de passer à chaque connexion de l'application à la base de données. Par conséquent, comme nous l'avons vu dans cet exemple, une application exigeant ce niveau de confidentialité ne doit jamais stocker directement la clé de chiffrement de la base de données. L'application comprend deux parties : une classe ActionScript qui génére une clé de chiffrement (la classe EncryptionKeyGenerator) et une interface utiliser de base qui déscrit l'utilisation de cette classe. Pour obtenir le code source complet, voir la section « Exemple de code complet pour la génération et l'utilisation d'une clé de chiffrement » à la page 795.

Utilisation de la classe EncryptionKeyGenerator pour obtenir une clé de chiffrement sécurisée

Adobe AIR 1.5 et les versions ultérieures Il n'est pas nécessaire de maîtriser les détails du fonctionnement de la classe EncryptionKeyGenerator pour l'utiliser dans votre application. Si vous souhaitez savoir comment la classe générale une clé de chiffrement pour une base de données, voir « Fonctionnement de la classe EncryptionKeyGenerator » à la page 799. Pour utiliser la classe EncryptionKeyGenerator dans votre application, procédez comme suit : 1 Téléchargez la classe EncryptionKeyGenerator en tant que code source ou SWC compiling. La classe EncryptionKeyGenerator est incluse dans le projet de bibliothèque centrale Open Source ActionScript 3.0 (as3corelib). Vous pouvez télécharger le package as3corelib complenant le code source et la documentation. Vous pouvez également télécharger des fichiers du code source ou SWC depuis la page du projet. 2 Placez le code source de la classe EncryptionKeyGenerator (ou le fichier SWC as3corelib) dans un emplacement accessible au code source de votre application. 3 Dans le code source de votre application, ajoutez une instruction import pour la classe EncryptionKeyGenerator. import com.adobe.air.crypto.EncryptionKeyGenerator; 4 Avant l'endetroit où le code cree la base de données ou ouvre une connexion vers celle-ci, ajoutez le code qui create une occurrence EncryptionKeyGenerator en appelant le constructeur EncryptionKeyGenerator(). var keyGenerator:EncryptionKeyGenerator = new EncryptionKeyGenerator(); 5 Demandez le mot de passer à l'utilisateur : var password:String = passwordInput.text; if(!keyGeneratorvalidateStrongPassword_password){ // display an error message return; } L'occurrence de EncryptionKeyGenerator utilise ce mot de passer comme base de la clé de chiffrement (décrite à l'étape suivante). L'occurrence de EncryptionKeyGenerator teste le mot de passer par rapport aux exigences de validation de mot de passer renforcé. Si la validation échoue, une erreur survient. comme le montre l'exemple de code, vous pouvez vérifier le mot de passer en amont en appelant la méthode validateStrongPassword() de l'objet EncryptionKeyGenerator. Cette opération vous permet de déterminer si le mot de passer répond aux exigences minimales d'un mot de passer renforcé et d'éviter une erreur. 6 Générez la clé de chiffrement à partir du mot de passer :
var encryptionKey:ByteArray = keyGenerator.getEncryptionKey(key); 
La méthode getEncryptionKey() génére et renvoie la clé de chiffrement (objetByteArray à 16 octets). Vous pouvez alors utiliser la clé de chiffrement pour creer votre nouvelle base des données chiffree ou ouvrir une base de données existante. La méthode getEncryptionKey() a un paramètre obligatoire, le mot de passer obtenu à l' étape 5. Remarque : pour assurer le plus haut niveau de sécurité et de confidentialité des données, l'application doit obliger l'utilisateur à saisir un mot de passer à chaque connexion de l'application à la base de données. Ne stockez pas directement le mot de passer de l'utilisateur ni la clé de chiffrement de la base de données. Cela entraînerait des risques de sécurité. Au contraire, comme le montre cet exemple, l'application doit utiliser la même technique pour faire dérivier la clé de chiffrement du mot de passer lors de la création de la base des données chiffrée et lors des connexions ultérieures à celle-ci. La méthode getEncryptionKey() accepts également un second paramètre (facultatif) overrideSaltELSKey. L'occurrence de EncryptionKeyGenerator create une valeur aléatoire (applée valeur salt) qui fait partie de la clé de chiffrement. Pour pouvoir recréer la clé de chiffrement, la valeur salt est stockée dans le magasin local chiffré (ELS) de votre application AIR. Par défaut, la classe EncryptionKeyGenerator utilise une chaine particulière en tant que clé ELS. Bien que cela soit improbable, il est possible que cette clé soit en conflit avec une autre clé utilisée par votre application. Au lieu d'utiliser la clé par défaut, vous pouvez spécifique leur propre clé ELS. Dans ce cas, spécifie une clé personnalisée en la transmettant en tant que second paramètre getEncryptionKey(), comme illustré ici:
var customKey:String = "My custom ELS salt key";  
var encryptionKey:ByteArray = keyGenerator.getEncryptionKey(key, customKey); 
7 Création ou ouverture de la base de données Avec la clé de chiffrement renvoyée par la méthode getEncryptionKey(), votre code peut creator une nouvelle base de données chiffree ou tenter d'ourir la base de données chiffree existante. Dans les deux cas, vous utilisez la méthode open() ou openAsync() de la classe SQLConnection, tel que déscrit dans les sections « Création d'une base de données chiffree » à la page 788 et « Connexion à une base de données chiffree » à la page 788. Dans cet exemple, l'application est conçue pour ouvrir la base de données en mode d'exécution asynchrone. Le code configure les écouteurs d'évenement appropriés et appelle la méthode openAsync(), en transmettant la clé de chiffrement en tant qu'argument final:
conn.addEventListener(SQLEvent Opens, openHandler); conn.addEventListener (SQLErrrorEvent.EROR, openError); 
conn.openAsync(dbFile, SQLMode.CREATE, null, false, 1024, encryptionKey); 
Dans les méthodes des écouteurs, le code supprime les enregistrements des écouteurs d'évenement. Il affiche ensuite un message d'etat indiquant si la base de données a été créé, ouverte, ou si une erreur s'est produit. La partie la plus importante de ces gestionnaires d'évenement se trouve dans la méthode openError(). Dans cette méthode, une instruction if vérifie l'existence de la base de données (c'est-à-dire que le code tente de se connecter à une base de données existante) et si l'ID d'érreur correspond à la constante EncryptionKeyGenerator. ENCRYPTED_DB_PASSWORD_ERROR_ID. Si ces deux conditions sont vraies, il est probable que le mot de passer saisi par l'utilisateur soit incorrect. (Cela peut également signifier que le fichier spécifique n'est pas un fichier de base de données.) Voici le code qui vérifie l'ID d'erreur :
if (!createNewDB && event(error_errorID == EncryptionKeyGenerator.ENCrypted_DB_PASSWORD_ERROR_ID) { statusMsg.text = "Incorrect password!"; } else { statusMsg.text = "Error creating or opening database."; } 
Voutrouvez le code complét des exemplés d'écouteurs d'évenement à la section « Exemple de code complét pour la génération et l'utilisation d'une clé de chiffrement » à la page 795.

Exemple de code complet pour la génération et l'utilisation d'une clé de chiffrement

Adobe AIR 1.5 et les versions ultérièures

Voici le code complet d'un exemple d'application « Génération et utilisation d'une clé de chiffrement »: Le code comprend deux parties. L'exemple utilise la classe EncryptionKeyGenerator pour creer une clé de chiffrement à partir d'un mot de passer. La classe EncryptionKeyGenerator est incluse dans le projet de bibliothèque centrale Open Source ActionScript 3.0 (as3corelib). Vous pouvez télécharger le package as3corelib complenant le code source et la documentation. Vous pouvez également télécharger des fichiers du code source ou SWC depuis la page du projet.

Example Flex

Le fichier MXML de l'application contient le code source d'une application simple qui creé ou ouvre une connexion à une base de données chiffree :
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical"
creationComplete="init();">
    <mx:Script>
        <!-- CDATA>
            import com.adobe.air.crypto.EncryptionKeyGenerator;
            private const dbFileName:String = "encryptedDatabase.db";
            private var dbFile:File;
            private var createNewDB:Boolean = true;
            private var conn:SQLConnection;
            // ---- Event handling ---->
        }
    private function init():void
        {
            conn = new SqlConnection();
            dbFile = File.applicationDirectory resolverPath(dbFileName);
            if (dbFile.exists)
            {
                createNewDB = false;
                instructions.text = "Enter your database password to open the encrypted
database."; 
                openButton.label = "Open Database";
            }
        }
    }
    private function openConnection():void
        {
            var password:String = passwordInput.text;
            var keyGenerator:EncryptionKeyGenerator = new EncryptionKeyGenerator();
            if (password == null || password.length <= 0)
            {
                statusMsg.text = "Please specify a password;";
                return;
            }
        }
    </mx:Script>
?> 
if (!keyGenerator.validateStrongPasswordpassword) { statusMsg.text = "The password must be 8-32 characters long. It must contain at least one lowercase letter, at least one uppercase letter, and at least one number or symbol."; return; } passwordInput.text = ""; passwordInput.enabled = false; openButton.enabled = false; var encryptionKey:ByteArray = keyGenerator.getEncryptionKey_password); conn.addEventListener(SQLEvent Opens, openerHandler); conn.addEventListener(SQLErrrorEvent_EROR, openError); conn.openAsync(dbFile, SQLMode.CREATcE, null, false, 1024, encryptionKey); } private function openHandler(event:SQLEvent):void { conn.removeEventListener(SQLEvent_OPEN, openerHandler); conn.removeEventListener(SQLErrrorEvent_EROR, openError); statusMsg.setStyle("color", 0x009900); if (createNewDB) { statusMsg.text = "The encrypted database was created successfully."; } else { statusMsg.text = "The encrypted database was opened successfully."; } } private function openError(event:SQLErrrorEvent):void { conn.removeEventListener(SQLEvent_OPEN, openerHandler); conn.removeEventListener(SQLErrrorEvent_EROR, openError); if (!createNewDB && event error errorID == 
EncryptionKeyGenerator.ENCRYPTED_DB_PASSWORD_ERROR_ID) { statusMsg.text = "Incorrect password!"; } else { statusMsg.text = "Error creating or opening database."; } ]></mx:Script> </mx:Text id="instructions" text="Enter a password to create an encrypted database. The next time you open the application, you will need to re-enter the password to open the database again." width="75%" height="65"/> <mx:HBox> <mx:TextInput id="passwordInput" displayAsPassword="true"/> <mx:Button id="openButton" label="Create Database" click="openConnection();"/> </mx:HBox> <mx:Text id="statusMsg" color="#990000" width="75%" /> </mx:WindowedApplication> 

Example Flash Professional

Le fichier FLA de l'application contient le code source d'une application simple qui cree ou ouvre une connexion a une base de données chiffree. Le fichier FLA comprend quatre composants places sur la scene :
Nom d'occurrenceType de composantDescription
instructionsLabelContient les instructions données à l'utilisateur
passwordInputTextInputChamp de saisie dans lequel l'utilisateur tape le mot de passer
openButtonButtonBouton sur lequel l'utilisateur clique après avoir saisi le mot de passer
statusMsgLabelAffiche des messages d'état (réussite ou échec)
Le code de l'application est défini sur une image-clé de l'image 1 du scenario principal. Voici le code de l'application : import com.adobe.air.crypto.EncryptionKeyGenerator; const dbFileName:String = "encryptedDatabase.db"; var dbFile:File; var createNewDB:Boolean true; var conn:SQLConnection; init(); //-----Event handling----- function init():void { passwordInput.displayAsPassword true; openButton.addEventListener(MouseEvent.CLICK,openConnection); statusMsg.setStyle("textFormat",new TextFormat(null, null,0x990000)); conn = new SQLConnection(); dbFile = File.applicationStorageDirectoryresolvePath(dbFileName); if (dbFile EXISTS) { createNewDB false; instructions.text "Enter your database password to open the encrypted database."; openButton.label "Open Database"; } else { instructions.text "Enter a password to create an encrypted database. The next time you open the application, you will need to re-enter the password to open the database again."; openButton.label "Create Database"; } function openConnection(event:MouseEvent):void { var keyGenerator:EncryptionKeyGenerator new EncryptionKeyGenerator(); var password:String passwordInput.text; if (password = = null || password.length <= 0) { statusMsg.text "Please specify a password."; return; } if (!keyGenerator.validateStrongPassword_password) { statusMsg.text "The password must be 8-32 characters long. It must contain at least one lowercase letter, at least one uppercase letter, and at least one number or symbol."; return; } passwordInput.text ""; passwordInput.enabled false; openButton.enabled false; var encryptionKey:ByteArray = keyGenerator.getEncryptionKey(key); conn.addEventListener(SQLEvent Opens, openHandler); conn.addEventListener(SQLErrrorEvent. Error, openError); conn.openAsync(dbFile, SQLMode.CREATcE, null, false, 1024, encryptionKey); } function openHandler(event:SQLEvent):void { conn.removeEventListener(SQLEvent.OPEN, openHandler); conn.removeEventListener(SQLErrorEvent. Error, openError); statusMsg.setStyle("textFormat", new TextFormat(null, null, 0x009900)); if (createNewDB) { statusMsg.text = "The encrypted database was created successfully."; } else { statusMsg.text = "The encrypted database was opened successfully."; } } function openError(event:SQLErrortEvent):void { conn.removeEventListener(SQLEvent.OPEN, openHandler); conn.removeEventListener(SQLErrorEvent. Error, openError); if (!createNewDB && event error errorID = = EncryptionKeyGenerator.ENCRYPTED_DB_PASSWORD_ERROR_ID) { statusMsg.text = "Incorrect password!"; } else { statusMsg.text = "Error creating or opening database."; }

Fonctionnement de la classe EncryptionKeyGenerator

Adobe AIR 1.5 et les versions ultérieures

Il n'est pas nécessaire de comprendre le fonctionnement intrinsèque de la classe EncryptionKeyGenerator pour l'utiliser afin de créé une clé de chiffrement sécurisée pour la base de données de votre application. Le processus d'utilisation de la classe est décrit à la section « Utilisation de la classe EncryptionKeyGenerator pour obtenir une clé de chiffrement sécurisée » à la page 793. Il peut cependant se révêler précieux pour comprendre les techniques utilisées par la classe. Par exemple, vous pourriez pouvoir adapter la classe ou intégrer certaines de ses techniques lorsqu'un niveau différent de confidentialité des données est nécessaire. La classe EncryptionKeyGenerator est incluse dans le projet de bibliothèque centrale Open Source ActionScript 3.0 (as3corelib). Vous pouvez télécharger le package as3corelib comprendant le code source et la documentation. Vous pouvez également afficher le code source dans le site du projet ou le télécharger pour suivre les explications. Lorsque le code cree une occurrence de EncryptionKeyGenerator et appelle sa methode getEncryptionKey(), plusieurs mesures permettent de s'assurer que seul l'utiliser autorise peut acceder aux données. Le processus correspond à la generation d'une clé de chiffrement à partir d'un mot de passée saisi par l'utiliser avant la création de la base de données ou à la recreation de la clé de chiffrement pour ouvrir la base de données.

Obtention et validation d'un mot de passer renforcé

Adobe AIR 1.5 et les versions ultérieures

Lorsque le code appelle la méthode getEncryptionKey(), il transmet un mot de passer sous forme de paramètre. Ce mot de passer est utilisé comme base de la clé de chiffrement. En utilisant des informations que seul l'utilisateur connait, cette technique permet de s'assurer que celui l'utilisateur qui connait le mot de passer peut acceder au contenu de la base de données. Meme s'il accede au compte de l'utilisateur sur l'ordinateur, l'attaquant ne peut pas acceder à la base de données sans connaître le mot de passer. Pour une sécurité maximale, l'application ne stocke jamais le mot de passer. Le code d'une application cree une occurrence d'EncryptionKeyGenerator et appelle la methode getEncryptionKey() correspondante en transmettant un mot de passer saisi par l'utiliser sous forme d'argument (soit la variable password dans cet exemple):
var keyGenerator: EncryptionKeyGenerator = new EncryptionKeyGenerator();  
var encryptionKey:ByteArray = keyGenerator.getEncryptionKey(key); 
La première étape effectuee par la classe EncryptionKeyGenerator lors de l'appl a la methode getEncryptionKey () consiste a vérifier que le mot de passer saisi par l'utilisateur respecte les exigences définies en matière de sécurité. La classe EncryptionKeyGenerator requiert que le mot de passer contienne entre 8 et 32 caractères. Le mot de passer doit combiner des lettres majuscules et minuscules et comprendre au moins un chiffre ou un symbole. L'expression régulière qui vérifie ce modele est définié en tant que constante nommée STRONG_PASSWORD.PatternN :
private static const STRONG_PASSWORD.Pattern: RegExp = /(?=^.{8,32}\) ((?=?\*d) | (?=.*+)) (?![.]) (?=.*[A-Z]) (?=.*[a-z]).*/;
Le code qui vérifie le mot de passer est dans la méthode validateStrongPassword() de la classe EncryptionKeyGenerator. Le code se présente comme suit :
public function validateStrongPasswordpassword:String):Boolean { if (password == null || password.length <= 0) { return false; } return STRONG_PASSWORD[PATTERN.test_password) } 
La méthode getEncryptionKey() appelle en interne la méthode validateStrongPassword() de la classe EncryptionKeyGenerator et renvoie une exception si le mot de passé n'est pas valide. La méthode validateStrongPassword() étant publique, le code de l'application peut vérifier le mot de passé sans appeler la méthode getEncryptionKey() pour éviter la production d'erreur.

Extension du mot de passer à 256 bits

Adobe AIR 1.5 et les versions ultérieures

Dans la suite du processus, le mot de passer doit avoir une longueur de 256 bits. Plutôt que de demander à chaque utilisateur de saisir un mot de passage faisant exactement 256 bits (32 caractères), le code créé un mot de passage plus long en répétant ses caractères. Pour executer la tâche de création d'un mot de passer long, la méthode getEncryptionKey() appelle la méthode concatenatePassword(). var concatenatedPassword:String = concatenatePasswordpassword); Voici le code de la méthode concatenatePassword(): private function concatenatePassword(pwd:String):String { var len:int = pwd.length; var targetLength:int = 32 if(len = targetLength) { return pwd; } var repetitions:int = Math.floor(targetLength/len); var excess:int = targetLength%len; var result:String = "" for(var i:uint = 0 ;i< repetitions;i++) { result + = pwd; } result + = pwd substr(0,excess); return result; Si le mot de passer n'atteint pas 256 bits, le code le concatène pour obtaining une longueur de 256 bits. Si la longueur ne fonctionne pas exactement, la dernière répetition est raccourcie jusqu'à correspondre à 256 bits.

Génération ou récapuration d'une valeur salt de 256 bits

Adobe AIR 1.5 et les versions ultérieures

L'etape suivante consiste à obtaining une valeur salt de 256 bits qui sera ensuite combinée au mot de passer dans une étape ultérieure. Une valeur salt est une valeur aléatoire ajoutée ou combinée à la valeur saisie par l'utilisateur pour composer le mot de passer. L'utilisation d'une valeur salt avec un mot de passage permet de s'assurer que, même si l'utilisateur désits un mot du dictionnaire ou un terme courant comme mot de passage, la combinaison mot de passage-plus-salt utilisée par le système est une valeur aléatoire. Cet aspect aléatoire assure une protection contre les attaques de type dictionnaire, dans lesquelles l'attaquant utilise une liste de mots pour tenter de deviner le mot de passage. De plus, la génération de cette valeur salt et son stockage dans le magasin local chiffré permet de l'associer au compte de l'utilisateur sur l'ordinateur dans lequel le fichier de base de données est situé. Si l'application appelle la méthode getEncryptionKey() pour la première fois, le code cree une valeur salt aléatoire de 256 bits. Sinon, le code recupère la valeur salt dans le magasin local chiffré. La valeur salt est stockée dans une variable nommée salt. Le code déterminé si une valeur salt a déjà été créé en tentant de la récapuére dans le magasin local chiffré :
var salt:ByteArray = EncryptedLocalStore getItem(saltKey);  
if (salt == null)  
{  
    salt = makeSalt();  
    EncryptedLocalStore.setItem(saltKey, salt);  
} 
Si le code cree une nouvelle valeur salt, la methode makeSalt () genere une valeur aléatoire de 256 bits. Comme la valeur est ensuite stockée dans le magasin local chiffre, elle est genereré sous forme d'objet ByteArray. La methode makeSalt () utilise la methode Math.random() pour générer la valeur de façon aléatoire. La methode Math.random() ne peut pas générer 256 bits en une seule opération. À la place, le code utilise une boucle pour appeler Math.random() à huit reprises. Chaque fois, une valeur uint aléatoire comprend entre 0 et 4294967295 (valeur uint maximale) est générée. La valeur uint est utilisée pour plus de commodité car elle comprend exactement 32 bits. L'écriture de huit valeurs uint dans l'objet ByteArray permet de générer une valeur de 256 bits. Voici le code de la methode makeSalt():
private function makeSalt():ByteArray  
{  
    var result:ByteArray = newByteArray;  
    for (var i: uint = 0; i < 8; i++)  
    {  
        result.writeUnsignedInt(Math.round(Math.random() * uint.MAX_VALUE));  
    }  
    return result;  
} 
Lorsque le code enregistre la valeur salt dans le magasin local chiffré ou tente de l'y récapuérier, il a besoin d'une clé String dans laquelle la valeur salt est enregistrée. Sans cette clé, la valeur salt ne peut pas être récapuélée. Dans ce cas, la clé de chiffrement ne peut pas être recrée à chaque nouvelle ouverture de la base de données. Par défaut, la classe EncryptionKeyGenerator utilise une clé prédéfinie du magasin local chiffré qui est définie dans la constante SALT_ELS_KEY. Au lieu d'utiliser la clé par défaut, le code de l'application peut également spécifique la clé de magasin local chiffré à utiliser dans l'appel à la méthode getEncryptionKey(). La clé de magasin local chiffré de la valeur salt par défaut ou spécifiée par l'application est stockée dans une variable nommée saltKey. Cette variable est utilisé dans les appeals de EncryptedLocalStore.setItem() et EncryptedLocalStore getItem(), comme indiqué précédemment.

Combinaison du mot de passer 256 bits et de la valeur salt via l'opérateur XOR Adobe AIR 1.5 et les versions ultérieures

Le code dispose à présent d'un mot de passer de 256 bits et d'une valeur salt de 256 bits. Il utilise ensuite une opération XOR au niveau du bit pour combiner la valeur salt avec le mot de passer concatenated dans une valeur unique. Cette technique cree un mot de passage de 256 bits a partir de tous les caracteteres possibles de la plage complete. Ce prince reste vrai meme si la saisie du veritable mot de passage est plus probabilitment constituee des principaux caracteteres alphanumeriques. Cet aspect encore plus aleatoire a l'avantage de creer le plus vaste ensemble possible de mots de passage sans que I'utiliseur ne doive lui-meme saisir un mot de passage long et complexe. Le résultat de l'opération XOR est stocké dans la variable unhashedKey. La vérable opération XOR au niveau du bit sur les deux valeurs se produit dans la méthode xorBytes(): var unhashedKey:ByteArray = xorBytes(concatenatedPassword, salt); L'opérateur XOR au niveau du bit (\*) prend deux valeurs uint et n'en renvoie qu'une. (Une valeur uint contient 32 bits.) Les valeurs d'entrée transmises en tant qu'arguments à la méthode xorBytes() sont une valeur String (le mot de passer) et une valeur ByteArray (la valeur salt). Par conséquent, le code utilise une boucle pour extraire 32 bits de chaque entrée à combiner à l'aide de l'opérateur XOR. private function xorBytes passwordsString:String,salt:ByteArray):ByteArray { var result:Array = newByteArray(); for(var i uint = 0 . i < 32 .i+=4) { //... } return result; Dans la boucle, les premiers 32 bits (4 octets) sont extraits du paramètre passwordString. Ces bits sont extraits et convertis en valeur uint ( 1) dans un processus à deux parties. D'abord, la méthode charCodeAt() récapère la valeur numérique de chaque caractère. Cette valeur est ensuite décalée jusqu'à la position appropriée dans la valeur uint par l'opérateur de décalage gauche au niveau du bit (< <) , puis la valeur décalée est ajustée à 1 . Par exemple, le premier caractère (i) devient les premiers 8 bits grâce à l'opérateur de décalage gauche au niveau du bit (< <) qui décalce les bits de 24 bits à gauche et affecte cette valeur à 1 . Le second caractère (i + 1) prend la place des seconds 8 bits en décalant sa valeur vers la gauche de 16 bits et en ajoutant le résultat à 1 . Les valeurs des troisisième et quatrième caractères sont ajoutées de la même manière.
//  
// Extract 4 bytes from the password string and convert to a uint  
var o1: uint = passwordString.charCodeAt(i) << 24;  
o1 += passwordString.charCodeAt(i + 1) << 16;  
o1 += passwordString.charCodeAt(i + 2) << 8;  
o1 += passwordString.charCodeAt(i + 3);  
//... 
La variable o1 contient à présent 32 bits provenant du paramètre passwordString. Ensuite, 32 bits sont extraits du paramètre salt via un appel à sa méthode readUnsignedInt(). Les 32 bits sont stockés dans la variable uint o2.
// ...
salt.position = i;
var o2: uint = salt.readUnsignedInt();
// ...
} 
Enfin, les deux valeurs de 32 bits (uint) sont combinées par l'opérateur XOR et le résultat est écrit dans un object ByteArray résultat.
// ...
var xor: uint = o1 ^ o2;
result.writeUnsignedInt(xor);
// ... 
Lorsque la boucle est terminée, l'objet ByteArray contenant le résultatxonOR est renvoye.
//... } return result; 

Hachage de la clé

Adobe AIR 1.5 et les versions ultérieures

Une fois le mot de passer concaténé et la valeur salt combinée, l'étape suivant consiste à sécuriser encore davantage cette valeur en la hachant avec un algorithme SHA-256. Le hachage de la valeur rend encore plus difficile sa rétro-conception par un attaquant. À ce stade, le code possède un objet ByteArray nommé unhashéKey contenant le mot de passer concatené combiné à la valeur salt. Le projet de bibliothèque ActionScript 3.0 (as3corelib) comprend une classe SHA256 dans le package com.adobe.crypto. La méthode SHA256 hashBytes() qui exécute un hachage SHA-256 sur l'objet ByteArray et renvoie une valeur String contenant le résultat du hachage 256 bits sous forme de nombre hexadecimal. La classe EncryptionKeyGenerator utilise la classe SHA256 pour hacher la clé : var hashingKey:String = SHA256加密Bytes(unhashedKey);

Extraction de la clé de chiffrement du hachage

Adobe AIR 1.5 et les versions ultérieures

La clé de chiffrement doit être un object ByteArray faisant exactement 16 octets (128 bits). Le résultat de l'algorithm de hachage SHA-256 fait toujours 256 bits. Par conséquent, l'étape finale consiste à selectionner 128 bits dans le résultat hacho et à les utiliser comme veritable clé de chiffrement. Dans la classe EncryptionKeyGenerator, le code réduit la clé à 128 bits en appelant la méthode generateEncryptionKey(). Il renvoie ensuite le résultat de cette méthode en tant que résultat de la méthode getEncryptionKey(): var encryptionKey:ByteArray = generateEncryptionKey(keyedKey); return encryptionKey; Il n'est pas nécessaire d'utiliser les premiers 128 bits comme clé de chiffrement. Vous pouvez selectionner une plage de bits à partir d'un point arbitraire, selectionner tous les autres bits ou selectionner les bits d'une autre manière. L'important est que le code selectionné 128 bits distincts, et que ces mêmes 128 bits soient utilisés chaque fois. Dans ce cas, la méthode generateEncryptionKey() utilise la plage de bits commençant au 18ème octet en tant que clé de chiffrement. Comme nous l'avons déjà mentionné, la classe SHA256 renvoie une valeur String contenant un hachage 256 bits sous forme de nombre hexadécimal. Un unique bloc de 128 bits comprend trop d'octets pour qu'ils soient ajoutés en une seule fois à un objet ByteArray. Par conséquent, le code utilise une boucle for pour extraire les caractères de la valeur String hexadécimale, les convertit en valeurs numériques réelles et les ajoute à l'objet ByteArray. La valeur String SHA-256 réalisante comprend 64 caractères. Une plage de 128 bits correspond à 32 caractères dans la valeur String et chaque caractère représentée 4 bits. Le plus petit incrément de données que vous pouvez ajouter à un objet ByteArray correspond à un seul octet (8 bits), ce qui équivaut à deux caractères dans la valeur String hash. De ce fait, la boucle compte de 0 à 31 (32 caractères) par incréments de 2 caractères. Dans la boucle, le code commence par déterminer la position de départ de la paire de caractères en cours. comme la plage désirée commence au niveau du caractère situé à l'index 17 (18ème octet), la variable position est affectée à la valeur de l'itérateur actuel (i) plus 17. Le code utilise la méthode substr() de l'objet String pour extraire les deux caractères situés au niveau de la position en cours. Ces caractères sont stockés dans la variable hex. Ensuite, le code utilise la méthode parseInt () pour convertir la valeur String hex en une valeur décimale entière. Il stocke cette valeur dans la variable int byte. Enfin, le code ajoute la valeur de byte à l'objet ByteArray result à l'aide de sa méthode writeByte(). Lorsque la boucle se termine, l'objet ByteArray result contient 16 octets et peut être utilisé comme clé de chiffrement pour la base de données. private function generateEncryptionKeyhash:String):ByteArray { var result:ByteArray = newByteArray(); for(var i uint = 0 .i < 32 .i + = 2 1 { var position:uint = i + 17 var hex:String = hash/Substr(position,2); var byte:int = parseInt(hex,16); result.writeByte(byte); } return result;

Strégties d'utilisation des bases de données SQL

Adobe AIR 1.0 et les versions ultérieures

Une application peut acceder à une base de données SQL locale et l'exploiter de différentes manières. La conception de l'application peut varier en termes d'organisation du code, d'ordre et de synchronisation d'exécution des opérations, etc. Les techniques choisis peuvent affecter la simplicité du développement de votre application, par exemple, la facilité avec laquelle l'application pourrait être modifiée dans les futures mises à jour. Elles peuvent également avoir un impact sur le bon fonctionnement de l'application du point de vue des utilisateurs.

Distribution d'une base de données pré- renseignée

Adobe AIR 1.0 et les versions ultéieures

Lorsque vous utilisez une base de données SQL locale AIR dans votre application, cette derniere attend une base de données représentant une certaine structure de tables, de colonnes, etc. Certaines applications s'attendent egressement a ce que certaines données soient pre-renseignees dans le fjichier de la base de données. Creer la base de données au sein du code de l'application est un moyen de s'assurer que la base de données presente la structure appropriée. Lors du chargement de l'application, celle-ci vérifie la presence de son fjichier de base de données dans un emplacement particulier. Si le fjichier n'existe pas, l'application execute un ensemble de commandes pour le creer, cree la structure de la base de données et renseigne les tables avec les données initiales. Le code qui cree la base de données et ses tables est souvent complexe. Bien souvent, il n'est utilise qu'une fois au debut de la durée de vie d'une application installee, mais augmente tout de meme la taille et la complexite de celle-ci. Au lieu de creer la base de données, sa structure et ses données par programmation, vous pouze distribuer une base de données pre renseignee avec voitre application. Pour distribuer une base de données preredfinie, incluez le fichier de base de données dans le package AIR de l'application. Comme tous les fischiers inclus dans ce package AIR, un fischier de base de données regroupé est installé dans le répertoire de l'application (celui représenté par la propriété File.applicationDirectory). Toutefois, les fischiers de ce répertoire sont en lecture seule. Servez-vous du fischier du package AIR en tant que base de données « modulo ». La première fois que l'utilisateur exécute l'application, copiez le fischier de base de données d'origine dans le « Pointage vers le répertoire de stockage d'une application » à la page 697 de l'utilisateur (ou dans un autre emplacement) et utilisez cette base de données dans l'application.

Recommendations concernant l'utilisation des bases de données SQL locales

Adobe AIR 1.0 et les versions ultérieures Voici une liste de techniques conseillées qui permettront d'améliorer les performances, la sécurité et la simplicité de maintenance des applications lors de l'utilisation de bases de données SQL locales.

Création préalable des connexions à la base de données

Adobe AIR 1.0 et les versions ultérieures Meme si votre application n'excute aucune instruction lors de son premier chargement, instanciez un objet SQLConnection et appelez sa méthode open() ou openAsync() en冲动 (par exemple après le démarrage initial de l'application) pour éviter les délaiss lors de l'exécution des instructions. Voir la section « Connexion à une base de données » à la page 754.

Réutilisation des connexions à la base de données

Adobe AIR 1.0 et les versions ultérieures Si vous accédez à une certaine base de données pendant l'exécution de votre application, gardez une référence à l'occurrence de SQLConnection et réutilisez-la dans toute l'application au lieu de fermer et de rouvrir la connexion. Voir la section « Connexion à une base de données » à la page 754.

Choix préférentiel du mode asynchrone

Adobe AIR 1.0 et les versions ultérieures Lors de l'écriture du code d'accès aux données, il peut être tentant d'exécuter les opérations de façon synchrone只不过 que de façon asynchrone car cela démande souvent un code plus court et moins complexe. Toutefois, comme nous l'avons vu à la section « Utilisation des opérations de base de données synchrones et asynchrones » à la page 782, les opérations synchrones peuvent affecter les performances de façon évidente pour les utilisateurs et nuir à leur exploitation de l'application. Le temps nécessaire à l'exécution d'une seule opération varie d'une opération à l'autre et notamment en fonction de la quantité de données impliquées. Par exemple, une instruction SQL INSERT qui n'ajoute qu'une seule ligne à la base de données prend moins de temps qu'une instruction SELECT qui récapué des milliers de lignes de données. Toutefois, lorsque vous utilisez le mode synchrone pour executer plusieurs opérations, les opérations sont généralement enchainees. même si le temps nécessaire à chaque opération est très court, l'application se bloque jusqu'à ce que toutes les opérations synchrones soient terminées. En résultat, le temps cumulé des différentes opérations peut être suffisant pour bloquer votre application. Utilisez les opérations asynchrones comme approche habituelle, en particulier dans le cas d'opérations impliquant un grand nombre de lignes. Une technique permet de-divider le traitement des vastes yeux de résultats de l'instruction SELECT. Cette technique est décrite à la section « Récupération partielle des résultats d'une instruction SELECT » à la page 770. Cette technique ne peut cependant être utilisé qu'en mode d'execution asynchrone. Utilisez uniquement les opérations synchrones lorsque vous ne pouvez pas Obtir certaines fonctionnalités avec la programmation asynchrone, lorsque vous avez pris en compte les baisses de performances que les utilisateurs de votre application rencontres réntement et après avoir testé votre application de manière à connaître l'impact sur les performances. L'utilisation du mode d'exécution asynchrone peut impliquer un codage plus complexe. Toutefois, n'oubliez pas que le code ne doit être écrit qu'une seule fois alors que les utilisateurs emploient l'application de façon répetée, qu'elle soit rapide ou lente. Dans la plupart des cas, l'utilisation d'une occurrence de SQLStatement distince pour chaque instruction SQL à exécuter permet de mettre plusieurs opérations SQL en file d'attente à la fois, ce qui, en termes d'écriture du code, rend le code asynchrone similaire au code synchrone. Pour plus d'informations, voir la section « Présentation du modele d'exécution asynchrone » à la page 785.

Utilisation d'instructions SQL distince sans modification de la propriete text de I'occurrence de SQLStatement

Adobe AIR 1.0 et les versions ultéieures Pour chaque instruction SQL executée plusieurs fois dans une application, créez une occurrence de SQLStatement distincte. Servez-vous de cette occurrence de SQLStatement chaque fois que cette commande SQL s'exécute. Supposons par exemple que vous développiez une application complément qu quatre opérations SQL différentes exécutées à plusieurs reprises. Dans ce cas, créez quatre occurrences de SQLStatement distinctes et appelez la méthode execute() de chaque instruction pour l'exéuter. Evitez d'utiliser une seule occurrence de SQLStatement pour toutes les instructions SQL, en redéfinissant chaque fois sa propriété text avant d'exéctuer l'instruction.

Utilisation de paramètres d'instruction

Adobe AIR 1.0 et les versions ultérieures Utilisez des paramètres pour SQLStatement. Ne concaténez jamais la saisie de l'utilisateur dans le texte de l'instruction. L'utilisation de paramètres sécurise votre application car elle empêche les attaques par injection de code SQL. Il est alors possible d'utiliser des objets dans les requêtes (au lieu d'utiliser uniquement des valeurs litterales SQL). Cela renforce également l'efficacité de l'exécution des instructions car ces dernières peuvent être réutilisées sans qu'il soit nécessaire de les recompiler chaque fois qu'elle sont exécutées. Voir la section « Utilisation de paramètres dans des instructions » à la page 758.

Chapitre 41 : Utilisation de tableaux d'octets

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures La classe ByteArray vous permet de dire à partir d'un flux de données binaire (qui, pour l'essentialiel, correspond à un tableau d'octets) ou d'écrire dans un tel flux. Elle offre un moyen d'acceder aux données au niveau le plus élémentaire. Etant donné que les données informatiques se compose d'octets ou de groupes de 8 bits, la capacité de dire des données en octets implique qu'il est possible d'acceder à des données pour lesquelles aucune classe et aucune méthode d'accès n'existant. La classe ByteArray vous permit d'analyser tous les flux de données (d'une image bitmap à un flux de données transitant par le réseau) au niveau de l'octet. La méthode writeObject() vous permet d'écrittre un objet au format AMF (Action Message Format) sérialisé dans une classe ByteArray, tandis que la méthode readObject() vous donne la possibilité de dire un objet sérialisé à partir d'une classe ByteArray vers une variable du type de données d'origine. Vous avez la possibilité de sérialiser n'importe quel objet, à l'exception des objets d'affichage, lesquels peuvent être placés dans la liste d'affichage. Vous pouvez également réaffecteter des objets sérialisés à des occurrences d'une classe personnalisée si celle-ci est disponible pour le moteur d'exercution. Une fois qu'un objet a été converti au format AMF, vous pouze le transférer rapidement par le biais d'une connexion réseau ou l'enregistrer dans un filchier. L'application Adobe® AIR® décrite dans cet exemple lit un fichier .zip pour illustrer le traitement d'un flux d'octets. Elle extrait une liste des fichiers contenus dans le fichier .zip et les écrit dans le poste de travail.

Voir aussi

flash.utilsByteArray flash.util.IExternalizable Spcification AMF (Action Message Format)

Lecture et écriture d'un objet ByteArray

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures La classe ByteArray fait partie du package flash.utils. Afin de creer un objet ByteArray dans ActionScript 3.0, importez la classe ByteArray et appelez le constructeur, comme décrit dans l'exemple suivant : import flash.utils.ByteArray; var stream:ByteBuffer = newByteBuffer();

Méthodes ByteArray

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Tout flux de données significatif est organisé selon un format spécifique que vous pouvez analyser afin d'y trouver les informations souhaitées. Par exemple, un enregistrement dans un fisier d'employé simple, comprendrait très certainement un numéro d'ID, un nom, une adresse, un numéro de téléphone, etc. Un fisier audio MP3 contient une balise ID3 permettant d'identifier le titre, l'auteur, l'album, la date d'édition et le genre du fisier en cours de téléchargement. Le format vous permet de connaître l'ordre dans lequel vous doivent vous attendre à receivevoir les données du flux de données. Il vous permit de dire le flux d'octets de manière intelligente. La classe ByteArray comprend plusieurs méthodes destinées à faciliter la lecture depuis un flux de données et l'écriture vers lui. Parmi les méthodes disponibles, on compte celles-ci: readBytes() et writeBytes(), readInt() et writeInt(), readFloat() et writeFloat(), readObject() et writeObject(), et readUTFBytes() et writeUTFBytes(). Grâce à ces méthodes, vous pouvez dire des données provenant du flux de données dans des variables de types de données spécifique et écrire directement depuis ces types de données vers un flux de données binaire. Par exemple, le code suivant lit un simple tableau de chaînes et de nombres à virgule flottante, puis écrit chaque élément vers un object ByteArray. La structure du tableau permet au code d'appeler les méthodes ByteArray appropriées (writeUTFBytes() et writeFloat()) afin d'écrire les données. Le modèle de données répétitif permet de dire le tableau au moyen d'une boucle. // The following example reads a simple Array (groceries), made up of strings // and floating-point numbers, and writes it to a ByteArray. import flash.utils.ByteArray;
// define the grocery list Array  
var groceries:Array = ["milk", 4.50, "soup", 1.79, "eggs", 3.19, "bread", 2.35]  
// define the ByteArray  
var bytes:ByteArray = newByteArray();  
// for each item in the array  
for (var i:int = 0; i < groceries.length; i++) {  
    bytes.writeUTFBytes(groceries[i++]'); //write the string and position to the next item  
    bytes.writeFloat(groceries[i]); //write the float  
    trace("bytes.position is: " + bytes.position); //display the position in ByteArray  
}  
trace("bytes.length is: " + bytes.length); // display the length 

Propriété position

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures La propriété position stocke la position actuelle du pointeur qui indexe la classe ByteArray au cours de la lecture ou de l'écriture. La valeur initiale de la propriété position est égale à 0 (zéro) comme l'illustrer l'exemple de code suivant : var bytes:Array = new ArrayList(); trace("bytes.position is initially: " + bytes.position); // 0 Lors de la lecture à partir d'une classe ByteArray ou de l'écriture vers elle, la méthode utilisée met à jour la propriété position de sorte qu'elle pointe vers l'emplacement suivant immédiatement le dernier octet lu ou écrit. Par exemple, le code suivant écrit une chaine dans une classe ByteArray. Ensuite, la propriété position pointe vers l'octet qui suit immédiatement la chaine dans ByteArray :
var bytes:Array = new ArrayList();   
trace("bytes.position is initially: " + bytes.position); // 0   
bytes.writeUTFBytes("Hello World!");   
trace("bytes.position is now: " + bytes.position); // 12 
De la même manière, une opération de lecture incrémente la propriété position en fonction du nombre d'octets lus.
var bytes:Array = new ArrayList();   
trace("bytes.position is initially: " + bytes.position); // 0   
bytes.writeUTFBytes("Hello World!");   
trace("bytes.position is now: " + bytes.position); // 12   
bytes.position = 0;   
trace("The first 6 bytes are: " + (bytes.readUTFBytes(6)); //Hello   
trace("And the next 6 bytes are: " + (bytes.readUTFBytes(6)); // World! 
Vou noterez qu'il est possible de définir la propriété position sur un emplacement spécifique dans la classe ByteArray afin de dire ou d'ecrirse selon ce décalage.

Propriétés bytesAvailable et length

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Les propriétés length et bytesAvailable vous indiquent la longueur d'une classeByteArray et le nombre d'octets restants entre la position active et la fin. L'exemple suivant illustrer des modes d'utilisation de ces propriétés. L'exemple écrit une chaîne de texte dans la classeByteArray, puis lit la classeByteArray octet par octet jusqu'à la détéction du caractère « a » ou l'arrivée au terme (bytesAvailable <= 0).
var bytes:Array = new ArrayList();  
var text:String = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus etc."; 
bytes.writeUTFBytes(text); // write the text to the ByteArray trace("The length of the ByteArray is: " + bytes.length);// 70 bytes.position = 0 ;// reset position while (bytes.bytesAvailable >0\& \& (bytes.readUTFBytes(1) != 'a')) { //read to letter a or end of bytes } if (bytes.position < bytes.bytesAvailable) { trace("Found the letter a; position is:" + bytes.position); // 23 trace("and the number of bytes available is:" + bytes.bytesAvailable); // 47

Propriété endian

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Les ordinateurs ne stockent pas tous de la même manière les nombres à plusieurs octets, autrement dit, les nombres nécessitant plus d'un octet de mémoire de stockage. Un nombre entier, par exemple, peut prendre 4 octets (ou 32 bits) de mémoire. Certains ordinateurs commencer par stocker l'octet le plus important du nombre (dans l'adresse mémoire de plus bas niveau) tandis que d'autres stocken d'abord l'octet le moins important. Cet attribut d'ordinateur (ou ordre d'octets) est connu comme étant soit gros-boutiste (l'octet le plus important en premier lieu) soit petit-boutiste (l'octet le moins important en premier lieu). Par exemple, le nombre 0x31323334 serait stocké de la manière suivante pour les ordres d'octets gros-boutiste et petit-boutiste, où a0 représenté l'adresse mémoire de plus bas niveau des 4 octets et a3 correspond à celle de plus haut niveau :
Gros-boutisteGros-boutisteGros-boutisteGros-boutiste
a0a1a2a3
31323334
Petit-boutistePetit-boutistePetit-boutistePetit-boutiste
a0a1a2a3
34333231
La propriété endian de la classe ByteArray vous permet de désigner cet ordre d'octets pour les nombres à plusieurs octets que voustraits. Les valeurs admises pour cette propriété sont bigEndian (gros-boutiste) et littleEndian (petit-boutiste). La classe Endian définit les constantes BIG_ENDIAN et LITTLE_ENDIAN pour configurer la propriété endian à l'aide de ces chaînes.

Méthodes compress() et uncompressed()

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures La méthode compress() vous permet de compressor une classe ArrayList conformément à un algorithmé de compression spécifique sous forme de paramètre. La méthode uncompressed() vous permet de décompresser un tableau ArrayList comprés conformément à un algorithmé de compression. Une fois que vous avez appelé compress() et uncompressed(), la longueur du tableau d'octets est fixée selon la nouvelle longueur et la propriété position est configurée sur la fin. La classe CompressionAlgorithm définit des constantes pouvant servir à spécifique l'algorithm de compression. La classe ByteArray prend en charge les algorithms deflate (AIR uniquement), zlib, et lzma. Le format de données compressé zlib est décrit à l'adresse http://www.ietf.org/rfc/rfc1950.txt. L'algorithm lzma a été ajouté à Flash Player 11.4 et AIR 3.4. Il est décrit sur la page suivante: http://www.7-zip.org/7z.html. L'algorithm de compression deflate est utilisé dans plusieurs formats de compression tels que zlib, gzip et certaines implémentations zip. L'algorithm de compression deflate est décrit à l'adresse http://www.ietf.org/rfc/rfc1951.txt. Dans l'exemple suivant, un tableau ByteArray appelé bytes est compressé à l'aide de l'algorithmte Izma : bytes.compress(CompressionAlgorithm.LZMA); Dans l'exemple suivant, un tableau ByteArray comprés est décompressé à l'aide de l'algorithmde flata : bytes uncompressed(CompressionAlgorithm LZMA);

Lecture et écriture d'objets

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Les méthodes readObject() et writeObject() permettent de dire un objet à partir d'une classeByteArray et d'en écrire un dans une telle classe. Cet objet est codé au format AMF sérieisé. AMF est un protocole de message propriétaire créé par Adobe et utilisé par différentes classes ActionScript 3.0, notamment les objects Netstream, NetConnection, NetStream, LocalConnection et Shared. Un marqueeur de type « un octet » décrit le type des données codées qui suivent. Le format AMF fait appel aux 13 types de données suivants : value-type = undefined-marker | null-marker | false-marker | true-marker | integer-type | double-type string-type xml-doc-type date-type array-type object-type xml-type byte-array-type Les données codées suivent le marqueur de type à moins que ce dernier ne représenté qu'une seule valeur possible (nulle, vraie ou fausse, par exemple), auquel cas aucun autre élément n'est codé. Il existe deux versions du format AMF : AMF0 et AMF3. AMF 0 prend en charge l'envoi d'objets complexes par reférence et permet aux points de fin de restaurer les relations entre objets. AMF 3 améliore le format AMF 0 en envoyant les traits et chaînes de l'objet par reférence, en plus des reférences d'objet, et enPNANTEN en charge de nouveaux types de données introduits dans la version 3.0 d'actionScript. La propriété ByteArrayobjectEcoding spécifie la version du format AMF utilisée pour coder les données d'objet. La classe flash.net.ObjectEncoding définit des constantes permettant de préciser la version du format AMF : ObjectEncoding.AMFO et ObjectEncoding.AMF3. Dans l'exemple suivant, writeObject() est appelé pour écrire un objet XML dans une classe ArrayList, qu'il compressse ensuite à l'aide de l'algorithmé Deflate et écrit dans le fichier ordér situé dans le poste de travail. Dans cet exemple, une étiquette affiche le message « Wrote order file to desktop! » (Fichier d'ordre écrit dans le poste de travail) dans la fenêtre d'AIR lorsque l'opération est terminée. import flash filesystem.\*; import flash.display.Sprite; import flash.display.TextField; import flash.utils.ByteArray; public class WriteObjectExample extends Sprite { public function WriteObjectExample() { var bytes:ByteArray = newByteArray(); var myLabel:TextField = newTextField(); myLabel.x = 150 . myLabel.y = 150 . myLabel.width = 200 . addChild(myLabel); var myXML:XML = burger 3.95 fries 1.45 ; //Write XML object to ByteArray bytes.writeObject(myXML); bytes.position = 0 ;//reset position to beginning bytes.compress(CompressionAlgorithm.DEFLATE);//compressByteArray writeBytesToFile("order.xml",bytes); myLabel.text = "Wrote order file to desktop!"; } private function writeBytesToFile(fileName:String,data:ByteArray):void { var outFile:File FiledesktopDirectory; // dest folder is desktop outFile outFile resolverPath(fileName); // name of file to write var outStream:FileStream new FileStream(); // open output file stream in WRITE mode outStream.open(outFile,FileMode.WRITE); //write out the file outStream.writeBytes(data,0,data.length); //close it outStream.close(); } La méthode readObject() lit unobjet au format AMF sérieé à partir d'une classe ArrayList et le stocke dans un objet du type spécifique. Dans l'exemple suivant, le fisier ordér est lu à partir du poste de travail dans une classe ArrayList (inBytes), puis il est décompressé. readObject() est ensuite appelé pour stocker le fisier dans l'objet XML orderXML. Dans cet exemple, une construction de boucle for each() est utilisé pourajouter chaque nœud à une zone de texte à des fins d'affchage. L'exemple présente également la valeur de la propriété objectEncoding accompagnée d'un en- tê pour le contenu du fisier ordér. import flash filesystem.\*; import flash.display.Sprite; import flash.display.TextField; import flash.utils.ByteArray; public class ReadObjectExample extends Sprite { public function ReadObjectExample() { var inBytes:ByteArray = newByteArray(); // define text area for displaying XML content var myTxt:TextField = newTextField(); myTxt.width = 550 . myTxt.height = 400 . addChild(myTxt); //display objectEncoding and file heading myTxt.text = "Object encoding is:" + inBytes/objectEncoding +"\n\n" + "order file:\n\n"; readFileIntoByteArray("order",inBytes); inBytes.position = 0 ;//reset position to beginning inBytes.uncompress(CompressionAlgorithm.DEFLATE); inBytes.position = 0 ;//reset position to beginning // read XML Object var orderXML:XML = inBytes.readObject();
// for each node in orderXML
for each (var child:XML in orderXML)
{
    // append child node to text area
    myTxt.text += child + "\n";
}
}
// read specified file into byte array
private function readFileIntoByteArray(fileName:String, data:Array):void
{
    var inFile:File = File desktopDirectory; // source folder is desktop
    inFile = inFileresolvePath(fileName); // name of file to read
    var inStream:FileStream = new FileStream();
    inStream.open(inFile, FileMode.READ);
    inStream.readBytes(data);
    inStream.close();
} 

ExempleByteArray : lecture d'un fichier .zip

Adobe AIR 1.0 et les versions ultérieures

Cet exemple indique comment dire un fisier. zip simple contenant plusieurs fisiers de types différents. Pour parvenir à dire un tel fisier, les données pertinentes sont extraites des métadonnées pour chacun des fisiers, lesquels sont décompressés dans des classes ByteArray individuelles et écrites dans le poste de travail. La structure générale d'un fjichier .zip repose sur la Specification PKWARE Inc., laquelle est tenue à jour à l'adresse http://www.pkware.com/documents/casestudies/APPNOTE.TXT. Elle commence par l'en-tête et les données du premier fjichier de l'archive .zip, suivis de la paire en-tête/données de chaque fjichier supplémentaire. (La structure de l'en-tête des fjichiers est désrite plus loin dans ce document.) Le fjichier .zip comprend évientuelles un enregistrement du descripteur de données (généralement lorsque le fjichier zip de sortie a été créé dans la mémoire au lieu d'être enregistré sur un disque). Divers éléments facultatifs viennent ensuite : en-tête de déchiffrement de l'archive, enregistrement des données supplémentaires de l'archive, structure de répertoires centrale, fin Zip64 de l'enregistrement de répertoires central, fin Zip64 du localisateur de répertoires central et fin de l'enregistrement de répertoires. Le code presenté dans cet exemple a été rédigé dans le seul objectif d'analyser des fischiers zip ne contenant pas de dossiers ; il n'attend pas d'enregistements de descriptorurs de données. Il ne tient pas compte des informations suivant les données du dernier fischier. Le format de l'en-tête de fichier de chaque fichier est défini de la manière suivante :
signature de l'en-tête de fichier4 octets
version requise2 octets
indicateur de bit à usage général2 octets
méthode de compression2 octets (8=DEFLATE; 0=UNCOMPRESSED)
heure de la dernière modification du fichier2 octets
date de la dernière modification du fichier2 octets
crc-324 octets
taille comprésée4 octets
taille décompressée4 octets
longueur du nom de fichier2 octets
longueur du champ supplémentaire2 octets
nom du fichiervariable
champ supplémentairevariable
L'en-tête du fjichier est suivi des vérables données du fjichier, au format comprés ou décompressé, suivant l'indicateur de méthode de compression utilisé. L'indicateur est égal à 0 (zéro) si les données du fjichier sont décompressées, à 8 si les données sont compressées à l'aide de l'algorithm DEFLATE ou à une autre valeur lorsque les données utilisent d'autres algorthèmes de compression. L'interface utiliser choses dans cet exemple se compose d'une étiquette et d'une zone de texte (taFiles). L'application écrit les informations suivantes dans la zone de texte pour chaque fischier détecté dans le fischier .zip : nom du fischier,aille compressée et taille décompressée. Le document MXML suivant définit l'interface utilisateur de la version Flex de l'application :
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" creationComplete="init();">
    <mx:Script>
        <!--[CDATA[ // The application code goes here ]
        ]">
            </mx:Script>
        <mx:Form>
            <mx:FormItem label="Output">
                <mx:TextArea id="taFiles" width="320" height="150"/>
            </mx:FormItem>
        </mx:Form>
    </mx:WindowedApplication> 
Le début du programme effectue les tâches suivantes : - Importation des classes requisés
import flash filesystem.\*;   
import flash.utilsByteArray;   
import flash.events.Event; 
- Définition de l'interface utilisé pour Flash import fl.Controls.\*; //requires TextView and Label components in the Library var taFiles = new TextView(); var output = new Label(); taFiles.setSize(320,150); taFiles.move(10,30); output.move(10,10); output.width = 150 . output.text = "Contents of HelloAir.zip"; addChild(taFiles); addChild(output); - Définition de la classe ByteArray bytes
var bytes:ByteArray = newByteArray(); 
- Définition des variables destinées à stocker les métadonnées provenant de l'en-tête du fichier
// variables for reading fixed portion of file header  
var fileName:String = new String();  
var flNameLength uint;  
var xfldLength uint;  
var offset uint;  
var compSize uint;  
var uncompSize uint;  
var compMethod int;  
var signature int; 
- Définition des objets File (zfile) et FileStream (zStream) devant représentier le fisquier .zip et indication de l'emplacement du fisquier .zip à partir duquel les fisiers sont extraits (fichier intitulé HelloAIR.zip dans le réseau du poste de travail)
// File variables for accessing .zip file  
var zfile:File = File/DesktopDirectoryresolvePath("HelloAIR.zip");  
var zStream:FileStream = new FileStream(); 
Dans Flex, le code du programme commence dans la méthode init(), laquelle est appelée en tant que gestionnaire creationComplete pour la balise mx:WindowedApplication racine.
// for Flex private function init():void { 
Le programme commence par ouvrir le fichier .zip en mode READ (lecture).
zStream.open(zfile, FileMode.READ); 
Il configure ensuite la propriété endian de bytes sur la valeur LITTLE-ENDIAN afin d'indiquer que l'ordre d'octets des champs numériques commence par l'octet le moins important.
bytes.endian = Endian.LITTLE.ENDIAN; 
Une instruction while () commence ensuite une boucle qui s'interrrompt uniquement lorsque la position active dans le flux de fichier est supérieure ou égale à la taille du fichier.
while (zStream.position < zfile.size) { 
La première instruction au sein de la boucle lit les 30 premiers octets du flux de fichier dans la classe ByteArray bytes. Les 30 premiers octets constituent la partie à taille fixe de l'en-tête du premier fichier. // read fixed metadata portion of local file header zStream.readBytes(bytes, 0, 30); Le code lit ensuite un nombre entier (signature) à partir des premiers octets de l'en- tete de 30 octets. La définition du format ZIP indique que la signature de chaque en- tete de fichier correspond à la valeur hexadécimale 0 × 04034b50 ; si la signature est différente, cela signifie que le code a dépasse la section des fichiers contenus dans le fichier .zip et qu'il ne reste plus aucun fichier à extraire. Dans ce cas, le code quitte immédiatement la boucle while au lieu d'attendre la fin du tableau d'octets. bytes.position = 0 signature bytes.readInt(); //if no longer reading data files, quit if (signature ! = 0x04034b50) { break; 1 La partie suivante du code lit l'octet d'en-été à la position décalée 8 et stocke la valeur dans la variable compMethod. Cet octet contient une valeur indiquant la méthode de compression appliquée à ce fichier. Plusieurs méthodes de compression sont autorisées, mais en pratique, presque tous les fichiers .zip utilisent l'algorithmé de compression DEFLATE. Si le fichier actif est comprés à l'aide de la méthode de compression DEFLATE, compMethod est égal à 8; si le fichier n'est pas comprés, compMethod est égal à 0.
bytes.position = 8;  
compMethod = bytes.readByte(); // store compression method (8 == Deflate) 
Les 30 premiers octets sont suivis par une partie d'en-tête à longueur variable contenant le nom du filchier et, éventuellesment, un champ supplémentaire. La variable offset stocke la taille de cette partie. La taille est calculée en ajoutant la longueur du nom de filchier à la longueur du champ supplémentaire, rue à partir de l'en-tête aux décalages 26 et 28. offset = 0 //stores length of variable portion of metadata bytes.position = 26 //offset to file name length flNameLength bytes.readShort();//store file name offset + = flNameLength; //add length of file name bytes.position = 28 //offset to extra field length xfldLength bytes.readShort(); offset + = xfldLength;//add length of extra field Le programme lit ensuite la partie à longueur variable de l'en-tête du fichier pour identifier le nombre d'octets stockés dans la variable offset. // read variable length bytes between fixed-length header and compressed file data zStream.readBytes(bytes, 30, offset); Le programme lit le nom du fichier à partir de la partie variable de l'en-tête et l'affiche dans la zone de texte accompagné des tailles comprissée (zippée) et décompressée (initiale) du fichier.
// Flash version
bytes.position = 30;
fileName = bytes.readUTFBytes(flNameLength); // read file name
taFiles.appendText(fileName + "\n"); // write file name to text area
bytes.position = 18;
compSize = bytes.readUnsignedInt(); // store size of compressed portion
taFiles.appendText("\\tCompressed size is: " + compSize + '\n');
bytes.position = 22; // offset to uncompressed size
uncompSize = bytes.readUnsignedInt(); // store uncompressed size
taFiles.appendText("\\tUncompressed size is: " + uncompSize + '\n'); 
// Flex version
bytes.position = 30;
filename = bytes.readUTFBytes(flNameLength); // read file name
taFiles.text += fileName + "\n"; // write file name to text area
bytes.position = 18;
compSize = bytes.readUnsignedInt(); // store size of compressed portion
taFiles.text += "\tCompressed size is: " + compSize + "\n";
bytes.position = 22; // offset to uncompressed size
uncompSize = bytes.readUnsignedInt(); // store uncompressed size
taFiles.text += "\tUncompressed size is: " + uncompSize + "\n"; 
L'exemple de code lit le reste du fjchier à partir du flux de fjchier en octets (bytes) selon la longueur indiquee par la taillie comprissée, écrasant ainsi l'en-tête de fjchier dans les 30 premiers octets. La taillie comprissée est exacte et ce, même si le fjchier n'est pas comprisse, car elle équivaut alors à la taillie décompressée du fjchier.
// read compressed file to offset 0 of bytes; for uncompressed files  
// the compressed and uncompressed size is the same  
if (compSize == 0) continue;  
zStream.readBytes(bytes, 0, compSize); 
Dans la suite de l'exemple, le fichier comprése est décompressé et la fonction outfile() est appelée afin de l'écrite dans le flux du fichier de sortie. Le code passa à outfile() le nom du fichier et le tableau d'octets contenant les données du fichier.
if (compMethod == 8) // if file is compressed, uncompressed  
{ bytes uncompressed(CompressionAlgorithm.DEFLATE); } outFile(fileName, bytes); // call outFile() to write out the file 
Dans l'exemple précédemment mentionné, bytes uncompressed (CompressionAlgorithm.DEFLATE) fonctionne uniquement dans les applications AIR. Pour décompresser les données compressées dans AIR et Flash Player, appelez la fonction inflate() de ByteArray. Les accolades de fermeture indiquent la fin de la boucle while, de la méthode init() et du code de l'application Flex, à l'exception de la méthode outFile(). L'execution revient au début de la boucle while et poursuit le traitement des octets suivants du fjichier .zip, soit en extrayant un autre fjichier soit en mettant un terme au traitement du fjichier .zip si le dernier fjichier a été traité.
} // end of while loop } // for Flex version, end of init() method and application 
La fonction outfile() ouvre un fisier de sortie en mode WRITE (écriture) dans le poste de travail en lui donnant le nom fourni par le paramètreIPA. Elle écrit ensuite les données du fisier issues du paramètre data dans le flux du fisier de sortie (outStream) et ferme le fisier. // Flash version function outFile(fileName:String, data:ByteArray):void { var outFile:File = File/Desktop; // destination folder is desktop outFile = outFile resolverPath(fileName); // name of file to write var outStream:FileStream = new FileStream(); // open output file stream in WRITE mode.outStream.open(outFile,FileMode.WRITE); // write out the fileoutStream.writeBytes(data,0,data.length); // close itoutStream.close(); } private function outFile(fileName:String,data:ByteArray):void { var outFile:File = File/Desktop; // dest folder is desktop outFile = outFile resolverPath(fileName); // name of file to write var outStream:FileStream = new FileStream(); // open output file stream in WRITE modeoutStream.open(outFile,FileMode.WRITE); // write out the fileoutStream.writeBytes(data,0,data.length); // close itoutStream.close(); }

Chapitre 42 : Principes de base de la mise en réseau et de la communication

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Lorsque vous creez des applications dans Flash Player ou AIR, il est souvent nécessaire d'acceder à des ressources externes. Vous pouvez, par exemple, demander une image à un serveur Web Internet et obtenir en回头 les données correspondantes. Vous pouze également échanger des objets SERIALISÉS avec un serveur d'applications via une connexion socket. Les API de Flash Player et d'AIR proposent plusieurs classes qui permettent aux applications de participer à cet échange. Elles prennt en charge la mise en réseau IP pour les protocôles tels qu'UDP, TCP, HTTP, RTMP et RTMFP. Les classes suivantes permettent d'envoyer et de receivevoir des données via un réseau :
ClasseFormats de données pris en chargeProtocolesDescription
LoaderSWF, PNG, JPEG, GIFHTTP, HTTPSCharge les types de données pris en charge et convertit les données en objet d'affichage.
Voir « Chargement dynamique du contenu d'affichage » à la page 205.
URLLoaderTous les formats (texte, XML, binaire, etc.)HTTP, HTTPSCharge les formats de données arbitraires. L'application est responsable de l'interprétation des données.
Voir « Utilisation de la classe URLsLoader » à la page 847
FileReferenceTous les formatsHTTPCharge et télécharge les fichiers.
Voir « Utilisation de la classe FileReference » à la page 676
NetConnectionVidéo, audio, AMF (ActionScript Message Format)HTTP, HTTPS, RTMP, RTMFPEtablit une connexion aux flux video, audio et d'objets distants.
Voir « Utilisation de la video » à la page 489.
SoundAudioHTTPCharge et lit les formats audio pris en charge.
Voir « Chargement de fichiers audio externes » à la page 458
XMLSocketXMLTCPEchange des messages XML avec un serveur XMLSocket.
Voir « Sockets XML » à la page 834.
SocketTous les formatsTCPEtablit une connexion à un serveur socket TCP.
Voir « Sockets clients binaires » à la page 829.
SecureSocket (AIR)Tous les formatsTCP avec SSLv3 ou TLSv1Etablit une connexion à un serveur socket TCP qui requiert une sécurité SSL ou TLS.
Voir « Sockets de client sécurisés (AIR) » à la page 829
ServerSocket (AIR)Tous les formatsTCPSert de serveur aux connexions socket TCP entrantes.
Voir « Sockets de serveur » à la page 837.
DatagramSocket (AIR)Tous les formatsUDPEnvoie et reçoit des paquets UDP.
Voir « Sockets UDP (AIR) » à la page 839
Lors de la création d'une application Web, il s'avéré souvent utile de stocker les informations persistantes relatives à l'état de l'application de l'utilisateur. Les applications et pages HTML utilisent généralement des cookies à cet effet. Dans Flash Player, l'utilisation de la classe SharedObject mène à un résultat identique. Voir « Objets partages » à la page 728. (Vous pouvez utiliser la classe SharedObject dans les applications AIR, mais se contentier d'enregistrer les données dans un fichier standard donne lieu à moins de restrictions.) Lorsque l'application Flash Player ou AIR doit communiquer avec une autre application Flash Player ou AIR sur le même ordinateur, vous pouvez faire appel à la classe LocalConnection. Deux processus SWF ou plus hébergés sur la même page Web peuvent ainsi communiquer entre eux. Un processus SWF qui s'exécute sur une page Web peut de même communiquer avec une application AIR. Voir « Communications avec d'autres occurrences de Flash Player et d'AIR » à la page 862 Pour communiquer avec d'autres processus non-SWF sur l'ordinateur local, vous dispose de la classe NativeProcess intégrée à AIR 2. La classe NativeProcess permet à l'application AIR de démarrer et de communiquer avec d'autres applications. Voir « Communication avec les processus natifs dans AIR » à la page 869 Les classes suivantes permettent d'obtenir des informations sur l'environnement reseau de I'ordinateur sur lequel s'execute une application AIR : NetworkInfo : fournit des informations sur les interfaces réseau disponibles, telles que l'adresse IP de l'ordinateur. Voir « Interfaces réseau » à la page 822. DNSResolver : permet de consulter les enregistrements DNS. Voir « Enregistrements DNS (Domain Name System) » à la page 826 ServiceMonitor : permet de surveiller la disponibilité d'un serveur. Voir « Surveillance des services » à la page 824. - URLMonitor : permet de surveiller la disponibilité d'une ressource associée à une URL donnée. Voir « Surveillance HTTP » à la page 825. - SocketMonitor et SecureSocketMonitor : permettent de surveiller la disponibilité d'une ressource sur un socket. Voir « Surveillance des sockets » à la page 825.

Concepts important et terminologie

La liste de référence suivante contient des termes importants relatifs à la programmation de code de mise en réseau et de communication : Données externes Données stockées sous une certaine forme en dehors de l'application et charges dans cette dernière si besoin est. Ces données peuvent être stockées dans un fjichier charge directement, dans une base de données ou sous une autre forme récapurée en appelant des scripts ou des programmes executés sur un serveur. Variables codées URL Le format code URL permet de représentier plusieurs variables (paires de valeurs et de nombres de variable) dans une seule chaine de texte. Les variables individuelles sont écrites dans le format nom= Valeur. Chaque variable (c'est-à-dire, chaque paire nom-valeur) est séparée par un caractère esperluette, comme suit : variable1= Valeur1&variable2= Valeur2. De cette façon, un nombre infini de variables peut être envoyé sous la forme d'un seul message. Type MIME Code standard utilise pour identifier le type d'un fjichier donné dans une communication Internet. Tous les types de fjichier ont un code spécifique utilisé pour les identifier. Lors de l'envoi d'un fjichier ou d'un message, un ordinateur (un serveur Web ou l'occurrence Flash Player ou AIR d'un utilisateur, par exemple) spécifie le type de fjichier envoyé. HTP Hypertext Transfer Protocol : format standard de livraison de pages Web et de différents types de contenu envoyés sur Internet. Méthode de requête Lorsqu'une application (tel un navigateur Web ou une application AIR) envoie un message (appelez requête HTTP) à un serveur Web, les données envoyées peuvent être intégrées à la requête de deux façon différentes : les méthodes de requête GET et POST. Côté serveur, le programme qui recoit la requête doit pouvoir rechercher les données dans la portion appropriée de la requête. C'est pourquoi la méthode de requête utilisée pour envoyer des données de votre application doit correspondre à cette utilisée pour dire ces données sur le serveur. Connexions socket Connexion persistante pour la communication entre deux ordinateurs. Charger Envoyer un fichier à un autre ordinateur. Télécharger Récuperer un fichier d'un autre ordinateur.

Interfaces réseau

Adobe AIR 2 et ultérieur

L'objet NetworkInfo permet de vérifier les interfaces matérielles et logicielles réseau dont dispose l'application. Puisqu'il s'agit d'un objet singleton, il est inutil de le creator. Accededz à l'uneque objet NetworkInfo par le biais de la propriété de classe statique networkInfo. L'objet NetworkInfo distribue également un événement networkChange en cas de modification de l'une des interfaces disponibles. Appelez la méthode findInterfaces() pour obtenir la liste des objets NetworkInterface. Chaque objet NetworkInterface de la liste décrit l'une des interfaces disponibles. L'objet NetworkInterface fournit des informations telles que l'adresse IP, l'adresse matérielie, l'unité maximal de transmission et indique si l'interface est active. L'exemple de code suivant effectue le suivi des propriétés NetworkInterface de chaque interface sur l'ordinaire client : package { import flash.display.Sprite; import flash.netISTAreaAddress; import flash.net.NetworkInfo; import flash.net.NetworkInterface; public class NetworkInformationExample extends Sprite { public function NetworkInformationExample() { var networkInfo:NetworkInfo = NetworkInfo.networkInfo; var interfaces:Vector.trace("active?:" +interfaceObj.active); trace("parent interface:" +interfaceObj.parent); trace("hardware address:" +interfaceObj.hardwareAddress); if (interfaceObj.subInterfaces != null) { trace("# subinterfaces: " +interfaceObj.subInterfaces.length); } trace "# addresses:" +interfaceObj_addresses.length); for each (var address:InterfaceAddress in interfaceObj_addresses) { trace(" type:" +address.ipVersion); trace("address:" +address.address); trace("broadcast:" +address.broadcast); trace("prefix length:" +address_prefixLength); } } } } } } } } } Pour plus d'informations, voir : NetworkInfo NetworkInterface - InterfaceAddress - Flexpert: Detecting the network connection type with Flex 4.5 (disponible en anglais uniquement)

Changements de connectivité réseau

Adobe AIR 1.0 et les versions ultérieures

Votre application AIR peut s'executer dans des environnementss caractérisés par une connectivité réseau non déterminée et en évolution constante. Pour aider une application àGER les connexions aux ressources en ligne, Adobe AIR envoie un événement de changement réseau à chaque fois qu'une connexion réseau est disponible ou non disponible. L'objet NetworkInfo et l'objet NativeApplication de l'application distribuents tous deux l'évenement networkChange. Pour répondre à cet événement, ajoutez un écouteur : NetworkInfo.networkInfo.addEventListener(Event.NETWORK_CHANGE, onNetworkChange); Définissez également une fonction de gestionnaire d'évenement :
function onNetworkChange(event:Event)  
{ //Check resource availability  
} 
L'évenement networkChange n'indique pas un changement de l'activité réseau globale. Il se contente de signaler qu'une connexion réseau donnée a changé. AIR ne tente pas d'interpréter la signification du changement réseau. Un ordinateur connecté au réseau étant susceptible de disposer d'un nombre élevé de connexions réelles et virtuelles, perdre une connexion ne signifie pas nécessairement perdre une ressource. A l'inverse, une nouvelle connexion n'est pas non plus synonyme de disponibilité accrue des ressources. Il arrive qu'une nouvelle connexion bloque l'accès à des ressources précédemment disponibles (lors d'une connexion à un VPN, par exemple). En règle générale, l'unique façon de déterminer si une application peut se connecter à une ressource distante consiste à en faire l'essay. La structure de surveillance des services propose une technique orientée événement de réponse aux changements de connectivité réseau vers un hôte déterminé. Remarque: la structure de surveillance des services détece si un serveur répond de manière acceptable à une requête. Le succès du contrôle n'est pas synonyme de connectivité totale. Les services Web évolutifs proposent souvent des dispositifs de mise en cache et d'équilibrage de charge destinés à réorienter le traffic vers un groupe de serveurs Web. Dans ce cas de figure, les prestataires de services n'assurent qu'un diagnostic partiel de la connectivité réseau.

Surveillance des services

Adobe AIR 1.0 et les versions ultérieures

La structure de surveillance des services, distincte de la structure AIR, reside dans le fichier aircore.swc. Pour pouvoir utiliser la structure, le fichier aircore.swc doit être inclus dans le processus de compilation. Adobe® Flash® Builder inclut automatiquement cette bibliothèque. La classe ServiceMonitor met en œuvre la structure de surveillance des services réseau et propose des fonctionnalités de base aux utilisaires de surveillance des services. Par défaut, une occurrence de la classe ServiceMonitor distribue des événements relatifs à la connectivité réseau. L'objet ServiceMonitor distribue ces événements lors de la création de l'occurrence et lorsque le moteur d'éjection déetecte un changement au sein du réseau. Par ailleurs, vous pouvez définir la propriété pollInterval d'une occurrence de ServiceMonitor de sorte à vérifier la connectivité à fréquence déterminée exprimée en milliseconds, sans tener compte des événements de connectivité réseau généraux. Un objet ServiceMonitor ne vérifie pas la connectivité réseau tant que la méthode start() n'a pas été appelée. La classe URLMonitor, une sous-classe de la classe ServiceMonitor, detecte les changements de connectivité HTTP associés à une requête URLRequest déterminée. La classe SocketMonitor, également une sous-classe de la classe ServiceMonitor, detecte les changements de connectivité vers un hote déterminé sur un port donné. Remarque : dans les versions antérieures à AIR 2, la structure de surveillance des services était publiée dans la bibliothèque servicemonitor.swc. L'utilisation de cette bibliothèque est à présent déconseillée. Utilisez plutôt la bibliothèque aircore.swc.

Flash CS4 et CS5 Professional

Pour utiliser ces classes dans Adobe® Flash® CS4 ou CS5 Professional : 1 Choisissez Fichier > Paramètres de publication. 2 Cliquez sur le bouton Parametes pour ActionScript 3.0. Sélectionnez Chemin de la bibliothèque. 3 Cliquez sur le bouton Localiser le fichier SWC et accedez au dossier AIK dans le dossier d'installation de Flash Professional. 4 Dans ce dossier, recherche le fichier /frameworks/libs/air/aircore.swc (AIR 2) ou /frameworks/libs/air/servicemonitor.swc (AIR 1.5). 5 Cliquez sur le bouton OK. 6 Ajoutez l'instruction d'importation suivant dans votre code ActionScript 3.0 : import air.net.*;

Flash CS3 Professional

Pour utiliser ces classes dans Adobe* Flash* CS3 Professional, faites glisser le composant ServiceMonitorShim du panneau Composants vers la bibliothèque. Ajoutez ensuite l'instruction import suivante au code ActionScript 3.0 : import air.net.\*;

Surveillance HTTP

Adobe AIR 1.0 et les versions ultérieures

La classe URLMonitor déterminé s'il est possible d'envoyer des requêtes HTTP à une adresse déterminée sur le port 80 (qui est généralement utilisé par les communications HTTP). Le code suivant utilise une occurrence de la classe URLMonitor pour détecter les changements de connectivité vers le site Web d'Adobe : import air.net(URLMonitor; import flash.net(URLRequest; import flash.events.StatusEvent; var monitor:URLMonitor; monitor = new URLMonitor(new URLLRequest('http://www.example.com')); monitor.addEventListener(StatusEvent.Status,announceStatus); monitor.start(); function announceStatus(e:StatusEvent):void{ trace("Status change.Current status:" ^+ monitor-available); }

Surveillance des sockets

Adobe AIR 1.0 et les versions ultérieures

Les applications AIR peuvent également utiliser les connexions de socket pour assurer la connectivité de type « push ». Pour des raisons de sécurité, les pare-feu et routeurs réseau interdisent généralement les communications réseau sur les ports non autorisés. Les développpeurs doivent donc tener compte du fait que les utilisateurs ne sont pas toujours à même d'établier des connexions de socket. Le code suivant utilise une occurrence de la classe SocketMonitor pour détecter les changements de connectivité vers une connexion de socket : Le port surville, 6667, est un port courant pour IRC : import air.net ServiceMonitor; import flash.events.StatusEvent; socketMonitor = new SocketMonitor('www.example.com',6667); socketMonitor.addEventListener(StatusEvent-status,socketStatusChange); socketMonitor.start(); function announceStatus(e:StatusEvent):void{ trace("Status change. Current status: " + socketMonitor AVAILABLE); } Si le serveur socket requiert une connexion sécurisée, utilisez la classe SecureSocketMonitor au lieu de SocketMonitor.

Enregistrements DNS (Domain Name System)

Adobe AIR 2.0 et les versions ultérieures

La classe DNSResolver permet de consulter les enregistrements de ressource DNS. Les enregistrements de ressource DNS fournissant des informations telles que l'adresse IP d'un nom de domaine et le nom de Domaine d'une adresse IP. Vous pouvez consulter les types suivants d'enregistrements de ressources DNS : - ARecord : adress IPv4 d'un hôte - AAAARecord: adress IPv6 d'un hôte - MXRecord: enregistrement d'échange de courrier associé à un hôte - PTRRecord : nom d'hote associé à une adresse IP - SRVRecord: enregistrement associé à un service. Pour consulter un enregistrement, transmettez une chaine de requête et l'objet de classe représentant le type d'enregistrement à la méthode lookup() de l'objet DNSResolver. La chaine de requête à utiliser varie selon le type d'enregistrement :
Classé d'enregistrementChaine de requêteExemple de chaine de requête
ARecordnom d'hôte« example.com »
AAAARecordnom d'hôte« example.com »
MXRecordnom d'hôte« example.com »
PTRRecordAdresse IP« 208.77.188.166 »
SRVRecordIdentifient de service: _service._protocole.hôte« _sip._tcp.example.com »
L'exemple de code suivant recherche l'adresse IP de l'hote « example.com » package { import flash.display.Sprite; import flash.events.DNSResolverEvent; import flash.events.ErrorEvent; import flash.net.dns.ARecord; import flash.net.dns.DNSResolver; public class DNSResolverExample extends Sprite { public function DNSResolverExample() { var resolver:DNSResolver = newDNSResolver(); resolver.addEventListener(DNSResolverEvent.LOOKUP, lookupComplete); resolver.addEventListener(ErrorEvent失误, lookupError); resolver.lookup("example.com.", ARecord); } private function lookupComplete( event:DNSResolverEvent):void { trace("Query string:" ^+ event.host); trace("Record count:" ^+ event.ResourceRecords.length); for each(var record:*in event.ResourceRecords) { if( record is ARecord)trace( record.address); } } private function lookupError( error:ErrorEvent):void { trace("Error:" ^+ error.text); } } Pour plus d'informations, voir : DNSResolver DNSResolverEvent - ARecord - AAAARecord MXRecord PTRRecord SRVRecord

Chapitre 43 : Sockets

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Un socket est un type de connexion réseau établie entre deux processus informatiques. En règle générale, les processus s'exécutent sur deux ordinateurs distincts connectés au même réseau IP (Internet Protocol). Les processus connectés peuvent toutefois s'exécuter sur le même ordinateur via l'adresse IP spéciale « hôte local » Adobe Flash Player prend en charge les sockets TCP (Transport Control Protocol) côte client. Une application Flash Player peut se connecter à un autre processus qui fait office de serveur socket, mais est incapable d'accepter les demandes de connexion entrantes provenant d'autres processus. En d'autres termes, une application Flash Player peut se connecter à un serveur TCP, mais ne peut pas faire office de serveur TCP. L'API de Flash Player comprend également la classe XMLHttpRequest. La classe XMLHttpRequest utilise un protocole propre à Flash Player, qui permet d'échanger des messages XML avec un serveur qui comprend ce protocole. La classe XMLHttpRequest a été introduite dans ActionScript 1 et continue à être prise en charge à des fins de compatibilité ascendante. En règle générale, réserves la classe Socket aux nouvelles applications, sauf si vous vous connectez à un serveur dédié aux communications avec Flash XMLHttpRequests. Adobe AIR intégre plusieurs autres classes réservées à la programmation réseau basée sur les sockets. Les applications AIR peuvent agir comme serveurs sockets TCP grâce à la classe ServerSocket, et peuvent se connecter à des serveurs sockets qui nécessient une sécurité SSL ou TLS grâce à la classe SecureSocket. La classe DatagramSocket permet également aux applications AIR d'envoyer et de receivevoir des messages UDP (Universal Datagram Protocol).

Voir aussi

Package flash.net « Connexion aux sockets » à la page 1114

Sockets TCP

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Le protocole TCP (Transmission Control Protocol) permet d'échanger des messages via une connexion réseau permanente. Le protocole TCP assures la réception dans l'ordre correct de tous les messages envoyés (ce qui élimine les principaux problèmes liés au réseau). Les connexions TCP nécessitent un « client » et un « serveur ». Flash Player peut creator des sockets clients. Adobe AIR peut en outre creator des sockets serveur. Les API ActionScript suivantes assurent des connexions TCP : - Socket : permet à une application cliente de se connecter à un serveur. La classe Socket peut écouter les connexions entrantes. - SecureSocket (AIR): permet à une application cliente de se connecter à un serveur approuvé et d'établit des communications chiffrées. - ServerSocket (AIR): permet à une application d'éçouter les connexions entrantes et de servir de serveur. - XMLHttpRequest: permet à une application cliente de se connecter à un serveur XMLHttpRequest.

Sockets clients binaires

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Une connexion socket binaire est semble à un socket XML, à une différence pres : le client et le serveur n'échangent pas uniquement des messages XML. La connexion peut en effet transférer des données au format binaire. Vous pouvez ainsi vous connecter à un plus large évendant de services, notamment des serveurs de messagerie (POP3, SMTP et IMAP) et d'informations (NNTP).

Socket, classe

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures La classe Socket vous permet d'établier des connexions socket, ainsi que de dire et d'écrit des données binaires brutes. La classe Socket est utile si vous utilisez des serveurs faisant appel à des protocoles binaires. Grace aux connexions socket binaires, vous pouvez écrire du code qui gère les interactions avec différents protocoles Internet (POP3, SMTP, IMAP et NNTP, par exemple). Ces interactions permettent alors aux applications de se connecter à des serveurs de messagerie et d'informations. Flash Player peut communiquer directement avec un serveur en utilisant directement le protocole binaire de ce serveur. Certains serveurs utilisent l'ordre d'octets « gros-boutiste », d'autres l'ordre « petit-boutiste ». La plupart des serveurs sur Internet utilisent l'ordre gros-boutiste, car il s'agit de l'ordre d'octets du réseau. L'ordre petit-boutiste s'est repandu en raison de son utilisation par l'architecture Intel® x86. Vous doivent utiliser l'ordre d'octets correspondant au serveur qui envoie et recoit les données. Toutes les opérations sont effectuees par les interfaces DataInput et DataOutput, et les classes qui les implémentent (ByteArray, Socket et URLStream) sont par defaut encodées au format gros-boutiste (l'octet le plus significatif en premier). Cet ordre d'octet par défaut a été sélectionné pour correspondre à Java et à l'ordre des octets réseau officiel. Pour modifier l'ordre d'octets à utiliser, vous pouvez définir la propriété endian sur Endian.BIG.ENDIAN ou Endian.LITTLE.ENDIAN. la classe Socket hérite de toutes les méthodes définies par les interfaces IDataInput et IDataOutput (qui résident dans le package flash.utils). Vous nevez impérativement utiliser ces méthodes pour écrire et dire à partir du socket. Pour plus d'informations, voir : - Socket - IDataInput - IDataOutput - Evénement socketData

Sockets de client sécurisés (AIR)

Adobe AIR 2 et ultérieur La classe SecureSocket permet d'étabrir une connexion aux serveurs socket qui utilisent Secure Sockets Layer version 4 (SSLv4) ou Transport Layer Security version 1 (TLSv1). Les avantages que présente un socket sécurisé sont au nombre de trois : authération du serveur, intégrité des données et confidentialité des messages. Le moteur d'exécution authénie est un serveur par le biais de son certificat et de sa relation aux certificates délivrés par les autorités de certification racine ou intermédiaires dans le magasin d'approbation de l'utilisateur. Le moteur d'exécution se fonde sur les algôrmes de cryptography utilisés par les implémentations de protocoles SSL et TLS pour assurer l'intégrité des données et la confidentialité des messages. Lorsque vous vous connectez à un serveur par le biais de l'objet SecureSocket, le moteur d'exécution valide le certificat du serveur via le magasin d'approbation des certificateurs. Sous Windows et Mac, le système d'exploitation fournit le magasin d'approbation. Sous Linux, le moteur d'exécution fournit son propre magasin d'approbation. Si le certificat du serveur n'est ni valide, ni fiable, le moteur d'execution distribue un événement ioError. La propriété serverCertificateStatus de l'objet SecureSocket permet d'identifier le motif de l'échéc de la validation. Il est impossible de communiquer avec un serveur qui ne dispose pas d'un certificat valide et fiable. La classe CertificateStatus définit les constantes de chaine qui représentent les résultats possibles de la validation : - Expired (Expiré) : la date d'expiration du certificat est dépassée. - Invalid (Non valide): diverses raisons expliquent la non-validité d'un certificat. Celui-ci pourrait avoir été modifié, alteré ou son type pourrait être incorrect. - Invalid chain (Chaine non valide): un ou plusieurs certificates de la chaine de certificates du serveur ne sont pas valides. Principal mismatch (Non-concordance majeure): le nom d'hote du serveur et le nom commun figurant sur le certificat ne sont pas identiques. En d'autres termes, le serveur utilise le certificat d'un autre serveur. - Revoked (Révoqué): l'autorité de certification a révoqué le certificat. - Trusted (Fiable): le certificat est valide et fiable. Pour qu'un objet SecureSocket puisse se connecter à un serveur, ce dernier doit dispose d'un certificat valide et fiable. - Unknown (Inconnu): l'objet SecureSocket n'a pas encore validé le certificat. La propriété serverCertificateStatus possède cet état avant que vous n'appeliez connect() et avant la distribution d'un événement connect ou ioError. - Untrusted signers (Signataires non fiables): le certificat ne fait pas partie d'une « chaine » de certificats racine fiables dans le magasin d'approbation de l'ordinateur client. L'établissement de communications avec un objet SecureSocket nécessite un serveur qui utilise un protocole sécurisé et possède un certificat valide et fiable. A d'autres égards, l'utilisation d'un objet SecureSocket s'apparente à celle d'un objet Socket. L'objet SecureSocket n'est pas pris en charge par toutes les plates-formes. Faites appel à la propriété isSupported de la classe SecureSocket pour vérifier si le moteur d'exécution gère l'utilisation de l'objet SecureSocket sur l'ordinateur client actif. Pour plus d'informations, voir : - SecureSocket - CertificateStatus - DataInput - IDataOutput - Evénement socketData

Exemple de socket TCP : création d'un client Telnet

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures L'exemple Telnet illustrer les techniques de connexion à un serveur distant et de transmission des données à l'aide de la classe Socket. Cet exemple étudie les techniques suivantes : - Création d'un client Telnet personnelé à l'aide de la classe Socket - Envoi de texte au serveur distant à l'aide de l'objet ByteArray - Gestion des données reçues d'un serveur distant Pour obtenir les fichiers d'application de cet exemple, voir www.adobe.com/go/learn_programmingAS3samplesflash_fr. Les fichiers d'application Telnet se trouvent dans le dossier Samples/Telnet. L'application se compose des fichiers suivants:
FichierDescription
TelnetSocket.fla ou TelnetSocket.mxmlFichier d'application principal correspondant à l'interface utilisateur de Flex (MXML) ou Flash (FLA).
TelnetSocket.asClasse Document fournissant la logique de l'interface utilisateur (Flash uniquement).
com/example/programmingas3/Telnet/Telnet.asFournit la fonctionnalité client Telnet à l'application, par exemple pour la connexion à un serveur distant et l'envoi, la réception et l'affichage des données.

Présentation de l'application socket Telnet

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Le fichier principal TelnetSocket.mxml se charge de creer l'interface utiliseur (IU) de l'application entiere. Outre l'IU, ce filchier definit deux methodos, login() et sendCommand(), qui permettent la connexion de l'utilisateur au serveur spécifique. L'exemple suivant répertorie le code ActionScript du fichier d'application principal : import com.example(programmingas3(socket.Telnet; private var telnetClient:Telnet; private function connect():void { telnetClient = new Telnet(serverName.text,int.portNumber.text),output); console.title = "Connecting to " + serverName.text ^+ "" ^+ portNumber.text; console.enabled = true; } private function sendCommand():void { varba:ByteArray = newByteArray(); ba.writeMultiByte command.text ^+ "\n","UTF-8"); telnetClient.writeBytesToSocket (ba); command.text = ""; } La première ligne de code imports the class Telnet a part of its package personalised com.example.programmingas(socket. La deuxième ligne de code déclaré une occurrence de la classe Telnet, telnetClient, qui est initiaisée ultérieurement par la méthode connect(). Ensuite, la méthode connect() est déclarée et initiaise la variable telnetClient déclaréeAAParavant. Cette méthode transmet le nom du serveur Telnet spécifique par l'utilisateur, le port de ce serveur et une reférence à un composant TextArea dans la liste d'affichage, qui sert à afficher les réponses textuelles reçues du serveur socket. Les deux dernières lignes de la méthode connect() définissent la propriété title du composant Panel et active celui-ci, ce qui permet à l'utilisateur d'envoyer les données au serveur distant. La méthode finale du filchier d'application principal, sendCommand(), permet d'envoyer les commandes de l'utilisateur au serveur distant sous forme d'objet ByteArray.

Présentation de la classe Telnet

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures La classe Telnet se charge d'établier la connexion au serveur distant Telnet et d'envoyer et de receivevoir les données. La classe Telnet déclare les variables privées suivantes : private var serverURL:String; private var portNumber:int; private var socket:Socket; private var ta:TextArea; private var state:int = 0 La première variable, serverURL, contient l'adresse du serveur auquel se connecter, spécifiée par l'utilisateur. La deuxieme variable, portNumber, correspond au numero de port sur lequel le serveur Telnet s'exécute actuellément. Par défaut, le service Telnet utilise le port 23. La troisième variable, socket, est une occurrence de Socket qui tente d'étabir une connexion au serveur défini par les variables serverURL et portNumber. La quatrième variable, ta, est une reférence à l'occurrence du composant TextArea sur la scène. Ce composant sert à afficher les réponses provenant du serveur Telnet distant ou les événuels messages d'erreur. La dernière variable, state, est une valeur numérique utilise pour déterminer les options prises en charge par le client Telnet. Comme vous l'avez vu precedemment, la fonction constructeur de la classe Telnet est appelée par la méthode connect() dans le fichier d'application principal. Le constructeur Telnet prend trois paramètres : server, port et output. Les paramètres server et port spécifient le nom et le numéro de port du serveur Telnet. Le dernier paramètre, output, est une référence à une occurrence du composant TextArea sur la scene où s'affichent les résultats du serveur à l'intention de l'utilisateur. public function Telnet(server:String, port:int, output:TextArea) { serverURL = server; portNumber = port; ta = output; socket = new Socket(); socket.addEventListener(Event.CONNECT, connectHandler); socket.addEventListener(Event.CLOSE, closeHandler); socket.addEventListener(ErrorEvent失误, errorHandler); socket.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler); socket.addEventListener(ProgressEvent.SOCKET_DATA, dataHandler); Security.loadPolicyFile("http://" + serverURL + "/crossdomain.xml"); try { msg("Trying to connect to " + serverURL +": " + portNumber + "\n"); socket.connect(serverURL, portNumber); } catch (error:Error) { msg(error.message + "\n"); socket.close(); } }

Ecriture de données dans un socket

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Pour écrire des données sur une connexion socket, vous appelez l'une des méthodes d'écriture de la classe Socket. Parmi ces méthodes d'écriture figurent writeBoolean(), writeByte(), writeBytes(), writeDouble(), etc. Purgez ensuite les données dans le tampon de sortie par le biais de la méthode flush(). Sur le serveur Telnet, les données sont écrites sur la connexion Socket à l'aide de la méthode writeBytes(), qui prend comme paramètre le tableau d'octets et l'envoie au tampon de sortie. La méthode writeBytesToSocket() se présente comme suit:
public function writeBytesToSocket (ba:ByteArray):void { socket.writeBytes (ba); socket.flush(); } 
Cette méthode est appelée par la méthode sendCommand() du fichier d'application principal.

Affichage des messages provenant du serveur socket

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Dès qu'un message est reçu du serveur socket ou qu'un événement se produit, la méthode personnalisée msg() est appelée. Cette méthode ajoute une chaine au composant TextViewa sur la scene et appelle une méthode setScroll() personnalisée, qui provoque le défilament vers le bas du composant TextViewa. La méthode msg() se présente comme suit : private function msg(value:String):void { ta.text + = value; setScroll(); } Si vous n'appliquez pas le défilament automatique au contenu du composant TextArea, les utilisateurs auront à le faire manuellement pour consulter la dernière réponse du serveur.

Défilament du contentu d'un composant TextArea

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures La méthode setScroll() contient une seule ligne de code ActionScript qui permet de fairedéfilier verticalément le contentu du composant TextArea de manière que l'utilisateur puisse voir la dernière ligne de texte renvoyé. L'extrait de code suivant illustré la méthode setScroll(): public function setScroll():void { ta(verticalScrollPosition = ta.maxVerticalScrollPosition; } Cette méthode définit la propriété verticalScrollPosition, qui correspond au numéro de la ligne de caractère supérieure actuèlement affichée, puis lui attribue la valeur de la propriété maxVerticalScrollPosition.

SocketsXML

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Un socket XML permet de creer une connexion à un serveur distant qui demeure ouverte jusqu'à ce qu'elle soit explicitement fermée. Vous pouze échanger des données au format chaine (XML, par exemple) entre le serveur et le client. L'utilisation d'un serveur socket XML présente l'avantage de ne pas imposer au client de demander explicitement les données. Le serveur peut envoyer des données sans attendre de demande à chaque client connecté. Dans Flash Player et les contenus Adobe AIR situés hors du sandbox d'application, les connexions socket XML nécessitant la présence d'un fisquier de régulation socket sur le serveur cible. Pour plus d'informations, voir « Contrôleurs de site Web (fichiers de régulation) » à la page 1095 et « Connexion aux sockets » à la page 1114. La classe XMLHttpRequest ne peut pas automatiquement tunneler à travers les pare-feux car, contrairement au protocole RTMP (Real-Time Messaging Protocol), le XMLHttpRequest n'a pas de capacité de tunneling HTTP. Si vousdezutiliser le tunneling HTTP, envisagez l'emploi de Flash Remoting ou Flash Media Server (qui prend en charge RTMP). Les restrictions suivantes indiquent comment et où le contenu situé dans Flash Player ou une application AIR hors du sandbox de sécurité de l'application peut utiliser un objet XMLHttpRequest pour se connecter au serveur : - Pour le contenu hors du sandbox de sécurité de l'application, la méthode XMLSocket.connect() peut se connecter uniquement aux numéroes de port TCP supérieurs ou égaux à 1024. En conséquence de cette restriction, les serveurs démon qui communiquent avec l'objet XMLSocket doivent également être affectés à des numéroes de port supérieurs ou égaux à 1024. Les ports dont le numéro est inférieur à 1024 sont souvent utilisés par des services du système, tels que FTP (21), Telnet (23), SMTP (25), HTTP (80) et POP3 (110), de sorte que les objets XMLSocket ne puissant pas y acceder pour des raisons de sécurité. La restriction du numéro de port limite les possibités d'accès à ces ressources et leur mauvaise utilisation. - Pour le contentu hors du sandbox de sécurité de l'application, la méthode XMLSocket.connect() peut se connecter uniquement aux ordinateurs dans le même domaine de résidence du contenu. (Cette restriction est identique aux règles de sécurité de URLLoader.load().) Pour se connecter à un serveur démon s'exécutant dans un domaine différent du domaine de résidence du contenu, vous pouze créé sur le serveur un fisier de régulation interdomaines qui permette un accès à partir de domaines spécifique. Pour plus d'informations sur les fisiers de régulation interdomaine, voir « Sécurité AIR » à la page 1122. Remarque : la configuration d'un serveur en vue de la communication avec un objet XMLHttpRequest peut etre dificile a réaliser. Si vous application ne requiert pas d'interactivite en temps reel, utilisez la classe URLsLoader, alotot que la classe XMLHttpRequest. VoupeusutiliserlesmethodesXMLSocket.connect()etXMLSocket.send()dela classeXMLSocket pour transférer un objet XML vers et a partir d'un serveur sur une connexion socket. La methodeXMLSocket.connect() établit une connexion socket avec le port d'un serveur Web. La methodeXMLSocket.send()transmet un objet XML au serveur spécifique dans la connexion socket. Lorsque you appelez la methode XMLSocket.connect(), l'application ouvre une connexion TCP/IP avec le serveur et garde cette connexion ouverte jusqu'à ce que l'un des événements suivants se produit : - La méthode XMLHttpRequest.close() de la classe XMLHttpRequest est appelée. - Il n'existe plus aucune référence à l'objet XMLHttpRequest. - Flash Player se ferme. - La connexion est interrompue (le modem est déconnecté, par exemple).

Connexion à un serveur par le biais de la classe XMLHttpRequest

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Pour creer une connexion socket, you devez creer une application cote serveur qui attend la demande de connexion socket et envoie une reponse à l'application Flash Player ou AIR. Ce type d'application cote serveur peut etre programme en AIR ou dans tout autre langage de programmation tel que Java, Python ou Perl. Pour utiliser la classe XMLSocket, l'ordinateur serveur doit executer un demon capable de dire le protocole simple utilise par la classe XMLSocket : - Les messages XML sont envoyés via une connexion socket à flux TCP/IP bidirectionnel simultané. - Chaque message XML est un document XML complet, terminé par un octet nul (0). - Un nombre illimité de messages XML peut être envoyé et reçu via une connexion XMLHttpRequest.

Création d'un serveur socket XML Java et connexion à ce serveur

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Le code suivant illustré un simple serveur XMLHttpRequest écrit en langage Java qui accepte les connexions entrantes et affichent les messages reçus dans la fenêtre d'invite de commande. Par défaut, un nouveau serveur est créé sur le port 8080 de votre machine locale, mais vous pouvez spécifique un numéro de port différent en lançant le serveur à partir de la ligne de commande. Creez un document texte et ajoutez-y le code suivant : import java.io.*; import java.net.*; class SimpleServer { private static SimpleServer server; ServerSocket socket; Socket incoming; BufferedReader readerIn; InputStream printOut; public static void main(String[] args) { int port = 8080; try { port = Integer.parseInt(args[0]); } catch (ArrayIndexOutOfBoundsException e) { // Catch exception and keep going. } server = new SimpleServer.port); } private SimpleServer(int port) { System.out.println(">>Starting SimpleServer"); try { socket = new ServerSocket port); incoming = socket.accept(); readerIn = new BufferedReader(new InputStreamReader(incoming.getInputStream()); printOut = new OutputStream(incoming.getOutputStream()); printOut.println("Enter EXIT to exit.\r"); out("Enter EXIT to exit.\r"); boolean done = false; while(!done) { String str = readerIn.readLine(); if(str = = null) { done = true; } else { out("Echo:" + str + "\r"); if(str.Trim().equals("EXIT")) { done = true; } } incoming.close(); } catch(Exception e) { System.out.println(e); } } private void out(String str) { println.println(str); System.out.println(str); } Enregistrez le document sur le disque dur sous le nom SimpleServer.java et compilez-le à l'aide d'un compiling Java, qui create un fisier de classe Java nommé SimpleServer.class. Vous pouvez lancer le serveur XMLHttpRequest via la ligne de commande en tapant java SimpleServer. Le fjichier SimpleServer.class peut se situer à tout emplacement sur l'ordinateur local ou le réseau ; il n'est pas nécessaire de le placer dans le réseau racine du serveur Web. ![](images/8a5f1c04e43c595170a01c87bbceb80858c1e6738648e70d655db3f7d77a0f46.jpg) si vous ne pouvez pas lancer le serveur parce que des fichiers ne se trouvent pas dans le chemin de classe Java, essayez de le faire avec java -klasspath. SimpleServer. Pour étabir une connexion au serveur XMLHttpRequest à partir de l'application, vous doivent créé une nouvelle occurrences de la classe XMLHttpRequest et appeler la méthode XMLHttpRequest.connect() tout en transférant le nom d'hôte et le numéro de port, comme suit :
var xmlsock:XMLSocket = new XMLHttpRequest();  
xmlsock.connect("127.0.0.1", 8080); 
Dès que vous receivez des données du serveur, l'évenement data (flash.events.DataEvent.DATA) est distribué :
xmlsock.addEventListener(DataEvent.DATA, onData);  
private function onData(event:DataEvent):void {  
    trace("[ + event.type +"] + event.data);  
} 
Pour envoyer des données au serveur XMLHttpRequest, utilisez la méthode XMLHttpRequest. send() et transmettez un objet XML ou une chaîne. Flash Player convertit le paramètre fourni en objet String et envoie au serveur XMLHttpRequest son contenu suivi d'un octet nul (0): xmlsock.send xmlformattedData); La méthode XMLSocket.send() ne renvoie pas de valeur indiquant si les données ont bien ete transmises. Si une erreur se produit pendant la tentative d'envoi des données, une erreur IOError est renvoyee. ![](images/62f7d16bdcfe2a32077df45a4da610c35fa1aeeb22d5c2b0b69e45b5ff28ddfd.jpg) chaque message que vous envoyez au serveur socket doit se terminer par un caractère de changement de ligne (\n). Pour plus d'informations, voir XMLHttpRequest.

Sockets de serveur

Adobe AIR 2 et ultérieur

La classe ServerSocket permet d'autoriser d'autres processus à se connecter à l'application par le biais d'un socket TCP (Transport Control Protocol). Le processus de connexion peut s'exéçuter sur l'ordinateur local ou un autre ordinateur connecté au réseau. Lorsqu'un objet ServerSocket reçoit une demande de connexion, il distribue un événement connect. L'objet ServerSocketConnectEvent distribué avec l'évenement contient un objet Socket. Cet objet permet de communiquer ultérieurement avec l'autre processus. Pour écouter les connexions socket entrantes : 1 Creez un objet ServerSocket et liez-le à un port local. 2 Ajouteurs d'évenements associés à l'évenement connect. 3 Appelez la méthode listen(). 4 Répondez à l'évenement connect, qui fournit un object Socket pour chaque connexion entrante. L'objet ServerSocket continue à écouter les nouvelles connexions jusqu'à ce que vous appeliez la méthode close(). L'exemple de code suivant illustré la création d'une application de serveur socket. L'exemple écoute les connexions entrantes sur le port 8087. Lorsqu'une connexion est reçue, l'exemple envoie un message (la chaine « Connected ») au socket client. Le serveur renvoie désormais tout message reçu au client.
package   
{ import flash.display.Sprite; import flash.events.Event; import flash.events.IOErrorEvent; import flash.eventsProgressEvent; import flash.events.ServerSocketConnectEvent; import flash.net_serversocket; import flash.net.Socket; public class ServerSocketExample extends Sprite { private var serverSocket:ServerSocket; private var clientSockets:Array = new Array(); public function ServerSocketExample() { try { // Create the server socket serverSocket = new ServerSocket(); // Add the event listener serverSocket.addEventListener(Event.CONNECT, connectHandler); serverSocket.addEventListener(Event.CLOSE, onClose); // Bind to local port 8087 serverSocket.bind(8087, "127.0.0.1"); // Listen for connections serverSocket.listen(); trace("Listening on" + serverSocket.localPort); } catch(e:SecurityError) { trace(e); } } public function connectHandler(event:ServerSocketConnectEvent):void { //The socket is provided by the event object var socket:Socket = event;socket; clientSockets.push(socket); socket.addEventListener ProgressEvent.SOCKET_DATA, socketDataHandler); socket.addEventListener Event.CLOSE, onClientClose); socket.addEventListener(IOErrorEvent.IO_ERROR, onIOError); //Send a connect message socket.writeUTFBytes("Connected "); socket.flush(); trace("Sending connect message"); } 
public function socketDataHandler(event:ProgressEvent):void { var socket:Socket = event.target as Socket //Read the message from the socket var message:String = socket.readUTFBytes( socket.bytesAvailable); trace("Received:" + message); // Echo the received message back to the sender message = "Echo -- " + message; socket.writeUTFBytes(message); socket.flush(); trace("Sending:" + message); } private function onClientClose(event:Event):void { trace("Connection to client closed."); //Should also remove from clientSockets array... } private function onIOError(errorEvent:IOErrorEvent):void { trace("IOError:" + errorEvent.text); } private function onClose(event:Event):void { trace("Server socket closed by OS."); } } Pour plus d'informations, voir : ServerSocket - ServerSocketConnectEvent - Socket

Sockets UDP (AIR)

Adobe AIR 2 et ultérieur

Le protocole UDP (Universal Datagram Protocol) permet d'échanger des messages via une connexion réseau sans état. Non seulement UDP ne garantit pas la livraison dans l'ordre des messages, mais il ne peut pas se porter garant qu'ils soient livrés. Si UDP est activé, le code réseau du système d'exploitation consacre généralement moins de temps à la mise en ordre, au suivi et à la confirmation des messages. Par conséquent, les messages UDP sont le plus souvent livrés à l'application de destination plusrapidement que les messages TCP. Les communications de type sockets UDP s'avent utiles lorsque vous devez envoyer des informations en temps réel telles qu'une actualisation des positions dans le cadre d'un jeu ou des paquets son dans une application de conversation vocale. Dans les applications de ce type, un certain pourcentage de perte de données est acceptable et une faible latence de transmission prime sur la livraison garantie. Dans quasiment tous les autres cas de figure, il est préférible d'utiliser les sockets TCP. L'application AIR peut envoyer et receivevoir des messages UDP à l'aide des classes DatagramSocket et DatagramSocketDataEvent. Pour envoyer ou receivevoir un message UDP : 1 Creez un objet DatagramSocket. 2 Ajoutez un écouteur d'événements associé à l'événement data. 3 Liez le socket à une adresse IP locale et à un port par le biais de la méthode bind(). 4 Envoyez des messages en appelant la methode send() et en transmettant l'adresse IP et le port de l'ordinateur cible. 5 Répondez à l'évenement data pour receivevoir des messages. L'objet DatagramSocketDataEvent distribué pour cet événement contient unobjet ByteArray dans lequel figurent les données du message. L'exemple de code suivant illustrer l'envoi et la réception de messages UDP par une application. L'exemple envoie un message simple contenant la chaine « Hello. » à l'ordinateur cible. Il effectue également le suivi du contentu de tout message reçu. package { import flash.display.Sprite; import flash.events.DatagramSocketDataEvent; import flash.events.Event; import flash.net.DatagramSocket; import flash.utils.ByteArray; public class DatagramSocketExample extends Sprite { private var DatagramSocket:DatagramSocket; //The IP and port for this computer private var localIP:String = "192.168.0.1"; private var localPort:int = 55555 //The IP and port for the target computer private var targetIP:String = "192.168.0.2"; private var targetPort:int = 55555 public function DatagramSocketExample() { //Create the socket datagramSocket new DatagramSocket(); datagramSocket.addEventListener(DatagramSocketDataEvent.DATA, dataReceived); //Bind the socket to the local network interface and port
datagramSocket.bind(localPort, localIP);
//Listen for incoming datagrams
datagramSocket.receive();
//Create a message in aByteArray
var data:ByteArray = newByteArray();
data.writeUTFBytes("Hello.")
//Send the datagram message
datagramSocket.send(data, 0, 0, targetIP, targetPort);
}
private function dataReceived(event: DatagramSocketDataEvent):void
{
    //Read the data from the datagram
    trace("Received from " + event.srcAddress + ":" + event.srcPort + "> " +
        event.data.readUTFBytes(event.data.bytesAvailable));
} 
Tenez compte des considérations suivantes si vous utilise des sockets UDP : - Un paquet unique de données ne doit pas excéder l'unité maximal de transmission générée par l'interface réseau ou tout nœud réseau entre l'expéditeur et le destinataire. L'intégrality des données de l'objet ByteArray transmise à la méthode send() est envoyée sous forme de paquet unique. (Dans TCP, les messages volumineux sont divisés en plusieurs paquets distincts.) - Il ne se produit pas de négociation entre l'expéditeur et la cible. Les messages sont ignorés sans générer d'erreur si la cible n'este pas ou qu'aucun écouteur actif n'est défini sur le port indiqué. - Si vous faites appel à la méthode connect(), les messages issus d'autres sources sont ignorés. Une connexion UDP assure un filtrage des paquets uniquement. Cela ne signifie pas nécessairement qu'un processus d'écoute valide soit déployé à l'adresse et sur le port cibles. - Le traffic UDP risque de submerger un réseau. En cas d'encombrement réseau, les administrateurs réseau sont parfoids appelés àmettre en œuvre des contrôleles de qualité de service. (TCP intégre des fonctions de régulation de la circulation en vue de réduire l'impact de l'encombrement réseau.) Pour plus d'informations, voir : - DatagramSocket - DatagramSocketDataEvent - ByteArray

Adresses IPv6

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Flash Player 9.0.115.0 (et versions ultérieures) prennt en charge IPv6 (Internet Protocol version 6). IPv6 est une version du protocole IP (Internet Protocol) qui prend en charge les adresses 128 bits (amélioration du protocole IPv4 précédent qui prend en charge les adresses 32 bits). Vous devrez peut-être activer IPv6 sur vos interfaces de mise en réseau. Pour plus d'informations, voir l'Aide du système d'exploitation hébergeant les données. Si IPv6 est pris en charge sur le système hébergeant, vous pouvez spécifique des adresses litterées IPv6 numériques dans les URL entre crochets ([]), comme suit : [2001:db8:ccc3:ffff:0:444d:555e:666f] Flash Player renvoie les valeurs IPv6 litteraires selon les règles suivantes : - Flash Player renvoie la forme complète de la chaine pour les addresses IPv6. - La valeur IP ne possède pas d'abréviations à deux-points redoubés ( ::). - Les chiffres hexadécimaux sont en bas de casse seulement. - Les adresses IPv6 sont entourées de crochets ([]). - Chaque quatuor d'adresses est représenté par 0 à 4 chiffres hexadécimaux, sans zéros non significatifs. - Un quatuor d'adresses de zéros est représenté par un seul zéro (et pas un caractère de deux-points redouble), sauf dans les cas suivants. Les valeurs IPv6 que renvoie Flash Player sont soumises aux exceptions suivantes : - Une adresse IPv6 non spécifiée (rien que des zéros) est représentée par [::]. - L'adresse de bouclage (loopback) ou localhost IPv6 est représentée par [::1]. - Les adresses mappées en IPv4 (converties en IPv6) sont représentées par [::ffff:a.b.c.d], où a.b.c.d constitue une valeur décimale à points (dotted-decimal) IPv4 classe. - Les adresses compatibles avec IPv4 sont représentées par [::a.b.c.d], où a.b.c.d est une valeur décimale à points (dotted-decimal) IPv4 classe.

Chapitre 44 : Communications HTTP

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Les applications Adobe® AIR® et Adobe® Flash® Player peuvent communiquer avec les serveurs HTTP pour charger des données, des images, des videos et échanger des messages.

Voir aussi

flash.net URLsLoader flash.net URLsStream flash.net(URLRequest flash.net URLsRequestDefaults flash.net(URLRequestHeader flash.net URLsRequestMethod flash.net URLsVariables

Chargement de données externes

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures ActionScript 3.0 comprend des mécanismes permettant de charger des données depuis des sources externes. Ces sources peuvent fournir un contenu statique, tel que des fichiers texte, ou un contenu dynamique génére par un script Web. Les données peuvent être formées de plusieurs façon, et ActionScript propose une fonctionnalité permettant de décoder les données et d'y acceder. Vous pouvez également envoyer des données au serveur exter le lors de leur récapuration.

Utilisation de la classe URLRequest

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Un grand nombre d'API qui charge des données externes font appel à la classe URLRequest pour définir les propriétés de la requête réseau requise.

Propriétés de la classe URLRequest

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Yououpouvezdéfinirlespropriétéssuivantesd'unobjetURLRequest dans tout sandbox de sécurité:
PropriétéDescription
��faceTypeType de contenu MIME des données envoyées avec la requête d'URL. Si contentType n'est pas défièni, les valeurs sont envoyées sous la forme application/x-ww-form-urls-encoded.
dataObjet contenant des données à transmettre avec la demande d'URL.
digestChaine qui identifie de manière unique le composant de la plate-forme Adobe signé à enregistrer dans (ou extraire de) la mémoire cache d'Adobe® Flash® Player.
methodMéthode de requête HTTP, telle que GET ou POST. (Le contenu s'exécutant dans le domaine de sécurité de l'application AIR peut spécifique des chaînes autres que "GET" ou "POST" comme propriété method. Tous les verbes HTTP sont autorisés et "GET" est la méthode par défaut. Voir « Sécurité AIR » à la page 1122.)
requestHeadersTableau d'en-tête de requête HTTP à ajouter à la fin de la requête HTTP. Notez que l'autorisation de définir certains en-têtes est restreinte dans Flash Player, ainsi que dans un contenu AIR qui s'exécate en dehors du sandbox de sécurité d'application.
urlSpécifie l'URL qui fait l'objet de la requête.
AIR permit de définir d'autres propriétés de la classe URLRequest, dont ne dispose que le contenu AIR qui s'exécute dans le sandbox de sécurité d'application. Le contenu du sandbox d'application peut également définir des URLs à l'aide des nouveaux modèles d'URL (parallaxément aux modèles standard tels que file et http).
PropriétéDescription
followRedirectsIndique si des redirections sont utilisées (true, valeur par défaut) ou non (false). La définition de cette propriété n'est générée que dans le sandbox d'une application AIR.
manageCookiesIndique si la pile du protocole HTTP doit:gérer les cookies (true, valeur par défaut) ou non (false) pour cette requête. La définition de cette propriété n'est:gérer que dans le sandbox d'une application AIR.
authenticatedIndique si les requêtes d'authentication doivent êtretraitées(true) pour cette requête. La définition de cette propriété n'est:gérer que dans le sandbox d'une application AIR. Par défaut, les requêtes sont authentifiées; il est par conséquent possible qu'une boîte de dialogue d'authentication s'affiche si le serveur requiert des informations d'identification. Vous pouvez également définir le nom d'utilisateur et le mot de passer par le biais de la classe URLRequestDefaults (voir « Définition des paramètres par défaut des objets URLRequest (AIR unquivalent) » à la page 844).
cacheResponseIndique si les données de réponse doivent être mises en mémoire cache pour cette requête. La définition de cette propriété n'est:gérer que dans le sandbox d'une application AIR. Par défaut, la réponse est mise en mémoire cache (true).
useCacheIndique si le cache local doit être consulté avant que la classe URLRequest recupère les données. La définition de cette propriété n'est:gérer que dans le sandbox d'une application AIR. Par défaut, le cache local doit être utilisé, s'il est disponible (true).
userAgentIndique la chaîne agent utilisateur à utiliser dans la requête HTTP.
Remarque : la classe HTMLLoader possède des propriétés associées pour les paramètres associés au contenu charge par un objet HTMLLoader. Pour plus d'informations, voir « A propos de la classe HTMLLoader » à la page 1019.

Définition des paramètres par défaut des objets URLRequest (AIR uniquement)

Adobe AIR 1.0 et les versions ultérieures

La classe URLRequestDefaults permet de définir les paramètres par défaut propres à une application des objets URLRequest. Par exemple, le code suivant définit les valeurs par défaut des propriétés manageCookies et useCache. Tous les nouveaux objets URLRequest utiliseront les valeurs spécifiées de ces propriétés au lieu des valeurs par défaut standard : URLRequestDefaults/manageCookies = false; URLRequestDefaults.useCache = false; Remarque : la classe URLRequestDefaults est réservée au contenu qui s'exécute dans Adobe AIR. Elle n'est pas prise en charge dans Flash Player. La classe URLRequestDefaults inclut une méthode setLoginCredentialsForHost() qui vous permet de spécifique un nom d'utilisateur et un mot de passer par défaut pour un hôte spécifique. L'hote, défini dans le paramètre hostname de la méthode, peut être un domaine, tel que "www.example.com", ou un domaine et un numéro de port, par exemple "www.example.com:80". Notez que "example.com", "www.example.com" et "sales.example.com" sont considérés comme hôtes-Uniques. Ces informations d'identification ne sont utilisées que lorsque le serveur les demande. Si l'utilisateur s'est déjà authentifié (à l'aide de la boite de dialogue d'authentication, par exemple), appeler la méthode setLoginCredentialsForHost() ne modifie pas l'utilisateur authenticate. Le code suivant permet de définir le nom d'utilisateur et le mot de passer par défaut à utiliser pour les requêtes envoyées à www.example.com : URLRequestDefaults.setLoginCredentialsForHost("www.example.com", "Ada", "love1816$X"); Les paramètres URLRequestDefaults ne s'appliquent qu'au domaine d'application actuel, à une exception près. Les informations d'identification transmises à la méthode setLoginCredentialsForHost() sont utilisées pour les requêtes effectuées dans tout domaine de l'application AIR. Pour plus d'informations, voir la classe URLRequestDefaults dans le manuel Guide de reférence ActionScript 3.0 pour la plate-forme Adobe Flash.

Modèles d'URI

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Les modèles d'URI standard, tel le modèle ci-dessous, peuvent être utilisés dans les requêtes effectuees à partir de tout sandbox de sécurité :

http: et https:

A utiliser pour les URL Internet standard ( comme elles sont utilisées dans un navigateur Web).

file:

Utilisez file: pour spécifique l'URL d'un fjichier qui resides dans le système de fjichiers local. Exemple : file:///c:/AIR Test/test.txt Dans AIR, vous disposez également des modèles suivants lorsque vous définisse l'URL d'un contenu s'exécutant dans le sandbox de sécurité de l'application :

app:

Le modele app:permét de spécifier un chemin relatif au repertoire racine de l'application installée.Par exemple,le chemin suivant pointe vers un sous-repertoire de ressources du repertoire de l'application instalée: app:/resources Lorsqu'une application AIR est lancée à l'aide de l'application de débogage du lanceur AIR (ADL), le repertoire d'application correspond à celui qui contient le fichier descriptor d'application. L'URL (et la propriété url) d'un objet File créé avec File.applicationDirectory fait appel au modele d'URI app, comme dans l'exemple suivant :
var dir:File = File.applicationDirectory;  
dir = dir ResolvePath("assets");  
trace(dir.url); // app:/assets 

app-storage:

Le modele app:storage permet de spécifier un chemin relatif au repertoire de stockage de données de l'application. Pour chaque application installee (et utiliseur), AIR create un repertoire de stockage d'application unique. Cet emplacement est utile pour stocker des données spécifiques à l'application concernée. Par exemple, le chemin suivant pointe vers le fichier refs.xml, qui reside dans le sous-répertoire settings du repertoire de stockage de l'application :
app-storage:/settings/preferences.xml 
L'URL (et la propriété url) d'un objet File créé avec File.applicationStorageDirectory utilise le modèle d'URI app-storage, comme suit :
var prefersFile:File = File.applicationStorageDirectory;  
prefsFile = prefersFileresolvePath("prefs.xml");  
trace(dir prefectsFile); // app-storage:/prefs.xml 

mailto :

Vousspuvezutiliserlemodelemailto danslesobjetsURLRequesttransmisàlafonctionnavigateToURL().Voir «Ouvertured'uneURL dansuneautreapplication»àla page860. Vous pouvez faire appel à un objet URLRequest basé sur l'un de ces modèles d'URI pour définir la requête d'URL d'un certain nombre d'objets, tels qu'un objet FileStream ou Sound. Vous pouvez par ailleurs utiliser ces modèles dans le contenu HTML qui s'exécute dans AIR. Il est ainsi possible d'y faire appel dans l'attribut src d'une balise img. Néanmoins, vous ne pouvez utiliser ces modèles d'URI spécifique à AIR (app: et app-storage:) que dans le contenu du sandbox de sécurité de l'application. Pour plus d'informations, voir « Sécurité AIR » à la page 1122.

Définition des variables URL

Bien qu'il soit possible d'ajouter directement des variables à la chaine de l'URL, il s'avéré souvent plus facile de définir toute variable requise par une requête à l'aide de la classe URLs Variables. Les méthodes permettant d'ajouter des paramètres à un objet URLsvariables sont au nombre de trois : Au sein du constructeur URLsVariables - A l'aide de la méthode URLsVariablesdecode() - Sous forme de propriétés dynamiques de l'objet URLs Variables en tant que tel L'exemple suivant illustrer les trois méthodes et indique comment affecter les variables à un objet URLRequest : varurlVar:URLVariables new URLVariables("one = 1&two = 2" ); urlVardecode("amp = " + encodeURIComponent( "&") ); urlVar.three = 3 : urlVar.amp2 = "&"; trace(urlVar.toString(); //amp=%26&2=%26%26&one = 1&two = 2&three = 3 varurlRequest:URLRequest newURLRequest("http://www.example.com/test.cfm");urlRequest.data urlVar; Lorsque vous définisse des variables au sein du constructeur URLVariables ou à l'aide de la méthode URLVariablesdecode(), voirlez à coder au format URL les caractères dont la signification est particulièrement dans une chaine d'URI. Ainsi, lorsque vous insérez une esperluette dans un nom de paramètre ou une valeur, vousdez la coder de sorte à remplacer & par %26, car l'esperluette fait office de délimueur de paramètres. Vous disposez à cet effet de la fonction de niveau supérieur encodeURIComponent().

Utilisation de la classe URLsLoader

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures La classe URLsLoader permet d'envoyer une requête à un serveur et d'acceder aux informations renvoyées. Vous disposez également de la classe URLsLoader pour acceder aux fischiers du système de fischiers local dans les contexts où l'accès aux fischiers locaux est autorisé (le sandbox local avec système de fischiers de Flash Player et le sandbox d'application AIR, par exemple). La classe URLsLoader télécharge des données à partir d'une URL sous forme de texte, de données binaires ou de variables codées au format URL. La classe URLsLoader distribue des événements tels que complete, httpStatus, ioError, open, progress et securityError. Le modele de gestion des événements d'ActionScript 3.0 est sensiblement différent du modele d'ActionScript 2.0, qui utilise les gestionnaires d'évenement LoadVars.onData, LoadVars.onHTTStatus et LoadVars.onLoad. Pour plus d'informations sur la gestion des événements en ActionScript 3.0, voir « Gestion des événements » à la page 129. Les données teléchargees ne sont pas disponibles tant que le teléchargement n'est pas terminé. Pour surveiller la progression du teléchargement (nombre d'octets charges et nombre total d'octets), écoutez la distribution de l'évenement progress. Toutefois, si le chargement d'un fisier est rapide, l'évenement progress risque de ne pas être distribué. Une fois que le teléchargement d'un fisier est terminé, l'évenement complete est distribué. En définissant la propriété dataFormat de la classe URLsLoader, vous pouvez receiveoir les données sous forme de texte, de données binaires brutes ou d'objet URLsVariables. La méthode URLLoader.load() (et éventuèlement le constructeur de la classe URLsLoader) gère un seul paramètre, request, qui correspond à unobjetURLRequest. UnobjetURLRequest contient toutes les informations d'une requête HTTP unique, telles que l'URL cible, la méthode de requête (GET ou POST), d'autres informations d'en-tête et le type MIME. Pour charger un paquet XML dans un script cote serveur, par exemple, vous pouvez utiliser le code ci-après : var secondsUTC:Number = new Date().time; var dataXML:XML ; var request:URLRequest = new URLRequest("http://www.yourdomain.com/time.cfm"); requestContentType = "text/xml"; request.data = dataXML.toXMLString(); request.method = URLRequestMethod.END; var loader:URLLoader = new URLLoader(); loader.load(request); L'extrait ci-dessus create un document XML appelé dataXML, qui contient le paquet XML à envoyer au serveur. L'exemple définit la propriété contentType de l'objet URLsRequest sur "text/xml" et affecte le document XML à la propriété data de l'objet URLsRequest. Il creé enfin un objet URLLoader et envoie la requête au script distant par le biais de la méthode load().

Utilisation de la classe URLsStream

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures La classe URLsStream permet d'acceder aux données en cours de téléchargement au fur et à mesure de leur arrivée. Elle permet également de fermer un flux continu avant la fin du téléchargement. Les données teléchargées sont disponibles au format binaire brut. Lorsque vous lisez les données issues d'un objet URLSream, faites appel à la propriété bytesAvailable pour déterminer si les données disponibles sont suffisantes avant de les dire. Une exception EOFError est renvoyée si vous essayez de dire des données qui ne sont pas disponibles.

Evénement httpResponseStatus (AIR)

Dans Adobe AIR, la classe URLSream distribue un événement httpResponseStatus en plus de l' événement httpStatus. L'évenement httpResponseStatus est envoyé avant toute donnée de réponse. L'évenement httpResponseStatus (représenté par la classe HTTPStatusEvent) inclut une propriété responseURL, qui correspond à l'URL que la réponse a renvoyée, et une propriété responseHeaders, qui est un tableau d'objects URLRequestHeader représentant les en-têtes de réponse que la réponse a renvoyés.

Chargement de données à partir de documents externes

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Lorsque vous programmesz des applications dynamiques, il peut s'aver utile de charger des données issues de fichiers externes ou de scripts cote serveur. Vous pouvez ainsi programmermer des applications dynamiques sans avoir à les modifier ou les recompiler. Par exemple, si vous creez une application « conseil du jour», vous pouvez écrire un script cote serveur qui récapère un conseil au hasard dans une base de données et l'enregistre dans un fichier texte une fois par jour. Notre application peut ensuite charger le contenu du fichier texte statique au lieu d'envoyer une requête à la base de données à chaque fois. L'extrait de code suivant create un objet URLsRequest et URLsLoader, qui charge le contenu d'un fichier texte externenommé params.txt :
var request:URLRequest = new URLRequest("params.txt");  
var loader:URLLoader = new URLLoader();  
loader.load(request); 
Par défaut, si vous ne définisse aucune méthode de requête, Flash Player et AIR chargent le contenu à l'aide de la méthode HTTP GET. Pour envoyer la requête avec la méthode POST, définisse la propriété request.method sur POST à l'aide de la constante statique URLRequestMethod.post, comme l'illustré le code suivant:
var request:URLRequest = new URLRequest("sendfeedback.cfm"); request.method = URLRequestMethod.POST; 
Le document externe, params.txt, charge au moment de l'execution, contient les données suivantes :
monthNames=January, February, March, April, May, June, July, August, September, October, November, December&dayNames=Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday 
Le fjichier contient deux paramètres, monthNames et dayNames. Chacun des paramètres contient une liste séparée par des virgules qui est analysée sous forme de chaine. Vous pouvez transformer cette liste en tableau à l'aide de la méthode String.split(). Evitez d'utiliser des mots réservés ou des éléments de langage comme noms de variables dans les fichiers de données externes, car cela complique la lecture et le débogage du code. Une fois les données chargées, l'évenement complete est distribué et le contenu du document externe peut alors être utilisé dans la propriété data de URLsLoader, comme l'illustré le code suivant :
function completeHandler(event)  
{  
    var loader2 = event.target;  
    air.traceloader2.data);  
} 
Si le document distant contient des paires nom-valeur, vous pouze analyser les données à l'aide de la classe URLVariables en transmettant le content du fjichier chargé, comme suit : private function completeHandler(event:Event):void { var loader2:URLLoader = URLLoader(event.target); var variables:URLVariables = new URLVariablesloader2.data); trace(variables.dayNames); } Chaque paire nom-valeur issue du fichier externe devient une nouvelle propriété de l'objet URLs Variables. Chaque propriété de cet objet dans l'exemple de code precedent est traité comme une chaine. Si la valeur de la paire nom-valeur est une liste d' éléments, vous pouvez convertir la chaine en tableau en appelant la méthode String.split(), comme suit :
var dayNameArray: Array = variables.dayNames.split("\\"); 
Si you chargez des données numériques à partir de fichiers externes, convertissez-les en valeurs numériques à l'aide d'une fonction de niveau supérieur, telle que int(), uint() ou Number(). Au lieu de charger le contenu du fjichier distant sous forme de chaîne et de créé un objet URLsvariables, vous pouvez attribuer à la propriété URLLoader.dataFormat la valeur de l'une des propriétés statiques de la classe URLLoaderDataFormat. Les trois valeurs possibles de la propriété URLLoader.dataFormat sont les suivantes : - URLLoaderDataFormat.BINARY: la propriété URLLoader.data contient des données binaires stockées dans un objet ByteArray. - URLsLoaderDataFormat.TXT: la propriété URLsLoader.data contient du texte sous forme d'objet String. - URLsLoaderDataFormat.VARIABLES: la propriété URLsLoader.data contient des variables encodées au format URL issues d'un objet URLsVariables. Le code suivant montre comment vous pouvez automatiquement analyser les données chargeses dans un objet URLVariables en attribuant à la propriété URLLoader.dataFormat la valeur URLLoaderDataFormat.VARIABLES. package { import flash.display.Sprite; import flash.events.*; import flash.net URLsLoader; import flash.net URLsLoaderDataFormat; import flash.net(URLRequest; public class URLsLoaderDataFormatExample extends Sprite { public function URLsLoaderDataFormatExample() { var request:URLRequest = new URLRequest("http://www.[yourdomain].com/params.txt"); var variables:URLLoader = new URLLoader(); variables.dataFormat = URLsLoaderDataFormat.VARIABLES; variables.addEventListener(Event.COMPLETET,completeHandler); try { variables.load(request); } catch (error:Error) { trace("Unable to load URL:" ^+ error); } } private function completeHandler(event:Event):void { var loader:URLLoader = URLsLoader(event.target); trace(loaders.dayNames); } } Remarque: la valeur par défaut de URLLoader.dataFormat est URLLoaderDataFormat.TXT. Comme le montre l'exemple suivant, le chargement de données XML à partir d'un fjichier exter s'effectue comme le chargement de données URLs Variables. Vous pouvez creer une occurence d'URLRequest et une occurence d'URLLoader et vous en servir pour tlécharger un document XML distant. Lorsque le fjichier est complètement tléchége, l'évenement Event. COMPLETE est distribué et le contenu du fjichier exter est converti en occurrence de XML, que vous pouvez analyser avec les méthodes et propriétés XML. package { import flash.display.Sprite; import flash.errors.*; import flash.events.*; import flash.net URLsLoader; import flash.net(URLRequest; public class ExternalDocs extends Sprite { public function ExternalDocs() { var request:URLRequest = new URLRequest("http://www.[yourdomain].com/data.xml"); var loader:URLLoader = new URLLoader(); loader.addEventListener(Event.COMPLET,completeHandler); try { loader.load(request); } catch (error:ArgumentError) { trace("An ArgumentError has occurred."); } catch (error:SecurityError) { trace("A SecurityError has occurred."); } } private function completeHandler(event:Event):void { var dataXML:XML = XML(event.target.data); trace(dataXML.toString()); } }

Communication avec des scripts externes

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Outre le chargement de fichiers de données externes, la classe URLVariables permet d'envoyer des variables à un script côté serveur et de Traitser la réponse du serveur. Cela s'avère utile, par exemple, si vous programmez un jeu et souhaitez envoyer le score de l'utilisateur à un serveur afin de vérifier s'il faut l'ajouter à la liste des scores les plus élevés ; ou encore envoyer les informations de connexion de l'utilisateur au serveur pour validation. Un script côté serveur peut Traitser le nom d'utilisateur et le mot de passer, les comparer à une base de données et confirmer en retard la validité des informations fournies par l'utilisateur. L'extrait de code ci-après create un objet URLsVariables nommé variables, qui génére une nouvelle variable appelée name. Ensuite, un objet URLRequest est créé pour spécifique l'URL du script côté serveur à laquelle doit être envoyées les variables. Vous pouvez alors définir la propriété méthode de l'objet URLRequest pour envoyer les variables sous forme de requête HTTP POST. Pour ajouter l'objet URLsVariables à la requête URL, définiSEEz la propriété data de l'objet URLRequest sur l'objet URLsVariables créé plus+tôt. Enfin, l'occurrence de URLLLoader est créé et la méthode URLLLoader.load()appelee; cette dernière lance la requête.
var variables:URLVariables = new URLVariables("name=Franklin");  
var request:URLRequest = new URLLRequest();  
request.url = "http://www.[yourdomain].com/greeting.cfm";  
request.method = URLLRequestMethod.END;  
request.data = variables;  
var loader:URLLoder = new URLLoder();  
loader.dataFormat = URLLoderDataFormat.VARIABLES;  
loader.addEventListener(Event.COMPLET,completeHandler);  
try{  
    loader.load(request);  
}  
catch (error:Error) {  
    trace("Unable to load URL");  
}  
function completeHandler(event:Event):void{  
    trace(event.target.data/welcomeMessage);  
} 
Le code suivant reprend le contenu du document Adobe ColdFusion® greeting.cfm utilisé dans l'exemple précédent :
<cfif NOT IsDefined("Form.name") OR Len(Trim(Form.Name)) EQ 0> <cfset Form.Name = "Stranger" /> </cfif> <cfoutput>welcomeMessage=#UrlEncodedFormat("Welcome, " & Form.name)# </cfoutput> 

Requêtes de service Web

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Vou dispossez d'un large évendant de services Web HTTP. Les types principaux sont les suivants : REST XML-RPC - SOAP Pour appeler un service Web en ActionScript 3, vous creez un objet URLRequest, vous creez l'objet Web par le biais de variables URL ou d'un document XML, puis vous envoyez l'objet au service à l'aide d'un objet URLsaer. La structure Flex contient plusieurs classes qui facilitent l'utilisation des services Web, ce qui s'avere particulièrement utile pour acceder à des services SOAP complexes. Depuis Flash Professional CS3, vous pouvez faire appel aux classes Flex dans les applications développées dans Flash Professional et dans Flash Builder. Dans les applications AIR HTML, vous disposez des classes URLRequest et URLLoader ou de la classe XMLHttpRequest de JavaScript. Le cas échéant, vous pouvez également créé une bibliothèque SWF qui expose les composants du service Web de la structure Flex au code JavaScript. Si l'application s'exécut dans un navigateur, vous ne pouvez utiliser les services Web que s'ils tournent dans le même Domaine Internet que le fichier SWF appelant, sauf si le serveur qui héberge le service Web héberge également un fichier de régulation interdomaines qui autorise l'accès à partir d'autres domaines. Une technique souvent utilisée en l'absence d'un fichier de régulation interdomaines consiste àTRAitter par proxy les requêtes via votre propre serveur. Adobe Blaze DS et Adobe LiveCycle prenant en charge le traitement proxy des services Web. Dans les applications AIR, un fjichier de régulation interdomaines n'est pas obligatoire si l'appeu au service Web provient du sandbox de sécurité d'application. Un contenu d'application AIR n'est jamais transmis par un serveur qui réside dans un domaine distant. Il ne peut donc pas participer aux types d'attaques bloquées par les régulations interdomaines. Dans les applications AIR HTML, un contenu situé dans le sandbox de sécurité d'application peut générer des requêtes XMLHttpRequests interdomaines. Vous pouze autoriser un contenu situé dans d'autres sandbox de sécurité à générer des requêtes XMLHttpRequests interdomaines, sous réserve que le contenu soit charge dans un iframe.

Voir aussi

« Contrôles de site Web (fichiers de régulation) » à la page 1095 Adobe BlazeDS Adobe LiveCycle ES2 Architecture REST XML-RPC Protocole SOAP

Requêtes de service Web de type REST

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Les services Web de type REST font appel aux verbes d'une méthode HTTP pour désigner l'action de base et aux variables URL pour spécifique les détails correspondants. Ainsi, une requête visant à obtaining les données associées à un élément peut utiliser le verbe GET et les variables URL pour spécifique un nom de méthode et un ID d'objet. La chaine d'URL qui en résultat est similaire au code ci-dessous : http://service.example.com/?method getItem&id d3452 Pour acceder à un service Web de type REST en ActionScript, vous dispose des classes URLRequest, URLsVariables et URLLoader. Si le code JavaScript est intégré à une application AIR, vous pouvez également faire appel à une requête XMLHttpRequest. La programmation d'un appel au service Web de type REST en ActionScript implique généralement la procEDURE suivante : 1 Creez un objet URLRequest. 2 Associez l'URL du service et le verbe de la méthode HTTP à l'objet de la requête. 3 Creez un objet URLsvariables. 4 Définisse les paramètres de l'objet au service sous forme de propriétés dynamiques de l'objet variables. 5 Affectez l'objet variables à la propriété data de l'objet de la requête. 6 Envoyez l'appel au service à l'aide d'un objet URLsponder. 7 Gérez l'évenement complete distribué par l'objet URLsLoader qui indique que l'appel au service est terminé. Il est également commandé d'écouter les divers événements d'erreur susceptibles d'être distribués par un objet URLsLoader. Considérons par exemple un service Web exposant une méthode test qui renvoie les paramètres de l'appel au demandeur. Le code ActionScript suivant pourrait permettre d'appeler le service : import flash.events.Event; import flash.events.ErrorEvent; import flash.events.IOErrorEvent; import flash.events.SecurityErrorEvent; import flash.net URLsLoader; import flash.net(URLRequest; import flash.net(URLRequestMethod; import flash.net URLsVariables; private var requestor:URLLoader = new URLLoader(); public function restServiceCall():void { //Create the HTTP request object var request:URLRequest = new URLRequest("http://service.example.com/"); request.method = URLRequestMethod.GET; //Add the URL variables var variables:URLVariables new URLVariables(); variables.method = "test echoed"; variables api_key "123456ABC"; variables.message "Able was I, ere I saw Elba."; request.data = variables; //Initiate the transaction requestor = new URLsLoader(); requestor.addEventListener(Event.COMPLET, httpRequestComplete); requestor.addEventListener(IOErrorEvent.IOERROR, httpRequestError); requestor.addEventListener( SecurityErrorEvent.SECURITY_ERROR, httpRequestError); requestor.load(request); } private function httpRequestComplete(event:Event):void { trace(event.target.data); } private function httpRequestError(error:ErrorEvent):void{ trace("An error occured:" + error.message); } Si le code JavaScript est intégré à une application AIR, vous pouvez effectuer la même requête par le biais de l'objet XMLHttpRequest :
<html>
<head><title>RESTful web service request</title>
<script type="text/javascript">
function makeRequest()
{
    var requestDisplay = document.getElementById("request");
    var resultDisplay = document.getElementById("result");
    //Create a convenece object to hold the call properties
    var request = {};
    request(URL = "http://service.example.com/");
    request.method = "test. echo";
    request.HTPmethod = "GET";
    request.params = {};
    request.params api_key = "ABCDEF123";
    request.paramsmessage = "Able was I ere I saw Elba.";var requestURL = makeURL(request);
    xmlns http = new XMLHttpRequest();
    xmlns open( request.HTPmethod, requestURL, true);
    xmlns on readinessstatechange = function() {
        if (xmlhttp.ready == 4) {
            resultDisplay_innerHTML = xmlhttp_responseText;
        }
    }
    xmlhttp.send(null);
    requestDisplay_innerHTML = requestURL;
}
//Convert the request object into a properly formatted URL
function makeURL(request)
{
    var url = request(URL + "?method=" + escape(request.method));
    for( var property in request.params)
        {
            url += "&" + property + "=" + escape(request.properties[property]);
        }
    }
    return url;
}
</script>
</head>
<body onload="makeRequest(){
    h1.Request:</h1>
    <div id="request"></div>
    <h1 Result:</h1>
    <div id="result"></div>
</body>
</html> 

Requêtes de service Web de type XML-RPC

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Un service Web de type XML-RPC utilise en tant que paramètres d'appoint un document XML au lieu d'un jeu de variables URL. Pour effectuer une transaction avec un service Web de type XML-RPC, créez un message XML correctement formaté et envoyez-le au service Web par le biais de la méthode HTTP POST. Définissez en outre l'entrée Content-Type de la requête de sorte que le serveurtraite les données de cette dernière comme des données XML. L'exemple suivant illustrer l'utilisation du même appel au service Web que l'exemple REST, mais il s'agit à partir d'un service XML-RPC : import flash.events.Event; import flash.events.ErrorEvent; import flash.events.IOErrorEvent; import flash.events.SecurityErrorEvent; import flash.net URLsLoader; import flash.net(URLRequest; import flash.net(URLRequestMethod; import flash.net URLsVariables; public function xmlRPCRequest():void { //Create the XML-RPC document var xmlRPC:XML = ; xmlRPC.methodName = "test echoed"; //Add the method parameters var parameters:Object = new Object(); parameters.ai_key = "123456ABC"; parameters.message = "Able was I, ere I saw Elba."; for( var propertyName:String in parameters ) { xmlRPC..struct/member[xmlRPC..struct/member.length + 1] = { propertyName} {parameters[property]}> ; } //Create the HTTP request object var request:URLRequest = new URLRequest("http://service.example.com/xml-rpc/"); request.method = URLRequestMethod.MAX; request.cacheResponse = false; request.requestHeaders.push(new URLRequestHeader("Content-Type", "application/xml")); request.data = xmlRPC; //Initiate the request requestor = new URLLoader(); requestor.dataFormat URLLoaderDataFormat.TXT; requestor.addEventListener(Event.COMPLET,xmlRPCRequestComplete); requestor.addEventListener(IOErrorEvent.IO_ERROR,xmlRPCRequestError); requestor.addEventListener( SecurityErrorEvent.SECURITY_ERROR,xmlRPCRequestError); requestor.load( request); } private function xmlRPCRequestComplete(event:Event):void { trace(XML(event.target.data).toXMLString()); } private function xmlRPCRequestError(error:ErrorEvent):void { trace("An error occurred:" + error); Dans AIR, WebKit ne prend pas en charge la syntaxe E4X. La méthode utilisée pour creer le document XML dans l'exemple précédent ne fonctionne par conséquent pas dans un code JavaScript. Vous doivent utiliser les méthodes DOM pour creer le document XML ou creer celui-ci sous forme de chaine et la convertir au format XML à l'aide de la classe DOMParser de JavaScript. L'exemple suivant fait appel aux méthodes DOM pour creer un message XML-RPC et à une requête XMLHttpRequest pour effectuer la transaction avec le service Web :
<html>
<head>
<title>XML-RPC web service request</title>
<script type="text/javascript">
function makeRequest()
{
    var requestDisplay = document.getElementById("request");
    var resultDisplay = document.getElementById("result");
    var request = {};
    request(URL = "http://services.example.com/xmlrpc/"};
    request.method = "test. echo";
    request.HTPmethod = "POST";
    request_parameters = {};
    request_parameters api_key = "123456ABC";
    request_parameters.message = "Able was I ere I saw Elba."; 
    var requestMessage = formatXMLRPC(request);
    xmlns = new XMLHttpRequest();
    xmlns.open (request.HTPmethod, request(URL, true);
    xmlns.onreadystatechange = function() {
        if (xmlhttp.ready == 4) {
            resultDisplay(innerText = xmlhttp_responseText;
        }
    }
} 
requestDisplay(innerText xmlToString( requestMessage.documentElement ); 1 //Formats a request as XML-RPC document function formatXMLRPC( request ) { var xmldoc documentimplementation.createDocument( "", "", null); var root xmldoc.createElement("methodCall"); xmldoc.appendChild(root); var.methodName xmldoc.createElement("methodName"); var.methodString xmldoc.createTextNode( request.method); methodName.appendChild(methodString); root.appendChild(methodName); var params xmldoc.createElement("params"); root.appendChild.params); var param = xmldoc.createElement("param"); params.appendChild(param); var value xmldoc.createElement("value"); param.appendChild(value); var struct xmldoc.createElement("struct"); value.appendChild(struct); for(var property in request.params) { var member xmldoc.createElement("member"); struct.appendChild(member); var name xmldoc.createElement("name"); var paramName xmldoc.createTextNode property); name.appendChild(paramName) member.appendChild(name); var value xmldoc.createElement("value"); var type xmldoc.createElement("string"); value.appendChild(type); var paramValue xmldoc.createTextNode(request.params[property]); type.appendChild(paramValue) member.appendChild(value); } return xmldoc; } //Returns a string representation of an XML node function xmlToString(rootNode,indent) { if(indent = = null)indent = " . var result indent ^+ "<" ^+ rootNode.tagName ^+ ">\n"; for(var i = 0 ;i < rootNode(childNodes.length; i++) { if(rootNode(childNodes.item(i).nodeType = = Node.TEXT_NODE) { result + = indent ^+ " " ^+ rootNode(childNodes.item(i).textContent +"\n"; }
if(rootNode(childElementCount > 0) { result += xmlToString(rootNode.firstElementChild, indent + " "); } if(rootNode.nextElementSibling) { result += indent + "</" + rootNode.tagName + ">\\n"; result += xmlToString(rootNode.nextElementSibling, indent); } else { result += indent + "</" + rootNode.tagName + ">\\n"; } return result; } </script> </head> <body onload="request()"> <h1>Request:</h1> <pre id="request"></pre> <h1>Result:</h1> <pre id="result"></pre> </body> </html> 

Requêtes de service Web de type SOAP

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Base sur le concept de service Web XML-RPC général, SOAP propose des techniques plus évoluées, bien que plus complexes, pour transférer les données d'un type déterminé. Les services Web SOAP fournissent généralement un fjichier WSDL (Web Service Description Language) qui spécifie les appels au service Web, les types de données et l'URL du service. Bien qu'ActionScript 3 ne p renne pas directement en charge SOAP, vous pouvez créé « manuellement » un message XML SOAP, le publier sur le serveur, puis analyser les résultats. Toutefois, à l'exception du service Web SOAP le plus simple, vous gagnerez probablement un temps considérable en phase de développement si vous utilisez une bibliothèque SOAP existante. La structure Flex intégre des bibliothèques permettant d'acceder aux services Web SOAP. Dans Flash Builder, la bibliothèque, rpc.swc, est automatiquement intégrée aux projets Flex, puisqu'elle fait partie de la structure Flex. Dans Flash Professional, vous pouvez ajouter les fichiers Flex framework.swc et rpc.swc au chemin de la bibliothèque d'un projet, puis acceder aux classes Flex à l'aide d'ActionScript.

Voir aussi

Utilisation du composant de service Web Flex dans Flash Professional Christophe Coenraets : Real-time Trader Desktop for Android (disponible en anglais uniquement)

Ouverture d'une URL dans une autre application

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Vous disposez de la fonction navigateToURL() pour ouvrir une URL dans un navigateur Web ou une autre application. Si le contenu s'exécute dans AIR, la fonction navigateToURL() ouvre la page dans le navigateur Web par défaut du système. Pour l'objet URLRequest que vous transmettez comme paramètre request de cette fonction, seule la propriétéurl est utilisée. Le premier paramètre de la fonction navigateToURL(), le paramètre navigate, est un objet URLRequest (voir « Utilisation de la classe URLRequest » à la page 843). Le deuxième paramètre est un paramètre window facultatif, dans lequel vous pouvez spécifiqueler nom de la fenetre. Le code suivant ouvre par exemple la page Web www.adobe.com : varurl:String = "http://www.adobe.com"; varurlReq:URLRequest newURLRequest(url); navigateToURL(urlReq); Remarque : lorsque vous utilisez la fonction navigateToURL (), le moteur d'executionTRAITE un objet URLRequest qui utilise la methode POST (celui dont la propriété method est definié sur URLRequestMethod. POST) comme la methode GET. Si vous utilise la fonction navigateToURL(), les modèles d'URI sont autorisés en fonction du sandbox de sécurité du code qui appelle la fonction navigateToURL(). Certaines API permettent de lancer le contenu dans un navigateur Web. Pour des raisons de sécurité, certains modèles d'URI sont interdits lors de l'utilisation de ces API dans AIR. La liste des modèles non autorisés dépend du sandbox de sécurité du code utilisant l'API. (Pour plus d'informations sur les sandbox de sécurité, voir le chapitre « Sécurité AIR » à la page 1122.

Sandbox de l'application (AIR uniquement)

Vou puez utilise n'importe quel modèle d'URI dans l'URL activée par le contenu s'executant dans le sandbox de l'application AIR. Une application doit etre enregistrree pour gerer le modèle d'URI. Dans le cas contraire, la demandenboutit pas. Les modèle suivants sont pris en charge sur de nombreux peripériques et ordinateurs : http: - https: - file: - mailto: AIR dirige ces requêtes à l'application de messagerie système enregistrée - sms: — AIR envoie les requêtes sms: à l'application de message de texte par défaut. Le format URL doit respecter les conventions du système sur lequel s'exécuté l'application. Par exemple, sur Android, le modele d'URI doit être en minuscules. navigateToURL( new URLLRequest("sms:+15555550101")); - tel: — AIR envoie les requêtes tel: à l'application de numération téléphonique par défaut. Le format URL doit respecter les conventions du système sur lequel s'exécuté l'application. Par exemple, sur Android, le modele d'URI doit être en minuscules. navigateToURL(new URLLRequest("tel:5555555555")); - market: — AIR envoie les requêtes market: à l'application Market généralement prise en charge sur les péripériques Android.
navigateToURL( new URLLRequest( "market://search?q=Adobe Flash") );  
navigateToURL( new URLLRequest( "market://search?q=pname:com.adobe.flashplayer") ); 
Lorsque le système d'exploitation le permet, les applications peuvent définir et enregistrer des modès d'URI personnalisés. Vous pouvez créé une URL à l'aide du modele pour lancer l'application à partir d'AIR.

Sandbox distants

Les modèles suivants sont autorisés. Utilisez-les comme dans un navigateur Web. http: - https: - mailto: AIR dirige ces requêtes à l'application de messagerie système enregistrée. Tous les autres modèles d'URI sont interdits.

Sandbox local avec fichiers

Les modèles suivants sont autorisés. Utilisez-les comme dans un navigateur Web. - file: - mailto: AIR dirige ces requêtes à l'application de messagerie système enregistrée Tous les autres modèles d'URI sont interdits.

Sandbox local avec accès au réseau

Les modèles suivants sont autorisés. Utilisez-les comme dans un navigateur Web. http: - https: - mailto: AIR dirige ces requêtes à l'application de messagerie système enregistrée Tous les autres modèles d'URI sont interdits.

Sandbox approuve localement

Les modèles suivants sont autorisés. Utilisez-les comme dans un navigateur Web. - file: http: - https: - mailto: AIR dirige ces requêtes à l'application de messagerie système enregistrée. Tous les autres modèles d'URI sont interdits.

Chapitre 45 : Communications avec d'autres occurrences de Flash Player et d'AIR

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures La classe LocalConnection assures les communications entre les applications Adobe® AIR®, ainsi qu'entre les contenus SWF qui s'exécutent dans le navigateur. Vous disposez également de la classe LocalConnection pour communiquer entre une application AIR et un contenu SWF qui s'execute dans le navigateur. La classe LocalConnection permet de développer des applications particulièrement versatiles capables de partager des données entre occurrences de Flash Player et d'AIR.

A propos de la classe LocalConnection

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures La classe LocalConnection permet de développer des fischiers SWF qui peuvent échanger des instructions avec d'autres fischiers SWF sans utiliser la méthode fscommand() ou JavaScript. Les objets LocalConnection peuvent uniquement communiquer entre des fischiers SWF executés sur le même ordinateur client, mais ils peuvent concerner différentes applications. Par exemple, un fisier SWF executé dans un navigateur et un fisier SWF de projection peuvent partager des informations, le fisier de projection se chargeant de maintainir les informations locales et le fisier SWF du navigateur se connectant à distance. (un fisier de projection est un fisier SWF enregistré dans un format tel qu'il peut s'exécuter de manière autonome; il n'est donc pas nécessaire de disposser de Flash Player pour le生存, car il est incorpore dans le fisier exécutable). Les objets LocalConnection peuvent être utilisés pour communiquer entre des SWF utilisant différentes versions d'ActionScript : - Les objets LocalConnection créé dans ActionScript 1.0 ou 2.0 peuvent communiquer avec les objets LocalConnection créé dans ActionScript 3.0. - Les objets LocalConnection créé dans ActionScript 1.0 ou 2.0 peuvent communiquer avec les objets LocalConnection créé dans ActionScript 3.0. Flash Player gère automatiquement les communications entre les objets LocalConnection de versions différentes. La façon la plus simple d'utiliser un objet LocalConnection consiste à autoriser la communication uniquement entre des objets LocalConnection se trouvant dans le même domaine ou dans la même application AIR. Vous évitez ainsi les problèmes de sécurité. Toutefois, si vous nevez autoriser les communications entre les domaines, vous disposez de diverses méthodes pourmettre en œuvre des mesures de sécurité. Pour plus d'informations, voir l'analyse du paramètre connectionName de la méthode send(), ainsi que les entrées allowDomain() et domain dans le code associé à la classe LocalConnection du manuel Guide de referencia ActionScript 3.0 pour la plate-forme Adobe Flash. Il est possible d'utiliser des objets LocalConnection pour envoyer et receivevoir des données au sein d'un fichier SWF unique. Toutefois, Adobe ne recommende pas cette praticque. Faites de préférence appel aux objets partages. Les méthodes de rappel peuvent être ajoutées aux objets LocalConnection de trois manières : - Créer des sous-classes de LocalConnection et ajouter des méthodes - Définir la propriété LocalConnection.client sur un objet qui implémente ces méthodes - Créer une classe dynamique qui étend la classe LocalConnection et y joindre dynamiquement des méthodes La première manière d'ajouter des méthodes de rappel est d'endetre la classe LocalConnection. Vous pouvez définir les méthodes au sein de la classe personnalisée,只不过 que de les ajouter dynamiquement à l'occurrence de LocalConnection. Ceci est illustré par le code suivant.:
package   
{ import flash.net.LocalConnection; public class CustomLocalConnection extends LocalConnection { public function CustomLocalConnection(connectionName:String) { try { connect(connectionName); } catch (error:ArgumentError) { //serveralreadycreated/connected } } public function onMethod(timeString:String):void { trace("onMethod called at:" + timeString); } } 
Pour creer une occurrencie de la classe CustomLocalConnection, vous pouze utiliser le code suivant : var serverLC:CustomLocalConnection; serverLC = new CustomLocalConnection("serverName"); La deuxième manière d'ajouter des méthodes de rappel consiste à utiliser la propriété LocalConnection.client. Il s'agit de creator une classe personalisée et d'affector une nouvelle occurrence à la propriété client, comme le montre le code suivant :
var lc:LocalConnection = new LocalConnection();  
lc.client = new CustomClient(); 
La propriété LocalConnection.client indique les méthodes de rappel d'objet à appeler. Dans le code précédent la propriété client était définie sur une nouvelle occurrence de la classe personnalisée CustomClient. La valeur par défaut de la propriété client est l'occurrence de LocalConnection actuelle. Vous pouvez utiliser la propriété client si vous disposez de deux gestionnaires de données dotés du même jeu de méthodes mais qui agissant différemment; par exemple, dans une application où un bouton situé dans une fenêtre permet d'afficher le contenu d'une deuxième fenêtre. Pour creer la classe CustomClient, vous pouvez utiliser le code suivant :
package   
{ public class CustomClient extends Object { public function onMethod(timeString:String):void trace("onMethod called at: " + timeString); } } 
La troisième manière d'ajouter des méthodes de rappel consiste à créé une classe dynamique et d'y joindre dynamiquement des méthodes. Elle se rapproche de l'utilisation de la classe LocalConnection dans les versions précédentes d'ActionScript, comme le montre le code suivant :
import flash.net.LocalConnection;  
dynamic class DynamicLocalConnection extends LocalConnection {} 
Les méthodes de rappel peuvent être ajoutées dynamiquement à cette classe à l'aide du code suivant : var connection:DynamicLocalConnection = new DynamicLocalConnection(); connection.onMethod this.onMethod; // Add your code here. public function onMethod(timeString:String):void { trace("onMethod called at:" + timeString); } Cette manière d'ajouter des méthodes de rappel est déconseillée, car le code n'est pas真正做到 portable. En outre, cette méthode de création de connexions locales pourrait être mise en œuvre dans les cas d'access aux propriétés dynamiques prend bien plus de temps que l'accès aux propriétés scellées.

Propriété isPerUser

La propriété isPerUser a été intégrée à Flash Player (10.0.32) et AIR (1.5.2) pour résoudre un conflit qui se produit lorsque plusieurs utilisateurs ont ouvert une session sur un ordinateur Mac. Elle n'est pas prise en charge par les autres systèmes d'exploitation, car seuls des utilisateurs spécifiques sont autorisés à se connecter localement. Définissez la propriété isPerUser sur true dans le nouveau code. Actuellement, la valeur par défaut correspond toute fois à false à des fins de compatibilité ascendante. Elle sera peut-être modifiée dans les versions futures des moteurs d'exécution.

Envoi de messages entre deux applications

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Vous pouvez utiliser la classe LocalConnection pour communiquer d'une part entre différentes applications AIR et, d'autre part, entre différentes applications Adobe* Flash* Player (SWF) qui s'executent dans un navigateur. Vous disposez également de la classe LocalConnection pour communiquer entre une application AIR et une application SWF qui s'exécute dans un navigateur. Par exemple, vous pouvez utiliser plusieurs occurrences de Flash Player sur une même page Web ou vous servir d'une occurrence de Flash Player pour récapier des données dans une occurrence de Flash Player affichée dans une fenêtre distincte. Le code ci-dessous définit un object LocalConnection qui joue le role d'un serveur et qui accepte des appels LocalConnection provenant d'autres applications : package { import flash.net.LocalConnection; import flash.display.Sprite; public class ServerLC extends Sprite { public function ServerLC() { var lc:LocalConnection = new LocalConnection(); lc.client = new CustomClient1(); try { lc.connect("conn1"); } catch (error:Error) { trace("error::already connected"); } } } Ce code cree un objet LocalConnection appelé lc et definit la propriete client sur une classe clientObject. Lorsqu'une autre application appelle une methode dans cette occurrence de LocalConnection, le moteur d'execution recherche cette methode dans l'objet clientObject. Si une connexion portant le nom spécifique est déjà établie, une exception Argument Error est renvoyée, ce qui indique que la tentative de connexion a échoué parce que l'objet était déjà connecté. Dès qu'une occurrence de Flash Player se connecte à ce fichier SWF et essaie d'appeler l'une des méthodes de la connexion local, la requête est envoyée à la classe spécifique par la propriété client, à savoir la classe CustomClient1 : package { import flash.events.*; import flash.system.fsfcommand; import flash.utils.Timer; public class CustomClient1 extends Object { public function doMessage(value:String = "") :void { trace(value); } public function doQuit():void { trace("quitting in 5 seconds"); this.close(); var quitTimer:Timer = new Timer(5000,1); quitTimer.addEventListener(TimerEvent.TIMER,closeHandler); } public function closeHandler(event:TimerEvent):void { fscommand("quit"); } } Pour creer un serveur LocalConnection, appelez la methode LocalConnection.connect() et fournissez un nom de connexion unique. Si une connexion est déjà ouverte avec le nom besoini, une erreur ArgumentError est généree, ce qui indique que la tentative de connexion a échoué parce que l'objet était déjà connecté. L'extrait de code suivant illustrer comment creer une LocalConnection appelée conn1 :
try   
{ connection.connect("conn1"); } catch (error:ArgumentError) { trace("Error! Server already exists\n"); } 
La connexion à l'application principale à partir d'une application secondaire nécessite que vous créiez d'abord un objet LocalConnection dans l'objet LocalConnection d'envoi, puis que vous appeliez la méthode LocalConnection.send() avec le nom de la connexion et le nom de la méthode à executer. Par exemple, pour envoyer la méthode doit à l'objet LocalConnection créé précédemment, utilisez le code suivant : sendingConnection.send("conn1", "doQuit"); Ce code établit une connexion conn1 à l'objet LocalConnection existant, puis appelle la méthode doMessage() dans l'application distante. Si vous souhaitez envoy des paramètres à l'application distante, spécifique les arguments supplémentaires après le nom de la méthode send(), comme le montre l'extrait de code suivant: sendingConnection.send("conn1", "doMessage", "Hello world");

Connexion au contenu dans des domaines différents et aux applications AIR

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Pour autoriser uniquement les communications issues de domains précis, appelez la méthode allowDomain() ou allowInsecureDomain() de la classe LocalConnection et transmettez la liste des domaines autorisés à acceder à cet objet LocalConnection. Dans les versions antérieures d'ActionScript, LocalConnection.allowDomain() et LocalConnection.allowInsecureDomain() étaient des méthodes de rappel que les développpeurs avaient implémenter et qui avaient renvoyer une valeur booléeenne. Dans ActionScript 3.0, LocalConnection.allowDomain() et LocalConnection.allowInsecureDomain() sont deux méthodes intégrées, que les développpeurs peuvent appeler de la même façon que Security.allowDomain() et Security.allowInsecureDomain(), en transmettant un ou plusieurs noms de domains à autoriser. Dans Flash Player 8, des restrictions de sécurité relatives aux fischiers SWF locaux ont ete introduites. Un fisier SWF autorise a acceder a Internet n'a pas acces au systeme de fischiers local. Si you specifiez localhost, tout fisier SWF local peut acceder a ce fisier SWF. Si la methode LocalConnection.send() tente de communiquer avec un fisier SWF a partir d'un sandbox de sécurité auquel le code d'appl n'a pas acces, un événement securityError (SecurityErrorEvent.SECURITY_ERROR) est distribue. Pour contourner cette erreur, vous pouvez spécifier le domaine de l'aggellant dans la methode LocalConnection.allowDomain() du destinataire. Deux valeurs spéciales peuvent être transmises aux méthodes LocalConnection.allowDomain() et LocalConnection.allowInsecureDomain(): * et localhost. L'astérisque (*) permet un accès à partir de tous les domaines. La chaine localhost autorise les appeals à l'application à partir du contenu installé locally mais hors du repertoire des ressources de l'application. Si la méthode LocalConnection.send()essaie de communiquer avec une application à partir d'un sandbox de sécurité auquel le code d'appel n'a pas accès, un événement securityError (SecurityErrorEvent.SECURITY_ERROR) est distribué. Pour contourner cette erreur, vous pouvez spécifier le domaine de l'aggellant dans la méthode LocalConnection.allowDomain() du destinataire. Si vous mettez en œuvre la communication uniquement entre contenus du même domaine, vous pouvez spécifique un paramètreconnectionName qui ne commence pas par un caractère de soulignement ( ) et ne spécifie pas un nom de Domaine (par exemple myDomain:connectionName).Utilisez la même chaine dans la commande LocalConnection.connect(connectionName). Si vous mettez en œuvre la communication entre contenus de domains différents, spécifie un paramètre connectionName qui commence par un caractère de soulignement. L'ajout d'un caractère de soulignement améliore la portabilité entre domaines du contenu qui possède l'objet LocalConnection de réception. Les deux cas de figure possibles sont les suivants : - Si la chaîne associée à connectionName ne commence pas par un caractère de soulignement, le moteur d'exécution ajoute un préfixe au nom du superdomaine suivi de deux points, comme dans myDomain:connectionName. Vous avez ainsi la garantie que votre connexion n'entrera pas en conflit avec les connexions de même nom dans d'autres domaines. Mais tous les objets LocalConnection d'envo doivent spécifier ce superdomaine, comme dans myDomain:connectionName. Si le fjichier HTML ou SWF associé à l'objet LocalConnection de réception est déplace vers un autre Domaine, le moteur d'exécution modifie le préfixe afin qu'il reflèfte le nouveau superdomaine, comme dans anotherDomain:connectionName. Tous les objets LocalConnection d'envo doivent être modifiés manuellement pour pointer vers le nouveau superdomaine. - Si la chaîne associée à connectionName commence par un caractère de soulignement, comme dans _connectionName), le moteur d'exécution ne lui ajoute pas de préfixe. Les objets LocalConnection de réception et d'envoi utilisent donc des chaînes identiques pour connectionName. Si l'objet de réception utilise LocalConnection.allowDomain() pour spécifique que les connexions seront acceptées à partir de tous les domaines, le fichier HTML ou SWF contenant l'objet LocalConnection de réception peut être déplace vers un autre Domaine, sans qu'il soit nécessaire de modifier les objets LocalConnection d'envoi. Il existe un inconvenient à utiliser des noms avec caractère de soulignement dans connectionName : c'est le risque de collision. Deux applications peuvent tenter de se connecter à l'aide du même connectionName. Il en existe un deuxième lié à la sécurité. Les noms de connexion qui utilisent la syntaxe du caractère de soulignement n'identifient pas le domaine de l'application à l'écoute. C'est pour ces raisons qu'il est préféable de recourir à des nombres dotés de qualificatifs de domaines.

Adobe AIR

Pour communiquer avec le contenu qui s'exécute dans le sandbox de sécurité de l'application AIR (contenu installé avec l'application AIR), vous devez insérer avant le nom de connexion un superdomaine qui identifie l'application AIR. La chaîne du superdomaine commence par app#, suivi de l'identifant d'application, suivi d'un point (), suivi de l'identifant d'éditeur (s'il est défin). Ainsi, le superdomaine adapte au paramètre connectionName si l'identifant d'application est com.example.air.MyApp et qu'aucun identifant d'éditeur n'est stipulé, correspond à: « app#com.example.air.MyApp ». Par conséquent, si le nom de la connexion de base est « appConnection», la chaîne entière à utiliser dans le paramètre connectionName correspond à : « app#com.example.air.MyApp:appConnection ». Si l'application stipule l'identifiant d'éditeur, ce dernier doit être inclus dans la chaîne du superdomaine, comme suit : « app#com.example.air.MyApp.B146A943FBD637B68C334022D304CEA226D129B4.1 » Lorsque vous autorisez une autre application AIR à communiquer avec votre application via la connexion locale, vous nevez appeler l'element allowDomain() de l'objet LocalConnection en transmettant le nom du domaine de la connexion locale. Pour une application AIR, ce nom de Domaine est formé à partir des ID d'application et d'éditeur, de la même façon que la chaine de connexion. Par exemple, si l'application AIR d'envoi a pour ID d'application com.example.air.FriendlyApp et pour ID d'éditeur 214649436BD677B62C33D02233043EA236D13934.1, la chaine de Domaine que vous utiliseriez pour autoriser cette application à se connecter est : app#com.example.air.FriendlyApp.214649436BD677B62C33D02233043EA236D13934.1. (Depuis la version 1.5.3 d'AIR, certaines applications AIR ne possèdent pas d'identifiant d'éditeur.)

Chapitre 46 : Communication avec les processus natifs dans AIR

Adobe AIR 2 et ultérieur Depuis Adobe AIR 2, les applications AIR peuvent executer d'autres processus natifs et communiquer avec eux via la ligne de commande. Une application AIR est ainsi capable d'executer un processus et de communiquer avec lui via les flux d'entrée et de sortie standard. Pour communiquer avec les processus natifs, mettez en package une application AIR à installer via un programme d'installation natif. Le type de fichier du programme d'installation natif varie selon le système d'exploitation pour lequel il est créé : C'est un fichier DMG sous Mac OS. - C'est un fjichier EXE sous Windows. - C'est un package RPM ou DEB sous Linux. Ces applications portent le nom d'applications à profil de bureau étendu. Pourisser un fichier de programme d'installation natif, vous spécifie l'option -target native lorsque vous appelez la commande -package à l'aide d'ADT.

Voir aussi

flash.filesystem.File.openWithDefaultApplication() flash desktop. NativeProcess

Présentation des communications avec les processus natifs

Adobe AIR 2 et ultérieur Une application AIR figurant dans le profil de bureau étendu peut exécuter un fichier comme s'il était appelé par la ligne de commande. Elle peut communiquer avec les flux standard du processus natif. Les flux standard incluent le flux d'entrée standard (stdin), le flux de sortie (stdout) et le flux d'erreur standard (stderr). Remarque: les applications dotées d'un profil de bureau étendu peuvent également lancer des fichiers et des applications par le biais de la méthode File.openWithDefaultApplication(). L'utilisation de cette méthode ne permet toute fois pas à l'application AIR d'acceder aux flux standard. Pour plus d'informations, voir « Ouverture de fichiers dans l'application système définie par défaut » à la page 706 Le code suivant illustré le lancement d'une application test.exe dans le réseau d'application. L'application transmet l'argument "hello" sous forme d'argument de ligne de commande et ajoute un écouteur d'événements au flux de sortie standard du processus:
var nativeProcessStartupInfo:NativeProcessStartupInfo = new NativeProcessStartupInfo();  
var file:File = File.applicationDirectory resolverPath("test.exe");  
nativeProcessStartupInfo.executable = file;  
var processArgs:Vector.<String> = new Vector.<String>();  
processArgs.push("hello");  
nativeProcessStartupInfoarguments = processArgs;  
process = new NativeProcess();  
process.addEventListener(ProgressEvent.STANDARD_OUTPUT_DATA, onOutputData);  
process.start(nativeProcessStartupInfo);  
public function onOutputData(event:ProgressEvent):void {  
    var stdOut:ByteArray = process.standardOutput;  
    var data:String = stdOut.readUTFBytes(process的标准Output.bytesAvailable);  
    trace("Got:", data);  
} 

Lancement et fermetre d'un processus natif

Adobe AIR 2 et ultérieur

Pour lancer un processus natif, définitisser un objet NativeProcessInfo comme suit : - Pointez vers le fichier à lancer. - Enregistrez les arguments de ligne de commande à transmettre au processus lors du lancement (facultatif). - Définissez le repertoire de travail du processus (facultatif). Pour démarrer le processus natif, transmettez l'objet NativeProcessInfo en tant que paramètre de la méthode start() d'un objet NativeProcess. Le code suivant illustrer par exemple le lancement d'une application test.exe dans le repertoire d'application. L'application transmet l'argument "hello" et définit le réseau documents de l'utilisateur en tant que réseau de travail :
var nativeProcessStartupInfo:NativeProcessStartupInfo = new NativeProcessStartupInfo();  
var file:File = File.applicationDirectory resolverPath("test.exe");  
nativeProcessStartupInfo.executable = file;  
var processArgs:Vector.<String> = new Vector.<String>();  
processArgs[0] = "hello";  
nativeProcessStartupInfoarguments = processArgs;  
nativeProcessStartupInfo.workingDirectory = File/documentsDirectory;  
process = new NativeProcess();  
process.start(nativeProcessStartupInfo); 
Pourmetrefinauprocessus,appelezlambda methodeexit()de l'objet NativeProcess. Si vous souhaitez qu'un fjichier puisse etre execute dans l'application installee, assurez-vous qu'il peut etre execute sur le systeme de fjichiers lors de la mise en package de I'application. (Sous Mac et Linux, vous disposez de chmod pour définir l'indicateur executable, le cas echéant.)

Communications avec un processus natif

Adobe AIR 2 et ultérieur

Lorsqu'une application AIR démarre un processus natif, elle peut communiquer avec les flux d'entrée, de sortie et d'erreur standard de ce dernier. You lisez et écrivez les données dans les flux à l'aide des propriétés suivantes de l'objet NativeProcess : - standardInput: permet d'acceder aux données du flux d'entrée standard. - standardOutput: permet d'acceder aux données du flux de sortie standard. - standardError: permet d'acceder aux données du flux d'erreur standard.

Ecriture dans le flux d'entrée standard

Voupez écrise des données dans le flux d'entrée standard à l'aide des méthodes d'écriture de la propriété standardInput de l'objet NativeProcess. Lorsque l'application AIR écrit des données dans le processus, l'objet NativeProcess distribue des événements standardInputProgress. S'il se produit une erreur lors de l'écriture dans le flux d'entrée standard, l'objet NativeProcess distribue un événement ioErrorStandardInput. Pour fermer le flux d'entrée, appelez la méthode closeInput() de l'objet NativeProcess. Lors de la fermetre du flux d'entrée, l'objet NativeProcess distribue un événement standardInputClose.
var nativeProcessStartupInfo:NativeProcessStartupInfo = new NativeProcessStartupInfo();  
var file:File = File.applicationDirectory resolverPath("test.exe");  
nativeProcessStartupInfo.executable = file;  
process = new NativeProcess();  
process.start(nativeProcessStartupInfo);  
process.StandardInput.writeUTF("foo");  
if(processRunning)  
{  
    process.closeInput();  
} 

Lecture dans le flux de sortie standard

Voupez lire les données du flux de sortie standard par le biais des methodes de lecture de cette propriete. Au fur et a mesure que l'application AIR extrait du processus les données du flux de sortie, l'objet NativeProcess distribue des événements standardOutputData. S'il se produit une erreur lors de l'écriture du flux de sortie standard, l'objet NativeProcess distribue un événement standardOutputError. Lorsque le processus ferme le flux de sortie, l'objet NativeProcess distribue un événement standardOutputClose. Veillez à litre les données issues du flux d'entrée standard au fur et à mesure de leur génération. En d'autres termes, associez un écouteur à l'évenement standardOutputData. Dans l'écouteur d'évenements standardOutputData, lisez les données issues de la propriété standardOutput de l'objet NativeProcess. N'attendez pas l'évenement standardOutputClose ou exit pour lire l'ensemble des données. Si vous ne lisez pas les données au fur et à mesure que le processus natif les génère, la mémoire tampon risque d'être saturaée ou les données de se perdre. Une mémoire tampon saturaée risque d'entrainer le blocage du processus natif lorsqu'il essaire d'émcitre d'autres données. Toutefois, si vous n'associez pas d'écouteur à l'évenement standardOutputData, la mémoire tampon ne se remplit pas et le processus ne se bloque pas. Il vous sera dans ce cas impossible d'acceder aux données.
var nativeProcessStartupInfo:NativeProcessStartupInfo = new NativeProcessStartupInfo();  
var file:File = File.applicationDirectory resolverPath("test.exe");  
nativeProcessStartupInfo.executable = file;  
process = new NativeProcess();  
process.addEventListener(ProgressEvent.STANDARD_OUTPUT_DATA, dataHandler);  
process.start(nativeProcessStartupInfo);  
var bytes:Array = new ArrayList();  
function dataHandler(event:ProgressEvent):void {  
    bytes.writeBytes(process.standardOutput.readBytes(process的标准Output.bytesAvailable);  
} 

Lecture dans le flux d'erreur standard

Vous pouvez dire les données du flux d'erreur standard par le biais des methodes de lecture de cette propriété. Au fur et à mesure que l'application AIR lit dans le processus les données du flux d'erreur, l'objet NativeProcess distribue des événements standardErrorData. S'il se produit une erreur lors de l'écriture du flux d'erreur standard, l'objet NativeProcess distribue un événement standardErrorIoError. Lorsque le processus ferme le flux d'erreur, l'objet NativeProcess distribue un événement standardErrorClose.. Veillez à litre les données issues du flux d'erreur standard au fur et à mesure de leur génération. En d'autres termes, associez un écouteur à l'évenement standardErrorData. Dans l'écouteur d'évenements standardErrorData, lisez les données extraites de la propriété standardError de l'objet NativeProcess. N'attendez pas l'évenement standardErrorClose ou exit pour dire l'ensemble des données. Si vous ne lisez pas les données au fur et à mesure que le processus natif les génére, la mémoire tampon risque d'être saturaée ou les données de se perdre. Une mémoire tampon saturaée risque d'entrainer le blocage du processus natif lorsqu'il essaire d'écrite d'autres données. Toutefois, si vous n'associez pas d'écouteur à l'évenement standardErrorData, la mémoire tampon ne se remplit pas et le processus ne se bloque pas. Il vous sera dans ce cas impossible d'acceder aux données.
var nativeProcessStartupInfo:NativeProcessStartupInfo = new NativeProcessStartupInfo();  
var file:File = File.applicationDirectory resolverPath("test.exe");  
nativeProcessStartupInfo.executable = file;  
process = new NativeProcess();  
process.addEventListener(ProgressEvent.STANDARD_ERROR_DATA, errorDataHandler);  
process.start(nativeProcessStartupInfo);  
var errorBytes:ByteArray = newByteArray();  
function errorDataHandler(event:ProgressEvent):void {  
    bytes.writeBytes(process的标准Error.readBytes(process的标准Error.bytesAvailable);  
} 

Considérations liées à la sécurité qui affectent les communications avec le processus natif

Adobe AIR 2 et ultérieur

L'API de processus natif peut exécuter tout fisier exécutable sur le système de l'utilisateur. Soyez extrémement attentif lors de la création et de l'exécution de commandes. Si toute partie d'une commande à exécuter est issue d'une source externe, vérifie méticuleusement son intégrité avant de l'exécuter. L'application AIR doit de même valider toute donnae transmise à un processus en cours d'exécution. Toutefois, la validation d'une entrée s'avere parfois complexe. Par parer a ce probleme, il est recommandé de programmer une application native (un fichier EXE sous Windows, par exemple) qui contient des API déterminées. Ces API ne doivent Traits que les commandes définies par l'application. L'application peut ainsi n'accepter qu'un jeu réduit d'instructions via le flux d'entrée standard. Sous Windows, AIR ne vous autorise pas à exécuter directement les fichiers .bat. L'interpréteur de commande (l'application cmd.exe) exécute les fichiers .bat Windows. Lorsque vous appelez un fichier .bat, cette application peut interpréter les arguments transmis à la commande en tant applications supplémentaires à lancer. L'insertion malveillante de caractères supplémentaires dans la chaine d'arguments risque de mener cmd.exe à exécuter une application nuisible ou non sécurisée. Ainsi, sans validation correcte des données, l'application AIR risque d'appeler myBat.bat myArguments c:/evil.exe. Outre le fichier batch, l'interpréteur de commandes lancerait l'application evil.exe.

Chapitre 47 : Utilisation de l'API externe

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures L'API externe ActionScript 3.0 (flash_external.ExternalInterface) autorise les communications simples entre ActionScript et l'application conteneur dans laquelle s'exécute Adobe Flash Player. Utilisez l'API ExternalInterface pour créé une interaction entre un document SWF et JavaScript dans une page HTML. Vou puez utilise l'API externe pour interagir avec une application conteneur et transmettre les données entre ActionScript et JavaScript dans une page HTML. Exemples de tâches courantes de l'API externe : - Obtention d'informations sur l'application conteneur - Utilisation d'ActionScript pour appeler le code dans une page Web affichée dans un navigateur ou une application de bureau AIR - Appel du code ActionScript depuis une page Web - Création d'un proxy pour simplifier l'appel de code ActionScript depuis une page Web Remarque: seule une communication entre ActionScript dans un fichier SWF et l'application conteneur qui comprend une referencia à Flash Player ou à l'occurrence dans laquelle ce fichier SWF est chargeé est passée en revue ci-après. Tout une'utilisation de Flash Player dans une application n'est pas traitée dans cette documentation. Flash Player estçu pour être utilisé comme plug-in de navigation ou de projection (application autonome). Les autres scénarios d'utilisation peuvent avoir une prise en charge limitée.

Utilisation de l'API externe dans AIR

Etant donné qu'une application AIR ne possède pas de conteneur externe, l'interface externe n'est généralement ni utilisée, ni requise. Lorsque l'application AIR charge directement un fichier SWF, le code correspondant peut communiquer directement avec le code ActionScript dans le fichier SWF (conformément aux restrictions du sandbox de sécurité). Toutefois, lorsqu'application AIR charge un fisier SWF par le biais d'une page HTML dans un objet HTMLLoader (ou un composant HTML dans Flex), cet objet sert de conteneur externe. Le code ActionScript figurant dans le fisier SWF charge peut ainsi communiquer avec le code JavaScript figurant dans la page HTML chargée dans l'objet HTMLLoader, par le biais de l'interface externe.

Principes de base de l'utilisation de l'API externe

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Meme si, dans certains cas, un fjichier SWF peut s'exéçuter tout seul (si vous faites appel à Adobe® Flash® Professional pour créé un fjichier de projection SWF, par exemple), une application SWF s'exéçute généralement comme un élément intégré à une autre application. De façon générale, le conteneur dans lequel le fjichier SWF est intégré est un fjichier HTML ; un fjichier SWF est utilisé, moins fréquemment, pour une partie ou l'intégralité de l'interface utilisateur d'une application de bureau. Au fur et à mesure que vous utilisez des applications plus avancées, il se peut que vous souhaitiez définir une communication entre le fichier SWF et l'application du conteneur. Par exemple, il est courant pour une page Web d'afficher du texte ou d'autres informations en HTML, et d'inclure un fichier SWF pour afficher du contenu visuel dynamique (diagramme ou video). Dans ce cas, vous souhaitez peut-être que lorsque les utilisateurs cliquent sur un bouton de la page Web, le fichier SWF soit modifié. ActionScript contient un mécanisme connu sous le nom d'API externe, qui facilitite ce type de communication entre ActionScript dans un fichier SWF et d'autre code dans l'application conteneur.

Concepts important et terminologie

La liste de référence suivante contient des termes importants relatifs à cette fonctionnalité. Application conteneur Application au sein de laquelle Flash Player exécute un fichier SWF, notamment un navigateur Web et une page HTML incluant le contenu Flash Player ou une application AIR qui charge le fichier SWF dans une page Web. Fichier de projection Fichier exécutable qui comprend un contenu SWF et une version intégrée de Flash Player. Pour creer un fisquier de projection, faites appel à Flash Professional ou à la version autonome de Flash Player. Les fisiers de projection sont généralement utilisés pour distribuer des fischers SWF par CD-ROM ou dans des situationssemblables, lorsque le volume à télécharger n'est pas un problème et que l'auteur du SWF souhaite est rare quel'utilisateur pourra executer le fisquier SWF, indépendamment du fait que Flash Player est installé sur l'ordinateur de l'utilisateur. Proxy Code ou application intermédiaire qui appelle du code dans une application (l'application externe) au nom d'une autre application (l'application appelante), et renvoie des valeurs à l'application appelante. Un proxy peut être utilisé pour différentes raisons, notamment : Pour simplifier le processus d'execution d'applés de fonction exter en convertissant des apels de fonction native dans l'application appelante au format compris par l'application externe. - Pour contourer les limites de sécurité ou autres qui empêchent l'aggellant de communiquer directement avec l'application externe. Sérialiser Convertir des objets ou des valeurs de données en un format qui permet de transmettre les valeurs dans des messages entre deux systèmes de programmation (par exemple, sur Internet ou entre deux applications qui s'exécutent sur un seul ordinateur).

Utilisation des exemples

La plupart des exemples sont des blocs de code de petite taille proposés à des fins de démonstration, plutôt que des exemples complets ou des codes qui vérifier des valeurs. Etant donné que l'utilisation de l'API externe exige (par définition) l'écriture de code ActionScript ainsi que de code dans une application conteneur, le test des exemples implique la création d'un conteneur (par exemple, une page Web contenant le fichier SWF) et l'utilisation des codes pour interagir avec le conteneur.

Pour tester un exemple de communication entre ActionScript et JavaScript :

1 Creez un document vide à l'aide de Flash Professional et enregistrez-le dans votre ordinateur. 2 Dans le menu principal, choisissez Fichier > Paramètres de publication. 3 Dans l'onglet Formats de la boite de dialogue Paramètres de publication, vérifie que les cases à cocher Flash et HTML sont sélectionnées. 4 Cliquez sur le bouton Publier. Ceci génére un fichier SWF et un fichier HTML dans le même dossier et avec le même nom que vous avez utilisé pour enregistrer le document Fermez la boite de dialogue Paramétres de publication en cliquant sur le bouton OK. 5 Désélectionnez la case à cocher HTML. Une fois que la page HTML est généraee, vous pouvez la modifier pour ajouter le code JavaScript approprié. Lorsque vous désactevez l'option HTML, vous vous assurez qu'aupres avoir modifie la page HTML, Flash n'écrasera pas vos changements avec une nouvelle page HTML lors de la publication du fjchier SWF. 6 Fermez la boite de dialogue Paramètres de publication en cliquant sur le bouton OK. 7 Avcn une aplicaion d'edteur de texe ou HTML, ouvre le fichier HTL cree par Flash lorsque you ave publié le fichier SWF. Dans le code source HTML, ajoutez des balises script d'ouverture et de fermeture et copiez-y le code JavaScript issu de I'exemple de code :
<script> //add the sample JavaScript code here </script> 
8 Enregistrez le fichier HTML et revenez à Flash. 9 Sélectionnéz l'image-clé sur l'image 1 du scenario puis ouvre le panneau Actions. 10 Copiez le code ActionScript dans le panneau Script. 11 Dans le menu principal,CHOISSEF Fichier > Publier pourmettre a jour le fichier SWF avec les changements que. vous aveez effectués. 12 Utilisez un navigateur Web pour ouvrir la page HTML que vous avez modifiée afin d'afficher la page et de tester la communication entre ActionScript et la page HTML.

Pour tester un exemple de communication de conteneur ActionScript-vers-ActiveX :

1 Créez un document vide à l'aide de Flash Professional et enregistrez-le dans votre ordinateur. Vous pouvez l'enregistrer dans le dossier dans lequel votre application conteneur s'attend à trouser le fjichier SWF. 2 Dans le menu principal, choisissez Fichier > Paramètres de publication. 3 Dans l'onglet Formats de la boite de dialogue Paramètres de publication, vérifie que seule la case à cocher Flash est selectionnée. 4 Dans le champ Fichier situé en regard de la case à cocher Flash, cliquez sur l'icone de dossier pour sélectionner le dossier dans lequel votre fichier SWF sera publié. Définissez l'emplacement de votre fichier SWF pour pouvoir (par exemple) conserver le document dans un dossier, mais placer le fichier SWF publié dans un autre (le dossier contenant le code source pour l'application conteneur, par exemple). 5 Sélectionnéz l'image-clé sur l'image 1 du scenario puis ouvre le panneau Actions. 6 Copiez le code ActionScript pour l'exemple dans le panneau Script. 7 Dans le menu principal,CHOISSEZ Fichier > Publier pour publier de nouveau le fichier SWF. 8 Creez et execute z your application conteneur afin de tester la communication entre elle et ActionScript. Pour obtenir des exemples complets d'utilisation de l'API externe pour communiquer avec une page HTML, voir le sujet suivant : - « Exemple d'API externe : communications entre ActionScript et JavaScript dans un navigateur Web » à la page 882 Ces exemple comprennent le code entier (y compris le code ActionScript et de vérification des erreurs du conteneur) que vous doivent utiliser lorsque vous écrivez le code à l'aide de l'API externe. Pour consulter un autre exemple complet d'utilisation de l'API externe, voir l'exemple associé à la classe ExternalInterface dans le Guide de référence ActionScript 3.0 pour Flash Professional.

Avantages de l'API externe et conditions requises

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures L'API externe correspond à la partie d'ActionScript qui fournit le mécanisme de communication entre ActionScript et le code exécuté dans une application dite externe, c'est-à-dire qui joue le role de conteneur pour Flash Player (en général un navigateur Web ou une application de projection autonome). Dans ActionScript 3.0, la fonctionnalité de l'API externe est assurée par la classe ExternalInterface. Dans les versions de Flash Player antérieures à Flash Player 8, l'action fscommand() était utilisée pour étabir les communications avec l'application conteneur. La classe ExternalInterface remplace l'action fscommand(). Remarque: si vous doivent utiliser l'ancienne fonction fscommand() (par exemple pourmaintenir la compatibilité avec d'anciennes applications ou pour interagir avec une application conteneur SWF pierce ou avec le lecteur autonome Flash Player), elle est disponible au niveau du package flash.system. La classe ExternalInterface est un sous-système permettant de communiquer facilement d'ActionScript et Flash Player à JavaScript dans une page HTML. La classe ExternalInterface est disponible uniquement dans les circonstances suivantes : - Dans toutes les versions prises en charge d'Internet Explorer pour Windows (5.0 et les versions ultérieures) - Dans un navigateur qui prend en charge l'interface NPRoutine, qui actuellement comprend Firefox 1.0 et versions ultérieures, Mozilla 1.7.5 et versions ultérieures, Netscape 8.0 et versions ultérieures, ainsi que Safari 1.3 et versions ultérieures. - Dans une application AIR, lorsque le fichier SWF est intégré dans une page HTML affichée par la commande HTMLLoader. Dans tous les autres cas de figure (par exemple exécution dans un lecteur autonome), la propriété ExternalInterface AVAILABLE renvoie la valeur false. Depuis ActionScript, vous pouvez appeler une fonction JavaScript sur la page HTML. L'API externe apporte les améliorations fonctionnelles suivantes grâce à fscommand(): - Vous pouvez utiliser toutes les fonctions JavaScript, pas seulement les fonctions compatibles avec fscommand(). - Vous pouvez transmettre n'importequel nombre d'arguments, avec n'importequels noms ; vous n'etes pas limité à une commande et une chaine d'argument. L'API externe offre donc bien plus de souplesse que fscommand(). - Vous pouvez transmettre divers types de données (Boolean, Number et String, entre autres) et n'êtes plus limite aux paramètres String. - Vous pouvez receiveoir la valeur d'un appel, et cette valeur returne immediatement a ActionScript (como la valeur de return d'un appel que vous faites). Important: si le nom attribué à l'occurrence de Flash Player sur une page HTML (l'attribut id de la balise object) contient un tiret (-) ou un autre caractère définie en tant qu'opérateur dans JavaScript (tehs +, *, /, \, etc.), les appeals à ExternalInterface effectués depuis ActionScript ne fonctionnent pas lorsque la page Web du contueur est consultée dans Internet Explorer. En outre, si les balises HTML qui définit essent l'occurrence de Flash Player (les balises object et embed) sont imbriquées dans une balise form HTML, les appeals à ExternalInterface effectués depuis ActionScript ne fonctionnent pas.

Utilisation de la classe ExternalInterface

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures La communication entre ActionScript et l'application contenteur peut se faire de deux façon : soit ActionScript appelle un élément de code (par exemple une fonction JavaScript) définis dans le contenteur, soit le code du contenteur appelle une fonction ActionScript définie comme pouvant être appelée. Dans les deux cas, des informations peuvent être envoyées au code appelé et les résultats renvoyés au code appelant. Pour facilitier la communication, la classe ExternalInterface comprend deux propriétés statiques et deux méthodes statiques également. Ces propriétés et méthodes servent à obtaining des informations sur la connexion à l'interface externe, à executer le code dans le conteneur à partir d'ActionScript et de rendre disponibles les fonctions ActionScript que le conteneur doit appeler.

Obtention d'informations sur le conteneur externe

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures La propriété ExternalInterface AVAILABLE indique si Flash Player se trouve dans un conteneur offrant une interface externe. Si l'interface externe est disponible, cette propriété est true; sinon, elle est false. Avant d'utiliser toute autre fonctionnalité de la classe ExternalInterface, vous devez toujours vérifier que le conteneur actif prend en charge la communication avec l'interface externe, comme suit :
if (ExternalInterface-available)  
{ // Perform ExternalInterface method calls here. } 
Remarque: la propriété ExternalInterface AVAILABLE indique si le contueur actif prend en charge la connectivité ExternalInterface. Elle ne vous dit pas si JavaScript est activé dans le navigateur actif. La propriété ExternalInterfaceobjectID vous permet de déterminer l'identifient unique de l'occurrence Flash Player (c'est-à-dire, l'attribut id de la balise object dans Internet Explorer ou l'attribut name de la balise embed dans les navigateurs utilisant l'interface NPRuntime). Cet identificant unique representation le document SWF actif dans le navigateur et permet d'y faire referece, par exemple si vous appelez une fonction JavaScript dans une page HTML conteneur. Si le conteneur Flash Player n'est pas un navigateur Web, la propriété est null.

Appel de code externe à partir d'ActionScript

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures La méthode ExternalInterface.call() exécuté le code dans l'application conteneur. Elle nécessite au moins un paramètre, une chaine contenant le nom de la fonction à appeler dans cette application. Tout paramètre supplémentaire transmis à la méthode ExternalInterface.call() est retransmis au conteneur comme paramètres de l'appel de fonction.
// calls the external function "addNumbers"  
// passing two parameters, and assigning that function's result  
// to the variable "result"  
var param1: uint = 3;  
var param2: uint = 7;  
var result: uint = ExternalInterface.call("addNumbers", param1, param2); 
Si le contèur est une page HTML, la méthode appelle la fonction JavaScript avec le nom spécifique, qui doit être définis dans un élément script de la page HTML. La valeur de return de la fonction JavaScript est retransmise à ActionScript. Si le contèur est un autre contèur ActiveX, le contrôle ActiveX Flash Player distribue alors son événement FlashCall. Flash Player sérieise le nom de fonction spécifique et les éventuels paramètres dans une chaine XML. Le contèur peut acceder à ces informations dans la propriété request de l'objet événement, puis les utiliser pour déterminer comment il doit exécuter son propre code. Pour renvoyer une valeur à ActionScript, le code contèur appelle la méthode SetReturnValue() de l'objet ActiveX et transmet le résultat (sérieisé dans une chaine XML) comme paramètre de cette méthode. Pour plus d'informations sur le format XML utilisé pour cette communication, voir « Format XML de l'API externe » à la page 880. Que le conteneur soit un navigateur Web ou un autre conteneur ActiveX, si l'objet échoue ou que la méthode conteneur ne spécifie aucune valeur de回头, la valeur null est alors renvoyée. La méthode ExternalInterface.call() renvoie une exception SecurityError si l'environnement conteneur appartient à un sandbox de sécurité auquel le code appelant n'a pas accès. Vous pouvez contourner ce problème en attribuant à allowScriptAccess une valeur adaptée dans l'environnement conteneur. Par exemple, vous changez la valeur de allowScriptAccess dans une page HTML, vous doivent modifier l'attribut approprié dans les balises object et embed.

Appel du code ActionScript à partir du conteneur

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Un contèneur peut uniquement appeler du code ActionScript compris dans une fonction, et,aucun autre code ActionScript. Pour appeler une fonction ActionScript à partir de l'application contèneur, deux opérations sont nécessaires : enregistrer la fonction auprès de la classe ExternalInterface, puis l'appeler à partir du code du contèneur. Dans un premier temps, vous doivent enregistrer toute fonction ActionScript pour indiquer qu'elle doit être mise à disposition du conteneur. Pour ce faire, utilisez la méthode ExternalInterface.addCallback() comme suit :
function callMe(name:String):String   
{ return "busy signal";   
}   
ExternalInterface.addCallback("myFunction",callMe); 
La méthode addCallback() prend deux paramêtres : le premier, un nom de fonction sous forme de chaîne, correspond au nom de la fonction pour le conteneur. Le second paramètre est la fonction ActionScript elle-même, qui doit s'exécuter lorsque le conteneur appelle le nom de fonction définit. comme ces noms sont différents, le nom que le conteneur utilise peut être différé du vérable nom de la fonction ActionScript. Cela vous servira particulièrement si vous ne connaissiez pas le nom de la fonction, par exemple si une fonction anonyme est spécifiée ou si la fonction a appelé est déterminée au moment de l'opération. Une fois que la fonction ActionScript a été enregistrée auprès de la classe ExternalInterface, le conteneur peut alors appeler la fonction. La procédure d'applé varie en fonction du type de conteneur. Par exemple, si le conteneur est du code JavaScript dans un navigateur, la fonction ActionScript est appelée avec le nom de fonction enregistré, comme s'il s'agissait d'une méthode de l'objet de navigateur Flash Player (c'est-à-dire une méthode de l'objet JavaScript représentant la balise object ou embed). En d'autres termes, les paramètres sont transmis et le résultat est renvoyé comme si une fonction locale était appelée. ... . embedname = "flashObject".../> Si vous appelez une fonction ActionScript dans un fisier SWF executé dans une application de bureau, le nom de fonction enregistré et les événuels paramètres doivent être sérialisés dans une chaine au format XML. L'expérience s'effectue alors sur la méthode CallFunction() du contrôle ActiveX avec comme paramètre la chaine XML obtenue. Pour plus d'informations sur le format XML utilisé pour cette communication, voir « Format XML de l'API externe » à la page 880. Dans les deux cas, la valeur de return de la fonction ActionScript est retransmise au code du conteneur, directement sous forme de valeur si l'applant est un code JavaScript dans un navigateur ou sous forme de chaine XML s'il s'agit d'un conteneur ActiveX.

Format XML de l'API externe

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures La communication entre ActionScript et une application hébergeant le contrôle Active X Shockwave Flash nécessite un format XML spécifique qui servira à convertir les appeals de fonction et les valeurs. Le format XML utilisé par l'API externe se divise en deux parties. L'une est destinée à représentier les appeals de fonction. L'autre sert à représentier des valeurs individuelles; ce format s'aquique aux paramétres des fonctions comme aux valeurs de return. Le format XML des appeals de fonction est utilisé pour les appeals en provenance et à destination d'ActionScript. Pour un appel de fonction issu d'ActionScript, Flash Player transmet les informations XML au conteneur; pour un appel provenant du conteneur, Flash Player attend de l'application une chaîne XML du même format. L'extrait XML suivant donne un exemple d'appel de fonction formaté :
<invoke name="functionName" returntype="xml"> <arguments> ... (individual argument values) </arguments> </invoke> 
Le nœud racine est le nœud invoke. Il possède deux attributs : name indique le nom de la fonction à appeler et returntype a toujours la valeur xml. Si l'appeil de fonction inclut des paramètres, le nœud invoke possède un nœud infant arguments, dont les enfants seront les valeurs de paramètres formatées à l'aide du format de valeur individuelle expliqué ci-après. Les valeurs individuelles, notamment les paramètres de fonction et les valeurs de回头, utilisent un format qui comprend des informations sur le type de données, en plus des valeurs elles-mêmes : Le tableau suivant répertorie les classes ActionScript et le format XML utilisé pour coder des valeurs de ce type de données :
Classe/ Valeur ActionScriptClasse/ Valeur C#FormatCommentaires
nullnull
Boolean truebool true
Boolean falsebool false
Stringstring
Number, int, uintsingle, double, int, uint
Array (combinaison possible de divers types d'éléments)Une collection qui accepte des éléments de plusieurs types, par exemple ArrayList ou object[]
ObjectUn dictionnaire contenant des clés de chaîne et des valeurs d'objet, par exemple HashTable avec clés de chaînes
Autres classe intégrées ou personnalisées
Remarque : à titre d'exemple, ce tableau indique des classes C# équivalentes en plus des classes ActionScript. Néanmoins, l'API externe peut être utilisé pour communiquer avec un langage ou un moteur d'exécution prénant en charge les contrôles ActiveX, et n'est pas limitée aux applications C#. Lorsque vous creez vos propres applications à l'aide de l'API externe avec une application conteneur ActiveX, il est commode d'écrite un proxy qui effectuera la tâche de conversion des appeals de fonction native au format XML sérieisé. Pour consulter un exemple de classe proxy écrite dans C#, voir Fonctionnement interne de la classe ExternalInterfaceProxy.

Exemple d'API externe : communications entreActionScript et JavaScript dans un navigateur Web

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Cette application exemple illustré les techniques de communication possibles entre ActionScript et JavaScript au sein d'un navigateur Web. Il s'agit d'une application de messagerie instantanée qui permet à l'utiliser de discuter avec lui-même (d'ou le nom de l'application : Introvert IM). L'API externe permet d'envoyer les messages entre un-formulaire HTML dans la page Web et une interface SWF. Les techniques décrites dans cet exemple sont les suivantes : - Vérification de la disponibilité du navigateur avant d'établit la communication afin de garantir une initialisation correcte - Vérification de la prise en charge de l'API externe par le conteneur - Appel des fonctions JavaScript à partir d'ActionScript, transmission des paramètres et réception des valeurs en retard - Mise à disposition des méthodes ActionScript que JavaScript doit appeler et écution de ces appeals Pour obtenir les fichiers d'application de cet exemple, voir www.adobe.com/go/learn_programmingAS3samplesflash_fr. Les fichiers de l'application Introvert IM se trouvent dans le dossier Samples/IntrovertIM.HTML. L'application se compose des fichiers suivants :
FichierDescription
IntrovertIMApp.fla ou IntrovertIMApp.mxmlLe fichier d'application principal pour Flash (FLA) ou Flex (MXML)
com/example/programmingas3/introvertIM/IMManager.asClasse établissant et gérant les communications entre ActionScript et le conteneur.
com/example/programmingas3/introvertIM/IMMessageEvent.asType d'événement personnelisé distribué par la classe IMManager à la réception d'un message du conteneur.
com/example/programmingas3/introvertIM/IMStatus.asÉnumération dont les valeurs représentent les différents statuts de disponibilité pouvant être sélectionnés dans l'application.
html-flash/IntrovertIMApp.html ou html-template/index.template.htmlLa page HTML pour l'application pour Flash (html-flash/IntrovertIMApp.html) ou le module utilisé pour créé la page HTML du conteneur pour l'application pour Adobe Flex (html-template/index.template.html). Ce fichier contient toutes les fonctions JavaScript qui constitue le conteneur de l'application.

Préparation de la communication entre ActionScript et le navigateur

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures L'API externe est le plus souvent utilisée pour permettre aux applications ActionScript de communiquer avec le navigateur Web. Gracé à elle, les méthodes ActionScript peuvent appeler du code écrit dans JavaScript, et inversement. En raison de la complexité des navigateurs et de leurs processus internes de rendu des pages, il est impossible de garantir qu'un document SWF pourrait enregistrer ses rappels avant l'exécution du premier code JavaScript de la page HTML. Par conséquent, avant d'appeler les fonctions du document SWF à partir de JavaScript, le document SWF doit toujours appeler la page HTML pour lui indiquer qu'il est prét à accepter des connexions. Par exemple, grâce à une série d'étapes effectuees par la classe IMManager, Introvert IM détermine si le navigateur est pré à communiquer et prépare le fichier SWF à la communication. La première étape, qui vérifie que le navigateur est pré à communiquer, a lieu dans le constructeur IMManager, comme suit : public function IMManger(initialStatus:IMStatus) { _status initialStatus; // Check if the container is able to use the external API. if (ExternalInterface-available) { try { // This calls the isContainerReady() method, which in turn calls // the container to see if Flash Player has loaded and the container // is ready to receive calls from the SWF. var containerReady:Boolean = isContainerReady(); if (containerReady) { // If the container is ready, register the SWF's functions. setupCallbacks(); } else { // If the container is not ready, set up a Timer to call the // container at 100ms intervals.Once the container responds that // it's ready, the timer will be stopped. var readyTimer:Timer new Timer(100); readyTimer.addEventListener(TimerEvent.TIMER, timerHandler); readyTimer.start(); } } ... } else { trace("External interface is not available for this container."); } Tout d'abord, le code vérifie si l'API externe est disponible dans le conteneur actuel à l'aide de la propriété ExternalInterface AVAILABLE. Si c'est le case, le processus de mise en place de la communication commence. Pour parer aux évventuelles exceptions de sécurité et autres erreurs qui peuvent se produit pendant les communications avec une application externe, le code est enveloppé dans un bloc try (les blocs catch correspondants ont été omis de l'exemple pour plus de concussion). Le code appelle ensuite la méthode isContainerReady(), représentée ici: private function isContainerReady():Boolean { var result:Boolean = ExternalInterface.call("isReady"); return result; } La méthode isContainerReady() utilise à son tour la méthode ExternalInterface.call() pour appeler la fonction JavaScript isReady(), comme suit : La fonction isReady() renvoie simplement la valeur de la variable jsReady. Cette variable a au départ la valeur false. Une fois que l'évenement onload de la page Web est déclenché, la valeur de la variable devient true. En d'autres termes, si ActionScript appelle la fonction isReady() avant que la page soit chargee, JavaScript renvoie la valeur false à ExternalInterface.call("isReady"), à la suite de quoi la méthode ActionScript isContainerReady() renvoie la valeur false. Une fois la page chargee, la fonction JavaScript isReady() renvoie la valeur true, donc la méthode ActionScript isContainerReady() renvoie aussi la valeur true. Dans le constructeur IMManager, deux solutions sont possibles en fonction de la disponibilité du conteneur. Si isContainerReady() renvoie la valeur true, le code appelle simplement la méthode setupCallbacks(), qui achève la mise en place de la communication avec JavaScript. Dans l'autre cas, si isContainerReady() renvoie la valeur false, le processus est pratiquement mis en attente. Un object Timer est créé pour appeler la méthode timerHandler() toutes les 100 milliseconds, comme suit : private function timerHandler(event:TimerEvent):void { // Check if the container is now ready. var isReady:Boolean = isContainerReady(); if (isReady) { // If the container has become ready, we don't need to check anymore, // so stop the timer. Timer(event.target).stop(); // Set up the ActionScript methods that will be available to be // called by the container. setupCallbacks(); } } Chaque fois que la méthode timerHandler() est appelée, elle vérifie à nouveau le résultat de la méthode isContainerReady(). Lorsque le conteneur est initialisé, la méthode renvoie la valeur true. Le code arrête alors le minuteur et appelle la méthode setupCallbacks() pour finir la mise en place de la communication avec le navigateur.

Présentation des méthodes ActionScript à JavaScript

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Comme le montre l'exemple précédent, une fois que le code établit que le navigateur est prét, la méthode setupCallbacks() est appelée. Cette méthode prépare ActionScript pour receivevoir des appeals à partir de JavaScript, comme le montre cet exemple :
private function setupCallbacks():void   
{ //Register the SWF client functions with the container ExternalInterface.addCallback("newMessage",newMessage); ExternalInterface.addCallback("getStatus",getStatus); //Notify the container that the SWF is ready to be called. ExternalInterface.call("setSWFIsReady");   
} 
La méthode setbacks() achève la préparation de la communication avec le conteneur en appelant ExternalInterface.addCallback() afin d'enregistrer deux méthodes qui pourront être appelées par JavaScript. Dans ce code, le premier paramètre (le nom qui sert à désigner la méthode dans JavaScript, soit "newMessage" et "getStatus") est identique au nom de la méthode dans ActionScript (dans ce cas, il n'y avait pas d'intérêt à utiliser des noms différents, on a donc réutilisé les mêmes+noms par souci de simplification). Enfin, la méthode ExternalInterface.call() est utilisé pour appeler la fonction JavaScript setSWFIsReady(), qui avertit le conteneur que les fonctions ActionScript ont été enregistrées.

Communication d'ActionScript vers le navigateur

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures L'application Introvert IM met en évidence plusieurs exemples d'appel de fonctions JavaScript dans la page conteneur. Dans le cas le plus simple (un exemple issu de la méthode setupCallbacks(), la fonction JavaScript setSWFIIsReady() est appelée sans transmettre de paramètres ni receivevoir de valeur en retard : ExternalInterface.call("setSWFIsReady"); Dans un autre exemple issu de la méthode isContainerReady(), ActionScript appelle la fonction isReady() et recoit une valeur booléenne en réponse: var result:Boolean = ExternalInterface.call("isReady"); Vous pouze également transmettre des paramétres aux fonctions JavaScript à l'aide de l'API externe. Considerez par exemple la méthode sendMessage() de la classe IMManager, qui est appelée lorsque l'utiliseur envoie un nouveau message à son interlocuteur.
public function sendMessage(message:String):void   
{ ExternalInterface.call("newMessage",message);   
} 
La encore, ExternalInterface.call() sert à appeler la fonction JavaScript désignée pour avertir le navigateur du nouveau message. En outre, le message lui-même est transmis comme paramètre supplémentaire à ExternalInterface.call(). Il est ensuite transmis comme paramètre à la fonction JavaScript newMessage().

Appel du code ActionScript à partir de JavaScript

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Une communication se fait normalement de manière bidirectionnelle, ce que respecte l'application Introvert IM. D'un cotoé, le client de messagerie Flash Player appelle JavaScript pour envoyer des messages, de l'autre, le formulaire HTML appelle le code JavaScript pour envoyer des messages au fischier SWF et receivevoir de celui-ci des informations. Par exemple, lorsque le fischier SWF avertit le conteneur qu'il a etabli le contact et peut communiquer, la première action du navigateur consiste à appeler la methode getStatus() de la classe IMManager pour receivevoir du client de messagerie SWF le statut de disponibilité de l'utilisateur initial. Cela se fait dans la page Web, avec la fonction updateStatus(), comme illustré ci-après : Le code vérifie la valeur de la variable swfReady, qui vérifie si le fichier SWF a averti le navigateur qu'il avait enregistré ses méthodes auprès de la classe ExternalInterface. Si le fichier SWF est prét à receivevoir la communication, la ligne suivante (var currentStatus = ...) appelle la méthode getStatus() dans la classe IMManager. Trois opérations se produit dans cette ligne de code: - La fonction JavaScript getSWF() est appelée et renvoie une référence à l'objet JavaScript représentant le fichier SWF. Le paramètre transmis à getSWF() détermine si l'objet de navigateur est renvoyé, au cas où il yaurait plus d'un fichier SWF dans la page HTML. La valeur transmise à ce paramètre doit correspondre à l'attribut id de la balise object et à l'attribut name de la balise embed, toutes deux utilisées pour inclure le fichier SWF. - Avec la reférence au fichier SWF, la méthode(Status() est appelée comme s'il s'agissait d'une méthode de l'objet SWF. Dans ce cas, le nom de fonction «.status» est utilisé, car c'est le nom sous lequel la fonction ActionScript a été enregistrée à l'aide de ExternalInterface.addCallback(). - La méthode ActionScript getCurrent() renvoie une valeur qui est attribuée à la variable currentStatus, laquelle devient ensuite le contentu (la valeur value) du champ de texte status. Remarque: si vous vous reféréz au code, vous avez probablement noté que dans le code source relatif à la fonction updateStatus(), la ligne qui appelle la fonction getSWF() est en fait écritte comme suit: var currentStatus = getSWF("\\application").getStatus(). Le texte{application} est un espace réservé dans le modèle de page HTML. Lorsqu'Adobe Flash Builder généra la page HTML en tant que celle pour l'application, cet espace réservé est replacé par le texte faisant office d'attribut id de la balise object et d'attribut name de la balise embed (soit IntrovertIMApp dans l'exemple). Il s'agit de la valeur attendue par la fonction getSWF(). La fonction JavaScript sendMessage() illustré la transmission d'un paramètre à la fonction ActionScript (sendMessage() est la fonction appelée lorsque l'utilisateur appuie sur le bouton Envoyer de la page HTML). La méthode ActionScript newMessage() attend un seul paramètre. De ce fait, la variable JavaScript message est transmise à ActionScript en l'utilisant comme paramètre dans l'appel de la méthode newMessage() du code JavaScript.

Détection du type de navigateur

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

L'accès au contenu varie d'un navigateur à l'autre. Pour cette raison, il est important de plusieurs utiliser JavaScript pour détecter le navigateur utilisé et acceder ensuite à la série selon la syntaxe propre au navigateur à l'aide de l'objet de fenêtre ou de document, comme le montre la fonction JavaScript getSWF() de cet exemple : Si vous script ne detecte pas le type de navigateur de l'utilisateur, ce dernier peut noter un comportement inattendu lors de la lecture des fichiers SWF dans un conteneur HTML.

Chapitre 48 : Validation des signatures XML dans AIR

Adobe AIR 1.5 et les versions ultérieures Les classes de l'API XMLSignatureValidator d'Adobe® AIR® permettent de valider les signatures numériques conformes à un sous-ensemble de la recommendation du W3C portant sur la syntaxe et le traitement des signatures XML (http://www.w3.org/TR/xmldsig-core/). Des signatures XML peuvent être utilisées pour vérifier l'intégrité et l'identité du signataire des données ou des informations. Les signatures XML peuvent être utilisées pour valider les messages ou les ressources télécharge(e)s par votre application. Par exemple, si vous application fournir des services sur la base d'un abonnement, vous pouvez encapsuler les termes de l'abonnement dans un document XML signé. Si quelqu'un tente de modifier le document d'abonnement, la validation échoue. Voupez eaglement utilise une signature XML pour simplifier la validation des ressources tellechages par voite application en incluant un fisier manifest signe contenant les digests de ces resources. Notre application peut alors vérifier que les ressources n ont pas ete modifiees en comparant le digest du fisier signe et le digest calculé a partir des octets charges. Cette technique se revele particulierement utile lorsque la resource tellechage est un fisier SWF ou un autre contenu actif a executer dans le sandbox de securite de l'application.

Bases de la validation des signatures XML

Adobe AIR 1.5 et les versions ultérieures Pour obtenir une explication rapide de la validation des signatures XML, ainsi que des exemple de code correspondants, voir les articles de démarrage rapide suivants dans Adobe Developer Connection : - Création et validation de signatures XML (Flex) - Création et validation de signatures XML (Flash) (disponible en anglais uniquement) Adobe® AIR® fournir la classe XMLSignatureValidator et l'interface IURIDreferenceur pour la validation des signatures XML. La syntaxe XML acceptee par la classe XMLSignatureValidator est un sous-ensemble de la recommwandation du W3C portant sur la syntaxe et le traitement des signatures XML. (Comme seul un sous-ensemble de la recommwandation est pris en charge, toutes les signatures valides ne peuvent pas etre validees.) AIR ne fournit pas d'API capable de creer des signatures XML.

Classes de validation des signatures XML

Adobe AIR 1.5 et les versions ultérieures L'API de validation des signatures XML comprend les classes suivantes :
PackageClasses
flash.security• XMLSignatureValidator • IURIDereferencer (interface) Les constantes de chaîne XMLSignatureValidator sont définies dans les classes suivantes: • ReferencesValidationSetting • RevocationCheckSettings • SignatureStatus • SignerTrustSettings
flash.events• Event • ErrorEvent

Utilisation des classes de validation des signatures XML

Adobe AIR 1.5 et les versions ultérieures

Pour utiliser la classe XmlSignatureValidator pour valider une signature XML, vousdezez : - Creer un objet XMLSignatureValidator - Fournir une implementation de l'interface IURIDereferencer. L'objet XMLSignatureValidator appelle la méthode IURIDereferencer dereference(), en transmettant l'URI pour chaque referrer presente dans une signature. La méthode dereference() doit résoudre l'URI et renvoyer les données refériencées (situées dans le même document que la signature ou dans une ressource externe). - Définir les paramètres de certificat de confiance, de vérification de la revocation et de validation des références de l'objet XMLSignatureValidator selon les besoin de votre application. - Ajouter des écouteurs d'évenement pour les événements complete et error. Appeler la méthode verify(), en transmettant la signature à vérifier. - Traiter les événements complete et error et interpréter les résultats. L'exemple suivant implémente une fonction validate() qui vérifie la validité d'une signature XML. Les propriétés XMLSignatureValidator sont définies de telle sorte que le certificat de signature doit être present dans le magasin d'approbation du système, ou chainé vers un certificat du magasin d'approbation. L'exemple suppose également l'existence d'une classe IURIDereferencer appropriée nommée XMLDereferee. private function validate( xmlSignature:XML):void { var verifier:XMLSignatureValidator = new XMLSignatureValidator(); verifier.addEventListener(Event.COMPLET,verificationComplete); verifier.addEventListener(ErrorEvent失误,verificationError); try { verifier.uriDereferee = new XMLDereferee(); verifierreferencesValidationSetting = ReferencesValidationSetting VALID_IDENTITY; verifier revocationCheckSetting = RevocationCheckSettings.BEST_EFFORT; verifier.useSystemTrustStore = true; //Verify the signature verifier.confirm( xmlSignature ); } catch (e:Error) { trace("Verification error.\n" ^+ e); } } //Trace verification results private function verificationComplete(event:Event):void var signature:XMLSignatureValidator = event.target as XMLSignatureValidator; trace("Signature status:" ^+ signatureValidityStatus + "\n"); trace("Digest status:" ^+ signature.digestStatus + "\n"); trace("Identity status:" ^+ signature.identityStatus + "\n"); trace("Reference status:" ^+ signaturereferencesStatus + "\n"); } private function verificationError(event:ErrorEvent):void { trace("Verification error.\n" ^+ event.text); }

Processus de validation des signatures XML

Adobe AIR 1.5 et les versions ultérièures

Lorsque vous appelez la méthode vérify() de la classe XmlSignatureValidator, AIR procèle comme suit : Le moteur d'execution vérifie l'integrité cryptographique de la signature à l'aide de la clé publique du certificat. - Le moteur d'execution établie l'intégrité cryptographique, l'identité et la véracité du certificat sur la base des paramètres actuels de l'objet XMLSignatureValidator. La confiance accordée au certificat de signature est essentielle pour l'intégrité du processus de validation. La validation de la signature est effectue via un processus cryptographique bien définit, mais la fiabilité du certificat de signature ne peut pas etre assurer par un algorithme. En général, trois méthodes permettent de savoir si un certificat est fiable : - S'appuyer sur des autorités de certification et sur le magasin d'approbations du système d'exploitation. - Obtenir directement du signataire une copie du certificat, un autre certificat jouant le role d'ancre de confiance pour le certificat ou des informations permettant d'identifier le certificat avec certitude, par exemple la clé publique. - Demander à l'utilisateur final de votre application s'il fait confiance au certificat. Une telle requête n'est pas valide pour les certificats auto-signés car les informations d'identification du certificat ne sont pas fiables par nature. - Le moteur d'exécution vérifie l'intégrité cryptographique des données signées. Les données signées sont vérifiées à l'aide de votre implementation d'IURIDereferencer. Pour chaque référence du document de signature, la méthode dereference() de l'implémentation d'IURIDereferencer est appelée. Les données renvoyées par la méthode dereference() sont utilisées pour calculer le digest de référence. La valeur du digest est comparée au digest enregistré dans le document de signature. Si les digest correspondent, les données n'ont pas été modifiées depuis leur signature. Une considération importante lorsque l'on s'appuie sur les résultats de la validation d'une signature XML est que celui qui a été signé est sécurisé. Par exemple, prenons le cas de la liste signée des fischiers contenus dans un package. Lorsque XMLSignatureValidator vérifie la signature, l'opération s'assure uniquement que la liste élémente n'a pas été modifiée. Les données des fischiers n'était pas signées, la signature reste juste même si les fischiers référencés ont été modifiés ou supprimés. Remarque : pour vérifier les fichiers d'une telle liste, vous pouvez calculer le digest de leurs données (en utilisant le même algorithme de hachage que pour la liste) et comparer le résultat au digest stocké dans la liste signée. Dans certains cas, vous pouvez également vérifier la présence de fichiers supplémentaires.

Interpretation des résultats de la validation

Adobe AIR 1.5 et les versions ultérieures

Les résultats de la validation sont indiqués par les propriétés d'etat de l'objet XMLSignatureValidator. Ces propriétés peuvent être lues après la distribution de l'évenement complete par l'objet validateur. Les quatre propriétés d'etat sont : validityStatus, digestStatus, identityStatus et referencesStatus.

Propriété validityStatus

Adobe AIR 1.5 et les versions ultérieures

La propriété validityStatus renvoie la validité générale de la signature. Cette propriété validityStatus dépend de l'etat des trois autres propriétés d'etat et peut prendre l'une des valeurs suivantes : - valid: si les propriétés digestStatus, identityStatus et referencesStatus sont toutes valid. - invalid: si l'une des propriétés d'etat est invalid. - unknown: si l'une des propriétés d'etat est unknown et qu'aucun état individuel n'est invalid.

Propriété digestStatus

Adobe AIR 1.5 et les versions ultérieures

La propriété digestStatus renvoie le résultat de la vérification cryptographique du digest du message. Cette propriété digestStatus peut prendre l'une des valeurs suivantes : - valid: si le document de signature lui-même n'a pas été modifié depuis la signature. - invalid: si le document de signature a été modifié ou est incorrect. - unknown: si la méthode verifies() ne s'est pas terminée sans erreur.

Propriété identityStatus

Adobe AIR 1.5 et les versions ultérieures

La propriété identityStatus renvoie l'etat du certificat de signature. La valeur de cette propriété dépend de plusieurs facteurs : - intégrité cryptographique du certificat ; - expiration ou évocation éventuelle du certificate ; - approbation du certificat sur l'ordinateur en cours; - état de l'objet XMLSignatureValidator (par exemple, si des certificates supplémentaires ont été ajoutés pour définir la chaine de confiance, si ces certificates sontapprovés, et valeurs des propriétés useSystemTrustStore et revocationCheckSettings). La propriété identityStatus peut avoir l'une des valeurs suivantes : - valid: pour être considéré comme valide, le certificate de signature doit répondre aux conditions suivantes : - Le certificat de signature ne doit pas avoir été modifié. - Le certificat de signature ne doit pas etre arrivé à expiration ou avoir ete revoque, sauf si un horodatage valid est present dans la signature. Dans ce dernier cas, le certificat est considere comme valide pour autant qu'il ait ete au moment de la signature du document. (Le certificat utilise par le service dhorodatage pour signer l'horodatage doit etre lie par une chaine de certificats a un certificat racine de confiance sur I'ordinateur de I'utilisateur.) - Le certificat de signature est approuvé. Un certificat est approuvé lorsqu'il est situé dans le magasin d'approbation du système ou qu'il chaine vers un autre certificat du magasin d'approbation et que la propriété useSystemTrustStore est définié sur true. Vous pouvez également désigner un certificat comme étant appropue en utilisant la méthode addCertificate() de l'objet XMLSignatureValidator. - Le certificat est, en fait, le certificat de signature. - invalid: le certificat est arrivé à expiration ou a été révoqué (etaucun horodatage n'assure sa validité au moment de la signature) ou le certificat a été modifié. - unknown : si le certificat n'est pas invalide, mais qu'il n'est pas non plus approuvé. Les certificats auto-signés, par exemple, sont signalés comme unknown (sauf s'ils sont explicitement approvés). La propriété identityStatus est également désignée comme unknown si la méthode verify() ne s'est pas terminée sans erreur ou si l'idENTITY n'a pas été vérifiée parce que le digest de la signature n'est pas valide.

Propriété referencesStatus

Adobe AIR 1.5 et les versions ultérieures

La propriété referencesStatus renvoie l'intégrité cryptographique des références générées dans l'objet Signedata de la signature. - valid: si le digest calculé de chaque référence de la signature correspond au digest enregistré correspondant dans la signature XML. Un état valid indique que les données signées n'ont pas été modifiées. - invalid: si l'un des digestés calculés ne correspond pas au digest correspondant dans la signature. - unknown: si les digests des références n'ont pas ete verifiés. Les références ne sont pas vérifiees si le digest general de la signature est invalid ou si le certificat de signature n'est pas valide. Si la propriete identityStatus est unknown, les références ne sont vérifiees que si la valeur de referencesValidationSetting est validOrUnknown.

A propos des signatures XML

Adobe AIR 1.5 et les versions ultérieures

Une signature XML est une signature numérique représentée en syntaxe XML. Les données d'une signature XML peuvent être utilisées pour garantir la non modification des informations signées depuis la signature. De plus, lorsqu'un certificat de signature a été publié par une autorité de certification approuvée, l'identité du signatitaire peut être vérifiée via l'infrastructure de clé publique. Une signature XML peut être appliquée à n'importe quels type de données numériques (au format binaire ou XML). Des signatures XML sont généralement utilisées pour : - vérifier si des ressources externes ou téléchargeés ont été modifiées; - vérifier que des messages proviennent d'une source connue; - valider les droits de licence d'une application ou les droits d'abonnement.

Syntaxe de signature XML prise en charge

Adobe AIR 1.5 et les versions ultérieures

AIR prend en charge les éléments suivants de la recommendation W3C portant sur la syntaxe et le traitement des signatures : - Tous les éléments de syntaxe de signature centraux (section 4 du document de la commande W3C unquivalent), à l'exception de l'objet KeyInfo qui n'est pas entièrement pris en charge - L'élement KeyInfo ne doit containir qu'un élément X509Data. - Un élément X509Data ne doit containir qu'un élément X509Certificate. La methode digest SHA256 L'algorithm de signature RSA-SHA1 (PKCS1) - La méthode de canonisation « XML canonique sans commentaires » et l'algorithmé de transformation - La transformation de la signature enveloppée - horodatage Le document suivant présente une signature XML typique (la plupart des données cryptographiques ont ete supprimées pour simplifier l'exemple):
<Signature xmlns="http://www.w3.org/2000/09/xhtmlsig#"  
<SignedInfo>  
<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>  
<SignatureMethod Algorithm="http://www.w3.org/2000/09/xhtmlsig#rsa-sha1"/>  
<Reference URI="URI_to_signed_data">  
<Transforms>  
<Transform Algorithm="http://www.w3.org/2000/09/xhtmlsig#enveloped-signature"/>  
</Transforms>  
<DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>  
<DigestValue>uoo...vY=</DigestValue>  
</Reference>  
</SignedInfo>  
<SignatureValue>Ked...w=</SignatureValue>  
<X509Data>  
<X509Certificate>i7d...w=</X509Certificate>  
</X509Data>  
</KeyInfo>  
</Signature> 
Les éléments-clés d'une signature sont les suivants : - SignedInfo : contient les références aux données signées et les valeurs du digest calculé au moment de la signature. Les données signées elles-mêmes peuvent être inclues dans le même document que la signature XML ou peuvent être externes. - SignatureValue: contient un digest de l'objet SignedInfo chiffré avec la clé privée du signataire. - KeyInfo : contient le certificat de signature et tout certificat supplémentaire nécessaire pour étabir la chaîne d'approbation. Notez que, bien que l'élement KeyInfo soit techniquement facultatif, AIR ne peut pas valider la signature s'il n'est pas inclus. Il existe trois types généraux de signature XML : - Enveloppee : la signature est insereed dans les données XML signees. - Enveloppante : les données XML signées sont incluses dans un élément Object au sein de l'élement Signature. - Détachée : les données signées sont externes à la signature XML. Les données signées doivent être dans un fjichier externe. Elles peuvent également être dans le même document XML que la signature, mais pas dans un élément parent ou enfant de l'élement Signature. Pour réféencer les données signées, les signatures XML utilisent des URI. Pour résoudre ces URI, les applications de signature et de validation doivent utiliser les mêmes conventions. Lorsque vous utilisez la classe XMLSignatureValidator, vous devez fournir une implémentation de l'interface IURIDereferencer. Cette implémentation est chargée de résoudre l'URI et de renvoyer les données signées sous forme dobjet ByteArray. Le digest de l'objet ByteArray renvoyé est calculé avec le même algorithmme que celui qui a permis de calculator le digest de la signature.

Certificates et approbation

Adobe AIR 1.5 et les versions ultérieures Un certificat est constitué d'une clé publique, d'informations d'identification et, éventuellesment, d'un ou plusieurs certificats appartenant à l'autorité de certification émettrice. Deux méthodes permettent d'établier la confiance d'un certificat. Vous pouvez étabrir la confiance en obtenant directement une copie du certificat auprès du signataire, par exemple sur un support physique, ou par l'intémediateur d'une transmission numérique sécurisée, telle qu'une transaction SSL. Vous pouvez également vous appuyer sur une autorité de certification pour déterminer la fiabilité du certificat de signature. Dans ce cas, le certificat de signature doit être publié par une autorité approuvée sur l'ordinateur sur lequel la signature est validée. La plupart deséditeurs de systèmes d'exploitation placent les certificates racine d'un certain nombre d'autorités de certification dans le magasin d'approbation du système. Les utilisateurs peuvent également ajouter et supprimer des certificates dans ce magasin. Meme si le certificat est publié par une autorité de certification approuvée, vous doivent decide si le certificat apparait à une personne de confiance. Dans la plupart des cas, cette décision revient à l'utilisateur final. Par exemple, lors de l'installation d'une application AIR, le programme d'installation AIR affiche les informations d'identification du certificat de l'éditeur lorsqu'il invite l'utilisateur à indiquer s'il souhaite installer l'application. Dans d'autres cas, vous devrez peut-être comparer la clé publique ou d'autres informations de certificat à une liste de clés acceptables. (Cetteliste doit être sécurisée, évientuèlement par sa propre signature ou en étant stockée dans le magasin local chiffré d'AIR, de sorte que la liste elle-même ne puisse pas été alterée.) Remarque: bien que vous puissiez besoin d'approver le certificat de signature sans vérification indépendante (par exemple lorsque une signature est « auto-signée »), la vérification de la signature n'est pas suffisamment rassurante dans ce cas. Si vous ne connaissiez pas l'auteur de la signature, la certitude que la signature n'a pas été modifiée n'a que peu de valeur. La signature peut être une contrefraction signée.

Expiration et revocation des certificates

Adobe AIR 1.5 et les versions ultérieures

Tous les certificats arrivent à expiration à un moment donné. Les certificats peuvent également être révoqués par l'autorité de certification émettrice si, par exemple, la clé privée associée au certificat a été compromise ou volée. Si une signature est signée avec un certificat arrivé à expiration ou révoqué, elle est désignée comme non valide sauf si un horodatage a été inclus dans la signature. En présence d'un horodatage, la classe XMLSignatureValidator valide la signature si le certificat était valide au moment de la signature. Un horodatage est un message numérique signé provenant d'un service d'horodatage qui certifie que les données ont été signées à une heures et une date spécifique. Les horodatages sont publiés par des autorités d'horodatage et signés par le propre certificat de ces autorités. Le certificat de l'autorité d'horodatage intégré à l'horodatage doit être approvée sur l'ordinateur en cours pour que cet horodatage soit considéré comme valide. L'objet XMLSignatureValidator ne fournit pas d'API pour désigner un autre certificat à utiliser pour valider l'horodatage.

Implémentation de l'interface IURIDreferenceer

Adobe AIR 1.5 et les versions ultérieures

Pour valider une signature XML, vous devez fournir une implémentation de l'interface IURIDereferencer. Cette implémentation est chargée de résoudre les URI spécifiées dans les éléments Reference d'un document de signature XML, puis de renvoyer les données pour que le digest puisse être calculé. Le digest calculé est comparé au digest de la signature pour déterminer si les données référencées ont été modifiées depuis la création de la signature. Remarque: les applications AIR de type HTML doivent importer une bibliothèque SWF contenant une implémentation ActionScript pour valider les signatures XML. L'interface IURIDerefencer ne peut pas être implémentée en JavaScript. L'interface IURIDerefencer possède une méthode unique, déreference (uri : String), qui doit être implémentée. L'objet XMLSignatureValidator appelle cette méthode pour chaque référence présente dans la signature. La méthode doit renvoyer les données dans un objet ByteArray. Dans la plupart des cas, vous devrez également ajouter des propriétés ou des méthodes permettant à votre objecteur de localiser les données référencées. Par exemple, si les données signées sont dans le même document que la signature, vous pouvez ajouter une variable de membre fournissant une réference au document XML. La méthode déreference() peut alors utiliser cette variable, ainsi que l'URI, pour localiser les données référencées. De la même façon, si les données signées sont situées dans un réseau du système de fichiers local, la méthode déreference() peut avoir besoin d'une propriété fournissant le chemin conduisant à ce réseau pour résoudre les fichiers référencés. L'objet XMLSignatureValidator repose entièrement sur l'objet déréférenceur pour interpréter les chaînes URI. Les règles standard du déréfrencement des URI sont données dans la section 4.3.3 de la commande du W3C portant sur la syntaxe et le traitement des signatures XML.

Déréférencement des URI dans les signatures enveloppées

Adobe AIR 1.5 et les versions ultérieures

Lorsqu'une signature XML enveloppée est généraee, ses éléments sont insérés dans les données signées. Par exemple, si vous signez le message suivant à l'aide d'une structure de signature enveloppée :
<message> <data>..</data> </message> 
Le document signé résultat resemblera à cela :
<message>
    <data>...
Signature xmlns="http://www.w3.org/2000/09/xhtmlsig#" />
    <SignedInfo>
        <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
        <SignatureMethod Algorithm="http://www.w3.org/2000/09/xhtmlsig#rsa-sha1"/>
        <Reference URI=""> 
            <Transforms>
                <Transform Algorithm="http://www.w3.org/2000/09/xhtmlsig#enveloped-signature"/>
            </Transforms>
            <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
            <DigestValue>vv6...Z0Y=</DigestValue>
            </Reference>
            </SignedInfo>
            <SignatureValue>cCY...LQ=</SignatureValue>
            <KeyInfo>
                <X509Data>
                    <X509Certificate>MII...4e</X509Certificate>
                </X509Data>
            </KeyInfo>
            </Signature>
</message> 
Remarquez que la signature contient un élément Reference avec une chaine vide pour son URI. Dans ce contexte, une chaine vide fait-reference à la racine du document. Notez également que l'algorithm de transformation spécifique qu'une transformation de signature enveloppée a eté appliquée. Lorsqu'une telle transformation a eté appliquée, l'objet XMLSignatureValidator supprime automatiquement la signature du document avant de calculer le digest. Cela signifie que le déréférenceur n'a pas besoin de supprimer l'élement Signature lorsqu'il renvoie les données. L'exemple suivant presente un déréférencer pour signatures enveloppées : package { import flash.events.ErrorEvent; import flash.events.EventDispatcher; import flash.security.IURIDereferencer; import flash.utils.ByteArray; import flash.utils.IDataInput; public class EnvelopedDereferencer extends EventDispatcher implements IURIDereferencer { private var signedMessage:XML; public function EnvelopedDereferencer( signedMessage:XML ) { thissignedMessage signedMessage; } public function dereference(uri:String) :IDataInput { try { if(uri.length ! = 0 ) { throw( new Error("Unsupported signature type.")); } var data:ByteArray newByteArray(); data.writeUTFBytes( signedMessage.toXMLString()); data.position = 0 1 } catch (e:Error) { var error:ErrorEvent new ErrorEvent("Ref error " +uri + " ", false,false,emessage); this DISPatchEvent(error); data null; throw new Error("Reference not resolvable:" ^+ uri ^+ ", " ^+ emessage); } finally { return data; } } } Cette classe de déréférencer utilise une fonction constructeur avec un paramètre, signedMessage, pourmettre le document de signature enveloppée à la disposition de la méthode dereference(). Comme la référence placée dans une signature enveloppée fait toujours référence à la racine des données signées, la méthode dereferencer() écrit le document dans un tableau d'octets et renvoie celui-ci.

Déréférencement des URI dans des signatures enveloppantes et détachées

Adobe AIR 1.5 et les versions ultérieures

Lorsque les données signées sont dans le même document que la signature elle-même, les URI des références utilisent généralement la syntaxe XPath ou XPointer pour Traits de signatures. La commande du W3C portant sur la syntaxe et le traitement des signatures XML ne conseillant que cette syntaxe, il est préféable de baser votre implementation sur les signatures que vous envisagez de rencontres (et d'ajouter suffisamment de vérification d'erreur pourtraiter intelligemment la syntaxe non prise en charge). La signature d'une application AIR est un exemple de signature enveloppante. Les fischiers de l'application sont répertoriés dans un élément Manifest. L'élement Manifest est traité dans l'attribut Reference URI à l'aide de la chaine, «#PackageContents», qui fait reférence à l'identifiant de l'élement Manifest:
<Signature xmlns="http://www.w3.org/2000/09/xhtmlsig#" Id="PackageSignature">
    <SignedInfo>
        <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
    <SignatureMethod Algorithm="http://www.w3.org/TR/xhtmlsig-core#rsa-sha1"/>
    <Reference URI="#PackageContents">
        <Transforms>
            <Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
        </Transforms>
        <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
        <DigestValue>ZMGqQdaRKQc1HirIRsDpeBDlaELS+pPotdziIAyAYDk.</DigestValue>
    </Reference>
</SignedInfo>
<SignatureValue Id="PackageSignatureValue">cQK...7Zg.</SignatureValue>
(KeyInfo)
<X509Data>
    <X509Certificate>MII...T4e</X509Certificate>
</X509Data>
</KeyInfo>
<object>
<Manifest Id="PackageContents">
    <Reference URI="mimetype">
        <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256">
            </DigestMethod>
        <DigestValue>0/oCb84THKMagtI0Dy0KogEu92TegdesqRr/clXct1c.</DigestValue>
    </Reference>
    <Reference URI="META-INF/AIR/application.xml">
        <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256">
            </DigestMethod>
        <DigestValue>P9MqtqSdqcqnFgeoHCJysLQu4PmbUW2JdAnc1WLq8h4.</DigestValue>
    </Reference>
    <Reference URI="XMLSignatureValidation.swf">
        <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256">
            </DigestMethod>
        <DigestValue>OliRHRAgc9qt3Dk0m0Bi53Ur5ur3fAweIFwju74rFgE.</DigestValue>
    </Manifest>
</Object>
</Signature> 
Pour valider cette signature, un déréférenceur doit prendre la chaine URI conteneur, « #PackageContents » provenant de l'élement Reference, puis renvoyer l'élement Manifest dans un objet ByteArray. Le symbole « # » fait-reference à la valeur d'un attribut Id d'élement. L'exemple suivant implémente un déréférencer pour valider des signatures d'application AIR. Pour rester simple, l'implémentation s'appuie sur la structure connue d'une signature AIR. Un déréférencer d'objectif général pourrait être beaucoup plus complexe. package { import flash.events.ErrorEvent; import flash.security.IURIDereferencer; import flash.utils.ByteArray; import flash.utils.IDataInput; public class AIRSignatureDereferencer implements IURIDereferencer { private const XML_sig_NS:Namespace = new Namespace("http://www.w3.org/2000/09/xmldsig#"); private var airSignature:XML; public function AIRSignatureDereferencer( airSignature:XML ) { this.airSignature = airSignature; } public function dereference(uri:String):IDataInput { var data:ByteArray = null; try { if(uri != "#PackageContents") { throw(new Error("Unsupported signature type.")); } var manifest:XmlList airSignature. XML SIG_NS::Object. XML SIG_NS::Manifest; data newByteArray(); data.writeUTFBytes( manifest.toXMLString()); data.position = 0 . catch (e.Error) { data null; throw new Error("Reference not resolvable:" ^+ uri+"," ^+ emessage); } finally { return data; } } } Lorsque vous vérifie ce type de signature, seules les données de l'objet Manifest sont validées. Les fichiers stockés dans le package ne sont absolument pas vérifiés. Pour vérifier l'alteration éventuelle des fichiers du package, vous doivent dire ces fichiers, calculer leur digest SHA256 et comparer le résultat au digest enregistré dans l'objet Manifest. L'objet XMLSignatureValidator ne vérifie pas automatiquement de telles références secondaires. Remarque: cet exemple n'est fourni que pour illustrer le processus de validation d'une signature. Il n'a que peu d'utilité dans une application AIR validant sa propre signature. Si l'application a déjà été modifiée, l'agent de modification peut simplement supprimer la vérification de la validation.

Calcul des valeurs digest pour des ressources externes

Adobe AIR 1.5 et les versions ultérieures

AIR ne comprend pas de fonction intégrée pour le calcul des digest SHA256, mais le kit SDK Flex comprend une classe d'utilaires SHA256. Le kit SDK comprend également la classe d'utilaires encodeurs Base64 très utile pour comparer le digest calculé au digest stocké dans une signature. L'exemple de fonction suivant lit et valide les fichiers d'un manifeste de package AIR : import mx.util.Base64Encoder; import mx.util.SHA256; private function verifyManifest( sigFile:File, manifest:XML ):Boolean { var result:Boolean = true; var message:String = . var nameSpace:Namespace = manifest namespace(); if( manifest.nameSpace::Reference.length() < = 0 ) { result = false; message = "Nothing to validate."; } for each (var reference:XML in manifest的空间::Reference) { var file:File = sigFile.parent.parentresolvePath(reference.@URI); var stream:FileStream = new FileStream(); stream.open(file,FileMode.READ); var data:ByteArray = newByteArray(); stream.readBytes(fileData,0,stream.bytesAvailable); var digestHex:String = SHA256.computeDigest(fileData); //Convert hexadecimal string to byte array var digest:ByteArray = newByteArray(); for(var c:int = 0 ;c < digestHex.length;c + = 2 ){ var byteChar:String = digestHex.charAt(c)+ digestHex.charAt(c+1); digest.writeByte( parseInt( byteChar,16)); } digest.position = 0
var base64Encoder:Base64Encoder = new Base64Encoder();  
base64Encoder.insertNewLines = false;  
base64Encoder.encodeBytes(digest, 0, digest.bytesAvailable);  
var digestBase64:String = base64Encoder.toString();  
if (digestBase64 == reference.nameSpace::DigestValue)  
{  
    result = result && true;  
    message += " " + reference>@URI + " verified.\n";  
}  
else  
{  
    result = false;  
    message += " --- " + reference>@URI + " has been modified!\n";  
}  
base64Encoder.reset();  
}  
trace(message);  
return result; 
La fonction exécute une boucle sur toutes les références de l'élement Manifest. Pour chaque référence, le digest SHA256 est calculé, encodé au format base64, puis comparé au digest du manifesto. Les URI d'un package AIR font référence aux chemins relatifs vers le réseau de l'application. Les chemins sont résolus en fonction de l'emplacement du fisier de signature, toujours situé dans le sous-répétaire META-INF du réseau de l'application. Notez que la classe Flex SHA256 renvoie le digest sous la forme d'une chaine de caractères hexadécimale. Cette chaine doit être convertie en ByteArray contenant les octets représentés par la chaine hexadécimale. Pour utiliser les classes mx.utils.SHA256 et Base64Encoder dans Flash CS4, vous pouvez localiser et copier ces classes dans le réseau de développement de votre application ou compiler une bibliothèque SWF contenant les classes à l'aide du kit SDK Flex.

Déréfrencement des URI dans des signatures détachées référentant des données externes

Adobe AIR 1.5 et les versions ultérieures Lorsqu'une URI fait reférence à une ressource externe, les données doivent être accédées et chargées dans un objet ByteArray. Si l'URI contient une URL absolue, il s'agit simplement de dire un fichier ou de demander une URL. Si, comme dans la plupart des cas, l'URI contient un chemin relatif, votre implementation IURIDereferencer doit permettre de résoudre les chemins conduisant aux fichiers signés. L'exemple suivant utilise un objet File initialisé lorsque l'occurrence de déreference est construite en tant que base de résolution des fichiers signés. package { import flash.events.ErrorEvent; import flash.events.EventDispatcher; import flash.filesystem.File; import flash.filesystem.FileMode; import flash.filesystem.FileMode; import flash.filesystem.FileStream; import flash.security.IURIDereferencer; import flash.utils.ByteArray; import flash.utils.IDDataInput; public class RelativeFileDereferencer extends EventDispatcher implements IURIDereferencer { private var base:File; public function RelativeFileDereferencer(base:File) { this.base = base; } public function dereference(uri:String):IDataInput { var data:ByteArray = null; try{ var referent:File = this.baseresolvePath(uri); var refStream:FileStream = new FileStream(); data = new ByteArray(); refStream.open (referent,FileMode.READ); refStream.readBytes(data,0,data.bytesAvailable); } catch (e:Error){ data = null; throw new Error("Reference not resolvable:" + referent.nativePath + ", " + e.message); }finally{ return data; } } } La fonction dereference() localise simplement le fichier visé par l'URI de référence, charge le contenu du fichier dans un tableau d'octets, puis renvoie cet objet ByteArray. Remarque: avant de valider des références externes à distance, voyage si votre application peut être vulnérable à une attaque de téléphone personnel ou du même type par un document de signature créé à des fins malveillantes.

Chapitre 49 : Environnement du système client

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Ce chapitre explique comment interagir avec le système utilisateur. Il vous montre comment déterminer les fonctions prises en charge et comment construire des applications multilingues à l'aide de l'éditeur de la méthode d'entrée installée (IME) de l'utilateur (le cas échéant). Il vous présente enfin les utilisations typiques des domaines d'application.

Voir aussi

flash.system.System flash.system.Capabilities

Principes de base de l'environnement du système client

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Au fur et à mesure que vous créez des applications plus avances, il se peut que vous souhaitiez en savoir plus sur les systèmes d'exploitation de vos utilisateurs et leurs fonctions d'accès. Le package flash.system contient un ensemble de classes permettant d'acceder à des fonctions de niveau système telles que : - Détermination de l'application et du domaine de sécurité dans lesquels le code est exécuté - Détermination des fonctionnalités de l'occurrence du moteur d'exécution Flash (tel que Flash® Player ou Adobe® AIR™) de l'utilisateur (taille de l'écran - résolution) et des fonctionnalités disponibles (audio MP3, par exemple) - Création de sites multilingues utilisant l'IME - Interaction avec le contueur du moteur d'exécution Flash (qui peut être une page HTML ou une application de contueur) - Enregistrement d'informations dans le Presse-papiers de l'utilisateur Le package flash.system comprend aussi les classes IMEConversionMode et SecurityPanel. Ces classes contiennent des constantes statiques que vous pouvez utiliser avec les classes IME et de sécurité, respectivement.

Concepts important et terminologie

La liste de référence suivante contient des termes importantes : Système d'exploitation Programme principal qui est exécuté sur un ordinateur, dans lequel toutes les autres applications sont exécutées (Microsoft Windows, Mac OS X ou Linux*, par exemple). Presse-papiers Conteneur du système d'exploitation qui contient du texte ou des éléments qui sont copiés ou coupés, et à partir duquel des éléments sont collés dans des applications. Domaine d'application Mécanisme permettant de séparer les classes utilisées dans différents fischiers SWF de façon à ce que si les fischiers SWF comprendtent différentes classes portant le même nom, elles ne se replacent pas mutuellement. IME (Input Method Editor) Programme (ou outil de système d'exploitation) utilisé pour entrer des caractères ou des symboles complexes par le biais d'un clavier standard. Système client En termes de programmation, un client est la partie d'une application (ou l'application entière) exécutée sur un ordinateur et utilisé par un seul utilisateur. Le système client est le système d'exploitation sous-jacent sur l'ordinateur de l'utilateur.

Utilisation de la classe System

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures La classe System contient des méthodes et propriétés qui permettent d'interagir avec le système d'exploitation de l'utilisateur et de récapierer l'utilisation mémoire actuelle du moteur d'exécution. Les méthodes et propriétés de la classe System permettent aussi d'éçouter les événements imeComposition, d'indiquer au moteur d'exécution de charger des fichiers texte externes à l'aide de la page de code active de l'utilisateur ou d'Unicode, ou de définir le contenu du Presse-papiers de l'utilisateur.

Obtention de données sur le système de l'utilisateur pendant l'execution

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures En vérifier la propriété System.totalMemory, vous pouze déterminer la quantité de mémoire (en octets) que le moteur d'exécution utilise actuellesment. Cette propriété vous permet de surveiller l'utilisation mémoire et d'optimiser vos applications en fonction de ses variations. Par exemple, si un effet visuel particulier utilise une importante quantité de mémoire, vous pouze envisager de le modifier ou de le supprimer entièrement. La propriété System.ime est une reférence à l'IME actuellément installé. Elle vous permet d'éçouter les événements imeComposition (flash.events.IMEEvent.IME_COMPOSITION) à l'aide de la méthode addEventListener(). La troisième propriété dans la classe System est useCodePage. Si useCodePage est défini sur true, le moteur d'exécution utilise la page de code classique du système d'exploitation pour charger les fichiers texte externes. Si vous lui attribués la valeur false, vous indiquez au moteur d'exécution d'interpréter le fichier exter au format Unicode. Si vous définisse System. useCodePage sur true, souvent-vous que la page de code classique du système d'exploitation doit inclure les caractères utilisés dans votre fichier texte externe afin d'afficher le texte. Par exemple, si vous chargez un:fichier texte externe contenant des caractères chinois, ceux-ci ne peuvent s'afficher sur un système qui utilise la page de code anglaise de Windows car elle ne comprend pas les caractères chinois. Pour que les utilisateurs puissant afficher les fichiers texte externes utilisés dans l'application, qu'elle que soit la plateforme, vous nevez coder tous les fichiers texte externes en Unicode et conserver la valeur par défaut false de la propriété System.useCodePage. Le moteur d'exécution interpréte ainsi le texte au format Unicode.

Enregistrement du texte dans le Presse-papiers

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures La classe System inclut une méthode appelée setClipboard() qui permet au moteur d'exécution Flash de placer une chaine spécifique dans le Presse-papiers de l'utilisateur. Pour des raisons de sécurité, il n'este pas de méthode Security.getClipboard() car elledonnerait la possibilité d'acceder aux dernières données copies dans le Pressepapiers de l'utilisateur. Le code suivant illustré comment un message d'erreur peut être copied dans le Presse-papiers de l'utilisateur lorsqu'une erreur de sécurité survient. Le message d'erreur permettra à l'utilisateur de signaler un bague potentiel dans une application. private function securityErrorHandler(event:SecurityErrorEvent):void{ var errorString:String = [" ^+ event.type ^+ "] ^ ^+ event.text; trace(errorString); System.setClipboard(errorString); }

Flash Player 10 et AIR 1.0

La classe Clipboard permet de dire et d'ecrire les données du Presse-papiers en response à un événement utilisateur. Dans AIR, un événement utilisateur est superflu si le code s'exécute dans le sandbox de l'application pour acceder au Presse-papiers.

Utilisation de la classe Capabilities

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures La classe Capabilities permet aux développpeurs de déterminer l'environnement dans lequel s'exécute l'application. A l'aide des diverses propriétés de la classe Capabilities, vous pouvez déterminer la résolution et la langue du système de l'utilisateur, savoir si ce système prend en charge les logériels d'accèsibilité et identifier la version du moteur d'exécution Flash actuèlement installée. La vérification des propriétés de la classe Capabilities vous autorise à personnaliser votre application pour un fonctionnement optimal sur l'environnement de l'utilisateur. Par exemple, si vous vérifie les propriétés Capabilities screenResolutionX et Capabilities screenResolutionY, vous pouze déterminer la résolution d'affichage du système de l'utilisateur et decide de la taille de video la plus appropriée. Vous pouze aussi vérifier la propriété Capabilities.hasMP3 pour voir si le système de l'utilisateur prend en charge la lecture du format mp3 avant d'essayer de charger un fichier mp3 externe. Le code ci-après utilise une expression régulière pour analyser la version du moteur d'exécution Flash utilisé sur le client :
var versionString:String = Capabilities.version;   
var pattern:RegExp \(= /\) \(\text{一} (\backslash \mathsf{w}^{*})\) \(\mathrm{(\backslash d^*)}\) \((\backslash \mathrm{d}^{*})\) \((\backslash \mathrm{d}^{*})\) \\(;//   
var result:Object \(=\) pattern.exec(versionString);   
if (result != null)   
{ trace("input:" + result.output); trace("platform:" + result[1]); trace("majorVersion:" + result[2]); trace("minorVersion:" + result[3]); trace("buildNumber:" + result[4]); trace("internalBuildNumber:" + result[5]);   
}   
else   
{ trace("Unable to match RegExp.");   
} 
Si vous souhaitez envoyer les capacités du système de l'utilisateur à un script côté serveur afin de stocker les informations dans une base de données, vous pouze utiliser le code ActionScript suivant : varurl:String = "logvisitor.cfm"; varrequest:URLRequest = newURLRequest(url); request.method = URLRequestMethod.Post; request.data newURLVariables(Capabilities.serverString); var loader:URLLoader = new URLLoader(request);

Exemple d'utilisation de Capabilities : détction des capacités du système

Flash Player 9 et les versions ultérieures L'exemple CapabilitiesExplorer vous montre comment utiliser la classe flash.system.Capabilities pour déterminer les fonctions prises en charge par la version du moteur d'exécution Flash de l'utilisateur. Cet exemple étudie les techniques suivantes : - Détention des fonctions prises en charge par la version du moteur d'exécution Flash de l'utilisateur à l'aide de la classe Capabilities - Utilisation de la classe ExternalInterface pour détecter les paramètres de navigation pris en charge par le navigateur de l'utilisateur Pour obtenir les fischiers d'application de cet exemple, voir www.adobe.com/go/learn_programmingAS3samplesflash_fr. Les fischiers d'application CapabilitiesExplorer se trouvent dans le dossier Samples/CapabilitiesExplorer. Cette application se compose des fischiers suivants :
FichierDescription
CapabilitiesExplorer.fla ou CapabilitiesExplorer.mxmlFichier d'application principal dans Flash (FLA) ou Flex (MXML).
com/example/programmingas3/capabilities/CapabilitiesGrabber.asClasse fournissant la principale fonctionnalité de l'application, notamment l'ajout des capacités du système dans un tableau, le tri des éléments et l'extraction des capacités du navigateur à l'aide de la classe ExternallInterface.
capabilities.htmlContueur HTML complenant le code JavaScript nécessaire à la communication avec l'API externe.

Présentation de CapabilitiesExplorer

Flash Player 9 et les versions ultérieures Le fichier CapabilitiesExplorer.mxml se charge de définir l'interface utiliser de l'application CapabilitiesExplorer. Les capacités de la version du moteur d'exécution Flash de l'utilisateur sont affichées dans une occurrence du composant DataGrid sur la scène. Les capacités du navigateur sont également affichées si l'application est executée à partir d'un conteneur HTML et si l'API externe est disponible. Une fois que l'évenement creationComplete du filchier de l'application principale est distribué, la méthode initApp() est appelée. La méthode initApp() appelle la méthode getCapabilities() à partir de la classe com.example.programmingas3.capabilities.CapabilitiesGrabber. Le code de la méthode initApp() se présente comme suit : private function initApp():void { var dp:Array = CapabilitiesGrabber.getCapabilities(); capabilitiesGrid.dataProvider = dp; } La méthode CapabilitiesGrabber.getCapabilities() renvoie un tableau trié contenant les capacities du moteur d'execution Flash et du navigateur, qui est alors affecté à la propriété dataProvider de l'occurrence du composant DataGrid capabilitiesGrid sur la scene.

Présentation de la classe CapabilitiesGrabber

Flash Player 9 et les versions ultérieures

La méthode statique getCapabilities() de la classe CapabilitiesGrabber ajoute chaque propriété de la classe flash.system.Capabilities dans un tableau (capDP). Elle appelle ensuite la méthode statique getBrowserObjects() de la classe CapabilitiesGrabber. La méthode getBrowserObjects() utilise l'API externe pour passer en boucle sur l'objet navigator du navigator, qui contient les capacités du navigator. La méthode getCapabilities() se présente comme suit : public static function getCapabilities():Array { var capDP:Array = new Array(); capDP.push({name:"Capabilities.avHardwareDisable",value:Capabilities.avHardwareDisable}); capDP.push({name:"Capabilities.hasAccessibility",value:Capabilities.hasAccessibility}); capDP.push({name:"Capabilities.hasAudio",value:Capabilities.hasAudio}); ... capDP.push({name:"Capabilities.version",value:Capabilities.version}); var navArr:Array = CapabilitiesGrabber.getBrowserObjects(); if (navArr.length >0 ) { capDP = capDP/concatnavArr); } capDP.sortOn("name",Array.CASEINSENSITIVE); return capDP; } La méthode getBrowserObjects() renvoie un tableau de toutes les propriétés de l'objet navigator du navigateur. Si ce tableau contient un élément ou plus, le tableau des capacités du navigateur (navArr) s'ajoute au tableau des capacités de Flash Player (capDP) et le tableau résultat est trié par ordre alphabétique. Enfin, le tableau trié est renvoyé au fisier de l'application principale, qui ensuite remplit la grille de données. Le code de la méthode getBrowserObjects() se présente comme suit : private static function getBrowserObjects():Array { var itemArr:Array = new Array(); var itemVars:URLVariables; if (ExternalInterface-available) { try { var tempStr:String = ExternalInterface.call("JS_getBrowserObjects"); itemVars = new URLVariables(tempStr); for(var i:String in itemVars) { itemArr.push({name:i, value:itemVars[i]}); } catch (error:SecurityError) { // ignore } } return itemArr; } Si l'API exter est disponible dans l'environnement de l'utilisateur, le moteur d'exécution Flash appelle la méthode JavaScript JS_getBrowserObjects(), qui passé en boucle sur l'objet navigator du navigator et renvoie une chaine de valeurs au format URL à ActionScript. Cette chaine est alors convertie en un object URLs Variables (itemVars) et ajoutée au tableau itemArr, qui est renvoyé au script appelant.

Communication avec JavaScript

Flash Player 9 et les versions ultérieures

La dernière étape dans la construction de l'application CapabilitiesExplorer consiste à écrire le code JavaScript nécessaire au passage en boucle de chaque élément de l'objet navigator du navigator et à l'ajout d'une paire nom-valeur dans un tableau-temporaire. Le code de la méthode JavaScript JS_getBrowserObjects() dans le fjichier container.html est le suivant : Le code commence par创建工作 un tableau-temporaire qui contendra toutes les paires nom-valueur de l'objet navigator. Une boucle for...in est ensuite appliquée à l'objet navigator, et le type de données de la valeur actuelle est évaluée pour éliminer les valeurs indésirables. Dans cette application, seules les valeurs String ou Boolean nous interèssent. Les autres types de données (par exemple les fonctions ou les tableaux) sont ignorés. Chaque valeur String ou Boolean de l'objet navigator est ajoutée au tableau tempArr. Une boucle for...in est ensuite appliquée à l'objet screen du navigator, et chaque valeur numérique est ajoutée au tableau tempArr. Enfin, le tableau-temporaire est converti en chaîne à l'aide de la méthode Array. join(). Ce tableau utilise l'esperluette (&) comme délimueur, ce qui permet à ActionScript d'analyser facilement les données à l'aide de la classe URLs Variables.

Chapitre 50 : Appel et fermeture d'une application AIR

Adobe AIR 1.0 et les versions ultérieures Cette section est consacrée aux différentes techniques d'applé d'une application Adobe® AIR® installée, ainsi qu'aux options et considérations de fermeture d'une application en cours d'exécution. Remarque: les objets NativeApplication, InvokeEvent et BrowserInvokeEvent ne sont proposés qu'au contenu SWF qui s'exécute dans le sandbox d'une application AIR. Un contenu SWF qui s'exécute dans le moteur d'exécution Flash Player, au sein du navigateur ou du lecteur autonome (projection), ou dans une application AIR hors du sandbox d'application, ne peut pas acceder à ces classes. Pour obtenir une explication rapide de l'ouverture et de la fermetre d'une application AIR et des exemples de code correspondants, voir les articles de démarrage rapide suivants dans Adobe Developer Connection : - Options de démarrage

Voir aussi

flash desktop. Native Application flash.events.InvokeEvent flash.events.BrowserInvokeEvent

Appel d'une application

Adobe AIR 1.0 et les versions ultérieures Une application AIR est appelée lorsque l'utiliseur (ou le système d'exploitation) exécute l'une des actions suivantes : - Il lance l'application à partir du shell de poste de travail. - Il utilise l'application comme une commande sur un shell de ligne de commande. - Il ouvre un type de fichier pour lequel cette application correspond à l'application d'ouverture définie par défaut. - (Mac OS X) Il clique sur l'icone de l'application sur la barre des tâches du Dock (que l'application soit en cours d'exécution ou non). - Il可以选择 de lancer l'application à partir du programme d'installation (à la fin d'un nouveau processus d'installation ou après un double-clic sur le fjichier AIR d'une application déjà installée). - Il commence une mise à jour d'une application AIR alors que la version installée l'informe qu'elle est déjà en train detraiter des mises à jour (par l'inclusion de la déclaration true dans le fichier descriptor d'application). - (iOS) Il recooit une notification du service APN (Apple Push Notification). - Il invoque l'application via une URL. - Il consulte une page Web hébergeant une application ou un badge Flash appelant la méthode com.adobe.air.AIR launchApplication() qui spécifie les informations d'identification relatives à l'application AIR. (Le descripteur d'application doit également comprendre une déclaration true afin que les appels au navigateurboutissent.) Dès qu'une application AIR est appelée, AIR distribue un objet InvokeEvent de type invoke par le biais de l'objet NativeApplication Singleton. Afin de laisser à une application le temps de s'initialiser et d'enregistrer un écouteur d'évenement, les événements invoke sont placés en file d'attente au lieu d'être ignorés. Dès qu'un écouteur est enregistré, tous les événements places en file d'attente sont livrés. Remarque : lorsqu'une application est appelée au moyen de la fonction d'appoint du navigateur, l'objet NativeApplication distribue un événement invoke uniquely si l'application n'est pas en cours d'exécution. Pour receivevoir des événements invoke, appelez la méthode addEventListener() de l'objet NativeApplication (NativeApplication.nativeApplication). Lorsqu'un écouteur d'évenement s'enregistre pour un événement invoke, il recoit également tous les événements invoke survenus avant l'enregistrement. Les événements invoke placés en file d'attente sont distribués un par un dans un court laps de temps après le renvoi de l'appel à addEventListener(). Si un nouvel événement invoke se produit au cours de ce processus, il peut être distribué avant un ou plusieurs des événements placés en file d'attente. Ce placement des événements en file d'attente vous permet de:gérer tous les événements invoke survenus avant l'exécution de votre code d'initialisation. Sachez que si, plus tard dans l'exécution (après l'initialisation de l'application), vous ajoutez un écouteur d'évenement, celui-ci recevra toujours tous les événements invoke survenus depuis le lancement de l'application. Une seule occurrence d'une application AIR est lancée. Lorsqu'une application en cours d'exécution est à nouveau appelée, AIR distribue un nouvel événement invoke vers elle. C'est l'application AIR qui est chargée de répondre à un événement invoke et de prendre les mesures appropriées ( comme l'ouverture d'une nouvelle fenêtre de document). Un objet InvokeEvent contient tous les arguments transmis à l'application, de même qu'un réseau à partir duquel l'application a été appelée. Si l'application a été appelée via une association de type de fichier, le chemin d'accès complet au fichier est alors inclus dans les arguments de ligne de commande. De la même manière, si l'application a été appelée via une mise à jour, le chemin d'accès complet au fichier AIR de mise à jour est fourni. Lorsque plusieurs fischiers sont ouverts simultanément, un seul objet InvokeEvent est distribué sous Mac OS X. Chaque fisquier est inclus dans le tableau arguments. Sous Windows et Linux, un objet InvokeEvent distinct est distribué pour chaque fisquier. Votre application gère les événements invoke en enregistrant un écouteur avec son objet NativeApplication : NativeApplication-nativeApplication.addEventListener(InvokeEvent.INVOKE, onInvokeEvent); Et en définissant un écouteur d'évenement : var arguments:Array; var currentDir:File; public function onInvokeEvent invocation:InvokeEvent):void { arguments = invocationarguments; currentDir = invocation.currentDirectory;

Capture des arguments de ligne de commande

Adobe AIR 1.0 et les versions ultérièures

Les arguments de ligne de commande associés à l'objet d'une application AIR sont livrés dans l'objet InvokeEvent distribué par l'objet NativeApplication. La propriété arguments d'un objet InvokeEvent contient un tableau des arguments transmis par le système d'exploitation suite à l'objet d'une application AIR. Si les arguments contiennent des chemins de fichiers relatifs, il est généralement possible de résoudre les chemins à l'aide de la propriété currentDirectory. Les arguments transmis à un programme AIR sont traités sous forme de chaînes délimitées par des espaces, à moins d'être placés entre guillemets doubles :
ArgumentsArray
tick tock{tick,tock}
tick "tick tock"{tick,tick tock}
"tick" "tock"{tick,tock}
\"tick\" \\"tock\"{"tick","tock"}
La propriété/currentDirectory d'un objet InvokeEvent contient un objet File représentant le repertoire à partir duquel l'application a été lancée. Lorsqu'une application est appelée suite à l'ouverture d'un fichier dont le type est enregistré par l'application, le chemin d'accès natif au fichier est compris dans les arguments de ligne de commande sous forme de chaine. (Votre application est chargée d'ouvrir le fichier ou d'effectuer l'opération attendue.) De la même manière, lorsqu'une application est programmée pour semettre à jour automatiquement (plutôt que de dépendre de l'interface utilisateur de mise à jour d'AIR standard), le chemin d'accès natif au fichier AIR est inclus si un utilisateur double-clique sur un fichier AIR contenant une application dotée de l'ID d'application correspondant. Vou puez acceder au fichier à l'aide de la méthode resolve() de l'objet File currentDirectory:
if((invokeEvent.currentDirectory != null)&&(invokeEventarguments.length > 0)) { dir = invokeEvent.currentDirectory; fileToOpen = dirResolvedPath.invokeEventarguments[0]); } 
Il est également recommandé de vérifier qu'un argument correspond effectivement à un chemin d'accès à un fichier.

Exemple : Journal des événements d'appoint

Adobe AIR 1.0 et les versions ultérièures

L'exemple suivant explique comment enregistrer des écouteurs pour l'évenement invoke et comment gérer ce type d'évenement. Dans cet exemple, tous les événements d'appl reçus sont consignés dans un journal et le repertoire actif ainsi que les arguments de ligne de commande sont affichés. Exemple ActionScript
package   
{ import flash.display.Sprite; import flash.events.InvokeEvent; import flashdesktop.NativeApplication; import flash.text.TextField; public class InvokeEventLogExample extends Sprite { public var log:TextField; public function InvokeEventLogExample() { log = newTextField(); log.x = 15; log.y = 15; log.width = 520; log.height = 370; log/background = true; addChild(log); NativeApplication.nativeApplication.addEventListener(InvokeEvent.INVOKE, onInvoke); } public function onInvoke(invokeEvent:InvokeEvent):void { var now:String = new Date().getTimeString(); logarithm("Invoke event received: "+now); if (invokeEvent.currentDirectory != null) { logarithm("Current directory=" + invokeEvent.currentDirectory.nativePath); } else { 
logEvent(--no directory information available--);
}
if (invokeEventarguments.length > 0)
{
    logEvent("Arguments: " + invokeEventarguments.toString());
}
else
{
    logEvent(--no arguments--);
}
} 
Example Flex
<?xml version="1.0" encoding="utf-8"?>   
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" invoke="onInvoke(event)" title="Invocation Event Log"> <mx:Script> <! [CDATA] import flash.events.InvokeEvent; import flash desktop NativeApplication; public function onInvoke(invokeEvent:InvokeEvent):void { var now:String = new Date().getTimeString(); logEvent("Invoke event received: " + now); if (invokeEvent.currentDirectory != null) { logEvent("Current directory=" + invokeEvent.currentDirectory.nativePath); } else { logEvent "--no directory information available--"); } if (invokeEvent.args.length > 0) { logEvent("Arguments: " + invokeEvent.args.toString()); } else { logEvent "--no arguments--"); } } public function logEvent(entry:String):void { log.text += entry + "\n"; trace(entry); } ]] </mx:Script> <mx:TextArea id="log" width="100%" height="100%" editable="false" valueCommit="log(verticalScrollPosition=log.textHeight;"/> </mx:WindowedApplication> 

Appel d'une application AIR lors de la connexion d'un utilisateur

Adobe AIR 1.0 et les versions ultériées Il est possible de configurer le lancement automatique d'une application AIR au moment de la connexion de l'utilisateur actif en définissant la propriété NativeApplication startAtLogin sur true. Une fois ce paramètre défini, l'application est lancée automatiquement chaque fois que l'utilisateur se connecte. Elle continue à démarrer lors d'une connexion tant que le paramètre n'est pas définir sur false. Soit ce changement est effectué manuellement par l'utilisateur via le système d'exploitation, soit il survient suite à la désinstallation de l'application. Le lancement au moment de la connexion est un paramètre d'execution. Le paramètre s'applique uniquement à l'utilisateur actif. L'application doit être installée pour que la propriété startAtLogin soit définie sur true. Une erreur est renvoyée si la propriété est défini elle� que I'application n'est pas installee (suite a un lancement a I'aide dADL, par exemple). Remarque : l'application n'est pas lancée au démarrage du système informatique. Elle s'ouvre lorsque l'utilisateur se connecte. Pour déterminer si une application a démarré automatiquement ou si son lancement résultat d'une action utilisateur, vous pouvez examiner la propriété reason de l'objet InvokeEvent. Si la propriété est définie sur InvokeEventReason.INS, l'application a demarré automatiquement. Pour d'autres chemins d'invocation, la propriété reason est définie comme suit : - InvokeEventReason.NOTIFICATION (iOS uniquely): l'application a été invoquée via le service APN. Pour plus d'informations sur le service APN, voir Utilisation de notifications Push. - InvokeEventReason. OPEN_URL : l'application a ete invoquee par une autre application ou par le systeme. - InvokeEventReason.Standard : tous les autres cas. Pour acceder à la propriété reason, votre application doit cibler AIR 1.5.1 ou une version ultérieure (pour ce faire, définitisser la valeur d'espace de noms correcte dans le fjichier descriptor de l'application). L'application simplifiée suivante fait appel à la propriété reason de l'objet InvokeEvent pour déterminer son comportement lorsqu'il se produit un événement invoke. Si la propriété reason est définie sur « login », l'application demeure en arrêté-plan. Si tel n'est pas le cas, l'application principale devient visible. Une application qui fait appel à cette technique démarre généralement lorsque l'utilisateur se connecte pour pouvoir executer un traitement en arrêté-plan ou une surveillance d'évenement et ouvre une fenêtre en réponse à un événement déclenché par l'utilisateur.
package { import flash desktop.InvokeEventReason; import flash desktop.NativeApplication; import flash.display.Sprite; import flash.events.InvokeEvent; public class StartAtLogin extends Sprite { public function StartAtLogin() { try { NativeApplication.nativeApplication.startAtLogin = true; } catch (e:Error) { trace("Cannot set startAtLogin:" + e.message); } NativeApplication.nativeApplication.addEventListener(InvokeEvent.INVOKE, onInvoke); } private function onInvoke(event:InvokeEvent):void { if(event_reason == InvokeEventReason.LOGIN) { //do background processing... trace("Running in background..."); } else { this_stage.nativeWindowactivate(); } } } 
Remarque : pour évaluer la différence de comportement, mettez en package l'application et installez-la. La propriété startAtLogin est réservée aux applications installedes.

Appel d'une application AIR à partir du navigateur

Adobe AIR 1.0 et les versions ultérieures

La fonction d'applé du navigateur permet à un site Web de lancer une application AIR installée à partir du navigateur. L'appe du navigateur est uniquement autorisé si le fichier descriptor d'application définit allowBrowserInvocation sur true: true Lorsque l'application est appelée par le biais du navigateur, l'objet NativeApplication de l'application distribue un objet BrowserInvokeEvent. Pour receivevoir des événements BrowserInvokeEvent, appelez la méthode addEventListener() de l'objet NativeApplication (NativeApplication.nativeApplication) dans l'application AIR. Lorsqu'un écouteur d'évenement s'enregistre pour un événement BrowserInvokeEvent, il recoit également tous les événements BrowserInvokeEvent survenus avant l'enregistrement. Ces événements sont distribués après le renvoi de l'appel à addEventListener(), mais pas nécessairement avant d'autres événements BrowserInvokeEvent susceptibles d'être reçus après l'enregistrement. Cela vous permit de:gérer les événements BrowserInvokeEvent survenus avant l'exécution de votre code d'initialisation (comme, par exemple, lorsque l'application a été appelée au départ depuis le navigator). Sachez que si, plus tard dans l'exécution (après l'initialisation de l'application), vous ajoutez un écouteur d'évenement, celui-ci recèvra toujours tous les événements BrowserInvokeEvent survenus depuis le lancement de l'application. L'objet BrowserInvokeEvent comprend les propriétés suivantes :
PropriétéDescription
argumentsTableau d'arguments (de chaînes) à transmettre à l'application.
isHTTPSIndique si le contentu du navigateur utilise le modèle d'URL https (true) ou pas (false).
isUserEventIndique si l'appel du navigateur aentrainé un événement utiliser pour (tel qu'un cig de souris). Dans AIR 1.0, cette propriété est toujours définie sur true; AIR requiert un événement utilisé pour la fonction d'appel du navigateur.
sandboxTypeType de sandbox relatif au contentu du navigateur. Les valeurs valides sont identiques à celles qui sont admises pour la propriété Security.sandboxType. Il peut s'agir de l'une des valeurs suivantes:Security.APPLICATION:le contentu se trouve dans le sandbox de sécurité de l'application.Security.LOCAL_TRUSTED:le contentu se trouve dans le sandbox de sécurité local avec système de fichiers.Security.LOCAL_WITH_FILE:le contentu se trouve dans le sandbox de sécurité local avec système de fichiers.Security.LOCAL_WITH_NETWORK:le contentu se trouve dans le sandbox de sécurité local avec accès au réseau.Security remotE:le contentu se trouve dans un domaine (réseau) distant.
securityDomainCorrespond au domaine de sécurité du contentu du navigateur, tel www.adobe.com ou www.example.org.Cette propriété est uniquement définie pour le contentu du sandbox de sécurité distant (pour le contentu d'un domaine réseau). Elle n'est pas définie pour un contentu figurant dans un sandbox de sécurité d'application ou local.
Si vous utilisez la fonction d'applel du navigateur, tenez compte des implications au niveau de la sécurité. Lorsqu'un site Web lance une application AIR, il peut envoyer les données par le biais de la propriété arguments de l'objet BrowserInvokeEvent. Utilisez ces données avec précaution dans toute opération délicate, telle que des API de chargement de code ou de fichier. Le niveau de risque varie en fonction de l'usage que l'application réserve aux données. Si seul un site Web spécifique doit appeler l'application, celle-ci doit vérifier la propriété securityDomain de l'objet BrowserInvokeEvent. Vous pouvez également exiger de la part du site Web appelant l'application qu'il utilise le protocole HTTPS, ce que vous pouvez contrôler en vérifier la propriété isHTPS de l'objet BrowserInvokeEvent. L'application devrait valider les données transmises. Si, par exemple, une application s'attend à receivevoir des URL pointant vers un domaine spécifique, elle devrait vérifier que les URL pointent réellement vers le domaine attendu. Cette procédure peut empêcher un pirate de tromper l'application en lui demandant de lui envoyer des données sensibles. Aucune application ne devrait utiliser d'arguments BrowserInvokeEvent susceptibles de pointer vers des ressources locales. Ainsi, il est vivement déconseilé de conceiveoir une application qui create des objets File à partir d'un chemin transmis depuis le navigateur. Si le navigateur peut transmettre des chemins distants, l'application devrait vérifier que ces derniers n'utilisent pas le protocole file: // à la place d'un protocole distant.

Fermeture d'une application

Adobe AIR 1.0 et les versions ultérieures

Le moyen le plus rapide pour fermer une application consiste à appeler la méthode NativeApplication exit(). Cette approche fonctionne correctement si votre application ne doit pas enregistrer de données ou nettoyer une ressource externe. L'appeil de la méthode exit() entraine la fermetre de toutes les fenêtres, puis celle de l'application. Toutefois, pour permettre aux fenêtres ou à d'autres composants de l'application d'internorme le processus de fermetre, afin d'enregistrer des données cruciales par exemple, distribuez les événements d'advertisement pertinents avant d'appeler exit(). Un autre point à prendre en compte dans le cadre de l'arrêt progressif d'une application est l'utilisation d'un seul chemin d'exécution, qu'elle que soit la manière dont le processus d'arrêt commence. L'utilisateur (ou le système d'exploitation) peut déclencher la fermeture de l'application de l'une des manières suivantes : - En fermant la dernière fenêtre de l'application lorsqu'la méthode NativeApplication.nativeApplication.autoExit est définié sur true. - En sélectionnant la commande de fermeture d'application à partir du système d'exploitation comme, par exemple, lorsque l'utilisateur désits la commande Quitter de l'application dans le menu par défaut. (Cela se produit uniquement sous Mac OS, car Windows et Linux ne fournissent pas de commande de fermeture d'application via le chrome système.) - En arrêtant l'ordinateur. Lorsqu'une commande de fermetre est traitée par le biais du système d'exploitation selon l'une de ces méthodes, NativeApplication distribue un événement exiting. Si aucun écouteur n'annule l'événement exiting, toutes les fenêtres qui étaient ouvertes se ferment. Chaque fenêtre distribue un événement closing suivi d'un événement close. Si l'une des fenêtres annule l'événement closing, le processus d'arrêt est interrompu. Si l'ordre de fermeture des fenêtres présente un problème pour votre application, écoutez l'évenement exiting de NativeApplication et fermez manuellement les fenêtres dans l'ordre approprié. Tel est par exemple le cas lorsqu'une fenêtre de document contient des palettes d'outils. Il peut s'avérer peu pratique (voire pire) que le système ferme les palettes alors que l'utilisateur a choisi d'annuler la commande de fermeture afin d'enregistrer des données. Sous Windows, vous obtiendaç uniquement l'évenement exiting après la fermeture de la première fenêtre (lorsque la propriété autoExit de l'objet NativeApplication est définie sur true). Pour adopter un comportement homogène sur toutes les plates-formes, que la série de fermeture soit lancée via le chrome du système d'exploitation, les commandes de menu ou la logique de l'application, suivez les recommendations ci-après pour fermer l'application : 1 Distribuez always un événement exiting par le biais de l'objet NativeApplication avant d'appeler exit() dans le code de l'application et vérifie qu'aucun autre composant de l'application n'annule l'évenement. public function applicationExit():void{ var exitingEvent:Event = new Event(Event.EXITING, false, true); NativeApplication.nativeApplication_dispachEvent(exitingEvent); if(!exitingEvent.isDefaultPrevented()){ NativeApplication.nativeApplication.exit(); } } 2 Ecoutez l'évenement exiting de l'application à partir de l'objet NativeApplication.nativeApplication et, dans le gestionnaire, fermez toutes les fenêtres ouvertes (en distribuant d'abord un événement closing). Effectuez les évientuelles tâches de nettoyage nécessaires (enregistrement des données de l'application, suppression des fichiers temporaires, etc.) une fois toutes les fenêtres fermées. Faites exclusivement appel à des méthodes synchrones lors du nettoyage afin de vous assurer qu'elle sont bien terminées avant la fermeture de l'application. Si l'ordre de fermeture des fenêtres est sans importance, vous pouvez analyser en boucle le tableau NativeApplication.nativeApplicationopenedWindows et fermer chaque fenêtre une après l'autre. Si l'ordre de fermeture compte,élaborez un moyen de l'appliquer aux fenêtres.
private function onExiting exitingEvent:Event):void {  
    var winClosingEvent:Event;  
    for each (var win:NativeWindow in NativeApplication.nativeApplication.openedWindows) {  
        winClosingEvent = new Event(Event.CLOSING,false,false);  
        win DISPatchEvent(winClosingEvent);  
        if (!winClosingEvent.isDefaultPrevented()) {  
            win.close();  
        } else {  
            exitingEventpreventDefault();  
        }  
    }  
    if (! exitingEvent.isDefaultPrevented()) {  
        //perform cleanup  
    } 
3 Les fenêtres devraient toujours gérer leur propre nettoyage en écouteant les événements closing qui les concernent. 4 Utilisez un seul écouteur exiting dans l'application, car les gestionnaires appelésAAParavant ignorent si des gestionnaires ultérieurs annuleront I'événement exiting (sans compter qu'il serait déraisonnable de se fier à l'ordre d'exécution).

Chapitre 51 : Utilisation des informations sur le moteur d'execution d'AIR et les systèmes d'exploitation

Adobe AIR 1.0 et les versions ultérieures La presente section décrit comment une application AIR peut:gérer des associations de fichiers de systèmes d'exploitation, constater les activités des utilisateurs et dire des informations sur le moteur d'exploitation Adobe® AIR.

Voir aussi

flash desktop. Native Application

Gestion des associations de fichiers

Adobe AIR 1.0 et les versions ultérieures Les associations entre votre application et un type de fichier doivent être déclarées dans le descriptor d'application. Au cours du processus d'installation, le programme d'installation de l'application AIR spécifique celle-ci comme application de démarrage par défaut pour chacun des types de fichiers déclarés, à moins qu'une autre application ne le soit déjà par défaut. Le processus d'installation de l'application AIR n'écrase pas une association de types de fichiers existants. Pour remplacer l'association par une autre application, appezez la méthode NativeApplication.setAsDefaultApplication() lors de l'exécution. Il est recommandé de s'assurer que les associations de fichiers prévues sont en place lorsque vous application démarre. Ceci, parce que le programme d'installation de l'application AIR n'annule pas les associations de fichiers existantes et que ces associations sur un système d'utilisateur peuvent changer à tout moment. Lorsqu'une autre application dispose de l'association de fichiers actuelle, il est recommandé par courtoisie de demander une autorisation à l'utilisateur avant de prendre le contrôle de l'association en cours. Les méthodes suivantes de la classe NativeApplication permettent à une application de gérer des associations de fichiers. Chacune des méthodes prend l'extension du type de fichier comme paramètre.
MéthodeDescription
isSetAsDefaultApplication()Renvoie true si l'application AIR est actuellément associée au type de fichier spécifique.
setAsDefaultApplication()Crée l'association entre l'application AIR et l'opération d'ouverture du type de fichier.
removeAsDefaultApplication()Annule l'association entre l'application AIR et le type de fichier.
getDefaultApplication()Signale le chemin de l'application qui est actuellément associée au type de fichier.
AIR ne peut gérer des associations que pour des types de fichiers déclarés à l'origine dans le descriptor d'application. Il n'est pas possible de dire des informations sur les associations d'un type de fichier non déclaré, même si un utilisateur a créé manuellement l'association entre ce type de fichier et votre application. L'appeal de toute méthode de gestion d'association de fichiers avec l'extension, pour un type de fichier non déclaré dans le descriptor d'application, provoque le rengoit d'une exception d'exécution par l'application

Lecture de la version du moteur d'exécution et du correctif

Adobe AIR 1.0 et les versions ultérieures L'objet NativeApplication possède une propriété段时间Version, qui correspond à la version du moteur d'exécution dans lequel l'application est executée (une chaine telle que "1.0.5"). L'objet NativeApplication possède également une propriété段时间PatchLevel qui est un niveau du correctif pour le moteur d'exécution, un nombre tel que 2960. Le code ci-dessous utilise ces propriétés : trace(NativeApplication.nativeApplication+runtimeVersion); trace(NativeApplication.nativeApplication+runtimePatchLevel);

Détction des capacité d'AIR

Adobe AIR 1.0 et les versions ultérieures Pour un fichier regroupé avec l'application Adobe AIR, la propriété Security.sandboxType est définie sur la valeur spécifiée par la constante Security.APPLICATION. Vous pouvez charger le contenu, qui peutContainir ou non des interfaces de programmation spécifique à AIR, selon qu'un fichier se trouve ou non dans le sandbox de sécurité d'Adobe Air, comme le montre le code ci-dessous :
if (Security.sandboxType == Security.APPLICATION)  
{ // Load SWF that contains AIR APIs  
} else { // Load SWF that does not contain AIR APIs  
} 
Toutes les ressources qui ne sont pas installées avec l'application AIR sont affectées aux mêmes sandbox de sécurité que ceux qu'Adobe Flash Player auraient affecté dans un navigateur Web. Les ressources distantes sont placées dans des sandbox selon leurs domaines d'origine tandis que les ressources locales le sont dans un sandbox local avec accès au réseau, local avec système de fichiers ou approvéd locally. Vou puez controler si la propriete statique CapabilitiesplayerType est definié sur "Desktop" pour voir si le contenu est exécuté dans le moteur d'exécution (et non pas dans Flash Player qui, lui, est exécuté dans un navigateur). Pour plus d'informations, voir « Sécurité AIR » à la page 1122.

Suivi de la présence des utilisateurs

Adobe AIR 1.0 et les versions ultérieures

L'objet NativeApplication distribue deux événements qui vous aient à détecter àquel moment un utilisateur est actif sur son ordinateur. Si aucune activités de souris ou de clavier n'est détectee dans l'intervalle fixe par la propriété NativeApplication.idleThreshold, la NativeApplication distribue un événement userIdle. Lorsque survient l'entrée suivante par le clavier ou par la souris, l'objet NativeApplication distribue un événement userPresent. L'intervalle idleThreshold est mesure en secondes et il a une valeur par défaut de 300, soit cinq minutes. Vous pouvez également dire le nombre de secondes depuis la dernière saisie de l'utilisateur grâce à la propriété NativeApplication-nativeApplication.lastUserInput. Les lignes de code ci-dessous définissant le salarié d'inactivité sur deux minutes et elles sont à l'écoute des deux événements userIdle et userPresent : NativeApplication-nativeApplication.idleThreshold = 120 NativeApplication-nativeApplication.addEventListener(Event.User_IDLE, function(event:Event) { trace("Idle"); }); NativeApplication-nativeApplication.addEventListener(Event USER_present, function(event:Event){ trace("Present"); }); Remarque: il n'y a qu'un seul événement userIdle distribué entre deux événements userPresent quels qu'ils soient.

Chapitre 52 : Utilisation des fenêtres natives Air

Adobe AIR 1.0 et les versions ultérieures Utilisez les classes fournies par l'API de la fenêtre native d'Adobe® AIR® pour creer et gérer les fenêtes du poste de travail.

Principes de base des fenêtres natives dans AIR

Adobe AIR 1.0 et les versions ultérieures Pour obtenir une explication rapide de l'utilisation des fenêtres natives dans AIR et des exemples de code correspondants, voir les articles de démarrage rapide suivants dans Adobe Developer Connection : - Création d'une application munie de fenêtres transparentes (Flex) - Interaction avec une fenêtre (Flex) - Personnalisation de l'aspect d'une fenêtre native (Flex) - Demarrage de fenêtres (Flex) - Création de fenêtres affichées l'une derrière l'autre (Flex) - Contrôle de l'ordre d'affichage des fenêtres (Flex) - Création de fenêtres redimensionnables et non rectangulaires (Flex) - Interaction avec une fenêtre (Flash) - Personnalisation de l'aspect d'une fenêtre native (Flash) - Création de fenêtres affichées l'une derrière l'autre (Flash) - Contrôle de l'ordre d'affichage des fenêtres (Flash) - Création de fenêtres redimensionnables et non rectangulaires (Flash) AIR offre une API multiplateformes facile a utiliser vous permettant de creer des fenêtres natives dans un systeme d'exploitation à l'aide de Flash®, Flex™ et des techniques de programmation HTML. Gréce à AIR, vous pouvez personnaliser l'aspect de votre application en toute liberté. Les fenêtres que vous créez peuvent ressembler à une application de bureau standard, en reproduisant le style Apple lors d'une éçuation sous Mac, en respectant les conventions Microsoft lors d'une écution sous Windows, et en s'harmonisant au gestionnaire de fenêtres sous Linux, sans inclure une seule ligne de code spécifique à une plate-forme. Vous pouvez par ailleurs utiliser le chrome extensible, auquel il est possible d'appliquer une enveloppe, fourni par la structure d'application Flex afin de créé votre propre style,quelle que soit la plate-forme d'éçuction de votre application. Vous pouvez de surcroit concevoir votre propre chrome de fenêtre avec des vecteurs et des images bitmap, et utiliser les effets de transparence, ainsi que le fondu alpha avec le poste de travail. Vous en avez assez des fenêtres rectangulaires? Créez des fenêtres arrondies!

Fenêtres dans AIR

Adobe AIR 1.0 et les versions ultéieures

AIR prend en charge trois API distinctes pour l'utilisation des fenêtres : - La classe NativeWindow, orientée ActionScript, fournit l'API de la fenêtre du niveau le plus bas. Utilisez la classe NativeWindow dans les applications programmées dans ActionScript et Flash Professional. Pensez à étendre la classe NativeWindow pour spécialiser les fenêtres utilisées dans votre application. - Dans l'environnement HTML, vous pouvez utiliser la classe Window de JavaScript, comme dans toute application Web à base de navigateur. Les appeals aux méthodes Window de JavaScript sont transmis à l'objet window natif sous-jacent. - Les classes Flex framework mx: WindowedApplication et mx: Window fournissent une « enveloppe » Flex à la classe NativeWindow. Le composant WindowedApplication remplace le composant Application lorsque vous créEZ une application AIR avec Flex et doit toujours être utilisé comme fenêtre initiale dans votre application Flex.

Fenêtres ActionScript

Lorsque vous creez des fenêtres avec la classe NativeWindow, utilisez directement la scene et la liste d'affichage de Flash Player. Pour ajouter un objet visuel à une classe NativeWindow, ajoutez l'objet à la liste d'affichage de la scene de la fenêtre ou à un autre conteneur d'objet d'affichage sur la scene.

Fenêtres HTML

Lorsque vous creez des fenêtres HTML, utilisez HTML, CSS et JavaScript pour afficher du contenu. Pour ajouter un objet visuel à une fenêtre HTML, ajoutez ce contenu au DOM HTML. Les fenêtres HTML sont une catégorie spéciale de l'objet NativeWindow. L'hote AIR définit une propriété nativeWindow dans les fenêtres HTML, qui fournit l'accès à l'occurrence de NativeWindow sous-jacente. Utilisez cette propriété pour acceder aux propriétés, méthodes et événements de l'objet NativeWindow décrits ici. Remarque : l'objet Window de JavaScript dispose également de méthodes pour la réduction de scripts dans la fenêtre conteneur, telles que moveTo () et close(). Lorsque plusieurs méthodes sont disponibles, utilisez celle qui vous convient le mistroux.

Fenêtres de la structure d'application Flex

Lorsque vous créez des fenêtres avec la structure d'application Flex, vous utilisez normalement des composants MXML pour replir la fenêtre. Pour ajouter un composant Flex à une fenêtre, ajoutez l'élement de composant à la définition MXML de la fenêtre. Vous pouvez également utiliser ActionScript pour ajouter du contenu de façon dynamique. Les composants mx:WindowedApplication et mx:Window sont conçus comme conteneurs Flex et peuvent par conséquent accepter directement les composants Flex, ce que les objets NativeWindow ne permettent pas. Le cas échéant, il est possible d'acceder aux propriétés et méthodes NativeWindow par le biais des objets WindowedApplication et Window à l'aide de la propriété nativeWindow.

La fenêtre initiale de l'application

AIR create pour vous la première fenêtre de l'application. AIR définit les propriétés et le contenu de la fenêtre à l'aide des paramètres spécifique dans l'élement initialWindow du filchier descriptor d'application. Si le contenu racine est un fichier SWF, AIR create une occurrence de NativeWindow, charge le fichier SWF et l'ajoute à la scène de la fenêtre. Si le contenu racine est un fichier HTML, AIR create une fenêtre HTML et charge le fichier HTML.

Classes d'une fenêtre native

Adobe AIR 1.0 et les versions ultérieures L'API de la fenêtre native contient les classes suivantes :
PackageClasses
flash.display·NativeWindow ·NativeWindowInitOptions ·NativeWindowDisplayState ·NativeWindowResize ·NativeWindowSystemChrome ·NativeWindowType
flash.events·NativeWindowBoundsEvent ·NativeWindowDisplayStateEvent

Flux d'événements des fenêtres natives

Adobe AIR 1.0 et les versions ultérieures Les fenêtres natives distribuents des événements pour notification les composants intéressés qu'un changement important est sur le point de se produit ou s'est déjà produit. La plupart des événements basés sur les fenêtres sont distribués par paires. Le premier événement informe qu'un changement est sur le point de se produit. Le deuxième événementannounce qu'un changement a été effectué. Vous pouze annuler un événement d'advertissement, mais pas un événement de notification. La séquence suivante illustré le flux d' événements qui se produit lorsqu'un utilisateur clique sur le bouton d'agrandissement d'une fenêtre : 1 L'objet NativeWindow distribue un événement displayStateChanging. 2 Sieldomecouteurenregistre n'annule l'evénement,la fenetre est agrandie. 3 L'objet NativeWindow distribue un événement displayStateChange. L'objet NativeWindow distribue en outre des événements lors de modifications associées ayant trait à la taille et à la position de la fenêtre. La fenêtre ne distribue aucun événement d'avertissement pour ces modifications associées. Les événements associés sont les suivants : a Un événement move est distribué si le coin supérieur gauche de la fenêtre s'est déplaced suite à un agrandissement. b Un événement resize est distribué si la taille de la fenêtre a changé suite à un agrandissement. Un objet NativeWindow distribue une série d'événements similaire lors de l'agrandissement, de la restauration, de la fermeture, du déplacement et du redimensionnement d'une fenêtre. Les événements d'ajretissement ne sont distribués que lorsqu'une modification est initiaee via le chrome de la fenetre ou un autre mecanisme controle par le systeme d'exploitation. Lorsque vous appelez une methode window pour modifier la taille, la position ou l'etat d'affichage de la fenetre, la fenetre ne distribue qu'un seul événement pour annoncer la modification. Vous pouze distribuer un événement d'ajretissement, si vous le souhaitez, à l'aide de la méthode dispatchEvent ( ) de la fenetre, puis vérifier si votre événement d'ajretissement a eté annulé avant d'effectuer la modification. Pour plus d'informations sur les classes, les méthodes, les propriétés et les événements de l'API de fenêtre, voir le manuel Guide de référence ActionScript 3.0 pour la plate-forme Adobe Flash.

Propriétés de contrôle du style et du comportement d'une fenêtre native

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Les propriétés suivantes contrôle l'aspect et le comportement de base d'une fenêtre : type systemChrome - transparent - owner Lorsque vous creez une fenêtre, vous définisse ces propriétés sur l'objet NativeWindowInitOptions transmis au constructeur de fenêtre. AIR lit les propriétés de la fenêtre d'application initiale à partir du fichier descriptor et dont la valeur est toujours normal.) Il est impossible de modifier les propriétés une fois la fenêtre créée. Certains paramétres de ces propriétés sont mutuellement incompatibles : systemChrome ne peut pas être définir sur standard lorsque transparent est défini sur true ou type est défini sur lightweight.

Types de fenêtre

Adobe AIR 1.0 et les versions ultérieures Les types de fenêtres d'AIR combinent les attributs de chrome et de visibilité du système d'exploitation natif pour créé trois types de fenêtre fonctionnels. Utilisez les constantes définies dans la classe NativeWindowType pour réféencer les noms des types de fenêtre dans le code. AIR fournit les types de fenêtre suivants :
TypeDescription
NormaleUne fenêtre classique. Les fenêtes normales utilisent le chrome plein écran et apparaissent dans la barre des tâches Windows et le menu de la fenêtre Mac OS X.
UtilitaireUne palette d'outils. Les fenêtes d'utilitaire utilisent une version plus fine du chrome système et n'apparaissent ni dans la barre des tâches Windows ni dans le menu de la fenêtre Mac OS X.
LégèreLes fenêtes légères n'utilistant pas de chrome et n'apparaissent ni dans la barre des tâches Windows ni dans le menu de la fenêtre Mas OS X. De plus, les fenêtes légères ne disposent pas du menu Système (Alt-Espace) sous Windows. Les fenêtes légères sont adaptées aux commandes et aux bulles de notification (listes déroulantes qui ouvrent une zone d'affichage de courte durée, par exemple). Lorsque le type légère est utilisé, la propriété systemChrome doit être définie sur none.

Chrome de la fenêtre

Adobe AIR 1.0 et les versions ultérieures Le chrome d'une fenêtre est un ensemble de commandes qui permet aux utilisateurs de manipuler une fenêtre dans l'environnement de bureau. Le chrome comprend les éléments suivants : barre de titre, boutons de la barre de titre, encadrement et poignées de redimensionnement.

Chrome système

Voupe ouvez definir la propriete systemChrome sur standard ou sur none. Choisissez le chrome système standard pour attribuer à votre fenêtre le jeu de commandes standard créé par le système d'exploitation de l'utilisateur. Choisissez none pour creer votre propre chrome de fenêtre. Utilisez les constantes définies dans la classe NativeWindowSystemChrome pour réféencer les paramètres du chrome système dans le code. Le chrome système est géré par le système. Notre application ne bénéficie pas d'un accès direct aux commandes, mais peut réagir aux événements distribués lorsque les commandes sont utilisées. Lorsque vous utilisez le chrome standard pour une fenêtre, la propriété transparent doit être définie sur false et la propriété type doit être définie sur normal ou sur utility.

Chrome Flex

Lorsque vous utilisez les composants WindowedApplication ou Window de Flex, la fenetre peut faire appel soit au chrome système, soit au chrome fourni par la structure d'application Flex. Pour utiliser le chrome Flex, définièsez la propriété systemChrome requise pour creer la fenêtre sur none. Si vous utilisez les composants spark de Flex 4 au lieu des composants mx, vous devez spécifique la classe d'enveloppe pour faire appel au chrome de Flex. Libre à vous de faire appel aux enveloppés intégrées ou à vos propres enveloppés. L'exemple suivant illustrate l'utilisation de la classe d'enveloppe WindowedApplication des composants spark intégrée pour proposer le chrome de fenêtre :
<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx">
<fx:Style>
@namespace "library://ns.adobe.com/flex/spark";
WindowedApplication
{
   skinClass:ClassReference("spark.skins.spark.SparkChromeWindowedApplicationSkin");
}
</fx:Style>
</s:WindowedApplication> 
Pour plus d'informations, voir Using Flex 4: About the AIR window containers: Controlling window chrome (disponible en angeais uniquement)

Chrome personnelé

Lorsque vous creez une fenêtre sans chrome système, vousdez ajouter vos propres commandes de chrome afin de gérer les interactions entre un utilisateur et la fenêtre. Vous estés égarlement libre de creator des fenêtres transparentes et non rectangulaires. Pour utiliser un chrome personnalisé avec le composant mx:WindowedApplication ou mx:Window, vous devez définir le style showFlexChrome sur false. Si tel n'est pas le cas, Flex intégre son propre chrome à vos fenêtres.

Transparence de la fenêtre

Adobe AIR 1.0 et les versions ultéieures

Pour permettre le fondu alpha d'une fenetre avec le bureau ou d'autres fenêtes, definissez la propriete transparent de la fenetre sur true. La propriete transparent, qui doit etre definie avant de creer la fenetre, ne peut pas etre modifiee. Une fenêtre transparente ne dispose d'aucun arrêté-plan par défaut. Les zones d'une fenêtre qui ne contiennentaucun objet créé par l'application sont invisibles. Si le paramètre alpha d'un objet affché est inférieur à un, tout élément affché sous l'objet apparait, notamment les autres objets d'affichage de la fenêtre, les autres fenêtres et le bureau. Les fenêtres transparentes sont utiles lorsque vous souhaitez créé des applications aux cordures irrégulières, qui « s'attenuent » ou semble invisibles. Le rendu des zones de grande taille sur lesquelles le fondu alpha a été appliqué peut tout fois être lent ; par conséquent, n'utilise cet effet que lorsque cela est strictement nécessaire. Important : sous Linux, les événements de souris ne passent pas à travers des pixels entièrement transparents. Évitez de créé des fenêtres complenant de vastes zones entièrement transparentes car vous pourriez bloquer de façon invisible l'accès de l'utilisateur aux autres fenêtres ou aux autres éléments de son bureau. Sous Mac OS X et Windows, les événements de souris passent à travers les pixels entièrement transparents. La transparence ne peut pas etre utilise avec des fenetes disposant d'un chrome syste. En outre, le contenu SWF et PDF dans HTML risque de ne pas s'afficher dans des fenetes transparentes. Pour plus d'informations, voir « Elements à prendre en compte lors du chargement d'un contenu SWF ou PDF dans une page HTML » à la page 1045. La propriété statique NativeWindowsupportsTransparency indique si la transparence de la fenetre est disponible. Si la transparence n'est pas prise en charge, l'application utilise un arrêtre-plan noir. Dans ce cas, les zones transparentes de l'application s'affichent en noir opaque. Il est recommandé de proposer une solution de remplacement au cas où cette propriété serait définie sur false. Vous pourriez ainsi montré une boîte de dialogue d'ajretissement à l'utilisateur ou afficher une interface utilisateur rectangulaire et non transparente. Notez que la transparence est toujours prise en charge par les systèmes d'exploitation Mac et Windows. La prise en charge sur les systèmes d'exploitation Linux requiert un gestionnaire de composition de fenêtres. Cependant, même lorsqu'un tel gestionnaire est disponible, la transparence peut ne pas être disponible du fait des options d'affichage de l'utilisateur ou de sa configuration matérielie.

Transparence dans une fenetre d'application MXML

Adobe AIR 1.0 et les versions ultérieures

Par défaut, l'arrière-plan d'une fenêtre MXML est opaque, même si vous creez la fenêtre à l'aide de la propriété transparent. (Notez l'effet de transparence aux coins de la fenêtre.) Pourprésenter un arrrière-plan transparent pour la fenêtre, définissez une couleur d'arrière-plan et une valeur alpha dans la feuille de style ou l'élement contenu dans le fjichier MXML de votre application. Par exemple, la déclaration de style suivante confère à l'arrrière-plan une nuance de vert légèrement transparente :
WindowedApplication   
{ background-alpha:".8"; background-color:"0x448234";   
} 

Transparence dans une fenetre d'application HTML

Adobe AIR 1.0 et les versions ultérieures

Par défaut, l'arrière-plan du contenu HTML affché dans les fenêtres HTML et les objets HTMLLoader est opaque, même si la fenêtre conteneur est transparente. Pour désactiver l'arrière-plan par défaut du contenu HTML, définissez la propriété paintsDefaultBackground sur false. L'exemple suivant create un objet HTMLLoader et désactive l'arrière-plan par défaut : varhtmlView:HTMLLoader = newHTMLLoader();htmlView paintsDefaultBackground = false; Cet exemple utilise JavaScript pour désactiver le chrome par défaut d'une fenêtre HTML :
window.htmlLoader.paintsDefaultBackground = false; 
Si un élément du document HTML définit une couleur d'arrière-plan, l'arrière-plan de cet élément n'est pas transparent. Il est impossible de définir une transparence (ou une opacité) partielle. Vous pouvez néanmoins utiliser une image transparente au format PNG comme arrrière-plan d'une page ou d'un élément de page pour obtenir un effet visuel similaire.

Appartenance des fenêtres

Une fenêtre peut être propriété d'une ou de plusieurs fenêtres. Celles-ci s'affichent toujours devant la fenêtre maître, sont réduites en icône et restaurées conjointement avec elle et sont fermées lors de la fermeture de cette dernière. Il est impossible de transférer ou supprimer l'appartenance des fenêtres. Une fenêtre ne peut appartenir qu'à une seule fenêtre maître, mais peut posseder un nombre illimité d'autres fenêtres. L'appartenance des fenêtres permet de simplifier la gestion des fenêtres servant de palettes d'outils ou de boîtes de dialogue. Supposons, par exemple, que vous affichiez une boîte de dialogue d'enregistrement en konjction avec une fenêtre de document. Si la boîte de dialogue appartient à la fenêtre de document, elle s'affiche automatiquement devant la fenêtre de document. - NativeWindow owner - Christian Cantrel: Owned windows in AIR 2.6 (disponible en anglais uniquement)

Catalogue des effets visuels d'une fenêtre

Adobe AIR 1.0 et les versions ultérieures Le tableau suivant illustrer les effets visuels resultant de diverses combinaisons de paramétres de propriétés de fenêtre sous Mac OS X, Windows et Linux :
Paramètres de fenêtreMac OS XMicrosoft WindowsLinux*
Type : normale
SystemChrome : standard
Transparent : false
Type : utiliser
SystemChrome : standard
Transparent : false
Type : tout type
SystemChrome : aucun
Transparent : false
Type : tout type
SystemChrome :(PC)aucen
Transparent : true
mxWindowedApplication ou mx:Window
Type : tout type
SystemChrome :(PC)aucen
Transparent : true
'Ubuntu avec gestionnaire de fenêtres Compiz Remarque: les éléments du chrome système suivants ne sont pas pris en charge par AIR: barre d'outils Mac OS X, icône proxy Mac OS X, icones de la barre de titre Windows et chrome système alternatif.

Creation de fenêtres

Adobe AIR 1.0 et les versions ultérieures

AIR create automatiquement la première fenetre d'une application, mais vous pouvez creer autant de fenêtes supplémentaires que vous le souhaitez. Pour creer une fenetre native, utilisez la méthode constructeur NativeWindow. Pour creer une fenetre HTML, utilisez la methode createRootWindow() de l'objet HTMLLoader ou appelez la methode JavaScript window. open() depuis un document HTML. La fenetre creee est un objet NativeWindow dont la liste d'affichage contient un objet HTMLLoader. L'objet HTMLLoader interprete et affiche le contenu HTML et JavaScript associé à la fenetre. Vous pouze acceder aux propriétés de l'objet NativeWindow sous-jacent à partir de JavaScript par le biais de la propriétéwindow nativeWindow. (Cette propriété est réservée au code qui s'exécut dans le sandbox d'application AIR.) Lorsque vous initialisiez une fenêtre, y compris la fenêtre d'application initiale, il peut s'avérer utile de la creator dans l'état invisible, de charger un contenu ou d'exécuter toute mise à jour graphique, puis d'activer la visibilité de la fenêtre. Cette série permet d'éviter que l'utilisateur visualise toute modification visuelle peu judicieuse. Pour stipuler que la fenêtre initiale de l'application doit être créé dans l'état invisible, spécifique la balise false dans le descripteur d'application (ou omettez complètement la balise, puisque false est la valeur par défaut). Les nouvelles fenêtes NativeWindows sont invisibles par défaut. Lorsque vous créez une fenêtre HTML par le biais de la méthode createRootWindow() de la classe HTMLLoader, vous pouvez définir l'argument visible sur false. Appelez la méthode activate() de NativeWindowmethod ou définièsez la propriété visible sur true pour activer la visibilité d'une fenêtre.

Spécification des propriétés d'initialisation d'une fenêtre

Adobe AIR 1.0 et les versions ultérieures

Une fois la fenêtre du bureau créé, il est impossible de modifier les propriétés d'initialisation d'une fenêtre native. Ces propriétés immuables et leurs valeurs par défaut sont les suivantes :
PropriétéValeur par défaut
systemChromestandard
typenormal
transparentfalse
ownernull
maximizabletrue
minimizabletrue
resizabletrue
Définissez les propriétés de la fenêtre initiale créé par AIR dans le fjichier déscripteur d'application. La fenêtre principale d'une application AIR est toujours de type normale. (Vous pouvez spécifique d'autres propriétés de fenêtre dans le fjichier déscripteur, telles que visible, width, et height, et les modifier à tout moment.) Définissez les propriétés des autres fenêtres natives et HTML créées par votre application à l'aide de la classe NativeWindowInitOptions. Lorsque vous creez une fenêtre, vous devez transmettre unobjet NativeWindowInitOptions spécifique les propriétés de la fenêtre à la fonction constructeur NativeWindow ou à la méthode createRootWindow() de l'objet HTMLLoader. Le code suivant cree un objet NativeWindowInitOptions pour une fenetre d'utilitaire :
var options:NativeWindowInitOptions = new NativeWindowInitOptions();  
options.systemChrome = NativeWindowSystemChrome.STANDARD;  
options.type = NativeWindowType.UTILITY  
optionstransparent = false;  
options.resizable = false;  
options.maximizable = false; 
Il est impossible de définir systemChrome sur standard lorsque la propriété transparent est définie sur true ou lorsque la propriété type est définie sur lightweight. Remarque : vous ne pouvez pas définir les propriétés d'initialisation d'une fenêtre créé avec la fonction window. open ( ) de JavaScript. Vous pouvez toute fois passer outre la méthode de création de ces fenêtes en implémentant votre propre classe HTMLHost. Pour plus d'informations, voir la section « Traitément desAAPels JavaScript àwindow.open( ) » à la page 1057. Lorsque vous creez une fenetre à l'aide de la classe mx: Window de Flex, définitisse les propriétés d'initialisation sur l'objet window en tant que tel, soit dans la déclaration MXML de la fenetre, soit dans le code qui creé la fenetre. L'objet NativeWindow sous-jacent n'est pas créé tant que vous n'vez pas appelé la méthode open(). ÀpRES avoir ouvert une fenetre, il est impossible de modifier ces propriétés d'initialisation.

Creation de la fenêtre initiale de l'application

Adobe AIR 1.0 et les versions ultérieures

AIR create la fenêtre initiale de l'application en fonction des propriétés spécifiées dans le fjichier descriptor et charge le fjichier lié réchéné dans l'élement de contenu. L'élement de contenu doit faire ↔ une fjichier SWF ou HTML. La fenêtre initiale peut être la fenêtre principale de votre application, ou permettre simplement de lancer une ou plusieurs autres fenétres. Il n'est absolument pas nécessaire de rendre cette fenêtre visible.

Creation de la fenêtre initiale à l'aide d'ActionScript

Adobe AIR 1.0 et les versions ultérieures

Lorsque vous creez une application AIR à l'aide d'ActionScript, la classe principale de votre application doit etendre la classe Sprite (ou une sous-classe de cette derniere). Cette classe sert de point d'entrée principal à l'application. Lorsque vous application s'ouvre, AIR create une fenêtre, creée une occurrence de la classe principale, puis ajoute l'occurrence à la scene de la fenêtre. Pour acceder à la fenêtre, vous pouvez écouter l'évenement addedToStage, puis utiliser la propriétéffectiveWindow de l'objet Stage pour obtenir une ↔reference à l'objet NativeWindow. L'exemple suivant illustrer les squelette de base de la classe principale d'une application AIR créé avec ActionScript : package { import flash.display.Nativewindow; import flash.display.Sprite; import flash.events.Event; public class MainClass extends Sprite { private var mainWindow:Nativewindow; public function MainClass(){ this.addEventListener(Event.ADED_TO_STAGE,initialize); } private function initialize(event:Event):void{ mainWindow = this stage.nativewindow; //perform initialization... mainWindowactivate(); //show the window } } Remarque: techniquement, vous POUVEZ acceder à la propriété native window de la fonction constructeur de la classe principale. Il s'agit cependant d'un cas spécial qui ne s'applique qu'à la fenetre d'application initiale. Lorsque vous creez une application dans Flash Professional, la classe de document principale est automatiquement généree si vous n'en creez pas une dans un fichier ActionScript distinct. Vous pouze acceder à l'objet NativeWindow associé à la fenetre initiale par le biais de la propriété nativeWindow de la scene. A titre d'exemple, le code suivant active la fenetre principale dans un état d'affichage maximal (à partir du scenario): import flash.display.Nativewindow; var mainWindow:NativeWindow = this stage nativeWindow; mainWindow.maximize(); mainWindowactivate();

Création de la fénètre initiale à l'aide de Flex

Adobe AIR 1.0 et les versions ultérieures

Lorsque vous creez une application AIR à l'aide de la structure d'application Flex, utilisez mx:WindowedApplication comme élément racine de votre fichier MXML principal. (Vous pouvez utiliser le composant mx:Application, mais il ne prend pas en charge toutes les fonctionnalités intégrées à AIR.) Le composant WindowedApplication sert de point d'entrée initia/à l'application. Lorsque you lancez l'application, AIR create une fenetre native, initiaise la structure d'application Flex et ajoute l'objet WindowedApplication à la scene de la fenetre. Une fois la séquence de lancement terminée, l'objet WindowedApplication distribue un événement applicationComplete. Accédez à l'objet de la fenêtre du bureau avec la propriété native Window de l'occurrence de WindowedApplication. L'exemple suivant create un composant WindowedApplication simple qui définit ses coordonnées x et y :
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml">
    applicationComplete="placeWindow"/>
    <mx:Script>
        <!--[CDATA[ private function placeWindow():void{ this.nativeWindow.x = 300; this.nativeWindow.y = 300; } ]
    ]">
        </mx:Script>
<mx:Label text="Hello World" horizontalCenter="0" verticalCenter="0"/> </mx:WindowedApplication> 

Création d'une classe NativeWindow

Adobe AIR 1.0 et les versions ultérieures

Pour creer une classe NativeWindow, transmettez un objet NativeWindowInitOptions au constructeur NativeWindow :
var options: NativeWindowInitOptions = new NativeWindowInitOptions();  
options.systemChrome = NativeWindowSystemChrome.STANDARD;  
optionstransparent = false;  
var新模式: NativeWindow = new NativeWindow(options); 
La fenêtre ne s'affiche pas tant que vous ne définissez pas la propriété visible sur true ou tant que vous n'appelez pas la méthode activate(). Une fois la fenêtre créée, vous pouvez initiaiser ses propriétés et charger le contenu dans la fenêtre à l'aide de la propriété stage et des techniques de la liste d'affichage de Flash. Dans la plupart des cas, vous doivent définir la propriété scaleMode de la scene d'une nouvelle fenêtre native sur noScale (utilissez la constante StageScaleMode.NO Scale). Les modes d'échelle de Flash sont conçus pour des situations dans lesquelles l'auteur de l'application ne connait pas à l'avance le format de l'espace d'affichage de l'application. Les modes d'échelle permettent à l'auteur de faire le moins mauvaisCHOIS : découper le contenu, létirer ou le compresser, ou le replir d'espace vide. Etant donné que vous contrôlez l'espace d'affichage dans AIR (le cadre de la fenêtre), vous pouvez dimensionner la fenêtre en fonction du contenu ou dimensionner le contenu en fonction de la fenêtre sans aucun compromis. Le mode d'échelle pour Flex et les fenêtres HTML est automatiquement définir sur noScale. Remarque: pour déterminer les tailles maximale et minimale des fenêtres disponibles sur le système d'exploitation, utilisez les propriétés NativeWindow statiques suivantes :
var maxOSSize:Point = NativeWindow.systemMaxSize;  
var minOSSize:Point = NativeWindow.systemMinSize; 

Creation d'une fenêtre HTML

Adobe AIR 1.0 et les versions ultérieures

Pour creer une fenetre HTML, vous pouze appeler la methode Window.open() de JavaScript ou appeler la methode createRootWindow() de la classe HTMLLoader d'AIR. Le contenu HTML dans les sandbox de sécurité peuvent utiliser la méthode standard Window. open() de JavaScript. Si le contenu est exécuté hors du sandbox de l'application, la méthode open() ne peut être appelée qu'en réponse à l'interaction de l'utilisateur, notamment lorsque ce dernier clique sur la souris ou appuie sur une touche. Lorsque la méthode open() est appelée, une fenêtre avec un chrome système est créé pour afficher le contenu à l'URL spécifique. Exemple :
newWindow = window.open("xmpl.html", "logWindow", "height=600, width=400, top=10, left=10"); 
Remarque: vous pouvez etendre la classe HTMLHost dans ActionScript pour personnelier la fenetre creee avec la fonctionnalite window.open() de JavaScript. Voir la section « A propos de l'extension de la classe HTMLHost » à la page 1049. Le contenu du sandbox de sécurité de l'application a accès à la méthode de création de fenêtres la plus performante : HTMLLoader.createRootWindow(). Cette méthode vous permet de spécifique toutes les options de création d'une nouvelle fenêtre. Par exemple, le code JavaScript suivant créé un type de fenêtre légère sans chrome système, d'une taille de 300x400 pixels :
var options = new air.NativeWindowInitOptions();  
options.systemChrome = "none";  
options.type = "lightweight"; 
var windowBounds = new airRectangle(200, 250, 300, 400);
newHTMLLoader = air.HTMLLoader.createRootWindow(true, options, true, windowBounds);
newHTMLLoader.load(new air(URLRequest("xml.html")); 
Remarque: si le contenu charge par la nouvelle fenêtre se trouve hors du sandbox de sécurité de l'application, l'objet window ne possède aucune propriété AIR: runtime, nativeWindow ou htmlLoader. Si vous creez une fenetre transparente, le contenu SWF intégre au code HTML charge dans cette fenêtre ne s'affiche pas systématique. Vous doivent définir le paramètre wmode de l'objet ou de la balise embed qui fait reference au fichier SWF sur opaque ou transparent. Étant donné que la valeur par défaut de wmode est window, le contenu SWF ne s'affiche par défaut pas dans une fenêtre transparente. Un contenu PDF ne s'affiche pas dans une fenêtre transparente, qu'elle que soit la valeur définie de wmode. (Dans les versions d'AIR antérieures à 1.5.2, il était également d'impossible d'afficher un contenu SWF dans une fenêtre transparente.) Les fenêtres créées avec la méthode createRootWindow() restent indépendantes de la fenêtre d'ouverture. Les propriétés parent et opener de l'objet Window de JavaScript sont définies sur null. La fenêtre d'ouverture peut acceder à l'objet Window de la nouvelle fenêtre à l'aide de la référence HTMLLoader renvoyée par la fonctionnalité createRootWindow(). Dans le cadre de l'exemple précédent, l'instruction newHTMLLoaderwindow référencerait l'objet Window de JavaScript de la fenêtre créé. Remarque : la fonctionnalité createRootWindow() peut être appelée depuis JavaScript et ActionScript.

Creation d'un composant mx:Window

Adobe AIR 1.0 et les versions ultérièures

Pour creer un composant mx:Window, vous pouze creer un fichier MXML à l'aide de mx:Window comme balise racine ou appeler directement le constructeur de la classe Window. L'exemple suivant cree et affiche un composant mx:Window en appelant le constructeur Window :
var newWindow: Window = new Window();  
newWindowsystemsChrome = NativeWindowSystemChrome.NONE;  
newWindowtransparent = true;  
newWindow.title = "New Window";  
newWindow.width = 200;  
newWindow.height = 200;  
newWindow.open(true); 

Ajout de contenu à une fenêtre

Adobe AIR 1.0 et les versions ultérieures

La méthode d'ajout de contenu à une fenêtre AIR dépend du type de fenêtre. Ainsi, MXML et HTML vous permettent de définir d'une manière déclarative le contenu de base de la fenêtre. Vous pouvez intégrer des ressources dans les fichiers SWF de l'application ou les charger à partir de fichiers d'application distincts. Le contenu Flex, Flash et HTML peut être créé au moment opportun et ajoute à la fenêtre de façon dynamique. Lorsque vous chargez du contentu SWF ou du contentu HTML contenant JavaScript, vous doivent tener compte du modele de sécurité d'AIR. Le contentu dans le sandbox de sécurité de l'application, c'est-à-dire le contentu installé avec votre application et pouvant être chargé avec le modele d'URL app:, dispose de privilèges complets pour acceder à toutes les API d'AIR. Le contentu charge hors de ce sandbox ne peut pas acceder aux API d'AIR. Le contentu JavaScript hors du sandbox de l'application ne peut pas utiliser les propriétés runtime, nativeWindow et htmlLoader de l'objet Window de JavaScript. Pour sécuriser la programmation croisée, vous pouvez utiliser un pont de sandbox afin de fournir une interface limitée entre le contenu applicatif et le contenu hors application. Dans le contenu HTML, vous pouvez également mapper les pages de votre application sur un sandbox hors application afin que le code sur cette page puisse intercoder le contenu externe. Voir le chapitre « Sécurité AIR » à la page 1122.

Chargement d'une image ou d'un fichier SWF

Vou puez charger des images ou des fichiers Flash SWF dans la liste d'affichage d'une fenetre native à l'aide de la classe flash.display.Loader: package { import flash.display.Sprite; import flash.events.Event; import flash.net(URLRequest; import flash.display.Loader; public class LoadedSWF extends Sprite { public function LoadedSWF(){ var loader:Loader = new Loader(); loader.load(new URLRequest("visual.swf")); loader(contentLoaderInfo.addEventListener(Event.COMPLET,loadFlash); } private function loadFlash(event:Event):void{ addChild(event.targetloader); } } Remarque: les ancients fichiers SWF créés à l'aide d'ActionScript 1 ou 2 partagent les états globaux, tels que les définitions de classe, les singletons et les variables globales, si ceux-ci sont charges dans la même fenêtre. Si ces fichiers SWF dépendant d'états globaux intacts pour fonctionner correctement, ils ne peuvent pas être charges plus d'une fois dans la même fenêtre; ils ne peuvent en outre pas être charges dans la même fenêtre en tant qu'autre fichier SWF utilisant des définitions de classe et des variables qui se chevauchent. Ce contenu peut être charge dans des fenêtres indépendantes.

Chargement du contentu HTML dans une fenetre native

Pour charger du contenu HTML dans une fenêtre native, vous pouvez ajouter un objet HTMLLoader à la scène de la fenêtre, puis charger le contenu HTML dans cet objet, ou creer une fenêtre qui contient déjà un objet HTMLLoader à l'aide de la méthode HTMLLoader.createRootWindow(). L'exemple suivant affiche un contenu HTML dans une zone d'affichage de 300x500 pixels sur la scène d'une fenêtre native:
//newWindow is a NativeWindow instance  
var htmlView:HTMLLoader = new HTMLLoader();  
htmlView.width = 300;  
htmlView.height = 500; 
//set the stage so display objects are added to the top-left and not scaled  
newWindow.stage align = "TL";  
newWindow.stage_scaleMode = "noScale";  
newWindow.stage.addChild( htmlView ); 
//urlString is the URL of the HTML page to load htmlView.load( new URLLRequest(urlString)); 
Pour charger une page HTML dans une application Flex, vous pouvez utiliser le composant HTML Flex. Un contenu SWF intégré à un fichier HTML ne s'affiche pas si la fenêtre est transparente (en d'autres termes, si la propriété transparente de la fenêtre est définie sur true), sauf si le paramètre wmode de l'objet ou de la balise embed qui fait reference au fichier SWF est défini sur opaque ou transparent. Etant donné que la valeur par défaut de wmode est window, un contenu SWF ne s'affiche par défaut pas dans une fenêtre transparente. Un contenu PDF ne s'affiche pas dans une fenêtre transparente, qu'elle que soit la valeur wmode utilisé. Par ailleurs, un contenu SWF ou PDF ne s'affiche pas si le contrôle HTMLLoader est mis à l'échelle ou pivoté ou si sa propriété alpha est définie sur une valeur autre que 1.0.

Incrustation du contenu SWF sur une fenêtre HTML

Etant donné que les fenêtres HTML sont contenues dans une occurrence de NativeWindow, vous pouvez ajouter des objets d'affichage Flash au-dessus et en dessous du calque HTML dans la liste d'affichage. Pour ajouter un objet d'affichage au-dessus du calque HTML, utilisez la méthode addChild() de la propriété window-nativeWindow_stage. La méthode addChild() ajoute le contenu superposé au-dessus du contenu existant dans la fenêtre. Pour ajouter un objet d'affichage en dessous du calque HTML, utilisez la méthode addChildAt() de la propriété window.nativeWindow stage, en transmettant une valeur de zéro au paramètre index. Le fait de placer un objet à l'index zéro déplace le contenu existant (notamment l'affichage HTML) au-dessus d'un calque et insère le nouveau contenu en dessous. Afin que le contenu superposé sous la page HTML soit visible, vous doivent définir la propriété paintsDefaultBackground de l'objet HTMLLoader sur false. En outre, tout élément de la page qui définit une couleur d'arrière-plan ne sera pas transparent. Par exemple, si vous définissez une couleur d'arrière-plan pour l'élement de corps de la page, aucune page ne sera transparente. L'exemple suivant explique comment ajouter des objets d'affichage Flash en tant que sur-couches et sous-couches à une page HTML. L'exemple suivant create deux objets de formes simples, ajoute le premier en dessous du contenu HTML et l'autre au-dessus. Cet exemple met également à jour la position de la forme en fonction de l'évenement enterFrame.
<html>
<head>
<script src="AIRAliases.js" type="text/javascript"></script>
<script language="JavaScript" type="text/javascript">
air.Shape = window:runtime-flash.display.Shape;
function Bouncer(radius, color) {
    this radius = radius;
    this.color = color;
    //velocity
    this.vX = -1.3;
    this.vY = -1;
    //Create a Shape object and draw a circle with its graphics property
    this.shape = new air.Shape();
    this.shape.graphics.lineStyle(1,0);
    this.shape.graphics.beginFill(this.color, .9);
    this.shape.graphics.drawCircle(0,0, thisradius);
    this.shape.graphics.endFill();
    //Set the starting position
    this.shape.x = 100;
    this.shape.y = 100;
    //Moves the sprite by adding (vX,vY) to the current position
    this.update = function(){
        this.shape.x += this.vX;
        this.shape.y += this.vY;
        //Keep the sprite within the window
        if (this.shape.x - this.width < 0) {
            this.vX = -this.vX;
        }
        if (this.shape.y - this.width < 0) {
            this.vY = -this.vY;
        }
        if (this.shape.x + this.width > window-nativeWindow-stage.width) {
            this.vX = -this.vX;
        }
        if (this.shape.y + this.width > window-nativeWindow-stage.height) {
            this.vY = -this.vY;
        }
    };
} 
window.htmlLoader.paintsDefaultBackground = false;  
var bottom = new Bouncer(60,0xff2233);  
var top = new Bouncer(30,0x2441ff);  
//listen for the enterFrame event  
window.htmlLoader.addEventListener("enterFrame", function(evt) {  
    bottom.update();  
    top.update();  
});  
//add the bouncing shapes to the window stage  
window-nativeWindowstage.addChildAt(bottom.shape, 0);  
window-nativeWindowstage.addChild(top.shape);  
}  
</script>  
<body onload="init();">  
<h1>de Finibus Bonorum et Malorum</h1>  
<p>Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo.</p>  
<p style="background-color: #FFFFFF00; color: #660000;"This paragraph has a background color.</p>  
<p At vero eos et accuramus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga.</p>  
</body> 
Cet exemple vous donne des notions rudimentaires sur certaines techniques avancées qui utilisent JavaScript et ActionScript dans AIR. Si vous ne maßtrisez pas l'utilisation des objets d'affichage ActionScript, voir la section « Programmation de l'affichage » à la page 156 du Guide du développement d'ActionScript 3.0.

Exemple : Création d'une fenêtre native

Adobe AIR 1.0 et les versions ultérieures L'exemple suivant illustrer la méthode de création d'une fénête native : public function createWindow():void { //create the init options var options:NativeWindowInitOptions = new NativeWindowInitOptions(); optionstransparent false; options.systemChrome = NativeWindowSystemChrome.STANDARD; options.type = NativeWindowType.NORMAL; //create the window var newWindow:NativeWindow = new NativeWindow(options); newNode.title = "A title"; newNode.width = 600 . newNode.height = 400 . newNode stage align = StageAlign.TOP_LEFT; newNode stage scaleMode = StageScaleMode.NO Scale; //activate and show the new window newNode activate(); }

Gestion des fenêtres

Adobe AIR 1.0 et les versions ultérieures

Utilisez les propriétés et les méthodes de la classe NativeWindow pour:gérer l'aspect, le comportement et le cycle de vie des fenêtres du poste de travail. Remarque: si vous faites appel à la structure Flex, il est généralement préférible de:gérer le comportement d'une fenêtre à l'aide des classes framework. Vous pouvez acceder à la plupart des propriétés et méthodes Native Window par le biais des classes mx:WindowedApplication et mx:Window.

Obtention d'une occurrence de NativeWindow

Adobe AIR 1.0 et les versions ultérieues

Pour manipuler une fenêtre, vous doivent tout d'abord obtenir l'occurrence de la fenêtre. Vous pouvez obtenir une occurrence de fenêtre à partir de l'un des emplacements suivants : - Le constructeur de fenêtre natif utilisé pour creer la fenêtre :
var win: NativeWindow = new NativeWindow(initOptions); 
- La propriété nativeWindow de la scène de la fenêtre :
var win: NativeWindow = stage-nativeWindow; 
- La propriété stage d'un objet d'affichage de la fenêtre :
var win: NativeWindow = displayObject stage-nativeWindow; 
- La propriété target d'un événement de fenêtre native distribué par la fenêtre :
private function onNativeWindowEvent(event:NativeWindowBoundsEvent):void { var win:NativeWindow = event.target as NativeWindow; } 
- La propriété nativeWindow d'une page HTML affichée dans la fenêtre :
var win: NativeWindow = htmlLoaderwindow-nativeWindow; 
- Les propriétés activeWindow et openedWindows de l'objet NativeApplication :
var nativeWin:NativeWindow = NativeApplication.nativeApplication.activeWindow; 
var firstWindow:NativeWindow = NativeApplication nativeApplication.openedWindows[0]; 
NativeApplication.nativeApplication.activeWindow reférence la fenêtre active d'une application (mais renvoie null si la fenêtre active n'est pas une fenêtre de cette application AIR). Le tableau 
NativeApplication.nativeApplication.openedWindows contient toutes les fenêtres d'une application AIR n'avant pas été fermée. 
Les objets Flex mx: WindowedApplication et mx: Window étant des objets d'affichage, vous pouvez aisément reférer la fenetre d'application dans un fisier MXML à l'aide de la propriété stage, comme suit :
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml">
applicationComplete="init();"/>
<mx:Script>
    <!-- CDATA[ import flash.display.NativeWindow; public function init():void{ var appWindow:NativeWindow = this stage.nativeWindow; //set window properties appWindow.Visible = true; }
]">
</mx:Script>
</WindowedApplication 
Remarque : tant que le composant WindowedApplication ou Window n'est pas ajoute à la scene de la fenêtre à l'aide de la structure d'application Flex, la propriété stage du composant est null. Ce comportement correspond à celui du composant Flex Application ; cela signifie qu'il n'est pas possible d'acceder à la scene ou à l'occurrence de NativeWindow dans les écouteurs pour les événements qui se produit avec antérieorité dans le cycle d'initialisation des composants WindowedApplication et Window, tels que creationComplete. Il est recommendé d'acceder à la scene et à l'occurrence de NativeWindow lorsque l'évenement applicationComplete est distribué.

Activation, affichage et masquage des fenêtres

Adobe AIR 1.0 et les versions ultérieures

Pour activer une fenêtre, appelez la méthode NativeWindow activate(). Lorsque vous activez une fenêtre, celle-ci s'affiche au premier plan, la souris et le clavier recoivent le focus et, le cas échéant, il est possible de rendre visible la fenêtre en la restaurant ou en définissant la propriété visible sur true. L'activation d'une fenêtre ne modifie pas l'ordre des autres fenêtes dans l'application. Lorsque vous appelez la méthode activate(), la fenêtre distribue un événement activé. Pour afficher une fenêtre masquée sans l'activer, définièsez la propriété visible sur true. Cette action amène la fenêtre au premier plan, mais ne lui donne pas le focus. Pour masquer une fenêtre, définièsez sa propriété visible sur false. Le masquage d'une fenêtre supprime l'affichage de la fenêtre et des icones de la barre des tâches associées et, sous Mac OS X, l'entrée dans le menu Fenêtre. Lorsque you modifie la visibilité d'une fenêtre, la visibilité des fenêtres dont elle est propriété est également modifiée. Ainsi, si vous masquez une fenêtre, toutes les fenêtres qui lui apparitennent sont également masquées. Remarque : sous Mac OS X, il n'est pas possible de masquer entierement une fenetre reduite qui possede une icone dans la partie de la fenetre du Dock. Si la propriete visible est definiie sur false sur une fenetre minimisee, l'icone de la fenetre dans le Dock est always affichee. Si l'utiliser clique sur l'icone, la fenetre est restaurée a un etat visible et s'affiche.

Modification de l'ordre d'affichage des fenêtres

Adobe AIR 1.0 et les versions ultérieures

AIR propose plusieurs méthodes pour modifier directement l'ordre d'affichage des fenêtres. Vous pouvez placer une fenêtre au premier plan ou à l'arrière-plan ; vous pouvez en outre placer une fenêtre sur ou sous une autre fenêtre. L'utilisateur peut simultanément réorganiser les fenêtres en les activant. Il est possible deMAINIR une fenetre au premier plan en definissant sa propriété alwaysInFront sur true. Si ce même parametre est definite dans plusieurs fenêtes, l'ordre d'affichage est a nouveau déterminé au sein des ces fenêtes; toute fois, ces fenêtes sont toujours placées au-dessus des fenêtes dont la propriété alwaysInFront est définie sur false. Les fenêtres du groupe de premier niveau sont toujours affichées devant les fenêtres d'autres applications, même si l'application AIR n'est pas active. Etant donné que ce comportement peut perturber les utilisateurs, définièse la propriété alwaysInFront sur true uniquement lorsque cela est nécessaire. Exemples de cas dans lesquels cet employi est justifié : - Fenêtes contextuelles temporaires, notammentinfos-bulles, listes déroulantes, menus personnalisés ou zones déroulantes. Ces fenêtes doivent se fermer lorsqu'elles perdent le focus ; or, il est possible d'éviter qu'un utilisateur ne puisse pas afficher une autre fenêtre. - Messages et alertes extrémement urgents. Lorsqu'une modification irrécovable risque de se produit si l'utilisateur ne répond pas à temps, il peut être justifié d'afficher au premier plan une fenêtre d'alerte. Néanmoins, la plupart des erreurs et des alertes peuvent être générées dans l'ordre d'affichage normal des fenêtes. - Fenêtes affichées temporairement l'une derrière l'autre. Remarque: AIR n'impose pas l'utilisation correcte de la propriété alwaysInFront. Néanmoins, si votre application interrompt le flux de travail d'un utiliser, il est probable qu'elle termine dans la corbeille de cet'utilisateur. Si une fenêtre est propriété d'autres fenêtres, celles-ci s'affichent devant elle dans un ordre déterminé. Si vous appelez orderToFront() ou définissez alwaysInFront sur true pour une fenêtre propriété d'autres fenêtres, l'ordre d'affichage de ces dernières et celui de la fenêtre propriété est modifié devant d'autres fenêtres, mais elles continuents à s'afficher devant la fenêtre propriété. Appeler les méthodes de classement pour des fenêtres qui appartiennent à une autre fenêtre fonctionne normalement si elles appartiennent toutes à un même propriété, mais risque également de modifier l'ordre d'affichage du groupe entier de fenêtres. Ainsi, si vous appelez ordreToFront() pour une fenêtre appartenant à une autre fenêtre, la fenêtre, son propriété et toute fenêtre appartenant évientuèlement au même propriété sont affichées devant les autres fenêtres. La classe NativeWindow fournit les propriétés et les méthodes suivantes pour définir l'ordre d'affichage d'une fenêtre par rapport à d'autres fenêtres :
MembreDescription
alwaysInFront, propriétéIndique si la fenêtre est affichée dans le groupe de fenêtes de premier niveau.Dans la plupart des cas, le paramètre false est recommendé. Si vous modifie la valeur de false à true,la fenêtre est placée devant toutes les autres fenêtes (mais elle n'est pas activée). Si vous modifie la valeur de true à false,la fenêtre est placée derrière les fenêtes restantes du groupe de premier niveau,mais resté devant les autres fenêtes. Si vous définisse la propriété sur sa valeur actuelle pour une fenêtre,vous ne modifies pas l'ordre d'affichage de cette dernière.Le paramètre alwaysInFront n' affecte pas les fenêtes qui appartiennent à une autre fenêtre.
orderToFront()Place la fenêtre au premier plan.
orderInFrontOf()Place la fenêtre directement devant une fenêtre spécifique.
orderToBack()Envoie la fenêtre derrière les autres fenêtes.
orderBehind()Envoie la fenêtre directement derrière une fenitre spécifique.
activate()Place la fenêtre au premier plan (tout en la rendant visible et en lui donnant le focus).
Remarque: si une fenêtre est masquée (la propriété visible est définie sur false) ou minimisée, l'appeil des méthodes de l'ordre d'affichage est sans effet. Dans le système d'exploitation Linux, les différents gestionnaires de fenêtres imposent des règles différentes quant à l'ordre d'affichage des fenêtres : - Dans certains gestionnaires de fenêtres, les fenêtres d'utilitaires sont toujours affichées devant les fenêtres normales. - Dans certains gestionnaires de fenêtres, une fenêtre plein écran dont la propriété alwaysInFront est définié sur true s'affiche toujours devant les autres fenêtres dont la propriété alwaysInFront est également définié sur true.

Fermeture d'une fenetre

Adobe AIR 1.0 et les versions ultérieures

Pour fermer une fenêtre, utilisez la méthode NativeWindow.close(). La fermeture d'une fenêtre décharge le contenu de la fenêtre, mais si les autres objets possèdent des références à ce contenu, les objets de contenu ne sont pas détruits. La méthode NativeWindow.close() s'exécute de façon asynchrone, et l'application contenue dans la fenêtre continue de fonctionner lors de la fermeture. La méthode de fermeture distribue un événement close lorsque l'opération de fermeture est terminée. Techniquement, l'objet NativeWindow est toujours valide, mais l'accès à la plupart des propriétés et des méthodes sur une fenêtre fermée généra un erreur IllegalOperationError. Vous ne pouvez pas ouvrir à nouveau une fenêtre fermée. Vérifiez la propriété closd'une fenêtre pour vous assurer que la fenêtre a été fermée. Pour simplement masquer une fenêtre, définiquee la propriété NativeWindow sur false. Si la propriété Nnativeapplication.autoExit est définitie sur true (valeur par défaut), l'application se ferme lors de la fermeture de sa dernière fenêtre. La fermeture d'une fenêtre qui possède d'autres fenêtres entraîne la fermeture de ces dernières. Etant donné que les fenêtres qui appartiennent à la fenêtre propriété ne distribuient pas d'évenement closing, il est impossible d'interdire leur fermeture. Un événement close est distribué.

Autorisation d'annulation des opérations sur les fenêtres

Adobe AIR 1.0 et les versions ultérièures

Lorsqu'une fenêtre utilise le chrome système, l'interaction de l'utilisateur avec la fenêtre peut être annulée en écouteant les événements appropriés et en annulant leur comportement par défaut. Par exemple, lorsqu'un utiliser clique sur le bouton de fermeture du chrome système, l'évenement closing est distribué. Si l'un des écouteurs enregistrées appelle la méthode préventDefault() de l'évenement, la fenêtre ne se ferme pas. Si une fenêtre n'utilise pas le chrome système, les événements de notification des modifications désirées ne sont pas automatiquement distribués avant que la modification ait lieu. Donc, si vous appelez les méthodes qui permettent de fermer une fenêtre, d'en modifier l'etat ou d'en définir les propriétés de limite, la modification ne peut pas'être annulée. Pour notifier les composants dans votre application avant d'effectuer une modification, votre logique d'application peut redistribuer l'évenement de notification ajustat à l'aide de la méthode dispatchEvent() de la fenêtre. Par exemple, la logique suivante implèmente un gestionnaire d'évenement pouvant être annulé pour le bouton de fermeture d'une fenêtre : public function onCloseCommand(event:事故发生):void{ varclosingEvent:Event = new Event(Event.CLOSING, true, true); dispatchEvent(closing); if(!closingEvent.isDefaultPrevented()){ win.close(); } } La méthode dispatchEvent() renvoie false si la méthode préventDefault() de l'évenement est appelée par un écouteur. Toutefois, elle peut également renvoyer false pour d'autres raisons; par conséquent, il convient d'utiliser explicitement la méthode isDefaultPrevented() afin de vérifier si la modification doit ou non être annulée.

Agrandissement, réduction et restauration d'une fenêtre

Adobe AIR 1.0 et les versions ultérièures

Pour agrandir la fenetre, utilisez la méthode maximize() de la classe NativeWindow.
myWindow.maximize(); 
Pour réduire la fenêtre, utilisez la méthode minimize() de la classe NativeWindow.
myWindow.minimize(); 
Pour restaurer la fenêtre (c'est-à-dire rétablit la taille de la fenêtre avant l'agrandissement ou la réduction), utilisez la méthode restore() de la classe NativeWindow.
myWindowRestore(); 
Une fenêtre appartenant à une autre fenêtre est réduite en icône ou restaurée lorsque la fenêtre propriété est réduite en icône ou restaurée. Etant donné que sa propriété est réduite en icône, aucun événement n'est distribué par la fenêtre lorsqu'elle est réduite en icône. Remarque: le comportement resultant de l'agrandissement d'une fenêtre AIR est différent du comportement standard de Mac OS X. Plutôt que de basculer entre la taille « standard » définie par l'application et la dernière taille définie par l'utilisateur, les fenêtes AIR basculent entre la dernière taille définie par l'application ou l'utilisateur et la totalité de la zone utilisable de l'écran. Dans le système d'exploitation Linux, les différents gestionnaires de fenêtres imposent des règles différentes quant à la définition de l'état d'affichage des fenêtres : - Avec certains gestionnaires de fenêtres, les fenêtres d'utilitaires ne peuvent pas etre agrandies. - Si une taille maximale est définie pour la fenêtre, certains gestionnaires n'autorisent pas l'agrandissement de la fenêtre. D'autres gestionnaires de fenêtes définissant l'état d'affichage sur l'état maximal, mais ne redimensionnent pas la fenêtre. Dans tous les cas, aucun événement de modification d'état d'affichage n'est distribué. - Certains gestionnaires de fenêtres ne respectent pas les paramètres maximizable ou minimizable des fenêtres. Remarque : sous Linux, les propriétés des fenêtres sont modifiées de façon asynchrone. Si vous modifiez l'état d'affichage sur une ligne de votre programme et que vous lisze la valeur à la ligne suivante, la modification n'est pas répercutée. Sur toutes les plates-formes, l'objet NativeWindow distribue l'évenement displayStateChange lors de la modification de l'état d'affichage. Si vous devez exéçuter une action basée sur le nouvel état de la fenêtre, faites systématiquement appel à un gestionnaire d'évenement displayStateChange. Pour plus d'informations, voir « Ecoute des événements d'une fenêtre » à la page 951.

Exemple : Réduction, agrandissement, restauration et fermeture d'une fenêtre

Adobe AIR 1.0 et les versions ultérieures La brève application MXML suivanté illustrer les méthodes maximize(), minimize(), restore() et close() de la classe Window:
<?xml version="1.0" encoding="utf-8"?>   
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical"> <mx:Script> <![CDATA[ public function minimizeWindow():void { this.state-nativeWindow.minimize(); } public function maximizeWindow():void { this.state-nativeWindow.maximize(); } public function restoreWindow():void { this.state-nativeWindowRestore(); } public function closeWindow():void { this.state-nativeWindow.close(); } ]></mx:Script> <mx:VBox> <mx:Button label="Minimize" click="minimizeWindow(){
    <mx:Button label="Restore" click="restoreWindow"/>
    <mx:Button label="Maximize" click="maximizeWindow"/>
    <mx:Button label="Close" click="closeWindow"/>
</mx:VBox>   
</mx:WindowedApplication> 
L'exemple ActionScript suivant pour Flash create quatre champs de texte cliquables qui déclenchent les méthodes minimize(),maximize(),restore() et close() de la classe NativeWindow:
package   
{ import flash.display.Sprite; import flash.events.MouseEvent; import flash.text.TextField; public class MinimizeExample extends Sprite { public function MinimizeExample():void var minTextBtn:TextField = newTextField(); minTextBtn.x = 10; minTextBtn.y = 10; minTextBtn.text = "Minimize"; minTextBtn/background = true; minTextBtn_border = true; minTextBtn.selectable = false; addChild(minTextBtn); minTextBtn.addEventListener(MonEvent.CLICK, onMinimize); var maxTextBtn:TextField = newTextField(); maxTextBtn.x = 120; maxTextBtn.y = 10; maxTextBtn.text = "Maximize"; maxTextBtn/background = true; maxTextBtn_border = true; maxTextBtn.selectable = false; addChild(maxTextBtn); maxTextBtn.addEventListener(MonEvent.CLICK, onMaximize); var restoreTextBtn:TextField = newTextField(); restoreTextBtn.x = 230; restoreTextBtn.y = 10; restoreTextBtn.text = "Restore"; restoreTextBtn/background = true; restoreTextBtn_border = true; restoreTextBtn.selectable = false; addChild(restoreTextBtn); restoreTextBtn.addEventListener(MonEvent.CLICK, onRestore); var closeTextBtn:TextField = newTextField(); closeTextBtn.x = 340; closeTextBtn.y = 10; closeTextBtn.text = "Close Window"; closeTextBtn/background = true; closeTextBtn_border = true; closeTextBtn.selectable = false; addChild(closeTextBtn); 
closeTextBtn.addEventListener(MouseEvent.CLICK, onCloseWindow);   
} function onMinimize(event:MouseEvent):void { this stage nativeWindow.minimize(); } function onMaximize(event:MouseEvent):void { this stage nativeWindow.maximize(); } function onRestore(event:MouseEvent):void { this stage nativeWindowrestore(); } function onCloseWindow(event:MouseEvent):void { this stage nativeWindow.close(); } } 

Redimensionnement et déplacement d'une fenêtre

Adobe AIR 1.0 et les versions ultérieures

Lorsqu'une fenêtre utilise le chrome système, le chrome fournit des commandes de glissement pour redimensionner la fenêtre et la déplacer dans le poste de travail. Si une fenêtre n'utilise pas le chrome système, vous nez ajouter vos propres commandes pour permettre à l'utilisateur de redimensionner et de déplacer la fenêtre. Remarque : pour redimensionner ou déplacer une fenêtre, vous doivent tout d'abord obtenir une référence à l'occurrence de NativeWindow. Pour plus d'informations sur la méthode d'obtention d'une ↔ érection de fenêtre, voir la section « Obtention d'une occurrence de NativeWindow » à la page 940.

Redimensionnement d'une fenetre

Pour que l'utilisateur puisse interagir avec la taille d'une fenêtre, utilisez la méthode startResize() de la classe NativeWindow. Lorsque cette méthode est appelée depuis un événement mouseDown, l'opération de redimensionnement est effectué par la souris et se termine lorsque le système d'exploitation recoit un événement mouseUp. Lors de l'appel de la méthode startResize(), vous transmettez un argument qui indique le bord ou le coin à partir duquel la fenêtre doit être redimensionnée. Pour définitir la taille de la fenêtre par programmation, définitisse les propriétés width, height ou bounds de la fenêtre sur les dimensions désirées. Lorsque vous définitisse les limites, la taille et la position de la fenêtre peuvent changer simultanément. Toutefois, l'ordre de ces changements n'est pas garanti. Certains gestionnaires de fenêtes Linux ne permettent pas aux fenêtes de dépasser les limites de l'écran. Dans ce cas, la taille finale de la fenêtre peut être limite du fait de l'ordre dans lequel les propriétés sont définies, même si l'impact des modifications aurait autrement réalisé en une fenêtre valide. Par exemple, si vous modifie à la fois la hauteur et la position y d'une fenêtre à proximité du bas de l'écran, la modification en pleine hauteur peut ne pas survenir lorsque la hauteur est modifiée avant la position y. Remarque : sous Linux, les propriétés des fenêtres sont modifiées de façon asynchrone. Si vous redimensionné une fenêtre sur une ligne de votre programme et que vous lisez les dimensions à la ligne suivante, la modification n'est pas répercutée. Sur toutes les plates-formes, l'objet NativeWindow distribue l'évenement resize lors du redimensionnement de la fenêtre. Si vous doivent exéçuter une action basée sur les nouvelles dimensions ou le nouvel état de la fenêtre (mettre en forme les contrôleles de la fenêtre, par exemple), faites systématiquement appel à un gestionnaire d'évenement resize. Pour plus d'informations, voir « Ecoute des événements d'une fenêtre » à la page 951. Le mode d'échelle de la scène indique le comportement de la scène de la fenêtre et de son contenu lorsqu'une fenêtre est redimensionnée. N'oubliez pas que les modes d'échelle de la scène sont concus pour les situations où l'application ne contrôle pas la taille ou le format de son espace d'affichage (notamment dans le cas d'un navigateur Web). En règlemente, vous obtenez les membresurs résultats en définissant la propriété scaleMode de la scène sur StageScaleMode.NO Scale. Pourmettre à l'échelle le contenu d'une fenêtre, vous pouvez toujours définir les paramétres scaleX et scaleY du contenu lors des modifications des limites de la fenêtre.

Déplacement d'une fenêtre

Pour déplacer une fenêtre sans la redimensionner, utilisez la méthode startMove() de la classe NativeWindow. A l'instar de la méthode startResize(), lorsque la méthode startMove() est appelée à partir d'un événement mouseDown, le déplacement est effectué avec la souris et se terminé lorsque le système d'exploitation recoit un événement mouseUp. Pour plus d'informations sur les méthodes startResize() et startMove(), voir le manuel Guide de referencia ActionScript 3.0 pour la plate-forme Adobe Flash. Pour déplacer une fenêtre par programmation, définisse les propriétés x, y ou bounds de la fenêtre sur la position requise. Lorsque vous définisse les limites, la taille et la position de la fenêtre peuvent changer simultanément. Remarque : sous Linux, les propriétés des fenêtres sont modifiées de façon asynchrone. Si vous déplacez une fenêtre sur une ligne de votre programme et que vous lisze la position à la ligne suivante, la modification n'est pas répercutée. Sur toutes les plates-formes, l'objet Native Window distribue l'évenement move lors du repositionnement de la fenêtre. Si vous devez exécuter une action basée sur la nouvelle position de la fenêtre, faites systématiquement appel à un gestionnaire d'évenement move. Pour plus d'informations, voir « Ecoute des événements d'une fenêtre » à la page 951.

Exemple : Redimensionnement et déplacement des fenêtres

Adobe AIR 1.0 et les versions ultérieures L'exemple suivant montre comment lancer les opérations de redimensionnement et de déplacement sur une fenêtre : package { import flash.display.Sprite; import flash.events.MouseEvent; import flash.display.NativeWindowResize; public class NativeWindowResizeExample extends Sprite { public function NativeWindowResizeExample():void { //Fills a background area. this.graphics.beginFill(0xFFFFFF); this.graphics.drawRect(0,0,400,300); this.graphics.endFill(); //Creates a square area where a mouse down will start the resize. var resizeHandle:Sprite = createSprite(0xCCccc,20,this.width-20,this.height-20); resizeHandle.addEventListener(MouseEvent.MOUSE_DOWN,onStartResize); //Creates a square area where a mouse down will start the move. var moveHandle:Sprite = createSprite(0xCCccc,20,this.width-20,0); moveHandle.addEventListener(MouseEvent.MOUSE_DOWN,onStartMove); } public function createSprite(color:int,size:int,x:int,y:int):Sprite { var s:Sprite new Sprite(); s.graphics.beginFill(color); s.graphics.drawRect(0,0,size,size); s.graphics.endFill(); s.x=x; s.y=y; this.addChild(s); return s; } public function onStartResize(event:MouseEvent):void { this.stage nativeWindow.startResize(NativeWindowResize.BOTTM_RIGHT); } public function onStartMove(event:MouseEvent):void { this.stage nativeWindow.startMove(); } }

Écoute des événements d'une fenêtre

Adobe AIR 1.0 et les versions ultérièures

Pour écouter les événements distribués par une fenêtre, enregistrez un écouteur avec l'occurrence de la fenêtre. Par exemple, pour écouter un événement closing, enregistrez un écouteur avec la fenêtre, comme suit : myWindow.addEventListener(Event.CLOSING, onClosingEvent); Lorsqu'un événement est distribué, la propriété targete réference la fenêtre qui envoie l'évenement. La plupart des événements de fenêtre sont associés à deux messages. Le premier message signale l'imminence d'une modification au niveau de la fenêtre (modification pouvant être annulée); le second message indique que la modification a été effectuee. Par exemple, lorsqu'un utiliser clique sur le bouton de fermeture d'une fenêtre, le message de l' événement closing est distribué. Si aucun écouteur n'annule l'événement, la fenêtre se ferme et l'événement close est distribué à l'un des écouteurs. En regle générale, les événements d'ajretissement, tels que closing, ne sont distribués que lorsque le chrome système a été utilisé pour déclencher un événement. L'appel de la méthode close(), par exemple, ne distribue pas automatiquement l'événement closing; seul l'événement close est distribué. Vous pouvez toute fois créé un événement closing et le distribuer à l'aide de la méthode dispatchEvent() de la fenêtre. Les événements de fenêtre qui distribuent un objet Event sont les suivants :
EvénementDescription
activateDistribué lorsque la fenêtre reçoit le focus.
deactivateDistribué lorsque la fenêtre perd le focus.
closingDistribué lorsque la fenêtre est sur le point de se fermer. Cet événement ne se produit automatiquement que lorsque l'utiliseur appuie sur le bouton de fermeture du chrome système ou, sous OS X, lorsque la commande Quitter est invoquée.
closeDistribué lorsque la fenêtre a été fermée.
Les événements de fenêtre qui distribuient un objet NativeWindowBoundsEvent sont les suivants :
EvénementDescription
movingDistribué immédiatement avant que le coin supérieur gauche de la fenêtre change de position, suite au déplacement, au redimensionnement ou à la modification de l'état d'affichage de la fenêtre.
moveDistribué après que le coin supérieur gauche de la fenêtre a changé de position.
resizingDistribué immédiatement avant que la largeur ou la hauteur de la fenêtre change, suite au redimensionnement ou à la modification de l'état d'affichage de la fenêtre.
resizeDistribué après que la taille de la fenêtre a changé.
Pour les événements NativeWindowBoundsEvent, vous pouvez utiliser les propriétés beforeBounds et afterBounds pour déterminer les limites de la fenêtre avant une modification imminente ou après avoir effectué une modification. Les événements de fenêtre qui distribuient un objet NativeWindowDisplayStateEvent sont les suivants :
EvénementDescription
displayStateChangingDistribué immédiatement avant que l'état d'affichage de la fenêtre change.
displayStateChangeDistribué une fois l'état d'affichage de la fenêtre modifié.
Pour les événements NativeWindowDisplayStateEvent, vous pouvez utiliser les propriétés beforeDisplayState et afterDisplayState pour déterminer l'état d'affichage de la fenêtre avant une modification imminente et après avoir effectué une modification. Dans certains gestionnaires de fenêtes Linux,aucun événement de modification de I'etat d'affichage n'est distribué lors de l'agrandissement d'une fenetre possedant un parametre de taille maximale.(La fenetre est définié sur I'etat d'affichage maximal,mais n'est pas redimensionnée.)

Affichage des fenêtres en mode plein écran

Adobe AIR 1.0 et les versions ultérieures

La définition de la propriété displayState de la scène sur StageDisplayState.FULLSCREEN_INTERACTIVE met la fenêtre en mode plein écran et la saisie clavier is est autorisée dans ce mode. (Pour le contenu SWF s'exécutant dans un navigateur, la saisie clavier n'est pas autorisée). Pour quitter le mode plein écran, l'utilisateur doit appuyer sur la touche Echap. Remarque: certains gestionnaires de fenêtes Linux ne modifiert pas les dimensions de la fenêtre pour replir l'écran si une taille maximale est définie pour celle-ci (mais suppliment le chrome système de la fenêtre). Par exemple, le code Flex suivant définit une application AIR simple qui configure un terminal d'écran complet :
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml">
    layout="vertical"
    applicationComplete="init()
        "背景色=0x003030" focusRect="false">
        <mx:Script>
            <!--CDATA[ private function init(){
                stage.displayState = StageDisplayState.FULLSCREEN_INTERACTIVE;
                focusManager.setFocus(seminal);
                terminal.text = "Welcome to the dumb terminal app. Press the ESC key to exit..\n";
                terminal-selectionBeginIndex = terminal.text.length;
                terminal-selectionEndIndex = terminal.text.length;
            }
        } ]
        </mx:Script>
        <mx:TextArea
            id="terminal"
            height="100%" width="100%" 
            scroll="false"
            backgroundColor="0x003030"
            color="0xCCFF00"
            fontFamily="Lucida Console"
           fontSize="44” />
</mx:WindowedApplication> 
L'exemple ActionScript suivant pour Flash simule un terminal d'écran complet simple :
import flash.display.Sprite;
import flash.displayStageDisplayState;
import flash.text.TextField;
import flash.text.TextFormat;
public class FullScreenTerminalExample extends Sprite
{
    public function FullScreenTerminalExample():void
        {
            var terminal:TextField = newTextField();
            terminal.multiline = true;
            terminal(wordWrap = true;
            terminal.selectable = true;
            terminal/background = true;
            terminal/backgroundColor = 0x0033333;
        }
        this stage.displayState = StageDisplayState.FULLSCREEN_INTERACTIVE;
        addChild(selemental);
        terminal.width = 550;
        terminal.height = 400;
        terminal.text = "Welcome to the dumb terminal application. Press the ESC key to exit.\n";
        var tf:TextFormat = new TextFormat();
        tf font = "Courier New";
        tf.color = 0x00CCFF00;
        tf.size = 12;
        terminal setTextFormat(tf);
        terminal.setSelection(terminal.text.length - 1, terminal.text.length);
    }
} 

Chapitre 53 : Ecrans dans AIR

Adobe AIR 1.0 et les versions ultérieues La classe Screen d'Adobe® AIR® permet d'acceder à des informations sur les écrans rattachés à un ordinateur ou à un périphérique.

Voir aussi

flash.display.Screen

Principes de base des écrans dans AIR

Adobe AIR 1.0 et les versions ultérieues - Mesure de l'ordinateur de bureau virtuel (Flex) - Mesure de l'ordinateur de bureau virtuel (Flash) L'interface de programmation de l'écran contient une seule classe, Screen, qui permet à des membres statiques de dire des informations système sur les écrans et à des membres d'occurrences de déscrie un écran particulier. Plusieurs écans peuvent être reliés à un système d'ordinateurs, ce qui peut donner lieu à un espace virtuel qui contient plusieurs écans d'ordinateur. La classe Screen d'AIR fournit des informations sur les écans, leur organisation relative et leur espace utilisable. Si plusieurs moniteurs mappent sur le même écran, seul un écran existe. Si la taille d'un écran est plus grande que la zone d'affichage du moniteur, il n'y a pas moyen de savoir qu'elle partie de l'écran est actuellement visible. Un écran représentée une zone d'affichage indépendante de l'ordinateur. Les écrans sont décrits comme des rectangles au sein d'un ordinateur de bureau virtuel. Le coin supérieur gauche de l'écran désigné comme zone d'affichage principale constitue l'origine du système de coordonnées de l'ordinateur virtuel. Toutes les valeurs utilisées dans la description d'un écran sont exprimées en pixels. ![](images/4a5d0c6f0199bb40db9d5aeb94c079315ae9604c7884bebcd5ac1e6ca2d5c207.jpg) Dans cette organisation d'écrans, deux écrans existent sur l'ordinateur virtuel. Les coordonnées du coin supérieur gauche de l'écran principal (n^0 1) sont toujours (0,0) . Si l'organisation des écrans change pour désigner l'écran n^0 2 comme écran principal, les coordonnées de l'écran n^0 1 deviennent négatives. Les barres de menus, les barres de tâches et les Docks sont ignorés lorsque les limites utilisables sont signalées pour un écran. Pour plus d'informations sur la classe, les méthodes, les propriétés et les événements de l'interface de programmation d'écran, voir Guide de référence ActionScript 3.0 pour la plate-forme Adobe Flash.

Dénombrement des écrans

Adobe AIR 1.0 et les versions ultérieures Vou puez dénombrer les écrans d'un ordinateur de bureau virtuel avec les méthodes et propriétés suivantes :
Méthode ou propriétéDescription
ScreenscreensFournit un tableau d'objets Screen qui déscrit les écrans disponibles. L'ordre du tableau n'a pas d'importance.
Screen.mainScreenFournit un objet Screen pour l'écran principal. Sous Mac OS X, l'écran principal est celui qui affiche la barre de menus. Sous Windows, l'écran principal est celui désigné par le système.
Screen.getScreensForRectangle()Fournit un tableau d'objets Screen qui déscrit les écrans qui sont coupés par le rectangle donné. Le rectangle transmis par cette méthode est définir par des coordonnées, exprimées en pixels, sur l'ordinateur virtuel. S'il n'y a aucune intersection entre écrans et rectangle, le tableau est vide. Vous pouvez utiliser cette méthode pour追寻 sur quels écrans une fenêtre est affichée.
N'enregistrez pas les valeurs renvoyées par les méthodes et propriétés de la classe Screen. L'utilisateur ou le système d'exploitation peuvent changer les écrons disponibles et leur organisation en tout temps. L'exemple suivant utilise l'interface de programmation des écrans pour déplacer une fenêtre entre plusieurs écrans en réponse à la pression sur les touches de direction. Pour déplacer la fenêtre sur l'écran suivant, l'exemple lit le tableau screens et le trie verticalément ou horizontally, suivant la touche de direction sur laquelle on a appuyé. Le code parcourt le tableau trié en comparant chaque écran aux coordonnées de l'écran actif. Pour identifier l'écran actif de la fenêtre, l'exemple appelle Screen.getScreensForRectangle() en le transmettant dans les limites de la fenêtre. package { import flash.display.Sprite; import flash.display.Screen; import flash.events.KeyBoardEvent; import flash.ui.KeyBoard; import flash.displayStageAlign; import flash.display.StageScaleMode; public class ScreenExample extends Sprite { public function ScreenExample() { stage.algn = StageAlign.TOP_LEFT; stage_scaleMode = StageScaleMode.NO Scale; stage.addEventListener(KeyboardEvent_KEY_DOWN,onKey); } private function onKey(event:KeyboardEvent):void{ if (Screen.screens.length > 1){ switch(event.keyCode){ case Keyboard.LEFT: moveLeft(); break; case Keyboard.RIGHT: moveRight(); break; case Keyboard.UP: moveUp(); break; case Keyboard.DOWN: moveDown(); break; } } private function moveLeft():void{ var currentScreen = getCurrentScreen(); var left:Array = Screen.screens; left.sort(sortHorizontal); for(var i:int 0;i < 1 .length-1;i++){ if(left[i].bounds.left < stage-nativeWindow.bounds.left){ stage-nativeWindow.x + = left[i].bounds.left -currentScreen.bounds.left; stage-nativeWindow.y + = left[i].bounds.top -currentScreen.bounds.top; } } private function moveRight():void{ var currentScreen:Screen = getCurrentScreen(); var left:Array = Screen.screens; left.sort(sortHorizontal); for(var i:int = left.length-1;i>0;i--){ if(left[i].bounds.left > stage-nativeWindow.bounds.left){ stage-nativeWindow.x + = left[i].bounds.left - currentScreen.bounds.left; stage-nativeWindow.y += left[i].bounds.top - currentScreen.bounds.top; } } } private function moveUp():void{ var currentScreen.Screen = getCurrentScreen(); var top:Array = Screen.screens; top.sort(squareVertical); for(var i:int 0; i0; i--){ if(top[i].bounds.top > stage-nativeWindow.bounds.top){ stage-nativeWindow.x += top[i].bounds.left -currentScreen.bounds.left; stage-nativeWindow.y += top[i]. bounds.top -currentScreen.bounds.top; break; } } } private function sortHorizontal(a:Screen,b:Screen):int{ if (a:bounds.left > b.bounds.left){ return 1; } else if (a:bounds.left < b.bounds.left){ return -1; } else {return 0;} } private function sortVertical(a:Screen,b:Screen):int{ if (a:bounds.top > b.bounds.top){ return 1; } else if (a:bounds.top < b.bounds.top){ return -1; } else {return 0;} } private function getCurrentScreen():Screen{ var current:Screen; var screens:Array = Screen.getScreensForRectangle(stage:nativeWindow.bounds); (screens.length>0)?current = screens[0] : current = Screen.mainScreen; return current; } }

Chapitre 54 : Impression

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Les moteurs d'exécution Flash (tehs qu'Adobe® Flash® Player et Adobe® AIR™) peuvent communiquer avec l'interface d'impression du système d'exploitation, ce qui vous permet de transmettre des pages au spooler de l'imprimante. Chaque page envoye au spooler peut comprendre du contenu visible, dynamique ou invisible pour l'utilisateur à l'écran, y compris des valeurs de base de données et du texte dynamique. Par ailleurs, les propriétés de la classe flash.printing.PrintJob contiennent des valeurs basées sur les paramètres d'impression de l'utilisateur, afin d'assurer le formatage correct des pages. Les strategies d'utilisation des méthodes et propriétés de la classe flash.printing.PrintJob sont passées en revue ci-après. Elles permettent de creer une tâche d'impression, de dire les paramètres d'impression d'un utiliser et d'ajuster une tâche d'impression en fonction des informations renvoyées par un moteur d'exécution de Flash et le système d'exploitation de l'utilateur.

Principes de base de l'impression

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Dans ActionScript 3.0, vous utilisez la classe PrintJob pour creer des instantanés de contenu d'affichage à convertir en représentation encre-et-papier dans une impression. Dans certains cas, définir le contenu à imprimer revient à le définitir pour un affichage à l'écran—vous positionnez et dimensionnez des éléments pour creer la mise en forme souhaïée. Néanmoins, l'impression a des caractéristiques qui la différencient de la mise en forme à l'écran. Par exemple, les imprimantes utilisent une résolution différente des écrans d'ordinateur. Le contenu d'un écran d'ordinateur est dynamique et peut changer, alors que le contenu imprimé est statique. Lorsque vous planifiez une impression, tenez compte des contraintes de taille de page fixe et de la possibilité d'imprimer plusieurs pages. Aussi évidentes que puissant paraitre ces différences, il est important de les garder à l'esprit lors de la configuration de l'impression avec ActionScript. Une impression précise repose sur la combinaison des valeurs stipulées par vous et des caractéristiques de l'imprimante de l'utilisateur. Les propriétés de la classe PrintJob permettent de déterminer les caractéristiques importantes de l'imprimante de l'utilisateur.

Concepts important et terminologie

La liste de référence suivante content des termes importantes relatifs à l'impression : Spouleur Partie du système d'exploitation ou du logiciel du pilote d'imprimante qui effectue le suivi des pages en attente d'impression et les envoie à l'imprimante dés que'elle est disponible. Orientation de page Rotation du contenu imprimé par rapport au papier (horizontal - paysage ou verticale - portrait). Tâche d'impression Page ou jeu de pages constituant une seule impression.

Impression d'une page

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures VoussutilizezuneoccurrencedelaclassePrintJobpourtgerelimpression.Pourimprimer unepage debase dansFlash Player ou AIR,youssutilizeqquatreinstructionsa la suite: - new PrintJob(): create one occurrence of tâche d'impression dotée du nom que vous spécifie. - PrintJob.start(): initialise le processus d'impression pour le système d'exploitation (en appelant la boîte de dialogue d'impression destinée à l'utilisateur) et définit les propriétés en lecture seule de la tâche d'impression. - PrintJob.addPage(): comprend les détails du contenu de la tâche d'impression, notamment l'objet Sprite (et ses évventuels enfants), la taille de la zone d'impression et le mode d'impression d'image (vectoriel ou bitmap) utilisé par l'imprimante. Vous pouvez effectuer plusieurs appeals successifs de addPage() afin d'imprimer plusieurs sprite sur plusieurs pages. - PrintJob.send(): envoie les pages à l'imprimante du système d'exploitation. Exemple de script de tâche d'impression simple, qui comporte des instructions package, import et class à des fins de compilation : package { import flash.printing.PrintJob; import flash.display.Sprite; public class BasicPrintExample extends Sprite { var myPrintJob:PrintJob = new PrintJob(); var mySprite:Sprite new Sprite(); public function BasicPrintExample() { myPrintJob.start(); myPrintJob.addPage(mySprite); myPrintJob.send(); } 1 Remarque: cet exemple vise à illustrer les éléments de base d'un script de tâche d'impression et ne contient aucun dispositif de gestion des erreurs. Pour construire un script qui réponde convenablement à l'annulation d'une tâche d'impression par l'utilisateur, voir « Utilisation des exceptions et des renoivos » à la page 960. S'il s'avere nécessaire de purger les propriétés d'un objet PrintJob, définissee la variable PrintJob sur null (par exemple myPrintJob = null).

Tâches des moteurs d'exécution de Flash et impression système

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Les moteurs d'exécution de Flash transmettent des pages à l'interface d'impression du système d'exploitation ; veillez donc à identifier les tâches générées par les moteurs d'exécution de Flash et celles générées par l'interface d'impression du système d'exploitation. Les moteurs d'exécution de Flash peuvent initialiser une tâche d'impression, dire certains des paramétres de page de l'imprimante, transmettre le contenu d'une tâche d'impression au système d'exploitation et vérifier si l'utilisateur ou le système annule une tâche. D'autres processus, tels que l'affichage de boîtes de dialogue spécifique à l'imprimante, l'annulation d'une tâche d'impression mise en file d'attente ou l'indication de l'état de l'imprimante, sont supervisés par le système d'exploitation. Si les moteurs d'exécution de Flash sont capables de réagir en cas de problème d'initialisation ou de formatage d'une tâche d'impression, ils peuvent uniquement signaler certaines propriétés ou conditions transmises par l'interface d'impression du système d'exploitation. C'est le role du développementeur d'élaborer un code susceptible de répondre à ces propriétés ou conditions.

Utilisation des exceptions et des renvois

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Avant d'appeler addPage() et send(), vérifie que la méthode PrintJob.start() renvoie la valeur true, au cas où l'utilisateur aurait annulé la tâche d'impression. Une manière simple de vérifier si ces méthodes ont été annulées avant de poursuivre consiste à les intégrer à une instruction if, comme suit :
if (myPrintJob.start())
{
    // addPage() and send() statements here
} 
Si PrintJob.start() est défini sur true, l'utilisateur a sélectionné Imprimer ou un moteur d'exécution de Flash, tel que Flash Player ou AIR, a initié une commande d'impression. Vous pouvez alors appeler les méthodes addPage() et send(). En outre, pour facilititer la gestion du processus d'impression, les moteurs d'exécution Flash reivoient des exceptions pour la méthode PrintJob.addPage(). Vous pouvez ainsi interceptor les erreurs et fournir des informations et des options à l'utilisateur. Si une méthode PrintJob.addPage() échoue, il est également possible d'appeler une autre fonction ou d'arrête la tâche d'impression en cours. Vous interceptez ces exceptions en intégrant des appels addPage() à une instruction try...catch, comme illustré par l'exemple suivant. Dans cet exemple, [params] constitue un espace réservé pour les paramètres spécifique le contenu réel à imprimer :
if (myPrintJob.start())
{
    try
    {
        myPrintJob.addPage([params]);
    }
    catch (error:Error)
    {
        // Handle error,
    }
    myPrintJob.send();
} 
Une fois la tâche d'impression lancée, vous pouvez ajouter le contenu à l'aide de PrintJob.addPage() pour voir s'il génère une exception (par exemple si l'utilisateur a annulé la tâche d'impression). Si tel est le cas, vous pouvez soit ajouter une logique à l'instruction catch pour fournir à l'utilisateur (ou au moteur d'exécution Flash) des informations et des options, soit arrêté la tâche d'impression en cours. Si l'ajout de page réussit, vous pouvez procéder à l'envoi des pages vers l'imprimante à l'aide de PrintJob.send(). Si le moteur d'exécution Flash rencontres un problème lors de l'envoi de la tâche d'impression à l'imprimante (par exemple, si l'imprimante est hors ligne), il est également possible d'interceptor cette exception. Vous pouvez alors proposer d'autres informations ou options (tel l'affichage d'un message ou le lancement d'une alerte dans une animation). Vous pouze, par exemple, affecter un nouveau texte à un champ texte dans une instruction if...else, comme illustré par le code suivant:
if (myPrintJob.start())
{
    try
    {
        myPrintJob.addPage([params]);
    }
    catch (error:Error)
    {
        // Handle error.
    }
    myPrintJob.send();
}
else
{
    myAlert.text = "Print job canceled";
} 
Pour-disposer d'un exemple qui fonctionne,voir « Exemple d'impression: mise à l'échelle, recadrage et ajustement » à la page 969.

Utilisation des propriétés de page

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Lorsque l'utilisateur clique sur OK dans la boite de dialogue d'impression et que PrintJob.start() renvoie true, vous pouze acceder aux propriétés définies par les paramètres de l'imprimante. Il s'agit notamment de la largeur et de la hauteur du papier (pageHeight et pageWidth) et de l'orientation du contenu sur la feuille. Puisque ces paramètres d'impression ne sont pas contrôlés par le moteur d'exéciution Flash, il est impossible de les modifier. Vous pouze en revanche les utiliser pour faire correspondre le contenu à envoyer à l'imprimante aux paramètres en cours. Pour plus d'informations, voir « Définition de la taille, de l'échelle et de l'orientation » à la page 963.

Définition du rendu vectoriel ou bitmap

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Vous ave la possibité de définir manuellement la tâche d'impression de manière à transmettre chaque page sous forme d'image vectorielle ou bitmap. Dans certains cas, l'impression vectorielle produit un fichier de file d'attente plus réduit et une image de toute valeur qualité que l'impression bitmap. Toutefois, si le contenu inclut une image bitmap et que vous souhaitez préserver la transparence alpha ou tout autre effet de couleur, imprimez la page en tant qu'une image bitmap. En outre, une imprimante non-PostScript convertit automatiquement les graphiques vectoriels en images bitmap. Vou specifiez l'impression bitmap en transmettant un objet PrintJobOptions en tant que troisieme parametre de PrintJob.addPage(). Dans Flash Player et les versions d'AIR antérieures à 2, définissee le paramètre printAsBitmap de l'objet PrintJobOptions sur true, comme suit :
var options:PrintJobOptions = new PrintJobOptions();  
options.printAsBitmap = true;  
myPrintJob.addPage(mySprite, null, options); 
Si vous ne spécifie aucune valeur pour le troisième paramètre, la tâche d'impression utilise le paramètre par défaut, soit l'impression vectorielle. Pour AIR 2 et les versions ultérieures, faites appel à la propriété printMethod de l'objet PrintJobOptions pour spécifique la méthode d'impression. Cette propriété gère trois valeurs, qui sont définies en tant que constantes dans la classe PrintMethod : - PrintMethod.AUTO: besoin automatiquement la methode d'impression la plus adaptee en fonction du contenu imprimé. Ainsi, si une page ne contient que du texte, la methode d'impression vectorielle est selectionnee. Toutefois, si une image en filigrane avec transparence Alpha est superposée au texte, l'impression bitmap est besoin pour conserver la transparence. - PrintMethod.BITMAP: imposes l'impression bitmap quel que soit le contenu. - PrintMethod.VECTOR : impose l'impression vectorielle quel que soit le contenu.

Temporisation des instructions de tâche d'impression

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Contrairement aux versions précédentes, ActionScript 3.0 ne limite pas un object PrintJob à une image unique. Cependant, comme le système d'exploitation indique l'état de l'impression après que l'utilisateur a cliqué sur le bouton OK dans la boîte de dialogue d'impression, appelez PrintJob.addPage() et PrintJob.send() dés que possible pour envoyer les pages au spouceur. Si l'accès à l'image contenant l'appel PrintJob.send() est soumis à un délai, le processus d'impression est également retardé. Dans ActionScript 3.0, le délambda de script est de 15 secondes. Par conséquent, l'intervalle entre chaque instruction essentielle de la série de tâche d'impression ne peut pas dépasser 15 secondes. En d'autres termes, la limite de 15 secondes concerne les intervalles suivants : - Entre PrintJob.start() et la première instruction PrintJob.addPage() - Entre PrintJob.addPage() et l'instruction suivante PrintJob.addPage() - Entre la dernière instruction PrintJob.addPage() et PrintJob.send() Si l'un des intervalles ci-dessus excède 15 secondes, l'appoint suivant de la méthode PrintJob.start() pour l'occurrence de PrintJob renvoie false et l'appoint suivant de la méthode PrintJob.addPage() pour l'occurrence de PrintJob entraîne le renvoi d'une exception d'exécution par Flash Player ou AIR.

Définition de la taille, de l'échelle et de l'orientation

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures La section « Impression d'une page » à la page 959 déscrit en detail les étapes d'une tâche d'impression de base, dans laquelle la sortie produit directement le sprite spécifique, selon sa taille d'affichage et sa position à l'écran. Néanmoins, les imprimantes utilisent différentes résolutions d'impression et certains de leurs paramètres peuvent ALTERER l'espace du sprite imprimé. Les moteurs d'exécution Flash peuvent lire les paramètres d'impression du système d'exploitation, mais notez que ces propriétés sont accessibles en lecture seule. En d'autres termes, bien que vous puissiez réagir à leur valeur, il est possible de les définir. Par exemple, il est possible de déterminer le paramètre de format de page de l'imprimante et d'ajuster votre contenu en fonction. Vous pouvez de même identifier les paramètres de marge de l'imprimante ainsi que l'orientation des pages. Pour répondre aux paramètres de l'imprimante, spécifie une zone d'impression, effectuez un ajustement pour tener compte de la différence entre la résolution de l'écran et la mesure de points de l'imprimante, ou faites correspondre le contenu aux paramètres de taille et d'orientation de l'imprimante de l'utilisateur.

Définition de la zone d'impression à l'aide de rectangle

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures La méthode PrintJob.addPage() vous permet de spécifier la partie du sprite que vous souhaitez imprimer. Le deuxième paramètre, printArea prend la forme d'un objet Rectangle. Vous pouvez fournir la valeur de ce paramètre de trois manières : - Créez un objet Rectangle doté de propriétés spécifique, puis utilisez-le dans l'objet addPage(), comme dans l'exemple suivant: private var rect1:Rectangle = new Rectangle(0,0,400,200); myPrintJob.addPage(sheet,rect1); - Si vous n'avez pas encore spécifique l'objet Rectangle, vous pouvez le faire dans l'appel lui-même, comme illustré ci-dessous: myPrintJob.addPagesheet,new Rectangle(0,0,100,100)); - Si vous prévoyez de fournir des valeurs pour le troisième paramètre de l'objet addPage() sans pour autant spécifique un objet Rectangle, utilisez la valeur null pour le deuxième paramètre, comme suit: myPrintJob.addPagesheet,null,options);

Comparaison entre les points et les pixels

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures La largeur et la hauteur d'un rectangle sont exprimées en pixels. Une imprimante utilise les points en tant qu'unités de mesure. Les points ont une taille physique fixe (1/72e de pouce), mais la taille d'un pixel à l'écran varie selon la résolution de ce dernier. De ce fait, le taux de conversion entre les pixels et les points dépend de la configuration de l'imprimante et du redimensionnement évientuel du sprite. Un sprite non redimensionné d'une largeur de 72 pixels mesure un pouce (2,54cm) de large lorsqu'il est imprimé, sachant qu'un point correspond à un pixelQLelle que soit la résolution de l'écran. Vousspuvezutiliserlesequivalencessuivantes pourconvertir lespouce ou lescentimetresteen twips ou points(un twip corresponda 1 / 20e me de point): 1 point = 1 / 72 éme de pouce = 20 twips - 1 pouce = 72 points = 1440 twips 1 centimetre = 567 twips Si you omettez le parametre printArea ou s'il est transmis de façon incorrecte, la zone entiere du sprite est imprimée.

Redimensionnement

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Si vous souhaitez redimensionner un objet Sprite avant de l'imprimer, définiSEE les propriétés de redimensionnement (voir « Manipulation de la taille et de I'échelle des objets » à la page 186) avant d'appeler la méthode PrintJob.addPage(), puis rétablissez leurs valeurs d'origine après l'impression. L'échelle d'un objet Sprite ne dépend pas de la propriété printArea. En d'autres termes, si vous spécifiez une zone d'impression de 50 pixels par 50 pixels, 2500 pixels sont imprimés. Si vous redimensionnéz lobjet Sprite, les 2500 pixels sont imprimés, mais lobjet est imprimé à l'échelle retenue. A titre d'exemple, voir « Example d'impression : mise à l'échelle, recadrage et ajustement » à la page 969.

Impression en mode paysage ou portrait

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Flash Player et AIR étant capables de détecter les paramètres d'orientation, vous pouvez insérer dans votre code ActionScript une logique permettant d'ajuster la taille du contenu ou son orientation en fonction des paramètres de l'imprimante, comme illustré dans l'exemple ci-après.
if (myPrintJob/orientation == PrintJobOrientation.LANDSCAPE) { mySpritrotation = 90; } 
Remarque: si vous envisagez de dire le paramètre système pour définir l'orientation du contenu sur le papier, n'oubliez pas d'importer la classe PrintJobOrientation. La classe PrintJobOrientation fournit des valeurs constantes qui définiennent l'orientation du contenu sur la page. Vous importez la classe à l'aide de l'instruction suivante : import flash.printing.PrintJobOrientation;

Ajustement de la hauteur et de la largeur au format du papier

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Par l'utilisation d'une stratégiesemblable à la gestion des paramètres d'orientation de l'imprimante, vous pouze生存 les paramètres de hauteur et de largeur de page, puis en tener compte en intégrant une logique dans une instruction if. Le code suivant illustré ce cas de figure :
if (mySprite.height > myPrintJob.pageHeight)  
{  
    mySprite.scaleY = .75;  
} 
En outre, il est possible de déterminer les paramètres de marge d'une page en comparant les dimensions de cette page à celle du papier, comme illustré ci-après : margin_height = (myPrintJob.paperHeight - myPrintJob.pageHeight) / 2; margin_width = (myPrintJob.paperWidth - myPrintJob.pageWidth) / 2;

Techniques d'impression avancées

Adobe AIR 2 et ultérieur

Depuis la version 2 d'Adobe AIR, la classe PrintJob comporte d'autres propriétés et méthodes et trois classes supplémentaires, PrintUIOptions, PaperSize et PrintMethod, sont prises en charge. Ces modifications gérent d'autres flux de travail d'impression et permettent aux créateurs de很好地 contrôler le processus d'impression. Parmi les modifications figurent : - Boîtes de dialogue de mise en page : affichage de boîtes de dialogue de mise en page standard et personnalisée. L'utilisateur peut définir les étendues de pages, le format du papier, l'orientation et la mise à l'échelle avant de lancer l'impression. - Affichage avant l'impression : permet de creer un mode d'affichage qui indique avec précision le format du papier, les marges et la position du contenu sur la page. - Impression restreinte : les créateurs peuvent restreindre les options d'impressions, telles que l'etendue de pages imprimables. - Options relatives à la qualité : les créateurs peuvent ajuster la qualité d'impression d'un document et autoriser l'utilisateur à selectionner les options de résolution et de couleur. - Sessions d'impression multiples : il est à présent possible d'utiliser une occurrence unique de PrintJob pour:gérer plusieurs sessions d'impression. Les applications peuvent proposer des paramétres cohérents chaque fois que les boîtes de dialogue de mise en page et d'impression s'affichent.

Modifications du flux de travaux d'impression

Le nouveau flux de travaux d'impression se compose des étapes suivantes : - new PrintJob(): create a occurrence of PrintJob (ou réutilise une occurrence existante). Un grand nombre de méthodes et de propriétés PrintJob, telles que selectPaperSize(), sont disponibles avant le lancement de la tâche d'impression ou lors de l'impression. - PrintJob.showPageSetupDialog(): (facultatif) affiche la boite de dialogue de mise en page sans démarrer de tâche d'impression. - PrintJob.start() ou PrintJob.start2(): parallèlement à la méthode start(), la méthode start2() permet de lancer le processus de mise en file d'attente d'impression. La méthode start2() permet d'activer l'affichage de la boîte de dialogue d'impression et, le cas échéant, de la personnaliser. - PrintJob.addPage(): ajoute un contenu à la tâche d'impression. Cette étape est identique à celle du processus existant. - PrintJob.send() ou PrintJobTerminate(): envoie les pages à l'imprimante sélectionnée ou met fin à la tâche d'impression sans l'envoyer. Les tâches d'impression sont arrêtées suite à une erreur. Si une occurrence de PrintJob est arrêtée, elle peut être réutilisée. Que la tâche d'impression soit envoyée à l'imprimante ou arrêtée, les paramètres d'impression actifs sont conservés lorsque vous réutilisez l'occurrence de PrintJob.

Boîte de dialogue de mise en page

La méthode showPageSetupDialog() affiche la boîte de dialogue de mise en page du système d'exploitation si l'environnement actif le permet. Vérifie长时间 la propriété supportsPageSetupDialog avant d'appeler cette méthode. Voici un exemple simple : import flash.printing.PrintJob; var myPrintJob:PrintJob = new PrintJob(); //check for static property supportsPageSetupDialog of PrintJob class if (PrintJobsupportsPageSetupDialog) { myPrintJob.showPageSetupDialog(); } Si besoin est, vous pouvez associier la méthode à une propriété de la classe PrintUIOptions pour contröler les options affichées dans la boîte de dialogue de mise en page. Vous pouvez définir le nombre minimal et maximal de pages. L'exemple suivant restreint l'impression aux trois premières pages : import flash.printing.PrintJob; var myPrintJob:PrintJob = new PrintJob(); if (PrintJobsupportsPageSetupDialog) { var uiOpt:PrintUIOptions new PrintUIOptions(); uiOpt.minPage = 1 . uiOpt.maxPage = 3 . myPrintJob.showPageSetupDialog(uiOpt);

Modification des paramètres d'impression

Voupe modier les parametes d'une occurrence de PrintJob à tout moment après sa creation. Il est ainsi possible de modifier les parametes entre des appeals d'addPage() et après l'envoi ou l'arrêt d'une tâche d'impression. Certains parametes, tels que la propriété printer, s'appliquent à la tâche d'impression entière et non à des pages spécifique. Ils doivent être définis avant d'appeler start() ou start2(). La méthode selectPaperSize() permet de définir le format du papier par défaut dans les boîtes de dialogue de mise en page et d'impression. Vous pouze également l'appeler au cours d'une tâche d'impression pour définir le format du papier d'une étendue de pages. Vous utilisez à cet effet des constantes définies dans la classe PaperSize; comme illustré par l'exemple suivant, qui sélectionne une enveloppe de format 10 : import flash.printing.PrintJob; import flash.printing.PaperSize; var myPrintJob:PrintJob = new PrintJob(); myPrintJob.selectPaperSize(PaperSize.ENV_10); La propriété printer permet d'extraire ou de définir le nom de l'imprimante associée à la tâche d'impression active. Par défaut, elle est définié sur le nom de l'imprimante par défaut. La propriété printer est définié sur null si aucune imprimante n'est disponible ou si le système ne prend pas en charge l'impression. Pour changer d'imprimante, commencez par obtenir la liste des imprimantes disponibles par le biais de la propriété printers. Cette propriété est un objet Vector dont les éléments String correspondent aux noms d'imprimantes disponibles. Définissez la propriété printer sur l'une de ces valeurs String pour activer l'imprimante correspondante. Il est impossible de modifier la propriété printer d'une tâche d'impression active. Toutte tentative de modification de cette propriété après qu'un appel de start() ou start2() a abouti ou avant l'envoi ou l'arrêt de la tâche d'impression échoue. Exemple de définition de la propriété : import flash.printing.PrintJob;
var myPrintJob.PrintJob = new PrintJob();  
myPrintJob printer = "HP_LaserJet_1";  
myPrintJob.start(); 
La propriété copies extrait la valeur correspondant au nombre d'exemplaires définis dans la boîte de dialogue d'impression du système d'exploitation. Les propriétés firstPage et lastPage extraient l'endetue de pages. La propriété orientation extrait le paramètre d'orientation de page. Vous pouvez définir ces propriétés de sorte à replacer les valeurs saisies dans la boîte de dialogue d'impression. L'exemple suivant définit ces propriétés :
import flash.printing.PrintJob;  
import flash.printing.PrintJobOrientation; 
var myPrintJob:PrintJob = new PrintJob();  
myPrintJob.copies = 3;  
myPrintJob.firstPage = 1;  
myPrintJob.lastPage = 3;  
myPrintJob.orangeation = PrintJobOrientation.LANDSCAPE; 
Les paramètres en lecture seule suivants associés à PrintJob fournissant des informations pertinentes sur la configuration de l'imprimante active : - paperArea: limits rectangularaires du support d'impression, exprimées en points. - printableArea : limites rectangulaires de la zone imprimable, exprimées en points. - maxPixelsPerInch: résolution physique de l'imprimante active, exprimée en pixel par pouce. - isColor: capacité de l'imprimante active à imprimer les couleurs (renvoie true si l'imprimante active gère les couleurs). Voir « Exemple d'impression : options d'impression et de mise en page » à la page 971

Exemple d'impression : impression de plusieurs pages

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Si vous doivent imprimer plusieurs pages de contenu, vous pouvez associier chaque page à un sprite différent (dans le cas spécifique, sheet1 et sheet2). Utilisez ensuite PrintJob.addPage() pour chaque sprite. Le code suivant illustrer cette technique :
package   
{ import flash.display MoviesClip; import flash.printing.PrintJob; import flash.printing.PrintJobOrientation; import flash.display.Stage; import flash.display.Sprite; import flash.text.TextField; import flashgeomRectangle; public class PrintMultiplePages extends MovieClip { private var sheet1:Sprite; private var sheet2:Sprite; public function PrintMultiplePages():void { init(); printPages(); } private function init():void { sheet1 = new Sprite(); createSheet(sheet1, "Once upon a time...", {x:10, y:50, width:80, height:130}); sheet2 = new Sprite(); createSheet(sheet2, "There was a great story to tell, and it ended quickly.\n\nend.", null); } private function createSheet(sheet:Sprite, str:String, imgValue:Object):void { sheet.graphics.beginFill(0xFFFFFF); sheet.graphics.lineStyle(1, 0x000000); sheet.graphics.drawRect(0, 0, 100, 200); sheet.graphics.endFill(); var txt:TextField = newTextField(); txt.height = 200; txt.width = 100; txt(wordWrap = true; txt.text = str; if (imgValue != null) { var img:Sprite = new Sprite(); img.graphics.beginFill(0xFFFFFF); img.graphics.drawRect(imgValue.x, imgValue.y, imgValue.width, imgValue.height); img.graphicsendum(); sheet.addChild(img); } sheet.addChild(txt); } private function printPages():void { var pj:PrintJob = new PrintJob(); 
var pagesToPrint:uint = 0 · if(pj.start()) { if(pj.orientation = PrintJobOrientation.LANDSCAPE) { throw new Error("Page is not set to an orientation of portrait."); } sheet1.height = pj.pageHeight; sheet1.width = pj.pageWidth; sheet2.height = pj.pageHeight; sheet2.width = pj.pageWidth; try { pj.addPagesheet1); pagesToPrint++; } catch (error:Error) { // Respond to error. } try { pj.addPagesheet2); pagesToPrint++; } catch (error:Error) { // Respond to error. } if (pagesToPrint>0) { pj.send(); } } }

Exemple d'impression : mise à l'échelle, recadrage et ajustement

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Dans certains cas, il s'avere utile d'ajuster la taille (ou d'autres propriétés) d'un objet d'affichage à imprimer afin de tenir compte des différences entre son aspect à l'écran et le rendu sur papier. Lorsque vous modifie les propriétés d'un objet d'affichage avant l'impression (par exemple à l'aide des propriétés scaleX et scaleY), n'oubliez pas que si l'objet redimensionné reste plus grand que le rectangle défini comme zone d'impression, il est recadré. Il est également judicieux d'envisager de rétabrir les propriétés après l'impression des pages. Le code suivant modifie les dimensions de l'objet d'affichage txt (sans alterer la zone d'arrière-plan verte). Pour finir, le champ de texte est recadré en fonction des dimensions du rectangle spécifique. Àpres l'impression, le champ de texte retrouve sa taille originale d'affichage à l'écran. Si l'utilisateur annule la tâche d'impression dans la boîte de dialogue d'impression du système d'exploitation, le contenu du moteur d'exécution de Flash est modifié pour avertir l'utilisateur de cette annulation.
package   
{ import flash.printing.PrintJob; import flash.display.Sprite; import flash.text.TextField; import flash.display.Stage; import flashgeomRectangle; public class PrintScaleExample extends Sprite { private var bg:Sprite; private var txt:TextField; public function PrintScaleExample():void { init(); draw(); printPage(); } private function printPage():void { var pj:PrintJob = new PrintJob(); txt scaleX = 3; txt scaleY = 2; if (pj.start()) { trace(||) > pjorientation: " + pj orientation); trace(||) > pj.pageWidth: " + pj.pageWidth); trace(||) > pj.pageHeight: " + pj.pageHeight); trace(||) > pj.paperWidth: " + pj.paperWidth); trace(||) > pj.paperHeight: " + pj.paperHeight); try { pj.addPage(this, new Rectangle(0, 0, 100, 100)); } catch (error:Error) { // Do nothing. } pj.send(); } else { txt.text = "Print job canceled"; } // Reset the txt scale properties. txt scaleX = 1; txt scaleY = 1; 
}   
private function init():void { bg = new Sprite(); bg.graphics.beginFill(0x00FF00); bg.graphics.drawRect(0, 0, 100, 200); bg.graphics.endFill(); txt = newTextField(); txtborder = true; txt.text = "Hello World"; } private function draw():void { addChild(bg); addChild(txt); txt.x = 50; txt.y = 50; } } 

Exemple d'impression : options d'impression et de mise en page

Adobe AIR 2 et ultérieur

L'exemple suivant initiaïse les paramètres PrintJob relatifs au nombre d'exemplaires, au format du papier (legal) et à l'orientation de la page (paysage). Il impose l'affichage de la boîte de dialogue de mise en page avant de démarrer la tâche d'impression en affichtant la boîte de dialogue d'impression. package { import flash.printing.PrintJob; import flash.printing.PrintJobOrientation; import flash.printing.PaperSize; import flash.printing.PrintUIOptions; import flash.display.Sprite; import flash.text.TextField; import flash.display.Stage; import flashgeomRectangle; public class PrintAdvancedExample extends Sprite { private var bg:Sprite = new Sprite(); private var txt:TextField = newTextField(); private var pj:PrintJob = new PrintJob(); private var uiOpt:PrintUIOptions new PrintUIOptions(); public function PrintAdvancedExample():void {
initPrintJob();   
initContent();   
draw();   
printPage();   
}   
private function printPage():void   
{ //test for dialog support as a static property of PrintJob class if (PrintJobsupportsPageSetupDialog) { pj.showPageSetupDialog(); } if (pj.start2(uiOpt, true)) { try { pj.addPage(this, new Rectangle(0, 0, 100, 100)); } catch (error:Error) { // Do nothing. } pj.send(); } else { txt.text = "Print job terminated"; pjTerminate(); }   
}   
private function initContent():void { bg.graphics.beginFill(0x00FF00); bg.graphics.drawRect(0, 0, 100, 200); bg.graphics.endFill(); txtborder = true; 

Impression

txt.text = "Hello World"; } private function initPrintJob():void { pj.selectPaperSize(PaperSize.LEGAL); pj.orientation PrintJobOrientation.LANDSCAPE; pj.copies = 2 . pj.jobName "Flash test print"; } private function draw():void { addChild(bg); addChild(txt); txt.x = 50 . txt.y = 50 . }

Chapitre 55 : Geolocation

Si un périphérique prend en charge la géolocalisation, vous dispose de l'API de géolocalisation pour connaître l'emplacement géographique actuel du périphérique. Si le périphérique prend en charge cette fonction, vous pouvez obtenir des informations de géolocalisation. Parmi ces informations figurent l'altitude, la précision, la direction, la vitesse et l'horodatage de la dernière modification de l'emplacement. La classe Geolocation distribue des événements update en réponse au capteur d'emplacement du périphérique. Un événement update est un object GeolocationEvent.

Voir aussi

flash.sensors.Geolocation flash.events.GeolocationEvent

Détction des changements de géolocalisation

Pour utiliser le capteur de géolocalisation, instanciez un object Geolocation et enregistrez-vous pour receivevoir les événements update qu'il distribue. Un événement update est un object GeolocationEvent. Il possède huit propriétés : - altitude: renvoie l'altitude, en mètres. - heading: renvoie la direction du mouvement (par rapport au nord géographique), en degrés. horizontalAccuracy: renvoie la précision horizontalale, en mètres. - latitude: renvoie la latitude, en degrés. - longitude: renvoie la longitude, en degrés. speed: renvoie la vitesse en metres par seconde. - timestamp : nombre de milliseconds au moment ou se produit l'évenement après l'initialisation du moteur d'execution. verticalAccuracy: renvoie la précision verticale, en metres. La propriété这段时间 est un objet int. Les autres propriétés sont des objets Number. Exemple de base qui affiche les données de géolocalisation dans un champ de texte : var geo:Geolocation; if (Geolocation.isSupported) { geo = new Geolocation(); geo.addEventListener(GeolocationEvent.UPDATE, updaterHandler); } else { geoTextField.text = "Geolocation feature not supported"; } function updaterHandler(event:GeolocationEvent):void { geoTextField.text = "latitude:" + event longitude.toString() + "\n" + "longitude:" + event.longitude.toString() + "\n" + "altitude:" + event.altitude.toString() + "speed:" + event.speed.toString() + "heading:" + eventheading.toString() + "horizontal accuracy:" + event-horizontalAccuracy.toString() + "vertical accuracy:" + event-verticalAccuracy.toString() } Pour exploiter cet exemple, voirlez à créé le champ de texte geoTextField et à l'ajouter à la liste d'affichage avant d'utiliser le code. Voupe ouzajuster l'intervalle de temps qui separe les événements de géolocalisation en appelant la methode setRequestedUpdateInterval() de I'objet Geolocation. Cette methode ne gere qu'un seul parametre, interval, qui correspond à la fréquence de mise à jour requise, en milliseconds :
var geo:Geolocation = new Geolocation();  
geo.setRequestedUpdateInterval(10000); 
L'intervalle réel entre les mises à jour de la géolocalisation peut être supérieur ou inférieur à cette valeur. Toutecodification de l'intervalle de mise à jour affecte l'ensemble des écouteurs enregistrres. Si vous n'appelez pas laméthode setRequestedUpdateInterval(), l'application reçoit des mises à jour à la fréquence définie par défaut sur le péripérique. L'utilisateur peut interdire à une application d'acceder aux données de géolocalisation. L'iPhone avertit par exemple l'utilisateur lorsqu'une application tente d'obtenir des données de géolocalisation. En réponse à l'invite, l'utilisateur peut refuser à l'application tout accès aux données de géolocalisation. L'objet Geolocation distribue un événement status lorsque l'utilisateur refuse l'accès aux données de géolocalisation. Il possède également une propriété muted, définie sur true lorsque le capteur de géolocalisation n'est pas disponible. L'objet Geolocation distribue un événement status lorsque la propriété muted change. Le code suivant indique comment détecter que les données de géolocalisation ne sont pas disponibles : package { import flash.display.Sprite; import flash.displayStageAlign; import flash.displayStageScaleMode; import flash.events.GeolocationEvent; import flash.events.MouseEvent; import flash.events.StatusEvent; import flash&sensors.Geolocation; import flash.text.TextField; import flash.text.TextFormat; public class GeolocationTest extends Sprite { private var geo:Geolocation; private var log:TextField; public function GeolocationTest() { super(); stage align = StageAlign.TOP_LEFT; stage_scaleMode = StageScaleMode.NO Scale; setUpTextField(); if (Geolocation.isSupported) { geo = new Geolocation(); if (!geo.muted) { geo.addEventListener(GeolocationEvent.UPDATE, geoUpdateHandler); } geo.addEventListener(StatusEvent.status, geoStatusHandler); } else { log.text = "Geolocation not supported"; } } public function geoUpdateHandler(event:GeolocationEvent):void { log.text = "latitude:" + event.latITUDE.toString(" 十^ . log.appendText("longitude:" + event.longitude.toString(" 十^ ); } public function geoStatusHandler(event:StatusEvent):void { if (geo.muted) geo.removeEventListener(GeolocationEventshedATE, geoUpdateHandler); else geo.addEventListener(GeolocationEventshedATE, geoStatusHandler); } private function setUpTextField():void { log = newTextField(); var format:TextFormat new TextFormat("_sans",24); log.defaultTextFormat format; log.button true; log(wordWrap true; log multiline true; log.x 10; log.y 10; log.height stage.height - 20; log.width stage.width - 20; log.addEventListener(MouseEvent.CLICK, clearLog); addChild(log); } private function clearLog(event: MouseEvent):void { log.text ""; } } Remarque: les iPhone de première génération, qui n'intègrent pas d'unité GPS, ne distribuent que rarement des événements update. Sur ces péripériques, un object Geolocation distribue initialement un ou deux événements update. Il distribue ensuite des événements update lorsque les informations sont sensiblement modifiées.

Vérification de la prise en charge de la géolocalisation

La propriété Geolocation.isSupported permet de vérifier si l'environnement d'exécution prend en charge cette fonction :
if (Geolocation.isSupported)  
{ // Set up geolocation event listeners and code. } 
A l'heure actuelle, la géolocalisation n'est prise en charge que par les applications ActionScript pour l'iPhone et dans Flash Lite 4. Si Geolocation.isSupported correspond à true à l'exécution, la géolocalisation est prise en charge. Certain modèles d'iPhone ne sont pas écipés d'une unité GPS. Ces modèles font appel à d'autres techniques, telles que la localisation par triangulation des téléphones portables, pour obtaining les données de géolocalisation. Pour ces modèles, ou sur tout iPhone dont l'unité GPS est désactivée, un object Geolocation risque de ne distribuer qu'un ou deux événements update initiaux.

Chapitre 56 : Internationalisation des applications

Flash Player 10.1 et les versions ultérieures, Adobe AIR 2.0 et les versions ultérieures Le package flash.globalization simplifie la creation de logiciels internationaux qui s'adaptent aux conventions de différentes langues et régions.

Voir aussi

Package flash.globalization « Localisation d'applications » à la page 996 Charles Bihis : Want to Localize your Flex/AIR Apps? (disponible en anglais uniquement)

Principes de base de l'internationalisation des applications

Les termes globalisation et internationalisation sont parfois considérés comme interchangeables. La plupart des définitions de ces termes indiquent toutefois que globalisation se refère à une combinaison de processus commerciaux et d'ingénierie, tandis qu'internationalisation relève exclusivement de l'ingénierie. Quelques termes importants sont définis ci-dessous : Globalisation Large éventail de processus commerciaux et d'ingénierie destinés à assurer la préparation et le lancement globaux de produits et d'actions d'entreprise. La globalisation rassemble des activités d'ingénierie telles que l'internationalisation, la localisation et la différenciation culturelle, ainsi que des activités commerciales telles que la gestion de produits, la planification financière, le marketing et les tâches d'ordre juridiques. La globalisation est parfais abrégée sous la forme G11n (G, puis 11 autres lettres, puis la dette n). « C'est aux entreprises qu'incombe la globalisation. » Internationalisation Processus d'ingénierie destiné à « dé-regionaliser » un produit pour assurer la prise en charge de divers scripts, langues et conventions culturelles (telles que les devises, les règes de tri, les formats numériques et de date, etc.) sans avoir à modifier la conception du produit ou le recompilerer. Ce processus peut être divisé en deux yeux d'activités, prise en charge et localisation. Parfois abrégée sous la forme I18n , l'internationalisation est également désignée par l'expression anglaise world-readiness. « C'est aux ingénieurs qu'incombe l'internationalisation. » Localisation Processus consistant à adapter un produit ou un service à une langue et une culture données, ainsi qu'à une apparènce locale appropriée. La localisation est parfois abrégée sous la forme L10n. « C'est aux traducteurs qu'incombe la localisation. » Différentiation culturelle Processus relevant de l'ingénierie destiné à développer ou adapter des fonctionnalités déterminées en vue de répondre aux besoines uniques d'une culture. Parmi les exemples disponibles figurent notamment les fonctionnalités de publication japonaises intégrées à Adobe InDesign et la prise en charge de Hanko dans Adobe Acrobat. Quelques autres termes importants associés à l'internationalisation sont définis ci-dessous : Jeu de caractères Caractères utilisés par une langue ou un groupe de langues. Un jeu de caractères comprend les caractères nationaux, les caractères spéciaux (teils les signes de ponctuation et les symboles mathématiques), les chiffres et les caractères de contrôle informatiques. Classement Tri du texte dans un ordre adapté à des paramètres régionaux déterminés. Paramètres régionaux Valeur qui représenté la langue et les conventions culturelles en vigueur dans une région géographique, politique ou culturelle (soit, dans de nombreux cas, un pays unique). A cette valeur correspond un identifient de paramètres régionaux (ID de paramètres régionaux) unique. L'ID de paramètres régionaux permet de rechercher un jeu de données régionales qui assure une prise en charge régionale appropriée. Cette prise en charge s'applique aux unités de mesure, à l'analyse et au formatage des nombres et des dates, etc. Regroupement de ressources Jeu stocké d' éléments propres aux paramètres régionaux utilisés par une application. Un regroupement de ressources contient généralement tous les éléments de texte de l'interface utilisateur de l'application. Au sein du regroupement, ces éléments sont traduits dans la langue correspondant aux paramètres régionaux. Le regroupement de resources comporte parfois d'autres paramètres qui modifie la mise en forme ou le comportement de l'interface utilisateur pour des paramètres régionaux déterminés. Il est ainsi susceptible deContainir d'autres types de medias ou des références à ces derniers, propres aux paramètres régionaux.

Présentation du package flash.globalization

Flash Player 10.1 et les versions ultérieures, Adobe AIR 2.0 et les versions ultérieures Le package flash.globalization exploite les fonctionnalités de prise en charge culturelle du système d'exploitation sous-jacent. Il simplifie la programmation d'applications conformes aux conventions culturelles de chaque utilisateur. Parmi les principales classes du package figurent : - La classe Collator, qui gère le tri et la concordance des chaînes. - La classe CurrencyFormatter, qui formate les nombres convertis en chaînes de montant de devise et analyse les symboles et montants de devise extrais de chaînes d'entrée. - La classe DateTimeFormatter, qui formate les valeurs de date. - La classe LocaleID, qui extrait les informations relatives à des paramètres régionaux données. - La classe Number/Formmatter, qui formate et analyse les valeurs numériques. - La classe StringTools, qui gère la conversion de la casse des chaînes générées par les paramétres régionaux.

Package flash.globalization et localisation des ressources

Le package flash.globalization ne gère pas la localisation des ressources. Vous pouvez toute fois utiliser l'ID de paramètres régionaux flash.globalization en tant que principale valeur d'extraction des ressources localisées par le biais d'autres techniques. Il est ainsi possible de localiser les ressources d'une application créées dans Flex à l'aide des classes ResourceManager et ResourceBundle. Pour plus d'informations, voir Localisation d'applications Flex. Adobe AIR 1.1 contient également quelques fonctions destinées à faciliter la localisation des applications AIR, comme indiqué à la section « Localisation d'applications AIR » à la page 997.

Guide général de l'internationalisation d'une application

La procédure ci-dessous déscrit une approche standard de haut niveau de l'internationalisation d'une application à l'aide du package flash.globalization : 1 Determinez ou definissez les parametes regionaux. 2 Creez une occurrence d'une classe de service (Collator, CurrencyFormatter, DateTimeFormatter, NumberFormatter ou StringTools). 3 Recherche les erreurs et les parametes de substitution par le biais des propriétés lastOperationStatus. 4 Formatez et affichez les informations à l'aide des paramètres régionales en vigueur. L'etape suivante consiste à charger et afficher les chaines et ressources de l'interface utiliser propres aux paramètres régionaux. Cette étape est susceptible d'inclure des tâches telles que : - redimensionner l'interface utiliser en fonction des longueurs de chaîne par le biais des fonctions de mise en forme automatique ; - sélectionner les polices appropriées et les polices de substitution prises en charge ; - prendre en charge d'autres systèmes d'écriture à l'aide de FTE (Flash Text Engine) ; - vérifier la gestion appropriée des éditeurs de méthode d'entrée.

Recherche des erreurs et paramètres de substitution

Les classes de service flash.globalization adoptent toutes une approche similaire pour identifier les erreurs. En cas de non-dispôniibilité des paramètres régionaux requis, elles ont également toutes recours aux paramètres régionaux pris en charge par le système d'exploitation de l'utilisateur. L'exemple suivant indique comment rechercher les erreurs et paramètres de substitution lors de l'instanciation de classes de service. Chaque classe de service possée une propriété lastOperationStatus, qui indique si la dernière méthode utilisée a déclenché des messages d'erreur ou des averissements. var nf:NumberFormatter new NumberFormatter("de-DE"); if(nf.lastOperationStatus ! = LastOperationStatus.NO_ERROR) { if(nf.lastOperationStatus = = LastOperationStatus.USING_FALLBACK_WARNINGS) { // perform fallback logic here, if needed trace("Warning-Fallback locale ID:" + nfactualLocaleIDName); } else { // perform error handling logic here, if needed trace("Error:" + nf.lastOperationStatus); } Cet exemple se contente de suivre un message si un ID de paramètres régionaux de substitution est utilisé ou s'il se produit une erreur. Le cas échéant, l'application peutmettre en œuvre d'autres opérations logiques de gestion des erreurs. Vous pouvez, par exemple, afficher un message à l'intention de l'utilisateur ou imposer à l'application d'utiliser des paramètres régionaux spécifique et pris en charge.

Identification des paramètres régionaux

Flash Player 10.1 et les versions ultérieures, Adobe AIR 2.0 et les versions ultérieures

Les paramètres régionaux identifient une combinaison donnée de conventions linguistiques et culturelles en vigueur dans un pays ou une région. Un identifiant de paramètres régionaux peut être géré en toute sécurité en tant que chaine. Vous disposez toutefois de la classe LocaleID pour obtenir d'autres informations relatives aux paramètres régionaux. Procedez comme suit pour creer un objet LocaleID :
var locale: LocaleID = new LocaleID("es-MX"); 
Une fois l'objet LocaleID créé, vous pouvez extraire des données relatives à l'ID de paramétres régionaux. Faites appel aux méthodes getKeysAndValues(), getLanguage(), getRegion(), getScript(), getVariant() et isRightToLeft(), ainsi qu'à la propriété name. Les valeurs extraites de ces méthodes et propriétés contiennent parfois des informations complémentaires sur les paramètres régionaux qu'il est impossible de récapuerer directement de l'identifant de paramètres régionaux. Lorsqu'une application cree un service qui gere les parametes regionaux, telle une fonctionality de formatage de dates, elle doit stipuler les parametes regionaux prevus. Etant donne que laiste des parametes regionaux pris en charge varie d'un systeme d'exploitation a l'autre, il arrive parfois que les parametes regionaux requis ne soient pas disponibles. Flash Player essais d'abord de trouver le code de langue des paramètres régionaux requis. Il tente ensuite de préciser les paramètres régionaux en trouvant un système d'écriture (script) et une région correspondants. Exemple :
var loc:LocaleID = new LocaleID("es"); trace(loc.getLanguage()); // es trace(loc.getScript()); // Latn trace(loc.getRegion()); // ES 
Dans cet exemple, le constructeur LocaleID() a extrait les données relatives aux paramètres régionaux qui correspondent de plus pres au code de langue « es » associé à l'utilisateur.

Définition de l'identifant de paramètres régionaux

Vouss disposez de plusieurs méthodes pour définir les paramètres régionaux actifs d'une application : - Codez en dur un ID de paramètres régionaux unique dans l'application. Cette approche est courante, mais ne prend pas en charge l'internationalisation de l'application. - Utilisez les préférences d'ID de paramètres régionaux extraites du système d'exploitation ou du navigateur de l'utilisateur, voire d'autres préférences utilisateur. Cette technique produit généralement les paramètres régionaux les plus adaptés à l'utilisateur, mais manque parfois de précision. Les paramètres du système d'exploitation risquent en effet de ne pas reflérer les préférences réelles de l'utilisateur. L'utilisateur pourrait, par exemple, partager un ordinateur avec un collège et être incapable de modifier les paramètres régionaux préféres du système d'exploitation. - ÀpRES avoir défini l'ID des paramètres régionaux en fonction des préférences de l'utilisateur, autorise ce dernier à sélectionner les paramètres régionaux dans une liste d'options prises en charge. Cette stratégie est généralement recommendée si l'application prend en charge plusieurs yeux de paramètres régionaux. Vous pouvez faire appel à la troisième option, comme suit : 1 Récupérez la liste des paramètres régionaux ou langues préféres de l'utilisateur à partir d'un profil utilisateur, des paramètres du navigateur, des paramètres du système d'exploitation ou d'un cookie. (L'application doit implémenter elle-même cette logique. La bibliothèque flash.globalization ne prend en effet pas directement en charge ces préférences.) 2 Identifiez les parametes régionaux pris en charge par l'application et selectionnez la valeur la plus adaptee par défaut. Faites appel à la méthode LocaleID.determinePreferredLocales() pour trouver les parametes régionaux adaptations à un utilisateur en fonction de ses parametes régionaux préféres et des paramètres régionaux pris en charge par le système d'exploitation. 3 Autorisez l'utilisateur à modifier les paramétres régionaux par défaut s'ils ne lui convennent pas.

Restrictions associées aux autres classes de paramètres régionaux et de langue

La classe f1. lang. Locale permet de remplacer les chaînes de texte basées sur des paramètres régionaux en utilisant les regroupements de ressources qui contiennent les valeurs de chaine. Cette classe ne prend toute fois pas en charge les autres fonctions d'internationalisation telles que le formatage, le tri et la mise en correspondence des nombres, des devises ou de la date. Elle est par ailleurs réservée à Flash Professional. Voupe qu e aeglement recupere le code de langue actif associé au systeme d'exploitation à l'aide de la propriete flash.system.Capabilitieslanguage.Cette propriete n'extrait toutfois que le code de langue ISO 639-1 a deux caractères, plout que l'ID de parametes régionaux complet, et ne prend en charge qu'un jeu déterminé de parametes régionaux. Dans AIR 1.5, vous disposez de la propriété flash.system.Capabilitieslanguages.Cette proprieté génére un tableau contenant les langues d'interface privilégiees par l'utilisateur. Elle n'est donc pas sujette aux restrictions de Capabilities language.

Formatage des nombres

Flash Player 10.1 et les versions ultérieures, Adobe AIR 2.0 et les versions ultérieures Le format d'affichage des valeurs numériques varie considérablement d'une région à l'autre. Le nombre 123456,78 est par exemple formaté comme suit selon les paramètres régionaux en vigueur :
Paramètres régionauxFormatage du nombre
en-US (anglais, Etats-Unis)-123,456.78
de-DE (allemand, Allemagne)-123.456,78
fr-FR (français, France)-123 456,78
de-CH (allemand, Suisse)-123'456.78
en-IN (anglais, Inde)-1,23,456.78
La plupart des paramètres régionaux arabes123,456.78-
Un grand nombre de facteurs affectent les formats numériques, tels que: - Séparateurs : le séparateur decimal est place entre le nombre entier et la partie fractionnelle d'un nombre. Il peut correspondir à un point, une virgule ou un autre caractère. Le séparateur de milliers peut être un point, une virgule, un espace insécable ou un autre caractère. - Types de regroupement : le nombre de chiffres entre chaque séparateur de milliers à gauche du séparateur decimal peut correspondir à deux, trois, voir une autre valeur. - Indicateurs de nombre négatif : signe moins inséré sur la gauche ou la croite du nombre négatif, ou nombre négatif placé entre parentheses pour les applications financières. Ainsi, le nombre 19 négatif peut être affchéé comme suit : -19, 19- ou (19). - Zéros à droite ou à gauche : certaines conventions culturelles ajoutent des zéros à gauche ou à droite des nombres affichés. Ainsi, la valeur 0,17 peut être affichée comme suit : .17, 0,17 ou 0,170, etc. - Jeux de caractères numériques : de nombreuses langues, parmi lesquelles l'arabe, l'hindi et le japonais, utilisent différents jours de caractères numériques. Le package flash.globalization prend en charge tous les jours de caractères numériques mappings sur les chiffres 0 à 9. La classe NumberFormatter prend en compte tous ces facteurs lors du formatage de valeurs numériques.

Utilisation de la classe NumberFormatter

La classe NumberFormatter formate les valeurs numériques (de type int, uint ou Number) en fonction des conventions de paramètres régionaux disponibles. L'exemple suivant illustrer la façon la plus simple de formater un nombre en fonction des propriétés de formatage par défaut gériées par le système d'exploitation de l'utilisateur :
var nf:NumberFormatter = new NumberFormatter(LocaleID.DEFAULT); trace(nf.formatNumber(-123456.789)) 
Le résultat varie selon les parametres régionaux en vigueur et les préférences de l'utilisateur. Ainsi, si les parametres régionaux de l'utilisateur correspondent à fr-FR, la valeur est formatée comme suit : -123.456,789 Si vous souhaitez vous limiter au formatage d'un nombre en fonction de paramètres régionaux disponibles, quels que soient les paramètres de l'utilisateur, définisSEE spécifiquement le nom des paramètres régionaux. Exemple :
var nf:NumberFormatter = new NumberFormatter("de-CH"); trace(nf.formatNumber(-123456.789)); 
Dans ce cas de figure, le résultat est le suivant : -123'456.789 La méthode.formatNumber() traite la valeur Number comme un paramètre. La classe NumberFormatter gère également une méthode.formatInt(), qui gère l'entrée int, et une méthode formatUint(), qui gère l'entrée uint. Pour contrôle explicitement la logique de formatage, définisSEE les propriétés de la classe NumberFormatter, comme illustré ci-dessous :
var nf:NumberFormatter = new NumberFormatter("de-CH");  
nf-negativeNumberFormat = 0;  
nf.fractionalDigits = 5;  
nf.trailingZeros = true;  
nfdecimalSeparator = "",";  
nf.useGrouping = false;  
trace(nf.formatNumber(-123456.789)); // (123456.78900) 
Cet exemple commence par creer un objet NumberFormatter, puis : - définit le format numérique négatif de sorte à utiliser des parentheses ( comme dans les applications financières ) ; - définit le nombre de chiffres après le séparateur decimal sur 5; - stipule l'insertion de zéros à droite pour garantir la présence de cinq décimales; definitelésepairoudecimalsurunevirgule; - indique à la fonctionnalité de formatage de ne pas utiliser de séparateur de milliers. Remarque: si certaines de ces propriétés sont modifiées, le format numérique résultat ne correspond plus au format préfééré associé aux paramètres régionaux indiqués. Ne faites appel à certaines de ces propriétés que si la prise en charge des paramètres régionaux est superflue, comme dans les cas de figure suivants: si un aspect unique du format doit être contrôle avec précision (le nombre de zéros à droite, par exemple) ou si l'utilisateur demande directement la modification (via le Panneau de configuration Windows, par exemple).

Analyse des chaines contenant des valeurs numériques

La classe NumberFormatter peut également extraire des valeurs numériques de chaînes conformes aux conventions de formatage stipulées par les paramètres régionaux. La méthode NumberFormatter.parseNumber() extrait une valeur numérique unique d'une chaine. Exemple :
var nf:NumberFormatter = new NumberFormatter("en-US");  
var inputNumberString:String = "-1,234,567.890"  
var parsedNumber:Number = nf.parseNumber(inputNumberString);  
trace("Value:" + parsedNumber); // -1234567.89  
trace("Status:" + nf.lastOperationStatus); // noError 
La méthode parseNumber() gère les chaînes qui ne contiennent que des caractères de formatage de chiffres et de nombres, tels que les signes moins et les séparateurs. Si la chaine contient d'autres caractères, un code d'erreur est défini :
var nf:NumberFormatter = new NumberFormatter("en-US");  
var inputNumberString:String = "The value is 1,234,567.890"  
var parsedNumber:Number = nf.parseNumber(inputNumberString);  
trace("Value:" + parsedNumber); // NaN  
trace("Status:" + nf.lastOperationStatus); // parseError 
Pour extraire des nombres de chaînes qui contiennent également des caractères alphétiques, faites appel à la méthode NumberFormatter.parse():
var nf:NumberFormatter = new NumberFormatter("en-US");  
var inputNumberString:String = "The value is 123,456,7.890";  
var parseResult:NumberParseResult = nf.parse(inputNumberString);  
trace("Value:" + parseResult.value); // 1234567.89  
trace("startIndex: " + parseResultstartIndex); // 14  
trace("Status:" + nf.lastOperationStatus); // noError 
La méthode parse() renvoie un objet NumberParseResult, dont la propriété Value contient la valeur numérique analyse. La propriété startIndex indique l'index du premier caractère numérique détecté. Les propriétés startIndex et endIndex permettent d'extraire les sections de chaine qui precedent ou suivent les chiffres.

Formatage des valeurs en devise

Flash Player 10.1 et les versions ultérieures, Adobe AIR 2.0 et les versions ultérieures Les formats d'affichage des valeurs en devise varient tout autant que les formats numériques. La valeur 123456,78 $ est par exemple formatée comme suit selon les paramètres régionaux en vigueur :
Paramètres régionauxFormatage du nombre
en-US (anglais, Etats-Unis)123,456.78
de-DE (allemand, Allemagne)123,456,78
en-IN (anglais, Inde)$ 1,23,456.78
Le formatage des valeurs en devise est affecté par les mêmes facteurs que le formatage numérique, auxquels s'ajoutent les facteurs complémentaires suivants : Code ISO de devise : code de devise ISO 4217 de trois lettres des paramètres régionaux actuellément spécifique (USD ou EUR, par exemple). - Symbole de devise : chaîne ou symbole de devise correspondant aux paramètres régionaux actuelsment spécifique ($ ou €, par exemple). - Format de devise négatif : définit l'emplacement du symbole de devise et du symbole négatif ou des parenthèses par rapport à la partie numérique du montant en devise. - Format de devise positif : définit l'emplacement du symbole de devise par rapport à la partie numérique du montant en devise.

Utilisation de la classe CurrencyFormatter

La classe CurrencyFormatter transforme les valeurs numériques en chaînes contenant des chaînes de devise et des nombres formats, conformément aux conventions de paramêtres régionaux données. Lorsque vous instanciez un nouvel objet CurrencyFormatter, il définit la devise sur la devise associée par défaut aux paramètres régionaux en vigueur. L'exemple suivant indique qu'un objet CurrencyFormatter créé à partir de paramètres régionaux allemands part du principe que les montants en devise sont exprimés en euros :
var cf: CurrencyFormatter = new CurrencyFormatter("de-DE"); trace(cf.format(1234567.89)); // 1.234.567,89 EUR 
Dans la plupart des cas, ne vous fiez pas à la devise associée par défaut aux paramètres régionaux. Si les paramètres régionaux par défaut d'un utilisateur ne sont pas pris en charge, la classe CurrencyFormatter affecte des paramètres régionaux de substitution. Les paramètres régionaux de substitution utilisent parfois une autre devise par défaut. Par ailleurs, les formats en devise doivent généralement sembler corrects à l'utilateur, même si les montants ne sont pas exprimés dans sa devise locale. Ainsi, un utilisateur canadien peut être améné à afficher les tarifs d'une entreprise allemande en euros, mais formatés dans le style canadien. La méthode CurrencyFormatter.setCurrency() désigné la chaine et le symbole de devise exacts à utiliser. L'exemple suivant affiche les montants en devise en euros à l'intention des utilisateurs qu'ébécOs :
var cf:CurrencyFormatter = new CurrencyFormatter("fr-CA");  
cf.setCurrency("EUR", "€");  
trace(cf.format(1234567.89)); // 1.234.567,89 EUR 
La méthode setCurrency() permet également de réduire les risques de confusion en définissant des symboles de devise non ambiguus. Exemple :
cf.setCurrency("USD","US$"); 
Par défaut, la méthode format() affiche un code de devise ISO 4217 de trois caractères au lieu du symbole de devise. Les codes ISO 4217 ne sont pas ambiguus et ne nécessitant pas de localisation. Un grand nombre d'utilisateurs préférent toute fois les symboles de devise aux codes ISO. La classe CurrencyFormatter peut vous aider à decideur du symbole utilisé par une chaine en devise formatée : un symbole de devise ( \( \) ou €, par exemple) ou une chaine de devise ISO de trois caractères (USD ou EUR, par exemple). Ainsi, un montant exprime en dollars canadiens pourrait être affiché sous la forme \(200 à l'intention d'un utilisateur qui réside au Canada. Pour un utilisateur qui réside aux Etats-Unis, il pourrait par contre être affiché sous la forme CAD 200. La méthode formattingWithCurrencySymbolIsSafe() permet de déterminer si le symbole de devise d'un montant risque d'être ambiguou ou incorrect en fonction des paramètres régionaux de l'utilitaireur. L'exemple suivant affiche une valeur en euros dans un format adapté aux paramètres régionaux en-US. Selon les paramètres régionaux de l'utilisateur, la chaîne sortie contient soit le code de devise ISO, soit le symbole de devise.
var cf:CurrencyFormatter = new CurrencyFormatter( "en-CA");
if (cf.formattingWithCurrencySymbolIsSafe("USD"))
{
    trace(cf.format(1234567.89, true)); // $1,234,567.89
}
else
{
    cf.setCurrency("USD", "$");
    trace(cf.format(1234567.89)); // USD1,234,567.89
} 

Analyse des chaînes contenant des valeurs en devise

La classe CurrencyFormatter peut également extraire un montant et une châne de devise d'une châne de sortie conforme aux conventions de formatage des paramètres régionaux. La méthode CurrencyFormatter.parse() enregistre le montant et la châne de devise analysés dans un objet CurrencyParseResult, comme illustré ci-après :
var cf:CurrencyFormatter = new CurrencyFormatter("en-US");  
var inputCurrencyString:String = "("GBP 123,56,7.890)";  
var parseResult:CurrencyParseResult = cf.parse(inputCurrencyString);  
trace(" parsed amount: " + parseResult.value); // -1234567.89  
trace("currencyString: " + parseResult.CurrencyString); // GBP 
La partie chaine de devise de la chaine d'entrée peut containir un symbole de devise, un code ISO de devise et des caractères texte. La position de la chaine de devise, de l'indicateur de nombre négatif et de la valeur numérique correspond aux formats spécifique par les propriétés negativeCurrencyFormat et positiveCurrencyFormat. Exemple :
var cf:CurrencyFormatter = new CurrencyFormatter( "en-US" );
var inputCurrencyString:String = "Total -$123,56,7.890";
var parseResult:CurrencyParseResult = cf.parse(inputCurrencyString);
trace("status: " + cf.lastOperationStatus); // parseError
trace(" parsed amount: " + parseResult.value); // NaN
trace("currencyString: " + parseResult.ccurrencyString); // 
cf-negativeCurrencyFormat = 2;
parseResult = cf.parse(inputCurrencyString);
trace("status: " + cf.lastOperationStatus); // noError
trace(" parsed amount: " + parseResult.value); // -123567.89
trace("currencyString: " + parseResult.ccurrencyString); // Total $ 
Dans cet exemple, la chaine d'entrée contient une chaine de devise, suivie d'un signe moins et d'un nombre. Toutefois, la valeur negativeCurrencyFormat par défaut associée aux paramètres régionaux en-US spécifique que l'indicateur négatif est placé en première position. Par conséquent, la méthode parse() génére une erreur et la valeur analysée est NaN. Une fois negativeCurrencyFormat défini sur 2, qui stipule que la chaine de devise est place en première position, la méthode parse() aboutit.

Formatage des dates et heures

Flash Player 10.1 et les versions ultérieures, Adobe AIR 2.0 et les versions ultérieures

Le format d'affichage de la date et de l'heure varie également considérablement d'une région à l'autre. Voici par exemple comment le 2 janvier 1962 à 13:01 est affché dans un format court en fonction de divers paramètres régionaleux :
Paramètres régionauxFormat de la date et de l'heure
en-US (anglais, États-Unis)1/2/62 1:01pm
fr-FR ( français, France)2/1/62 13:01
ja-JP (japonais, Japon)1962/2/1 13:01

Utilisation de la classe DateTimeFormatter

La classe DateTimeFormatter formate les valeurs Date en chaines de date et d'heure conformément aux conventions de paramètres régionaux données. Le formatage est régi par une chaine modèle qui contient des séquences de lettres replacées par des valeurs de date ou d'heure. Par exemple, dans le modèle « yyyy/MM », les caractères « yyyy » sont replacés par une année à quatre chiffres, suivie du caractère « / » et d'un mois à deux chiffres. La méthode setDateTimePattern() permet de définir explicitement la chaine modèle. Il est toute fois préféable d'activer la définition automatique du modele en fonction des préférences du système d'exploitation et des paramètres régionaux de l'utilisateur. Cette stratégie contribue à assurer un résultat approprié d'un point de vue culturel. L'élément DateTimeFormatter peut représentier des dates et heures en trois styles standard (LONG, MEDIUM et SHORT) et faire appel à un modèle CUSTOM. Vous pouvez utiliser un style pour la date et un autre pour l'heure. Les modèles associés à chaque style varient sensiblement d'un système d'exploitation à l'autre. Vous peuvent specifier les styles lors de la création d'un objet DateTimeFormatter. Si les paramètres de style ne sont pas spécifique, ils sont définis sur DateTimeStyle LONG par défaut. Vous pouvez modifier les styles ultérieurement à l'aide de la méthode setDateTimeStyles(), comme indiqué dans l'exemple suivant:
var date:Date = new Date(2009, 2, 27, 13, 1);
var df:DateTimeFormatter = new DateTimeFormatter("en-US",
    DateTimeStyle LONG, DateTimeStyle LONG);
var longDate:String = df.format(date);
trace(longDate); // March 27, 2009 1:01:00 PM
df.setDateTimeStyles(DateTimeStyle.SHORT, DateTimeStyle.SHORT);
var shortDate:String = df.format(date);
trace(shortDate); // 3/27/09 1:01 PM 

Localisation des noms de mois et de jour

De nombreuses applications font appel à des listes de noms de mois et de jour de la semaine dans les calendriers ou listes déroulantes affichés. La méthode DateTimeFormatter.getMonthNames() permet de récapérer une liste localisée de nombres de mois. Le système d'exploitation déterminée si les formes complètes et abréguées sont disponibles. Transmettez la valeur DateTimeNameStyle.FULL pour extraire les nombres de mois complet. Transmettez la valeur DateTimeNameStyle LONG_ABBREVIATION ou DateTimeNameStyle.SHORT_ABBREVIATION pour obtenir des versions abréguées. Dans certaines langues, un nom de mois change (il est alors mis au génitif) s'il est placé à côté de la valeur jour dans un format de date. Si vous envisagez d'utiliser les noms de mois sans spécifique de jour, transmettez la valeur DateTimeNameContext.STANDALONE à la méthode getMonthNames(). Pour utiliser les noms de mois dans les dates formatées, transmettez toute fois la valeur DateTimeNameContext.FORMAT.
var df:DateTimeFormatter = new DateTimeFormatter("fr-FR");
var months:Vector.<String> = df.getMonthNames(DateTimeNameStyle.FULL, DateTimeNameContext.STANDALONE);
trace(months[0]); // janvier
months = df.getMonthNames(DateTimeNameStyle.SHORT_ABBREVIATION, DateTimeNameContext.STANDALONE);
trace(months[0]); //janv. 
La méthode DateTimeFormatter.getWeekdayNames() fournit une liste localisée de nombres de jour de la semaine. La méthode getWeekdayNames() gère les mêmes paramètres nameStyle et context que la méthode getMonthNames().
var df:DateTimeFormatter = new DateTimeFormatter("fr-FR");  
var weekdays:Vector.<String> = df.getWeekdayNames(DateTimeNameStyle.FULL, DateTimeNameContext.STANDALONE);  
trace(weekdays[0]); // dimanche  
weekdays = df.getWeekdayNames(DateTimeNameStyle LONG_ABBREVIATION, DateTimeNameContext.STANDALONE);  
trace(weekdays[0]); // dim. 
Par ailleurs, la méthode getFirstWeekday() renvoie la valeur d'index du jour qui representative traditionnellement le début de la semaine dans les paramétres régionaux sélectionnés.

Tri et comparaison des chaînes

Flash Player 10.1 et les versions ultérieures, Adobe AIR 2.0 et les versions ultérieures Le processus de disposition des éléments dans l'ordre appropriéporte le nom de classement. Les règles de classement varient considérablement selon les paramètres régionaux sélectionnés. Elles varient également si vous triez une liste ou que vous mettez en correspondence des éléments similaires (dans un algorithme de recherche de texte, par exemple). Lors de l'exécution d'un tri, les différences mineures telles que la casse ou les signes diacritiques tels que les accents jouent souvent un role important. Ainsi, la dette o (o avec un tréma) est généralement considérée comme étant équivalente à la dette o simple en français ou en anglais. En suédois, cette dette suit cependant la dette z. En français comme dans d'autres langues, la présence d'un caractère accentué dans un mot affecte l'ordre de tri d'une liste. Lors d'une recherche, il est souvent préférible de ne pas tener compte de la casse ou des signes diacritiques pour augmenter les chances de détction de correspondances appropriées. Ainsi, la recherche des caractères « cote » dans un document français est susceptible de renvoyer « cote », « côte » et « coté »

Utilisation de la classe Collator

La classe Collator a pour principales méthodes compare(), qui sert principalement à trier, et equals(), qui permet demettre en correspondance les valeurs. L'exemple suivant illustrer le comportement des méthodes compare() et equals().
var words:Array = new Array("coté", "côte");   
var sorter:Collator = new Collator("fr-FR", CollatorMode.SORTING);   
words.sort sorter(compare);   
trace words); // côte,coté   
var matcher:Collator = new Collator("fr-FR", CollatorMode.MATCHING); if (matcher.equals words[0], words[1])) { trace words[0] + " = " + words[1]); // côte = coté } 
L'exemple commence par创建工作 un object Collator en mode SORTING pour les paramètres régionaux français-France. Il trie ensuite deux mots dont l'unique différence reside dans la presence de signes diacritiques. Il indique que le mode de comparaison SORTING établit une distinction entre les caractères accentués et non accentués. Le tri repose sur la transmission d'une reference à la méthode sort() de l'objet Collator en tant que paramètre de la méthode Array.sort(). Ce type d'utilisation d'un object Collator pour gérer l'ordre de tri est particulièrement efficace. L'exemple creé ensuite un objet Collator en mode MATCHING. Lorsque l'objet Collator compare les deux mots, il les considère comme égaux. La comparaison MATCHING n'établit ainsi pas de distinction entre les caractères accentués et non accentués.

Personnalisation du comportement de la classe Collator

Par défaut, la classe Collator fait appel aux règles de comparaison de chaînes extraites du système d'exploitation, en fonction des paramètres régionaux et des préférences système de l'utilateur. Pour personneliser le comportement des méthodes compare() et equals(), définisse explicitement diverses propriétés. Le tableau suivant recense les propriétés et leur impact sur les comparaisons :
Propriété CollatorImpact
numericComparisonDéterminé si les caractères numériques sont traités comme des nombres ou du texte.
ignoreCaseDéterminé si les différences de casing sont ignorées.
ignoreCharacterWidthDéterminé si les formes à pleine chasse et à demi-chasse de certains caractères chinois et japonais sont considérées comme égales.
ignoreDiacriticsDéterminé si les chaînes qui contiennent les mêmes caractères de base, mais des accents ou autres signes diacritiques différents sont considérées comme égales.
ignoreKanaTypeDéterminé si les chaînes dont l'unique différence réside dans le type de caractère kana utilisé sont considérées comme égales.
ignoreSymbolsDéterminé si les symboles tels que les espaces, les symboles de devise, les symboles mathématiques et autres sont pris en compte.
Le code suivant indique que définiir la propriété ignoreDiacritics sur true modifie l'ordre de tri d'une liste de mots français :
var words:Array = new Array("COTE", "coté", "côte", "Coté", "cote");  
var sorter: Collator = new Collator("fr-CA", CollatorMode.SORTING);  
words.sort sorter(compare);  
trace(words); // cote, COTE, coté, coté, Coté 
sorterignoreDiacritics = true; words.sort sorter(compare); trace(words);//côte,coté,cote,Coté,COTE

Conversion de la casse

Flash Player 10.1 et les versions ultérieures, Adobe AIR 2.0 et les versions ultérieures Les langues gérènt également différemment les règes de conversion des majuscules et des minuscules. Ainsi, dans la plupart des langues basées sur l'alphabet latin, la forme minuscule de la majuscule « I » est « i ». Toutefois, certaines langues, telles que le turc et l'azéri, comportent une autre dette « 1 » sans point. Par conséquent, dans ces langues, un « 1 » minuscule sans point se transforme en « I » majuscule. Un « i » minuscule se transforme quant à lui en « I » majuscule avec un point. La classe StringTools propose des méthodes qui font appel à des règles propres à chaque langue pour exécuter ces transformations.

Utilisation de la classe StringTools

La classe StringTools contient deux méthodes de transformation de la casing, toLowerCase() et toUpperCase(). Vous créez un objet StringTools en appelant le constructeur à l'aide d'un ID de paramètres régionaux. La classe StringTools extrait les règles de conversion de casse associées aux paramètres régionaux (ou à des paramètres régionaux de substitution) du système d'exploitation. Il est impossible de personnaliser plus encore l'algorithmme de conversion de casse. L'exemple suivant fait appel aux méthodes toUpperCase() et toLowerCase() pour transformer une expression allemande qui comprend la dette « » (Eszett). var phrase:String = "Schloß Neuschwanstein"; var converter:StringTools = new StringTools("de-DE"); var upperPhrase:String = convertertoUpperCasephrase); trace(upperPhrase);// SCHLOSS NEUSCHWANSTEIN var lowerPhrase:String = convertertoLowerCase(upperPhrase); trace(lowerPhrase);// schloss neuschwanstein La méthode toUpperCase() transforme le « β » minuscule en « SS » majuscules. Cette transformation ne fonctionne que dans un sens. Lorsque les lettres « SS » sont reconverties en minuscules, le résultat est « ss » et non « β »

Exemple : Internationalisation d'une application de suivi des stocks

Flash Player 10.1 et les versions ultérieures, Adobe AIR 2.0 et les versions ultérieures L'application Global Stock Ticker extrait et affiche des données boursières fictives dans trois Bourses distinctes : Etats-Unis, Japon et Europe. Elle formate les données en fonction des conventions de divers paramétres régionaux. Cet exemple illustrate les fonctions suivantes du package flash.globalization : - Formatage des nombres en fonction des paramètres régionaux - Formatage des devises en fonction des paramètres régionaux - Définition des codes ISO et des symboles de devise - Formatage de date en fonction des paramètres régionaux - Extraction et affichage des abréviations de noms de mois appropriées Pour obtenir les fichiers d'application de cet exemple, voir www.adobe.com/go/learn_programmingAS3samples.flash_fr. Les fichiers d'application de Global Stock Ticker résident dans le dossier Samples/GlobalStockTicker. L'application se compose des fichiers suivants :
FichierDescription
GlobalStockTicker.mxml ou GlobalStockTicker.flaInterface utilisé de l'application pour Flex (MXML) ou Flash (FLA).
styles.cssStyles associés à l'interface utilisé de l'application (Flex uniquement)
com/example/programMINGas3/stock ticker/flex/FinGraph.mxmlComposant MXML qui affiche les données boursières simulées sous forme graphique (Flex uniquement)
com/example/programmingas3/stock ticker/flash/GlobalStockTicker.asClasse Document contenant la logique de l'interface utilisé de l'application (Flash uniquement)
comp/example/progammingesas3/stockicker/flash/RightAlignedColunasFonctionnalité de rendu de cellule personalisé associée au composant DataGrid de Flash (Flash uniquement)
com/example/programMINGa3/stockticker/FinancialGraph.asClasse ActionScript qui illustré les données boursières simulées sous forme graphique
com/example/programMINGa3/stockticker/Localizer.asClasse ActionScript qui géré les paramètres régionaux et les devises et traite le formatage localisé des nombres, montants en devise et dates
com/example/programMINGa3/stockticker/StochasticModel.asClasse ActionScript qui stocke toutes les examples de données de l'application Global Stock Ticker

Présentation de l'interface utiliser et des exemples de données

Les principaux éléments de l'interface utiliser de l'application sont les suivants : - Listederoulantepermutant desélectionner les paramétres régionaux - Listederoulantepermittant de selectionner une Bourse Grille contenant les données de six sociétés par Bourse - Graphique illustrant les données historiques simulées des actions de la société sélectionnée L'application stocke tous les exemples de données relatifs aux paramétres régionaux, aux Bourses et aux actions des sociétés dans la classe StockDataModel. Une application réelle extrairait les données d'un serveur et les stockerait dans une classe telle que StockDataModel. Dans cet exemple, toutes les données sont codées en dur dans la classe StockDataModel. Remarque: les données affichées dans le graphique financier ne correspondant pas nécessairement pas aux données du contrôle grille de données. Le graphique est actualisé à chaque fois qu'une autre société est seLECTIONnée. Il est proposé à titre d'illustration uniquement.

Définition des paramètres régionaux

Au terme de la phase de configuration initiale, l'application appelle la méthode Localizer.setLocale() pour creer des objets de formatage associés aux paramètres régionaux par défaut. La méthode setLocale() est également appelée à chaque fois que l'utilisateur seLECTIONne une nouvelle valeur dans la liste déroulante de paramètres régionaux. public function setLocale(newLocale:String):void { locale = new LocaleID(newLocale); nf = new NumberFormatter(locale.name); traceError(nf.lastOperationStatus, "NumberFormatter", nfactualLocaleIDName); cf = new CurrencyFormatter(locale.name); traceError(cf.lastOperationStatus, "CurrencyFormatter", cf实际情况LocaleIDName); symbolIsSafe = cf.formatingWithCurrencySymbolIsSafe(currentCurrency); cf.setCurrency(currentCurrency, currentSymbol); cf.fractionalDigits = currentFraction; df = new DateTimeFormatter(locale.name, DateTimeStyle LONG, DateTimeStyle.SHORT); traceError(df.lastOperationStatus, "DateTimeFormatter", df但实际上LocaleIDName); monthNames = df.getMonthNames(DateTimeNameStyle LONG_ABBREVIATION); } public function traceError(status:String, serviceName:String, localeID:String):void { if(status != LastOperationStatus.NO_ERROR) { if(status = = LastOperationStatus.USING_FALLBACK_WARNINGS) { trace("Warning - Fallback locale ID used by " + serviceName +":": + localeID); } else if (status = = LastOperationStatus.UNSUPPORTED_ERROR) { trace("Error in " + serviceName +":": + status); //abort application throw(new Error("Fatal error", 0)); } else { trace("Error in " + serviceName +":": + status); } } else { trace(serviceName + " created for locale ID: " + localeID); } } La méthode setLocale() commence par créé un objet LocaleID. Cet objet simplifie l'obtention ultérieure d'informations détaillées sur les paramètres régionaux en tant que tels, le cas échéant. La méthode creée ensuite des objets NumberFormatter, CurrencyFormatter et DateTimeFormatter associés aux paramétres régionaux. Au terme de la création de chaque objet de formatage, elle appelle la méthode traceError(). Cette méthode affiche des messages d'erreur et d'avertissement sur la console en cas de problème au niveau des paramétres régionaux requis. (Une application réelle devrait réagir suite à des erreurs de ce type au lieu de se contenter de les suivre.) Une fois l'objet CurrencyFormatter créé, la méthode setLocale() définit le code ISO de la devise, le symbole de la devise et les propriétés fractionalDigits de la fonctionnalité de formatage sur les valeurs précédemment déterminées. (Ces valeurs sont définies à chaque fois que l'utilisateur seLECTIONne une nouvelle option dans la liste déroulante de marchés.) Une fois l'objet DateTimeFormatter créé, la méthode setLocale() extrait également un tableau d'abréviations de noms de mois localisés.

Formatage des données

Les données boursières formatées sont affichées dans un contrôle de type grille de données. Chaque colonne de la grille de données appelle une fonction d'étiquette qui formate la valeur de la colonne par le biais de l'objet de formatage approprié. Dans la version Flash, par exemple, le code suivant configure les colonnes de la grille de données :
var coll: DataGridColumn = new DataGridColumn("ticket");  
coll.Text = "Company";  
coll.sortOptions = Array.NumERIC;  
coll.width = 200; 
var col2: DataGridColumn = new DataGridColumn("volume");  
col2.headText = "Volume";  
col2.width = 120;  
col2.cellRenderer = RightAlignedCell1;  
col2.labelFunction = displayVolume; 
var col3colonDataGridColumn = new DataGridColumn("price"); col3.headText = "Price"; col3.width = 70 . col3.cellRenderer = RightAlignedCell; col3.labelFunction = displayPrice; var col4colonDataGridColumn new DataGridColumn("change"); col4.headText = "Change"; col4.width = 120 . col4.cellRenderer RightAlignedCell1; col4.labelFunction displayPercent; La version Flex de l'exemple déclare sa grille de données en MXML. Elle définit également des fonctions d'étiquette similaires pour chaque colonne. Les propriétés labelFunction font réference aux fonctions suivantes, qui appelent les méthodes de formatage de la classe Localizer : private function displayVolume(item:Object):String { return localizer.formatNumber(item.volume,0); } private function displayPercent(item:Object):String { return localizer.formatPercent(item/change); } private function displayPrice(item:Object):String { return localizer.formatCurrency(item.price); } Les méthodes Localizer configurent et appelent ensuite les fonctionnalités de formatage appropriées: public function formatNumber(value:Number,fractionalDigits:int = 2 ):String { nf.fractionalDigits = fractionalDigits; return nf.formatNumber(value); } public function formatPercent(value:Number,fractionalDigits:int = 2 ):String { //HACK WARNING:The position of the percent sign,and whether a space belong. // between it and the number,are locale-sensitive decisions.For example, //in Turkish the positive format is % 12 and the negative format is - % 12 . //Like most operating systems,flash.globalization classes do not currently //provide an API for percentage formatting. nf.fractionalDigits = fractionalDigits; return nf.formatNumber(value)+"%"; } public function formatCurrency(value:Number):String { return cf.format(value,symbolIsSafe); } public function configDate(dateValue:Date):String { return df.format(dateValue); }

Chapitre 57 : Localisation d'applications

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

La localisation consiste à inclure des actifs prarent en charge plusieurs yeux de parametes régionaux. Les parametes régionaux correspondent à une langue et un code de pays. Par exemple, fr_FR fait reference à l'anglais tel qu'il est parlé aux Etats-Unis et fr_FR, au français utilisé en France. Pour localiser une application en fonction de ces parametes régionaux, vous proposerie deux yeux d'actifs : un pour les parametes fr_FR et l'autre pour les parametes fr_FR. Les paramètres régionaux peuvent partager des langues. Ainsi, fr_FR et en_GB (Grande Bretagne) sont des paramètres régionaux différents. Dans ce cas, les deux yeux de paramètres régionaux spécifique l'anglais, mais le code de pays indique qu'ils sont différents et n'utilisent donc pas nécessairement les mêmes actifs. Par exemple, une application utilisant les paramètres régionaux fr_FR comprendrait peut-être le mot « color», alors que ce mot serait épelé « colour » dans les paramètres régionaux en_GB. Par ailleurs, les devises correspondraient aux dollars ou aux livres Sterling, selon les paramètres régionaux, et les formats de date et d'heure seraient peut-être aussi différents. Vous pouze également fournir un jeu d'actifs pour une langue sans spécifique de code de pays. Ainsi, vous pouze fournir des actifs en pour l'anglais et des actifs supplémentaires pour les paramètres régionaux fr_FR, qui sont spécifique à l'anglais américain. La localisation ne se limite pas à traduire les chaînes utilisées dans l'application. Elle peut également comprendre n'importe quel type d'actif, tels que les fichiers audio, les images ou les vidés.

Choix d'un jeu de paramètres régionaux

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Pour déterminer les produits de paramètres régionaux qu'utilise votre contenu ou votre application, vous pouvez procéder comme suit, au besoin : - Package flash.globalization : les classes gérant les paramètres régionaux du package flash.globalization permettant d'extraire les paramètres régionaux par défaut de l'utilisateur en fonction du système d'exploitation et des préférences de ce dernier. Cette solution est recommendée pour les applications qui tournent sur les moteurs d'exécution de Flash Player 10.1 ou ultérieur ou d'AIR 2.0 ou ultérieur. Pour plus d'informations, voir « Identification des paramètres régionaux » à la page 981. - Invite utilisateur : vous pouvez demarrer l'application avec un jeu de paramètres régionaux par défaut et inviter l'utilisateur àCHOISIR le jeu qu'il préfére. (AIR uniquely) Capabilitieslanguages: la propriete Capabilitieslanguages presente un tableau de langues disponible dans les langues préferées de l'utilisateur, telles qu'elles sont définies par le biais du système d'exploitation. Les chaînes contiennent des balises de langue (ainsi que des informations de script et de région, le cas échéant) définies par la norme RFC4646 (http://www.ietf.org/rfc/rfc4646.txt). Elles utilisent des tirets comme délimiteurs (par exemple, "en-US" ou "ja-JP"). La première entrée du tableau renvoyé possède le même identificant de langue principale que la propriété language. Par exemple, si languages [0] est défini sur "en-US", la propriété language est définié sur "en". Cependant, si la propriété language est définié sur "xu" (qui représentée une langue inconnue), le premier élément du tableau languages est différent. - Capabilitieslanguage: la propriété Capabilities language indique le code de langue de l'interface utilisateur du système d'exploitation. Cette propriété est toute fois limitée à 20 langues connues. Sur les systèmes anglais, elle renvoie uniquement le code de langue et non le code du pays. C'est pourquoi il est préféable d'utiliser le premier élément du tableau Capabilitieslanguages.

Localisation de contenu Flex

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Adobe Flex propose a structure de localisation du contenu Flex. Cette structure contient les classes Locale, ResourceBundle et ResourceManagerImpl, ainsi que les interfaces IResourceBundle et IResourceManagerImpl. Une bibliothèque de localisation Flex contenant des classes d'utilitaires destinés à trier les paramêtres régionaux d'application est proposée sur Google Code (http://code.google.com/p/as3localelib/).

Voir aussi

http://code.google.com/p/as3localelib/

Localisation du contenu Flash

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures Adobe Flash Professional comprehend a classe Locale dans les composants ActionScript 3.0. La classe Locale vous permet de contrôler l'affichage de texte multilingue dans un filchier SWF. Le panneau Chaines de Flash vous permet d'utiliser des ID de chaine au lieu de litteraux de chaine dans les champs de texte dynamique. Grâce à cette fonctionnalité, vous pouvez creer un filchier SWF qui affiche du texte charge à partir d'un filchier XML spécifique à une longue. Pour plus d'informations sur l'utilisation de la classe Locale, voir Guide de référence ActionScript 3.0 pour la plate-forme Adobe Flash.

Localisation d'applications AIR

Adobe AIR 1.0 et les versions ultériées Le SDK d'AIR propose une structure de localisation HTML (qui figure dans un fjichier AIRLocalizer.js). Cette structure comprend des API qui facilitent la gestion de plusieurs paramètres régionaux dans une application HTML. Pour acceder à une bibliothèque ActionScript destinée à trier les paramètres régionaux, voir http://code.google.com/p/as3localelib/.

Voir aussi

http://code.google.com/p/as3localelib/

Localisation des dates, heures et devises

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures L'affichage des dates, heures et devises dans les applications varie grandement en fonction du jeu de paramètres régionaux. Aux Etats-Unis, par exemple, la date est représentée sous la forme mois/jour/année alors qu'en Europe, la norme consiste à utiliser jour/mois/année. Voupez écré du code pour formater les dates, heures et devises. Par exemple, le code suivant convertit un objet Date du format mois/jour/année au format jour/mois/année. Si la variable locale (qui représenté le jeu de paramètres régionaux) est définie sur fr_FR, la fonction renvoie le format mois/jour/année. L'exemple convertit un objet Date au format jour/mois/année pour tous les autres yeux de paramètres régionaux :
function convertDate(date)   
{ if (locale == "en_US") { return (date.getMonth() + 1) + "/" + date.getDate() + "/" + date.getFullYear(); } else { return date.getDate() + "/" + (date.getMonth() + 1) + "/" + date.getFullYear(); } 

ADOBE FLEX

La structure Flex propose des contrôle de formatage de la date, des heures et des devises, notamment DateFormatter et CurrencyFormatter. - mx:DateFormatter - mx:CurrencyFormatter

Chapitre 58 : A propos del'environnement HTML

Adobe AIR 1.0 et les versions ultérieures

Adobe® AIR® fait appel à WebKit (www.webkit.org), également utilisé par le navigateur Web Safari, pour analyser,-disposer et rendre un contenu HTML ou JavaScript. Il n'est pas indispensable d'utiliser les API AIR dans un contenu HTML. Vous avez la possibilité de programmer intégralement le contenu d'un objet HTMLLoader ou d'une fenêtre HTML à l'aide des langages HTML et JavaScript. La plupart des pages et applications HTML existantes devraient être exécutées en présence peu de modifications (à condition qu'elles utilisent des fonctions HTML, CSS, DOM et JavaScript compatibles avec WebKit). Important : les nouvelles versions du moteur d'exécution Adobe AIR comprément parfois des versions mises à jour de WebKit. L'intégration d'une mise à jour de WebKit à une nouvelle version d'AIR risque d'engendrer des modifications inattendues dans une application AIR déployée. Ces modifications affectent parfois le comportement ou l'apparce du contenu HTML d'une application. Par exemple, les améliorations ou les corrections apportées au rendu WebKit ont parfois un impact sur les éléments de mise en forme de l'interface utilisateur d'une application. C'est pourquoi il est fortement recommendé d'intégrer un mécanisme de mise à jour à votre application. S'il s'avéré nécessaire de mettre à jour votre application en raison d'une modification de la version de WebKit intégrée à AIR, le mécanisme de mise à jour d'AIR peut inviter l'utilitaire à installer la nouvelle version de votre application. Le tableau suivant répertorie les versions du navigateur Web Safari qui font appel à la version de WebKit correspondant à cette utilisé dans AIR :
Version d'AIRVersion de Safari
1.02.04
1.13.04
1.54.0 bêta
2.04.03
2.54.03
2.64.03
2.74.03
35.0.3
Pour déterminer la version installée de WebKit, il suffit de vérifier la chaine de l'agent utilisé par défaut renvoyée par un objet HTMLLoader : varhtmlLoader:HTMLLoader = newHTMLLoader(); trace( htmlLoader.userAgent); N'oubliez pas que la version de WebKit utilisée dans AIR n'est pas identique à la version open source. Certaines fonctions ne sont pas prises en charge dans AIR et la version d'AIR est susceptible d'inclure des correctifs liés à la sécurité et aux bogues qui ne sont pas encore intégrés à la version correspondante de WebKit. Voir « Fonctions de WebKit non prises en charge dans AIR » à la page 1015. Etant donné que les applications AIR sont exécutées directement dans le poste de travail, en bénéficiant d'un accès complet au système de fichiers, le modèle de sécurité applicable au contenu HTML est plus strict que celui d'un navigateur Web standard. Dans AIR, seul le contentu charge a partir du repertoire d'installation de l'application est placé dans le sandbox de l'application. Le sandbox de l'application dispose du niveau de privilège le plus élevé, l'autorisant à acceder aux API AIR. AIR place les autres containus dans des sandbox distincts en fonction de leur origine. Les fichiers charges a partir du système de fichiers sont placés dans un sandbox local tandis que ceux qui ont été charges a partir du réseau à l'aide des protocoles http: ou https: sont diriges vers un sandbox dépendant du domaine du serveur distant. L'accès a toute API AIR est interdit au contentu de ces sandbox qui ne sont pas des applications. Ce type de containu est exécuté comme il le serait dans un navigateur Web classeque. Le contenu HTML visible dans AIR n'affiche pas de contenu SWF ou PDF si des paramétres alpha, de mise à l'échelle ou de transparence sont appliqués. Pour plus d'informations, voir « Éléments à prendre en compte lors du chargement d'un contenu SWF ou PDF dans une page HTML » à la page 1045 et « Transparence de la fenêtre » à la page 927.

Voir aussi

Webkit DOM Reference Safari HTML Reference Safari CSS Reference www.webkit.org

Présentation de l'environnement HTML

Adobe AIR 1.0 et les versions ultérieures Adobe AIR propose un environnement JavaScript de type navigateur complet, doté d'une fonctionnalité de rendu HTML, d'un modele d'objet de document et d'un interpréteur JavaScript. L'environnement JavaScript est représenté par la classe HTMLLoader d'AIR. Dans les fenêtres HTML, un objet HTMLLoader inclut tout le contenu HTML et est, à son tour, compris dans un objet NativeWindow. Dans un contenu SWF, il est possible d'ajouter la classe HTMLLoader, qui étend la classe Sprite, à la liste d'affichage d'une scène à l'instar de tout autre objet d'affichage. Les propriétés Adobe® ActionScript® 3.0 de la classe sont décrites à la section « Programmation du conteneur HTML d'AIR à l'aide de scripts » à la page 1043 et dans le manuel Guide de référence ActionScript 3.0 pour la plate-forme Adobe Flash. Dans la structure Flex, la classe AIR HTMLLoader est enveloppée dans un composant mx:HTML. Comme le composant mx:HTML étend la classe UIComponent, il peut être directement utilisé avec d'autres conteneurs Flex. L'environnement JavaScript au sein du composant mx:HTML ne présente aucune autre différence.

Présentation de l'environnement JavaScript et de sa relation avec l'hôte AIR

Adobe AIR 1.0 et les versions ultérieures Le diagramme suivant illustré la relation existant entre l'environnement JavaScript et l'environnement du moteur d'exécution AIR. Bien qu'une seule fenêtre native soit affichée, une application AIR peut containir plusieurs fenêtes. (De même, une seule fenêtre peut comprendre de multiples objets HTMLLoader.) ![](images/6f132c3f61054d4661b26f2b122ed92db6947f64b86fc9e588cce6c81f8e87e2.jpg) L'environnement JavaScript possède ses propres objets Document et Window. Le code JavaScript a des interactions avec l'environnement du moteur d'exécution AIR via les propriétés runtime, nativeWindow et htmlLoader. Quant au code ActionScript, il interagit avec l'environnement JavaScript par le biais de la propriété window d'un objet HTMLLoader, lequel fait reférence à l'objet Window JavaScript. En outre, les objets ActionScript et JavaScript permettent d'éçouter des événements envoyés à la fois par des objets AIR et JavaScript. La propriété段时间 offre un accès aux classes API AIR, ce qui vous permet de créé de nouveaux objets AIR de même que d'acceder aux membres de la classe (égarlement appelée statique). Pour acceder à une API AIR, ajoutez le nom de la classe (package compris) à la propriété段时间. Par exemple, pour creator un objet File, utilisez l'instruction suivante : var file = new window+runtime.filesystem.File(); Remarque: le kit de développement d'AIR contient un fisier JavaScript, intitule AIRAliases.js, qui définit des alias plus pratiques pour les classes AIR les plus courantes. Lors de l'importation de ce fisier, vous pouze utiliser la forme abrégée air.Class au lieu de window~-runtime~,package.Class. Vous pourriez, par exemple, creator l'objet File à l'aide de new air.File(). L'objet NativeWindow offre des propriétés permettant de contrôler la fenêtre du poste de travail. A partir d'une page HTML, vous pouvez acceder à l'objet NativeWindow conteneur à l'aide de la propriété window.nativeWindow. L'objet HTMLLoader propose des propriétés, des méthodes et des événements destinés à contröler les modes de chargement et de rendu du contenu. A partir d'une page HTML, vous pouze accéder à l'objet HTMLLoader parent à l'aide de la propriété window.htmlLoader. Important: seules les pages installées dans le cadre d'une application disposant des propriétés htmlLoader, nativeWindow ou uptime et ce, uniquement lorsqu'elles sont charges en tant que document de niveau supérieur. Ces propriétés ne sont pas ajoutées dans le cas où le document est charge dans une image ou une iframe. (Un document enfant peut acceder à ces propriétés dans le document parent du moment qu'il se trouve dans le même sandbox de sécurité. Par exemple, un document charge dans un cadre pourrait acceder à la propriété uptime de son parent au moyen de parent.rptime.)

A propos de la sécurité

Adobe AIR 1.0 et les versions ultérieures

AIR executée la totalité du code au sein d'un sandbox de sécurité dépendant du domaine d'origine. Le contentu de l'application, qui se limite au contentu charge a partir du repertoire d'installation de l'application, est placé dans le sandbox de l'application. L'accès à l'environnement d'exécution et aux API AIR est uniquement disponible pour les scripts HTML et JavaScript executés dans ce sandbox. Parallèlement à cela, les opérations d'évaluation et d'exécution dynamiques de code JavaScript sont en grande partie bloquées dans le sandbox de l'application une fois que tous les gestionnaires de l'évenement load de la page ont été renvoyés. Voues ave la possibite de mapper une page d'application dans un sandbox autre que d'application. Pour ce faire, chargez la page dans une image ou une iframe et definissee les attributs sandboxRoot etdocumentRoot du cadre propres a AIR. En configurant la valeur de sandboxRoot sur un domaine distant reel, vous permette au contenu plac dans le sandbox d'intercoder le contentu de ce domaine. Cette methode de mappage de pages peut s'aver pratique lors du chargement et du codage du contentu distant, dans le cadre d'une application composite par exemple. Une autre solution permettant d'intercoder des contenus d'application et autre (et la seule maniere de donner accès à des API AIR à un contenu autre que d'application) consiste à créé un pont de sandbox. Un pont parent-enfant permet au contenu d'une image infant, d'une iframe ou d'une fenêtre d'acceder à des méthodes et propriétés désignées définies dans le sandbox de l'application. A l'inverse, un pont enfant-parent permet au contenu de l'application d'acceder à des méthodes et propriétés désignées définies dans le sandbox de l'enfant. Pour définir un pont de sandbox, vous doivent définir les propriétés parentSandboxBridge et childSandboxBridge de l'objet window. Pour plus d'informations, voir « Sécurité HTML dans Adobe AIR » à la page 1127 et « Éléments image et iframe HTML » à la page 1011.

A propos des modules d'extension et des objets incorpôrs

Adobe AIR 1.0 et les versions ultérieures

AIR prend en charge le module d'extension Adobe Acrobat. Pour afficher le contenu PDF, les utilisateurs doivent disposer d'Acrobat ou d'Adobe Reader 8.1 (ou version ultérieure). L'objet HTMLLoader comprend une propriété permettant de vérifier si le système d'un utilisateur peut afficher ou non des documents PDF. Il est également possible d'afficher le contenu des fischiers SWF au sein de l'environnement HTML. Cette fonction étant intégrée dans AIR, elle ne fait appel à peuymodule d'extension. AIR ne prend en chargeaucun autre module d'extension Webkit.

Voir aussi

« Sécurité HTML dans Adobe AIR » à la page 1127 « Sandbox HTML » à la page 1003 « Éléments image et iframe HTML » à la page 1011 « Obj Window JavaScript » à la page 1009 « Objet XMLHttpRequest » à la page 1005 « Ajout d'un contenu PDF dans AIR » à la page 569

AIR et WebKit

Adobe AIR 1.0 et les versions ultérieures

Adobe AIR a recours au moteur Webkit, disponible en open source et également utilisé dans le navigateur Web Safari. AIR ajoute plusieurs extensions pour acceder aux objets et aux classes d'exécution ainsi que pour des raisons de sécurité. En outre, Webkit lui-même insère des fonctions non inclues dans les normes W3C des langages HTML, CSS et JavaScript. Seuls les ajouts d'AIR et les extensions Webkit les plus significatives sont traités dans cette section. Pour obtenir des informations complémentaires sur les langages HTML, CSS et JavaScript non standard, voir www.webkit.org et developer.apple.com. Pour plus d'informations sur les normes, consulter le site Web W3C. Mozilla propose également une page de referencia très intéressante portant sur les technologies HTML, CSS et DOM (bien évidemment, les moteurs Webkit et Mozilla sont différents l'un de l'autre).

Code JavaScript dans AIR

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures AIR apporte plusieurs modifications au comportement classique des objets JavaScript courants. La plupart de ces modifications sont destinées à simplifier l'écriture d'applications sécurisées dans AIR. Parallèlement à cela, ces différences de comportement impliquent que certains modélles de codage JavaScript courants et les applications Web existantes qui s'en servent risquent de ne pas fonctionner comme prévu dans AIR. Pour plus d'informations sur la correction de ces types de problèmes, voir la section « Contournement des erreurs JavaScript liées à la sécurité » à la page 1021.

Sandbox HTML

Adobe AIR 1.0 et les versions ultérieures

AIR place les différents contenus dans des sandbox distincts en fonction de leur origine. Les règes de sandbox respectent la stratégie de « même origine » implémentée par la plupart des navigateurs Web, de même que les règes applicables aux sandbox mises en œuvre par Adobe Flash Player. AIR propose en outre un nouveau type de sandbox d'application concu pour containir et protéger le contenu de l'application. Pour plus d'informations sur les types de sandbox que vous étés susceptible de rencontres lors du développement d'applications AIR, voir « Sandbox de sécurité » à la page 1087. L'accès à l'environnement d'exécution et aux API AIR est uniquement disponible pour les scripts HTML et JavaScript exécutés dans le sandbox de l'application. Parallelement à cela, toutefois, les opérations d'évaluation et d'exécution dynamiques de code JavaScript, sous leurs diverses formes, sont largement limitées au sein du sandbox de l'application pour des raisons de sécurité. Ces restrictions s'appliquent que votre application charge réellement ou non des informations directement depuis un serveur. (Meme le contenu des fichiers, les chaines collées et les données saisies directement par l'utilisateur peuvent ne pas être fiables.) L'origine du contentu d'une page déterminé le sandbox associé au contentu. Seul le contentu charge à partir du repertoire de l'application (le réseau d'installation auquel le modele d'URL app: fait referrer) est placé dans le sandbox de l'application. Tout contentu charge à partir du système de fichiers est placé dans le sandbox local avec système de fichiers ou le sandbox de sécurité approvéd locally, lequel permet d'acceder au contentu situé sur le système de fichiers local (mais pas au contentu distant) et d'interagir avec lui. Tout contentu charge à partir du réseau est dirigé vers un sandbox distant correspondant à son domaine d'origine. Pour qu'une page d'application puisse interagir librement avec un contenu situé dans un sandbox distant, vous pouvez la mapper au même domaine que le contenu distant. Si, par exemple, vous écrivez une application affichtant des données de mappage provenant d'un service Internet, la page de l'application qui est chargée et qui présente le contenu émanant du service pourrait être mappede au domaine du service. Les attributes de mappage des pages dans un sandbox et un domaine distants sont de nouveaux attributs ajoutés aux éléments image et iframe HTML. Pour permettre a un contenu d'un sandbox autre que d'application d'utiliser les fonctions d'AIR en toute sécurité, vous pouvez configurer un pont de sandbox parent. Pour permettre au contenu de l'application d'appeler des méthodes et des propriétés d'accès de contenu en toute sécurité dans d'autres sandbox, configurez un pont de sandbox infant. La notion de sécurité évoquée ici signifie que le contenu distant ne peut pas obtenir accidentellement de références à des objets, des propriétés ou des méthodes exposés de manière non explicite. Seuls les objets anonymes, fonctions et types de données simples peuvent être transmis via le pont. Vous doivent néanmoins éviter d'exposer explicitement des fonctions potentiellement dangereuses. Si, par exemple, vous aveçu exposé une interface qui autorisait le contenu distant à litre et à écrire des fichiers n'importe où sur le système d'un utilisateur, vous risquez de donner à ce contenu les moyens de nuire considérablement aux utilisateurs.

Fonction eval() JavaScript

Adobe AIR 1.0 et les versions ultérieures L'utilisation de la fonction eval() est limitée au contenu du sandbox de l'application une fois le téléchargement de la page terminé. Dans certains cas, cette fonction peut servir à analyser en toute sécurité des données au format JSON, mais toute évaluation aboutissant à des résultats d'instructions executables se traduit par une erreur. La section « Restrictions relatives au code pour un contenu dans des sandbox différents » à la page 1130 déscrit les utilisations autorisées pour la fonction eval().

Constructeurs de fonctions

Adobe AIR 1.0 et les versions ultérieures Dans le sandbox d'application, il est possible d'utiliser des constructeurs de fonctions avant la fin du chargement d'une page. Dès lors que tous les gestionnaires d'évenement load de page sont terminés, il est impossible de créé de nouvelles fonctions.

Chargement d'un script externe

Adobe AIR 1.0 et les versions ultérieures Les pages HTML du sandbox de l'application ne peuvent pas utiliser la balise script pour charger des fischiers JavaScript situés en dehors du réseau de l'application. Pour qu'une page de votre application puissecharger un script stocké en dehors du réseau de l'application, vous doivent la mapper dans un sandbox autre que celui de d'application.

Objet XMLHttpRequest

Adobe AIR 1.0 et les versions ultérieures

AIR fournit un objet XMLHttpRequest (XHR) dont les applications peuvent se servir pour émettre des requêtes de données. L'exemple suivant illustre une demande de données simple : xmlhttp = new XMLHttpRequest(); xmlhttp.open("GET","http://www.example.com/file.data",true); xmlhttp.onreadystatechange = function() { if (xmlhttp.ready = = 4 ){ //do something with data... } } xmlhttp.send(null); Contrairement à un navigateur, AIR permet au contenu exécuté dans le sandbox de l'application de demander des données provenant de n'importe quel domaine. Le résultat d'une requête XHR contenant une chaine JSON peut aboutir à des objets de données à moins de comprendre également du code exécutable. Si des instructions exécutables figurent dans le résultat de la requête XHR, une erreur est renvoyée et la tentative d'évaluation se solde par un échec. Pour empêcher l'introduction accidentelle de code provenant de sources distances, les requêtes XHR synchrones renvoient un résultat vide lorsqu'elles sont émises avant la fin du chargement de la page. Les requêtes XHR asynchrones sont toujours renvoyées après le chargement d'une page. Par défaut, AIR bloque les requêtes XMLHttpRequest interdomaines dans les sandbox autres que d'application. Une fenêtre parent du sandbox de l'application peut désirer des requêtes interdomaines dans une image infant dont le contenu ne se trouve pas dans un sandbox autre que d'application. Pour ce faire, définissez allowCrossDomainXHR, un attribut ajouté par AIR, sur la valeur true dans l'élément image ou iframe conteneur :
<iframe id="mashup" src="http://www.example.com/map.html" allowCrossDomainXHR="true"></iframe> 
Remarque: si cela s'avere praticque, il est aussi possible de tlécharger les données à l'aide de la classe URLStream AIR. Si vous distribuez une requête XMLHttpRequest vers un serveur distant à partir d'une image ou d'une iframe doté du contenu de l'application mapperé dans un sandbox distant, assurez-vous que l'URL de mappage ne masque pas l'adresse du serveur utilisé dans la requête XHR. Tenez compte, par exemple, de la définition d'iframe suivante, laquelle mapperé le contenu de l'application dans un sandbox distant pour le domaine example.com :
<iframe id="mashup" src="http://www.example.com/map.html" documentRoot="app:/sandbox/" sandboxRoot="http://www.example.com/" allowCrossDomainXHR="true" </iframe> 
Etant donné que l'attribut sandboxRoot remappe l'URL racine de l'adresse www.example.com, toutes les requêtes sont chargées à partir du réseau de l'application et non du serveur distant. Les requêtes sont remappées, qu'elles soient issues de la navigation dans les pages ou d'une requête XMLHttpRequest. Afin d'eviter de bloquer accidentellement des requêtes de données en direction du serveur distant, mappez sandboxRoot à un sous-repertoire de l'URL distante Onlyt qu'a la racine. Le repertoire ne doit pas nécessairement exister. Par exemple, pour permettre le chargement des requêtes en direction de www.example.com à partir du serveur distantOnlyt que du repertoire de l'application, modifiez l'FRAME precedente de la maniere suivante:
<iframe id="mashup" src="http://www.example.com/map.html" documentRoot="app:/sandbox/" sandboxRoot="http://www.example.com/air/" allowCrossDomainXHR="true"></iframe> 
Dans ce cas, seul le contenu du sous-repertoire air est chargé en local. Pour plus d'informations sur le mappage de sandbox, voir « Éléments image et iframe HTML » à la page 1011 et « Sécurité HTML dans Adobe AIR » à la page 1127.

Cookies

Adobe AIR 1.0 et les versions ultérieures

Dans les applications AIR, seul le contenu des sandbox distants (charge à partir de sources http: et https:) peut utiliser des cookies (propriété document cookie). Le sandbox d'application propose d'autres techniques de stockage des données persistantes, telles que les classes EncryptedLocalStore, SharedObject et FileStream.

Objet Clipboard

Adobe AIR 1.0 et les versions ultérieures

L'API Clipboard de WebKit est dotée des événements suivants : copy, cut et paste. L'objet événement transmis dans ces événements permet d'acceder au Presse-papiers via la propriété clipboardData. Faites appel aux méthodes suivantes de l'objet clipboardData pour dire ou écrire des données de Presse-papiers :
MéthodeDescription
clearData(mimeType)Efface les données du Presse-papiers. Définissez le paramètre mimeType sur le type MIME des données à effacer.
getData(mimeType)Permet d'obtenir les données du Presse-papiers. Cette méthode peut uniquement être appelée dans un gestionnaire pour l'événement paste. Définissez le paramètre mimeType sur le type MIME des données à renvoyer.
setData(mimeType, data)Copie les données dans le Presse-papiers. Définissez le paramètre mimeType sur le type MIME des données.
Le code JavaScript situé en dehors du sandbox de l'application peut uniquement acceder au Presse-papiers par le biais de ces événements. Toutefois, le contentu du sandbox de l'application a la possibilité d'acceder directement au Presse-papiers du système à l'aide de la classe Clipboard AIR. Par exemple, l'instruction suivante pourrait servir à obtenir des données au format texte du Presse-papiers :
var clipping = air.Clipboard.generalClipboard.getData("text/plain", air.ClipboardTransferModeORIGINAL_ONLY); 
Les types MIME de données valides sont les suivants :
Type MIMEValeur
Texte"text/plain"
HTML"text/html"
URL"text/uri-list"
Image bitmap"image/x-vnd.adobe.air bitmap"
liste de fischiers"application/x-vnd.adobe.air.file-list"
Important: seul le contenu du sandbox de l'application peut acceder aux données de fichier stockées dans le Presse-papiers. Si du contenu hors application tente d'acceder à un objet fichier du Presse-papiers, une erreur de sécurité est généraee. Pour plus d'informations sur l'utilisation du Presse-papiers, voir « Opération de copier-coller » à la page 616 et Using the Pasteboard from JavaScript (centre des développpeurs Apple).

Opération glisser-deposer

Adobe AIR 1.0 et les versions ultérieures

Les mouvements de glisser déposer vers et depuis un contenu HTML générent les événements DOM suivants : dragstart, drag, dragend, dragenter, dragover, dragleave et drop. L'objet événement transmis dans ces événements permet d'acceder aux données déplacées via la propriété dataTransfer. La propriété dataTransfer fait reférence à un objet offrant les mêmes méthodes que l'objet clipboardData associé à un événement clipboard. Par exemple, la fonction suivante pourrait servir à Obtérer des données au format texte à partir d'un événement drop :
function onDrop(dragsEvent){ return dragEvent.dataTransfer_Data("text/plain", air.ClipboardTransferModeORIGINAL_ONLY); } 
L'objet dataTransfer dispose des membres importantes suivants :
MembreDescription
clearData(mimeType)Efface les données. Définissez le paramètre mimeType sur le type MIME de la représentation de données à effacer.
getData(mimeType)Permet d'obtenir les données que vous avez fait glisser. Cette méthode peut uniquement être appelée dans un gestionnaire pour l'événement drop. Définissez le paramètre mimeType sur le type MIME des données à obtenir.
setData(mimeType, data)Définit les données à faire glisser. Définissez le paramètre mimeType sur le type MIME des données.
typesTableau de chaînes contenant les types MIME de toutes les représentations de données actuellesment disponibles dans l'objet dataTransfer.
effectsAllowedIndique si les données que vous faites glisser peuvent être copiées, déplacées et/ou liées. Définissez la propriété effectsAllowed du gestionnaire pour l'événement dragstart.
dropEffectIndique, parmi les effets de type drop (déposer) autorisés, ceux qui sont pris en charge par une cible de type drag (glisser). Définissez la propriété dropEffect du gestionnaire pour l'événement dragEnter. Au cours du glissement, le curseur change de forme afin d'indiquer l'effet qui se produit si l'utiliseur relachait le bouton de la souris. Si aucun effet dropEffect n'est spécifique, un effet doté de la propriété effectsAllowed est appliqué. L'effect copy (copier) est prioritaire sur l'effet move (déplacer), lequel a priorité sur l'effect link (lier). L'utilisateur peut modifier le niveau de priorité par défaut au moyen du clavier.
Pour plus d'informations sur l'ajout de la prise en charge du glisser-deposer à une application AIR, voir « Opération glisser-deposer dans AIR » à la page 629 et Using the Drag-and-Drop from JavaScript (centre de développementpeurs Apple).

Propriétés innerHTML et outerHTML

Adobe AIR 1.0 et les versions ultérieures

Pour des raisons de sécurité, AIR limite l'utilisation des propriétés innerHTML et outerHTML avec un contenu exécuté dans le sandbox de l'application. Avant l'évenement de chargement de la page, de même que pendant l'exécution de tout gestionnaire d'évenement de chargement, l'utilisation des propriétés innerHTML et outerHTML n'est pas restreinte. Toutefois,ès lors que la page est chargée, vous pouze uniquement vous servir des propriétés innerHTML ou outerHTML afin d'ajouter un contenu statique au document. Toute instruction de la chaine attribuée à innerHTML ou à outerHTML qui aboutit à du code exécutable est ignoreré. Si, par exemple, vous incluez un attribut de rappel d'évenement dans une définition d'élement, l'écouteur d'évenement n'est pas inséré. De la même manière, les balises Ajustez la page dans la reférence src selon les besoin. Important : sauf indication contraire, le code JavaScript presenté dans cette documentation à titre d'exemple suppose que vous avez inclus le fjichier AIRAliases.js dans votre page HTML.

A propos des URL dans AIR

Adobe AIR 1.0 et les versions ultérieures Dans un contenu HTML qui s'exécute sous AIR, vous pouvez utiliser les modèles d'URL suivants lorsque vous définissez les attributs src pour les balises img, frame, iframe et script, dans l'attribut href d'une balise link ou dans tout autre emplacement où vous pouvez fournir une URL.
Modèle d'URLDescriptionExemple
fileUn chemin relatif à la racine du système de fichiersfile:///c:/AIR Test/test.txt
appUn chemin relatif au réseau racine de l'application installée.app:/images
app-storageUn chemin relatif au réseau de stockage de l'application Pour chaque application installée, AIR définit un réseau de stockage de l'application qui est unique. C'est un emplacement pratique pour y enregistrer des données spécifiquees à cette application.app-storage:/settings/preferences.xml
httpUne requête HTTP standardhttp://www.adobe.com
httpsUne requête HTTPS standardhttps://secure.example.com
Pour plus d'informations sur l'utilisation des modèles d'URL d'AIR, voir la section « Modèles d'URI » à la page 845. De nombreuses interfaces de programmation AIR, y compris les classes File, Loader, URLSream et Sound, utilisent un objet URLRequest plutôt qu'une chaine contenant l'URL. L'objet URLRequest lui-même est initialisé avec une chaine qui peut utiliser l'un des mêmes modèles d'URL. Par exemple, l'instruction suivante créé un objet URLRequest qui peut être utilisé pour demander la page d'accueil d'Adobe : varurlReq newair URLsRequest("http://www.adobe.com/"); Pour des informations sur les objets URLRequest, voir la section « Communications HTTP » à la page 843.

Mise des objets ActionScript à disposition de JavaScript

Adobe AIR 1.0 et les versions ultéieures

Le JavaScript dans la page HTML chargee par un objet HTMLLoader peut appeler les classes, les objets et les fonctions définis dans le contexte d'execution d'ActionScript à l'aide des propriétés window:runtime, window.htmlLoader et window nativeWindow de la page HTML. Par la creation de références aux objets et fonctions ActionScript au sein d'un contexte d'exécution de JavaScript, vous pouvez égalementmettre ceux-ci à la disposition du code JavaScript.

Exemple de base pour l'accès à des objets JavaScript à partir d'ActionScript

Adobe AIR 1.0 et les versions ultérieures L'exemple ci-dessous décrit comment ajouter des propriétés qui font référence à des objets dans l'objet window global d'une page HTML. var html:HTMLLoader = new HTMLLoader(); var foo:String = "Hello from container SWF." function helloFromJS(message:String):void { trace("JavaScript says:",message); } var urlReq:URLRequest = new URLRequest("test.html"); html.addEventListener(Event.COMPLETET,loaded); html.load(urlReq); function loaded(e:Event):void{ htmlwindow.foo = foo; htmlwindow.helloFromJS = helloFromJS; Le contenu HTML, qui se trouve dans un fisquier appelé test.html, charge dans un objet HTMLLoader de l'exemple précédent, peut acceder à la propriété foo et à la méthode helloFromJS() définies dans le fisquier SWF parent :
<html>
<script>
function alertFoo() {
alert.foo);
}
</script>
<body>
    <button onClick="alertFoo"/>
    What is foo?
</button>
    <p><button onClick="helloFromJS('Hi.']">
        Call helloFromJS() function.
    </button></p>
</body>
</html> 
Lorsque vous accédez au contexte JavaScript d'un document en cours de chargement, vous pouvez utiliser l'évenement htmlDOMInitialize pour creer des objets suffisamment tôt dans la série de création de la page pour que des scripts définis dans la page puissant y acceder. Si vous attendez l'évenement complete, theirs les scripts de la page qui s'excutent après l'évenement load de la page peuvent acceder aux objets ajoutés.

Mise des définitions de classe à disposition de JavaScript

Adobe AIR 1.0 et les versions ultérieures

Pourmettreles classesActionScriptdevoireapplicationa la dispositiondeJavaScript,voupevezafectorlecontenu HTMLchargeaudomainede l'applicationqui contientlesdefinitionedclasses.Le Domaine d'applicationducontexted'éxcutionde JavaScriptpeutérefini avecla propriétéruntimeApplicationDomaindeI'objetHTMLLoader. Pour définitionir le domaine d'application sur le domaine d'application principal, par exemple, définisse runtimeApplicationDomain sur ApplicationDomain.currentDomain, comme le montre le code ci-dessous : html毕竟是ApplicationDomain = ApplicationDomain.currentDomain; Dès que la propriété这段时间ApplicationDomain est définie, le contexte JavaScript partage les déterminions de classe avec le domaine affecté. Pour creer une occurrencie d'une classe personnalisée dans JavaScript, faites-reference à la définition de classe par la propriété window.runtime et utilisez l'opérateur new. var customClassObject = new window.getRuntime.CustomClass(); Le contenu HTML doit provenir d'un domaine de sécurité compatible. S'il provient d'un domaine de sécurité autre que celui de l'application auquel vous l'affectez, la page utilise plutôt un domaine d'application par défaut. Par exemple, si vous chargez à partir d'Internet une page distante, vous ne pourriez pas affecter ApplicationDomain.currentDomain comme Domaine d'application de la page.

Suppression des écouteurs d'événement

Adobe AIR 1.0 et les versions ultérieures

Lorsque vous ajoutez des écouteurs d'évenement à des objets hors de la page en cours, y compris des objets d'exécution, des objets dans du contenu SWF charge et même des objets JavaScript qui s'excutent dans d'autres pages, vous devriez toujours supprimer les écouteurs d'évenement lorsque la page décharge. Autrement, l'écouteur d'évenement distribue l'évenement à une fonction de gestionnaire qui n'est plus. Si cela se produit, le message d'erreur suivant s'affiche : « The application attempted to reference a JavaScript object in an HTML page that is no longer loaded » (L'application a tenté de référencer un object JavaScript sur une page HTML qui n'est plus chargée). La suppression d'écouteurs d'évenement qui ne sont plus utiles permet aussi à AIR de recupérer la mémoire qui leur est associée. Pour plus d'informations, voir la section « Suppression d'écouteurs d'évenement sur une page HTML de navigation » à la page 1067.

Accès au DOM HTML et aux objets JavaScript à partir d'ActionScript

Adobe AIR 1.0 et les versions ultérieures

Dès que l'objet HTMLLoader distribue l'évenement complete, vous pouvez acceder à tous les objets dans le DOM (ou document object model) HTML pour la page. Les objets accessibles sont les éléments d'affchage, tels que les objets div et p dans la page, ainsi que les variables et fonctions JavaScript. L'évenement complete correspond à l'évenement load de la page JavaScript. Avant que Complete ne soit distribué, les éléments DOM, les variables et les fonctions peuvent ne pas avoir été analysés ou créés. Si possible, attendez l'évenement complete avant d'acceder au DOM HTML. Par exemple, examines la page HTML suivante :
<html>
<script>
foo = 333;
function test() {
return "OK."
}
</script>
<body>
<p id="p1">Hi.</p>
</body>
</html> 
La page HTML simple définit une variable JavaScript appelée foo et une fonction JavaScript appelée test(). Ces deux éléments sont des propriétés de lobjet window global de la page. En outre, l'objet window.document comprend un élément appelé P, pourvu de l'ID p1 ), auquel vous pouvez acceder à l'aide de la méthode getElementById(). Dès que la page est chargée, c'est-à-dire lorsque lobjet HTMLLoader distribue l'évenement complete, vous pouvez acceder à chacun de ces objets à partir d'actionScript, comme le montre le code ActionScript ci-dessous: var html:HTMLLoader = new HTMLLoader(); html.width = 300; html.height = 300; html.addEventListener(Event.COMPLET,completeHandler); var xhtml:XML

Hi.

; html.loadString(xhtml.toString()); function completeHandler(e:Event):void { trace(http://window.foo); // 333 trace(http://window.document.getElementById("p1").innerHTML); // Hi. trace(http://window.test()); // OK. } Pour acceder au contenu d'un élément HTML, utilisez la propriété innerHTML. Par exemple, le code ci-dessus utilise htmlwindow.documentelementByld("p1").innerHTML pour dire le contenu de l'élément HTML appelé p1 Vous pouze également paramétrer les propriétés de la page HTML à partir d'ActionScript. Ainsi, l'exemple ci-dessous définit le contentu de l'élement p1 et la valeur de la variable JavaScript foo sur la page à l'aide d'une référence à l'objet conteneur HTMLLoader :
htmlwindow.document elementalByld("p1").innerHTML = "Goodbye";  
htmlwindow.foo = 66; 

Intégration d'un contenu SWF en HTML

Adobe AIR 1.0 et les versions ultérieures

Vou puez integrer un contenu SWF dans un contenu HTML au sein d'une application AIR comme you le feriez dans un navigateur. Integrez le contenu SWF à l'aide d'une balise object, d'une balise embed ou de toutes les deux. Remarque: une praticte courante de développement sur le Web consiste à utiliser à la fois une balise object et une balise embed pour afficher un contenu SWF dans une page HTML. Vous ne tirez aucun avantage de cette praticque avec AIR. Vous pouvez utiliser la seule balise object, conforme à la norme W3C, dans le contenu pour l'afficher dans AIR. Cependant, vous pouvez continuer à utiliser les balises object et embed ensemble, le cas échéant, pour du contenu HTML qui est également affiqué dans un navigateur. Si vous avez activé la transparence dans l'objet NativeWindow qui affiche le contenu HTML et SWF, AIR n'affiche pas le contenu SWF lorsque le mode Fenetre (wmode) activé pour intégrer le contenu est défini sur la valeur window. Pour afficher le contenu SWF dans une page HTML de fenetre transparente, définissez le parametre wmode sur opaque ou transparent. Etant donné que le paramètre window correspond à la valeur par défaut de wmode, le contenu risque de ne pas été affché si vous ne stipULEZ pas de valeur. L'exemple ci-dessous illustrer l'utilisation de la balise object HTML pour afficher un fjichier SWF au sein d'un contenu HTML. Le paramètre wmode étant défini sur opaque, le contenu est affché même si l'objet NativeWindow sous-jacent est transparent. Le fjichier SWF est chargé à partir du répertoire de l'application, mais vous pouvez utiliser tout modulo d'URL pris en charge par AIR. L'emplacement à partir duquel le fjichier SWF est chargé déterminé le sandbox de sécurité dans lequel AIR place le contenu.
<object type="application/x-shockwave-flash" width="100%" height="100%">
    <param name="movie" value="app:/SWFFile.swf"></param>
    <param name="wmode" value="opaque"></param>
</object> 
Vous pouvez également utiliser un script pour charger un contenu dynamiquement. L'exemple ci-dessous create un nœud object pour afficher le fjichier SWF spécifique dans le paramètre urlString. L'exemple ajoute le nœud en tant qu'enfant de l'objet de page avec l'ID spécifique par le paramètre elementID.
<script> function showSWF(urlString, elementID){ var displayContainer = document.getElementById(urlElementID); var flash = createSWFobject(urlString, 'opaque', 650, 650); displayContainer.appendChild(flash); } function createSWFobject(urlString, wmodeString, width, height){ var SWFobject = document.createElement("object"); SWFobject.setAttribute("type", "application/x-shockwave-flash"); SWFobject.setAttribute("width", "100%"); SWFobject.setAttribute("height", "100%"); var movieParam = document.createElement("param"); movieParam.setAttribute("name", "movie"); movieParam.setAttribute("value", urlString); SWFobject.appendChildmovieParam); var wmodeParam = document.createElement("param"); wmodeParam.setAttribute("name", "wmode"); wmodeParam.setAttribute("value", wmodeString); SWFobject.appendChild(wmodeParam); return SWFobject; } </script> 
Le contenu SWF n'est pas affché si l'objet HTMLLoader est mis à l'échelle ou pivote, ou si la propriété alpha est définie sur une valeur autre que 1.0. Dans les versions d'AIR antérieures à 1.5.2, le contenu SWF ne s'affichait pas dans une fenêtre transparente, qu'elle que soit la valeur définie de wmode. Remarque : lorsqu'un objet SWF incorpore tente de charger un actif externe, notamment un fichier video, il est possible que le contenu SWF ne soit pas rendu correctement si un chemin absolu vers le fichier video n'est pas fourni dans le fichier HTML. Un objet SWF incorpore peut néanmoins charger un fichier image externe à l'aide d'un chemin relatif. L'exemple suivant explique comment charger les actifs externes via un objet SWF incorpore dans un contenu HTML : var imageLoader; function showSWF(urlString, elementID){ var displayContainer = document.getElementByIdelementID); imageLoader = createSWFObject(urlString,650,650); displayContainer.appendChild(imageLoader); } function createSWFObject(urlString, width, height){ var SWFObject = document.createElement("object"); SWFObject.setAttribute(type,"application/x-shockwave-flash"); SWFObject.setAttribute(width,"100%"); SWFObject.setAttribute("height","100%"); var movieParam = document.createElement("param"); movieParam.setAttribute("name","movie"); movieParam.setAttribute("value",urlString); SWFObject.appendChild/movieParam); var flashVars = document.createElement("param"); flashVars.setAttribute("name","FlashVars"); //Load the asset inside the SWF content. flashVars.setAttribute("value","imgPath air.jpg"); SWFObject.appendChild(flashVars); return SWFObject; } function loadImage() { showSWF("ImageLoader.swf", "imageSpot"); Dans l'exemple ActionScript suivant, le chemin d'image transmis par le fisquier HTML est lu et l'image est chargée sur la scene : package { import flash.display.Sprite; import flash.displayLoadingInfo; import flash.display.StageScaleMode; import flash.display.StageAlign; import flash.display.Loader; import flash.net(URLRequest; public class ImageLoader extends Sprite { public function ImageLoader() { var flashvars = LoaderInfo(thisloaderInfo).parameters; if(flashvars.imgPath){ var imageLoader = new Loader(); var image = new URLRequest(flashvars.imgPath); imageLoader.load(image); addChild(imageLoader); imageLoader.x = 0 . imageLoader.y = 0 stage_scaleMode StageScaleMode.NO Scale; stage align StageAlign.TOP_LEFT; } } }

Utilisation des bibliothèques ActionScript au sein d'une page HTML

Adobe AIR 1.0 et les versions ultérièures AIR étend l'objet de script HTML de telle sorte qu'une page peut importer des classes ActionScript dans un fjichier SWF compiling. Par exemple, pour importer une bibliothèque appelée myClasses.swf qui se trouve dans le sous-repertoire lib du dossier racine de l'application, insérez la balise de script suivante au sein d'un fjichier HTML : Important : l'attribut type doit etre type="application/x-shockwave-flash" pour que la bibliothèque soit chargee convenablement. Si le contenu SWF est compilation sous forme de fichier SWF Flash Player 10 ou AIR 1.5, vous devez définir l'espace de noms XML du fichier descriptor d'application sur l'espace de nombres AIR 1.5. Le repertoire lib et le fichier myClasses.swf doivent aussi être inclus lorsque le fichier AIR est mis en package. Accédez aux classes importées par la propriété段时间 de l'objet Window de JavaScript : var libraryObject = new window+rntime.LibraryClass(); Si les classes du fjichier SWF sont organises en packages, vous doivent également inclure le nom du package. Par exemple, si la définition LibraryClass se trouvait dans un package appelé utilities, vous créiez une occurrence de la classe à l'aide de l'instruction suivante: var libraryObject = new window+rntimeutilities.LibraryClass(); Remarque: pour compiler une bibliothèque de SWF dans ActionScript afin qu'elle fasse partie d'une page HTML dans AIR, utilisez le compilateur acompc. L'utilitaire acompc fait partie du SDK de Flex. Il est précrit dans la documentation SDK de Flex.

Accès au DOM HTML et aux objets JavaScript à partir d'un fichier ActionScript importé

Adobe AIR 1.0 et les versions ultérieures

Pour acceder à des objets dans une page HTML à partir d'ActionScript dans un fisier SWF importé dans la page à l'aide de la balise
Sommaire Cliquez un titre pour y accéder
Assistant notice
Powered by Anthropic
En attente de votre message
Informations produit

Marque : ADOBE

Modèle : ACTIONSCRIPT 3.0

Catégorie : Langage de programmation