欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

AnimationDrawable自定义

程序员文章站 2022-03-16 16:21:33
...
import android.graphics.drawable.AnimationDrawable
import android.graphics.drawable.Drawable
import android.os.Handler
import android.util.Log

class FlashAnimationDrawable : AnimationDrawable() {
    private val runnable: Runnable
    private val handler: Handler = Handler()
    private var onFrameChangedListener: OnFrameChangedListener? = null
    private var minDuration: Int = Int.MAX_VALUE
    private var lastDrawable: Drawable? = null
    private var drawableIndexMap: HashMap<Drawable, Int> = HashMap()

    init {
        runnable = Runnable {
            Log.d("FlashDebug", "run is called.")
            if(current != null && lastDrawable != current){
                onFrameChangedListener?.onFrameChanged(drawableIndexMap[current]?:0)
                lastDrawable = current
            }
            resetHandler()
        }
    }

    private fun initAnimation(){
        for (i in 0 until this.numberOfFrames) {
            drawableIndexMap[getFrame(i)] = i
            if (minDuration > getDuration(i)) {
                minDuration = getDuration(i)
            }
        }
    }

    private fun resetHandler() {
        Log.d("FlashDebug", "minDuration="+minDuration)
        handler.postDelayed(runnable, minDuration.toLong())
    }

    override fun start() {
        super.start()
        initAnimation()
        Log.d("FlashDebug", "start is called")
        resetHandler()
    }

    override fun stop() {
        super.stop()
        Log.d("FlashDebug", "stop is called.")
        handler.removeCallbacks(runnable)
        drawableIndexMap.clear()
    }

    fun setOnFrameChangedListener(onFrameChangedListener: OnFrameChangedListener){
        this.onFrameChangedListener = onFrameChangedListener
    }

    interface OnFrameChangedListener{
        fun onFrameChanged(frameId: Int)
    }
}