[Résolu] Manipuler un swf depuis Flex builder 2
Bonjour,
Je suis très content de découvrir ce forum en tant que grand débutant sur Flex et inévitablement je me heurte à un grand nombre d'interrogations.
En fait, je souhaite manipuler un swf (flash9 et sans actionscript, la timeline ne comportant qu'une seule image) depuis Flex Builder 2.0.1.
Ce SWF est une carte de France où chaque département est un symbole clip avec un nom d'occurrence.
J'importe le swf sans souci à l'aide de SWFLoader mais je souhaiterai pouvoir travailler sur les propriétés de chaque clip département (ex: je clique sur un bouton et je modifie la propriété alpha du département 75).
Quel code AS3 est nécessaire ?
Désolé pour la trivialité de ma question mais il faut bien commencer un jour...
Merci et bonne journée
Contrôler un SWF dans FLEX, c'est possible
Si, en fait c’est tout à fait possible (ç'aurait été surprenant !...). Il faut que tu connaisses le chemin de tes clips à partir du Stage (une propriété qui existe pour tous les objets posés sur la scène, regarde la doc).
Un des moyens, consiste à créer une petite méthode récursive qui parse le Stage et ses enfants, ce qui te permet de connaître le chemin de chaque clip, et de comprendre ce qui se passe. Je fais toujours ça quand j’ai perdu un clip.;)
La subtilité vient du fait que ton script est contenu dans un clip qui est au même niveau que ce que tu as posé avec l’outils de design, ce qui signifie qu’il faut redescendre d’un cran dans la hiérarchie graphique, c'est-à-dire utiliser this.parent.
Je t’ai fait un script vite fait, essaye de le comprendre. Il y a deux méthodes qui sont employées. L’une, pose un SWF sur la scène via l’outil design de Flex (object SWFsurScene), l’autre charge dynamiquement un SWF depuis un fichier.
Dans la console, tu verras tous les contenus de tes clips, tracés par la méthode de parsing recursChildren (chaque enfant est précédé d’un +) . Note que quand aucun nom n’a été spécifié, Flex attribue un nom du type "instance ??".
Ensuite, deux méthodes te proposent de référencer la racine de ton SWF. L’une pour le clip chargé, l’autre pour le clip posé.
Pour l’exemple, j’ai juste fait un FLA avec trois symboles (MovieClip) posés sur la scène, avec comme noms d’occurrences, clipA, clipB, clipC. Puis j’ai compilé le SWF.
Tu noteras que j’ai profité de la méthode de parsing pour intercepter les clips dont j’avais besoin grâce à leur nom, et les rediriger vers une méthode (qui fait ce que tu veux).
le code mxml:
Code:
1 2 3 4 5 6 7 8 9
| <?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
xmlns:Script="*"
frameRate = "50"
pageTitle = "Modèle"
layout="absolute" width="1250" height="810">
<Script:TestMain id="engineContainer" creationComplete="engineContainer.init()"/>
<mx:SWFLoader x="54" y="340" source="TestSwfDansFlex.swf" id="SWFonStage"/>
</mx:Application> |
le code du fichier TestMain.as:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
| package
{
import mx.core.UIComponent;
import flash.events.Event;
import flash.display.Loader;
import flash.net.URLRequest;
import flash.utils.getQualifiedClassName;
import flash.display.MovieClip;
import flash.events.MouseEvent;
public class TestMain extends UIComponent
{
public var loader:Loader;
public function init():void {
loader = new Loader();
loader.contentLoaderInfo.addEventListener("init", onLoad);
loader.contentLoaderInfo.addEventListener("ioError", onError);
loader.load(new URLRequest("TestSwfDansFlex.swf"));
} // end constructor
public function onLoad(aEvent:Event):void {
trace("Fichier chargé");
//aEvent.target.content.name = "SWFloaded";
this.addChild(aEvent.target.content);
trace("Parsing des éléménts disposés sur le Stage:\n");
recursChildren(this.stage, 0, "");
var myRoot1:* = loader.contentLoaderInfo.content;
var myRoot2:* = this.parent["SWFonStage"].content;
trace("Vérification 1: "+myRoot1.clipA.x);
myRoot1.clipA.alpha = .5;
trace("Vérification 2: "+myRoot2.clipB.x);
myRoot2.clipB.alpha = .5;
} // end onLoad
public function onError(aEvent:Event):void {
trace("Erreur de chargement");
} // end onError
public function recursChildren(aContainer:*, aRank:uint, aPath:String):void {
var tab:String = (" ").substr(0, (aRank+1)*3);
trace(tab+"Analyse de l'objet: "+aContainer.name+", type "+getQualifiedClassName(aContainer)+", chemin: "+aPath);
var nChildren:uint;
try {nChildren = aContainer.numChildren} catch (a:*) {
trace(tab+"Cet objet: "+aContainer.name+" n'est pas un DisplayObjectContainer.");
return;
}
for (var u:uint=0; u<nChildren; u++) {
trace(tab+" +"+aContainer.getChildAt(u).name+" --> "+getQualifiedClassName(aContainer.getChildAt(u)));
switch (aContainer.getChildAt(u).name) {
case "clipA": getClip(aContainer.getChildAt(u)); break;
case "clipB": getClip(aContainer.getChildAt(u)); break;
case "clipC": getClip(aContainer.getChildAt(u)); break;
}
recursChildren(aContainer.getChildAt(u), aRank+1, aPath+"."+aContainer.getChildAt(u).name);
}
} // end recursChildren
public function getClip(aClip:MovieClip):void {
aClip.addEventListener("mouseDown", clipMouseDown);
aClip.addEventListener("mouseUp", clipMouseUp);
} // end getClip
public function clipMouseDown(aEvent:MouseEvent):void {
trace("Souris DOWN sur le clip: "+aEvent.target.name);
aEvent.target.alpha -= .4;
} // end clipMouseDown
public function clipMouseUp(aEvent:MouseEvent):void {
trace("Souris UP sur le clip: "+aEvent.target.name);
aEvent.target.alpha += .4;
} // end clipMouseUp
} // end class
} // end package |
Voili voilo !
Bon courage ! :ccool:
[Résolu] Manipuler un swf depuis Flex builder 2
Merci beaucoup d'avoir pris la peine de me répondre de façon aussi détaillée et explicite.
C'est exactement les infos que je recherchais.
Tu viens de me faire gagner un temps fou ;-)