Spring animation: Solution

DetailActivity.kt
class DetailActivity : AppCompatActivity() {

    ...

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        ...

        val springForce = SpringForce(0f).apply {
            stiffness = SpringForce.STIFFNESS_LOW
            dampingRatio = SpringForce.DAMPING_RATIO_HIGH_BOUNCY
        }

        val springAnimationX = SpringAnimation(iv_avatar, DynamicAnimation.TRANSLATION_X).apply {
            spring = springForce
        }
        val springAnimationY = SpringAnimation(iv_avatar, DynamicAnimation.TRANSLATION_Y).apply {
            spring = springForce
        }
        
        var dX = 0f
        var dY = 0f

        root.setOnTouchListener { view, motionEvent ->
            when (motionEvent?.action) {
                MotionEvent.ACTION_DOWN -> {
                    dX = motionEvent.rawX
                    dY = motionEvent.rawY
                }

                MotionEvent.ACTION_MOVE -> {
                    val newX = motionEvent.rawX - dX
                    val newY = motionEvent.rawY - dY
                    iv_avatar.animate().translationX(newX).translationY(newY).duration = 0
                    springAnimationX.animateToFinalPosition(0f)
                    springAnimationY.animateToFinalPosition(0f)
                }
            }
            true
        }
    }

    companion object {
        ...
    }
}

Last updated