Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 安卓onTouch无法按预期工作_Java_Android_Ontouchlistener - Fatal编程技术网

Java 安卓onTouch无法按预期工作

Java 安卓onTouch无法按预期工作,java,android,ontouchlistener,Java,Android,Ontouchlistener,我有下面的代码可以做到这一点:我有一个带有背景的ImageView对象和一个表示一个图形的位图。当我触摸ImageView对象时,如果我触摸图形矩形中的某个地方,我将拾取图形并在手指移动时移动它,当我竖起手指时将其放下。如果我触摸图形矩形以外的任何屏幕,我应该什么也不做-完全忽略触摸。我的代码如下所示: protected int lastx, lasty; protected MyImageView iv; ... public boolean onTouch(View v

我有下面的代码可以做到这一点:我有一个带有背景的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.inFigurex,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\u DOWN返回false时,ACTION\u MOVE将被忽略,直到我们再次检测到ACTION\u DOWN并返回true。所以,当我触摸屏幕某个地方,inFigure将返回false时,我应该忽略从该触摸开始的任何移动,但我的身体仍然在移动。使用startMoving变量和其他检查,一切正常。但是我不想使用那个变量,我想知道为什么没有它我的代码就不能工作。有什么问题吗?

在默认情况下不应返回true,除非您真的必须返回true。 您最好返回以下内容:

return super.onTouch(event);

据我所知,你只需要听一下“动作下降”、“动作移动”、“动作上升”和“动作取消”

当我这样做或返回false时,我的程序会在我第一次从屏幕上拿起手指时崩溃。无论我触摸到哪里,它都会移动。它会崩溃吗?那么,让我看看错误。顺便说一句,您的默认块应该是空的。你想在这个街区里实现什么?我发现了问题所在。在我的布局中,我保留了MyImageView的onClick属性,但从未实现它。当我在默认情况下返回false时,它会导致程序崩溃,现在我删除了它,即使我返回true,它也能工作。我猜它试图在某个点执行单击,结果崩溃了。非常感谢您的回答!你是对的,这些代码是不必要的,但它不会造成伤害。我想在行动开始前的最后一步可能没有注册,所以我想再次移动这个数字以防万一。