Android 反向动画不考虑持续时间

Android reverse animation does not respect duration

我正在制作一个超级简单的摇动动画,将几个旋转动画放在一起。我遇到了一个问题,动画的重复部分似乎忽略了持续时间,只是跳回到该位置,而不是使用持续时间来旋转回来。

我目前的设置方式:

  1. 第一个动画 - 将旋转距离的一半移动到新的起点。添加这个是为了在动画开始时没有丑陋的跳跃。

  2. 第二个动画-多数。基本上从最大界限来回摇摆。旋转有一个设定的持续时间,在动画最初播放时看起来很棒,但在重复播放时会跳回。

  3. 第三个动画-结束,平滑的把动画移回起始位置。

代码

    <?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:fillAfter="true">
    <rotate
        android:duration="240"
        android:fromDegrees="0"
        android:interpolator="@android:anim/linear_interpolator"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toDegrees="2"/>
    <rotate
        android:startOffset="240"
        android:duration="480"
        android:fromDegrees="0"
        android:interpolator="@android:anim/linear_interpolator"
        android:pivotX="50%"
        android:pivotY="50%"
        android:repeatMode="reverse"
        android:repeatCount="5"
        android:toDegrees="-4"/>
    <rotate
        android:startOffset="720"
        android:duration="240"
        android:fromDegrees="0"
        android:interpolator="@android:anim/linear_interpolator"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toDegrees="2"/>
</set>

我一直在尝试的另一种方法是在 xml 中只播放 1 个完整的动画循环,然后找到一种循环它的方法,或者 运行 它在一个循环中循环 x 次排。还没能让它真正正确地循环。

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:fillAfter="true">
    <rotate
        android:duration="240"
        android:fromDegrees="0"
        android:interpolator="@android:anim/linear_interpolator"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toDegrees="2"/>
    <rotate
        android:startOffset="240"
        android:duration="480"
        android:fromDegrees="0"
        android:interpolator="@android:anim/linear_interpolator"
        android:pivotX="50%"
        android:pivotY="50%"
        android:repeatMode="reverse"
        android:repeatCount="0"
        android:toDegrees="-4"/>
    <rotate
        android:startOffset="720"
        android:duration="240"
        android:fromDegrees="0"
        android:interpolator="@android:anim/linear_interpolator"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toDegrees="2"/>
</set>

看起来它可能是 Android 上的错误?它似乎与 ObjectAnimator 一起正常工作,如下所示。此代码有效并尊重反向和重复的持续时间。

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

    <objectAnimator
        android:duration="240"
        android:propertyName="rotation"
        android:valueFrom="0"
        android:valueTo="2"/>
    <objectAnimator
        android:duration="480"
        android:propertyName="rotation"
        android:valueFrom="2"
        android:valueTo="-2"
        android:repeatMode="reverse"
        android:repeatCount="4"/>
    <objectAnimator
        android:duration="240"
        android:propertyName="rotation"
        android:valueFrom="-2"
        android:valueTo="0"/>
</set>