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 自动启动的主要内容,如果未能解决你的问题,请参考以下文章

TextView上的AnimationDrawable?

Android之AnimationDrawable初识

如何使用 AnimationDrawable 暂停帧动画? [关闭]

Android_AnimationDrawable介绍及使用

Android AnimationDrawable

Android - 释放分配的内存AnimationDrawable正在用完