Partage
  • Partager sur Facebook
  • Partager sur Twitter

[android] Modification permanente de la position d'une image

Projet étudiant

    22 avril 2012 à 21:41:15

    Bonjour a tous
    je tourne en rond, j'ai lu je ne sais combien de tutoriel different mais je n'arrive toujours pas a changer une image de position...

    je m'explique, j'ai 3 semaine pour faire un jeux sous android (dans le cadre de mes études) je pars de zéro sur cette plateforme (donc je viens sur ce site :D ) j'ai déjà programé en java dans le cadre de mon premier projet mais la on rajoute une touche de xml et ca me complique la vie quelque chose de coton...

    bon tous ça pour dire que pour l'instant j'ai déjà la chose suivante sur mon écran de test:
    _quatre boutons (haut, bas, gauche, droite), chacun d'eux va déplacer le héros dans une direction
    _une imageView qui est l'image du hero.

    Tous ça est placé dans un relative layout, au sein de mon fichier xml

    Ce dont j'ai besoin c'est que lorsque je clic sur un bouton le hero se déplace dans la direction demandé et reste en position
    MAIS lorsque je re-clic sur le bouton il faut que le hero parte de sa nouvelle position, ce qui ne marche pas.

    J'avais réussi à le faire mais le problème c'est qu'il se déplaçait, puis clignotait, et enfin se re-déplaçait dans une direction hasardeuse ou alors il changeais de taille enfin bref que des problème jusqu'à maintenant.

    Afin de me simplifier le travail j'ai réduis le problème a une seule direction (haut), une fois que je saurais le faire bougé vers le haut le reste devrais être facile.

    Dans l'état actuel du code le hero se déplace vers le haut mais a la fin de l'animation il diminue en taille va savoir pourquoi...

    Donc je vous demande votre aide pour ce problème...
    merci d'avance

    PS: voici le code que j'ai jusqu'à maintenant (sans les imports)

    public class SirJourneyActivityGame extends Activity {
    
    	ImageView imageHero; // image du hero
    	ImageButton boutonUp; //bouton haut
    
    	float translationTop = 50; 
    	TranslateAnimation moveUp;
    
    	/** Called when the activity is first created. */
    
    	@Override
    	public void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.game_mode);
    
    		//image
    		imageHero = (ImageView)findViewById(R.id.imageHero);
    
    		//definition de l'animation
    		moveUp = new TranslateAnimation(0,0,0,-translationTop);
    		defineAnimation();
    
    		//bouton
    		boutonUp = (ImageButton)findViewById(R.id.imageButtonUp);
    		boutonUp.setOnClickListener(new View.OnClickListener() {
    			@Override
    			public void onClick(View v) {
    				imageHero.startAnimation(moveUp);
    			}
    		});
    	}
    
    	private void defineAnimation() {
    		moveUp.setDuration(1000);
    		moveUp.setFillAfter(true);
    		
    		this.moveUp.setAnimationListener(new AnimationListener(){
    			@Override
    			public void onAnimationEnd(Animation animation) {
    				imageHero.layout(imageHero.getLeft(), imageHero.getTop() + (int)translationTop, imageHero.getRight(), imageHero.getBottom());
    			}
    			@Override
    			public void onAnimationRepeat(Animation animation) {
    				// TODO Auto-generated method stub
    
    			}
    			@Override
    			public void onAnimationStart(Animation animation) {
    				// TODO Auto-generated method stub
    
    			}
    		}); 
    	}
    }
    
    • Partager sur Facebook
    • Partager sur Twitter
      23 avril 2012 à 1:12:00

      Bonjour,

      Pour faire un jeu je pense que tu devrais utiliser les Canvas et Drawable et pas des imageView.
      Je pense qu'il ne faut pas utiliser le xml dans le jeu en lui même, mais dans les menu c'est peut-être plus facile.


      Je suis plutôt débutant mais je pense que pour un jeu basique, un truc dans le genre devrais fonctionner.
      import android.content.Context;
      import android.graphics.Bitmap;
      import android.graphics.BitmapFactory;
      import android.graphics.Canvas;
      import android.graphics.Paint;
      import android.graphics.RectF;
      import android.view.MotionEvent;
      import android.view.View;
      
      public class GameView extends View {
      	private float imageX;
      	private float imageY;
      	
      	//Constructeur
      	public GameView(Context context) {
      		super(context);
      	}
      
      	@Override
      	public boolean onTouchEvent(MotionEvent event) {
      		//Pour récupérer la position du doigt sur l'écrans
      		float positionTouchX = event.getX();
      		float positionTouchY = event.getY();
      		
      		imageX = positionTouchX;
      		imageY = positionTouchY;
      		return true;
      		
      	}
      	
      	protected void onDraw(Canvas canvas) {
      		Bitmap monImage = BitmapFactory.decodeResource(getResources(), R.drawable.NomDeImage);
      		
      		canvas.drawBitmap(monImage, imageX, imageY, null);
      		
      		invalidate(); //Efface pour redessiner.
      	}
      	
      	//Cette fonction est appeler lorsque la taille de l'écran change, par exemple si il y a rotation de l'écran.
      	@Override
      	   public void onSizeChanged(int w, int h, int oldW, int oldH) {
      	      
      	   }
      }
      


      import android.app.Activity;
      import android.content.pm.ActivityInfo;
      import android.os.Bundle;
      import android.view.View;
      import android.view.Window;
      import android.view.WindowManager;
      
      public class SirJourneyActivityGame extends Activity
      {
      	
      	@Override
          public void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              View GameView = new GameView(this);
              requestWindowFeature(Window.FEATURE_NO_TITLE);
              getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
              super.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
              setContentView(GameView);
          }
      
      }
      

      (Pour un jeu je pense que c'est mieux en full screen et à l'horizontal)

      Voila, par contre pour faire tes boutons je ne crois pas que tu vas pouvoir te servir du XML dans cette View.
      • Partager sur Facebook
      • Partager sur Twitter
        23 avril 2012 à 1:33:24

        utilisé des canvas humm je n'y avait pas pensé (bon je connaissais pas en fait)... j'ai choisi une image view car sa me semblait necessaire pour pouvoir l'animer

        Donc si j'ai bien compris je devrais créer une view pour mon héros et dessiner l'image, l'effacer, l'animer, puis la redessiner a la position final c'est bien ça ?
        ahh oui et est-ce possible d'animer un canvas avec une animation d'android ?
        une autre question pourquoi a tu rajouté un onTouchEvent() ?

        --

        j'ai pu testé pas mal ton idée ca va me servir, reste plus qu'as animé le tout et c'est bon...
        • Partager sur Facebook
        • Partager sur Twitter
          23 avril 2012 à 12:07:23

          Je ne sais si tu peux utiliser defineAnimation() avec les canvas.
          Voila un exemple simple à comprendre d'une balle qui rebondie contre les bords de l'écran. C'est pas un jeu, mais en suivant le même modèle tu peux faire un jeu :
          http://www3.ntu.edu.sg/home/ehchua/pro [...] droid_2D.html

          Dans ces exemples, il fait une pause de quelque millisecondes dans le déroulement du programme pour limiter de nombre d'images par seconde (FPS) :
          // Delay
                try {  
                   Thread.sleep(30);  
                } catch (InterruptedException e) { }
          

          Mais en mesurant les FPS sur mon téléphone, j'ai vue que ça ne dépassait de toute façons pas 60fps. Donc avec son système l'animation n'était pas fluide, je pense donc que tu peux virer cette petite partie.

          Pour le onTouchEvent(), je l'ai mis juste pour montrer un exemple complet avec lequel tu peux utiliser le tactile, afficher des images et les animer (la base d'un jeu video).
          • Partager sur Facebook
          • Partager sur Twitter
            23 avril 2012 à 12:14:17

            une autre question lorsque l'on donne une position a notre image avec imageX, imageY c'est le centre de l'image ou un des sommets ?
            • Partager sur Facebook
            • Partager sur Twitter
              23 avril 2012 à 12:23:22

              L'origine est le point en haut à gauche de l'image. (comme l'origine de l'écran qui est le coin en haut à gauche)
              • Partager sur Facebook
              • Partager sur Twitter
                23 avril 2012 à 12:28:44

                donc j'ai testé on peut effectivement animé une view personnalisée il suffit de la mettre dans le xml et de lui rajouté un animation apres on n'as plus qu'a changer les coordonnées
                de notre view personnalisée a la fin de notre animation.

                Tres bon conseil merci ça m'a bien aidé, par contre j'ai modifié un peu le onDraw(), j'ai mis la declaration du bitmap dehors pour ne devoir "decoder" qu'une fois l'image

                Bon reste plus qu'as coder le tout...

                -- EDIT --

                J'ai encore un problème décidément c'est pas simple, mon animation ce passe bien il me change la position de l'image a la bonne position mais a la derniere image de mon animation mon image se téléporte puis revient au bon endroit o_O une idée du pourquoi ?

                -- EDIT --

                Sait tu comment faire pour faire une sorte de trace de mon image avec un glissé du doigt ?
                Et le plus important:

                mon jeux se compose d'une matrice chaque case peu être changé par un pression du doigt comment faire pour que chaque case affiche une image diferente est-ce que je doit crée ces cases grace au xml et les modifier si on clic dessus? ou il y a une maniere plus simple de faire ceci, car la le problème c'est que mon ondraw() efface l'image précédente et en re-dessine une autre a une nouvelle coordonnée.
                • Partager sur Facebook
                • Partager sur Twitter
                  30 octobre 2012 à 9:42:55

                  Citation : Sirae

                  "J'ai encore un problème décidément c'est pas simple, mon animation ce passe bien il me change la position de l'image a la bonne position mais a la derniere image de mon animation mon image se téléporte puis revient au bon endroit o_O une idée du pourquoi ?"



                  Si c'est comme pour Swing, le problème est que avec ton canevas tu dessines l'image plus loin. Tu altères le parent en dessinant dessus, mais pas ton objet :-° .

                  Une fois que l'animation est finie, elle demande à l'objet de se rafraichir (repaint en swing). Mais finalement ton objet n'a pas bougé de position, c'est juste ton canevas qui est altéré.
                  Du coup, il redessine ton objet à ça position d'origine.

                  --------------------------------------------------------------

                  Sinon, je viens de tomber sur la réponse à ta question en lisant un tuto sur ce site :o :

                  http://www.siteduzero.com/tutoriel-3-6 [...] imations.html

                  Citation : Cours sur Android: Les animations

                  Un dernier détail. Une animation permet de donner du dynamisme à une vue, mais elle n'effectuera pas de changements réels sur l'animation : l'animation effectuera l'action mais uniquement sur le plan visuel. Ainsi, si vous essayez ce code, Android affichera un mouvement mais une fois l'animation finie, les vues redeviendront exactement comme elles l'étaient avant le début de l'animation. Heureusement, il est possible de demander à votre animation de changer les vues pour quelles correspondent à leur état final à la fin de l'animation. Il suffit de rajouter les deux attributs android:fillAfter="true" et android:fillEnabled="true".

                  • Partager sur Facebook
                  • Partager sur Twitter
                  A l'attaque du nouveau monde, vive l'Oculus Rift !

                  [android] Modification permanente de la position d'une image

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown