2010-06-15 8 views
1

Je souhaite que l'image de mon cercle (ImageView) pivote lorsque l'utilisateur la touche et la fait glisser. Si l'utilisateur le fait glisser vers la droite, il devrait tourner à droite et vice versa. Comme quand vous faites tourner un disque DJ, si vous savez ce que je veux dire. J'ai joué un peu avec OnTouchListener et RotateAnimation mais je n'arrive nulle part.Comment puis-je utiliser RotateAnimation pour faire pivoter un cercle?

Des idées?

+0

Peut-être que vous pourriez montrer votre tentative, avec des détails sur ce qui est ne fonctionne pas. –

+0

En fait, je ne sais même pas comment procéder avec ce que je veux. J'ai juste besoin d'idées sur comment cela peut être accompli. – shuwo

Répondre

8

Supposons que vous ayez ImageView mCircle que vous voulez faire pivoter. Vous devez utiliser RotateAnimation pour le faire pivoter. Dans OnTouch méthode déterminer l'angle où le doigt de l'utilisateur est.

Par exemple, dans votre activité principale, procédez comme suit

private ImageView mCircle; 
private double mCurrAngle = 0; 
private double mPrevAngle = 0; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    mCircle = (ImageView) findViewById(R.id.circle); 
    mCircle.setOnTouchListener(this); // Your activity should implement OnTouchListener 
} 

@Override 
public boolean onTouch(View v, MotionEvent event) { 
    final float xc = mCircle.getWidth()/2; 
    final float yc = mCircle.getHeight()/2; 

    final float x = event.getX(); 
    final float y = event.getY(); 

    switch (event.getAction()) { 
    case MotionEvent.ACTION_DOWN: { 
     mCircle.clearAnimation(); 
     mCurrAngle = Math.toDegrees(Math.atan2(x - xc, yc - y)); 
     break; 
    } 
    case MotionEvent.ACTION_MOVE: { 
     mPrevAngle = mCurrAngle; 
     mCurrAngle = Math.toDegrees(Math.atan2(x - xc, yc - y)); 
     animate(mPrevAngle, mCurrAngle, 0); 
     break; 
    } 
    case MotionEvent.ACTION_UP : { 
     mPrevAngle = mCurrAngle = 0; 
     break; 
    } 
    } 

    return true; 
} 

private void animate(double fromDegrees, double toDegrees, long durationMillis) { 
    final RotateAnimation rotate = new RotateAnimation((float) fromDegrees, (float) toDegrees, 
      RotateAnimation.RELATIVE_TO_SELF, 0.5f, 
      RotateAnimation.RELATIVE_TO_SELF, 0.5f); 
    rotate.setDuration(durationMillis); 
    rotate.setFillEnabled(true); 
    rotate.setFillAfter(true); 
    mCircle.startAnimation(rotate); 
} 
+0

Brillant! Simple et élégant. Merci @vasart! – Tiago

+0

J'ai modifié votre code pour fonctionner comme un bouton qui sera entre -120 et 120 angle. Mais chaque fois que je l'ActionDown revenir à sa position originale, je veux enregistrer le dernier angle touché et chaque fois que je ActionDown il sera sur la dernière position. – Nepster

+0

@Nepster, essayez de commenter l'appel 'clearAnimation()'. – vasart

Questions connexes