0

私は最初にあなたを写真に入れようとしています.WPF4 VS2010でジェスチャを実装しようとしています.同じ指ですでに通り過ぎたタッチポイントを横切るまで指を動かすようなものなので、私の考えはリストを作成し、存在する場合はすべての新しいタッチポイントをチェックし、存在する場合はジェスチャを完了し、そうでない場合はコレクションにタッチポイントを追加して、次のタッチポイントと比較します。何らかの理由でこれがうまくいかないので、別のアプローチに移り、TouchPoints を TouchPoint の X 、 Y に置き換え、それらを文字列に変換し、TouchMove および TouchUp イベントを使用して、それらに対して Contains メソッドを使用しようとしました。私のコードは次のようになります。

 private void g1_TouchMove(object sender, TouchEventArgs e)
    {



       if(touchX.Contains(""+e.GetTouchPoint(g1).Position.X) && touchY.Contains(""+e.GetTouchPoint(g1).Position.Y))
        {
         // Clearing the lists , changing the canvas background color to know that the gesture is done
           touchX.Clear();
           touchY.Clear();
           g1.Background = Brushes.AliceBlue;

        }
       else
       {
           //adding new X, Y values to their respective lists
           touchX.Add(""+e.GetTouchPoint(g1).Position.X);
           touchY.Add( ""+e.GetTouchPoint(g1).Position.Y);


       }

    }
private void g1_TouchUp(object sender, TouchEventArgs e)
    {
        //clearing the lists after the touch is up (finger removed)
        touchX.Clear();
        touchY.Clear();
        //getting the canvas it's original background color
        g1.Background = Brushes.Orange;

    }

そのため、テストすると機能しません。タッチを直線で動かしても背景が変わります。何か案は ?

前もって感謝します

4

1 に答える 1

1

まず、数字の使用に戻ります。後で比較するために数字を文字列に入れることは、非常に多くのレベルで間違っています:-)

私の推測では、あなたの問題は解像度の問題であると思われます。画面には多くのピクセルがあるため、以前とまったく同じ場所にヒットすることは事実上不可能です。基本的に、1 ピクセルずれると、アルゴリズムが役に立たなくなります。代わりに、タッチ領域をいくつかの大きなクラスターにマップし、タッチが以前にこのクラスターにあったかどうかを確認する必要があります (まったく同じピクセルではなく)。

簡単なアプローチは、受け取った座標を整数で除算することです。

以下の例では、ピクセル座標系を 3 x 3 ピクセルのクラスターで分割していますが、それが理にかなっている場合は、より大きなものを使用できます。それはすべて、タッチ領域の解像度の大きさに依存します。

これが実際に意味することは、この 3 x 3 領域内のピクセルはすべて等しいと見なされるということです。したがって、ヒット(1,1)は前のヒットに一致する(2,3)などです。

// Divide into 3x3 pixel clusters
var currentCluster = new Point((int)touchPos.X / 3, (int)touchPos.Y / 3)
// previousClusters is a List<Point>() which is cleared on TouchUp
foreach (var cluster in previousClusters)
{
    if (cluster == currentCluster)
    {
        // We've been here before, do your magic here!
        g1.Background = Brushes.AliceBlue;
        // Return here, since we don't want to add the point again
        return;
    }
}
previousClusters.Add(currentCluster);
于 2009-12-14T16:15:17.793 に答える