активируйте анимацию только один раз внутри инструкции if

#android #android-animation #countdowntimer

#Android #android-анимация #таймер обратного отсчета

Вопрос:

У меня есть таймер обратного отсчета, и я использовал некоторые операторы if, чтобы отметить определенные интервалы в обратном отсчете. Я хочу воспроизвести анимацию, в которой я перемещаю текстовое представление из одной точки в другую, но я хочу, чтобы это было сделано один раз за интервал. Я, например, установил интервал от 0 до 60000 миллисекунд, я хочу, чтобы анимация воспроизводилась один раз в течение этого интервала со следующей анимацией:

     <?xml version="1.0" encoding="utf-8"?>
<set
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/linear_interpolator"
    android:fillAfter="true">
    <translate
        android:fromYDelta="0%"
        android:toYDelta="-50%"
        android:duration="800" />
</set>
 

Часть моего кода таймера:

      private void startTimer() {
        Log.println(Log.ASSERT, "CHECK","Entered startTimer() method");
        millisInFuture = mTimeLeftInMillis;
        mCountDownTimer = new CountDownTimer(mTimeLeftInMillis, 1000) {
            @Override
            public void onTick(long millisUntilFinished) {
                mTimeLeftInMillis = millisUntilFinished;
                updateCountDownText();
                final long millisPassed = millisInFuture - mTimeLeftInMillis;
                progress = (int) (millisPassed * 100 / millisInFuture);
                pb.setProgress(progress);
                pb2.setProgress(0);
                pb3.setProgress(0);


/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                //Key: 60 sec
                if (millisInFuture == 480000) {
                    if (millisPassed <= 60000 || (millisPassed > 180000 amp;amp; millisPassed <= 240000) || (millisPassed > 300000 amp;amp; millisPassed <= 360000 || (millisPassed > 420000 amp;amp; millisPassed <= 480000))) {
//                        Animation animation = AnimationUtils.loadAnimation(tool1mode1.this, R.anim.fade_in);
//                        stepupimage.setAnimation(animation);
                        setflowrate();
                        Log.println(Log.ASSERT,"CHECK","Check that the first if statement of key 60 is entered");
                        statusIfUp();
                        time_of_stage = (millisInFuture - millisPassed) % 60000;
                        progress2 = (int) (time_of_stage*100 / 60000);
                        Log.println(Log.VERBOSE,"CHECK","TIME OF STAGE = " time_of_stage);
                        Log.println(Log.VERBOSE,"CHECK","progress2= " progress2);
                        pb2.setProgress(progress2);
                        updateStageUpCount();

                        upArrowAnimation();
 

setflowrate — это метод, который я использую для вызова своей анимации

  private void setflowrate()
{
    flow.setText(String.valueOf(num)   " GPM");
    Animation animation = AnimationUtils.loadAnimation(tool1mode1.this, R.anim.move_up);
    flow.setAnimation(animation);
    linearlayoutofflow.setAnimation(animation);
    progressBar.setAnimation(animation);

}
 

предполагается, что flow, linearlayoutoutflow, progressbar будут двигаться вверх в течение указанных выше временных интервалов, но я хочу, чтобы движение происходило только один раз за интервал.

Редактировать: проблема в том, что анимация продолжает повторяться. Я хочу, чтобы это произошло один раз внутри метода OnTick, который вызывается каждую секунду. Временные интервалы, которые я обозначил с помощью операторов if, я хочу, чтобы анимация появлялась в них только один раз.

Комментарии:

1. Что ваш код делает прямо сейчас? Анимация воспроизводится несколько раз или она вообще воспроизводится? Пожалуйста, уточните, что именно не работает.

2. предполагается, что анимация перемещает анимируемый объект вверх или вниз. Что происходит, так это то, что он продолжает повторять это, потому что анимация вызывается внутри метода OnTick, который вызывается очень быстро. Я хочу, чтобы он воспроизводился только один раз, а не постоянно зацикливался.

Ответ №1:

Самый простой способ, который приходит мне на ум, — это установить логический флаг, если true, воспроизвести анимацию и установить логическое значение false, если false, не воспроизводить анимацию.

 private boolean animate = true;

private void setflowrate() {
    if(animate) {
        flow.setText(String.valueOf(num)   " GPM");
        Animation animation = AnimationUtils.loadAnimation(tool1mode1.this, R.anim.move_up);
        flow.setAnimation(animation);
        linearlayoutofflow.setAnimation(animation);
        progressBar.setAnimation(animation);
        animate = false;
    }
}
 

В конце всех процессов, или, как вы говорите, «интервал», вы снова устанавливаете флаг в true на случай, если хотите перезапустить анимацию.

Комментарии:

1. оценил, я попробую

2. Оценено по достоинству, Это сработало как заклинание. Этому сайту нужно больше таких людей, как вы.

3. Нет проблем. Я был бы признателен, если бы вы также поддержали мой ответ

4. и поверьте мне, на этом сайте работают лучшие люди в мире (я исключен:)