如何在安卓系统中判断长按操作?

17
我正在寻找一种方法,当用户长时间触摸地图视图(比方说1000毫秒),我可以执行某些操作。如何判断用户长时间按住地图视图(或任何视图)?这类似于Android Google Maps应用程序,当您长时间按住时,它会弹出气球覆盖物项。
编辑添加
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

结束时间应该被设置为零...但它没有被设置...有什么想法为什么吗?


这个完美地运行了!以下是 C#/Xamarin 版本,如果有需要的话:protected long _touchStartTime; public override bool OnTouchEvent(MotionEvent e){if (e.Action == MotionEventActions.Down) _touchStartTime = e.EventTime; if (e.Action == MotionEventActions.Up && e.EventTime - _touchStartTime > 1000) DoSomethingFun(); return base.OnTouchEvent(e);} - BayssMekanique
你好,你解决了如何在用户按下按钮一定时间后执行操作的问题了吗(比如说1000毫秒)? - Syed Rafay
这里有一些有用的答案,即使到最后 ;) - dvn
6个回答

8
这是通常创建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)

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

1
@molleman,我猜Umitk给了你实现长按的正确方法。他的代码与原始Android视图中的longClick完全相同。 - Igor Tyulkanov

4
您可能正在寻找普通的长按操作? 您需要在视图的xml中添加android:longClickable或调用setLongClickable(true)来使其可长按。 然后您可以将OnLongClickListener添加到视图中。 我不知道如何确定长按的确切时间。但是默认的长按与您提到的Google地图长按相同。
参考链接:OnLongClickListener

3

您可以设置长按监听器和触摸监听器。添加一个布尔类数据成员变量longClicked并最初将其设置为false。以下是如何设置长按监听器的方法。

    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 地图长按相同的效果。希望能对您有所帮助。


它可以工作,只需要在这里进行一个更正,您应该从onLongClickListener启用setOnTouchListener,以便它将启用触摸监听器。就像这样v.setOnTouchListener(this)。 - Ritesh Adulkar

1

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


0

这是我如何使用长按和短按的方法

View.setOnTouchListener(new View.OnTouchListener() {
        double firsttouch=0;
        boolean isup=false;
        int millistotouch=1000;
        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {

            if (motionEvent.getAction()==MotionEvent.ACTION_DOWN) {
                firsttouch = (double) System.currentTimeMillis();
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        if (!isup) {
                             //
                             // Do your long click work
                             //
                            }
                            else
                            {
                                firsttouch=0;
                                isup=false;
                            }
                        }
                    }
                }, millistotouch);
                return true;
            }
            if (motionEvent.getAction()==MotionEvent.ACTION_UP) {
                if (((double) System.currentTimeMillis()-firsttouch)<millistotouch)
                {
                    isup=true;
                    //
                    // Do your short click work
                    //
                }

            }
            return false;
        }
    });

1
目前你的回答不够清晰,请编辑并添加更多细节,以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何编写好答案的更多信息。 - Community

0

MotionEvent.ACTION_UP 时,endTime 将被设置为 ev.getEventTime(),这会导致在 MotionEvent.ACTION_MOVE 不受影响时将 endTime 设置为零。 而不是将 endTime 设置为零,您应该将 startTime 设置为 ev.getEventTime()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接