c# - two - Formas de Xamarin Pase a la izquierda/Pase a la derecha gestos




xamarin two stacklayout (4)

Quiero comenzar con esto diciendo que soy completamente nuevo en el desarrollo móvil, Xamarin, C #, .Net.

Estoy trabajando para crear una aplicación móvil con Xamarain Forms y me he encontrado con el problema de no tener disponible el gesto de deslizar, al menos de acuerdo con la documentación que he visto.

Encontré este sitio: http://arteksoftware.com/gesture-recognizers-with-xamarin-forms/

Esto describe cómo agregar algunos gestos adicionales para que IOS / Android sea accesible en el contexto del formulario. Antes de tratar de seguir esto, quería ver si alguien más ha implementado deslizar en una aplicación de Xamarin Forms y cómo lo hicieron.

Mis objetivos son que tiene que haber un diseño de pila horizontal. Este diseño contiene 7 botones, cada botón refleja un día en la semana actual. Al deslizar hacia la izquierda en el diseño de la pila, el texto del botón cambiará a la semana anterior. Al deslizar hacia la derecha, el texto del botón cambiará a la próxima semana.

Así que también estoy tratando de usar MVVM para esto y XAML. Entonces, ¿es posible que separe el barrido a la izquierda y el movimiento a la derecha? Quiero usar ICommand para pasar un determinado parámetro a una función basada en la dirección del barrido.

Cualquier ejemplo de este o cualquier consejo sería muy apreciado.

https://code.i-harness.com


A partir de la solución de @Ranjith Kumar, se me ocurrió lo siguiente:

public delegate void SwipedEventHandler(ISwipeListener sender, SwipedEventArgs e);

public class SwipedEventArgs : EventArgs
{
    readonly double _x;
    public double X => _x;

    readonly double _y;
    public double Y => _y;

    readonly View _view;
    public View View => _view;

    public SwipedEventArgs(View view, double x, double y)
    {
        _view = view;
        _x = x;
        _y = y;
    }
}

public interface ISwipeListener
{
    event SwipedEventHandler SwipedDown;

    event SwipedEventHandler SwipedLeft;

    event SwipedEventHandler SwipedNothing;

    event SwipedEventHandler SwipedRight;

    event SwipedEventHandler SwipedUp;

    double TotalX
    {
        get;
    }

    double TotalY
    {
        get;
    }
}

public class SwipeListener : PanGestureRecognizer, ISwipeListener
{
    public event SwipedEventHandler SwipedDown;

    public event SwipedEventHandler SwipedLeft;

    public event SwipedEventHandler SwipedNothing;

    public event SwipedEventHandler SwipedRight;

    public event SwipedEventHandler SwipedUp;

    double _totalX = 0, _totalY = 0;

    public double TotalX => _totalX;

    public double TotalY => _totalY;

    readonly View _view;

    public SwipeListener(View view) : base()
    {
        _view = view;
        _view.GestureRecognizers.Add(this);
        PanUpdated += OnPanUpdated;
    }

    void OnPanUpdated(object sender, PanUpdatedEventArgs e)
    {
        switch (e.StatusType)
        {
            case GestureStatus.Running:
                try
                {
                    _totalX = e.TotalX;
                    _totalY = e.TotalY;
                }
                catch (Exception exception)
                {
                    Debug.WriteLine(exception.Message);
                }
                break;

            case GestureStatus.Completed:
                if (_totalX < 0 && Math.Abs(_totalX) > Math.Abs(_totalY))
                {
                    OnSwipedLeft(_totalX, _totalY);
                }
                else if (_totalX > 0 && _totalX > Math.Abs(_totalY))
                {
                    OnSwipedRight(_totalX, _totalY);
                }
                else if (_totalY < 0 && Math.Abs(_totalY) > Math.Abs(_totalX))
                {
                    OnSwipedUp(_totalX, _totalY);
                }
                else if (_totalY > 0 && _totalY > Math.Abs(_totalX))
                {
                    OnSwipedDown(_totalX, _totalY);
                }
                else OnSwipedNothing(_totalX, _totalY);
                break;

        }
    }

    protected virtual void OnSwipedDown(double x, double y)
        => SwipedDown?.Invoke(this, new SwipedEventArgs(_view, x, y));

    protected virtual void OnSwipedLeft(double x, double y)
        => SwipedLeft?.Invoke(this, new SwipedEventArgs(_view, x, y));

    protected virtual void OnSwipedNothing(double x, double y)
        => SwipedNothing?.Invoke(this, new SwipedEventArgs(_view, x, y));

    protected virtual void OnSwipedRight(double x, double y)
        => SwipedRight?.Invoke(this, new SwipedEventArgs(_view, x, y));

    protected virtual void OnSwipedUp(double x, double y)
        => SwipedUp?.Invoke(this, new SwipedEventArgs(_view, x, y));
}

