【发布时间】:2023-04-02 13:18:02
【问题描述】:
我有片段 A 和片段 B。A 已添加并显示。我想将 B 添加到带有自定义动画的事务中。当B从右侧进入时,A必须从左侧退出,并且他们必须同时以相同的速度一起做。我怎样才能做到这一点?
示例图片:Here(图片显示为使用 ViewPager,但我无法使用 ViewPager)
感谢您的帮助。
【问题讨论】:
标签: android android-fragments animation fragment
我有片段 A 和片段 B。A 已添加并显示。我想将 B 添加到带有自定义动画的事务中。当B从右侧进入时,A必须从左侧退出,并且他们必须同时以相同的速度一起做。我怎样才能做到这一点?
示例图片:Here(图片显示为使用 ViewPager,但我无法使用 ViewPager)
感谢您的帮助。
【问题讨论】:
标签: android android-fragments animation fragment
首先定义你想要的动画,像这样在res/anim中
left_out.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromXDelta="0"
android:toXDelta="-100%p"
android:duration="@android:integer/config_longAnimTime"/>
</set>
left_in.xml 将是相同的,除了 + toXDelta
right_in.xml
<translate
android:fromXDelta="-100%p"
android:toXDelta="0"
android:duration="@android:integer/config_longAnimTime"/>
</set>
然后,在片段 A 的onAttach 上'left-out'
overridePendingTransition(R.anim.left_in, R.anim.left_out);
对于片段 B,使用
overridePendingTransition(R.anim.right_in, R.anim.right_out);`
【讨论】:
您需要两个动画 - 片段 A 将使用 exit_left.xml 作为其 EXIT 动画,片段 B 将使用 enter_right.xml 作为其 ENTER 动画。
首先,当我们将 FragmentA 附加到 Activity 时,我们设置它的 EXIT 动画:
FragmentA fragmentA = new FragmentA();
getSupportFragmentManager()
.beginTransaction()
.setCustomAnimations(R.anim.fragment_a_enter, R.anim.exit_left)
.add(R.id.container, fragmentA, FRAGMENT_A_TAG)
.commit();
然后,我们想用 FragmentB 替换 FragmentA。所以我们需要为 FragmentB 设置 ENTER 动画。
FragmentB fragmentB = new FragmentB();
getSupportFragmentManager()
.beginTransaction()
.setCustomAnimations(R.anim.enter_right, R.anim.fragment_b_exit)
.replace(R.id.container, fragmentB, FRAGMENT_B_TAG)
.commit();
注意:setCustomAnimations 还接受两个可选参数 popEnter 和 popExit,当按下返回按钮时,它们将动画片段更改。如果需要,您需要将addToBackStack() 添加到方法链中。
将以下动画文件放在res/anim目录下:
enter_right.xml
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false">
<translate android:fromXDelta="100%" android:toXDelta="0%"
android:fromYDelta="0%" android:toYDelta="0%"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:duration="@android:integer/config_mediumAnimTime"/>
请注意我们如何将 X 值从 100%(一直向右)转换为 0%。这将从右到左滑入 FragmentB。
最后,我们需要一个exit_left 动画,用于FragmentA 向左退出。我们将把这个视图从 0% 移到 -100%。
exit_left.xml
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false">
<translate android:fromXDelta="0%" android:toXDelta="-100%"
android:fromYDelta="0%" android:toYDelta="0%"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:duration="@android:integer/config_mediumAnimTime"/>
希望这会有所帮助!您可以在此处了解有关 FragmentTransaction 和 setCustomAnimations 方法的更多信息:
https://developer.android.com/reference/android/app/FragmentTransaction.html
【讨论】: