New version for MAUI here: https://github.com/vapolia/MauiGestures/
iOS, Android, UWP
Add "advanced" gestures to Xamarin Forms. Available on all views. Most gesture commands include the event position.
<Label Text="Click here" IsEnabled="True" ui:Gesture.TapCommand="{Binding OpenLinkCommand}" />
Or in code:
var label = new Label();
Vapolia.Lib.Ui.Gesture.SetTapCommand(label, new Command(() => { /*your code*/ }));
Add the above nuget package to your Xamarin Forms project (only the netstandard one is enough).
In your platform projects (android,ios,uwp), before initializing xamarin forms, call Vapolia.Lib.Effects.PlatformGestureEffect.Init();
to force the discovery of this extension by the Xamarin Forms plugin engine.
The views on which the gesture is applied should have the property IsEnabled="True" and InputTransparent="False" which activates user interaction on them.
Add Gesture.TapCommand on any supported xaml view:
<StackLayout ui:Gesture.TapCommand="{Binding OpenLinkCommand}">
<Label Text="1.Tap this to open an url" />
</StackLayout>
Declare the corresponding namespace:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
...
xmlns:ui="clr-namespace:Vapolia.Lib.Ui;assembly=XamarinFormsGesture"
>
And in the viewmodel:
public Command OpenLinkCommand => new Command(() =>
{
//do something
});
TapCommand (ICommand)
DoubleTapCommand (ICommand)
PanCommand (ICommand)
LongPressCommand (ICommand)
TapPointCommand (ICommand or Command<Point>)
where point is the absolute tap position relative to the viewDoubleTapPoinCommand (ICommand or Command<Point>)
where point is the absolute double tap position relative to the viewPanPointCommand (ICommand or Command<PanEventArgs>)
where point is the absolute position relative to the viewLongPressPointCommand (ICommand or Command<Point>)
where point is the absolute tap position relative to the viewSwipeLeftCommand
SwipeRightCommand
SwipeTopCommand
SwipeBottomCommand
PinchCommand (Command<PinchEventArgs>)
wherePinchEventArg
containsStartingPoints
,CurrentPoints
,Center
,Scale
,RotationRadians
,RotationDegrees
,Status
Properties:
IsPanImmediate
Set to true to receive the PanCommand or PanPointCommand event on touch down, instead of after a minimum move distance. Default to false.
<StackLayout ui:Gesture.TapCommand="{Binding OpenCommand}" IsEnabled="True">
<Label Text="1.Tap this text to open an url" />
</StackLayout>
<StackLayout ui:Gesture.DoubleTapPointCommand="{Binding OpenPointCommand}" IsEnabled="True">
<Label Text="2.Double tap this text to open an url" />
</StackLayout>
<BoxView
ui:Gesture.PanPointCommand="{Binding PanPointCommand}"
HeightRequest="200" WidthRequest="300"
InputTransparent="False"
IsEnabled="True"
/>
In the viewmodel:
public ICommand OpenCommand => new Command(async () =>
{
//...
});
public ICommand OpenPointCommand => new Command<PointEventArgs>(point =>
{
PanX = point.X;
PanY = point.Y;
//...
});
public ICommand PanPointCommand => new Command<PanEventArgs>(args =>
{
var point = args.Point;
PanX = point.X;
PanY = point.Y;
//...
});
//Tap anywhere to set value
Gesture.SetTapPointCommand(this, new Command<PointEventArgs>(pt =>
{
var delta = (pt.X - Padding.Left) / (Width - Padding.Left - Padding.Right);
if(delta<0 || delta>1)
return;
Value = (int)Math.Round((Maximum - Minimum) * delta);
}));
Only commands are supported (PR welcome for events). No .NET events. So you must use the MVVM pattern (https://developer.xamarin.com/guides/xamarin-forms/xaml/xaml-basics/data_bindings_to_mvvm/).
Swipe commands are not supported on UWP due to a bug (event not received). If you find it, notify me! PinchCommand is not supported (yet) on UWP. PR welcome.
If your command is not receiving events, make sure that:
- you used the correct handler. Ie: the
LongPressPointCommand
should benew Command<PointEventArgs>(pt => ...)
- you set IsEnabled="True" and InputTransparent="False" on the element
UWP requires fall creator update
Version 3.3.3 has breaking changes:
- Point commands now gives a
PointEventArgs
instead of a Point. ie:Command<PointEventArgs>
- Initialization namespace is unified across platforms:
Vapolia.Lib.Effects.PlatformGestureEffect.Init();
Version 3.3.0 has breaking changes:
- Command names have changed
- PanPointCommand returns an absolute position, not a relative position anymore. It also returns the gesture state. The gesture can also be cancelled.