AnimationDrawable 自动启动
Posted
技术标签:
【中文标题】AnimationDrawable 自动启动【英文标题】:AnimationDrawable auto starts 【发布时间】:2013-07-25 08:56:04 【问题描述】:我对我以编程方式创建的 AnimationDrawable
有疑问,我通过 imageView.setBackgroundDrawable
将它分配给 ImageView
后立即开始(我支持 API 8)。
这是我的代码的缩写:
mSequence = new AnimationDrawable();
ImageView imageView = new ImageView(context);
ImageView.setAdjustViewBounds(false);
我所有的资产都保存在本地,所以我将它们添加到AnimationDrawable
for(String assetId : mAssets)
bitmap = loadBitmap(assetId); // returns a bitmap saved earlier
if (bitmap != null)
mSequence.addFrame(new BitmapDrawable(res, bitmap), mFrameDuration);
最后我将AnimationDrawable
分配给视图
if (mSequence.getNumberOfFrames() > 0)
imageView.setBackgroundDrawable(mSequence);
现在,在我有机会调用 start()
函数之前,动画会在 ImageView
加载后立即开始。
我希望能够根据自己的逻辑控制动画何时开始。
有人遇到过这种情况吗?
**
编辑:
**
感谢 Tom,我知道触发动画的原因是在分配 AnimationDrawable
后主动发生在 ImageView
上的可见性变化。在我的情况下,解决方案并非微不足道,因为我的情况很复杂,但对其他人来说可能更简单。
编辑 2:
我回到根据class description将drawable设置为背景,我引用:
创建逐帧动画的最简单方法是定义 XML 文件中的动画,放在 res/drawable/ 文件夹中,并设置 它作为 View 对象的 背景。然后,调用 start() 运行 动画。
【问题讨论】:
这很可能是因为您使用setBackgroundDrawable
将其分配为背景可绘制对象 - 当您通过视图分配背景可绘制对象时,它调用 setVisible(..) 可以触发动画。 PS:为什么打不通setImageDrawable
?
看看我的教程c-sharpcorner.com/UploadFile/88b6e5/frame-by-frame-animation
@Tom 你是对的!它是由于可见性变化而触发的。这没有意义。有什么好的方法可以防止它发生吗? PS:我改成setImageDrawable
【参考方案1】:
这很可能是因为您使用setBackgroundDrawable
将其分配为背景可绘制对象-当您分配背景可绘制对象时,对 super.setVisibility 的调用链最终会出现在 View 中,并且 setVisible(..)
可以触发动画。
解决办法是用ImageDrawable?
Here's我是如何找到罪魁祸首的。
至于为什么会这样,这可能是我太无知无法解释的设计选择,尽管我可以理解为什么-它标志着作为背景和作为图片之间的区别-前者在概念上更长寿命,也许。 (但那是个问题)。
如果您想使用设置背景的方法,也许尝试让您的ImageViews
不可见,直到您想显示动画。
【讨论】:
我将分配方法更改为setImageDrawable
,但只要图像视图可见,动画就会开始。我不想要那种限制。
也许你得自己动手了。您能否仅在需要时(即当您希望动画开始时)预加载可绘制对象,然后将它们实际设置在 ImageView
上?
我可以,但是通过保存对ImageView
的引用并在需要时设置图像,我会保留对Context
的引用,如果可能的话,我想避免这种情况
这是非常不错的分析——你能用“应用程序上下文”代替吗?我们发现 android 的可绘制对象的实现充其量是非常不完整的。我们有一两个案例,我们刚刚从头开始推出自己的实现,您最终可能不得不自己做。
我正在编写一个 android 库,因此无法在不明确要求的情况下获取应用程序上下文。好吧,至少我知道为什么会这样。我会努力发挥创意... :)【参考方案2】:
我知道这已经一年多了,但我会分享我的经验。
我发现停止动画的最简单方法是这样做:
mImageView.setImageDrawable(mAnimationDrawable);
mAnimationDrawable.stop();
mAnimationDrawable.selectDrawable(0);
就是这样。
这实质上会在索引 0 处停止可绘制对象上的动画。不过,这是一种解决方法,但只需要简单的两行。
【讨论】:
我相信它是#selectDrawable() 而不是#selectFrame(),但这似乎是一个显而易见的解决方案。 谢谢@milosmns。是的selectDrawable()
确实是正确的方法(已编辑)。直观/明显与否 我花了一段时间才得出这个结论:在使用 setImageDrawable(Drawable)
方法设置动画后停止动画需要按顺序进行两个操作 stop()
和 selectDrawable(int)
(从 Lollipop 开始)。奇怪的是只调用了stop()
方法后它并没有停止。
似乎也在修复 G3 ROM 的自动启动问题。不确定 G2,但它可能也会修复那里的所有问题【参考方案3】:
不幸的是,上述解决方法都没有解决这里的问题。我的解决方案是使用:
myView.setTranslationX(10000f); // to hide
myView.setTranslationX(0f); // to show
【讨论】:
以上是关于AnimationDrawable 自动启动的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 AnimationDrawable 暂停帧动画? [关闭]