13

The two states of the imageRuotare un animazione Imagewith

quello che ho

Ho un'immagine freccia (come quella di sinistra). Quando l'utente fa clic su di esso, dovrebbe ruotare di 180 gradi con un'animazione e dovrebbe apparire come quella giusta.

quello che ho fatto

private void rotate(float degree, final int toggleV) { 

     final RotateAnimation rotateAnim = new RotateAnimation(0.0f, degree, 
       RotateAnimation.RELATIVE_TO_SELF, 0.5f, 
       RotateAnimation.RELATIVE_TO_SELF, 0.5f); 

     rotateAnim.setDuration(500); 
     toggle.startAnimation(rotateAnim); 
     rotateAnim.setAnimationListener(new Animation.AnimationListener() { 

      @Override 
      public void onAnimationStart(Animation animation) { 

      } 

      @Override 
      public void onAnimationEnd(Animation animation) { 


       if (toggleV == 1) 
        toggle.setImageResource(R.drawable.toggle_up); 
       else 
        toggle.setImageResource(R.drawable.toggle_down); 
      } 

      @Override 
      public void onAnimationRepeat(Animation animation) { 

      } 
     }); 
    } 

Il problema

vedo che l'animazione funziona bene, ma c'è un po 'di sfarfallio durante l'impostazione dell'immagine. Può essere a causa della differenza di orario quando termina l'animazione e viene impostata l'immagine.

Come posso rimuovere questo problema di sfarfallio? Hai un approccio migliore per fare questo?

risposta

34

Prima di tutto, che cosa è voi requisito minimo SDK? Nel caso in cui si tratta di almeno Android 3.0, è possibile utilizzare il framework di animazione più recente, e animare la vostra immagine con qualcosa di simile:

imageView.animate().rotation(180).start(); 

Circa il guizzo: non vorrei ripristinare l'immagine di origine del ImageView dopo la rotazione , Vorrei lasciare l'originale e assicurarmi che l'animazione di rotazione si riempia dopo l'animazione, lasciando l'immagine ruotata. Lo sfarfallio è probabilmente causato dall'uscita/ridisegna della vista al momento della modifica dell'immagine sorgente.

Ulteriori artefatti visivi (sfarfallio?) Possono essere causati dal fatto che l'immagine ruotata in origine e l'immagine statica ruotata potrebbero differire in alcuni pixel.

+0

ImageView ruota appena una volta quando lo preme. Ma dovrebbe ruotare di nuovo dopo averlo premuto di nuovo e così via. Ma questo non succede. Qualche idea? –

+2

Bene, nel caso si stia utilizzando l'esempio di codice che ho fornito, questo codice dice esplicitamente di visualizzare "ruota a 180 gradi". Quindi se è già ruotato di 180 gradi, allora non farà nulla. Nel listener dei clic è possibile ad es. controlla la rotazione corrente della vista (.getRotation) e, se non è 0, ruotala nuovamente su 0 in modo simile. –

+0

Sì, l'ho appena fatto e ha funzionato anche io. Ora, c'è un modo per controllare la direzione dell'animazione quando si ruota a 0. Voglio dire, sta ruotando in una particolare direzione, ma voglio andare nella direzione opposta. –

1

È possibile utilizzare setFillAfter se si desidera mantenere lo stato dell'animazione.

+0

Giù elettore, ti interessa spiegare il motivo? – Rajesh

2

Perché non usi RotateAnimation?

creare una cartella denominata anim in res e un file denominato rotator.xml all'interno di res/anim.

<rotate xmlns:android="http://schemas.android.com/apk/res/android" 
android:duration="400" 
android:fromDegrees="0" 
android:pivotX="50%" 
android:pivotY="50%" 
android:toDegrees="360"/> 

Qui una rotazione completa sarà completata in 4000ms (4 secondi). Ora aggiungi un'immagine PNG che vuoi ruotare nella cartella drawable. Quindi aprire res/main.xml, dopo aver rimosso la textView predefinita nel layout, aggiungere un ImageView e un pulsante nel layout. Imposta la proprietà src di ImageView come nome file dell'immagine aggiunta, ad esempio android: src = "@ drawable/myimg" Ok, consente di modificare la classe principale. Nel onClick() per il pulsante, aggiungi il codice necessario per l'esecuzione dell'animazione. Controlla il seguente codice.

public class AnimationActivity extends Activity { 

    public ImageView myImage ; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     myImage = (ImageView)findViewById(R.id.imageView1); 
     final Animation myRotation = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.rotator); 
     ((Button)findViewById(R.id.button1)).setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View arg0) { 
       myImage.startAnimation(myRotation); 
      } 
     }); 
    } 
} 
+0

Il tuo codice ha tutti i tipi di errori .. – Debasish

4

Se fossi in te userei ViewPropertyAnimator (disponibile da API 12). La sua sintassi è più diretta IMO.
Uso sarebbe:

toggle.animate().rotation(0.5f); 
+0

Uguale alla risposta precedente. Ma come faccio a garantire che la rotazione si verifichi ogni volta che premo l'immagine? Per ora succede solo una volta. –

+1

Utilizzare 'rotateBy'.Consulta l'API, sarà il tuo nuovo strumento di animazione preferito –

+0

Grazie. C'è un modo per controllare il senso di rotazione? –