Жесты касания в Android-рендерере Xamarin

Я пытаюсь вставить длинные жесты в мое приложение xamarin. У меня есть вид, где касание приводит вас к экрану редактирования, а долгое касание открывает меню параметров. Я следовал этому руководству на SO о реализации такой вещи. Элемент, который я хочу, чтобы его долго трогали, - это Frameпоэтому я написал расширение для Frame, Вот этот класс:

public class FrameWithLongTouchGesture : Frame
{
    public FrameWithLongTouchGesture()
    {
    }

    public EventHandler LongPressActivated;

    public void HandleLongPress(object sender, EventArgs e)
    {
        //Handle LongPressActivated Event
        EventHandler eventHandler = this.LongPressActivated;
        eventHandler?.Invoke((object)this, EventArgs.Empty);
    }
}

Как видите, я добавил обработчик событий к этому объекту. Затем я приступил к реализации пользовательского рендерера для каждой платформы, я начал с iOS (так как я разработчик iOS). Работал абсолютно без проблем, потребовалось 5 минут, чтобы начать работать. Так что теперь я пришел к Android, это должно быть еще проще, так как пост, который я связал ранее, показывает вам, как реализовать рендерер в Android... отлично!....

Не так здорово:(Событие длинного прикосновения не обрабатывается ВСЕ с точным кодом в сообщении. Я установил точки останова, попытался записать на консоль, но обработчик событий жестов никогда не запускается. Я даже вижу, что телефон получает событие касания, потому что оно выводится на консоль, когда я запускаю его на своем тестовом устройстве.Я абсолютно не понимаю, почему Android не позволяет мне распознавать этот жест, я также поиграл с androids GestureDetector но это никогда не увольнял. Вот мой рендерер для Android:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Diagnostics;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;

using Android.Content;
using Android.Views;
using Android.Widget;

using LongTouchGestureDemo;
using LongTouchGestureDemo.Droid;

[assembly: ExportRenderer(typeof(FrameWithLongTouchGesture), typeof(FrameWithLongTouchGestureRenderer))]

namespace LongTouchGestureDemo.Droid
{
    public class FrameWithLongTouchGestureRenderer : FrameRenderer
    {
        FrameWithLongTouchGesture view;
        //GestureDetector gesture;

        public FrameWithLongTouchGestureRenderer(Context context) : base(context)
        {
            //gesture = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener());

            this.LongClick += (object sender, LongClickEventArgs e) => {
                view.HandleLongPress(sender, e);
            };
        }

        protected override void OnElementChanged(ElementChangedEventArgs<Frame> e)
        {
            base.OnElementChanged(e);

            if (e.NewElement != null)
            {
                view = e.NewElement as FrameWithLongTouchGesture;
            }
        }
    }
}

Это действительно расстраивает, потому что я не могу реализовать основные функции в приложении для Android. Это не помогает, что у меня нет опыта разработки android, кажется, что реализовать жесты в droid не так просто, как, к сожалению, в iOS: /

Вся помощь и предложения приветствуются! Спасибо

1 ответ

Решение

Вам нужен пользовательский Gesture Listener для управления долгим нажатием. Вот основная структура:

public class FrameWithLongTouchGestureRenderer : FrameRenderer
{
    FrameWithLongTouchGesture view;
    readonly MyGestureListener _listener;
    readonly Android.Views.GestureDetector _detector;

    public FrameWithLongTouchGestureRenderer()
    {
        _listener = new MyGestureListener();
        _detector = new GestureDetector(_listener);
    }

    protected override void OnElementChanged(ElementChangedEventArgs<Frame> e)
    {
        base.OnElementChanged(e);

        if (e.NewElement != null)
        {
            view = e.NewElement as FrameWithLongTouchGesture;
            UpdateEventHandlers();
        }
    }

    private void UpdateEventHandlers()
    {
        _listener.MyFrame = view;

        GenericMotion += (s, a) => _detector.OnTouchEvent(a.Event);
        Touch += (s, a) => _detector.OnTouchEvent(a.Event);
    }
}

А потом ваш слушатель жестов:

internal class MyGestureListener : GestureDetector.SimpleOnGestureListener
{
    public FrameWithLongTouchGesture MyFrame { private get; set; }

    public override void OnLongPress(MotionEvent e)
    {
        base.OnLongPress(e);

        if (MyFrame != null)
        {
            MyFrame.HandleLongPress(this, new System.EventArgs());
        }
    }
}
Другие вопросы по тегам