Saya menggunakan a RotateAnimation
untuk memutar gambar yang saya gunakan sebagai pemintal siklus khusus di Android. Ini rotate_indefinitely.xml
file saya , yang saya tempatkan di 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" />
Ketika saya menerapkan ini pada ImageView
penggunaan saya AndroidUtils.loadAnimation()
, itu berfungsi dengan baik!
spinner.startAnimation(
AnimationUtils.loadAnimation(activity, R.anim.rotate_indefinitely) );
Masalahnya adalah rotasi gambar tampaknya berhenti di bagian atas setiap siklus.
Dengan kata lain, gambar berputar 360 derajat, berhenti sebentar, lalu berputar 360 derajat lagi, dll.
Saya menduga bahwa masalahnya adalah bahwa animasi menggunakan interpolator default seperti android:iterpolator="@android:anim/accelerate_interpolator"
( AccelerateInterpolator
), tapi saya tidak tahu bagaimana mengatakannya untuk tidak menginterpolasi animasi.
Bagaimana saya bisa mematikan interpolasi (jika memang itu masalahnya) untuk membuat siklus animasi saya lancar?
Saya punya masalah ini juga, dan mencoba mengatur interpolator linier dalam xml tanpa hasil. Solusi yang berhasil bagi saya adalah membuat animasi sebagai RotateAnimation dalam kode.
sumber
rotate.setFillAfter(true);
rotate.setRepeatCount(Animation.INFINITE);
Ini berfungsi dengan baik
Untuk membalikkan rotasi:
sumber
Mungkin, sesuatu seperti ini akan membantu:
Omong-omong, Anda dapat memutar lebih dari 360 seperti:
sumber
Coba gunakan
toDegrees="359"
karena 360 ° dan 0 ° sama.sumber
Coba ini.
sumber
Rotasi Obyek secara terprogram.
// rotasi searah jarum jam :
// Rotasi berlawanan arah jarum jam:
lihat adalah objek ImageView Anda atau widget lainnya.
rotate.setRepeatCount (10); gunakan untuk mengulang rotasi Anda.
500 adalah durasi waktu animasi Anda.
sumber
Pemangkasan
<set>
-Element yang membungkus<rotate>
-Element memecahkan masalah!Terima kasih untuk Shalafi!
Jadi Rotation_ccw.xml Anda akan terlihat seperti ini:
sumber
Tidak peduli apa yang saya coba, saya tidak bisa mendapatkan ini berfungsi dengan benar menggunakan kode (dan setRotation) untuk animasi rotasi halus. Apa yang akhirnya saya lakukan adalah membuat perubahan derajat sangat kecil, sehingga jeda kecil tidak terlihat. Jika Anda tidak perlu melakukan terlalu banyak rotasi, waktu untuk mengeksekusi loop ini dapat diabaikan. Efeknya adalah rotasi yang halus:
sumber
Seperti Hanny telah disebutkan di atas menempatkan liner iterpolator baik-baik saja. Tetapi jika rotasi ada di dalam set Anda harus meletakkan android: shareInterpolator = "false" untuk membuatnya lancar.
Jika Sharedinterpolator tidak salah, kode di atas memberikan gangguan.
sumber
Jika Anda menggunakan animasi set seperti saya, Anda harus menambahkan interpolasi di dalam tag set:
Itu berhasil bagi saya.
sumber
Di Kotlin:
sumber
Apakah mungkin karena Anda beralih dari 0 ke 360, Anda menghabiskan sedikit lebih banyak waktu pada 0/360 daripada yang Anda harapkan? Mungkin diatur ke Derajat ke 359 atau 358.
sumber
Cobalah untuk menggunakan lebih dari 360 untuk menghindari memulai kembali.
Saya menggunakan 3600 insted of 360 dan ini berfungsi dengan baik untuk saya:
sumber
Di Android, jika Anda ingin menghidupkan objek dan membuatnya memindahkan objek dari location1 ke location2, API animasi menentukan lokasi perantara (tweening) dan kemudian mengantri ke utas utama operasi pemindahan yang tepat pada waktu yang tepat menggunakan penghitung waktu . Ini berfungsi dengan baik kecuali bahwa utas utama biasanya digunakan untuk banyak hal lain - melukis, membuka file, menanggapi input pengguna dll. Timer yang antri sering dapat ditunda. Program yang ditulis dengan baik akan selalu mencoba melakukan sebanyak mungkin operasi di utas latar (non utama) namun Anda tidak dapat selalu menghindari menggunakan utas utama. Operasi yang mengharuskan Anda beroperasi pada objek UI selalu harus dilakukan di utas utama. Juga, banyak API akan menyalurkan operasi kembali ke utas utama sebagai bentuk keselamatan utas.
Tampilan semuanya digambar pada utas GUI yang sama yang juga digunakan untuk semua interaksi pengguna.
Jadi jika Anda perlu memperbarui GUI dengan cepat atau jika rendering terlalu banyak waktu dan memengaruhi pengalaman pengguna, gunakan SurfaceView.
Contoh gambar rotasi:
aktivitas:
sumber
sumber