Как я могу запустить Android AlphaAnimation в определенное время? - PullRequest
1 голос
/ 13 февраля 2012

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

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

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 создает первую анимацию, но не вторую ..

1 Ответ

3 голосов
/ 14 февраля 2012

Определенно слишком много работы делается, чтобы попытаться отследить время анимации.Точная причина того, что ваш текущий код не работает должным образом, заключается в том, что 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

...