Androidで移動するオブジェクトを一時停止する方法
-
29-10-2019 - |
質問
Androidゲームを開発しています。これには、画面に2つの移動画像があり、この画像をドラッグすることができますが、私のさらなる要件は、画像に触れるときに画像を一時停止することです。画像を一時停止するイベントを見つけることはありません。また、画像が一時停止されたのと同じ位置で移動を再開します。
どんな体でも解決策を教えてもらえますか。ありがとう。
Ontouchを使用して画像をドラッグして移動しています。
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
Parcelable state=null;
// delegating event handling to the droid
droid1.handleActionDown((int)event.getX(), (int)event.getY());
droid2.handleActionDown((int)event.getX(), (int)event.getY());
// check if in the lower part of the screen we exit
if (event.getY() > getHeight() - 50) {
thread.setRunning(false);
((Activity)getContext()).finish();
} else {
Log.d(TAG, "Coords: x=" + event.getX() + ",y=" + event.getY());
}
} if (event.getAction() == MotionEvent.ACTION_MOVE) {
// the gestures
if (droid1.isTouched()) {
// the droid was picked up and is being dragged
droid1.setX((int)event.getX());
droid1.setY((int)event.getY());
}
if (droid2.isTouched()) {
// the droid was picked up and is being dragged
droid2.setX((int)event.getX());
droid2.setY((int)event.getY());
}
} if (event.getAction() == MotionEvent.ACTION_UP ) {
// touch was released
if (droid1.isTouched()) {
droid1.setTouched(false);
}
if (droid2.isTouched()) {
droid2.setTouched(false);
}
}
return true;
}
解決
コメントにコードとdeリンクに基づいて、目標を達成するために変更する必要があることがいくつかあります。まず、単一のタップとドラッグの動きを区別できる必要があります。前者は画像/ドロイドを「一時停止」しますが、後者はそれをドラッグすることができます。
これに行く1つの方法は、アクションを決定するフラグを保持することです。このようなもの:
private boolean mIsDragging = false;
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
// delegating event handling to the droid
droid1.handleActionDown((int)event.getX(), (int)event.getY());
droid2.handleActionDown((int)event.getX(), (int)event.getY());
...
mIsDragging = false;
} if (event.getAction() == MotionEvent.ACTION_MOVE) {
// the gestures
if (droid1.isTouched()) {
// the droid was picked up and is being dragged
droid1.setX((int)event.getX());
droid1.setY((int)event.getY());
}
if (droid2.isTouched()) {
// the droid was picked up and is being dragged
droid2.setX((int)event.getX());
droid2.setY((int)event.getY());
}
mIsDragging = true;
} if (event.getAction() == MotionEvent.ACTION_UP ) {
if (!mIsDragging) {
// Not dragging means a 'click', thus toggle pausing
if (droid1.isTouched()) {
droid1.setPaused(!droid1.isPaused());
}
if (droid2.isTouched()) {
droid2.setPaused(!droid2.isPaused());
}
}
// Always reset on up action
if (droid1.isTouched()) {
droid1.setTouched(false);
}
if (droid2.isTouched()) {
droid2.setTouched(false);
}
mIsDragging = false;
}
return true;
}
実際に画像/ドロイドがもう動きをするのを止めるには、水平方向と垂直方向の両方で速度を「0」に設定する方法を追加する必要があります。または、位置を更新するかどうかを示すフラグを設定することもできます。
どのアプローチに基づいているかに基づいて、「一時停止」状態を考慮に入れるために更新ロジックを変更する必要がある場合があります。単に速度を(0,0)に設定することを選択した場合、変位が両方向に「0」になるため、おそらく何もする必要はありません。
コードスニペットでは、setpause(boolean)とispaused()メソッドがあると仮定しています。これらは、フラグまたは速度値で直接動作する必要があります。
たとえば、フラグの使用:
private boolean mIsPaused = false;
public void setPaused(boolean pause) {
mIsPaused = pause;
}
public boolean getPaused() {
return mIsPaused;
}
...
public void update() {
// Only update if we're not dragging and not 'paused'
if (!touched && !mIsPaused) {
x += (speed.getXv() * speed.getxDirection());
y += (speed.getYv() * speed.getyDirection());
}
}
または速度値を直接使用してください。
private Speed mSpeed = new Speed(1,1);
public void setPaused(boolean pause) {
pause ? mSpeed.setSpeed(0,0) : mSpeed.setSpeed(1,1);
}
public boolean getPaused() {
return mSpeed.getX() == 0 && mSpeed.getY() == 0;
}
...
public void update() {
// No change necessary as multiplying by '0' results in a zero displacement
}
コードのいずれもテストしていないことも、完全な例であることを意図していないことに注意してください。