7

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

4

4 回答 4

45

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

于 2011-06-23T17:17:31.490 回答
14

对我来说解决方案是

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 event) 返回 false 时,只会调用 MotionEvent.ACTION_DOWN。所以你应该从这个函数返回 true

希望这会有所帮助

于 2012-07-17T06:02:02.500 回答
1

也有同样的问题,我不知道这是否是一个错误,但我设法通过添加OnClickListener到实现来使其工作,然后实现public void onClick(View v)然后还添加setOnClickListener(this)构造函数。

于 2012-02-14T15:30:26.267 回答
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);
    }
于 2021-03-16T06:49:41.130 回答