Как сделать долгое нажатие кнопки в android studio

234
13 октября 2018, 16:10

Всем привет. Такая задача: нужно реализовать долгое нажатие кнопки. При нажатии должно циклично происходить действие и как только отпускается кнопка, оно должно завершиться.

при использовании .setOnTouchListener и последующих отловах состояния MotionEvent.ACTION_DOWN и MotionEvent.ACTION_UP это происходит 1 раз, а если я отловы вставлю в цикл, то бесконечно будет работать.

        Button.setOnTouchListener(new View.OnTouchListener() {
        boolean OK = true;
        @Override
        public boolean onTouch(View view, MotionEvent event) {
            while (OK) {
                if (event.getAction() == MotionEvent.ACTION_DOWN) {
                    System.out.println("8");
                } else if (event.getAction() == MotionEvent.ACTION_UP){
                    System.out.println("стопэ");
                    OK = false;
                }
            }
            return true;
        }
    });

вот это бесконечно работает.

как сделать так, что бы при нажатии постоянно делалось одно действие, а после отжатия кнопки оно прекращалось?

Answer 1

Делал я подобную задачу для визиуального счетчика. Нажал кнопку, держишь - и счетчик мотается. Делалось это давно, и не совсем аккуратно, но код был рабочий и выполнял именно то, что вам нужно (по концепции). Это сам листенер:

    // event of touch-method for plus and minus buttons
@SuppressLint("ClickableViewAccessibility")
override fun onTouch(view: View, motionEvent: MotionEvent): Boolean {
    if (motionEvent.action == MotionEvent.ACTION_DOWN) {
        when (view) {
            binding.addPage -> {
                incTread = true
                Thread(MyThread(true)).start()
            }
            binding.minusPage -> {
                decTread = true
                Thread(MyThread(false)).start()
            }
        }
    }
    if (motionEvent.action == MotionEvent.ACTION_UP || motionEvent.action == MotionEvent.ACTION_CANCEL) {
        when (view) {
            binding.addPage -> incTread = false
            binding.minusPage -> decTread = false
        }
    }
    if(motionEvent.action == MotionEvent.ACTION_BUTTON_RELEASE)
    view.performClick()
    return true
}

А вот это поток:

// additional thread
inner class MyThread(private val increment: Boolean) : Runnable {
    override fun run() {
        if(increment){
            while(incTread) {
                if (book.getCurrentPage() < book.getCountPages()) {
                    book.incCurrentPage()
                    changeBook()
                }else{
                    incTread = false
                }
                Thread.sleep(100)
            }
        }else{
            while(decTread) {
                if (book.getCurrentPage() > 0) {
                    book.decCurrentPage()
                    changeBook()
                }else{
                    decTread = false
                }
                Thread.sleep(100)
            }
        }
    }
    @SuppressLint("SetTextI18n")
    private fun changeBook(){
        book.setChanged()
        supportBook.updateBook(book)
        // send message to handler in main thread
        val msg = Message()
        msg.obj = "${book.getCurrentPage()}/${book.getCountPages()}"
        handler.sendMessage(msg)
    }
}

Это позволяло обрабатывать нажатие сразу двух кнопок: счтечик внизу и счетчик вверх (даже одновременно). Думаю, на его основе вы сможете реализовать свое решение. Еще раз, я не дал готового решения, это лишь возможный путь к нему.

Answer 2
down.setOnLongClickListener(new OnLongClickListener() { 
        @Override
        public boolean onLongClick(View v) {
            // TODO Auto-generated method stub
            return true;
        }
    });
READ ALSO
Возврат прежней точки карты в Google maps api

Возврат прежней точки карты в Google maps api

Имеется две активности: первая -карта, вторая - просто пустая активностьСценарий такой: покрутили, попередвигали карту (первая активность),...

155
Отчеты в JMeter

Отчеты в JMeter

Ребят, можете подсказать, если плагины/инструменты чтобы отчеты по JMeter более наглядно показывалисьВроде примерно разобрался как смотреть,...

179
Расчет цены при помощи SeekBar

Расчет цены при помощи SeekBar

У меня есть SeekBar , при скроллинге его значения умножается на 20000(мелочи расчетов), и сразу же отображается в другом блоке в виде ценыС Этим все...

167
firestore сохранение данных локально

firestore сохранение данных локально

Мне нужно что бы приложение читало только новые данные, а остальные(ранее скачанные) хранило оффлайн и не скачивало заново

190