1

アクティビティでジェスチャーを処理したい。これを行うには、アクティビティでpublic boolean onTouchEvent(MotionEvent MEvent)メソッドをオーバーライドしました。内容は次のようになります。

motionaction = MEvent.getAction();

if(motionaction == MotionEvent.ACTION_DOWN)
{
    ...
    return true;
}

if(motionaction == MotionEvent.ACTION_UP)
{
    ...
    return true;
}

if(motionaction == MotionEvent.ACTION_MOVE)
{ 
    ...
    return true;
}

motionaction = MEvent.getActionMasked();

if(motionaction == MotionEvent.ACTION_POINTER_DOWN)
{
    ...
    return true;
}

if(motionaction == MotionEvent.ACTION_POINTER_UP)
{
    ...
    return true;
}

return true;

ジェスチャーは次のとおりです。

-画面上のfinger1はその位置を保持します(事実上、常に少しの動きがあるため)

-finger2 画面上を移動します。掴みたい動きです。

5 つのアクションをつかむことができますが、問題は、2 本の指が画面上にあるときに、ACTION_MOVE が最初と 2 番目の指の両方の動きをつかむことです。メソッドMEvent.getActionIndex()は、常に 0 を返す ACTION_MOVE では機能しません。私ができる唯一のことは、finger1 の位置を保存し、そのポイントに近い動きを破棄することです。その結果、指 2 の動きが小指 1 の動きによって「汚染」されることがあります。これは、指が画面上でその位置を保持しているにもかかわらず、リスナーがそれぞれの最小の動きを感じるためです。

どうすればこれを改善できますか?

4

2 に答える 2

1

Quintin Balsdonの回答を参照してください。

私のコードにも同様のことがあります。ACTION_DOWN ケースで finger1 の位置を保存し、次に finger2 が移動すると、移動の Y 座標が保存された finger1 の Y 座標を超えているかどうかを確認します。そうであれば、その動きは finger2 を参照し、それ以外の場合は finger1 を参照し、2 本指モードではそれを破棄します。

1 本指モードでビューに円を描こうとすると、次のようなものになります: http://img208.imageshack.us/img208/8113/onefingercircle.jpg

2 本指モードでビューに円を描こうとすると、次のようになります

したがって、1 本指モードでは完全に機能しますが、2 本指モードでは機能しません。電話のマルチタッチ ハンドラーまたはタッチ スクリーンに関連しているかどうかはわかりません。それは、ハードウェアに関連したものだけであるか、API の私の誤解である可能性があります。

于 2012-07-24T10:07:03.993 に答える
0

これは、開発者としてあなたが管理します。「DOWN」アクションが発生したときに設定(true)し、「UP」または「MOVE」モーションイベントが発生したときに設定解除(false)するブール変数を作成する必要があります。以下のコードでは、「DOWN」が発生した場合でも座標を維持し、ユーザーが動き回っている間に調整を行います。

switch (e.Action) //e is a MotionEvent type
{
    case MotionEvent.ACTION_DOWN:
    {                        
        _prevx = e.getX();
        _prevy = e.getY();
    }
    break;
    case MotionEvent.ACTION_MOVE:
    {
        _xoffset += e.GetX() - _prevx;
        _yoffset += e.GetY() - _prevy;
        Invalidate();

        _prevx = e.GetX();
        _prevy = e.GetY();
    }
    break;
}

複数の指でドラッグする場合は、ScaleGestureDetector.OnScaleGestureListener(http://developer.android.com/reference/android/view/ScaleGestureDetector.OnScaleGestureListener.html)を実装する必要があります。

于 2012-07-23T12:20:07.250 に答える