Жесты долгого касания в Xamarin Android Renderer

Я пытаюсь добавить длинные сенсорные жесты в свое приложение 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 не позволяет мне распознать этот жест, я также играл с андроидами 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: /

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


person Bodungus    schedule 22.02.2018    source источник
comment
Думаю, с эффектом можно добиться желаемого поведения! Мой коллега сделал отличную рецензию на эту тему: alexdunn.org/2017/12/27/   -  person Joe    schedule 22.02.2018
comment
Да, обязательно посмотрите статью Алекса Данна. Я последовал этому, чтобы реализовать некоторые функции щелчка вниз и вверх, и это сработало как шарм.   -  person GBreen12    schedule 22.02.2018


Ответы (1)


Для управления долгим нажатием вам понадобится настраиваемый прослушиватель жестов. Вот основная структура:

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());
        }
    }
}
person sme    schedule 23.02.2018
comment
Я посмотрю на это, но я был больше после реализации Android. Класс расширения My Frame работает с iOS, на то, чтобы заставить это работать в iOS, потребовалось 5 минут. Я больше ищу, как добавить слушателя сенсорных жестов к кадру в xamarin android, если это имеет смысл? - person Bodungus; 25.02.2018
comment
Код для Android. Он отлично работает в моих проектах - person sme; 25.02.2018
comment
Я рассмотрел жесты, и это сработало. Ваш ответ был лучшей версией этого // arteksoftware.com/gesture-recognizers-with-xamarin-forms. Я немного боролся с этим, так как не мог выполнить обратный вызов в свой фрейм. Большое спасибо, это действительно помогло! (хотя он досадно отключает жест форм xamarin, поэтому мне пришлось условно добавить одно нажатое событие, которое я вызываю только на Android) - person Bodungus; 01.03.2018