【问题标题】:Android: can't seem to use MotionEvent.ACTION_MOVE correctlyAndroid:似乎无法正确使用 MotionEvent.ACTION_MOVE
【发布时间】:2011-09-10 15:50:40
【问题描述】:

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

【问题讨论】:

  • 为什么 onTouch 会返回 false?

标签: java android touch-event


【解决方案1】:

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

【讨论】:

  • +1 你知道为什么它是这样工作的吗?您能否指出我们记录在案的方向,一个可以解释的地方?谢谢!
  • 当您覆盖 onTouchEvent 布尔值时,您的返回布尔值指示事件是否已被使用。
【解决方案2】:

也有同样的问题,我不知道这是否是一个错误,但我设法通过在实现中添加 OnClickListener 并实现 public void onClick(View v) 然后在构造函数。

【讨论】:

    【解决方案3】:

    对我来说解决方案是

    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

    希望对你有帮助

    【讨论】:

      【解决方案4】:

      您必须为每个事件使用 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);
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多