summaryrefslogtreecommitdiff
path: root/Xamarin.Forms.Controls
diff options
context:
space:
mode:
authorSamantha Houts <samantha@teamredwall.com>2016-08-30 11:14:13 -0700
committerJason Smith <jason.smith@xamarin.com>2016-08-30 11:14:13 -0700
commitab0daa194734be0e45d8582e9254c447b464b27f (patch)
tree8549bb2248d8d51987b0e017c2855622d30209d9 /Xamarin.Forms.Controls
parent1b7250167ff027bbd5ce3d2950a3e3495a13a5f7 (diff)
downloadxamarin-forms-ab0daa194734be0e45d8582e9254c447b464b27f.tar.gz
xamarin-forms-ab0daa194734be0e45d8582e9254c447b464b27f.tar.bz2
xamarin-forms-ab0daa194734be0e45d8582e9254c447b464b27f.zip
[A] PanGestureRecognizer will consistently send Completed event (#313)
* Adjust gallery page for reproduction * [A] Forward OnTouchEvent to Listener... ...and end scrolling on Up.
Diffstat (limited to 'Xamarin.Forms.Controls')
-rw-r--r--Xamarin.Forms.Controls/ControlGalleryPages/PanGestureGalleryPage.cs91
1 files changed, 62 insertions, 29 deletions
diff --git a/Xamarin.Forms.Controls/ControlGalleryPages/PanGestureGalleryPage.cs b/Xamarin.Forms.Controls/ControlGalleryPages/PanGestureGalleryPage.cs
index b37e8e48..ef595b63 100644
--- a/Xamarin.Forms.Controls/ControlGalleryPages/PanGestureGalleryPage.cs
+++ b/Xamarin.Forms.Controls/ControlGalleryPages/PanGestureGalleryPage.cs
@@ -8,33 +8,54 @@ namespace Xamarin.Forms.Controls
{
public class PanGestureGalleryPage : ContentPage
{
- public class PanContainer : ContentView
+ public class PanCompleteArgs : EventArgs
{
- public PanContainer ()
+ public PanCompleteArgs(string message) { Message = message; }
+ public string Message
{
- var pan = new PanGestureRecognizer
- {
- TouchPoints = 1
- };
+ get; private set;
+ }
+ }
- pan.PanUpdated += (object s, PanUpdatedEventArgs e) =>
- {
- switch (e.StatusType) {
+ public class PanContainer : ContentView
+ {
+ double _x, _y;
+ double _currentScale = 1;
+
+ public EventHandler<PanCompleteArgs> PanCompleted;
- case GestureStatus.Started: break;
+ public PanContainer()
+ {
+ GestureRecognizers.Add(GetPinch());
+ GestureRecognizers.Add(GetPan());
+ }
+ PanGestureRecognizer GetPan()
+ {
+ var pan = new PanGestureRecognizer();
+ pan.PanUpdated += (s, e) =>
+ {
+ switch (e.StatusType)
+ {
case GestureStatus.Running:
Content.TranslationX = e.TotalX;
Content.TranslationY = e.TotalY;
break;
- default:
- Content.TranslationX = Content.TranslationY = 0;
+ case GestureStatus.Completed:
+ _x = Content.TranslationX;
+ _y = Content.TranslationY;
+
+ PanCompleted?.Invoke(s, new PanCompleteArgs($"x: {_x}, y: {_y}"));
break;
}
};
+ return pan;
+ }
- var pinch = new PinchGestureRecognizer ();
+ PinchGestureRecognizer GetPinch()
+ {
+ var pinch = new PinchGestureRecognizer();
double xOffset = 0;
double yOffset = 0;
@@ -43,14 +64,16 @@ namespace Xamarin.Forms.Controls
pinch.PinchUpdated += (sender, e) =>
{
- if (e.Status == GestureStatus.Started) {
+ if (e.Status == GestureStatus.Started)
+ {
startScale = Content.Scale;
Content.AnchorX = Content.AnchorY = 0;
}
- if (e.Status == GestureStatus.Running) {
+ if (e.Status == GestureStatus.Running)
+ {
_currentScale += (e.Scale - 1) * startScale;
- _currentScale = Math.Max (1, _currentScale);
+ _currentScale = Math.Max(1, _currentScale);
var renderedX = Content.X + xOffset;
var deltaX = renderedX / Width;
@@ -65,32 +88,42 @@ namespace Xamarin.Forms.Controls
double targetX = xOffset - (originX * Content.Width) * (_currentScale - startScale);
double targetY = yOffset - (originY * Content.Height) * (_currentScale - startScale);
- Content.TranslationX = targetX.Clamp (-Content.Width * (_currentScale - 1), 0);
- Content.TranslationY = targetY.Clamp (-Content.Height * (_currentScale - 1), 0);
+ Content.TranslationX = targetX.Clamp(-Content.Width * (_currentScale - 1), 0);
+ Content.TranslationY = targetY.Clamp(-Content.Height * (_currentScale - 1), 0);
Content.Scale = _currentScale;
}
- if (e.Status == GestureStatus.Completed) {
+
+ if (e.Status == GestureStatus.Completed)
+ {
xOffset = Content.TranslationX;
yOffset = Content.TranslationY;
}
};
-
- GestureRecognizers.Add (pinch);
-
- GestureRecognizers.Add (pan);
+ return pinch;
}
-
- double _currentScale = 1;
}
- public PanGestureGalleryPage ()
+ public PanGestureGalleryPage()
{
- var image = new Image { Source = "http://placehold.it/2000x2000", BackgroundColor = Color.Gray, WidthRequest = 2000, HeightRequest = 2000, VerticalOptions = LayoutOptions.Center, HorizontalOptions = LayoutOptions.Center };
+ var box = new Image
+ {
+ BackgroundColor = Color.Gray,
+ WidthRequest = 2000,
+ HeightRequest = 2000,
+ VerticalOptions = LayoutOptions.Center,
+ HorizontalOptions = LayoutOptions.Center
+ };
+
+ var label = new Label { Text = "Use two fingers to pinch. Use one finger to pan." };
- var panme = new PanContainer { Content = image };
+ var panme = new PanContainer { Content = box };
+ panme.PanCompleted += (s, e) =>
+ {
+ label.Text = e.Message;
+ };
- Content = new StackLayout { Children = { new Label { Text = "Use two fingers to pinch. Use one finger to pan." }, panme }, Padding = new Thickness (20) };
+ Content = new StackLayout { Children = { label, panme }, Padding = new Thickness(20) };
}
}
} \ No newline at end of file