Java 安卓onTouch无法按预期工作
我有下面的代码可以做到这一点:我有一个带有背景的ImageView对象和一个表示一个图形的位图。当我触摸ImageView对象时,如果我触摸图形矩形中的某个地方,我将拾取图形并在手指移动时移动它,当我竖起手指时将其放下。如果我触摸图形矩形以外的任何屏幕,我应该什么也不做-完全忽略触摸。我的代码如下所示:Java 安卓onTouch无法按预期工作,java,android,ontouchlistener,Java,Android,Ontouchlistener,我有下面的代码可以做到这一点:我有一个带有背景的ImageView对象和一个表示一个图形的位图。当我触摸ImageView对象时,如果我触摸图形矩形中的某个地方,我将拾取图形并在手指移动时移动它,当我竖起手指时将其放下。如果我触摸图形矩形以外的任何屏幕,我应该什么也不做-完全忽略触摸。我的代码如下所示: protected int lastx, lasty; protected MyImageView iv; ... public boolean onTouch(View v
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,它也能工作。我猜它试图在某个点执行单击,结果崩溃了。非常感谢您的回答!你是对的,这些代码是不必要的,但它不会造成伤害。我想在行动开始前的最后一步可能没有注册,所以我想再次移动这个数字以防万一。