如何以编程方式在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)
);
}
}
有人可以告诉我如何在没有任何库的情况下实现这一目标。
答案 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”参数是每个步骤的起点。