Aide - Recherche - Membres - Calendrier
Version complète : Drag and drop sur des canvas
Centre de Formation Flash - Forums Adobe Flash > Rich media et intégration > Flex
adakick
Bonjour, dans une de mes applications je créer par rapport a un fichier xml des canvas contenant une image et 2 labels, ces canvas sont contenus dans un VBox, qui lui même est contenus dans un canvas. J'ai regarder les exemples sur adobe et un peu partout, mais rien ne correspond a ce que je cherche, car je veut que lorsque que je drag mon canvas, que cela ne me déplace pas mon canvas, mais le copie ailleurs et que les elements soit visible lors du déplacement.. je ne sais pas si j'ai été assez clair?

Voici un extrait de mon code :



CODE
        // Créer les canvas dynamiquement
private function displayDetails():void{
    details.removeAllChildren();
    for( var i:uint = 0; i < contents.lastResult.content[selectedMovie].part.name.length(); i++ ){
        var canvas:Canvas = new Canvas();
        canvas.height = 80;
        canvas.width = 300;
        canvas.setStyle( "backgroundColor", 0x8888FF );
                // c'est ce canvas qu il faut rendre drag and drop

        var image:Image = new Image();
        image.source = contents.lastResult.content[selectedMovie].part[i].thumbnail;
        image.x = 1;
        image.height = 80;
        image.width = 55;
        image.alpha = 1.0;
        image.scaleContent = true;
        image.maintainAspectRatio = false;

        var labelTitle:Label = new Label();
        labelTitle.x = 60;
        labelTitle.y = 1;
        labelTitle.styleName = "test";
        labelTitle.text = contents.lastResult.content[selectedMovie].part[i].name;
        var labelDescr:Label = new Label();
            labelDescr.x = 60;
        labelDescr.y = 20;
        labelDescr.height = 60;
        labelDescr.width = 220;

        var textDescr:Text = new Text();
        textDescr.text = contents.lastResult.content[selectedMovie].part[i].desc;
        textDescr.height = 60;
        textDescr.width = 220;
        labelDescr.addChild(textDescr);

        canvas.addChild( image );
        canvas.addChild( labelTitle );
        canvas.addChild( labelDescr );

        details.addChild( canvas );
    }        
}


(...)

<!-- Les canvas seront créer a chaque clique de l utilisateurs sur un bouton dans l id details -->
<mx:Canvas id="detailsBox" x="280" y="130" width="320" height="240" visible="false">
<mx:VBox id="details"  x="0" y="0" ></mx:VBox>
</mx:Canvas>


Merci de votre aide.
Tonic
Salut,

tu ne peux pas directement le drag & drop alors.

Il te faut d'abord copier ton objet (tu devras mettre en oeuvre ta propre fonction, puisqu'il est impossible de copier directement un objet graphique) sur click de ton objet.

Et ensuite lancer le drag sur cet objet.
adakick
Ok, mais pour rendre la canvas drag and drop, il faut que j ajoute quoi comme ligne ?
J'ai essayé plusieurs choses à cet endroit la

CODE
        canvas.setStyle( "backgroundColor", 0x8888FF );
                // c'est ce canvas qu il faut rendre drag and drop


Comme canvas.dragEnabled="true";
Mais cela ne fonctionne pas ...
Tonic
Regarde ici : http://www.adobe.com/devnet/flex/quickstar..._drag_and_drop/
adakick
En fait ce qu il me faudrait par exemple c'est pouvoir rendre un objet créer dans un script cliquable, j'ai essayé :

CODE
                var image:Image = new Image();
                image.source = "media/"+contents.lastResult.content[selectedMovie].part[i].thumbnail;
                image.x = 1;
                image.height = 80;
                image.width = 55;
                image.alpha = 1.0;
                image.scaleContent = true;
                image.maintainAspectRatio = false;
                
                                // C'est ceci qui ne fonctionne pas et je ne sais pas comment le faire fonctionné.... Que lorsqu'on clique sur l'image que ce l appel ma fonction maMethode( idImage)
                image.click = maMethode(idImage);
