mobibob
mobibob

Reputation: 8794

Why isn't my Android animation not calling my onAnimationEnd?

My animation works and when the thread ends, the intent for the next screen fires, but it won't fire from the end of the animation. I put log entries for all of the AnimationListener's callbacks (only End is in this listing), but none get logged.

public class PromoActivity extends Activity implements AnimationListener {
    protected boolean _active = true;
    protected int _splashTime = 5000; // time to display the splash screen in ms

    private static final float ROTATE_FROM = 0.0f;
    private static final float ROTATE_TO = -10.0f * 360.0f;// 3.141592654f * 32.0f;
    private static final String TAG = "PromoActivity";

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Thread promoThread = new Thread() {
            @Override
            public void run() {
                try {
                    ImageView favicon = (ImageView) findViewById(R.id.favicon);

                    RotateAnimation r; // = new RotateAnimation(ROTATE_FROM, ROTATE_TO);
                    r = new RotateAnimation(ROTATE_FROM, ROTATE_TO, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
                    r.setDuration((long) 2*1500);
                    favicon.startAnimation(r);

                    RotateAnimation q;
                    q = new RotateAnimation(ROTATE_FROM, -ROTATE_TO, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
                    q.setDuration((long) 2*1500);
                    q.setRepeatCount(0);
                    TextView mobiText = (TextView) findViewById(R.id.logotext_mobi);
                    mobiText.startAnimation(q);

                    TextView dawgText = (TextView) findViewById(R.id.logotext_bob);
                    dawgText.startAnimation(q);

                    int waited = 0;
                    while (_active && (waited < _splashTime)) {
                        sleep(100);
                        if (_active) {
                            waited += 100;
                        }
                    }
                } catch (InterruptedException ex) {

                } finally {
                    finish();
                    startActivity(new Intent("com.mobibob.promo.AboutActivity"));
                    stop();
                }
            }
        };
        promoThread.start();

    }

    @Override
    public void onAnimationEnd(Animation animation) {
        Log.d(TAG, "onAnimationEnd");
        startActivity(new Intent("com.mobibob.promo.AboutActivity"));
    }
}

Upvotes: 2

Views: 4707

Answers (1)

Rich Schuler
Rich Schuler

Reputation: 41972

You're not calling Animation#setAnimationListener anywhere. You need to call r.setAnimationListener(PromoActivity.this) and/or q.setAnimationListener(PromoActivity.this) for the listener to be called.

Something to keep in mind is that you have two animations and they may not finish at exactly the same time. So you probably want to keep track of how many times your listener was called and only call startActivity when the number of animations that was supposed to end has been reached.

Upvotes: 2

Related Questions