How to achieve shake animation programmatically?

前端 未结 2 1629
长情又很酷
长情又很酷 2021-02-19 03:15

How can I achieve shake/wobble animation in android programmatically. There is a AndroidViewAnimations library available through which we can get the effect. But I don\'t want t

相关标签:
2条回答
  • 2021-02-19 03:55

    let's say that mView is the view you want to animate:

    ObjectAnimator
      .ofFloat(mView, "translationX", 0, 25, -25, 25, -25,15, -15, 6, -6, 0)
      .setDuration(duration)
      .start();
    
    0 讨论(0)
  • 2021-02-19 04:07

    Just to provide another possible answer to the question. The below animation file need to be put under res/anim folder :

    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>
    

    And to use it in code (Here in Kotlin) :

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

    Animation explanation:

    • If you want 1000ms of duration, you need to divide this by the number of step in your anim. Ex. with 5 steps: 1000/5 = 200 So if you put 200 of duration for each step, all will take same time to end

    • The "startOffset" parameter need to specify after what time the animation need to start (Here we wanted to sum all of before operations)

    • The "fromXDelta" parameter is your started point at each step, based on the previous step.

    0 讨论(0)
提交回复
热议问题