Banyak pengembang untuk Android menghadapi masalah penerapan animasi dan transisi ketika membuka fragmen baru. Kami diundang untuk menggunakan salah satu dari menambahkan fragmen ke wadah, meletakkannya di atas satu sama lain, atau memutar ulang (mengganti satu fragmen dengan yang lain). Putar ulang memiliki empat jenis animasi:
Hidupkan semuanya terlihat seperti ini:.beginTransaction() .setCustomAnimations( R.anim.enter_from_left, // 2 R.anim.exit_to_right, // 1 R.anim.enter_from_right, // 1 R.anim.exit_to_left) // 2 .replace(R.id.container, myFragment) .commit()

Masalah dengan replay adalah bahwa a) fragmen sebelumnya dihancurkan, b) tidak ada cara untuk mengatur tindakan untuk menutup fragmen dengan gerakan (misalnya, seperti yang diterapkan di Google Inbox).
Menambahkan fragmen ke tumpukan (add) memungkinkan Anda untuk menggunakan animasi hanya agar fragmen dibuka, bagian belakang tidak akan bergerak.
Dan semua ini, tentu saja, disertai dengan rendering yang buruk dan bingkai yang rusak.
Akibatnya, bahkan aplikasi besar seperti VKontakte atau Instagram tidak menggunakan animasi fragmen sama sekali dalam aplikasi mereka.
Setahun setengah yang lalu, Telegram memperkenalkan Telegram x (versi uji kliennya). Mereka memecahkan masalah ini seperti ini:

Di sini, animasi dari fragmen depan dan belakang diimplementasikan, serta kemampuan untuk menutup fragmen dengan gerakan.
Saya berhasil melakukan sesuatu yang serupa dan saya ingin berbagi metode saya membuka fragmen:

Jadi, buat kelas NavigatorViewPager:
class NavigatorViewPager : ViewPager { init { init() } constructor(context: Context) : super(context) constructor(context: Context, attributeSet: AttributeSet) : super(context, attributeSet) override fun canScrollHorizontally(direction: Int): Boolean { return false }
Sekarang kami memiliki Navigator kami, yang kami gunakan sebagai wadah untuk semua fragmen di Aktivitas kami:
<info.yamm.project2.navigator.NavigatorViewPager xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/navigator_view_pager" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/black" android:fitsSystemWindows="false" tools:context=".activities.MainActivity"/>
Latar belakang hitam. Ini diperlukan untuk mensimulasikan bayangan pada fragmen yang tertutup. lebih jauh akan lebih jelas.
Sekarang kita membutuhkan adaptor untuk meletakkan fragmen:
class NavigatorAdapter(val fragmentManager: FragmentManager) : FragmentStatePagerAdapter(fragmentManager) {
Segera buat Transformer untuk Navigator kami:
class NavigatorPageTransformer : ViewPager.PageTransformer { override fun transformPage(view: View, position: Float) {
Sekarang - yang paling menarik! Kami meresepkan tindakan yang diperlukan untuk membuka fragmen di Aktivitas kami:
class MainActivity : BaseActivity() { private lateinit var navigatorAdapter: NavigatorAdapter private lateinit var navigatorViewPager: NavigatorViewPager private lateinit var mainFragment: MainFragment override fun onCreate(savedInstanceState: Bundle?) { setTheme(info.yamm.project2.R.style.AppTheme)
Faktanya, itu saja. Sekarang pada setiap fragmen yang kita sebut metode dari Activiti:
(activity as MainActivity).addFragment(ConversationFragment())
Dan ketika menggesek ke kanan, ia sendiri akan dihapus dari tumpukan dengan bantuan pendengar OnPageChangeListener kami.
Metode ini tidak ideal, mungkin beberapa perangkap akan terbuka dalam pengembangan lebih lanjut, tetapi saya belum menemukan masalah kegunaan, mungkin pengembang yang berpengalaman akan memperbaiki saya atau memberi tahu saya sesuatu. Anda dapat melihat cara kerjanya pada contoh nyata di sini .