替换Fragment时的动态缩放动画

8

我想要用动画替换一个fragment,但每次都必须是动态的,即它将从我在屏幕上点击的点开始,但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。那么如何在替换 fragment 时实现动态动画呢?


你有答案了吗? - Vishal Patel
2个回答

2

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

创建一个 .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>

3
这是可能的,我知道,但我想实现动态动画。我想从我在屏幕上点击的点开始动画。 - vishal sharma
这将导致java.lang.RuntimeException: Unknown animator name: translate。请参阅帖子获取更多信息。 - Mark Kowalski

2
使用XML中的translate标签进行片段动画不会通过fragmentTransaction.setCustomAnimations()工作。这将导致java.lang.RuntimeException: Unknown animator name: translate错误。有关更多信息,请参见帖子。
尝试改用objectAnimator。您可以使用以下animator 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()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接