如何判断android的长触?

我正在寻找一种方式,当用户长时间触摸一个mapview(比方说1000ms),我可以做一些特定的动作。

我将如何判断用户长时间触摸mapsview(或任何视图)的时间。

这将类似于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 

结束时间应该设置为零…但它不是……任何想法为什么?

这是你通常如何创建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) 

这是你如何处理这种情况。 祝你好运。

您可能正在寻找正常的长按? 您必须通过将android:longClickable添加到视图xml或通过调用setLongClickable(true)来将视图设置为可长时间点击。 然后,您可以向视图添加OnLongClickListener。 我不知道确定长按一下多长时间的方法。 但默认长按与您提到的谷歌地图长按相同。

OnLongClickListener

使用System.currentTimeMillis()代替ev.getEventTime();

MotionEvent.ACTION_UPendTime将设置为ev.getEventTime()时,这会在MotionEvent.ACTION_MOVE不受影响时将endTime设置为零。 不应将endTime设置为零,而应将startTime设置为ev.getEventTime()

您可以设置longClickListener和touchListener。 添加一个布尔类数据成员variableslongClicked并最初将其设置为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; } }); 

它将为您提供与谷歌地图长按相同的效果。 希望能帮助到你。