CodeFlys
1/9/2020 - 2:48 AM

FriendlyObjectAnimator

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)
        }
    }
}