我到处寻找这个问题的答案,但找不到任何有效的答案。
对于我的大学作业,我需要在 Android Studio 中创建一个冒险游戏。我希望当我单击向下并按住箭头按钮(因此在给定向上按钮的情况下)时,ImageView(播放器)将不断在屏幕上移动,直到我释放按钮。我尝试过使用 ACTION_UP 和 ACTION_DOWN 的 OnTouchListeners 和鼠标事件,这可以工作,但不符合我的需要,因为单击时它仍然只移动一步。
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);
}
});
最佳答案
将触摸监听器视为状态机。当 ACTION_DOWN 事件发生时,开始执行您想做的任何操作。当 ACTION_UP/ACTION_CANCEL 事件发生时,停止您的操作。那么您如何实现呢?
您的州旗可以是一个简单的 boolean 值:
boolean shouldCharacterMove = false;
定义 View 的触摸监听器。
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
之前,我们需要找出一种移动项目的方法。我们可以通过 X 毫秒后运行的 Runnable 来完成此操作。
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);
}
}
关于java - 当按住按钮时,如何使 ImageView 在屏幕上不断移动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34370706/