Android, Java. Как можно реализовать действие при касании кнопки, и при этом ещё сделать цикличное выполнение действий при удержании этой кнопки?
С просто касанием всё понятно:
left.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
deleteFig();
if (xOfUpperLeftCorner != 0) {
xOfUpperLeftCorner--;
}
try {
spawnFig(xOfUpperLeftCorner, yOfUpperLeftCorner, figNum, figState);
} catch (IOException e) {
e.printStackTrace();
}
}
return true;
}
});
А как на эту же кнопку прикрутить цикличное выполнение этих же действий, пока она удерживается?
UPD2:
Попробовал вот так:
right.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
upRight = false;
deleteFig();
if (xOfUpperLeftCorner != xCells - currentFigWidth) {
xOfUpperLeftCorner++;
}
try {
spawnFig(xOfUpperLeftCorner, yOfUpperLeftCorner, figNum, figState);
} catch (IOException e) {
e.printStackTrace();
}
}
if (motionEvent.getAction() == MotionEvent.ACTION_UP) {
upRight = true;
}
handler.postDelayed(new Runnable() {
@Override
public void run() {
if (!upRight) {
deleteFig();
if (xOfUpperLeftCorner != xCells - currentFigWidth) {
xOfUpperLeftCorner++;
}
try {
spawnFig(xOfUpperLeftCorner, yOfUpperLeftCorner, figNum, figState);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}, 650);
return true;
}
});
Работает, но забагованно, много раз срабатывает лишнее.
Ответы (1 шт):
Автор решения: Tiarait
→ Ссылка
Итак, для начала нам нужна некая вьюшка private View right, переменная, что обозначает отпускание private boolean upRight = false и сам поток, где будет цикл:
Thread thread = new Thread(){
public void run() {
try {
while (!upRight) {
//сюда ваш код
Thread.sleep(650);
}
} catch (InterruptedException ex) {
//handle the exception
}
}
};
И дальше задаем слушатель нажатия TouchListener на вью right:
right.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
upRight = false;
thread.start();
} else if (motionEvent.getAction() == MotionEvent.ACTION_UP ||
motionEvent.getAction() == MotionEvent.ACTION_CANCEL) {
upRight = true;
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return true;
}
});
Если внутри потока нужны действия над вью (изменение размера, цвета и т. д.), то нам это нужно делать в основном потоке:
if (getActivity() != null) getActivity().runOnUiThread(() -> {
//здесь ваш код
});
На самом деле от upRight можно отказаться, а while (!upRight) заменить на другой while.