如何以编程方式实现摇动动画?

时间:2015-01-14 12:37:12

标签: android

如何以编程方式在android中实现摇动/摆动动画。 有一个AndroidViewAnimations库,我们可以通过它来获得效果。 但我不想为此目的使用任何库,因为它往往会增加apk大小。

动态动画AndroidViewAnimations中的代码如下:

public class ShakeAnimator extends BaseViewAnimator {
    @Override
    public void prepare(View target) {
        getAnimatorAgent().playTogether(
                ObjectAnimator.ofFloat(target, "translationX", 0, 25, -25, 25, -25,15, -15, 6, -6, 0)
        );
    }
}

有人可以告诉我如何在没有任何库的情况下实现这一目标。

2 个答案:

答案 0 :(得分:27)

让我们说mView是您要制作动画的视图:

ObjectAnimator
  .ofFloat(mView, "translationX", 0, 25, -25, 25, -25,15, -15, 6, -6, 0)
  .setDuration(duration)
  .start();

答案 1 :(得分:0)

只需提供该问题的另一个可能答案即可。下面的动画文件需要放在 res / anim 文件夹下:

shake.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:fillAfter="true"
    android:interpolator="@android:anim/linear_interpolator">

    <translate
        android:duration="66"
        android:fromXDelta="0%p"
        android:toXDelta="-2%p" /> <!-- -2 -->

    <translate
        android:duration="66"
        android:fromXDelta="0%p"
        android:startOffset="66"
        android:toXDelta="4%p" /> <!-- 2 -->

    <translate
        android:duration="66"
        android:fromXDelta="0%p"
        android:startOffset="132"
        android:toXDelta="-4%p" /> <!-- -2 -->

    <translate
        android:duration="66"
        android:fromXDelta="0%p"
        android:startOffset="198"
        android:toXDelta="4%p" /> <!-- 2 -->

    <translate
        android:duration="66"
        android:fromXDelta="0%p"
        android:startOffset="264"
        android:toXDelta="-3%p" /> <!-- -1 -->

    <translate
        android:duration="66"
        android:fromXDelta="0%p"
        android:startOffset="330"
        android:toXDelta="2%p" /> <!-- 1 -->

    <translate
        android:duration="66"
        android:fromXDelta="0%p"
        android:startOffset="396"
        android:toXDelta="-1.5%p" /> <!-- -0.5 -->

    <translate
        android:duration="66"
        android:fromXDelta="0%p"
        android:startOffset="462"
        android:toXDelta="1%p" /> <!-- 0.5 -->

    <translate
        android:duration="66"
        android:fromXDelta="0%p"
        android:startOffset="528"
        android:toXDelta="-0.5%p" /> <!-- 0 -->

</set>

并在代码中使用它(在Kotlin中):

val animShake = AnimationUtils.loadAnimation(requireContext(), R.anim.shake)
mView.startAnimation(animShake)

动画说明:

  • 如果您想要1000ms的持续时间,则需要将其除以动画中的步数。 例如5个步骤:1000/5 = 200 因此,如果您为每一步设置200的持续时间,则所有操作都将花费相同的时间结束

  • “ startOffset”参数需要指定动画的开始时间(在这里我们希望对所有之前的操作进行求和)

  • “ fromXDelta”参数是每个步骤的起点。