我对Android编程和Java都很陌生(虽然我对C#有一些经验,所以有帮助)。
此刻我正在四处闲逛,了解一切是如何运作的。我做了一个实现onTouchListener的活动。我已经覆盖onTouch并在event.getAction()上启用了一个开关:
public boolean onTouch(View v, MotionEvent event)
{
float x;
float y;
switch (event.getAction())
{
case MotionEvent.ACTION_DOWN: // gets called
{
x = event.getX();
y = event.getY();
circle c = new circle(this, x, y, 10, 0xFFFFFF);
_main.addView(c, tapCount++);
break;
}
case MotionEvent.ACTION_MOVE: // doesnt seem to do anything
{
x = event.getX();
y = event.getY();
circle c = new circle(this, x, y, 10, 0xFFFFFF);
_main.addView(c, tapCount++);
break;
}
}
return false;
}
“circle”是指绘制圆圈的类。
当我将手指拖过屏幕时,我期待看到的是一圈圆圈。相反,当我开始触摸时,圆圈才被绘制。
我将我的代码与示例进行了比较(例如:Google的这篇博文:http://android-developers.blogspot.com/2010/06/making-sense-of-multitouch.html),我找不到我的错误。
编辑: 链接到完整的课程: http://pastebin.com/tVDQjQhu
编辑: 固定。必须在onTouch()函数中返回true。 D'哦!
答案 0 :(得分:41)
使用MotionEvent.ACTION_MOVE
时遇到了同样的问题。
要使MotionEvent.ACTION_MOVE
生效,请返回true而不是false。
答案 1 :(得分:11)
对我来说,解决方案是
return true
在onTouch函数中,你应该使用这个
public boolean onTouch(View v, MotionEvent event){
float x;
float y;
switch (event.getAction())
{
case MotionEvent.ACTION_DOWN: // gets called
{
x = event.getX();
y = event.getY();
circle c = new circle(this, x, y, 10, 0xFFFFFF);
_main.addView(c, tapCount++);
break;
}
case MotionEvent.ACTION_MOVE: // doesnt seem to do anything
{
x = event.getX();
y = event.getY();
circle c = new circle(this, x, y, 10, 0xFFFFFF);
_main.addView(c, tapCount++);
break;
}
}
return true; //the problem was here
}
当你从onTouch(View v,MotionEvent事件)返回false时,只会调用MotionEvent.ACTION_DOWN。所以你应该从这个函数返回true
希望这是有帮助的
答案 2 :(得分:1)
也有同样的问题,我不知道这是不是一个错误,但我设法通过向实现添加OnClickListener
并实现public void onClick(View v)
然后添加{ {1}}在构造函数上。
答案 3 :(得分:0)
您必须为每个事件使用 return true。如果你只使用 return 一次,那么只有 Action_Down 会调用。 这会对您有所帮助。
@Override
public boolean onTouchEvent(MotionEvent event) {
final float X = event.getX();
final float Y = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
x = X;
y = Y;
invalidate();
return true;
case MotionEvent.ACTION_MOVE:
x = X;
y = Y;
invalidate();
return true;
case MotionEvent.ACTION_UP:
invalidate();
return true;
}
return super.onTouchEvent(event);
}