Le but de ce tuto est de créer un diaporama Flash en ActionScript 3 (AS3).
Un exemple se trouve à cette adresse : http://www.tannoy.fr/Mediabox/flash/diaporama/exemple/diaporama.html
Nous allons placer le code dans une classe ActionScript, que nous utiliserons en tant que classe du document. Vous trouverez des informations sur la classe du document sur le wiki :
http://wiki.mediabox.fr/tutoriaux/flash/class_document
Caractéristiques du diaporama
- Les chemins des images seront définis dans un fichier XML.
- Les miniatures seront affichées en bas du document.
- Un système de défilement horizontal sera mis en place pour les visualiser.
- L’image sélectionnée sera affichée au dessus des miniatures.
Le fichier XML des images
Afin de pouvoir modifier facilement les images du diaporama, nous allons les chargées dynamiquement depuis un fichier XML.
Le fichier XML va contenir un nœud racine
< ?xml version="1.0" encoding="utf-8"?>
Les étapes du diaporama
- Mise en place de l’interface
- Chargement du fichier XML contenant les chemins des images
- Création des vignettes
- Positionnement des vignettes
- Défilement horizontal des vignettes
- Affichage de l’image en taille normale
Mise en place de l’interface
Notre interface sera composée d’éléments dynamiques et d’éléments présents dans la bibliothèque.
Vous retrouverez toutes les explications pour utiliser ces éléments de la bibliothèque dans cette page du wiki :
http://wiki.mediabox.fr/tutoriaux/flash/bibliotheque_flash_9
Notre interface va contenir les éléments suivants :
- Un bouton suivant (Classe NextButton auto-générée)
- Un bouton précédent (Classe PreviousButton auto-générée)
- Un conteneur pour les vignettes
- Un masque pour le conteneur des vignettes afin de ne visualiser que les vignettes qui seront entre les boutons.
- Un conteneur pour les images en taille normale
- 2 traits reliant les hauts et les bas des boutons
Nous allons donc définir ces différents éléments en tant qu’attributs privés de notre classe Diaporama.
-
package {<br />
-
import NextButton;<br />
-
import PreviousButton;</p>
-
<p>import flash.display.Shape;<br />
-
import flash.display.Sprite;</p>
-
<p>public class Diaporama extends Sprite<br />
-
{<br />
-
//Attributs<br />
-
private var nextButton:NextButton;<br />
-
private var previousButton:PreviousButton;<br />
-
private var conteneurVignettes:Sprite;<br />
-
private var masqueVignettes:Sprite;<br />
-
private var conteneurImages:Sprite;<br />
-
private var traitHaut:Shape;<br />
-
private var traitBas:Shape;</p>
-
<p>public function Diaporama()<br />
-
{</p>
-
<p>}<br />
-
}<br />
-
}
Nous allons créer une méthode privée que nous appellerons addUI dans laquelle nous allons instancier les différents attributs.
Pour une utilisation future, nous affecterons un nom à nos boutons de défilement.
-
private function addUI():void<br />
-
{<br />
-
//Instances<br />
-
nextButton = new NextButton();<br />
-
previousButton = new PreviousButton();<br />
-
conteneurVignettes = new Sprite();<br />
-
masqueVignettes = new Sprite();<br />
-
conteneurImages = new Sprite();<br />
-
traitHaut = new Shape();<br />
-
traitBas = new Shape();<br />
-
//Nom des boutons<br />
-
nextButton.name = "nextButton";<br />
-
previousButton.name = "previousButton";<br />
-
}
- Cette méthode va positionner les différents éléments de l’interface de cette façon :
- Le bouton précédent sera à 5 pixels à gauche et en bas de la scène
- Le bouton suivant sera à 5 pixels à droite et en bas de la scène
- Les traits relieront les hauts et les bas des boutons
- Le conteneur des vignettes et le masque des vignettes seront positionnés entre les boutons
- Le conteneur des images sera centré horizontalement et à 10 pixels du haut de la scène
Pour tracer les traits, nous utiliserons la méthode statique distance de la classe Point qui nous permet de récupérer la distance entre 2 points.
-
private function addUI():void<br />
-
{<br />
-
//Instances<br />
-
nextButton = new NextButton();<br />
-
previousButton = new PreviousButton();<br />
-
conteneurVignettes = new Sprite();<br />
-
masqueVignettes = new Sprite();<br />
-
conteneurImages = new Sprite();<br />
-
traitHaut = new Shape();<br />
-
traitBas = new Shape();</p>
-
<p>//Positionnement et dessin<br />
-
nextButton.x = stage.stageWidth - (nextButton.width + 5);<br />
-
previousButton.x = 5;<br />
-
nextButton.y = previousButton.y = stage.stageHeight - (nextButton.height + 5);</p>
-
<p>//variable locales<br />
-
var distanceEntreBoutons:Number = Point.distance(new Point(previousButton.getBounds(this).right, previousButton.y), new Point(nextButton.x, previousButton.y));</p>
-
<p>traitHaut.graphics.lineStyle(1, 0x333333);//epaisseur et couleur du trait<br />
-
traitHaut.graphics.moveTo(0, 0);//coordonnées de départ du trait<br />
-
traitHaut.graphics.lineTo(distanceEntreBoutons, 0);//coordonnées de fin du trait<br />
-
traitHaut.x = previousButton.getBounds(this).right;<br />
-
traitHaut.y = previousButton.y;<br />
-
traitBas.graphics.lineStyle(1, 0x333333);//epaisseur et couleur du trait<br />
-
traitBas.graphics.moveTo(0, 0);//coordonnées de départ du trait<br />
-
traitBas.graphics.lineTo(distanceEntreBoutons, 0);//coordonnées de fin du trait<br />
-
traitBas.x = traitHaut.x;<br />
-
traitBas.y = previousButton.getBounds(this).bottom - 1;<br />
-
masqueVignettes.graphics.beginFill(0xFFFFFF);//couleur du masque (elle n'a aucune importance puique l'objet va servir de masque)<br />
-
masqueVignettes.graphics.drawRect(0, 0, distanceEntreBoutons, previousButton.height);//dessin du rectangle<br />
-
conteneurVignettes.x = masqueVignettes.x = traitHaut.x;//Positionnement en x du conteneur et du masque<br />
-
conteneurVignettes.y = masqueVignettes.y = traitHaut.y;//Positionnement en y du conteneur et du masque<br />
-
conteneurImages.x = (stage.stageWidth - conteneurImages.width) / 2;<br />
-
conteneurImages.y = 10;</p>
-
<p>}
La propriété mask du conteneur des vignettes va être valorisé et prendra comme valeur l’objet de type Sprite masqueVignettes.
Nous allons ensuite afficher les objets d’interface dans notre scène avec la méthode addChild.
-
private function addUI():void<br />
-
{<br />
-
//Instances<br />
-
nextButton = new NextButton();<br />
-
previousButton = new PreviousButton();<br />
-
conteneurVignettes = new Sprite();<br />
-
masqueVignettes = new Sprite();<br />
-
conteneurImages = new Sprite();<br />
-
traitHaut = new Shape();<br />
-
traitBas = new Shape();</p>
-
<p>//Positionnement et dessin<br />
-
nextButton.x = stage.stageWidth - (nextButton.width + 5);<br />
-
previousButton.x = 5;<br />
-
nextButton.y = previousButton.y = stage.stageHeight - (nextButton.height + 5);</p>
-
<p>//variable locales<br />
-
var distanceEntreBoutons:Number = Point.distance(new Point(previousButton.getBounds(this).right, previousButton.y), new Point(nextButton.x, previousButton.y));</p>
-
<p>traitHaut.graphics.lineStyle(1, 0x333333);//epaisseur et couleur du trait<br />
-
traitHaut.graphics.moveTo(0, 0);//coordonnées de départ du trait<br />
-
traitHaut.graphics.lineTo(distanceEntreBoutons, 0);//coordonnées de fin du trait<br />
-
traitHaut.x = previousButton.getBounds(this).right;<br />
-
traitHaut.y = previousButton.y;<br />
-
traitBas.graphics.lineStyle(1, 0x333333);//epaisseur et couleur du trait<br />
-
traitBas.graphics.moveTo(0, 0);//coordonnées de départ du trait<br />
-
traitBas.graphics.lineTo(distanceEntreBoutons, 0);//coordonnées de fin du trait<br />
-
traitBas.x = traitHaut.x;<br />
-
traitBas.y = previousButton.getBounds(this).bottom - 1;<br />
-
masqueVignettes.graphics.beginFill(0xFFFFFF);//couleur du masque (elle n'a aucune importance puique l'objet va servir de masque)<br />
-
masqueVignettes.graphics.drawRect(0, 0, distanceEntreBoutons, previousButton.height);//dessin du rectangle<br />
-
conteneurVignettes.x = masqueVignettes.x = traitHaut.x;//Positionnement en x du conteneur et du masque<br />
-
conteneurVignettes.y = masqueVignettes.y = traitHaut.y;//Positionnement en y du conteneur et du masque<br />
-
conteneurImages.x = (stage.stageWidth - conteneurImages.width) / 2;<br />
-
conteneurImages.y = 10;</p>
-
<p>//masque du conteneur des vignettes<br />
-
conteneurVignettes.mask = masqueVignettes;</p>
-
<p>//affichage de l'interface<br />
-
addChild(nextButton);<br />
-
addChild(previousButton);<br />
-
addChild(conteneurVignettes);<br />
-
addChild(conteneurImages);<br />
-
addChild(traitHaut);<br />
-
addChild(traitBas);<br />
-
}
La méthode addUI sera appelée par le constructeur de la classe. L’interface sera donc mise en place au démarrage du diaporama.
-
public function Diaporama()<br />
-
{<br />
-
addUI();<br />
-
}
Chargement du fichier XML contenant le chemin des images
Le chargement d’un fichier XML va se faire grâce à la classe URLLoader.
Je vous invite à relire cet article http://wiki.mediabox.fr/tutoriaux/flash/xml_loader_as3 pour bien comprendre le principe de chargement.
Nous allons ajouter une méthode privée nommé loadImagesPath qui va se charger de lancer le chargement du fichier XML , de définir le gestionnaire d’événements qui va traiter la fin du chargement et de définir le gestionnaire d’événements qui va traiter les erreurs.
-
private function loadImagesPath():void<br />
-
{<br />
-
var urlLoader:URLLoader = new URLLoader(); //conteneur de chargement du fichier XML<br />
-
urlLoader.addEventListener(Event.COMPLETE, loadImagesPathCompleted); //abonnement à l'événement Event.COMPLETE<br />
-
urlLoader.addEventListener(IOErrorEvent.IO_ERROR, loadImagesPathIoError); //abonnement à l'événement IOErrorEvent.IO_ERROR<br />
-
urlLoader.load(new URLRequest("xml/diaporama.xml")); //chargement du fichier XML<br />
-
}
La méthode loadImagesPath sera appelée dans le constructeur, juste après la méthode qui crée l’interface.
-
public function Diaporama()<br />
-
{<br />
-
addUI();//ajout de l'interface<br />
-
loadImagesPath();//chargement des chemins des images<br />
-
}
Le gestionnaire d’événements loadImagesPathIoError sera évoqué lorsqu’une erreur de chargement aura lieu. Un rectangle occupant la taille de la scène sera créé et un message d’erreur sera affiché.
-
private function loadImagesPathIoError(evt:IOErrorEvent):void<br />
-
{<br />
-
//Rectangle de couleur noir couvrant la totalité de la scène<br />
-
var cache:Shape = new Shape();<br />
-
cache.graphics.beginFill(0x000000);<br />
-
cache.graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight);<br />
-
addChild(cache);<br />
-
//Message d'erreur<br />
-
var message:TextField = new TextField();<br />
-
message.autoSize = TextFieldAutoSize.LEFT;<br />
-
message.defaultTextFormat = new TextFormat("Verdana", 28);<br />
-
message.text = "Une erreur de chargement a eu lieu !";<br />
-
message.textColor = 0xFFFFFF;<br />
-
message.x = (stage.stageWidth - message.textWidth) / 2;<br />
-
message.y = (stage.stageHeight - message.textHeight) / 2;<br />
-
addChild(message);<br />
-
}
Création des vignettes
Le gestionnaire d’événements loadImagesPathCompleted sera évoqué à la fin du chargement du fichier XML.
Un message indiquant le chargement en cours des images sera affiché dans le conteneur des vignettes. Cet objet de type TextField sera un attribut privé de notre classe.
Nous allons donc récupérer notre structure XML et la parcourir dans sa globalité avec une boucle for each.
A chaque passage de la boucle, nous allons créer un objet de type Loader, qui nous permettra de charger les images.
Je vous invite à relire si vous le souhaitez l’article sur le chargement des images :
http://wiki.mediabox.fr/tutoriaux/flash/charger_images_swf
L’objet Loader via sa propriété contentLoaderInfo s’abonnera à l’événement Event.COMPLETE afin d’afficher les images, une fois chargées, dans le conteneur des vignettes.
-
private function loadImagesPathCompleted(evt:Event):void<br />
-
{<br />
-
//Message de chargement<br />
-
messageChargement = new TextField();<br />
-
messageChargement.autoSize = TextFieldAutoSize.LEFT; //redimensionnement automatique à partir de la gauche<br />
-
messageChargement.selectable = false; //Le texte n'est pas sélectionnable<br />
-
messageChargement.text = "Chargement en cours..."; //Message indiquant un chargement en cours<br />
-
messageChargement.x = (traitHaut.width - message.textWidth) / 2; // position x du message dans le conteneur<br />
-
messageChargement.y = (nextButton.height - message.textHeight) / 2; // position y du message dans le conteneur<br />
-
conteneurVignettes.addChild(messageChargement); // le message est ajouté dans le conteneur des vignettes</p>
-
<p>// Flux XML<br />
-
var xml:XML = new XML(evt.target.data); //Récupération du flux XML<br />
-
var xmlList:XMLList = xml.elements(); //Récupération de la liste des noeuds image<br />
-
for each(var image:XML in xmlList)<br />
-
{<br />
-
var loader:Loader = new Loader(); //conteneur pour chaque image<br />
-
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadImageCompleted); //abonnement à l'événement Event.COMPLETE<br />
-
loader.load(new URLRequest(image.@chemin)); //chargement de l'image<br />
-
}<br />
-
}
Le gestionnaire d’événements loadImageCompleted sera évoqué à la fin du chargement d’une image.
Le message de chargement sera supprimé de l’interface s’il est présent dans le conteneurVignettes. On utilisera pour cela la méthode contains de la classe DisplayObjectContainer.
Afin de gérer le positionnement des vignettes (que l’on évoquera par la suite), nous allons abonner le conteneur des vignettes à l’événement Event.added. Cet événement est évoqué lorsqu’un objet d’affichage est ajouté à une liste d’affichage.
L’image sera redimensionnée proportionnellement en fonction de la hauteur du conteneurVignettes puis elle sera ajoutée à ce conteneur.
-
private function loadImageCompleted(evt:Event):void<br />
-
{<br />
-
if (conteneurVignettes.contains(messageChargement)) //si le conteneur de vignettes contient le message de chargement<br />
-
{<br />
-
conteneurVignettes.removeChild(messageChargement); //alors il est supprimé de l'interface<br />
-
}</p>
-
<p>conteneurVignettes.addEventListener(Event.ADDED, imageAdded); //abonnement du conteneur des vignettes à l'événement Event.ADDED</p>
-
<p>var loader:Loader = evt.target.loader; //conteneur de l'image<br />
-
var ratio:Number = loader.height / nextButton.height; //ratio pour le redimensionnement des images<br />
-
loader.width /= ratio; //largeur de la vignette<br />
-
loader.height /= ratio; //hauteur de la vignette<br />
-
conteneurVignettes.addChild(loader); //ajout de la vignette dans le conteneur<br />
-
}
Positionnement des vignettes
Afin de gérer facilement le positionnement des vignettes, nous allons utiliser l’événement Event.ADDED. Cet événement sera évoqué lorsqu’une vignette sera ajoutée dans le conteneur.
Lors de l’ajout d’une vignette, nous récupèrerons la coordonnée x de la vignette précédemment ajoutée et nous repositionnerons notre vignette en fonction de cette coordonnée et d’une constante définissant l’écart entre les vignettes.
Nous utiliserons pour cela les méthodes de gestion d’une liste d’affichage. Je vous invite pour cela à lire l’article du wiki à ce sujet :
http://wiki.mediabox.fr/tutoriaux/flash/architecture_as
Les vignettes seront ensuite abonnées à l’événement MouseEvent .CLICK afin d’afficher l’image à sa taille réelle.
-
private function imageAdded(evt:Event):void<br />
-
{<br />
-
var loader:Loader = evt.target as Loader; //la vignette qui est ajoutée<br />
-
var conteneur:Sprite = evt.currentTarget as Sprite; //le conteneur des vignettes<br />
-
var index:int = conteneur.getChildIndex(loader); //l'index dans la liste d'affichage<br />
-
if(index != 0) //si la vignette n'est pas la première<br />
-
{<br />
-
var previousX:Number = conteneur.getChildAt(index - 1).getBounds(conteneur).right; //coordonnée X du côtét droit de la vignette précédemment ajoutée<br />
-
loader.x = previousX + ECART_VIGNETTES; //positionnement de la vignette 10 pixels après la vignette précédente<br />
-
}<br />
-
loader.addEventListener(MouseEvent.CLICK, vignetteClic); //abonnement à l'événement clic<br />
-
}
A ce stade, nous remarquons qu’il nous est impossible de visualiser toutes les vignettes. Nous allons donc mettre en place un système de défilement horizontal.
Défilement horizontal des vignettes
Le défilement des vignettes va se faire lors du survol des boutons nextButton et previousButton. Le bouton next diminuera la position x du conteneur des vignettes et le bouton previous augmentera cette position x.
Nous allons donc abonner nos boutons aux événements MouseEvent.MOUSE_OVER et MouseEvent.MOUSE_OUT.
Ces abonnements se feront dans le gestionnaire d’événements imageAdded juste après le positionnement des vignettes.
-
private function imageAdded(evt:Event):void<br />
-
{<br />
-
var loader:Loader = evt.target as Loader; //la vignette qui est ajoutée<br />
-
var conteneur:Sprite = evt.currentTarget as Sprite; //le conteneur des vignettes<br />
-
var index:int = conteneur.getChildIndex(loader); //l'index dans la liste d'affichage</p>
-
<p>if(index != 0) //si la vignette n'est pas la première<br />
-
{<br />
-
var previousX:Number = conteneur.getChildAt(index - 1).getBounds(conteneur).right; //coordonnée X du côtét droit de la vignette précédemment ajoutée<br />
-
loader.x = previousX + ECART_VIGNETTES; //positionnement de la vignette 10 pixels après la vignette précédente<br />
-
}<br />
-
loader.addEventListener(MouseEvent.CLICK, vignetteClic); //abonnement à l'événement clic</p>
-
<p>nextButton.addEventListener(MouseEvent.MOUSE_OVER, scrollNextButtonOver); //abonnement à l'événement MouseEvent.MOUSE_OVER<br />
-
nextButton.addEventListener(MouseEvent.MOUSE_OUT, scrollNextButtonOut); //abonnement à l'événement MouseEvent.MOUSE_OUT<br />
-
previousButton.addEventListener(MouseEvent.MOUSE_OVER, scrollPreviousButtonOver); //abonnement à l'événement MouseEvent.MOUSE_OVER<br />
-
previousButton.addEventListener(MouseEvent.MOUSE_OUT, scrollPreviousButtonOut); //abonnement à l'événement MouseEvent.MOUSE_OUT<br />
-
}
Pour gérer le défilement, nous allons utiliser un objet de type Timer. Cet objet permet d’exécuter des actions à intervalle régulier. Dans notre cas, il fera défiler à intervalle régulier le conteneur des vignettes.
Cet objet Timer sera définir en tant qu’attribut et sera instancié dans la méthode addUI.
-
//Attributs<br />
-
private var nextButton:NextButton;<br />
-
private var previousButton:PreviousButton;<br />
-
private var conteneurVignettes:Sprite;<br />
-
private var masqueVignettes:Sprite;<br />
-
private var conteneurImages:Sprite;<br />
-
private var traitHaut:Shape;<br />
-
private var traitBas:Shape;<br />
-
private var messageChargement:TextField<br />
-
private const ECART_VIGNETTES:int = 10;<br />
-
private var timer:Timer;
Le constructeur de la classe Timer prend en paramètre le délai d’exécution entre chaque appel. Ce délai est exprimé en millisecondes.
-
private function addUI():void<br />
-
{<br />
-
//Instances<br />
-
nextButton = new NextButton();<br />
-
previousButton = new PreviousButton();<br />
-
conteneurVignettes = new Sprite();<br />
-
masqueVignettes = new Sprite();<br />
-
conteneurImages = new Sprite();<br />
-
traitHaut = new Shape();<br />
-
traitBas = new Shape();<br />
-
timer = new Timer(50);</p>
-
<p>//Nom des boutons<br />
-
nextButton.name = "nextButton";<br />
-
previousButton.name = "previousButton";</p>
-
<p>//Positionnement et dessin<br />
-
nextButton.x = stage.stageWidth - (nextButton.width + 5);<br />
-
previousButton.x = 5;<br />
-
nextButton.y = previousButton.y = stage.stageHeight - (nextButton.height + 5);</p>
-
<p>//variable locales<br />
-
var distanceEntreBoutons:Number = Point.distance(new Point(previousButton.getBounds(this).right, previousButton.y), new Point(nextButton.x, previousButton.y));</p>
-
<p>traitHaut.graphics.lineStyle(1, 0x333333);//epaisseur et couleur du trait<br />
-
traitHaut.graphics.moveTo(0, 0);//coordonnées de départ du trait<br />
-
traitHaut.graphics.lineTo(distanceEntreBoutons, 0);//coordonnées de fin du trait<br />
-
traitHaut.x = previousButton.getBounds(this).right;<br />
-
traitHaut.y = previousButton.y;<br />
-
traitBas.graphics.lineStyle(1, 0x333333);//epaisseur et couleur du trait<br />
-
traitBas.graphics.moveTo(0, 0);//coordonnées de départ du trait<br />
-
traitBas.graphics.lineTo(distanceEntreBoutons, 0);//coordonnées de fin du trait<br />
-
traitBas.x = traitHaut.x;<br />
-
traitBas.y = previousButton.getBounds(this).bottom - 1;<br />
-
masqueVignettes.graphics.beginFill(0xFFFFFF);//couleur du masque (elle n'a aucune importance puique l'objet va servir de masque)<br />
-
masqueVignettes.graphics.drawRect(0, 0, distanceEntreBoutons, previousButton.height);//dessin du rectangle<br />
-
conteneurVignettes.x = masqueVignettes.x = traitHaut.x;//Positionnement en x du conteneur et du masque<br />
-
conteneurVignettes.y = masqueVignettes.y = traitHaut.y;//Positionnement en y du conteneur et du masque<br />
-
conteneurImages.x = (stage.stageWidth - conteneurImages.width) / 2;<br />
-
conteneurImages.y = 10;</p>
-
<p>//masque du conteneur des vignettes<br />
-
conteneurVignettes.mask = masqueVignettes;</p>
-
<p>//affichage de l'interface<br />
-
addChild(nextButton);<br />
-
addChild(previousButton);<br />
-
addChild(conteneurVignettes);<br />
-
addChild(conteneurImages);<br />
-
addChild(traitHaut);<br />
-
addChild(traitBas);<br />
-
}
Les gestionnaires d’événements scrollNextButtonOver et scrollPreviousButtonOver seront évoqués lorsque l’utilisateur survolera le bouton nextButton et le bouton previousButton.
Ils abonneront un objet Timer, un objet de gestion du temps, à l’événement TimerEvent.TIMER. Cet événement sera évoqué à intervalle régulier, défini dans le constructeur de l’objet timer.
Le timer sera lancé avec la méthode start().
-
private function scrollNextButtonOver(evt:MouseEvent):void<br />
-
{<br />
-
timer.addEventListener(TimerEvent.TIMER, scrollNextTimer); //abonnement à l'événement TimerEvent.TIMER<br />
-
timer.start(); //démarrage du timer<br />
-
}</p>
-
<p>private function scrollPreviousButtonOver(evt:MouseEvent):void<br />
-
{<br />
-
timer.addEventListener(TimerEvent.TIMER, scrollPreviousTimer); //abonnement à l'événement TimerEvent.TIMER<br />
-
timer.start(); //démarrage du timer<br />
-
}
Les gestionnaires d’événements scrollNextButtonOut et scrollPreviousButtonOut seront évoqués lorsque l’utilisateur sortira du survol du bouton nextButton et du bouton previousButton.
Ils annuleront l’abonnement à l’événement TimerEvent.TIMER.
-
private function scrollNextButtonOut(evt:MouseEvent):void<br />
-
{<br />
-
timer.removeEventListener(TimerEvent.TIMER, scrollNextTimer); //annulation de l'abonnement à l'événement TimerEvent.TIMER<br />
-
}</p>
-
<p>private function scrollPreviousButtonOut(evt:MouseEvent):void<br />
-
{<br />
-
timer.removeEventListener(TimerEvent.TIMER, scrollPreviousTimer); //annulation de l'abonnement à l'événement TimerEvent.TIMER<br />
-
}
Le gestionnaire d’événements scrollNextTimer est évoqué lorsque l’utilisateur survole le bouton nextButton. Ce gestionnaire est appelé à intervalles réguliers.
Il a pour but de déplacer le conteneur de vignettes afin de visualiser les vignettes masquées. Le déplacement se fera vers la gauche, il nous faudra donc diminuer la coordonnée x du conteneur.
Cette diminution se fera en fonction d’une constante nommé PAS_DEPLACEMENT et défini en tant qu’attribut de la classe.
-
//Attributs<br />
-
private var nextButton:NextButton;<br />
-
private var previousButton:PreviousButton;<br />
-
private var conteneurVignettes:Sprite;<br />
-
private var masqueVignettes:Sprite;<br />
-
private var conteneurImages:Sprite;<br />
-
private var traitHaut:Shape;<br />
-
private var traitBas:Shape;<br />
-
private var messageChargement:TextField<br />
-
private const ECART_VIGNETTES:int = 10;<br />
-
private var timer:Timer;<br />
-
private const PAS_DEPLACEMENT:int = 10;
A chaque appel du gestionnaire d’événements, le conteneur des vignettes sera déplacé de la valeur de la constante PAS_DEPLACEMENT vers la gauche.
Un test sera effectué afin de ne pas déplacer le bord droit du conteneur au delà du bord droit du masque.
-
private function scrollNextTimer(evt:TimerEvent):void<br />
-
{<br />
-
if (conteneurVignettes.getBounds(this).right>= (masqueVignettes.getBounds(this).right + PAS_DEPLACEMENT))//si le bord droit du conteneur est positionné après le bord droit du masque<br />
-
{<br />
-
conteneurVignettes.x -= PAS_DEPLACEMENT; // le conteneur est déplacé vers la gauche<br />
-
}<br />
-
else<br />
-
{<br />
-
timer.removeEventListener(TimerEvent.TIMER, scrollNextTimer); //annulation de l'abonnement à l'événement TimerEvent.TIMER<br />
-
}<br />
-
}
Le gestionnaire d’événements scrollPreviousTimer est évoqué lorsque l’utilisateur survole le bouton previousButton. Ce gestionnaire est appelé à intervalles réguliers.
Il a pour but de déplacer le conteneur de vignettes afin de visualiser les vignettes masquées. Le déplacement se fera vers la droite, il nous faudra donc augmenter la coordonnée x du conteneur.
Cette diminution se fera en fonction d’une constante nommé PAS_DEPLACEMENT et défini en tant qu’attribut de la classe.
A chaque appel du gestionnaire d’événements, le conteneur des vignettes sera déplacé de la valeur de la constante PAS_DEPLACEMENT vers la gauche.
Un test sera effectué afin de ne pas déplacer le bord gauche du conteneur au delà du bord gauche du masque.
-
private function scrollPreviousTimer(evt:TimerEvent):void<br />
-
{<br />
-
if (conteneurVignettes.x <= (masqueVignettes.x - PAS_DEPLACEMENT))//si le bord gauche du conteneur est positionné avant le bord gauche du masque<br />
-
{<br />
-
conteneurVignettes.x += PAS_DEPLACEMENT; // le conteneur est déplacé vers la droite<br />
-
}<br />
-
else<br />
-
{<br />
-
timer.removeEventListener(TimerEvent.TIMER, scrollPreviousTimer); //annulation de l'abonnement à l'événement TimerEvent.TIMER<br />
-
}<br />
-
}
Affichage de l’image en taille normale
L’image étant déjà chargée dans notre diaporama, nous n’allons pas la recharger une seconde fois dans sa taille initiale. Nous allons utilliser les classes du framework ActionScript 3 qui permettent de manipuler les images. Ces classes sont les classes Bitmap et BitmapData.
Dans le gestionnaire d’événements vignetteClic, qui est évoqué lors du clic sur une vignette, nous allons récupérer l’image grâce à la propriété contentLoaderInfo de l’objet Loader.
En effet, l’objet LoaderInfo est un objet qui est partagé entre le conteneur et l’image chargée. Cet objet contient une propriété content qui nous permet de récupérer l’image.
-
private function vignetteClic(evt:MouseEvent):void<br />
-
{<br />
-
var image:Bitmap = (evt.currentTarget as Loader).contentLoaderInfo.content as Bitmap;<br />
-
}
Nous allons récupérer ensuite les pixels de l’image grâce à la propriété bitmapData de la classe Bitmap.
-
private function vignetteClic(evt:MouseEvent):void<br />
-
{<br />
-
var image:Bitmap = (evt.currentTarget as Loader).contentLoaderInfo.content as Bitmap; //image correspondant à la vignette cliquée<br />
-
var pixels:BitmapData = image.bitmapData; // pixels de l'image<br />
-
}
Ces pixels vont ensuite être copiés dans un autre objet BitmapData grâce à la méthode copyPixels() . Le constructeur de la classe BitmapData attend en paramètres la largeur et la hauteur de la zone de pixels.
-
private function vignetteClic(evt:MouseEvent):void<br />
-
{<br />
-
var image:Bitmap = (evt.currentTarget as Loader).contentLoaderInfo.content as Bitmap; //image correspondant à la vignette cliquée<br />
-
var pixels:BitmapData = image.bitmapData; // pixels de l'image<br />
-
var newPixels:BitmapData = new BitmapData(pixels.width, pixels.height); //conteneur de la copie des pixels<br />
-
newPixels.copyPixels(pixels); //copie des pixels<br />
-
}
Un objet BitmapData n’étant pas un objet d’affichage, nous allons instancier un objet Bitmap en lui passant en paramètres les pixels copiés. L’objet Bitmap sera ensuite ajouté aux conteneurs des images. L’image déjà présente sera quand a elle supprimée de la liste d’affichage.
-
private function vignetteClic(evt:MouseEvent):void<br />
-
{<br />
-
var image:Bitmap = (evt.currentTarget as Loader).contentLoaderInfo.content as Bitmap; //image correspondant à la vignette cliquée<br />
-
var pixels:BitmapData = image.bitmapData; // pixels de l'image<br />
-
var newPixels:BitmapData = new BitmapData(pixels.width, pixels.height); //conteneur de la copie des pixels<br />
-
newPixels.copyPixels(pixels, new Rectangle(0, 0, pixels.width, pixels.height), new Point(0,0)); //copie des pixels<br />
-
var newImage:Bitmap = new Bitmap(newPixels); //Image en taille réelle<br />
-
if (conteneurImages.numChildren != 0) //si le conteneur contient déjà une image<br />
-
{<br />
-
conteneurImages.removeChildAt(0);// l'image est supprimée de la liste d'affichage<br />
-
}<br />
-
conteneurImages.addChild(newImage); //la nouvelle image est ajoutée à la liste d'affichage du conteneur<br />
-
conteneurImages.x = (stage.stageWidth - conteneurImages.width) / 2; //positionnement du conteneur<br />
-
conteneurImages.y = 10;<br />
-
}
Nous venons donc de créer un diaporama dynamique. Il ne vous reste plus qu’à apporter vos améliorations afin de le faire correspondre au maximum à vos besoins.
Je suis Antony Chauviré, développeur sur la Flash Platform.