片段事务动画:滑入和滑出

gio*_*ozh 90 animation android android-fragments

我已经检查了片段之间动画事务的一些教程.我已经将这种方法用于动画,它的工作原理如下:

fragmentTransaction.setCustomAnimations(android.R.anim.slide_in_left,
                android.R.anim.slide_out_right);
Run Code Online (Sandbox Code Playgroud)

但我希望它的动画是倒置的:旧片段向左滑动,新片段向右滑动,但是R.anim文件的值似乎对我的范围没用.

我该怎么做?

nic*_*son 258

更新 适用于Android v19 +通过@Sandra 查看此链接

您可以创建自己的动画.放置动画XML文件res > anim

enter_from_left.xml

<?xml version="1.0" encoding="utf-8"?>
<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:duration="700"/>
</set>
Run Code Online (Sandbox Code Playgroud)

enter_from_right.xml

<?xml version="1.0" encoding="utf-8"?>
<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:duration="700" />
</set>
Run Code Online (Sandbox Code Playgroud)

exit_to_left.xml

<?xml version="1.0" encoding="utf-8"?>
<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:duration="700"/>
</set>
Run Code Online (Sandbox Code Playgroud)

exit_to_right.xml

<?xml version="1.0" encoding="utf-8"?>
<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:duration="700" />
</set>
Run Code Online (Sandbox Code Playgroud)

USAGE (请注意,您在事务中调用方法的顺序很重要.在调用.replace,.commit之前添加动画):

FragmentTransaction transaction = supportFragmentManager.beginTransaction();
transaction.setCustomAnimations(R.anim.enter_from_right, R.anim.exit_to_left, R.anim.enter_from_left, R.anim.exit_to_right);
transaction.replace(R.id.content_frame, fragment);
transaction.addToBackStack(null);
transaction.commit();
Run Code Online (Sandbox Code Playgroud)

  • 在替换片段时简单地使用这些xml动画,即:fragmentTransaction.setCustomAnimations(R.anim.enter_from_right,R.anim.exit_to_left,R.anim.enter_from_left,R.anim.exit_to_right); fragmentTransaction.replace(R.id.content_frame,fragDettRisorsa); fragmentTransaction.addToBackStack(NULL); fragmentTransaction.commit(); (29认同)
  • 在我看来,持续时间"700"对于这样的动画来说有点多了.Android框架有3个定时预设:`android:duration ="@ android:integer/config_longAnimTime"`,`android:duration ="@ android:integer/config_mediumAnimTime"`和`android:duration ="@ android:integer/config_shortAnimTime"`,对应于500,400和200.我猜单位是毫秒,但我不确定. (27认同)
  • 它的说法是未知的动画师名字:翻译 (11认同)
  • 它不起作用......导致"java.lang.RuntimeException:Unknown animator name:translate".这个解决方案对我有用.http://trickyandroid.com/fragments-translate-animation/ (9认同)
  • 仅在使用支持片段时才有效(android.support.v4.app.Fragment) (6认同)
  • 确保在调用.replace()之前设置动画 (5认同)
  • 好吧,看来新的apis(至少&gt; 19)只支持objectAnimator。您可以在此处查看另一个解决方案:http://stackoverflow.com/questions/17760299/android-fragmenttransaction-custom-animation-unknown-animator-name-translate (2认同)
  • 我在添加片段上从右到左滑动了动画,但是每当我按下它时,它就不会从右到左滑动。任何的想法? (2认同)

dug*_*ggu 28

片段中有三种交易动画方式.

转变

所以需要使用其中一个内置的Transitions,使用setTranstion()方法:

getSupportFragmentManager()
        .beginTransaction()
        .setTransition( FragmentTransaction.TRANSIT_FRAGMENT_OPEN )
        .show( m_topFragment )
        .commit()
Run Code Online (Sandbox Code Playgroud)

自定义动画

您还可以使用setCustomAnimations()方法自定义动画:

getSupportFragmentManager()
        .beginTransaction()
        .setCustomAnimations( R.anim.slide_up, 0, 0, R.anim.slide_down)
        .show( m_topFragment )
        .commit()
Run Code Online (Sandbox Code Playgroud)

