GestureRecognizer Gesto De Passar O Dedo
-
21-12-2019 - |
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?
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();
}