Жесты касания в 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());
}
}
}