Question

Je suis en train de vous mettre dans l'image tout d'abord, je suis en train de mettre en œuvre un geste WPF4 VS2010, il est comme vous déplacez votre doigt jusqu'à ce qu'il croise une TouchPoint que vous avez déjà passé par le doigt même, donc ma pensée est de faire une liste et vérifiez chaque nouvelle TouchPoint si elle existe, si oui, alors vous avez fait votre geste, sinon ajoutez le TouchPoint à la collection à comparer avec les TouchPoints suivants. pour une raison quelconque, cela ne fonctionne pas si je me suis déplacé à une autre approche, en remplaçant TouchPoints par X, Y pour le TouchPoint et les convertir en chaînes et essayez d'utiliser la méthode Contient contre eux, en utilisant les événements TouchMove et mon code ressemble de retouche comme:

 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;

    }

Alors, quand le tester cela ne fonctionne pas, même si je déplace mon contact en ligne droite il change l'arrière-plan. Des idées?

Merci d'avance

Était-ce utile?

La solution

Tout d'abord, revenir à l'utilisation des numéros. Mettre en nombre de chaînes pour une comparaison ultérieure est erroné sur tant de niveaux: -)

Je pense que votre problème est un problème de résolution - Il est pratiquement impossible pour frapper exactement la même place comme avant, car il y a beaucoup de pixels sur l'écran. Fondamentalement, un hors pixel rendra votre algorithme inutile. Vous devez mapper à la place de votre zone de contact dans quelques grands groupes et vérifier si le contact a été dans ce groupe avant (par opposition au même pixel exact).

Une approche simple est de simplement division entière sur les coordonnées que vous recevez.

Dans l'exemple ci-dessous, je divise le pixel système de coordonnées avec des grappes de 3 par 3 pixels, mais vous pouvez aller avec plus si cela fait sens pour vous. Tout dépend de la taille de la résolution de la zone tactile est.

Ce que cela signifie dans la pratique est que tout pixel dans ce 3 par 3 zone est considérée comme égale. Donc, un coup sur (1,1) est correspondant à un coup précédent sur (2,3) et ainsi de suite.

// 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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top