我对以编程方式创建的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
后立即启动。
我希望能够根据自己的逻辑控制动画何时开始。
这发生在任何人身上吗?
**
编辑:
**
多亏了汤姆,我知道触发动画的原因是分配AnimationDrawable
后主动发生的ImageView
的可见性变化。就我而言,解决方案并非微不足道,因为我的情况很复杂,但对于其他人来说,它可能更简单。
编辑2:
我回到根据类描述将可绘制对象设置为背景,我引用:
创建逐帧动画的最简单方法是定义 XML 文件中的动画,放置在 res/drawable/文件夹中,然后设置 它作为视图对象的背景。然后,调用 start(( 来运行 动画。
这很可能是因为您将它分配为具有setBackgroundDrawable
的背景可绘制对象 - 当您分配背景可绘制对象时,对 super.setVisibility 的一系列调用最终会出现在视图中,并且该setVisible(..)
可以触发动画。
解决方案是使用ImageDrawable?
以下是我找到罪魁祸首的方式。
至于为什么会这样,这可能是一个设计选择,我太无知了,无法解释,尽管我明白为什么 - 它标志着作为背景和图片之间的区别 - 前者在概念上具有更长的寿命,也许。(但这是一个geuss(。
如果要使用设置背景方法,也许可以尝试保持ImageViews
不可见,直到您想要显示动画为止。
这已经有一年多的历史了,但我会分享我的经验。
我发现停止动画的最简单方法是这样做:
mImageView.setImageDrawable(mAnimationDrawable); mAnimationDrawable.stop(); mAnimationDrawable.selectDrawable(0);
仅此而已。
这实质上是在索引 0 处停止可绘制对象上的动画。 但是,这是一种解决方法,但只需要简单的两行额外行。
上述解决方法都没有解决此处的问题。我的解决方案是使用:
myView.setTranslationX(10000f); // to hide
myView.setTranslationX(0f); // to show