Android 反向动画不考虑持续时间
Android reverse animation does not respect duration
我正在制作一个超级简单的摇动动画,将几个旋转动画放在一起。我遇到了一个问题,动画的重复部分似乎忽略了持续时间,只是跳回到该位置,而不是使用持续时间来旋转回来。
我目前的设置方式:
第一个动画 - 将旋转距离的一半移动到新的起点。添加这个是为了在动画开始时没有丑陋的跳跃。
第二个动画-多数。基本上从最大界限来回摇摆。旋转有一个设定的持续时间,在动画最初播放时看起来很棒,但在重复播放时会跳回。
第三个动画-结束,平滑的把动画移回起始位置。
代码
<?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>
我正在制作一个超级简单的摇动动画,将几个旋转动画放在一起。我遇到了一个问题,动画的重复部分似乎忽略了持续时间,只是跳回到该位置,而不是使用持续时间来旋转回来。
我目前的设置方式:
第一个动画 - 将旋转距离的一半移动到新的起点。添加这个是为了在动画开始时没有丑陋的跳跃。
第二个动画-多数。基本上从最大界限来回摇摆。旋转有一个设定的持续时间,在动画最初播放时看起来很棒,但在重复播放时会跳回。
第三个动画-结束,平滑的把动画移回起始位置。
代码
<?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>