【问题标题】:Android fragment animationAndroid片段动画
【发布时间】:2023-04-02 13:18:02
【问题描述】:

我有片段 A 和片段 B。A 已添加并显示。我想将 B 添加到带有自定义动画的事务中。当B从右侧进入时,A必须从左侧退出,并且他们必须同时以相同的速度一起做。我怎样才能做到这一点?

示例图片:Here(图片显示为使用 ViewPager,但我无法使用 ViewPager)

感谢您的帮助。

【问题讨论】:

    标签: android android-fragments animation fragment


    【解决方案1】:

    首先定义你想要的动画,像这样在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);`
    

    【讨论】:

      【解决方案2】:

      您需要两个动画 - 片段 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

      【讨论】:

      • 感谢您的回答,我会试试这个。但是,我需要使用 .add() 而不是 .replace() 我可以使用 add() 方法吗?
      • 因为我不想在点击 onBackPress 时刷新片段。
      猜你喜欢
      • 1970-01-01
      • 2011-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-26
      • 2012-06-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多