AnimationDrawable自定义

本文深入解析FlashAnimationDrawable类,这是一个自定义的Android动画Drawable,用于处理帧动画的更新和监听。文章介绍了如何通过Runnable和Handler实现动画帧的自动更新,以及如何设置动画帧变化的监听器。同时,探讨了动画初始化、启动、停止的方法实现,以及如何优化动画性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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)
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值