java - 使用位图工厂在可运行文件中以每秒 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())
动画非常滞后。如何更正它或建议其他方式以顺利加载动画。
我不能在我的项目中包含图像,因为它会增加我的项目的大小。
解决方案
您应该在显示它们之前加载所有图像。要播放动画,您可以使用 AnimationDrawable:
AnimationDrawable myAnim = new AnimationDrawable();
并且对于每个图像文件,您可以使用BitmapFactory
将其解码为 Bitmap 并将此 Bitmap 放入BitmapDrawable
.
然后您可以将此 BitmapDrawable 添加到您的动画中:
myAnim.addFrame(myBitmap, 1000/30)
然后,您可以随时使用 AnimationDrawable 并使用myAnim.start()
.
推荐阅读
- ios - Xcode 11.4 编译错误'缺少包产品
' - node.js - Express 静态公用文件夹在第二页上不起作用
- java - 在 App Engine 中接收邮件是否仍然有效?
- .net - 如何覆盖 OnFormClosing 事件并退出应用程序?
- angular - 如何为任何 observable 实现共享(全局)catchError?
- python - 如何访问 ForeignKey 子模型的 ID?int() 参数必须是字符串、类似字节的对象或数字,而不是 'builtin_function_or_method
- ios - 为什么我无法从 iOs 模拟器访问我的 nodejs 本地服务器
- python - Matplotlib 彩色散点图例
- mysql - 计算列 mysql 上的特定值
- flutter - 在其他所有内容之上显示 popupMenu 菜单