Android:似乎无法正确使用MotionEvent.ACTION_MOVE

时间:2011-06-08 07:36:09

标签: java android ontouchevent

我对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'哦!

4 个答案:

答案 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);
    }