Pergunta

Eu estou tentando detectar uma horizontal gesto de passar o dedo com GestureRecognizer ligando para o CrossSliding do evento.

        _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 você pode ver no código acima, não apenas deslize deve ser detectado, mas também arrastar gestos.

O meu problema é que eu não consigo personalizar o gesto de passar o dedo.

Eu quero personalizar a velocidade mínima e a distância que o usuário tem que arrastar o ponteiro antes de o gesto é considerado um deslize.No estado atual, mesmo o mais lento e menor horizontal movimento de arraste vai desencadear uma CrossSliding do evento.

Eu vi o CrossSlideThresholds classe que permite personalizar o gesto, mas eu não conseguia ver como poderia ser usado para configurar a velocidade e a distância do gesto de passar o dedo.

É o CrossSliding evento de forma adequada para detectar o dedo?Se sim, como posso configurar a velocidade e a deslize para a distância?

Se não, como posso detectar um gesto de passar o dedo?

Foi útil?

Solução

Eu não poderia encontrar qualquer forma de detectar um deslize, então eu implementado o meu próprio método de detecção.

O código detecta um deslize horizontal.

Os métodos são os manipuladores de eventos para a GestureRecognizer eventos:

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top