2015-12-19 2 views
2

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

Для моего университетского задания мне нужно создать приключенческую игру в андроид-студии. Я хочу, чтобы это было, когда я нажимаю вниз и удерживаю кнопку со стрелкой (так что в случае, если у вас есть кнопка вверх), что ImageView (плеер) будет постоянно перемещаться по экрану, пока я не отпущу кнопку. Ive пробует OnTouchListeners и события мыши, используя ACTION_UP и ACTION_DOWN, и это работает, но не для того, что мне нужно, поскольку оно по-прежнему перемещается только на один шаг при нажатии.

 ImageView IV_player; 
     Button ButtonUp; 

     IV_player = (ImageView) findViewById(R.id.IV_player); 
     ButtonUp = (Button) findViewById(R.id.ButtonUp);  

     ButtonUp.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      IV_player.setY(IV_player.getY() - 32); 

     } 
    }); 
+1

попробовать http://stackoverflow.com/questions/29433468/problems-changing-the-position-of-an-imageview-in-android HTTP : //stackoverflow.com/a/3442189/3209739, и есть много сообщений. – cgr

ответ

3

Относитесь к слушателю прикосновения, как к конечной машине. Когда происходит событие ACTION_DOWN, начните выполнять любое действие, которое вы хотите сделать. Когда происходит событие ACTION_UP/ACTION_CANCEL, прекратите действие. Итак, как вы это реализуете?

Вашего государственный флаг может быть простым логическим:

boolean shouldCharacterMove = false; 

Определите сенсорный приемник для просмотра.

ButtonUp.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      switch (event.getActionMasked()) { 
       case MotionEvent.ACTION_DOWN: 
        setShouldCharacterMove(true); 
        break; 
       case MotionEvent.ACTION_UP: 
       case MotionEvent.ACTION_CANCEL: 
        setShouldCharacterMove(false); 
        break; 
      } 
      return true; 
     } 
}); 

Прежде чем определить setShouldCharacterMove мы должны выяснить способ перемещения предметов. Мы можем сделать это через Runnable, который запускается после X миллисекунд.

private final Runnable characterMoveRunnable = new Runnable() { 
    @Override 
    public void run() { 
     float y = IV_player.getTranslationY(); 
     IV_player.setTranslationY(y + 5); // Doesn't have to be 5. 

     if (shouldCharacterMove) { 
      IV_player.postDelayed(this, 16); // 60fps 
     } 
    } 
}; 

Теперь мы можем определить setShouldCharacterMove:

void setShouldCharacterMove(boolean shouldMove) { 
    shouldCharacterMove = shouldMove; 
    IV_player.removeCallbacks(characterMoveRunnable); 
    if (shouldMove) { 
     IV_player.post(characterMoveRunnable); 
    } 
} 
Смежные вопросы