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

8

我对Android编程和Java还比较陌生(虽然我有一些C#的经验,这有所帮助)。

目前我正在尝试一些东西,以了解所有内容是如何工作的。我创建了一个实现onTouchListener的activity。我重写了onTouch并在event.getAction()上使用了switch:

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。傻瓜!


为什么你会在onTouch中返回false? - user9599745
4个回答

46

我在使用 MotionEvent.ACTION_MOVE 时遇到了同样的问题。 为了使 MotionEvent.ACTION_MOVE 生效,需要返回true而不是false。


+1 你有任何想法为什么它是这样工作的吗?你能指出一个文档方向,一个有解释的地方吗?谢谢! - Lzh
3
当您重写 onTouchEvent 方法时,返回的 boolean 值表示事件是否被处理。如果返回 true,则表示事件已被消费;如果返回 false,则表示事件未被消费。 - stealthcopter

15

对我来说解决方案是

return true

在onTouch函数中,你应该使用this关键字。

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 event)方法中返回false,那么只有MotionEvent.ACTION_DOWN事件会被调用。所以你应该从这个函数中返回true。

希望这可以帮到你。


1

我也遇到了同样的问题,不知道是不是一个 bug,但是我通过在实现中添加 OnClickListener 并实现 public void onClick(View v),然后在构造函数中添加 setOnClickListener(this) 来使其正常工作。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接