我正在尝试动画片段之间的过渡。我从下面得到了答案 Android Fragments和动画

FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right);

DetailsFragment newFragment = DetailsFragment.newInstance();

ft.replace(R.id.details_fragment_container, newFragment, "detailFragment");

// Start the animated transition.
ft.commit();

我的r。anm。slide_in_left

<?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>

但当我试着这样做时,它就出现了

02-08 16:27:37.961: ERROR/AndroidRuntime(1717): FATAL EXCEPTION: main
02-08 16:27:37.961: ERROR/AndroidRuntime(1717): java.lang.RuntimeException: Unknown animator name: translate
02-08 16:27:37.961: ERROR/AndroidRuntime(1717):     at android.animation.AnimatorInflater.createAnimatorFromXml(AnimatorInflater.java:129)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717):     at android.animation.AnimatorInflater.createAnimatorFromXml(AnimatorInflater.java:126)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717):     at android.animation.AnimatorInflater.createAnimatorFromXml(AnimatorInflater.java:93)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717):     at android.animation.AnimatorInflater.loadAnimator(AnimatorInflater.java:72)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717):     at android.app.FragmentManagerImpl.loadAnimator(FragmentManager.java:621)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717):     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:733)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717):     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:919)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717):     at android.app.BackStackRecord.run(BackStackRecord.java:578)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717):     at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1217)

什么好主意吗?当我检查蜂窝API参考翻译有。我错过了什么? 有没有其他方法来动画片段之间的过渡? 谢谢你!


当前回答

努里克的回答很有帮助,但我无法让它工作,直到我发现这个。简而言之,如果您正在使用兼容性库(例如SupportFragmentManager而不是FragmentManager), XML动画文件的语法将有所不同。

其他回答

你需要使用新的安卓系统。动画框架(对象动画器)与FragmentTransaction。setCustomAnimations和fragmenttransaction。settransition。

下面是一个从ApiDemos的fragmenthidshow .java中使用setCustomAnimations的例子:

ft.setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out);

这是res/animator/fade_in.xml中相关的动画器XML:

<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:interpolator/accelerate_quad"
    android:valueFrom="0"
    android:valueTo="1"
    android:propertyName="alpha"
    android:duration="@android:integer/config_mediumAnimTime" />

注意,您可以使用<set>组合多个动画器,就像使用旧的动画框架一样。


编辑:既然大家都在问关于滑进/滑出的问题,我就在这里评论一下。

滑进滑出

You can of course animate the translationX, translationY, x, and y properties, but generally slides involve animating content to and from off-screen. As far as I know there aren't any transition properties that use relative values. However, this doesn't prevent you from writing them yourself. Remember that property animations simply require getter and setter methods on the objects you're animating (in this case views), so you can just create your own getXFraction and setXFraction methods on your view subclass, like this:

public class MyFrameLayout extends FrameLayout {
    ...
    public float getXFraction() {
        return getX() / getWidth(); // TODO: guard divide-by-zero
    }

    public void setXFraction(float xFraction) {
        // TODO: cache width
        final int width = getWidth();
        setX((width > 0) ? (xFraction * width) : -9999);
    }
    ...
}

现在你可以动画'xFraction'属性,就像这样:

res /动画/ slide_in.xml:

<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/linear_interpolator"
    android:valueFrom="-1.0"
    android:valueTo="0"
    android:propertyName="xFraction"
    android:duration="@android:integer/config_mediumAnimTime" />

注意,如果你在其中进行动画的对象与它的父对象宽度不同,事情看起来就不太对,所以你可能需要调整你的属性实现来适应你的用例。

为了给这个老问题添加一个更现代的答案,如果你已经转移到材料设计,这可以很容易地使用提供的运动库——更多细节,请访问https://material.io/develop/android/theming/motion。

FragmentTransaction的Android SDK实现需要一个动画器,而支持库需要一个动画,不要问我为什么,但在strangeluk的评论之后,我查看了Android 4.0.3代码和支持库。 Android SDK使用loadAnimator(),支持库使用loadAnimation()

下面是片段之间的幻灯片进出动画:

FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.setCustomAnimations(R.animator.enter_anim, R.animator.exit_anim);
transaction.replace(R.id.listFragment, new YourFragment());
transaction.commit();

我们正在使用一个objectAnimator。

下面是animator子文件夹中的两个xml文件。

enter_anim.xml

<?xml version="1.0" encoding="utf-8"?>
<set>
     <objectAnimator
         xmlns:android="http://schemas.android.com/apk/res/android"
         android:duration="1000"
         android:propertyName="x"
         android:valueFrom="2000"
         android:valueTo="0"
         android:valueType="floatType" />
</set>

exit_anim.xml

<?xml version="1.0" encoding="utf-8"?>
<set>
    <objectAnimator
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="1000"
        android:propertyName="x"
        android:valueFrom="0"
        android:valueTo="-2000"
        android:valueType="floatType" />
</set>

我希望这能帮助到一些人。

努里克的回答很有帮助,但我无法让它工作,直到我发现这个。简而言之,如果您正在使用兼容性库(例如SupportFragmentManager而不是FragmentManager), XML动画文件的语法将有所不同。