Animierend und drehen Sie ein Bild in einer Oberfläche Anzeigen
Möchte ich animieren, um die Bewegung auf einem SurfaceView . Idealerweise würde ich auch gerne benachrichtigt werden, sobald die animation beendet hatte.
Zum Beispiel:
Ich könnte ein Auto haben, das nach Norden. Wenn ich animieren wollte es so, dass es nach Süden für eine Dauer von 500ms, wie konnte ich das tun?
Ich bin mit einer SurfaceView, so dass alle Animationen müssen in die Hand genommen werden, ich glaube nicht, dass ich kann verwenden Sie XML-oder android-Animator-Klassen.
Außerdem würde ich gerne wissen, der beste Weg, um zu animieren, etwas kontinuierlich innerhalb einer SurfaceView (ie. ein Spaziergang-Zyklus)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bilder drehen, manuell kann ein bisschen Schmerz, aber hier ist, wie ich es getan habe.
Dreht Ihr carBitmap zu was auch immer Winkel, den Sie angeben, in die angegebene Zeit + die Zeit zum zeichnen des letzten Frames. Allerdings gibt es einen Haken. Dieses dreht Ihr carBitmap ohne Anpassung seiner position auf dem Bildschirm, richtig. Je nachdem, wie Sie zeichnen, Ihre bitmaps, könnten Sie am Ende mit Ihrem carBitmap drehen, während die top-linken Ecke der bitmap bleibt an Ort und Stelle. Als das Auto sich dreht, wird das bitmap dehnen und passen sich dem neuen Auto Größe, füllen die Lücken um es mit transparenten Pixeln. Es ist schwer zu beschreiben, wie diese Aussehen würde, also hier ein Beispiel für ein sich drehendes Quadrat:
Der graue Bereich stellt die volle Größe der bitmap, und ist gefüllt mit transparenten Pixeln. Um dieses problem zu lösen, müssen Sie die Verwendung der Trigonometrie. Es ist ein bisschen kompliziert... wenn das endet als ein problem für Sie (ich weiß nicht, wie Sie zeichnen, Ihre bitmaps auf der Leinwand-so könnte es nicht sein), und Sie können nicht herausfinden, die Lösung, lass es mich wissen und ich werde posten, wie ich es Tat.
(Ich weiß nicht, ob dies der effizienteste Weg, es zu tun, aber es funktioniert für mich, solange das bitmap kleiner als 300x300 oder so. Vielleicht, wenn jemand weiß, einen besseren Weg, Sie konnten uns sagen!)
canvas.drawBitmap()
. Auch, dass die while-Schleife wird verhindern, dass etwas anderes von animierend bis Ihre umdrehung vollendet. Versuchen Sie, ein Spiel-Schleife: koonsolo.com/news/dewitters-gameloopWollen Sie mehrere unabhängige animierte Objekt? Wenn ja, dann sollten Sie eine game loop. (Ein master-while-Schleife, die inkrementell aktualisiert, alle Objekte im Spiel.) Hier ist eine gute Diskussion auf verschiedenen loop-Implementierungen. (Ich bin derzeit mit "FPS abhängig Konstante Geschwindigkeit des Spiels" für mein Android-Spiele-Projekt.)
So, dann wird dein Auto Aussehen (viel code fehlt):
Brauchen Sie nur zum laden der bitmap einmal. Also, wenn Sie mehrere Autos, möchten Sie vielleicht, um jedem von Ihnen die gleiche Bitmap-Objekt (cache-Speicher der Bitmap in deiner SurfaceView).
Habe ich noch nicht in Fuss-Animationen noch nicht, aber die einfachste Lösung ist es, mehrere Bitmaps und zeichnen Sie einfach eine andere bitmap jedes mal, wenn die Anzeige aufgerufen wird.
Haben Sie einen Blick auf lunarlander.LunarView in der Android-docs, wenn Sie nicht bereits getan haben.
Wenn Sie benachrichtigt werden möchten, wenn die animation abgeschlossen ist, sollten Sie einen Rückruf.
Ihre Logik-Klasse implementiert die callback-und haben Ihr Auto es nennen, wenn der Spielzug abgeschlossen (in
update()
). Beachten Sie, dass Sie erhalten eine ConcurrentModificationException, wenn Sie iterieren über eine Liste von Autos inupdate_game()
und Sie versuchen zu entfernen, der ein Auto aus dieser Liste in Ihren Rückruf. (Sie können dies lösen, mit einer command queue.)