views:

46

answers:

1

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"));
    }
}
+1  A: 

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.

Qberticus
Oh right. Good catch. I usually type the setListener method first and then let Eclipse do the rest as "quick fixes"
MatrixFrog
That did it! I had tried to set it before with Eclipse's help, but it did not want to complete (my syntax was wrong) so I thought that it must be implied or defaulted with my "implements" clause. Also, thanks for the advice on the multiple animations. I planned to use 'tags' to distinguish which one was firing.Meanwhile, I learned that my thread.stop() is deprecated. Apparently with the life-cycle model one is supposed to leave that up to Dalvik.
mobibob