我有以下代码应该这样做:我有一个带背景的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变量和其他检查一切正常。但是我不想使用那个变量,我想知道为什么我的代码没有它就行不通。可能是什么问题?
答案 0 :(得分:0)
你永远不应该在默认情况下返回true
(除非你真的需要)
你最好还是回复一下:
return super.onTouch(event);
据我了解您要实现的目标,您只需要倾听ACTION_DOWN
,ACTION_MOVE
,ACTION_UP
和ACTION_CANCEL