2011-07-22 17 views
0

サークルを描いているSurfaceViewがあります。私は円の位置と半径を知っています。Android:指のいずれかで領域が押されているかどうかを検出します。

ユーザーが円を押しているかどうかを知る必要があります。ユーザは、1本または2本の指で画面をタップしている可能性があります。指のいずれかが円の領域上にある場合は、それを押す必要があります。

ユーザーが画面から指を上げ、指の指がなくなると、円は押されなくてはなりません。

ユーザーが画面に指が1つしかないときは問題はありませんが、2本の指を使用しているときは問題を解決できません。

問題は、ACTION_UPまたはACTION_POINTER_UPアクションを受け取ったときに、どのポインタが画面に表示されなくなったかわからないため、座標が円を超えているかどうかを調べる必要がないことです。私は成功せず、いくつかの試みを行ってきた

、最後のものは次のとおりです。

protected boolean checkPressed(MotionEvent event) { 

    ColourTouchWorld w = (ColourTouchWorld)gameWorld; 

    int actionMasked = event.getActionMasked(); 

    for (int i = 0; i < event.getPointerCount(); i++) { 
     if (i == 0 && (actionMasked == MotionEvent.ACTION_UP || actionMasked == MotionEvent.ACTION_POINTER_UP)) { 
      // the pointer with index 0 is no longer on screen, 
      // so the circle is not pressed by this pointer, even if 
      // it's coordinates are over the area of the circle 

      continue; 
     } 

     if (isPointInCicle(event.getX(i)), event.getY(i))) { 
      return true; 
     } 
    } 

    return false; 
} 

任意のアイデア?ありがとうございました。

答えて

1

ACTION_POINTER_INDEX_MASK定数を使用する必要があります。私はこれを実装したことがないので、コードがどのように見えるか分かりません。しかし、私はあなたがこれを使用する必要があると思う。

+0

ええ、それは素晴らしいです!私は受け取ったアクションがインデックス0でポインタを参照したと仮定していた。私は間違っていた、私はACTION_POINTER_INDEX_MASKを使用する必要があります。 – GaRRaPeTa

2
私が間違っていたアクションがインデックス0とポインタと呼ぶ受信したと仮定した質問で書か方法において

、私はACTION_POINTER_INDEX_MASK

方法の正しい実装を使用する必要がある。

protected boolean checkPressed(MotionEvent event) { 

ColourTouchWorld w = (ColourTouchWorld)gameWorld; 

int actionMasked = event.getActionMasked(); 
int pointerIndex = ((event.getAction() & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT); 

for (int i = 0; i < event.getPointerCount(); i++) { 
    if (i == pointerIndex && (actionMasked == MotionEvent.ACTION_UP || actionMasked == MotionEvent.ACTION_POINTER_UP)) { 
     // the pointer with index 0 is no longer on screen, 
     // so the circle is not pressed by this pointer, even if 
     // it's coordinates are over the area of the circle 

     continue; 
    } 

    if (isPointInCicle(event.getX(i)), event.getY(i))) { 
     return true; 
    } 
} 

return false; 
} 
関連する問題