标准的Drawable动画,是用imageView.setBackgroundResource设置动画文件,然后通过(AnimationDrawable)imageView.getBackground()获取动画句柄,start()启动动画。
我现在做的程序,图片分静态模式和动画模式两种,静态的时候是通过setImageResource设置图片的,如果动画再使用setBackgroundResource设置,两个图片会出现重叠,所以尝试直接用setImageResource设置动画文件,然后通过(AnimationDrawable)imageView.getDrawable()获取动画句柄。
经过测试,这样是可行的,但是很想知道这两者的区别(毕竟我是非常规做法),会不会带来额外的消耗或者隐患?例如background动画是在子线程内运行,而image动画是在主线程内运行?
求了解Android代码和机制的大拿解惑,谢谢;)
该回答引用ChatGPT
在 Android 中,ImageView 的 setBackgroundResource() 和 setImageResource() 方法都可以用来设置一个图片资源。但是,它们的区别在于设置的内容。
setBackgroundResource() 方法设置的是一个 Drawable 对象,这个 Drawable 对象会被设置为 ImageView 的背景,而且 Drawable 对象可以是动画文件,比如 AnimationDrawable,因为 View 的背景可以支持动画效果。
setImageResource() 方法设置的是一个静态图片,这个图片会被设置为 ImageView 的内容,它不支持动画效果。
因此,如果你想要在 ImageView 中播放动画,建议使用 setBackgroundResource() 方法,因为它是专门用来支持动画效果的。如果你想要设置静态图片,就可以使用 setImageResource() 方法。
至于你提到的直接使用 setImageResource() 方法设置动画文件,然后通过 getDrawable() 方法获取动画句柄来播放动画,虽然看起来可行,但这并不是官方推荐的做法。因为 ImageView 的 getDrawable() 方法是用来获取 ImageView 中显示的静态图片的,它并不会返回 ImageView 的背景,也就是说,通过 getDrawable() 获取到的 Drawable 对象并不能保证一定是 AnimationDrawable。
因此,虽然你现在的做法可行,但并不建议使用,因为它可能会带来一些不确定的问题。建议还是按照官方文档的做法来使用 AnimationDrawable。如果你担心 AnimationDrawable 会在子线程中运行而导致性能问题,可以在主线程中使用 Handler 或者 runOnUiThread() 方法来启动动画。