Pregunta

Estoy tratando de detectar un gesto de deslizamiento horizontal con gesturerecognizer enganchando al evento de deslizamiento cruzado .

        _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;

Como puede ver en el código anterior, no solo se debe detectar deslizar, sino que también arrastre gestos.

Mi problema es que no puedo personalizar el gesto de deslizamiento.

Quiero personalizar la velocidad mínima y la distancia Un usuario tiene que arrastrar el puntero antes de que el gesto se considere un golpe. En el estado actual, incluso el movimiento de arrastre horizontal más lento y más pequeño activará un evento CrossSliding.

Vi el cruzslidethreslesholds clase que permite personalizar el gesto, pero no pude ver cómo se podría usar para configurar la velocidad y la distancia del gesto de deslizamiento.

es el evento CrossSliding la forma correcta de detectar un golpe? Si es así, ¿cómo puedo configurar la velocidad y la distancia de deslizamiento?

Si no, ¿cómo puedo detectar un gesto de deslizamiento?

¿Fue útil?

Solución

No pude encontrar ningún modo incorporado para detectar un golpe, así que implementé mi propio método de detección.

El código detecta un golpe horizontal.

Los métodos mostrados son los manipuladores de eventos para los eventos GestureRecognizer:

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();
}

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top