Ответ 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, за которым вы после этого, вы можете сделать начальную запись без задержки.