替换Fragment时的动态缩放动画

时间:2015-12-11 14:08:15

标签: android fragment android-animation android-transitions

我想用动画替换片段,但每次都必须是动态的,即它将从我点击屏幕的点开始,但fragmentTransaction.setCustomAnimations方法使用anim文件夹中定义的预定义动画,如这样:

fragmentTransaction.setCustomAnimations(R.anim.bounce, R.anim.bounce);

我创建ScaleAnimation的对象以满足我的需要:

ScaleAnimation animation = new ScaleAnimation(fromX,ToX,fromY,toY,pivitX,pivotY);
animation.setDuration(500);

fragmentTransaction.setCustomAnimations方法不接受scaleAnimation它只接受int。那么如何在替换片段时获得动态动画。

2 个答案:

答案 0 :(得分:1)

您可以创建自定义动画集并使用它们。

创建.xml文件并将其放入' res / anim'文件夹,然后在代码中使用其资源ID:

fragmentTransaction.setCustomAnimations(R.anim.your_animation, R.anim.your_animation);

这是动画的例子:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

<translate
    android:duration="@android:integer/config_shortAnimTime"
    android:fromXDelta="0"
    android:fromYDelta="0"
    android:interpolator="@android:anim/accelerate_decelerate_interpolator"
    android:toXDelta="-10%p"
    android:toYDelta="1%p"/>

<scale
    android:duration="@android:integer/config_shortAnimTime"
    android:fromXScale="1.0"
    android:fromYScale="1.0"
    android:toXScale="0.98"
    android:toYScale="0.98"/>

<translate
    android:duration="@android:integer/config_shortAnimTime"
    android:fromXDelta="-10%p"
    android:fromYDelta="1%p"
    android:interpolator="@android:anim/accelerate_decelerate_interpolator"
    android:startOffset="@android:integer/config_shortAnimTime"
    android:toXDelta="100%p"
    android:toYDelta="5%p"/>

<scale
    android:duration="@android:integer/config_shortAnimTime"
    android:fromXScale="0.98"
    android:fromYScale="0.98"
    android:startOffset="@android:integer/config_shortAnimTime"
    android:toXScale="0.9"
    android:toYScale="0.9"/>
</set>

答案 1 :(得分:0)

XML中带有translate标记的片段动画无法通过fragmentTransaction.setCustomAnimations()生效。这将导致java.lang.RuntimeException: Unknown animator name: translate。有关详细信息,请参阅this帖子。

尝试使用objectAnimator代替。您可以使用动画xml实现缩放动画,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <objectAnimator
        android:interpolator="@android:interpolator/decelerate_quint"
        android:valueFrom="200dp" android:valueTo="0dp"
        android:valueType="floatType"
        android:propertyName="translationY"
        android:duration="@android:integer/config_longAnimTime" />
    <objectAnimator
        android:interpolator="@android:interpolator/decelerate_quint"
        android:valueFrom="0.0" android:valueTo="1.0"
        android:valueType="floatType"
        android:propertyName="alpha"
        android:duration="@android:integer/config_longAnimTime"/>
    <objectAnimator
        android:interpolator="@android:interpolator/decelerate_quint"
        android:valueFrom="0.5" android:valueTo="1.0"
        android:valueType="floatType"
        android:propertyName="scaleX"
        android:duration="@android:integer/config_longAnimTime"/>
    <objectAnimator
        android:interpolator="@android:interpolator/decelerate_quint"
        android:valueFrom="0.5" android:valueTo="1.0"
        android:valueType="floatType"
        android:propertyName="scaleY"
        android:duration="@android:integer/config_longAnimTime"/>
</set>

键值为android:propertyName,您必须设置scaleX和/或scaleY。现在,您可以将此xml与fragmentTransaction.setCustomAnimations()一起使用。