Как я могу сделать функцию, которая уменьшает число (от 800 миллисекунд до 200 миллисекунд, например)
Таймер установлен на период 800 миллисекунд, поэтому всегда RandomPositions() будет выполнять внутренний код каждые 800 миллисекунд (период). Теперь я хочу уменьшить это число на 50 каждые 20 секунд или 20000 миллисекунд, пока оно не получит период до 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 ответа
Я бы не использовал таймер для этого, так как интервал все время меняется.
В ванильном Android я бы, вероятно, использовал Handler
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
когда вы хотите остановить его или когда пользователь покидает действие / контекст, где это выполняется.
Вот решение, которое использует таймер. Если вы не хотите вызывать метод в цикле, просто вычитайте параметр задержки на 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);
}