Compartir vía


Incorporación de un reconocedor de gesto de deslizar rápidamente

Un gesto de deslizar rápidamente se produce cuando un dedo se mueve a través de la pantalla en dirección horizontal o vertical y, a menudo, se usa para iniciar la navegación a través del contenido.

Para hacer que View reconozca un gesto de deslizar rápidamente, cree una instancia de SwipeGestureRecognizer, establezca la propiedad Direction en un valor de enumeración de SwipeDirection (Left, Right, Up o Down), opcionalmente establezca la propiedad Threshold, controle el evento Swiped y agregue el reconocedor de gestos nuevo a la colección GestureRecognizers de la vista. En el ejemplo de código siguiente se muestra un elemento SwipeGestureRecognizer adjunto a BoxView:

<BoxView Color="Teal" ...>
    <BoxView.GestureRecognizers>
        <SwipeGestureRecognizer Direction="Left" Swiped="OnSwiped"/>
    </BoxView.GestureRecognizers>
</BoxView>

El código equivalente en C# es el siguiente:

var boxView = new BoxView { Color = Color.Teal, ... };
var leftSwipeGesture = new SwipeGestureRecognizer { Direction = SwipeDirection.Left };
leftSwipeGesture.Swiped += OnSwiped;

boxView.GestureRecognizers.Add(leftSwipeGesture);

La clase SwipeGestureRecognizer también incluye una propiedad Threshold, que opcionalmente se puede establecer en un valor uint que representa la distancia mínima que debe deslizarse un dedo para que se reconozca el deslizamiento, en unidades independientes del dispositivo. El valor predeterminado de esta propiedad es 100, lo cual significa que cualquier deslizamiento por debajo de 100 unidades independientes del dispositivo se ignorará.

Reconocimiento de la dirección del deslizamiento

En los ejemplos anteriores, la propiedad Direction está establecida en un valor único de la enumeración de SwipeDirection. Sin embargo, también es posible establecer esta propiedad en varios valores desde la enumeración de SwipeDirection, por lo que el evento Swiped se desencadena en respuesta a un deslizamiento en más de una dirección. Sin embargo, la restricción es que un único elemento SwipeGestureRecognizer solo puede reconocer los deslizamientos que se produzcan en el mismo eje. Por lo tanto, se pueden reconocer los deslizamientos que se producen en el eje horizontal estableciendo la propiedad Direction en Left y Right:

<SwipeGestureRecognizer Direction="Left,Right" Swiped="OnSwiped"/>

De forma similar, se pueden reconocer los deslizamientos que se producen en el eje horizontal estableciendo la propiedad Direction en Up y Down:

var swipeGesture = new SwipeGestureRecognizer { Direction = SwipeDirection.Up | SwipeDirection.Down };

Como alternativa, puede crearse un SwipeGestureRecognizer para cada dirección de deslizamiento para que reconozca los deslizamientos en cada dirección:

<BoxView Color="Teal" ...>
    <BoxView.GestureRecognizers>
        <SwipeGestureRecognizer Direction="Left" Swiped="OnSwiped"/>
        <SwipeGestureRecognizer Direction="Right" Swiped="OnSwiped"/>
        <SwipeGestureRecognizer Direction="Up" Swiped="OnSwiped"/>
        <SwipeGestureRecognizer Direction="Down" Swiped="OnSwiped"/>
    </BoxView.GestureRecognizers>
</BoxView>

El código equivalente en C# es el siguiente:

var boxView = new BoxView { Color = Color.Teal, ... };
var leftSwipeGesture = new SwipeGestureRecognizer { Direction = SwipeDirection.Left };
leftSwipeGesture.Swiped += OnSwiped;
var rightSwipeGesture = new SwipeGestureRecognizer { Direction = SwipeDirection.Right };
rightSwipeGesture.Swiped += OnSwiped;
var upSwipeGesture = new SwipeGestureRecognizer { Direction = SwipeDirection.Up };
upSwipeGesture.Swiped += OnSwiped;
var downSwipeGesture = new SwipeGestureRecognizer { Direction = SwipeDirection.Down };
downSwipeGesture.Swiped += OnSwiped;

boxView.GestureRecognizers.Add(leftSwipeGesture);
boxView.GestureRecognizers.Add(rightSwipeGesture);
boxView.GestureRecognizers.Add(upSwipeGesture);
boxView.GestureRecognizers.Add(downSwipeGesture);

Nota:

En los ejemplos anteriores, el mismo controlador de eventos responde a la activación del evento Swiped. Sin embargo, cada instancia de SwipeGestureRecognizer puede usar un controlador de eventos distinto, si es necesario.

Respuesta al deslizamiento

En el ejemplo siguiente, se muestra un controlador de eventos para el evento Swiped:

void OnSwiped(object sender, SwipedEventArgs e)
{
    switch (e.Direction)
    {
        case SwipeDirection.Left:
            // Handle the swipe
            break;
        case SwipeDirection.Right:
            // Handle the swipe
            break;
        case SwipeDirection.Up:
            // Handle the swipe
            break;
        case SwipeDirection.Down:
            // Handle the swipe
            break;
    }
}

