IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants graphiques Android Discussion :

Drag and drop sur imageView


Sujet :

Composants graphiques Android

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 56
    Points : 35
    Points
    35
    Par défaut Drag and drop sur imageView
    Bonjour à tous,
    J'ai besoin d'une grosse aide à un parcours de mon projet. C'est pour le drag and drop. J'ai cherché partout sur le net j'ai trouvé pleins de programmes mais aucun ne fait la même chose, je ne sais vraiment pas comment faire.
    Explication : J'ai 6 ImageViews, chacunes (leur copie car l'image d'origine doit rester à la même place) doit être draggable. Puis ensuite venir à une place précise si l'utilisateur lache l'image prêt de l'emplacement, sinon revenir à la place d'origine.
    Pour le code qui va suivre j'ai suivi ce lien là : http://myandroidwidgets.googlecode.c...runk/DragDrop/

    Voici mon code (long car je répète chaque chose 6 fois - pour chacunes de mes images)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    public class IntCalculs extends Activity implements OnTouchListener {
     
    	private final static int START_DRAGGING = 0;
    	private final static int STOP_DRAGGING = 1;
    	private int status;
    	private LayoutParams params;
    	private FrameLayout layout;
     
    	private int[] tabdonnees = new int[100];
    	ImageView imav = null;
    	ImageView imre = null;
    	ImageView imdr = null;
    	ImageView imga = null;
    	ImageView impo = null;
    	ImageView imle = null;
    	ImageView imtemp = null;
     
    	public void onCreate(Bundle savedInstanceState) {
        	super.onCreate(savedInstanceState);
        	setContentView(R.layout.cal);
     
            imav = (ImageView) findViewById(R.id.imav);
            imre = (ImageView) findViewById(R.id.imre);
            imdr = (ImageView) findViewById(R.id.imdr);
            imga = (ImageView) findViewById(R.id.imga);
            impo = (ImageView) findViewById(R.id.impo);
            imle = (ImageView) findViewById(R.id.imle);
     
            layout = (FrameLayout) findViewById(R.id.layoutForScroll1);
     
            imav.setDrawingCacheEnabled(true);
            imre.setDrawingCacheEnabled(true);
            imga.setDrawingCacheEnabled(true);
            imdr.setDrawingCacheEnabled(true);
            imle.setDrawingCacheEnabled(true);
            impo.setDrawingCacheEnabled(true);
     
            imav.setOnTouchListener(this);
            imre.setOnTouchListener(this);
            imdr.setOnTouchListener(this);
            imga.setOnTouchListener(this);
            impo.setOnTouchListener(this);
            imle.setOnTouchListener(this);
     
            params = new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
        }
     
    	@Override
    	public boolean onTouch(View v, MotionEvent m) {
    		if (m.getAction() == MotionEvent.ACTION_DOWN) {
    			status = START_DRAGGING;
    			imtemp = new ImageView(this);
    			imtemp.setImageBitmap(imav.getDrawingCache()); // comment connaitre l'image pour laquelle j'ai appuyer ? La j'ai mis imav pour testé.
    			layout.addView(imtemp, params);
    		}
    		if (m.getAction() == MotionEvent.ACTION_UP) {
    			status = STOP_DRAGGING;
    		} else if (m.getAction() == MotionEvent.ACTION_MOVE) {
    			if (status == START_DRAGGING) {
    				System.out.println("Dragging");
    				imtemp.setPadding((int) m.getRawX(), (int) m.getRawY(), 0, 0);
    				imtemp.invalidate();
    			}
    		}
    		return false;
    	}
    }
    Au final, quand je teste ceci, je n'obtiens plus que la dernière image (au lieu d'avoir les 6 les unes sous les autres), et quand j'appuie sur cette image, elle change pour l'autre que j'ai défini dans le code (là ou je demande comment obtenir l'image pour laquelle j'ai appuyé).

    Merci beaucoup de votre aide, parce que là je suis bloqué et je ne sais pas quoi faire.

  2. #2
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Points : 5 072
    Points
    5 072
    Par défaut
    Crée une classe pour le OnTouchListener, ça fera déjà ça de gagné

    Première chose, si tu fais ça pour HoneyComb ou plus, tu as des classes qui le gère nativement, donc le reste du message ne sert à rien.

    Après, je viens de faire un D&D (un drag and drop pour pouvoir changer les onglets d'une TabActivity à son bon vouloir et avec d'aures items dans une ListView).
    À la différence de toi, je commence sur un clic long, toi, au survol à priori.

    Pour savoir où le doigt est, la méthode getHitRect(theHitRect), qui fera en sorte que le Rect passé en paramètre soit la copie de celui de l'ImageView. Le test est à faire quel que soit le toucher et UNIQUEMENT s'il n'y a pas d'image prise déjà dans ton contexte.

    Ensuite, tu n'as pas besoin d'un attribut par image draggable. Tu ne peux en prendre qu'une en même temps, donc tu n'as besoin que d'un attribut, qui sera doublé dans le cas où il faut masquer celle en train de voyager (ou faire un autre traitement la discriminant des autres).
    L'attribut draggable devient donc la nouvelle image, et tu la promènes tant que l'action est MotionEvent.ACTION_MOVE.
    L'autre image, tu peux la passer en View.INVISIBLE, par exemple, pour indiquer qu'elle est en train d'être bougée.

    Enfin, sur MotionEvent.ACTION_UP, tu vérifies si ton image est dans la bonne zone, tu fais ce qu'il faut si c'est le cas et sinon, tu révèle l'image de base, qui n' a pas bougée et tu détruits celle que tu bouge.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 56
    Points : 35
    Points
    35
    Par défaut
    Merci Hizin de ta réponse très complète.
    Je n'ai pas compris pourquoi créer une classe pour le OnTouchListener ?

    Concernant le long clic je verrais plus tard s'il n'y a pas trop de modifs à faire pour voir c'est lequel qui rend mieux.

    ps : je ne fais pas ça pour HoneyComb ou plus

    En voyant ton message, je me dis que j'y arriverai jamais.

  4. #4
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Points : 5 072
    Points
    5 072
    Par défaut
    Citation Envoyé par Fer2Lance
    Je n'ai pas compris pourquoi créer une classe pour le OnTouchListener ?
    C'est vrai que, dans ton cas, ce n'est pas forcément utile
    Ca servira majoritairement pour du découpage de code.

    Tu y arriveras, fais juste les choses petits à petits.
    Dans cet ordre (par exemple) :
    • détecter le toucher
    • détecter l'endroit du toucher
    • détecter si le toucher est sur une des ImageView
    • ajouter l'autre ImageView aux bonnes coordonnées
    • rendre invisible (ou autre) l'ImageView de base (pour signifier qu'elle est en train d'être bougée)
    • faire que l'ImageView "draggable" disparaisse quand le doigt est levé
    • faire que l'ImageView "draggable" suive le doigt quand il bouge
    • avoir l'endroit auquel se lève le doigt
    • vérifier si l'endroit est sur la cible


    Un drag and drop, c'est tout con, faut juste le découper en étape (je m'aperçois que la phrase est généralisable en fait).

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 56
    Points : 35
    Points
    35
    Par défaut
    Encore une fois merci Hizin.

    Je vais essayé de suivre "ta recette".
    Par contre pour les 3 premiers points, cela se fait "automatiquement" non ?
    Avec le image.setOnTouchListener() non ?

  6. #6
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Points : 5 072
    Points
    5 072
    Par défaut
    Je n'ai pas dit que chacun des points était égal en terme de travail à faire pour le remplir
    Juste avancer pas à pas en décomposant le problème pour savoir ce que l'on doit avoir pour débuter (ici, comment sont géré les touchers et les mouvements), ce que l'on veut faire (déplacer une image suivant le doigt) et la finalité (que l'image bougée soit larguée dans une certaine zone).

    Les deux premiers points se font effectivement très vite, mais le troisième risque de te poser quelques soucis si tu l'assimiles aux deux premiers.
    Le tuto duquel je suis parti : http://blog.scoutant.org/index.php?p...rop-en-Android

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 56
    Points : 35
    Points
    35
    Par défaut
    Effectivement, pour moi le 3 va avec le 2 et le 1.

    J'avais aussi trouvé ce tuto mais je le trouvais franchement compliqué comparé à celui que j'ai mis en premier post. De plus dans ce tuto, il gère une seule image et crée en plus une classe pour son image : public class BallView extends ImageView. Moi avec mes 6 images je vais devoir créer 6 classes ?

    Je crois que le d&d c'est pas fait pour moi.

  8. #8
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Points : 5 072
    Points
    5 072
    Par défaut
    Calme-toi et réfléchis simplement
    Ce qui est important dans ce tuto, c'est l'utilisation du FrameLayout.
    Le reste ... Là, je ne peux pas plus t'aider que ce que j'ai fait, à toi de faire en sorte que ça fonctionne.

    Ps : le point n°3 est directement sur l'image, mais les points 1 et 2 seront sur la vue contenant l'image, pour pouvoir avoir le jeu de coordonnées du toucher qui va bien

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 56
    Points : 35
    Points
    35
    Par défaut
    Ce d&d va me faire explosé la tête et je n'ai pas réussi a avancé d'un pouce !

    Comme tu dis, il a l'air indispensable d'utiliser le FrameLayout, mais j'ai vu que le FrameLayout n'affiche une seule imageView, moi j'en ai 6 a afficher en permanence. Et si je crée un FrameLayout par imageView, je ne peux pas faire setContentView(container); six fois ...

  10. #10
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Points : 5 072
    Points
    5 072
    Par défaut
    Le FrameLayout en question sert juste à afficher les images en train d'être portées, il doit donc être placée comme top parent dans la vue qui doit supporter le D&D. Il ne sert à strictement rien d'autre.
    Il n'y a pas besoin de 6 FrameLayouts dans ton XML.

    Prends ton temps et réfléchis
    Il n'y a rien d'insurmontable.

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 56
    Points : 35
    Points
    35
    Par défaut
    Je prend le paris que demain soir je posterai sur ce même topic "Ca y est, j'ai réussi !"

  12. #12
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 56
    Points : 35
    Points
    35
    Par défaut
    Et bien voilà, le d&d a bien avancé !
    Manque plus qu'à faire que si l'image est dans la zone on laisse sinon on annule le déplacement. Pour ça je pense pas trop avoir de trop gros problèmes.

    Par contre, il faut que dans un même temps je remplisse un tableau, tableau que je dois remplir dans la classe de l'image (j'ai fais comme le tuto suivant : http://blog.scoutant.org/index.php?p...rop-en-Android ) vu qu'il a un rapport avec le déplacement des images. Mais il me faut ce tableau dans l'activity ... je ne vois pas comment faire ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Drag and drop sur une PictureBox
    Par abdiouldbody dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 17/06/2009, 15h55
  2. drag and drop sur une listBox?
    Par Mickey.jet dans le forum Delphi
    Réponses: 3
    Dernier message: 30/09/2006, 10h27
  3. Drag and Drop sur une JTree
    Par Xhéras dans le forum Composants
    Réponses: 5
    Dernier message: 07/07/2006, 12h09
  4. Drag and drop sur du text ?
    Par isa150183 dans le forum JSF
    Réponses: 2
    Dernier message: 05/07/2006, 06h28
  5. Drag and drop sur un JTree
    Par tomca dans le forum Composants
    Réponses: 4
    Dernier message: 02/08/2005, 10h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo