2012-02-23 64 views
0

我正在开发一个游戏2层的功能的一个被称为singleClick()和其他 moveClick(浮DX,DY浮动)识别单个触摸VS移动触摸Android电子

singleClick()从MotionEvent调用。 ACTION_UP

moveClick()从MotionEvent.ACTION_MOVE(其中dx = x轴previousX)

我的问题叫:如果我试图用我的手指一动的动作,只需点击一下也叫。反过来也是一样的,当我用手指点击某个东西时,moveClick()被调用。

我可以处理moveClick()在单击时被调用,但在玩家移动时调用singleClick()会真正使我的游戏控制失效。

我怎么知道哪个是哪个?

回答

0

我在想这可能有些事情要花费触摸事件。在你的onclick监听器中记住,如果你返回true表示你已经消耗了该事件的信号,如果你返回false,那么该事件将继续下降并触发下一个监听器。

0

那么,如果你不想在玩家移动他碰到的地方时调用singleClick(),那么你不能从ACTION_UP调用singleClick,因为每次都会调用ACTION_UP。也许添加一个标志,记录它是否是一个移动事件。如果总欧几里德距离sqrt(dx^2 + dy^2)>阈值,则将标志isMove更改为true。如果总距离小于该阈值,则在ACTION_UP中调用singleClick()。

您可能还想要考虑定时触摸事件的时间长度或总绝对距离(即如果某人画了一个圆并返回第一个点,我以前的方法将注册为单击)。想想你想如何工作的标志。

0

我希望有一个优雅的解决方案,也许内置的Android开发..但我想没有,所以我采取了Benoir的建议,并写了这非常不雅的代码(这似乎工作得很好)

long millisLastTouch=0, millisDif,millisStartTouch=0; 
final long minMillisSm = 200, minMillisBig = 300; 
boolean isMove = true; 


public void run(){//my main thread/loop 
    ..... 
     millisDif = System.currentTimeMillis() - millisLastTouch; 
     if (!isMove && millisDif>minMillisBig) { 
      G.currentScreen.singleClick(mPreviousX,mPreviousY); 
      isMove = true;//to prevent multiple single clicks 
     } 
    ..... 
    }//end of main loop 




public boolean onTouchEvent(MotionEvent e) { 
    float x = e.getX();  float y = e.getY();   
    switch (e.getAction()) { 
    case MotionEvent.ACTION_DOWN:  {  }//do nothing 

    case MotionEvent.ACTION_UP:{ 
     mPreviousX = x; mPreviousY = y;  } 

    case MotionEvent.ACTION_MOVE:{ 
     boolean newAction; 
     millisDif = System.currentTimeMillis() - millisLastTouch; 
     if (millisDif> minMillisSm) { 
      newAction = true; 
      millisStartTouch = System.currentTimeMillis(); 
     } 
     else newAction = false; 

     millisLastTouch = System.currentTimeMillis(); 

     millisDif = System.currentTimeMillis() - millisStartTouch; 
     if (newAction == false && millisDif > minMillisSm){ 
      float dx = x - mPreviousX; float dy = y - mPreviousY; 
      G.currentScreen.clickMove(x,y,dx,dy); 
      isMove = true; 
     } 
     else isMove = false;   

     mPreviousX = x; mPreviousY = y; 
    } 
    }//switch 
    return true; 
}//onTouchEvent 

它只是基于时间而不是距离。如果用户触摸屏幕足够长的时间,它将作为移动动作进行翻译。否则,它会记住x和y的位置,并会从主线程调用singleClick()