Używam RotateAnimation
do obracania obrazu, którego używam jako niestandardowego cyklicznego pokrętła w Androidzie. Oto mój rotate_indefinitely.xml
plik, który umieściłem w res/anim/
:
<?xml version="1.0" encoding="UTF-8"?>
<rotate
xmlns:android="http://schemas.android.com/apk/res/android"
android:fromDegrees="0"
android:toDegrees="360"
android:pivotX="50%"
android:pivotY="50%"
android:repeatCount="infinite"
android:duration="1200" />
Kiedy zastosuję to do mojego ImageView
użycia AndroidUtils.loadAnimation()
, działa świetnie!
spinner.startAnimation(
AnimationUtils.loadAnimation(activity, R.anim.rotate_indefinitely) );
Jedynym problemem jest to, że obrót obrazu wydaje się zatrzymywać u góry każdego cyklu.
Innymi słowy, obraz obraca się o 360 stopni, zatrzymuje się na chwilę, a następnie ponownie obraca o 360 stopni itp.
Podejrzewam, że problem polega na tym, że animacja korzysta z domyślnego interpolatora, takiego jak android:iterpolator="@android:anim/accelerate_interpolator"
( AccelerateInterpolator
), ale nie wiem, jak powiedzieć jej, aby nie interpolowała animacji.
Jak mogę wyłączyć interpolację (jeśli to rzeczywiście jest problem), aby cykl animacji przebiegał płynnie?
Miałem również ten problem i bez powodzenia próbowałem ustawić interpolator liniowy w xml. Rozwiązaniem, które działało dla mnie, było utworzenie animacji jako RotateAnimation w kodzie.
źródło
rotate.setFillAfter(true);
rotate.setRepeatCount(Animation.INFINITE);
To działa dobrze
Aby odwrócić obrót:
źródło
Może coś takiego pomoże:
Nawiasem mówiąc, możesz obracać o ponad 360, jak:
źródło
Spróbuj użyć,
toDegrees="359"
ponieważ 360 ° i 0 ° są takie same.źródło
Spróbuj tego.
źródło
Obiekt rotacyjny programowo.
// zgodnie z ruchem wskazówek zegara :
// Obrót w lewo:
widok jest przedmiotem twojego ImageView lub innych widżetów.
rotate.setRepeatCount (10); użyj, aby powtórzyć obrót.
500 to czas trwania animacji.
źródło
Przycinanie
<set>
elementu, który owinął<rotate>
-Element, rozwiązuje problem!Dzięki Shalafi!
Więc Twój plik Rotation_ccw.xml powinien wyglądać następująco:
źródło
Bez względu na to, co próbowałem, nie mogłem tego poprawnie uruchomić za pomocą kodu (i setRotation) do płynnej animacji obrotu. Skończyło się na tym, że zmiany stopni były tak małe, że małe przerwy były niezauważalne. Jeśli nie trzeba wykonywać zbyt wielu obrotów, czas wykonania tej pętli jest znikomy. Efektem jest płynny obrót:
źródło
Jak wspomniano powyżej Hanry, umieszczenie wkładki iterpolator jest w porządku. Ale jeśli rotacja jest w zestawie, musisz ustawić Androida: shareInterpolator = "false", aby było gładkie.
Jeśli Sharedinterpolator nie jest fałszywy, powyższy kod powoduje usterki.
źródło
Jeśli używasz zestawu animacji takiego jak ja, powinieneś dodać interpolację wewnątrz tagu zestawu:
To działało dla mnie.
źródło
W Kotlinie:
źródło
Czy to możliwe, że ponieważ przechodzisz od 0 do 360, spędzasz trochę więcej czasu w 0/360, niż się spodziewasz? Być może ustaw na Stopnie na 359 lub 358.
źródło
Spróbuj użyć więcej niż 360, aby uniknąć ponownego uruchomienia.
Używam 3600 insted z 360 i to działa dobrze dla mnie:
źródło
W Androidzie, jeśli chcesz animować obiekt i zmusić go do przeniesienia obiektu z lokalizacji 1 do lokalizacji 2, interfejs API animacji wykrywa pośrednie lokalizacje (animacja), a następnie kolejkuje w głównym wątku odpowiednie operacje przesuwania w odpowiednich momentach za pomocą timera . Działa to dobrze, z tym wyjątkiem, że główny wątek jest zwykle używany do wielu innych rzeczy - malowania, otwierania plików, reagowania na dane wejściowe użytkownika itp. Czasomierz w kolejce może często być opóźniany. Dobrze napisane programy zawsze będą próbowały wykonać jak najwięcej operacji w wątkach działających w tle (innych niż główne), jednak nie zawsze można uniknąć używania głównego wątku. Operacje wymagające operacji na obiekcie interfejsu użytkownika zawsze muszą być wykonywane w głównym wątku. Ponadto wiele interfejsów API przeniesie operacje z powrotem do głównego wątku jako formę zabezpieczenia wątku.
Widoki są rysowane w tym samym wątku GUI, który jest również używany do wszystkich interakcji użytkownika.
Więc jeśli musisz szybko zaktualizować GUI lub jeśli renderowanie zajmuje zbyt dużo czasu i wpływa na wrażenia użytkownika, użyj SurfaceView.
Przykład obrotu obrazu:
czynność:
źródło
źródło