Question

J'essaie de détecter un geste de balayage horizontal avec Reconnaissance de gestes en vous connectant au CrossSliding événement.

        _gr = new GestureRecognizer
        {
            GestureSettings = GestureSettings.ManipulationTranslateX |
                              GestureSettings.ManipulationTranslateY |
                              GestureSettings.CrossSlide
        };

        _gr.CrossSliding += OnSwipe;
        _gr.ManipulationStarted += OnManipulationStarted;
        _gr.ManipulationUpdated += OnManipulationUpdated;
        _gr.ManipulationCompleted += OnManipulationCompleted;

        _gr.CrossSlideHorizontally = true;

Comme vous pouvez le voir dans le code ci-dessus, non seulement le balayage doit être détecté, mais également les gestes de glissement.

Mon problème est que je n'arrive pas à personnaliser le geste de balayage.

Je souhaite personnaliser la vitesse et la distance minimales dont un utilisateur doit faire glisser le pointeur avant que le geste ne soit considéré comme un balayage.Dans l'état actuel, même le mouvement de traînée horizontale le plus lent et le plus petit déclenchera un CrossSliding événement.

J'ai vu le SeuilsCrosslide classe qui permet de personnaliser le geste, mais je ne voyais pas comment elle pourrait être utilisée pour configurer la vitesse et la distance du geste de balayage.

Est le CrossSliding événement, la bonne façon de détecter un balayage ?Si oui, comment puis-je configurer la vitesse et la distance de balayage ?

Si non, comment puis-je détecter un geste de balayage ?

Était-ce utile?

La solution

Je n'ai trouvé aucun moyen intégré de détecter un balayage, j'ai donc implémenté ma propre méthode de détection.

Le code détecte un balayage horizontal.

Les méthodes affichées sont les gestionnaires d'événements pour le GestureRecognizer événements:

readonly Stopwatch _manipulationTimer = new Stopwatch();

public void OnManipulationStarted(ManipulationStartedEventArgs e)
{
    _manipulationTimer.Restart();
}

public void OnManipulationCompleted(ManipulationCompletedEventArgs e)
{
    var millis = _manipulationTimer.ElapsedMilliseconds;

    if (Math.Abs(e.Cumulative.Translation.Y) < MaxVerticalSwipeDistanceInPix &&
        Math.Abs(e.Cumulative.Translation.X) > MinHorizontalSwipeDistanceInPix && 
        millis > MinSwipeDurationInMillis && 
        millis < MaxSwipeDurationInMillis && 
        Math.Abs(e.Cumulative.Scale - 1) < 0.01 // 1 touch point 
        )
    { 
        var leftSwipe = e.Cumulative.Translation.X < 0;
        if (leftSwipe)
        {
        }
        else // right swipe
        {               
        }
    }

    _manipulationTimer.Stop();
    _manipulationTimer.Reset();
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top