Bonjoir,
je suis en train de faire un petit diaporama de recettes de cuisine en Flash/AS3, et j'ai 3 2 1 questions pour les spécialistes.
Le programme charge la liste d'images (depuis xml) dans un scrollbar horizontal, et laisse l'utilisateur cliquer sur les images de recettes qui l'intéressent afin de charger la dite recette en HTML au-dessus du diaporama. Chaque nouveau clic entraine la modification de la zone HTML et son remplacement par une nouvelle recette SANS RECHARGEMENT de la page.
Mon fichier xml contient la liste des images, chaune d'entre elles possede 2 propriétés : un chemin (celui du fichier image sur disque) et un ID (celui de la recette HTML que je recupèrerai plus tard)
1. Je cherche à associer chaque image dans AS3 à chaque ID dans xml, de telle sorte qu'au clic je puisse récupérer le fameux ID et chercher après la bonne recette.
Mes images sont des instances de Loader, je parcours mon xml et charge chaque image grâce à son loader dédié :
Code :
- /* Chargement du xml */
- private function loadImagesPath():void
- {
- var urlLoader:URLLoader = new URLLoader(); //conteneur de chargement du fichier XML
- urlLoader.addEventListener(Event.COMPLETE, loadImagesPathCompleted); //abonnement à l'événement Event.COMPLETE
- urlLoader.addEventListener(IOErrorEvent.IO_ERROR, loadImagesPathIoError); //abonnement à l'événement IOErrorEvent.IO_ERROR
- urlLoader.load(new URLRequest("xml/RecipeSlideshow.xml" )); //chargement du fichier XML
- }
- /* Chargement des images */
- private function loadImagesPathCompleted(evt:Event):void
- {
- xml = new XML(evt.target.data); //Récupération du flux XML
- xmlList = xml.elements(); //Récupération de la liste des noeuds image
- for each(var image:XML in xmlList)
- {
- var loader:Loader = new Loader(); //conteneur pour chaque image
- loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadImageCompleted); //abonnement à l'événement Event.COMPLETE
- loader.load(new URLRequest(image.@path)); //chargement de l'image
- }
- }
- /* Chargement de chaque image */
- private function loadImageCompleted(evt:Event):void
- {
- thumbsContainer.addEventListener(Event.ADDED, imageAdded); //abonnement du conteneur des vignettes à l'événement Event.ADDED
- var loader:Loader = evt.target.loader; //conteneur de l'image
- loader.width = 135; //largeur de la vignette
- loader.height = 105; //hauteur de la vignette
- thumbsContainer.addChild(loader); //ajout de la vignette dans le conteneur
- }
- /* Positionnement des images et callback sur clic souris */
- private function imageAdded(evt:Event):void
- {
- var loader:Loader = evt.target as Loader; //la vignette qui est ajoutée
- var conteneur:Sprite = evt.currentTarget as Sprite; //le conteneur des vignettes
- var index:int = conteneur.getChildIndex(loader); //l'index dans la liste d'affichage
- if(index != 0) //si la vignette n'est pas la première
- {
- var previousX:Number = conteneur.getChildAt(index - 1).getBounds(conteneur).right; //coordonnée X du côté droit de la vignette précédemment ajoutée
- loader.x = previousX + SPACE_BETWEEN_THUMBS; //positionnement de la vignette 10 pixels après la vignette précédente
- }
- loader.addEventListener(MouseEvent.CLICK, vignetteClic); //abonnement à l'événement clic
- }
- /* Listener de clic souris */
- private function vignetteClic(evt:MouseEvent):void
- {
- var loader:Loader = evt.target as Loader;
- }
|
Je ne sais pas du tout à quel objet associer mon ID (image.@id). J'ai essayé de rajouter une propriété "id" au Loader pour la récupérer au clic, mais la classe Loader m'en empêche.
2. Le clic sur une image entraine l'affichage de la recette, mais j'ai pour imperatif de ne pas recharger la page (et donc le Flash) à chaque clic. Je suppose qu'il faut passer par une couche JS depuis laquelle je ferais un appel "AJAX" afin de charger le contenu. Est-ce la bonne demarche ? Sachant que je ne sais pas (encore) si Flash est capable de lancer un script JS...
3. Il faudrait que l'url soit dédiée à chaque recette, sans pour autant recharger le contenu à chaque appel. SWFaddress est-il mon ami dans ce cas ?
Posez-moi des questions sur les points pas clairs, j'essaierai (compte-tenu de mon pov' niveau en AS) de vous répondre
Message édité par lkolrn le 15-02-2009 à 23:51:18