class FriendlyObjectAnimator : IFriendlyObjectAnimator {
companion object {
val DYNAMIC_INSTANCE: FriendlyObjectAnimator
get() = FriendlyObjectAnimator()
}
private val mAnimator: ObjectAnimator by lazy {
ObjectAnimator.ofFloat(this, "fraction", 0f, 1f).apply {
interpolator = LinearInterpolator()
}
}
///////////////////////////////////////////////////////////////////////////
//
///////////////////////////////////////////////////////////////////////////
override var animatorListenerAdapter: AnimatorListenerAdapter? by Delegates.observable(null) { _, oldValue: AnimatorListenerAdapter?, newValue: AnimatorListenerAdapter? ->
if (oldValue == null) {
mAnimator.addListener(newValue)
mAnimator.addPauseListener(newValue)
} else {
throw Exception("AnimatorListenerAdapter had init!")
}
}
// 动画执行进度
override var fraction: Float = 0F
set(value) {
onAnimationUpdate?.invoke(field, value)
field = value
}
// 动画进度更新
override var onAnimationUpdate: ((oldValue: Float, newValue: Float) -> Unit)? = null
override var repeatCount: Int
get() = mAnimator.repeatCount
set(value) {
mAnimator.repeatCount = value
}
override var duration: Long
get() = mAnimator.duration
set(value) {
mAnimator.duration = value
}
override var currentPlayTime: Long
get() = mAnimator.currentPlayTime
set(value) {
mAnimator.currentPlayTime = value
}
override val animatedFraction: Float
get() = mAnimator.animatedFraction
override val animatedValue: Float
get() = ((mAnimator.animatedValue) as Float) * duration
override fun startAnimator() {
completionAnimatorListener()
mAnimator.start()
}
override fun startAnimator(duration: Long) {
this.duration = duration
startAnimator()
}
override fun reverseAnimator() {
completionAnimatorListener()
mAnimator.reverse()
}
override fun startAnimatorWithCurrentPlayTime(currTime: Long) {
startAnimator()
this.currentPlayTime = currTime
}
override fun startAnimatorWithCurrentPlayTime(currTime: Long, duration: Long) {
this.duration = duration
startAnimatorWithCurrentPlayTime(currTime)
}
override fun cancelAnimator() {
mAnimator.removeAllListeners()
// cancel 调用 cancel 和 end 方法
animatorListenerAdapter?.let {
if (mAnimator.isStarted || mAnimator.isRunning) {
animatorListenerAdapter!!.onAnimationCancel(mAnimator)
}
}
mAnimator.cancel()
}
override fun pauseAnimator() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
mAnimator.pause()
} else {
cancelAnimator()
}
}
override fun resumeAnimator() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
mAnimator.resume()
} else {
startAnimator()
}
}
///////////////////////////////////////////////////////////////////////////
//
///////////////////////////////////////////////////////////////////////////
private fun completionAnimatorListener() {
val listeners = mAnimator.listeners
if (animatorListenerAdapter != null && (listeners == null || listeners.size == 0)) {
mAnimator.addListener(animatorListenerAdapter)
mAnimator.addPauseListener(animatorListenerAdapter)
}
}
}