Как постепенно считать до нуля в течение изменяемой длительности в Java? - PullRequest
1 голос
/ 01 апреля 2020

У меня есть таймер X секунд, и я хочу, чтобы Y отсчитывал до нуля в четных промежутках времени, достигая 0 одновременно с завершением таймера.

Например, если бы у меня был таймер 10 секунд и значение 20, я бы хотел, чтобы значение go уменьшалось на 2 каждую секунду.

Таймер предпочтительно обновляется быстро, как это будет отображаться в виде строки.

Спасибо за вашу помощь!

Для контекста, я использую таймер:

public EventTimer(int seconds) {
        // Start timer
        timer = new Timer();
        timer.schedule(new RemindTask(), seconds*1000);
        cooledDown = false;
    }

    class RemindTask extends TimerTask {
        public void run() {
            // Ends timer
            timer.cancel(); //Terminate the timer thread
            cooledDown = true;
        }
  • Роман

Редактировать: я знаю, что мог бы просто установить другой таймер, но моя главная цель здесь - постепенно уменьшать

Ответы [ 2 ]

1 голос
/ 01 апреля 2020

Я придумал это.

public class HelloWorld {

    public static void main(String[] args) {

        int seconds = 5;
        int value = 10;
        TimerThatDoesntRequireThreadedProgramming(seconds, value);

    }

    // Checkmate Java Threaded Programming
    public static void TimerThatDoesntRequireThreadedProgramming(double seconds, double value) {

        double ms = (double) seconds * 1000;
        double val = value * 1000;

        if (ms < 0) {
            return;
        }

        double s = System.nanoTime();

        double lerpTime = 1000 / (val/ms);

        int counter = 0;

        while ((double) (System.nanoTime() - s) / 1000000 < ms) {

            if((double) (System.nanoTime() - s) / 1000000 > lerpTime) {
                System.out.println(counter);
                counter++;
                lerpTime += 1000 / (val/ms);
            }
        }

        System.out.println("Done! Counted to " + value + " in " + seconds + " seconds :D");
        return;
    }
}

Это просто обычный таймер, использующий nanotime (я не знаю, знаю), но содержит функцию lerping.

lerpTime = 1000 / (значение в секундах);

Так что обычно lerpTime увеличивается на 1000 каждый раз, чтобы подсчитывать и выводить секунды в реальных секундных шагах, но в этом Например, при подсчете до 10 за 5 секунд время lerpTime будет равно половине (500).

1 голос
/ 01 апреля 2020

Доля Y, когда осталось T, равна Y*T/X. Вот простая TimerTask, которая помечается X раз, переходя от Y (исключая) к 0,0 (включительно).

Если вы хотите показать это в GUI, вам придется выяснить, как публиковать sh текущее значение в вашей структуре пользовательского интерфейса. Помните, что run() выполняется в потоке таймера, а не в потоке фреймворка GUI, поэтому вы не можете напрямую изменять интерфейс пользователя из TimerTask.

class RemindTask extends TimerTask {
    private int y;
    private int x;
    private int ticksLeft;

    public RemindTask(int Y, int X) {
        y = Y;
        x = X;
        ticksLeft = X;
    }
    public void run() {
        ticksLeft = ticksLeft - 1;
        double currentValue = (double) y*ticksLeft/x;
        System.out.println(currentValue);
        if (ticksLeft == 0) {
            cancel();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...