2013-03-03 3 views
1

Извините, что я noob Я читал бесчисленные учебники о создании простого таймера и задавался вопросом, почему это не работает, пока я не заметил, что это цикл while, вызывающий проблему oO, я удалил его, а затем он работает, но только 1 раз мне нужно использовать цикл, хотя так движение заканчивается: CAndroid postDelayed работает, но не может поместить его в цикл?

Heres код:

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); 
} 

ответ

5

Ваша главная проблема заключается в том, что ваш цикл не перерыв, так что постоянно запустить функцию, разместив Gazillion runnables.

Что вы хотите сделать, это сделать runnable call сам за другим 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. Если это поплавок, вы должны либо сбрасывать как int, либо сравнивать их с минимальным порогом. Например, если разница меньше 0.5, относитесь к ней как к «сделанному».

+0

Отлично! Я не могу сказать, что вы достаточно часами сидели на этой вещи (хотя это было так просто)! У меня остался небольшой вопрос. Я должен сделать time_ms финальным int вместо int else, который он не примет. Есть ли вообще избежать этого, кроме создания публичной переменной? –

+0

Ну, если вы все равно будете использовать постоянную задержку, вы можете сделать ее окончательной. Я даже предлагаю пойти с последним статическим членом. Это лучше, чем иметь магические числа, плавающие вокруг. – Geobits

 Смежные вопросы

  • Нет связанных вопросов^_^