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.

→ Ссылка