Starting Frame-By-Frame Animation

2019-01-05 04:16发布

I have a basic question about starting a frame-by-frame animation.

When I call the AnimationDrawable.start() method from my code directly, it doesn't seem to work.

public void onCreate(Bundle savedInstanceState) {  
   ...  
   mAnimation.start();  
   ...  
}

But if I put this line inside the onClick() callback method of a button, pressing the buton starts the animation.

Why doesn't this line work in the code?

Thanks!

Code:

public class MyAnimation extends Activity {
@Override

public void onCreate(Bundle savedInstanceState) {

    AnimationDrawable mframeAnimation = null;
    super.onCreate(savedInstanceState);
    setContentView(R.layout.my_animation);

    ImageView img = (ImageView) findViewById(R.id.imgMain);

    BitmapDrawable frame1 = (BitmapDrawable) getResources().getDrawable(
            R.drawable.splash1);
    BitmapDrawable frame2 = (BitmapDrawable) getResources().getDrawable(
            R.drawable.splash2);

    int reasonableDuration = 250;
    mframeAnimation = new AnimationDrawable();
    mframeAnimation.setOneShot(false);
    mframeAnimation.addFrame(frame1, reasonableDuration);
    mframeAnimation.addFrame(frame2, reasonableDuration);

    img.setBackgroundDrawable(mframeAnimation);

    mframeAnimation.setVisible(true, true);
    //If this line is inside onClick(...) method of a button, animation works!!
    mframeAnimation.start(); 
}

}

3条回答
Viruses.
2楼-- · 2019-01-05 04:48

It's important to note that the start() method called on the AnimationDrawable cannot be called during the onCreate() method of your Activity, because the AnimationDrawable is not yet fully attached to the window. If you want to play the animation immediately, without requiring interaction, then you might want to call it from the onWindowFocusChanged() method in your Activity, which will get called when Android brings your window into focus. Very end of the page http://developer.android.com/guide/topics/graphics/2d-graphics.html

 ImageView img = (ImageView)findViewById(R.id.some layout);
 AnimationDrawable frameAnimation =    (AnimationDrawable)img.getDrawable();
 frameAnimation.setCallback(img);
 frameAnimation.setVisible(true, true);
 frameAnimation.start();

and to add animation you can do something like

<animation-list   android:id="@+id/my_animation" android:oneshot="false" 
    xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/frame1" android:duration="150" />
    <item android:drawable="@drawable/frame2" android:duration="150" />

 </animation-list>  
查看更多
看我几分像从前
3楼-- · 2019-01-05 05:05

Use a Runnable to insert the start() message to message queue, just add this LOC to replace your mFrameAnimation.start();

img.post(new Starter());

Helper inner class:

class Starter implements Runnable {
        public void run() {
            mFrameAnimation.start();
        }
}
查看更多
男人必须洒脱
4楼-- · 2019-01-05 05:13

to play an animation just in onCreate(...) add:

ImageView mImageView=(ImageView) findViewById(R.id.image);          
mImageView.setBackgroundResource(R.anim.film);    
mFrameAnimation = (AnimationDrawable) mImageView.getBackground();    
mImageView.post(new Runnable(){    
    public void run(){    
        mFrameAnimation.start();        
}
});
查看更多
登录 后发表回答