2012-02-23 4 views
0

に移動タッチ対単一のタッチを識別はMotionEventから呼び出されます。 ACTION_UP私は2つの機能singleClickと呼ばれている1()および他の moveClick(フロートDX、フロートDY)</p> <p>singleClick()でゲームを開発していますアンドロイド

moveClickは()MotionEvent.ACTION_MOVE(ここで、DX = X- previousX)

私の問題から呼び出された:私は私の指で移動アクションをしようとすると、シングルクリックとも呼ばれます。反対側も同じです。私が指で何かをクリックすると、moveClick()が呼び出されます。

ワンクリックでmoveClick()を呼び出すことはできますが、プレーヤーが移動しているときにはsingleClick()コールが実際にゲームコントロールをねじ込みます。

どのようなものがわかりますか?

答えて

0

私はこれがタッチイベントを消費することで何かをするかもしれないと思っています。あなたのonclickリスナーでは、シグナルがイベントを消費したことをtrueに戻すと、falseを返した場合、そのイベントは引き続き落ち込み、次のリスナーをトリガーします。

0

あなたが触れる場所にプレーヤーが移動しているときにsingleClick()を呼びたくない場合は、毎回ACTION_UPが呼び出されるため、ACTION_UPからsingleClickを呼び出すことはできません。移動イベントかどうかを追跡するフラグを追加することもできます。ユークリッド距離の合計がsqrt(dx^2 + dy^2)> thresholdの場合、フラグisMoveをtrueに変更します。合計距離がそのしきい値よりも小さい場合は、ACTION_UPでsingleClick()を呼び出します。

また、タッチイベントの時間の長さ、または絶対距離の合計(つまり、誰かが円を描いて最初のポイントに戻った場合、私の以前の方法はワンクリックとして登録されます)について考えることもできます。どのようにフラグを動作させるか考えてみてください。

0

私はエレガントなソリューションを望んでいましたが、おそらくアンドロイド開発のものが組み込まれていました。しかし、私は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()を呼び出します。

関連する問題

 関連する問題