Я хочу выполнить повторное действие при нажатии и удержании кнопки. Пример. Когда пользователь нажимает кнопку и удерживает ее, он должен повторять аналогичный метод снова и снова с фиксированным интервалом, пока пользователь не удалит палец с кнопки.
Повторное действие андроида при нажатии и удержании кнопки
Ответ 1
Существует несколько способов сделать это, но довольно простой - отправить сообщение Runnable
на Handler
с определенной задержкой. В ней самая основная форма, она будет выглядеть примерно так:
Button button = (Button) findViewById(R.id.button);
button.setOnTouchListener(new View.OnTouchListener() {
private Handler mHandler;
@Override public boolean onTouch(View v, MotionEvent event) {
switch(event.getAction()) {
case MotionEvent.ACTION_DOWN:
if (mHandler != null) return true;
mHandler = new Handler();
mHandler.postDelayed(mAction, 500);
break;
case MotionEvent.ACTION_UP:
if (mHandler == null) return true;
mHandler.removeCallbacks(mAction);
mHandler = null;
break;
}
return false;
}
Runnable mAction = new Runnable() {
@Override public void run() {
System.out.println("Performing action...");
mHandler.postDelayed(this, 500);
}
};
});
Идея довольно проста: post a Runnable
, содержащий повторяющееся действие на Handler
, когда происходит действие "вниз". После этого не отправляйте Runnable
еще раз, пока не будет выполнено действие "вверх". Runnable
будет размещать себя в Handler
(пока действие "вниз" по-прежнему происходит), пока оно не будет удалено действием касания - это то, что позволяет "повторяющийся" аспект.
В зависимости от фактического поведения кнопки и ее onclick/ontouch, за которым вы после этого, вы можете сделать начальную запись без задержки.
Ответ 2
Хотя это не отличная идея. Это можно сделать, запустив таймер на onKeyDown
, чтобы стрелять с интервалом, в течение которого вы перемещаете курсор на один шаг и перезапускаете таймер. Затем вы можете отменить таймер на событии onKeyUp
. Способ, которым это работает в других системах, состоит в том, чтобы, как правило, перемещаться по первому ключу, а затем немного ждать, чтобы убедиться, что пользователь определенно удерживает кнопку... тогда повторение может быть немного быстрее. Подумайте, что клавиатура автоматически повторяется. Это должно работать и не должно отрицательно влиять на поток ui.
Ответ 3
Вы можете зарегистрировать View.OnKeyListener
для этого представления. Пожалуйста, учтите, что лучше отказаться от таких обратных вызовов, иначе - если ваш метод делает что-то даже немного "тяжелое" - пользовательский интерфейс не будет плавным.