Android Bildansicht drehen, kann ich die endgültige Position von Bildansicht in onAnimationEnd ()

8

Ich möchte eine Bildansicht von 30 Grad bei jedem Klick auf eine Schaltfläche drehen.

Beim ersten Klick kann ich die Animation richtig einstellen, aber es gelingt mir nicht, die Bildansicht nach der Animation zu aktualisieren. Wenn ich erneut auf die Schaltfläche klicke, beginnt die Animation von der ursprünglichen Position der Bildansicht und nicht von der endgültigen Position nach der ersten Animation.

Hier ist mein Code:

%Vor%

Ich denke, das Problem kam von der Art, wie ich die Position in onAnimationEnd () verwirkliche.

ps: Entschuldigung für mein schlechtes Englisch ...

    
colorado 08.05.2011, 15:35
quelle

1 Antwort

15

Das Problem ist, dass Ihre Animation nicht dasselbe Objekt wie Ihre Matrixrotation beeinflusst. Das heißt, Sie animieren die Drehung des ImageView-Objekts, aber Sie legen dann die Drehung des Bilds fest, das sich in diesem ImageView-Objekt befindet. Wenn Sie zum Beispiel das erste Mal drehen, dreht sich der ImageView von 0 bis 30 Grad und bleibt dann bei einer Drehung von 30 Grad aufgrund des Aufrufs von setFillAfter (true). Dann wird der onAnimationEnd () - Handler ausgeführt, der das interne Bild um 30 Grad dreht. Dadurch springt das Bild effektiv in eine Drehung von 60 Grad, wie vom Benutzer gesehen (30 für die Ansicht, 30 für die Bitmap). Beim nächsten Mal, wenn die Animation ausgeführt wird, wird die Ansicht von 0 auf 30 Grad gedreht, wobei das interne Bild immer noch um 30 Grad gedreht ist. Dadurch sieht es für den Benutzer aus, als würde es sich von 30 bis 60 Grad drehen. Dann wenden Sie eine weitere Drehung auf das interne Bild an, wenn die Animation beendet ist. Das Bild wird schließlich um 60 Grad gedreht und die Ansicht wird (wieder) um 30 Grad gedreht, sodass das Bild jetzt visuell um 90 Grad gedreht wird.

Und so weiter.

Es gibt verschiedene Möglichkeiten, dieses Problem zu lösen, aber eine einfache Möglichkeit besteht darin, die beiden verschiedenen Objekte nicht zu beeinflussen - arbeiten Sie einfach mit ImageView. Anstatt von 0 bis 30 zu rotieren, drehen Sie sich von der aktuellen Rotation auf diesen Wert plus 30 Grad. Sie können den onAnimationEnd () - Handler entfernen, da Sie das Bild nicht mehr innerhalb der Ansicht drehen müssen.

Der resultierende Code für turn () ist viel einfacher:

%Vor%

Dieser Code nimmt eine Instanzvariable von currentRotation an, mit der die letzten Grad der Drehung der Ansicht verfolgt werden. Es ist etwas komplizierter, wenn Sie dem Benutzer erlauben, auf die mittlere Animation zu klicken, aber nicht zu schwierig.

Das ist übrigens im Animationssystem in 3.0 viel einfacher; Es gibt jetzt eine Eigenschaft "Rotation" in der Ansicht, und Sie können eine Animation für diese Eigenschaft ausführen, und sie kann ihren eigenen aktuellen Wert verfolgen. Aber der obige Ansatz sollte für ältere Versionen funktionieren.

    
Chet Haase 14.05.2011, 01:50
quelle