Есть ли способ распознать короткое или долгое нажатие на экране с помощью Xamarin.Форм?
У меня есть приложение, которое реагирует на короткое нажатие на экране. Я делаю это, добавляя распознаватель жестов.
есть ли способ, которым я могу заставить его реагировать на короткое или долгое нажатие и вызывать разные методы?
2 ответов
для этого у вас будут визуализаторы реализации. В случае iOS вы можете использовать UILongPressGestureRecognizer
для обнаружения действия длительного нажатия, в то время как в случае Android вы можете использовать GestureDetector
сделать то же самое.
формы контроля
public class CustomView : ContentView
{
public event EventHandler<EventArgs> LongPressEvent;
public void RaiseLongPressEvent()
{
if (IsEnabled)
LongPressEvent?.Invoke(this, EventArgs.Empty);
}
}
рендерер iOS
[assembly: ExportRenderer(typeof(CustomView), typeof(CustomViewRenderer))]
namespace AppNamespace.iOS
{
public class CustomViewRenderer : ViewRenderer<CustomView, UIView>
{
UILongPressGestureRecognizer longPressGestureRecognizer;
protected override void OnElementChanged(ElementChangedEventArgs<CustomView> e)
{
longPressGestureRecognizer = longPressGestureRecognizer ??
new UILongPressGestureRecognizer(() =>
{
Element.RaiseLongPressEvent();
});
if (longPressGestureRecognizer != null)
{
if (e.NewElement == null)
{
this.RemoveGestureRecognizer(longPressGestureRecognizer);
}
else if (e.OldElement == null)
{
this.AddGestureRecognizer(longPressGestureRecognizer);
}
}
}
}
}
Android рендерер
[assembly: ExportRenderer(typeof(CustomView), typeof(CustomViewRenderer))]
namespace AppNamespace.Droid
{
public class CustomViewRenderer : ViewRenderer<CustomView, Android.Views.View>
{
private CustomViewListener _listener;
private GestureDetector _detector;
public CustomViewListener Listener
{
get
{
return _listener;
}
}
public GestureDetector Detector
{
get
{
return _detector;
}
}
protected override void OnElementChanged(ElementChangedEventArgs<CustomView> e)
{
base.OnElementChanged(e);
if (e.OldElement == null)
{
GenericMotion += HandleGenericMotion;
Touch += HandleTouch;
_listener = new CustomViewListener(Element);
_detector = new GestureDetector(_listener);
}
}
protected override void Dispose(bool disposing)
{
GenericMotion -= HandleGenericMotion;
Touch -= HandleTouch;
_listener = null;
_detector?.Dispose();
_detector = null;
base.Dispose(disposing);
}
void HandleTouch(object sender, TouchEventArgs e)
{
_detector.OnTouchEvent(e.Event);
}
void HandleGenericMotion(object sender, GenericMotionEventArgs e)
{
_detector.OnTouchEvent(e.Event);
}
}
public class CustomViewListener : GestureDetector.SimpleOnGestureListener
{
readonly CustomView _target;
public CustomViewListener(CustomView s)
{
_target = s;
}
public override void OnLongPress(MotionEvent e)
{
_target.RaiseLongPressEvent();
base.OnLongPress(e);
}
}
}
Пример Использования
<local:CustomView LongPressEvent="Handle_LongPress" />
код
void Handle_LongPressEvent(object sender, System.EventArgs e)
{
//handle long press event here
}
вы также можете настройте выше, чтобы добавить команду, чтобы сделать ее более дружественной к MVVM.
вы можете обратиться этой ссылке для получения более подробной информации о жест распознаватели.
http://arteksoftware.com/gesture-recognizers-with-xamarin-forms/
для этого у вас будут визуализаторы реализации. В случае ios и android
лучший способ сделать это!