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>
我正在展示一个使用 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>