安卓ImageView:长按和普通点击

6

我有一个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);

...

 @Override
 public void onCreateContextMenu(ContextMenu menu, View v,
     ContextMenuInfo menuInfo) {
    menu.setHeaderTitle("Edit");
    ArrayList<String> menuItems = new ArrayList<String>();
    menuItems.add("Edit page settings");
    menuItems.add("Edit page objects");
    menuItems.add("Edit this object");
    for (int i = 0; i<menuItems.size(); i++) {
        menu.add(Menu.NONE, i, i, menuItems.get(i));
    }
 }
3个回答

20

你可以尝试通过以下方式完成:

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;
    }
});

好的,我之前没有尝试过这个方法,看起来应该可以。你能告诉我如何从传入的 View v 中获取点击/长按的 x 和 y 坐标吗? - MrGibbage
1
没事了,我已经解决了。我还需要保留OnTouch监听器。谢谢 :) - MrGibbage
“return true” 对于那些已经拥有两个监听器但是使用了默认的“onLongClick”自动完成的人来说是非常重要的一部分。 - Prof

3

经过反复查找和试验,我发现以下是实现此类行为的最佳解决方案:

//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;
      }
    });

1
我认为点击有一个额外的条件:手指不应该移动太多(就像滑动一样)。因此,在这里保留thenX和thenY也可能是一个好主意... - Dominikus K.

2
要获取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() ;
        }
      }

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