Aller au contenu

Problème de drag d'une image


erinjaka

Recommended Posts

Bonjour à tous!

Voilà, j'ai des images sur une SurfaceView et chaque image est draggable via la methode onTouchEvent(). Le problème est que lorsque je déplace les images, si deux images se rapprochent trop l'une de l'autre, je constate que les deux (voir plus de deux) se superposent et deviennent comme s'il s'agissait d'une seule image, c'est-à-dire que toutes se déplacent alors que je ne drag qu'une image (celui qui se trouve normalement au supérieur de toutes)

Pouvez-vous m'expliquer pourquoi j'ai ça et comment puis-je faire pour éviter cela?

Je sollicite fortement vos aides et suggestions :)

Merci.

Cordialement.

Lien vers le commentaire
Partager sur d’autres sites

Bonjour à tous!

Voilà, j'ai des images sur une SurfaceView et chaque image est draggable via la methode onTouchEvent(). Le problème est que lorsque je déplace les images, si deux images se rapprochent trop l'une de l'autre, je constate que les deux (voir plus de deux) se superposent et deviennent comme s'il s'agissait d'une seule image, c'est-à-dire que toutes se déplacent alors que je ne drag qu'une image (celui qui se trouve normalement au supérieur de toutes)

Pouvez-vous m'expliquer pourquoi j'ai ça et comment puis-je faire pour éviter cela?

Je sollicite fortement vos aides et suggestions :)

Merci.

Cordialement.

Voilà, j'ai fait les remarques suivantes:

  • lorsque le x (abscisse) des images se concordent, alors les images se fusionnent automatiquement
  • les images se placent sur la SurfaceView suivant l'ordre ou on les a dessinées sur le canevas, c'est-à-dire qu'il y a une notion de couche ou calque comme en traitement d'image; il y a des images qui sont sur des couches supérieures et celles qui sont sur des couches inférieures.
    Je suppose que c'est la notion de layout qui est responsable de ceci puisque je crois que chaque image est ajoutée sur le canevas via un layout (couche).
    Pouvez-vous confirmer mes dires et me suggérer des solutions pour éviter que les images se drag ensemble comme cela?
    Merci :)

Lien vers le commentaire
Partager sur d’autres sites

C’est la fonction onTouchEvent qui gère tout, sans l’avoir on ne pourra pas t’aider.

Une SurfaceView n’est rien d’autre qu’une View permettant de dessiner dedans et de recueillir les événements du touchscreen.

Il n’y a en particulier aucun notion de couche ou de calque, ou bien d’élément « draggable ».

Lien vers le commentaire
Partager sur d’autres sites

C’est la fonction onTouchEvent qui gère tout, sans l’avoir on ne pourra pas t’aider.

Une SurfaceView n’est rien d’autre qu’une View permettant de dessiner dedans et de recueillir les événements du touchscreen.

Il n’y a en particulier aucun notion de couche ou de calque, ou bien d’élément « draggable ».

Bonjour et merci à toi Fractal pour ta réponse. Je te donne une classe qui contient la méthode onTouchEvent() et qui est donc

responsable de la gestion des événement sur la SurfaceView.

package com.android.newdrag;