El inconveniente es que no se puede hacer nada mientras se realiza el barrido, solo después.


No necesita bibliotecas de terceros. No necesita pagar. Solo agregue estas dos clases e implemente sus escuchas de swipe

Paso 1: Copia pegar estas dos clases

SwipeListener.cs

using System;
using Xamarin.Forms;

namespace SwipeLib
{
public class SwipeListener : PanGestureRecognizer
{
    private ISwipeCallBack mISwipeCallback;
    private double translatedX = 0, translatedY = 0;

    public SwipeListener(View view, ISwipeCallBack iSwipeCallBack)
    {
        mISwipeCallback = iSwipeCallBack;
        var panGesture = new PanGestureRecognizer();
        panGesture.PanUpdated += OnPanUpdated;
        view.GestureRecognizers.Add(panGesture);
    }

    void OnPanUpdated(object sender, PanUpdatedEventArgs e)
    {

        View Content = (View)sender;

        switch (e.StatusType) {

            case GestureStatus.Running:

                try {
                    translatedX = e.TotalX;
                    translatedY = e.TotalY;
                } catch (Exception err) {
                    System.Diagnostics.Debug.WriteLine("" + err.Message);
                }
                break;

            case GestureStatus.Completed:

                System.Diagnostics.Debug.WriteLine("translatedX : " + translatedX);
                System.Diagnostics.Debug.WriteLine("translatedY : " + translatedY);

                if (translatedX < 0 && Math.Abs(translatedX) > Math.Abs(translatedY)) {
                    mISwipeCallback.onLeftSwipe(Content);
                } else if (translatedX > 0 && translatedX > Math.Abs(translatedY)) {
                    mISwipeCallback.onRightSwipe(Content);
                } else if (translatedY < 0 && Math.Abs(translatedY) > Math.Abs(translatedX)) {
                    mISwipeCallback.onTopSwipe(Content);
                } else if (translatedY > 0 && translatedY > Math.Abs(translatedX)) {
                    mISwipeCallback.onBottomSwipe(Content);
                } else {
                    mISwipeCallback.onNothingSwiped(Content);
                }

                break;

        }
    }

}
}

ISwipeCallBack.cs

using System;
using Xamarin.Forms;
namespace SwipeLib
{  
public interface ISwipeCallBack
{

    void onLeftSwipe(View view);
    void onRightSwipe(View view);
    void onTopSwipe(View view);
    void onBottomSwipe(View view);
    void onNothingSwiped(View view);
}
}

Paso 2: Desde sus formularios de Xamarin pase la vista y también la interfaz obj. Entonces obtienes resultado

En mi caso me pasa la etiqueta.

 SwipeListener swipeListener = new SwipeListener(lbl_swipe, this);

Paso 3: Implementar la interfaz ISwipeCallBack

public partial class SwipeLibPage : ContentPage, ISwipeCallBack

Proyecto de muestra -> https://github.com/rranjithkumar100/Xamarin-Swipe-Library


Si se siente cómodo pagando por una biblioteca de terceros (y está utilizando Xamarin Forms, por lo que es una buena posibilidad), MR.Gestures admite todos los gestos táctiles en todas las vistas de Xamarin.Forms. Lo he usado con éxito y estoy muy feliz con él. Cuesta unos 10 € muy razonables y tiene una excelente documentación.

Si eres una de las muchas personas que están decepcionadas de que los gestos táctiles no sean compatibles con Xamarin Forms, considera votar por esta sugerencia en UserVoice .


Siempre puedes echar un vistazo a this simple demostración. Y utilízalo como sigue:

GestureFrame gi = new GestureFrame
        {
            HorizontalOptions = LayoutOptions.FillAndExpand,
            VerticalOptions = LayoutOptions.FillAndExpand,
            BackgroundColor = Color.FromHex("bf3122"),
        };

        gi.SwipeDown += (s, e) =>
        {
            DisplayAlert("Gesture Info", "Swipe Down Detected", "OK");
            ViewModel.SampleCommand.Execute("Swipe Down Detected");
        };

        gi.SwipeTop += (s, e) =>
        {
            DisplayAlert("Gesture Info", "Swipe Top Detected", "OK");
            ViewModel.SampleCommand.Execute("Swipe Top Detected");
        };

        gi.SwipeLeft += (s, e) =>
        {
            DisplayAlert("Gesture Info", "Swipe Left Detected", "OK");
            ViewModel.SampleCommand.Execute("Swipe Left Detected");
        };

        gi.SwipeRight += (s, e) =>
        {
            DisplayAlert("Gesture Info", "Swipe Right Detected", "OK");
            ViewModel.SampleCommand.Execute("Swipe Right Detected");
        };

        this.Content = gi;






xamarin.forms