slide_up.xml

<?xml version="1.0" encoding="utf-8"?>
<objectAnimator
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"
        android:propertyName="translationY"
        android:valueType="floatType"
        android:valueFrom="1280"
        android:valueTo="0"
        android:duration="@android:integer/config_mediumAnimTime"/>
Run Code Online (Sandbox Code Playgroud)

slide_down.xml

<?xml version="1.0" encoding="utf-8"?>
<objectAnimator
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"
        android:propertyName="translationY"
        android:valueType="floatType"
        android:valueFrom="0"
        android:valueTo="1280"
        android:duration="@android:integer/config_mediumAnimTime"/>
Run Code Online (Sandbox Code Playgroud)

多个动画

最后,还可以在单​​个事务中启动多个片段动画.这允许一个非常酷的效果,其中一个片段向上滑动而另一个片段同时向下滑动:

getSupportFragmentManager()
        .beginTransaction()
        .setCustomAnimations( R.anim.abc_slide_in_top, R.anim.abc_slide_out_top ) // Top Fragment Animation
        .show( m_topFragment )
        .setCustomAnimations( R.anim.abc_slide_in_bottom, R.anim.abc_slide_out_bottom ) // Bottom Fragment Animation
        .show( m_bottomFragment )
        .commit()
Run Code Online (Sandbox Code Playgroud)

有关详细信息,您可以访问URL

注意: -您可以根据您的要求检查动画,因为上面可能有问题.

  • 它是,它不是。 (2认同)

liv*_*ove 9

slide_in_down.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="@android:integer/config_longAnimTime"
        android:fromYDelta="0%p"
        android:toYDelta="100%p" />
</set>
Run Code Online (Sandbox Code Playgroud)

slide_in_up.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="@android:integer/config_longAnimTime"
        android:fromYDelta="100%p"
        android:toYDelta="0%p" />
</set>
Run Code Online (Sandbox Code Playgroud)

slide_out_down.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="@android:integer/config_longAnimTime"
        android:fromYDelta="-100%"
        android:toYDelta="0"
        />
</set>
Run Code Online (Sandbox Code Playgroud)

slide_out_up.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="@android:integer/config_longAnimTime"
        android:fromYDelta="0%p"
        android:toYDelta="-100%p"
        />
</set>
Run Code Online (Sandbox Code Playgroud)

方向 = 向下

            activity.getSupportFragmentManager()
                    .beginTransaction()
                    .setCustomAnimations(R.anim.slide_out_down, R.anim.slide_in_down)
                    .replace(R.id.container, new CardFrontFragment())
                    .commit();
Run Code Online (Sandbox Code Playgroud)

方向 = 向上

           activity.getSupportFragmentManager()
                    .beginTransaction()
                    .setCustomAnimations(R.anim.slide_in_up, R.anim.slide_out_up)
                    .replace(R.id.container, new CardFrontFragment())
                    .commit();
Run Code Online (Sandbox Code Playgroud)


小智 6

我有同样的问题,我使用了简单的解决方案

1)在anim文件夹中创建sliding_out_right.xml

  <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android">
        <translate android:fromXDelta="0" android:toXDelta="-50%p"
            android:duration="@android:integer/config_mediumAnimTime"/>
        <alpha android:fromAlpha="1.0" android:toAlpha="0.0"
            android:duration="@android:integer/config_mediumAnimTime" />
    </set>
Run Code Online (Sandbox Code Playgroud)

2)在anim文件夹中创建sliding_in_left.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="50%p" android:toXDelta="0"
        android:duration="@android:integer/config_mediumAnimTime"/>
    <alpha android:fromAlpha="0.0" android:toAlpha="1.0"
        android:duration="@android:integer/config_mediumAnimTime" />
</set>
Run Code Online (Sandbox Code Playgroud)

3) 简单地使用片段事务 setCustomeAnimations() 和两个自定义 xml 和两个默认动画 xml 如下:-

 fragmentTransaction.setCustomAnimations(R.anim.sliding_in_left, R.anim.sliding_out_right, android.R.anim.slide_in_left, android.R.anim.slide_out_right );
Run Code Online (Sandbox Code Playgroud)