动画片段之间的过渡片段、动画

2023-09-11 11:20:28 作者:吧唧一口

我试图动画片段之间的过渡。我从以下答案 Android的碎片和动画

I'm trying to animate the transition between fragments. I got the answer from the following Android Fragments and animation

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.anim.slide_in_left

And my R.anim.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>

但是,当我尝试这一点,表明

But when I tried this it showed

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参考翻译是存在的。我错过了什么? 有动画片段之间的过渡任何其他方式? 谢谢

Any ideas? When I checked Honeycomb API reference translate is there. What did I miss? Is there any other way to animate the transition between fragments? Thank you

推荐答案

您需要使用新的 android.animation 框架(对象动画)与 FragmentTransaction.setCustomAnimations 以及与 FragmentTransaction.setTransition

You need to use the new android.animation framework (object animators) with FragmentTransaction.setCustomAnimations as well as with FragmentTransaction.setTransition.

下面是关于使用 setCustomAnimations 从ApiDemos为例 FragmentHideShow.java

Here's an example on using setCustomAnimations from ApiDemos' FragmentHideShow.java:

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

和这里是从相关的动画XML的 RES /动画/ fade_in.xml

and here's the relevant animator XML from res/animator/fade_in.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" />

请注意,您可以使用组合多个动画&LT;集&gt; ,就像你可以用旧的动画框架

Note that you can combine multiple animators using <set>, just as you could with the older animation framework.

修改:既然乡亲都问滑入/滑出,我会在这里发表评论

EDIT: Since folks are asking about slide-in/slide-out, I'll comment on that here.

您当然可以设置动画 translationX translationY X 性质,但一般的幻灯片涉及到从屏幕外的动画内容。据我知道有没有使用相对值任何转换属性。但是,这并没有从自己写这些prevent你。请记住,物业动画只要求你正在动画(在这种情况下视图)对象getter和setter方法​​,这样你就可以只创建自己的 getXFraction setXFraction 您的视图子类的方法,像这样:

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 translation 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 so:

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属性,像这样:

Now you can animate the 'xFraction' property, like so:

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" />

请注意,如果你在制作动画的对象是不一样的宽度,其母公司,事情会不会看起来很正确的,所以你可能需要调整你的财产实施,以满足你的使用情况。

Note that if the object you're animating in isn't the same width as its parent, things won't look quite right, so you may need to tweak your property implementation to suit your use case.