Подтвердить что ты не робот

Xamarin Forms Swipe Left/Swift Right Gestures

Я хочу предисловие к этому, сказав, что я совершенно новичок в мобильной разработке, Xamarin, С#,.Net.

Я работаю над созданием мобильного приложения с использованием форм Xamarain и столкнулся с проблемой отсутствия у меня жестов салфетки, по крайней мере, согласно документации, которую я видел.

Я нашел этот сайт: http://arteksoftware.com/gesture-recognizers-with-xamarin-forms/

Это описывает, как добавить некоторые дополнительные жесты для IOS/Android, чтобы они были доступны в контексте формы. Прежде чем я попытаюсь следовать этому, я хотел бы увидеть, осуществил ли кто-нибудь еще какой-либо профайл в приложении Xamarin Forms и как они это сделали.

Мои цели состоят в том, что должна быть горизонтальная компоновка стека. Этот макет содержит 7 кнопок, каждая кнопка отражает день на текущей неделе. При прокрутке влево на макете стека изменится текст кнопки на предыдущую неделю. Правильное правое изменение изменит текст кнопки на следующую неделю.

Поэтому я также пытаюсь использовать MVVM для этого и XAML. Могу ли я отделить салфетки влево и салфетки вправо? Я хочу использовать ICommand для передачи определенного параметра функции, основанной на направлении прокрутки.

Приветствуются любые примеры этого или любого совета.

4b9b3361

Ответ 1

Если вам удобно платить за стороннюю библиотеку (и вы используете Xamarin Forms, чтобы иметь хорошую возможность), MR.Gestures поддерживает все жесты касания всех видов Xamarin.Forms. Я использовал его успешно и был очень доволен этим. Это стоит очень разумного € 10 и имеет отличную документацию.

Если вы один из многих людей, которые разочарованы тем, что жесты касания не поддерживаются в Xamarin Forms, подумайте о голосовании за это предложение в UserVoice.

Ответ 2

Нет необходимости в сторонних библиотеках.. Не нужно платить.. Просто добавьте эти два класса и выполните свои сабвуферы.

Шаг 1: скопируйте эти два класса

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

Шаг 2: Из ваших форм Xamarin передается представление, а также интерфейс obj. Затем вы получите результат

В моем случае я передаю ярлык

 SwipeListener swipeListener = new SwipeListener(lbl_swipe, this);

Шаг 3. Внедрение интерфейса ISwipeCallBack

public partial class SwipeLibPage : ContentPage, ISwipeCallBack

Пример проекта → https://github.com/rranjithkumar100/Xamarin-Swipe-Library

Ответ 3

Вы всегда можете посмотреть эту простую демонстрацию. И используйте его следующим образом:

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;

Ответ 4

Вы можете использовать пакет NuGet "XamarinFormsGesture" Vapolia (доступный doc здесь). Он бесплатный и простой в использовании.

Доступно на iOS и Android, но работает только на физических устройствах (не на симуляторе).