Android 片段:输入和 return 的不同动画

Android Fragment: Different animations for enter and return

我正在展示一个使用 androidx 导航架构组件的片段。

片段由 ArcMotion 共享元素过渡显示,但退出过渡应该是简单的向下滑动。

我正在通过以下方式展示片段:

findNavController().navigate(
    EntriesFragmentDirections.actionEntriesFragmentToNewBookEntryFragment(
        bookEntryType = mEntriesViewPager.currentItem,
        enterTransition = R.transition.new_book_entry_enter,
        exitTransition = R.transition.new_book_entry_exit
    ),
    FragmentNavigatorExtras(fabEntriesNewBookEntry to getString(R.string.transition_new_book_entry_fragment))
)

然后我在 onCreate:

的片段中应用转换
sharedElementEnterTransition = TransitionInflater.from(requireContext()).inflateTransition(args.enterTransition)
exitTransition = TransitionInflater.from(requireContext()).inflateTransition(args.exitTransition)

进入过渡效果很好,但退出过渡仍然是相反的进入过渡。

进入转换xml:

<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:duration="@android:integer/config_mediumAnimTime">

    <transition
        class="at.guger.moneybook.ui.transition.MorphTransform"
        app:endColor="?colorSurface"
        app:endCornerRadius="@dimen/zero"
        app:startColor="?colorSecondary"
        app:startCornerRadius="@dimen/fabRadius" />

</transitionSet>

退出转换xml:

<?xml version="1.0" encoding="utf-8"?>
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="@android:integer/config_mediumAnimTime">

    <slide android:slideEdge="bottom" />

</transitionSet>

这里的解决方案是膨胀片段中的转换 onCreate:

private val args: NewBookEntryFragmentArgs by navArgs()

override fun onCreate(savedInstanceState: Bundle?) {
    if (Utils.isLollipop() && args.enterTransition > 0 && args.exitTransition > 0) {
        sharedElementEnterTransition = TransitionInflater.from(requireContext()).inflateTransition(args.enterTransition)
        sharedElementReturnTransition = null
        returnTransition = TransitionInflater.from(requireContext()).inflateTransition(args.exitTransition)
}

导航调用如下所示:

findNavController().navigate(
    EntriesFragmentDirections.actionEntriesFragmentToNewBookEntryFragment(
        bookEntryType = mEntriesViewPager.currentItem,
        enterTransition = R.transition.new_book_entry_enter,
        exitTransition = R.transition.new_book_entry_exit
    ),
    FragmentNavigatorExtras(fabEntriesNewBookEntry to getString(R.string.transition_new_book_entry_fragment))
)

new_book_entry_enter.xml:

<?xml version="1.0" encoding="utf-8"?>
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:duration="@android:integer/config_mediumAnimTime">

    <transition
        class="at.guger.moneybook.ui.transition.MorphTransform"
        app:endColor="?colorSurface"
        app:endCornerRadius="@dimen/zero"
        app:startColor="?colorSecondary"
        app:startCornerRadius="@dimen/fabRadius" />

</transitionSet>

new_book_entry_exit.xml:

<?xml version="1.0" encoding="utf-8"?>
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="@android:integer/config_mediumAnimTime">

    <slide
        android:interpolator="@android:interpolator/accelerate_quint"
        android:slideEdge="bottom" />

</transitionSet>