【问题标题】:AnimationDrawable auto startsAnimationDrawable 自动启动
【发布时间】: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
  • @Tom 你是对的!它是由于可见性变化而触发的。这没有意义。有什么好的方法可以防止它发生吗? PS:我改成setImageDrawable

标签: android animation imageview visibility


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-16
    • 2012-04-04
    • 2011-12-22
    • 2014-12-24
    • 2015-01-28
    相关资源
    最近更新 更多