2012-02-13 2 views
1

У меня есть этот ImageButton. Я хочу, чтобы он начал анимацию в определенное время. Я просмотрел документацию по Android и нашел setStartTime(long startTimeMillis).Как я могу запустить Android AlphaAnimation в определенное время?

Это то, что я придумал:

private ImageButton imgBtn; 

// Other variables and stuff.. 

//And inside to onCreate void, I have set the button listener. 
imgBtn.setOnClickListener(tappClickHandler); 
    Button.OnClickListener imgClickHandler = new Button.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      new AsyncTaskExample().execute(""); 

     } 
    }; 
    private class AsyncTaskExample extends AsyncTask<String, Integer, Integer> { 
     protected void onPreExecute(){ 
      AlphaAnimation alDown = new AlphaAnimation(1.0f, 0.1f); 
      alDown.setDuration(200); 
      alDown.setFillAfter(true); 
      imgBtn.startAnimation(alDown); 
     } 
     @Override 
     protected Integer doInBackground(String... params) { 
      Date test = new Date(); 
      return (test.getTime()/1000) + 5; 
     } 

     protected void onProgressUpdate(Integer... progress) { 

     } 

     protected void onPostExecute(Integer result) { 
      Date clientTime = new Date(); 

      AlphaAnimation alUp = new AlphaAnimation(0.1f, 1.0f); 
      alUp.setDuration(200); 
      alUp.setStartTime(result); 
      imgBtn.setAnimation(alUp); 
      Log.d(LOG_TAG, "Time to start: " + imgBtn.getAnimation().getStartTime()); 
      Log.d(LOG_TAG, "Current device time: " + clientTime.getTime()/1000);  
     } 

    } 

ТЕКУЩ гравюр:

02-13 20: 40: 42,634: D/tappWin (3504): Время начала: 1329162048

02-13 20: 40: 42,634 D/tappWin (3504): время на устройство: 1329162042

imgBtn делает первую анимацию, но не второй ..

+0

При использовании [startAnimation()] (http://developer.android.com/reference/android/view/View.html#startAnimation (android.view. анимация.Animation)) он отлично работает. – kristianfroelund

ответ

2

Определенно, слишком много работы выполняется, чтобы попытаться отслеживать время анимации. Точная причина, по которой ваш текущий код не работает, заключается в том, что setStartTime() необходимо вызывать в контексте значений времени, возвращаемых AnimationUtils.currentAnimationTimeMillis() вместо системного времени.

Однако гораздо более простой подход - использовать объект AnimationListener, чтобы уведомить вас о завершении первой анимации, чтобы начать вторую. Другими словами:

Animation fadeOut = new AlphaAnimation(1.0f, 0.1f); 
fadeOut.setDuration(500); 
fadeOut.setAnimationListener(new AnimationListener() { 
    @Override 
    public void onAnimationStart(Animation animation) { } 

    @Override 
    public void onAnimationRepeat(Animation animation) { } 

    @Override 
    public void onAnimationEnd(Animation animation) { 
     Animation fadeIn = new AlphaAnimation(0.1f, 1.0f); 
     fadeIn.setDuration(500); 
     imgBtn.startAnimation(fadeIn); 
    } 
}); 

imgBtn.startAnimation(fadeOut); 

HTH

+0

Привет, спасибо за ответ! Причина, по которой у меня есть AsyncTask, заключается в том, что клиент не знает, когда анимация должна снова исчезать. Только сервер делает. То, что я не публиковал, был комм. с сервером - извините: P Возврат [код] ((test.getTime()/1000) + 5;) должен был просто продемонстрировать пример ответа сервера. - Kristian – kristianfroelund

+0

Понял. Если вы хотите установить время запуска с такого сервера, вам необходимо выполнить преобразование между системным временем и временем анимации; т. е. ваша задача должна вернуть значение смещения в терминах 'currentAnimationTimeMillis(), о которых я упомянул, поэтому он правильно установлен в« Animation ». – Devunwired

+1

Могу ли я использовать [setStartOffset (long)] (http://developer.android.com/reference/android/view/animation/Animation.html#setStartOffset (long)) вместо этого? – kristianfroelund

Смежные вопросы