2012-02-23 70 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()