Android postDelayed работает, но не может поставить его в цикл?
Извините, я новичок, я прочитал бесчисленные учебники по созданию простого таймера, и мне было интересно, почему он не работает, пока я не заметил, что это цикл while, вызывающий проблему oO Я удалил его, а затем он работает, но только 1 раз Мне нужно использовать цикл, хотя движение заканчивается:C
Вот код:
old_x - это координаты из ImageView и new_x из события onTouch, может быть, проблема в том, что я приводил их как int? Я не знаю, что мне нужно сделать, чтобы это сработало, пожалуйста, помогите O:
while(old_x != new_x)
{
timedMoveIV(100);
old_x = (int)img.getX();
}
Он вызывает этот метод, который работает, если я делаю это без цикла.
public void timedMoveIV(int time_ms)
{
//sleep for time_ms milliseconds
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
public void run() {
if(new_x > img.getX())
{
img.setX(img.getX() + 1);
}
else
{
img.setX(img.getX() - 1);
}
}
}, time_ms);
}
1 ответ
Ваша главная проблема в том, что ваш цикл не прерывается, поэтому он постоянно запускает функцию, публикуя gazillion runnables.
То, что вы хотите сделать, это сделать вызов runnable сам по себе еще через 100 мс. Взгляните на этот пример:
if(old_x != new_x)
timedMoveIV(100);
Здесь вы просто вызываете функцию один раз. После этого вы позволяете опубликованному исполняемому файлу решать, нужно ли ему снова перемещаться:
public void timedMoveIV(final int time_ms)
{
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
public void run()
{
if(new_x > img.getX())
img.setX(img.getX() + 1);
else
img.setX(img.getX() - 1);
// if not in position, call again
if((int)img.getX() != new_x)
timedMoveIV(time_ms);
}
}, time_ms);
}
Стоит остановиться один раз img.getX() == new_x
, Обратите внимание на приведение к int
тем не менее, потому что, если вы пропустите это, вы можете получить некоторое колебание, поскольку оно попадает в пиксель от пункта назначения.
Это предполагает, что new_x
является int
, Если это тоже float, вы должны либо привести оба к int для сравнения, либо сравнить их с минимальным порогом. Например, если есть меньше, чем 0.5
Разница, относитесь к ней как к "выполненному".