brown = (Button) findViewById(R.id.brownButton);
brown.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
count++;
Log.d("count", "" + count);
return true;
} else if (event.getAction() == (MotionEvent.ACTION_UP)) {
count--;
Log.d("count", "" + count);
return true;
}
return false;
}
});
Когда мой палец нажимает и удерживает кнопку, мой счет будет увеличиваться только один раз. Когда я отпущу, это соответственно уменьшится. Пожалуйста, может кто-нибудь покажет мне, как я могу увеличить свой код, пока мой палец удерживает кнопку нажатой. Благодарю.
Мне также нужно было это сделать, но на этот вопрос никогда не отвечали должным образом, хотя он довольно старый. Однако здесь можно найти хорошее решение: повторное действие андроида при нажатии и удержании кнопки
Я приспосабливаю это решение к этой проблеме. Я тестировал его, и он работает для меня.
Button brown = (Button) findViewById(R.id.brownButton);
brown.setOnTouchListener(new View.OnTouchListener() {
private Handler mHandler;
private int count = 0;
@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 true; // before I had written false
}
Runnable mAction = new Runnable() {
@Override
public void run() {
Log.d("count: ", "" + count);
count++;
mHandler.postDelayed(this, 500);
}
};
});
В будущем я применим это решение к пользовательской мягкой клавиатуре, чтобы позволить пробелу и клавишам удаления продолжать работу при удержании.
Обновление: сегодня я, наконец, добрался до клавиши непрерывного удаления. Я думал, что раньше тестировал свой код, но сегодня, когда я это делал, мне пришлось возвращать true
из метода onTouch
, чтобы заставить его работать.
Слушатель прослушивания работает следующим образом:
Он получает событие ACTION_DOWN (пользователь прикасается)
Затем он получает все следующие события (если возвращается истина) и рассматривает все следующие события как события ACTION_MOVE
Сенсорный lisetener продолжает получать события ACTION_MOVE, пока не получит событие ACTION_UP или ACTION_CANCEL.
Таким образом ACTION_DOWN запускается только один раз, затем любое количество событий ACTION_MOVE, затем либо один ACTION_UP, либо ACTION_CANCEL.
Если вы хотите, чтобы ваш счетчик увеличивался, вам нужно проверить события ACTION_MOVE.
@Override
public boolean onTouch(View v, MotionEvent event) {
switch(event.getAction()){
case MotionEvent.ACTION_DOWN:
//do something on DOWN
break;
case MotionEvent.ACTION_MOVE:
//do something on MOVE
break;
case MotionEvent.ACTION_UP:
//do something on UP
break;
}
return true;
}
Возможно, эта ссылка может помочь вам:
MotionEvent.ACTION_DOWN
ли вы какие-либо другие сообщения, кромеMotionEvent.ACTION_DOWN
илиMotionEvent.ACTION_UP
, например,MotionEvent.ACTION_MOVE
?