Как я могу сделать функцию, которая уменьшает число (от 800 миллисекунд до 200 миллисекунд, например) - PullRequest
0 голосов
/ 11 января 2019

таймер установлен на период 800 миллисекунд, поэтому всегда RandomPositions () будет выполнять внутренний код каждые 800 миллисекунд (период). Теперь я хочу, чтобы уменьшало это число на 50 каждые 20 секунд или 20 000 миллисекунд , пока оно не получит период до 200 миллисекунд.

ЦЕЛЬ - В ИГРЕ ЭТО ДОЛЖНО БЫТЬ УВЕЛИЧЕНО СКОРОСТЬ КАЖДЫХ 20 СЕКУНД.

пример: первое исполнение - 800 миллисекунд, второе исполнение - 750 миллисекунд, третье исполнение - 700 миллисекунд, и так далее ...

Что я думаю, так это то, что я мог бы вставить функцию типа Integer (вместо 800), которая может уменьшить эту работу с 800 до 200 миллисекунд.

Как я могу сделать эту функцию? или есть другое решение?

public void RandomPositions() {

        Timer timer = new Timer();
        timer.scheduleAtFixedRate(new TimerTask()
        {
            public void run() {

                getWindowManager().getDefaultDisplay().getMetrics(displaymatrics);
                float dx = r.nextFloat() * displaymatrics.widthPixels/1.2f;
                float dy = r.nextFloat() * displaymatrics.heightPixels/1.2f;
                button.animate().x(dx).y(dy).setDuration(0);


            }
        }, 0, 800);  // first value = Delay   , Second value = Period(what I need to change)

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Вот решение, которое использует таймер. Если вы не хотите вызывать метод в цикле, просто вычитайте параметр задержки на 50 каждый раз, когда вы вызываете его.

    public static void main(String[] args) {                
        Timer timer = new Timer();              
        for(int i = 800; i >= 200; i-=50)
        {
            runTimer(timer, i);         
        }   
    }   

    private static void runTimer(Timer timer, int delay) {
        timer.schedule(new TimerTask()
        {
            public void run() {
            }                
        }, 0, delay);  
    }
0 голосов
/ 11 января 2019

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

В ванильном Android я бы, вероятно, использовал Обработчик

Int interval = 800; // milliseconds
Handler handler = new Handler()
Runnable runnable = new Runnable() { 

   @Override void run() {

        //
        // do your logic here
        //

        // decrement interval by 20 milliseconds 
        // if interval - 20 is greater than 200
        interval = interval - 20 > 200 ? interval - 20 : interval;


        // Request an execution of this runnable with the new value of interval
        handler.postDelayed(runnable, interval);
   }
}


public void start() {
   handler.postDelayed(runnable, interval);
}

public void stop() { 
   handler.removeCallbacks(runnable);
}

Убедитесь, что вы звоните removeCallbacks всякий раз, когда хотите остановить его или когда пользователь покидает действие / контекст, где это выполняется.

...