13

The two states of the imageObróć animację Imagewith

co mam

Mam strzałki obraz (podobnie jak lewa). Kiedy użytkownik go kliknie, powinien obrócić się o 180 stopni z animacją i powinien wyglądać jak właściwy.

co zrobiłem

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) { 

      } 
     }); 
    } 

problem

widzę, że animacja działa dobrze, ale nie podczas ustawiania obrazu jest trochę migotanie. Może być z powodu różnicy czasu, kiedy animacja się kończy i obraz jest ustawiony.

Jak mogę usunąć ten problem z migotaniem? Czy masz lepsze podejście do tego?

Odpowiedz

34

Przede wszystkim, co jest Ci minimalny wymóg SDK? W przypadku, gdy jest to co najmniej Android 3.0, można użyć nowszej ramy animacji i animacji obrazu z mniej więcej tak:

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

O migotania: Nie chciałbym przywrócić obraz źródłowy ImageView po obrocie , Po prostu zostawię oryginał i upewnię się, że animacja rotacji wypełnia się po animacji, pozostawiając obraz obrócony. Migotanie jest najprawdopodobniej spowodowane przesunięciem/przerysowaniem widoku po zmianie obrazu źródłowego.

Kolejne artefakty wizualne (migotanie?) Mogą być spowodowane tym, że oryginał obrócony obraz i obrócony obraz statyczny może różnić się o kilka pikseli.

+0

Obrazek obraca się tylko raz, kiedy go naciskam. Ale powinien się znów obracać po ponownym naciśnięciu i tak dalej. Ale tak się nie dzieje. Dowolny pomysł? –

+2

Cóż, w przypadku, gdy korzystasz z podanego przeze mnie przykładu kodu, ten kod mówi dokładnie, aby wyświetlić "obrót do 180 stopni". Więc jeśli jest już obrócony o 180 stopni, to nic nie da. W odbiorniku kliknięć można np. sprawdź bieżący obrót widoku (.getRotation), a jeśli nie jest 0, to obróć go z powrotem do 0 w podobny sposób. –

+0

Tak, właśnie to zrobiłem i to zadziałało. Czy istnieje sposób kontrolowania kierunku animacji podczas obracania do 0. Mam na myśli, że obraca się w określonym kierunku, ale chcę iść w odwrotny sposób. –

1

Możesz użyć setFillAfter, jeśli chcesz utrzymać stan animacji.

+0

Mniej wyborców, czy chcesz wyjaśnić powód? – Rajesh

2

Dlaczego nie używasz programu RotateAnimation?

utworzyć folder o nazwie anim w res i plik o nazwie rotator.xml wewnątrz 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"/> 

Tutaj jeden pełny obrót zostanie ukończony w 4000 ms (4 sekundy). Teraz dodaj obraz PNG, który chcesz obrócić do swojego folderu do rysowania. Następnie otwórz res/main.xml, po usunięciu domyślnego textView w layoucie, dodaj ImageView i Button do układu. Ustaw właściwość src ImageView jako nazwę pliku dodawanego obrazu, na przykład android: src = "@ drawable/myimg" Ok, pozwala edytować główną klasę. W onClick() dla przycisku dodaj niezbędny kod do uruchomienia animacji. Sprawdź poniższy kod.

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

Twój kod zawiera wszystkie rodzaje błędów .. – Debasish

4

Gdybym był tobą, użyłbym ViewPropertyAnimator (dostępny od API 12). Jego składnia jest prostsza IMO.
Wykorzystanie byłoby:

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

To samo, co poprzednia odpowiedź. Ale w jaki sposób zapewnić rotację za każdym razem, gdy naciskam obraz? Na razie to się dzieje tylko raz. –

+1

Użyj "rotateBy".Zajrzyj do API, to będzie twoje nowe ulubione narzędzie do animacji –

+0

Dzięki. Czy istnieje sposób kontrolowania kierunku obrotu? –