Android onTouch无法正常工作

时间:2014-08-10 15:44:39

标签: java android ontouchlistener

我有以下代码应该这样做:我有一个带背景的ImageView对象和一个代表图形的位图。图有它的矩形,我画它。当我触摸ImageView对象时,如果我触摸图形矩形中的某个位置,我就会去"选择"手指移动的同时移动它,当我把手指放上时放下它。如果我在图形矩形之外的任何地方触摸屏幕,我什么都不做 - 完全忽略触摸。我的代码如下所示:

  protected int lastx, lasty;
  protected MyImageView iv;

  ...

  public boolean onTouch(View v, MotionEvent event) {
       switch(event.getActionMasked())
       {
        case MotionEvent.ACTION_DOWN:
            lastx = (int)event.getX();
            lasty = (int)event.getY();
            if(!iv.inFigure((int)lastx, (int)lasty))
                {
                    return false;
                }
            else
            {
                return true;
            }


        case MotionEvent.ACTION_MOVE:

            int x = (int) event.getX();
            int y = (int) event.getY();
            iv.move(x - lastx, y - lasty);
            lastx = x;
            lasty = y;

            return true;

        default:
        {

            int x = (int) event.getX();
            int y = (int) event.getY();
            iv.move(x - lastx, y - lasty);
            lastx = x;
            lasty = y;

            return true;
        }

      }
   }

问题是,无论我在哪里触摸屏幕图形都会开始移动,而不仅仅是当我触摸它的矩形时。 iv.inFigure(x,y)运行正常,证明这个代码在我添加这个布尔变量时有效:

  protected int lastx, lasty;
  protected MyImageView iv;
  protected boolean startMoving = false;

  ...

  public boolean onTouch(View v, MotionEvent event) {
       switch(event.getActionMasked())
       {
        case MotionEvent.ACTION_DOWN:
            lastx = (int)event.getX();
            lasty = (int)event.getY();
            if(!iv.inFigure((int)lastx, (int)lasty))
                {
                    startMoving = false;
                    return false;
                }
            else
            {
                startMoving = true;
                return true;
            }


        case MotionEvent.ACTION_MOVE:

          if(startMoving)
            {
               int x = (int) event.getX();
               int y = (int) event.getY();
               iv.move(x - lastx, y - lasty);
               lastx = x;
               lasty = y;
            }
            return true;

        default:
        {
           if(startMoving)
            {
               int x = (int) event.getX();
               int y = (int) event.getY();
               iv.move(x - lastx, y - lasty);
               lastx = x;
               lasty = y;
            }
            return true;
        }

      }
   }

据我所知,第一个代码应该可以在不添加额外标志的情况下工作,因为当ACTION_DOWN返回false时会忽略ACTION_MOVE,直到我们再次检测到ACTION_DOWN并返回true。所以,当我触摸屏幕的地方,其中inFigure将返回false,我应该忽略任何从触摸开始的移动,但仍然,我的身材移动。使用startMoving变量和其他检查一切正常。但是我不想使用那个变量,我想知道为什么我的代码没有它就行不通。可能是什么问题?

1 个答案:

答案 0 :(得分:0)

你永远不应该在默认情况下返回true(除非你真的需要) 你最好还是回复一下:

return super.onTouch(event);

据我了解您要实现的目标,您只需要倾听ACTION_DOWNACTION_MOVEACTION_UPACTION_CANCEL