واجه العديد من المطورين لنظام Android مشكلة تطبيق الرسوم المتحركة والانتقالات عند فتح أجزاء جديدة. نحن مدعوون إلى استخدام إما إضافة شظايا إلى الحاوية ، ووضعها فوق بعضها البعض ، أو إعادة تشغيلها (استبدال قطعة بأخرى). لدى الإعادة أربعة أنواع من الرسوم المتحركة:
نعيش كل شيء يبدو مثل هذا:.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()

مشكلة الإعادة هي أن أ) تم تدمير الجزء السابق ، ب) لا توجد طريقة لتعيين إجراء لإغلاق الجزء بإيماءة (على سبيل المثال ، كما هو مطبق في Google Inbox).
تتيح لك إضافة أجزاء إلى المكدس (إضافة) استخدام الرسوم المتحركة فقط للجزء الذي سيتم فتحه ، أما الجزء الخلفي فسيكون بلا حراك.
وكل هذا ، بطبيعة الحال ، يرافقه إطارات ضعيفة الأداء ومكسورة.
نتيجة لذلك ، حتى التطبيقات الكبيرة مثل VKontakte أو Instagram لا تستخدم الرسوم المتحركة الجزئية على الإطلاق في تطبيقاتها.
قبل عام ونصف ، قدمت Telegram Telegram x (نسخة تجريبية من عميلها). لقد حلوا هذه المشكلة مثل هذا:

هنا ، يتم تنفيذ الرسوم المتحركة للشظايا الأمامية والخلفية ، وكذلك القدرة على إغلاق الشظايا بإيماءة.
تمكنت من القيام بشيء مشابه وأرغب في مشاركة طريقة فتح الأجزاء:

لذلك ، قم بإنشاء فئة 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 }
الآن لدينا Navigator ، والذي نستخدمه كحاوية لجميع الأجزاء في نشاطنا:
<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"/>
خلفية مجموعة سوداء. هذا ضروري لمحاكاة الظل على الجزء المغلق. كذلك سيكون أكثر وضوحا.
نحتاج الآن إلى محول نضع فيه الأجزاء:
class NavigatorAdapter(val fragmentManager: FragmentManager) : FragmentStatePagerAdapter(fragmentManager) {
إنشاء محول على الفور لمتصفحنا:
class NavigatorPageTransformer : ViewPager.PageTransformer { override fun transformPage(view: View, position: Float) {
الآن - الأكثر إثارة للاهتمام! نصف الإجراءات اللازمة لفتح الأجزاء في نشاطنا:
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)
هذا ، في الواقع ، هو كل شيء. الآن في أي جزء نسميه الطريقة من Activiti:
(activity as MainActivity).addFragment(ConversationFragment())
وعند التمرير إلى اليمين ، سيتم إزالته هو نفسه من المكدس بمساعدة مستمع OnPageChangeListener الخاص بنا.
هذه الطريقة ليست مثالية ، فربما تفتح بعض العثرات في مزيد من التطوير ، لكنني لم أجد حتى الآن أي مشكلات في قابليتها للاستخدام ، وربما يقوم المطورين ذوي الخبرة بتصحيح لي أو إخباري بشيء. يمكنك أن ترى كيف يعمل كل شيء على مثال حقيقي هنا .