I have a problem with an AnimationDrawable that I create programatically that starts as soon as I assign it to an ImageView via imageView.setBackgroundDrawable (I support API 8).
This is an abbreviation of my code:
mSequence = new AnimationDrawable();
ImageView imageView = new ImageView(context);
ImageView.setAdjustViewBounds(false);
All of my assets are saved locally so I add them to the AnimationDrawable
for(String assetId : mAssets) {
bitmap = loadBitmap(assetId); // returns a bitmap saved earlier
if (bitmap != null) {
mSequence.addFrame(new BitmapDrawable(res, bitmap), mFrameDuration);
}
}
And finally I assign the AnimationDrawable to the view
if (mSequence.getNumberOfFrames() > 0) {
imageView.setBackgroundDrawable(mSequence);
}
Now before I have a chance to call the start() function the animation starts as soon as the ImageView is loaded.
I want to be able to control when the animation starts according to my own logic.
Has this happened to anyone?
**
**
Thanks to Tom, I know the reason for the triggering of the animation is the change in visibility that happens to the ImageView that actively happens after assigning the AnimationDrawable. The solution in my case isn't trivial since I have a complicated situation but for others it might be simpler.
I'm back to setting the drawable as the background according to class description, and I quote:
The simplest way to create a frame-by-frame animation is to define the animation in an XML file, placed in the res/drawable/ folder, and set it as the background to a View object. Then, call start() to run the animation.
It's quite possibly because you're assigning it as a background drawable with setBackgroundDrawable- when you assign a background drawable a chain of calls to super.setVisibility ends up in View, and that setVisible(..) can trigger an animation.
The solution is to use ImageDrawable?
Here's how I found the culprit.
As for why it's like that, it's probably a design choice about which I am too ignorant to explain, allthough I can see why- it marks out the difference between being a background and being a picture- the former has a conceptually longer life-span, perhaps. (But that's a geuss).
If you want to use the setting backgrounds approach, perhaps try keeping your ImageViews invisible until you want to show the animation.
I know this is more than a year old but I will share my experience.
The simplest way to stop your animation, that I have found, is to do this:
mImageView.setImageDrawable(mAnimationDrawable);
mAnimationDrawable.stop();
mAnimationDrawable.selectDrawable(0);
and that's it.
This essentially stops the animation on the drawable at index 0. It is a workaround, however, but an easy two extra lines is all that is needed.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With