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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    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 : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    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.
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  3. #3
    Invité
    Invité(e)
    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 : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    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).
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  5. #5
    Invité
    Invité(e)
    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 : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    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
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

+ 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