package com.xing.hellojetpack
import android.animation.Animator
import android.animation.AnimatorListenerAdapter
import android.animation.ObjectAnimator
import android.os.Bundle
import android.util.Log
import android.view.MotionEvent
import android.view.View
import android.view.animation.LinearInterpolator
import android.widget.Button
import androidx.appcompat.app.AppCompatActivity
import kotlin.math.abs
class AnimatorActivity : AppCompatActivity() {
private lateinit var button: Button
private lateinit var animator: ObjectAnimator
private var hideAnimator: ObjectAnimator? = null
private var showAnimator: ObjectAnimator? = null
private var isAnimatorResetting = true
private var isPointerUp = true
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_animator)
button = findViewById(R.id.btn_animator)
animator = ObjectAnimator.ofFloat(button, "translationY", 0f, 900f)
animator.setDuration(2000)
animator.interpolator = LinearInterpolator()
hideAnimator = ObjectAnimator.ofFloat(button, "translationY", 0f, 900f)
hideAnimator?.setDuration(2000)
hideAnimator?.interpolator = LinearInterpolator()
hideAnimator?.addListener(object : AnimatorListenerAdapter() {
override fun onAnimationStart(animation: Animator) {
super.onAnimationStart(animation)
isAnimatorResetting = false
}
override fun onAnimationEnd(animation: Animator) {
super.onAnimationEnd(animation)
if (isPointerUp) {
startShowAnimation()
}
}
})
showAnimator = ObjectAnimator.ofFloat(button, "translationY", 900f, 0f)
showAnimator?.setDuration(2000)
showAnimator?.interpolator = LinearInterpolator()
showAnimator?.startDelay = 1000L
showAnimator?.addListener(object : AnimatorListenerAdapter() {
override fun onAnimationEnd(animation: Animator) {
super.onAnimationEnd(animation)
isAnimatorResetting = true
}
})
}
fun start(v: View) {
animator.setFloatValues(0f, 900f)
animator.start()
}
fun back(v: View) {
val fraction = animator.animatedFraction
if (fraction != 1.0f) {
animator.setFloatValues(900f * (animator.animatedFraction), 0f)
animator.start()
}
}
fun hide(v: View) {
if (hideAnimator?.isRunning == true) {
return
}
if (showAnimator?.isRunning == true) {
showAnimator?.pause()
hideAnimator?.setCurrentFraction(1 - (showAnimator?.animatedFraction ?: 0f))
hideAnimator?.start()
} else if (button.translationY == 0f) {
hideAnimator?.setCurrentFraction(0f)
hideAnimator?.start()
}
}
fun show(v: View) {
showAnimator?.start()
}
private fun startHideAnimation() {
if (hideAnimator?.isRunning == true) {
return
}
if (showAnimator?.isRunning == true) {
showAnimator?.cancel()
hideAnimator?.setCurrentFraction(1 - (showAnimator?.animatedFraction ?: 0f))
hideAnimator?.start()
} else if (isAnimatorResetting) {
hideAnimator?.start()
}
}
private fun startShowAnimation() {
if (showAnimator?.isRunning == true) {
return
}
showAnimator?.start()
}
private var downX: Float = 0f
override fun dispatchTouchEvent(ev: MotionEvent?): Boolean {
when (ev?.action) {
MotionEvent.ACTION_DOWN -> {
downX = ev.x
}
MotionEvent.ACTION_MOVE -> {
val deltaX = ev.x - downX
val deltaDistance = abs(deltaX) > 10
val flag = hideAnimator?.isRunning != true
if (deltaDistance && flag) {
isPointerUp = false
startHideAnimation()
}
}
MotionEvent.ACTION_UP -> {
isPointerUp = true
if (hideAnimator?.animatedFraction == 1f) {
startShowAnimation()
}
}
}
return super.dispatchTouchEvent(ev)
}
}