penfeizhou / APNG4Android

Android animation support for APNG & Animated WebP & Gif & Animated AVIF, High performance
Apache License 2.0
570 stars 75 forks source link

当切播放源时,注册的回调监听,onAnimationStart,和onAnimationEnd会执行两次。 #219

Closed IamPlato closed 2 months ago

IamPlato commented 3 months ago

当点击进行动效切换是,注册的监听的onAnimationStart和onAnimationEnd执行的并不准确

penfeizhou commented 2 months ago

请在重新打开前提供具体的示例代码.

IamPlato commented 2 months ago

如下代码,我希望能点击进行动效的切换,同时每个动效播完后能自动进行默认动效的播放。结果发现开始和结束的回调方法会执行两次:

//每次点击执行doAction(),进行动效的切换
 private fun doAction(
        apng: APNGDrawable?,
        loopLimit: Int = 1,
    ) {
        mApngDrawable?.clearAnimationCallbacks()
        mApngDrawable?.stop()

        val callback = object : Animatable2Compat.AnimationCallback() {

            override fun onAnimationStart(drawable: Drawable?) {
                super.onAnimationStart(drawable)
                Logs.i(TAG, "onAnimationStart")
            }

            override fun onAnimationEnd(drawable: Drawable?) {
                super.onAnimationEnd(drawable)
                Logs.i(TAG, "onAnimationEnd")
                doNormalAction()//每个动效播完后能自动进行默认动效的播放
            }
        }
        apng!!.registerAnimationCallback(callback)
        apng.setLoopLimit(loopLimit)
        mBinding.ivPpmt.setImageDrawable(apng)
        apng.start()
        mApngDrawable = apng
    }
    //执行默认的动效
 private fun doNormalAction() {
        Logs.i(TAG, "ppmt:play normal anim...")
        val currentAvatar = AvatarSettings.getCurrentAvatar()
        val apng =APNGDrawable.fromFile("sdcard/wt_avatar/${currentAvatar}/wt_aispace/${normalAction.first}")
        apng!!.setLoopLimit(-1)
        mBinding.ivPpmt.setImageDrawable(apng)
        apng.start()
        mApngDrawable = apng
    }

日志如下,几乎无规律 image

penfeizhou commented 2 months ago

如果手动start和stop的话请关闭自动播放:apngDrawable.setAutoPlay(false)

IamPlato commented 2 months ago

如果手动start和stop的话请关闭自动播放:apngDrawable.setAutoPlay(false)

666.太感谢了