5

我有一个问题AnimationDrawable,我以编程方式创建它,一旦我将它分配给一个ImageViewvia imageView.setBackgroundDrawable(我支持 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,我知道触发动画的原因是ImageView在分配AnimationDrawable. 在我的情况下,解决方案并非微不足道,因为我的情况很复杂,但对其他人来说可能更简单。

编辑2:

我回到根据类描述将drawable设置为背景,我引用:

创建逐帧动画的最简单方法是在 XML 文件中定义动画,放在 res/drawable/ 文件夹中,并将其设置为View 对象的背景。然后,调用 start() 运行动画。

4

3 回答 3

1

这很可能是因为您将其分配为背景可绘制对象 setBackgroundDrawable- 当您分配背景可绘制对象时,对 super.setVisibility 的调用链最终会出现在 View 中,这setVisible(..)可能会触发动画。

解决方案是使用 ImageDrawable?

以下是我找到罪魁祸首的方法。

至于为什么会这样,可能是我太无知无法解释的设计选择,尽管我可以理解为什么-它标志着作为背景和作为图片之间的区别-前者在概念上具有更长的寿命, 也许。(但那是个鬼)。

如果你想使用设置背景的方法,也许尝试保持你的ImageViews不可见,直到你想显示动画。

于 2013-07-25T13:16:06.880 回答
1

我知道这已经一年多了,但我会分享我的经验。

  • 我发现停止动画的最简单方法是执行以下操作:

    mImageView.setImageDrawable(mAnimationDrawable);
    mAnimationDrawable.stop();
    mAnimationDrawable.selectDrawable(0);
    

就是这样。

这实质上会在索引 0 处停止可绘制对象上的动画。但是,这是一种解决方法,但只需要简单的两行额外的行。

于 2014-12-01T17:17:29.170 回答
1

不幸的是,上述解决方法都没有解决这里的问题。我的解决方案是使用:

myView.setTranslationX(10000f); // to hide
myView.setTranslationX(0f); // to show
于 2017-04-20T15:35:55.457 回答