adakick
Personne ne sais comment attribuer une methode a un element créer dans les script ? lors d'un clique ou lorsque d'une mouseEvent ?
Tonic
Regarde du côté de la méthode addEventListener.
adakick
Ok, merci
Mais on ne peut pas passer de parametre a l'appel de la fonction ???
CODE
image.addEventListener(MouseEvent.CLICK, add);


Mais j'ai besoin de donnée deux parametre a ma methodes... comment faire ?
Tonic
Tu peux stocker des variable dans ton objet image, dans la propriété data.

Ensuite dans l'évènement recu, tu peux avoir accès à l'objet image via la prorpiété target. Il te suffit alors de récupérer tes variables via cette objet.
adakick
Ok donc je peut faire quelque chose comme cela ?
Enregistrer comme cela :
CODE
image.data[0] = 2;
image.data[1] = 5;


Et recupere comme cela ?
CODE
private function addElement():void{
  var contentSelect:Number = target[0];
  var partSelect:Number = target[1];
...

Ou target fonctionne autrement, car j ai une erreur
CODE
  Error: Accès à la propriété non définie target.
Tonic
regarde dans la doc, tu ne fais pas beaucoup d'effort non plus.

En gros, quand tu mets un listener sur un objet, dans la fonction associée, tu récupère en paramètre dans la fonction un évènement.

C'est à partir de cet évènement que tu peux utiliser la propriété target.

Commence par regarder la doc. Et y a plein de topic où tu pourras également trouver des exemples sur la gestion des évènements...
adakick
CITATION(Tonic @ Jul 6 2007, 05:50 PM) *
regarde dans la doc, tu ne fais pas beaucoup d'effort non plus.

En gros, quand tu mets un listener sur un objet, dans la fonction associée, tu récupère en paramètre dans la fonction un évènement.

C'est à partir de cet évènement que tu peux utiliser la propriété target.

Commence par regarder la doc. Et y a plein de topic où tu pourras également trouver des exemples sur la gestion des évènements...


Hé bien après avoir chercher longtemps, je trouve pas le moyen de passer des arguments, j'ai bien avancer et il me reste qu'un petit truc a faire :
Après avoir ajouter le listener a mon canvas, j'aimerais juste passer un nombre a la méthode inclut dans le listener
CODE
//ma methode addElement a besoin d un nombre mais je en sais pas comment le donner a mon canvas pour le recuperer !
canvas.addEventListener(MouseEvent.CLICK, addElement);


Dans ma fonction addElement j'arrive bien a recupere les infos du canvas mais il me manque le 'fameux' nombre....
CODE
event.target.toString();


J'aimerai savoir comment puis-je donner a mon canvas un nombre afin de le recupere plus tard ! Merci
Fusion
CITATION(adakick @ Jul 9 2007, 11:05 AM) *
Hé bien après avoir chercher longtemps, je trouve pas le moyen de passer des arguments, j'ai bien avancer et il me reste qu'un petit truc a faire :
Après avoir ajouter le listener a mon canvas, j'aimerais juste passer un nombre a la méthode inclut dans le listener
CODE
//ma methode addElement a besoin d un nombre mais je en sais pas comment le donner a mon canvas pour le recuperer !
canvas.addEventListener(MouseEvent.CLICK, addElement);


Dans ma fonction addElement j'arrive bien a recupere les infos du canvas mais il me manque le 'fameux' nombre....
CODE
event.target.toString();


J'aimerai savoir comment puis-je donner a mon canvas un nombre afin de le recupere plus tard ! Merci


Tu as vu assez juste : avec le addEventListener en ActionScript, tu ne peux pas passer d'argument sà la fonction que tu ajoutes. Mais il existe un autre moyen, et je crois que tu n'as pas assez bien lu ce que Tonic t'a dit.

Si tu enregistres une fonction avec un addEventListener, ça va avoir cette forme :

CODE
truc.addEventListener("click",myEventManager)


La fonction myEventManager aura la forme suivante :

CODE
public function myEventManager(e:MouseEvent):void{}


Et dans le myEventManager, tu vas pouvoir accéder à l'élément cliqué avec e.currentTarget. Donc si ton objet cliqué a un champ nombreAAdditionner, il te suffit de faire :

CODE
e.currentTarget.nombreAAdditionner


Ce qui te permet de récupérer la valeur voulue.

Voilà ce que je propose pour ton cas :

CODE
image.addEventListener("click",myEventManager);

public function myEventManager(e:MouseEvent):void
{
addElement(e.currentTarget.param1,e.currentTarget.param2); // on a "passé" les deux paramètres
}


Rien de bien sorcier...
Tonic
Je ne sais pas si on peut créer directement des propriétés dynamique pour l'objet Image.

Le mieux, c'est de stocker ce que l'on veut dans la propriété "data". (qui est là pour ça d'ailleurs)
adakick
Merci.
Mais mon problème est justement que je ne sais pas comment lui donner le "nombreAAditionner"...

J'ai fait un truc comme cela, mais cela ne fonctionne pas...
CODE
canvas.nombreAAdditionner = 2;
Tonic
CITATION(Tonic @ Jul 9 2007, 09:35 AM) *
Je ne sais pas si on peut créer directement des propriétés dynamique pour l'objet Image.

Le mieux, c'est de stocker ce que l'on veut dans la propriété "data". (qui est là pour ça d'ailleurs)

Fusion
CITATION(adakick @ Jul 9 2007, 11:37 AM) *
Merci.
Mais mon problème est justement que je ne sais pas comment lui donner le "nombreAAditionner"...

J'ai fait un truc comme cela, mais cela ne fonctionne pas...
CODE
canvas.nombreAAdditionner = 2;


Tu fais
image.data.param1="truc";
image.data.param2=50;
image.data.nombreAAditionner=48;

Et ainsi de suite...

Juste pour signaler, il y a trouze mille sujets qui parlent de ça, n'hésite pas à te documenter avant de venir chercher de l'aide.
Ici par exemple : http://livedocs.adobe.com/flex/201/langref...Image.html#data

Bon courage!
Tonic
CITATION
Voilà ce que je propose pour ton cas :

CODE
image.addEventListener("click",myEventManager);

public function myEventManager(e:MouseEvent):void
{
addElement(e.currentTarget.param1,e.currentTarget.param2); // on a "passé" les deux paramètres
}


Rien de bien sorcier...

Faux...

CITATION(Fusion @ Jul 9 2007, 09:53 AM) *
Tu fais
image.data.param1="truc";
image.data.param2=50;
image.data.nombreAAditionner=48;

Et ainsi de suite...

Juste pour signaler, il y a trouze mille sujets qui parlent de ça, n'hésite pas à te documenter avant de venir chercher de l'aide.
Ici par exemple : http://livedocs.adobe.com/flex/201/langref...Image.html#data

Bon courage!

Faux...

Tu ne peux pas affecter directement une propriété comme ceci.

Tu dois d'abord créer un objet, puis l'affecter à data, sous peine d'avoir une belle erreur de référence nulle.

CODE
<?xml version="1.0" encoding="utf-8"?>
<mx:Application
    xmlns:mx="http://www.adobe.com/2006/mxml"    
    creationComplete="init();"    
>
    <mx:Script>
        <![CDATA[
            import mx.controls.Alert;
            private function init():void
            {
               var obj : Object =new Object();
               obj.test="coucou";
               img.data=obj;           
            }            
                        
            public function test():void
            {
                trace(img.data.test);
            }      
          
        ]]>
    </mx:Script>    
    <mx:Image id="img" click="test()" />      
</mx:Application>
Fusion
Oups boulette ... icon_redface.gif

J'avoue, je n'ai pas testé cette fois-ci icon_lol.gif
adakick
PARFAIT !!
Sa fonctionne enfin.

Merci à vous deux.
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'informations, la mise en page et les images, veuillez cliquer ici.
Invision Power Board © 2001-2008 Invision Power Services, Inc.