如何判断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 

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

  • 通过家长捕捉onTouch事件,处理并传递给孩子
  • 我如何知道一个MotionEvent是相对的还是绝对的?
  • 触摸设备上的jQuery拖放(iPad,Android)
  • 用不同的点击状态创build不规则形状的ImageButton
  • 如何在Galaxy Nexus等设备上隐藏软触button
  • 如何扩展视图的触摸区域
  • 有谁知道getevent的输出意味着什么?
  • android在MotionEvent中getAction()和getActionMasked()之间有什么区别
  • 这是你通常如何创建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; } }); 

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