TL; DR: Saya mencari sampel kerja lengkap dari skenario yang akan saya sebut sebagai "animasi tiga-fragmen Gmail". Secara khusus, kami ingin memulai dengan dua fragmen, seperti ini:
Setelah beberapa acara UI (misalnya, mengetuk sesuatu di Fragment B), kami ingin:
- Fragmen A untuk menggeser layar ke kiri
- Fragmen B untuk meluncur ke tepi kiri layar dan menyusut untuk mengambil tempat yang dikosongkan oleh Fragment A
- Fragmen C untuk meluncur dari sisi kanan layar dan untuk mengambil tempat yang dikosongkan oleh Fragment B
Dan, pada tombol BACK tekan, kami ingin set operasi dibalik.
Sekarang, saya telah melihat banyak implementasi parsial; Saya akan mengulas empat di antaranya di bawah ini. Selain tidak lengkap, mereka semua memiliki masalah.
@Reto Meier menyumbangkan jawaban populer ini untuk pertanyaan dasar yang sama, yang menunjukkan bahwa Anda akan menggunakannya setCustomAnimations()
dengan a FragmentTransaction
. Untuk skenario dua fragmen (misalnya, Anda hanya melihat Fragmen A pada awalnya, dan ingin menggantinya dengan Fragmen B baru menggunakan efek animasi), saya setuju sepenuhnya. Namun:
- Karena Anda hanya dapat menentukan satu animasi "dalam" dan satu "keluar", saya tidak dapat melihat bagaimana Anda akan menangani semua animasi berbeda yang diperlukan untuk skenario tiga-fragmen
- Dalam
<objectAnimator>
kode sampelnya menggunakan posisi kabel dalam piksel, dan itu tampaknya tidak praktis mengingat berbagai ukuran layar, namunsetCustomAnimations()
membutuhkan sumber daya animasi, menghalangi kemungkinan mendefinisikan hal-hal ini di Jawa - Saya bingung bagaimana objek animator untuk skala terkait dengan hal-hal seperti
android:layout_weight
dalamLinearLayout
untuk mengalokasikan ruang berdasarkan persentase - Saya bingung bagaimana Fragment C ditangani sejak awal (
GONE
?android:layout_weight
Dari0
? Pra-animasi ke skala 0? Sesuatu yang lain?)
@Roman Nurik menunjukkan bahwa Anda dapat menghidupkan properti apa pun , termasuk properti yang Anda tetapkan sendiri. Itu dapat membantu menyelesaikan masalah posisi terprogram, dengan biaya menemukan subclass manajer tata letak kustom Anda sendiri. Itu membantu beberapa orang, tetapi saya masih bingung dengan sisa solusi Reto.
Penulis entri pastebin ini menunjukkan beberapa pseudocode yang menggiurkan, pada dasarnya mengatakan bahwa ketiga fragmen akan berada di dalam wadah pada awalnya, dengan Fragment C yang tersembunyi di awal melalui hide()
operasi transaksi. Kami kemudian show()
C dan hide()
A ketika acara UI terjadi. Namun, saya tidak melihat bagaimana itu menangani fakta bahwa B berubah ukuran. Itu juga bergantung pada fakta bahwa Anda tampaknya dapat menambahkan beberapa fragmen ke wadah yang sama, dan saya tidak yakin apakah itu perilaku yang dapat diandalkan dalam jangka panjang (belum lagi harus rusak findFragmentById()
, meskipun saya bisa hidup dengan itu).
Penulis posting blog ini menunjukkan bahwa Gmail tidak menggunakan setCustomAnimations()
sama sekali, melainkan langsung menggunakan animator objek ("Anda hanya mengubah margin kiri tampilan root + mengubah lebar tampilan kanan"). Namun, ini masih merupakan solusi dua-fragmen AFAICT, dan implementasinya sekali lagi menunjukkan dimensi kabel dalam piksel.
Saya akan terus menghubungkan ini, jadi saya mungkin akan menjawab ini sendiri suatu hari nanti, tetapi saya benar-benar berharap bahwa seseorang telah menemukan solusi tiga-fragmen untuk skenario animasi ini dan dapat memposting kode (atau tautannya). Animasi di Android membuat saya ingin mencabut rambut saya, dan Anda yang telah melihat saya tahu bahwa ini adalah upaya yang tidak membuahkan hasil.