Исходя из вашего кода и ссылки в вашем комментарии, есть несколько вещей, которые необходимо изменить для достижения вашей цели. Прежде всего, вам нужно будет уметь различать одно касание и движение перетаскивания. Первый «приостановит» изображение / дроида, а второй позволит вам перетаскивать его.
Один из способов сделать это - сохранить флаг, который определяет действие. Примерно так:
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
}
Обратите внимание, что я не тестировал ни один из кодов и не собираюсь быть полным примером.