Animator动画

164 阅读1分钟

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)  
// 手指已抬起,hideAnimator还未结束, 则在结束时开启 showAnimator  
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  
// 手指抬起时,hideAnimator 有已结束 和 未结束 两种情况,  
// 已结束就开启 showAnimator, 未结束则在结束时在开启 showAnimator  
if (hideAnimator?.animatedFraction == 1f) {  
startShowAnimation()  
}  
}  
}  
return super.dispatchTouchEvent(ev)  
}  
  
  
}