2010-07-03 3 views
1

내 애니메이션이 작동하고 스레드가 끝나면 다음 화면의 의도가 실행되지만 애니메이션의 끝에서 실행되지 않습니다. AnimationListener's 콜백 (이 목록에 End 만 있음)에 대한 모든 로그 항목을 기록했지만 아무 것도 기록되지 않습니다.내 Android 애니메이션이 내 onAnimationEnd를 호출하지 않는 이유는 무엇입니까?

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")); 
    } 
} 
+0

Thread.run 메서드에서 startActivity 호출을 제거하려고 시도했다고 가정하고 활동이 시작되지 않습니까? 그 경우가 아니라면, 내 추측은 onAnimationEnd가 호출되고 있다는 것입니다. 로그 메시지가 보이지 않는 것입니다. – MatrixFrog

+0

게시자가 게시 한 모든 코드를 볼 수 없기 때문에 실제로 Android 휴대 전화에 있습니다. 하지만 슈퍼 클래스 메쏘드를 덮어 씌우기로되어있는 메소드에 항상 @Override를 넣어야합니다. 만약 당신이 서명을 어떻게 든 엉망이라면 컴파일러는 당신에게 – MatrixFrog

답변

2

Animation#setAnimationListener은 어디에도 전화하지 않습니다. 청취자를 호출하려면 r.setAnimationListener(PromoActivity.this) 및/또는 q.setAnimationListener(PromoActivity.this)으로 전화해야합니다.

두 가지 애니메이션이 있고 정확히 같은 시간에 완료되지 않을 수도 있다는 점을 명심해야합니다. 따라서 리스너가 호출 된 횟수를 추적하고 끝내야하는 애니메이션 수가 도달하면 startActivity 만 호출하면됩니다.

+0

오라고 말할 것입니다. 좋은 캐치. 일반적으로 setListener 메서드를 먼저 입력 한 다음 이클립스에서 나머지 부분을 "빠른 수정"으로 처리하게합니다. – MatrixFrog

+0

그랬습니다! 이전에 이클립스 도움말로 설정하려고했으나 완료하지 않으려 고했지만 (구문이 잘못 되었기 때문에) "implements"절을 사용하여 암시 적으로 또는 기본값으로 설정해야한다고 생각했습니다. 또한 여러 애니메이션에 대한 조언을 주셔서 감사합니다. 나는 어느 것이 발포하고 있었는지 구별하기 위해 '꼬리표'를 사용할 계획이었다. 한편, thread.stop()이 더 이상 사용되지 않습니다. 분명히 라이프 사이클 모델 중 하나는 Dalvik에 맡겨야한다는 것입니다. – mobibob

+0

청취자를 잊어 버리고 마침내 내 문제를 해결했습니다. 감사 – Eenvincible

관련 문제