Всем привет. Такая задача: нужно реализовать долгое нажатие кнопки. При нажатии должно циклично происходить действие и как только отпускается кнопка, оно должно завершиться.
при использовании .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;
}
});
вот это бесконечно работает.
как сделать так, что бы при нажатии постоянно делалось одно действие, а после отжатия кнопки оно прекращалось?
Делал я подобную задачу для визиуального счетчика. Нажал кнопку, держишь - и счетчик мотается. Делалось это давно, и не совсем аккуратно, но код был рабочий и выполнял именно то, что вам нужно (по концепции). Это сам листенер:
// 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)
}
}
Это позволяло обрабатывать нажатие сразу двух кнопок: счтечик внизу и счетчик вверх (даже одновременно). Думаю, на его основе вы сможете реализовать свое решение. Еще раз, я не дал готового решения, это лишь возможный путь к нему.
down.setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
// TODO Auto-generated method stub
return true;
}
});
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Имеется две активности: первая -карта, вторая - просто пустая активностьСценарий такой: покрутили, попередвигали карту (первая активность),...
Ребят, можете подсказать, если плагины/инструменты чтобы отчеты по JMeter более наглядно показывалисьВроде примерно разобрался как смотреть,...
У меня есть SeekBar , при скроллинге его значения умножается на 20000(мелочи расчетов), и сразу же отображается в другом блоке в виде ценыС Этим все...
Мне нужно что бы приложение читало только новые данные, а остальные(ранее скачанные) хранило оффлайн и не скачивало заново