2012-08-10 3 views
2

Je suis nouveau sur android et j'ai de la difficulté à comprendre comment animer la toile. fondamentalement j'ai dessiné une boule rouge et un escalier quand la boule devrait tomber de l'escalierFaire de la toile animée en android

voici à quoi il ressemble.

enter image description here

quelqu'un peut me aider sur ce que je devrais utiliser la méthode? Si vous pouvez me fournir un code source qui serait très utile.

voici mon code source:

DrawingView.java

package com.ballandstair; 

import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.Path; 
import android.view.View; 

public class DrawingView extends View { 
    DrawingView(Context context) { 
     super(context); 
    } 

    protected void onDraw(Canvas canvas){ 
     super.onDraw(canvas); 
     Paint paint = new Paint(); 
     Path path = new Path(); 

     paint.setStyle(Paint.Style.FILL); 
     paint.setColor(Color.RED); 
     paint.setAntiAlias(true); 
     canvas.drawCircle(100, 50, 25, paint); 

     paint.setColor(Color.BLUE); 
     paint.setStyle(Paint.Style.FILL); 
     path.moveTo(75, 75); 
     path.lineTo(125, 75); 
     path.lineTo(125, 125); 
     path.lineTo(175, 125); 
     path.lineTo(175, 175); 
     path.lineTo(225, 175); 
     path.lineTo(225, 225); 
     path.lineTo(275, 225); 
     path.lineTo(275, 275); 
     path.lineTo(325, 275); 
     path.lineTo(325, 325); 
     path.lineTo(75, 325); 
     path.close(); 
     canvas.drawPath(path, paint); 

    } 
} 

MainActivity.java

package com.ballandstair; 

import android.app.Activity; 
import android.os.Bundle; 

public class MainActivity extends Activity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     DrawingView drawing = new DrawingView(this); 
     setContentView(drawing); 


    } 
} 

Répondre

0

Vous devez faire (au moins) deux choses:

  1. Modifier votre code de sorte que la position de la balle est variable. Cela ne devrait pas être trop dur.
  2. Avoir un moyen de mettre à jour la variable (s) qui définissent la position de la balle et de déclencher des retraits de votre vue personnalisée afin que la balle semble suivre le chemin que vous voulez au fil du temps.

La deuxième étape nécessite un peu de soin. Vous pourriez être tenté d'écrire une boucle qui appelle Thread.sleep(frameRate) (où frameRate est le nombre de millisecondes entre les images), met à jour la position de la boule, puis appelle invalidate() pour que votre vue personnalisée déclenche un repeint. Le problème avec ceci est que vous ne pouvez pas mettre en pause le thread d'événement.Il y a (encore) deux manières de traiter ceci:

  1. Créez un thread de travail qui a la boucle d'animation. Il ne peut pas appeler invalidate() directement, mais il peut appeler postInvalidate() pour le même effet.
  2. Déclarez une Runnable que dans sa méthode run() met à jour la position de la balle, les appels invalidate() et demande alors la vue de lancer le nouveau se Runnable après un délai de frameRate (en appelant postDelayed()).

Les deux méthodes sont des approches raisonnables. Vous aurez également besoin de logique pour savoir quand l'animation devrait se terminer, et vous voudrez peut-être donner à l'utilisateur le contrôle sur le démarrage ou permettre la relecture.

1

Fondamentalement, toute logique d'animation est composé de 3 éléments:

  • Paramètres: positions, rotations et échelles des objets que vous allez dessiner; Threads: Vous pouvez choisir d'utiliser 2 threads pour dessiner et mettre à jour les propriétés des objets (positions, rotations et échelles) séparément ou de les faire dans un thread.

  • Boucle infinie: une boucle qui ne tire -> mise à jour -> dessiner ... infiniment

Il sont plusieurs façons de les mettre en œuvre, je ne peux que suggérer des API que vous pouvez utiliser:

  • View.invalidate(), utiliser pour demander le cadre de redessiner votre point de vue, de sorte que votre méthode onDraw() sera appelée.

  • [View.postDelayed()] (http://developer.android.com/reference/android/view/View.html#postDelayed (java.lang.Runnable, long)), utilisez ceci pour rendre infini boucle à la fin de votre méthode onDraw() pour appeler View.invalidate().