android - 动画 fragment 之间的过渡

标签 android android-3.0-honeycomb

我正在尝试为 fragment 之间的过渡设置动画。我从以下得到了答案
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

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

有什么想法吗?当我检查 Honeycomb API 引用 translate 在那里。我错过了什么?
有没有其他方法可以动画 fragment 之间的过渡? 谢谢你

最佳答案

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

这是一个使用 setCustomAnimations 的示例来自 ApiDemos 的 FragmentHideShow.java:

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> 组合多个动画师,就像使用旧动画框架一样。


编辑:由于人们在询问滑入/滑出,我将在这里对此发表评论。

滑入和滑出

您当然可以为 translationX 设置动画。 , translationY , x , 和 y属性,但通常幻灯片涉及到屏幕外的动画内容。据我所知,没有任何使用相对值的转换属性。但是,这并不妨碍您自己编写它们。请记住,属性动画只需要您正在制作动画的对象(在本例中为 View )上的 getter 和 setter 方法,因此您可以创建自己的 getXFractionsetXFraction View 子类上的方法,如下所示:

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

请注意,如果您在其中制作动画的对象与其父对象的宽度不同,事情看起来就不太正确,因此您可能需要调整您的属性实现以适应您的用例。

关于android - 动画 fragment 之间的过渡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4932462/

相关文章:

java - 处理基于像素的 Android 游戏的不同分辨率

Android - 从服务器下载图像并加载到 ImageView

java - Android Volley - 检查互联网状态

Android用另一个 fragment 替换当前 fragment

android - 如何在 HoneyComb 中获取可用的屏幕高度减去导航栏?

android - 支持 Android 3.0 的同时可调整大小的小部件?

android - Proguard 混淆使我的基于通信的应用程序的更新版本成为 'impossible' 以与旧版本的消息传递兼容

android - 为Android构建OpenCV并将其与NDK结合使用

android - 字体太大而无法放入缓存

java - 避免 Android 在方向更改时自动重新添加我的 fragment