Как добиться анимации встряхивания программным путем?

Как я могу добиться анимации встряски/вобуляции в андроиде программно. Доступна библиотека 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)
        );
    }
}

Может annyone сказать мне, как я могу достичь этого без каких-либо библиотек.

Ответ 1

скажем, что mView - это вид, который вы хотите оживить:

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

Ответ 2

Просто чтобы дать еще один возможный ответ на вопрос. Приведенный ниже файл анимации необходимо поместить в папку 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)