wake-up-neo.com

Xamarin Forms Swipe Left/Swipe Right-Gesten

Ich möchte dies vorwegnehmen, indem ich sage, dass ich für die mobile Entwicklung Xamarin, C #, .Net völlig neu bin.

Ich arbeite am Erstellen einer mobilen App mit Xamarain Forms und habe das Problem, dass mir die Wischgeste nicht zur Verfügung steht, zumindest gemäß der Dokumentation, die ich gesehen habe. 

Ich habe diese Seite gefunden: http://arteksoftware.com/gesture-recognizers-with-xamarin-forms/

Hier wird beschrieben, wie Sie einige zusätzliche Gesten für IOS/Android hinzufügen, um im Kontext des Formulars verfügbar zu sein. Bevor ich versuche, dem zu folgen, wollte ich wissen, ob noch jemand in einer Xamarin Forms-App Swipe implementiert hat und wie sie damit umgegangen sind.

Meine Ziele sind, dass es ein horizontales Stapellayout geben muss. Dieses Layout enthält 7 Schaltflächen, die jeweils einen Tag der aktuellen Woche darstellen. Durch Wischen nach links im Stapellayout wird der Text der Schaltfläche auf die vorherige Woche geändert. Durch Wischen nach rechts wird der Text der Schaltfläche in der nächsten Woche geändert.

Deshalb versuche ich auch, MVVM und XAML zu verwenden. Kann ich also die Aktion "Streichen nach links" und "Streichen nach rechts" trennen? Ich möchte mit ICommand einen bestimmten Parameter an eine Funktion übergeben, die auf der Richtung des Swipe basiert.

Beispiele oder Ratschläge würden sehr geschätzt.

27
Kyle

Xamarin.Forms hat SwipeGestureRecognizer eingeführt:

<BoxView Color="Teal" ...>
    <BoxView.GestureRecognizers>
        <SwipeGestureRecognizer Direction="Left" Swiped="OnSwiped"/>
    </BoxView.GestureRecognizers>
</BoxView>
3
Amir No-Family

Keine Bibliotheken von Drittanbietern erforderlich. Keine Notwendigkeit zu zahlen. Fügen Sie einfach diese beiden Klassen hinzu und implementieren Sie Ihre Swipe-Listener 

Schritt 1: Kopieren Sie diese beiden Klassen.

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

Schritt 2: Übergeben Sie von Ihren Xamarin-Formularen die Ansicht und auch das Interface obj. Dann erhalten Sie Ergebnis

In meinem Fall übergebe ich das Etikett 

 SwipeListener swipeListener = new SwipeListener(lbl_swipe, this);

Schritt 3: Implementieren Sie die ISwipeCallBack-Schnittstelle

public partial class SwipeLibPage : ContentPage, ISwipeCallBack

Beispielprojekt -> https://github.com/rranjithkumar100/Xamarin-Swipe-Library

26
Ranjith Kumar

Wenn Sie mit dem Bezahlen einer Bibliothek eines Drittanbieters vertraut sind (und Xamarin Forms verwenden, ist dies eine gute Möglichkeit), unterstützt MR.Gestures alle Touch-Gesten in allen Xamarin.Forms-Ansichten. Ich habe es erfolgreich eingesetzt und war sehr zufrieden damit. Es kostet sehr vernünftige 10 € und verfügt über eine hervorragende Dokumentation.

Wenn Sie zu den vielen Leuten gehören, die enttäuscht sind, dass Berührungsgesten in Xamarin Forms nicht unterstützt werden, sollten Sie in Betracht ziehen, diesen Vorschlag bei UserVoice zu stimmen.

11
Joel Anair

Sie können sich immer die this simple Demo ansehen. Und benutze es wie folgt:

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

Vielleicht könnte das jemandem helfen.

Ich hatte ein Problem: Es gab eine ContentPage mit Scrollview und Raster darin. Alles, was ich tun muss, ist, mit den Wischbewegungen nach links/rechts umzugehen. Nachdem ich Google/stackoverflow/github durchsucht hatte, fand ich ein Nuget-Paket namens XamarinFormsGestures . Das hat mir sehr geholfen. Alle Anweisungen befinden sich im Link . Dort ist mein Code:

Vapolia.Lib.Ui.Gesture.SetSwipeLeftCommand(scrollviewgrid, 
new Command(() => { OnLeftSwipe(); })); // What's going on when left swiped.
Vapolia.Lib.Ui.Gesture.SetSwipeRightCommand(scrollviewgrid, 
new Command(() => { OnRightSwipe(); })); // What's going on when right swiped.

Aufbauend auf der Lösung von @Ranjith Kumar habe ich Folgendes gefunden:

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

Der Nachteil ist, dass Sie nichts tun können, während der Wischvorgang ausgeführt wird, nur danach.

2
James M

Sie können das NuGet-Paket "XamarinFormsGesture" von Vapolia verwenden (doc available here ). Es ist kostenlos und einfach zu benutzen.

Verfügbar für iOS und Android, funktioniert jedoch nur auf physischen Geräten (nicht auf dem Simulator).