首页 > 解决方案 > 使用位图工厂在可运行文件中以每秒 30 张图像的速度显示 150 张图像,但它很滞后

问题描述

我在 android 设备的外部存储中有 150 张图像,我必须以每秒 30 张图像的速度将它们用作活动的动画。

我已经使用位图在给定路径解码文件,然后将其设置在 imageView 中。我正在使用处理程序来执行此操作,但动画非常滞后。

在下面的代码中animationReadyPath是文件夹的路径,并且imageList是该文件夹内文件的数组列表。我在里面使用了这段代码onWindowFocusChanged()

var i = 0
val interval = 1000/30       
val handler = Handler()
val runnable = Runnable {
    handler.postDelayed(runnable, interval.toLong())
    val imgFile = File(animationReadyPath+imageList[i])
    val myBitmap = BitmapFactory.decodeFile(imgFile.absolutePath)
    iv_animation_ready.setImageBitmap(myBitmap)

    if(i<numOfImg){
        i++
    }
    if(i>numOfImg){            
        iv_animation_ready.setImageBitmap(
            BitmapFactory.decodeFile(
                animationReadyPath+imageList[149]
            )
        )
    }
}
handler.postAtTime(runnable, System.currentTimeMillis()+interval)
handler.postDelayed(runnable, interval.toLong())

动画非常滞后。如何更正它或建议其他方式以顺利加载动画。

我不能在我的项目中包含图像,因为它会增加我的项目的大小。

标签: javaandroidanimationkotlin

解决方案


您应该在显示它们之前加载所有图像。要播放动画,您可以使用 AnimationDrawable:

AnimationDrawable myAnim = new AnimationDrawable();

并且对于每个图像文件,您可以使用BitmapFactory将其解码为 Bitmap 并将此 Bitmap 放入BitmapDrawable.

然后您可以将此 BitmapDrawable 添加到您的动画中:

myAnim.addFrame(myBitmap, 1000/30)

然后,您可以随时使用 AnimationDrawable 并使用myAnim.start().


推荐阅读