import com.android.newdrag.model.Picture;
import android.app.Activity;
import android.content.Context;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.util.Log;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class MainPanel extends SurfaceView implements SurfaceHolder.Callback {

private static final String TAG = MainPanel.class.getSimpleName();

private MainThread thread;
private Picture  pict;
private Picture  pict1;
private Picture  pict2;
private Picture  pict3;
private Picture  pict4;
private Picture  pict5;

public MainPanel(Context context) {
	super(context);
	getHolder().addCallback(this);
	 pict = new Picture(BitmapFactory.decodeResource(getResources(), R.drawable.bol_1), 50, 50);
	 pict1 = new Picture(BitmapFactory.decodeResource(getResources(), R.drawable.bol_2), 350, 50);
	 pict2 = new Picture(BitmapFactory.decodeResource(getResources(), R.drawable.bol_3), 300, 400);
	 pict3 = new Picture(BitmapFactory.decodeResource(getResources(), R.drawable.bol_4), 200, 200);
	 pict4 = new Picture(BitmapFactory.decodeResource(getResources(), R.drawable.bol_5), 500, 300);
	 pict5 = new Picture(BitmapFactory.decodeResource(getResources(), R.drawable.bol_6), 550, 200);

	thread = new MainThread(getHolder(), this);
	setFocusable(true);
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
	thread.setRunning(true);
	thread.start();
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
	Log.d(TAG, "Surface is being destroyed");
	System.out.println("Surface is being destroyed");
	boolean retry = true;
	while (retry) {
		try {
			thread.join();
			retry = false;
		}
		catch (InterruptedException e) {
		}
	}
	Log.d(TAG, "Thread was shut down cleanly");
	System.out.println("Thread was shut down cleanly");
}

@Override
public boolean onTouchEvent(MotionEvent event) {
	if (event.getAction() == MotionEvent.ACTION_DOWN){

		 pict.handleActionDown((int)event.getX(), (int)event.getY());
		 pict1.handleActionDown((int)event.getX(), (int)event.getY());
		 pict2.handleActionDown((int)event.getX(), (int)event.getY());
		 pict3.handleActionDown((int)event.getX(), (int)event.getY());
		 pict4.handleActionDown((int)event.getX(), (int)event.getY());
		 pict5.handleActionDown((int)event.getX(), (int)event.getY());

		if (event.getY() > getHeight() - 50) {
			thread.setRunning(false);
			((Activity)getContext()).finish();
		} 
		else {
			Log.d(TAG, "Coordonnées: x = " + event.getX() + ", y = " + event.getY());
			System.out.println("Coordonnées: x = " + event.getX() + ", y = " + event.getY());
		}
	}
	if (event.getAction() == MotionEvent.ACTION_MOVE) {
		if ( pict.isTouched()) {
			 pict.setX((int)event.getX());
			 pict.setY((int)event.getY());
			System.out.println("Coords: x = " + event.getX() + ", y = " + event.getY());
		}
		if ( pict1.isTouched()) {
			 pict1.setX((int)event.getX());
			 pict1.setY((int)event.getY());
			System.out.println("Coords: x = " + event.getX() + ", y = " + event.getY());
		}
		if ( pict2.isTouched()) {
			 pict2.setX((int)event.getX());
			 pict2.setY((int)event.getY());
			System.out.println("Coords: x = " + event.getX() + ", y = " + event.getY());
		}
		if ( pict3.isTouched()) {
			 pict3.setX((int)event.getX());
			 pict3.setY((int)event.getY());
			System.out.println("Coords: x = " + event.getX() + ", y = " + event.getY());
		}
		if ( pict4.isTouched()) {
			 pict4.setX((int)event.getX());
			 pict4.setY((int)event.getY());
			System.out.println("Coords: x = " + event.getX() + ", y = " + event.getY());
		}
		if ( pict5.isTouched()) {
			 pict5.setX((int)event.getX());
			 pict5.setY((int)event.getY());
			System.out.println("Coords: x = " + event.getX() + ", y = " + event.getY());
		}
	} 
	if (event.getAction() == MotionEvent.ACTION_UP){
		if( pict.isTouched()){
			 pict.setTouched(false);
		}
		if( pict1.isTouched()){
			 pict1.setTouched(false);
		}
		if( pict2.isTouched()){
			 pict2.setTouched(false);
		}
		if( pict3.isTouched()){
			 pict3.setTouched(false);
		}
		if( pict4.isTouched()){
			 pict4.setTouched(false);
		}
		if( pict5.isTouched()){
			 pict5.setTouched(false);
		}
	}
	return true;
}

public void render(Canvas canvas) {
	canvas.drawColor(Color.GRAY);
	 pict.draw(canvas);
	 pict1.draw(canvas);
	 pict2.draw(canvas);
	 pict3.draw(canvas);
	 pict4.draw(canvas);
	 pict5.draw(canvas);
}
}

Voilà, j'espère que tu pourra avoir une idée sur de quoi je parle et pourra m'éclaircir sur ce point.

Merci encore.

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...