Как определить длительное касание на Android?
Я ищу способ, когда пользователь долго коснется карты (скажем, за 1000 мс), что я могу как-то сделать какое-то действие.
Как бы я подумал о том, как долго пользователь долго коснется карты (или любого вида).
Он будет похож на приложение Android для Google Android, когда вы долго касаетесь его, он вызывает элемент наложения шара.
Редактировать добавлено
mapView.setOnLongClickListener(new View.OnLongClickListener() {
public boolean onLongClick(View v) {
Toast.makeText(mapView.getContext(), "Hello 123", 2000);
return false;
}
});
выше не работает... какие-нибудь идеи почему?
Редактировать добавлено
Это то, что я пытаюсь на данный момент, но он не работает, даже если я только нажимаю на телефон, он говорит, что событие является action_move,
Я использую внутренний класс в моей MapActivity
private long startTime=0;
private long endTime=0;
class MapOverlay extends Overlay {
@Override
public boolean onTouchEvent(MotionEvent ev, MapView mapView) {
if(ev.getAction() == MotionEvent.ACTION_DOWN){
//record the start time
startTime = ev.getEventTime();
Log.d("LC", "IN DOWN");
}else if(ev.getAction() == MotionEvent.ACTION_UP){
//record the end time
endTime = ev.getEventTime();
Log.d("LC", "IN UP");
}else if(ev.getAction() == MotionEvent.ACTION_MOVE){
Log.d("LC", "IN move");
endTime=0;
}
//verify
if(endTime - startTime > 1000){
//we have a 1000ms duration touch
//propagate your own event
Log.d("LC", "time touched greater than 1000ms");
Toast.makeText(getBaseContext(), "Hello 123", Toast.LENGTH_SHORT).show();
startTime=0;
endTime=0;
return true; //notify that you handled this event (do not propagate)
}
return false;//propogate to enable drag
}
}
и вот мой журнал ошибок, который не имеет для меня никакого смысла
06-29 14:29:55.509: DEBUG/LC(7693): IN move
06-29 14:29:56.149: DEBUG/LC(7693): IN UP
06-29 14:29:56.149: DEBUG/LC(7693): 6346707 6349261
06-29 14:29:56.149: DEBUG/LC(7693): time touched greater than 1000ms
конечное время должно быть установлено на ноль... но это не... любая идея, почему?
Ответы
Ответ 1
Вот как вы обычно создаете onLongClickListener. Попробуйте следующее:
mapView.setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View arg0) {
Toast.makeText(mapView.getContext(), "Hello 123", 2000);
return false;
}
});
Ссылка на ваше редактирование:
Это может быть способ получить то, что вы хотите.
private final Handler handler = new Handler();
private final Runnable runnable = new Runnable() {
public void run() {
checkGlobalVariable();
}
};
// Other init stuff etc...
@Override
public void onTouchEvent(MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_DOWN) {
// Execute your Runnable after 1000 milliseconds = 1 second.
handler.postDelayed(runnable, 1000);
mBooleanIsPressed = true;
}
if(event.getAction() == MotionEvent.ACTION_UP) {
if(mBooleanIsPressed) {
mBooleanIsPressed = false;
handler.removeCallbacks(runnable);
}
}
}
И теперь вы можете проверить с помощью функции checkGlobalVariable:
if(mBooleanIsPressed == true)
Вот как вы можете справиться с этим делом. Удачи.
Ответ 2
Возможно, вы ищете нормальный длинный клик?
Вам нужно будет настроить просмотр на длительный клик, добавив андроид: longClickable к вашим представлениям xml или вызовив setLongClickable (true).
Затем вы можете добавить OnLongClickListener в представление.
Я не знаю, как точно определить, как долго длительный щелчок. Но длинный клик по умолчанию совпадает с длинным кликом Google Maps, который вы упомянули.
OnLongClickListener
Ответ 3
используйте System.currentTimeMillis()
вместо ev.getEventTime();
Ответ 4
Когда MotionEvent.ACTION_UP
, endTime
будет установлено значение ev.getEventTime(), это сделает установку endTime
равной нулю, когда MotionEvent.ACTION_MOVE
не будет влиять.
Вместо того чтобы установить endTime
на ноль, вы должны установить startTime
в ev.getEventTime()
Ответ 5
Вы можете настроить longClickListener и touchListener. Добавьте переменную члена данных типа boolean class longClicked и сначала установите значение false. Вот как вы можете установить longClickListener.
view.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
longClicked = true;
return false;
}
});
Для touchListener
view.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if(longClicked){
//Do whatever you want here!!
longClicked = false;
}
return false;
}
});
Это даст вам тот же эффект, что и длинный клик Google Maps. Надеюсь, что это поможет.