SwipedEventArgs puede examinarse para determinar la dirección del deslizamiento, con lógica personalizada como respuesta al deslizamiento, según sea necesario. Se puede obtener la dirección del deslizamiento desde la propiedad Direction de los argumentos de evento, que se establecerán en uno de los valores de la enumeración de SwipeDirection. Además, los argumentos de evento también tienen una propiedad Parameter que se establecerá en el valor de la propiedad CommandParameter, si se ha definido.

Uso de comandos

La clase SwipeGestureRecognizer también incluye las propiedades Command y CommandParameter. Estas propiedades se utilizan normalmente en aplicaciones que usan el patrón Model-View-ViewModel (MVVM). La propiedad Command define el elemento ICommand que se invocará cuando se reconoce un gesto de deslizar rápidamente, con la propiedad CommandParameter que define un objeto que se pasará al elemento ICommand.. El ejemplo de código siguiente muestra cómo enlazar la propiedad Command a un elemento ICommand definido en el modelo de vista cuya instancia se ha establecido como la página BindingContext:

var boxView = new BoxView { Color = Color.Teal, ... };
var leftSwipeGesture = new SwipeGestureRecognizer { Direction = SwipeDirection.Left, CommandParameter = "Left" };
leftSwipeGesture.SetBinding(SwipeGestureRecognizer.CommandProperty, "SwipeCommand");
boxView.GestureRecognizers.Add(leftSwipeGesture);

El código XAML equivalente es:

<BoxView Color="Teal" ...>
    <BoxView.GestureRecognizers>
        <SwipeGestureRecognizer Direction="Left" Command="{Binding SwipeCommand}" CommandParameter="Left" />
    </BoxView.GestureRecognizers>
</BoxView>

SwipeCommand es una propiedad de tipo ICommand definida en la instancia de modelo de vista que se establece como la página BindingContext. Cuando se reconoce un gesto de deslizar rápidamente, se ejecuta el método Execute del objeto SwipeCommand. El argumento para el método Execute es el valor de la propiedad CommandParameter. Para obtener más información sobre los comandos, consulte The Command Interface (La interfaz de comandos).

Creación de un contenedor de deslizamiento

La clase SwipeContainer, que se muestra en el siguiente ejemplo de código, es una clase de reconocimiento de deslizamiento que se ha ajustado alrededor de un elemento View para realizar el reconocimiento de gestos de deslizar rápidamente:

public class SwipeContainer : ContentView
{
    public event EventHandler<SwipedEventArgs> Swipe;

    public SwipeContainer()
    {
        GestureRecognizers.Add(GetSwipeGestureRecognizer(SwipeDirection.Left));
        GestureRecognizers.Add(GetSwipeGestureRecognizer(SwipeDirection.Right));
        GestureRecognizers.Add(GetSwipeGestureRecognizer(SwipeDirection.Up));
        GestureRecognizers.Add(GetSwipeGestureRecognizer(SwipeDirection.Down));
    }

    SwipeGestureRecognizer GetSwipeGestureRecognizer(SwipeDirection direction)
    {
        var swipe = new SwipeGestureRecognizer { Direction = direction };
        swipe.Swiped += (sender, e) => Swipe?.Invoke(this, e);
        return swipe;
    }
}

La clase SwipeContainer crea objetos SwipeGestureRecognizer para las cuatro direcciones de deslizamiento y adjunta Swipe controladores de eventos. Estos controladores de eventos invocan el evento Swipe definido por SwipeContainer.

En el ejemplo de código XAML siguiente se muestra la clase SwipeContainer que realiza el ajuste de BoxView:

<ContentPage ...>
    <StackLayout>
        <local:SwipeContainer Swipe="OnSwiped" ...>
            <BoxView Color="Teal" ... />
        </local:SwipeContainer>
    </StackLayout>
</ContentPage>

En el ejemplo de código siguiente se muestra cómo SwipeContainer realiza el ajuste de BoxView en una página de C#:

public class SwipeContainerPageCS : ContentPage
{
    public SwipeContainerPageCS()
    {
        var boxView = new BoxView { Color = Color.Teal, ... };
        var swipeContainer = new SwipeContainer { Content = boxView, ... };
        swipeContainer.Swipe += (sender, e) =>
        {
          // Handle the swipe
        };

        Content = new StackLayout
        {
            Children = { swipeContainer }
        };
    }
}

Cuando BoxView recibe un gesto de deslizar rápidamente, el evento Swiped en SwipeGestureRecognizer se activa. Esto se controla mediante la clase SwipeContainer, que activa su propio evento Swipe. Este evento Swipe se controla en la página. Posteriormente, SwipedEventArgs puede examinarse para determinar la dirección del deslizamiento, con lógica personalizada como respuesta al deslizamiento, según sea necesario.