android imageview长按和常规按

android imageview长按和常规按,android,imageview,contextmenu,Android,Imageview,Contextmenu,我有一个imageview,在这里我需要长按(用于上下文菜单)和常规按都可以工作。我可以让一个或另一个工作,但不能两者都工作。我错过了什么?以下代码仅适用于常规压力机。我一触摸屏幕,它就开始执行onTouch代码 ImageView image = (ImageView)findViewById(R.id.visible_image); image.setLongClickable(true); image.setOnTouchListener(new OnTouchListener()

我有一个imageview,在这里我需要长按(用于上下文菜单)和常规按都可以工作。我可以让一个或另一个工作,但不能两者都工作。我错过了什么?以下代码仅适用于常规压力机。我一触摸屏幕,它就开始执行onTouch代码

 ImageView image = (ImageView)findViewById(R.id.visible_image);
 image.setLongClickable(true);
 image.setOnTouchListener(new OnTouchListener() {
    public boolean onTouch(View v, MotionEvent ev) {
        switch (ev.getAction()) {
         case MotionEvent.ACTION_DOWN:
            // disable the screen taps for 500ms
            DecodeActionDownEvent(v, ev, bm2);
         case MotionEvent.ACTION_MOVE:
         case MotionEvent.ACTION_UP:
     }
        return true;
    }
 });
 registerForContextMenu(image);

@覆盖
public void onCreateContextMenu(ContextMenu,视图v,
上下文菜单信息(menuInfo){
菜单。设置标题(“编辑”);
ArrayList menuItems=新建ArrayList();
menuItems.add(“编辑页面设置”);
menuItems.add(“编辑页面对象”);
menuItems.add(“编辑此对象”);

对于(int i=0;i您可以尝试这样做:

ImageView imageView = (ImageView) findViewById(R.id.ImageView);
imageView.setOnLongClickListener(new OnLongClickListener() {

    @Override
    public boolean onLongClick(View v) {
                    //your stuff
        return true;
    }
});
imageView.setOnClickListener(new OnClickListener() {
    @Override
    public boolean onClick(View v) {
        //your stuff
        return true;
    }
});

要获取x和y坐标,请设置触摸侦听器

      ImageView.setOnTouchListener(new View.OnTouchListener()
      {
        public boolean onTouch(View v, MotionEvent event)
        {
           //And u can get x and y values like:

           x = event.getX(); 
           y = event.getY() ;
        }
      }

经过多次观察和试验,这是我发现的实现此类行为的最佳解决方案:

//Define these variables at the beginning of your Activity or Fragment:
private long then;
private int longClickDuration = 5000; //for long click to trigger after 5 seconds

...

ImageView imageView = (ImageView) findViewById(R.id.visible_image);
imageView.setOnTouchListener(new OnTouchListener() {
      @Override
      public boolean onTouch(View v, MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
          then = (long) System.currentTimeMillis();
        } else if (event.getAction() == MotionEvent.ACTION_UP) {
          if ((System.currentTimeMillis() - then) > longClickDuration) {
            /* Implement long click behavior here */
            System.out.println("Long Click has happened!");
            return false;
          } else {
            /* Implement short click behavior here or do nothing */
            System.out.println("Short Click has happened...");
            return true;
          }
        }
        return true;
      }
    });

好的,我还没有试过,它看起来会起作用。你能告诉我如何从传入的视图v中获取单击/长单击x&y坐标吗?没关系,我已经解决了。我仍然需要与OnTouch侦听器保持联系。谢谢:)
返回真值
对于那些已经拥有两个侦听器但使用了默认自动完成功能的人来说是很重要的一点,我认为单击有一个附加条件:手指不应该移动太多(比如用刷子)。因此保持X和Y也是一个好主意。。。
//Define these variables at the beginning of your Activity or Fragment:
private long then;
private int longClickDuration = 5000; //for long click to trigger after 5 seconds

...

ImageView imageView = (ImageView) findViewById(R.id.visible_image);
imageView.setOnTouchListener(new OnTouchListener() {
      @Override
      public boolean onTouch(View v, MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
          then = (long) System.currentTimeMillis();
        } else if (event.getAction() == MotionEvent.ACTION_UP) {
          if ((System.currentTimeMillis() - then) > longClickDuration) {
            /* Implement long click behavior here */
            System.out.println("Long Click has happened!");
            return false;
          } else {
            /* Implement short click behavior here or do nothing */
            System.out.println("Short Click has happened...");
            return true;
          }
        }
        return true;
      }
    });