summaryrefslogtreecommitdiff
path: root/Xamarin.Forms.Core/ViewExtensions.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Xamarin.Forms.Core/ViewExtensions.cs')
-rw-r--r--Xamarin.Forms.Core/ViewExtensions.cs197
1 files changed, 197 insertions, 0 deletions
diff --git a/Xamarin.Forms.Core/ViewExtensions.cs b/Xamarin.Forms.Core/ViewExtensions.cs
new file mode 100644
index 00000000..14a70868
--- /dev/null
+++ b/Xamarin.Forms.Core/ViewExtensions.cs
@@ -0,0 +1,197 @@
+using System;
+using System.Threading.Tasks;
+
+namespace Xamarin.Forms
+{
+ public static class ViewExtensions
+ {
+ public static void CancelAnimations(VisualElement view)
+ {
+ if (view == null)
+ throw new ArgumentNullException("view");
+ view.AbortAnimation("LayoutTo");
+ view.AbortAnimation("TranslateTo");
+ view.AbortAnimation("RotateTo");
+ view.AbortAnimation("RotateYTo");
+ view.AbortAnimation("RotateXTo");
+ view.AbortAnimation("ScaleTo");
+ view.AbortAnimation("FadeTo");
+ view.AbortAnimation("SizeTo");
+ }
+
+ public static Task<bool> FadeTo(this VisualElement view, double opacity, uint length = 250, Easing easing = null)
+ {
+ if (view == null)
+ throw new ArgumentNullException("view");
+ if (easing == null)
+ easing = Easing.Linear;
+
+ var tcs = new TaskCompletionSource<bool>();
+ var weakView = new WeakReference<VisualElement>(view);
+ Action<double> fade = f =>
+ {
+ VisualElement v;
+ if (weakView.TryGetTarget(out v))
+ v.Opacity = f;
+ };
+
+ new Animation(fade, view.Opacity, opacity, easing).Commit(view, "FadeTo", 16, length, finished: (f, a) => tcs.SetResult(a));
+
+ return tcs.Task;
+ }
+
+ public static Task<bool> LayoutTo(this VisualElement view, Rectangle bounds, uint length = 250, Easing easing = null)
+ {
+ if (view == null)
+ throw new ArgumentNullException("view");
+ if (easing == null)
+ easing = Easing.Linear;
+
+ var tcs = new TaskCompletionSource<bool>();
+ Rectangle start = view.Bounds;
+ Func<double, Rectangle> computeBounds = progress =>
+ {
+ double x = start.X + (bounds.X - start.X) * progress;
+ double y = start.Y + (bounds.Y - start.Y) * progress;
+ double w = start.Width + (bounds.Width - start.Width) * progress;
+ double h = start.Height + (bounds.Height - start.Height) * progress;
+
+ return new Rectangle(x, y, w, h);
+ };
+ var weakView = new WeakReference<VisualElement>(view);
+ Action<double> layout = f =>
+ {
+ VisualElement v;
+ if (weakView.TryGetTarget(out v))
+ v.Layout(computeBounds(f));
+ };
+ new Animation(layout, 0, 1, easing).Commit(view, "LayoutTo", 16, length, finished: (f, a) => tcs.SetResult(a));
+
+ return tcs.Task;
+ }
+
+ public static Task<bool> RelRotateTo(this VisualElement view, double drotation, uint length = 250, Easing easing = null)
+ {
+ if (view == null)
+ throw new ArgumentNullException("view");
+ return view.RotateTo(view.Rotation + drotation, length, easing);
+ }
+
+ public static Task<bool> RelScaleTo(this VisualElement view, double dscale, uint length = 250, Easing easing = null)
+ {
+ if (view == null)
+ throw new ArgumentNullException("view");
+ return view.ScaleTo(view.Scale + dscale, length, easing);
+ }
+
+ public static Task<bool> RotateTo(this VisualElement view, double rotation, uint length = 250, Easing easing = null)
+ {
+ if (view == null)
+ throw new ArgumentNullException("view");
+ if (easing == null)
+ easing = Easing.Linear;
+
+ var tcs = new TaskCompletionSource<bool>();
+ var weakView = new WeakReference<VisualElement>(view);
+ Action<double> rotate = f =>
+ {
+ VisualElement v;
+ if (weakView.TryGetTarget(out v))
+ v.Rotation = f;
+ };
+
+ new Animation(rotate, view.Rotation, rotation, easing).Commit(view, "RotateTo", 16, length, finished: (f, a) => tcs.SetResult(a));
+
+ return tcs.Task;
+ }
+
+ public static Task<bool> RotateXTo(this VisualElement view, double rotation, uint length = 250, Easing easing = null)
+ {
+ if (view == null)
+ throw new ArgumentNullException("view");
+ if (easing == null)
+ easing = Easing.Linear;
+
+ var tcs = new TaskCompletionSource<bool>();
+ var weakView = new WeakReference<VisualElement>(view);
+ Action<double> rotatex = f =>
+ {
+ VisualElement v;
+ if (weakView.TryGetTarget(out v))
+ v.RotationX = f;
+ };
+
+ new Animation(rotatex, view.RotationX, rotation, easing).Commit(view, "RotateXTo", 16, length, finished: (f, a) => tcs.SetResult(a));
+
+ return tcs.Task;
+ }
+
+ public static Task<bool> RotateYTo(this VisualElement view, double rotation, uint length = 250, Easing easing = null)
+ {
+ if (view == null)
+ throw new ArgumentNullException("view");
+ if (easing == null)
+ easing = Easing.Linear;
+
+ var tcs = new TaskCompletionSource<bool>();
+ var weakView = new WeakReference<VisualElement>(view);
+ Action<double> rotatey = f =>
+ {
+ VisualElement v;
+ if (weakView.TryGetTarget(out v))
+ v.RotationY = f;
+ };
+
+ new Animation(rotatey, view.RotationY, rotation, easing).Commit(view, "RotateYTo", 16, length, finished: (f, a) => tcs.SetResult(a));
+
+ return tcs.Task;
+ }
+
+ public static Task<bool> ScaleTo(this VisualElement view, double scale, uint length = 250, Easing easing = null)
+ {
+ if (view == null)
+ throw new ArgumentNullException("view");
+ if (easing == null)
+ easing = Easing.Linear;
+
+ var tcs = new TaskCompletionSource<bool>();
+ var weakView = new WeakReference<VisualElement>(view);
+ Action<double> _scale = f =>
+ {
+ VisualElement v;
+ if (weakView.TryGetTarget(out v))
+ v.Scale = f;
+ };
+
+ new Animation(_scale, view.Scale, scale, easing).Commit(view, "ScaleTo", 16, length, finished: (f, a) => tcs.SetResult(a));
+
+ return tcs.Task;
+ }
+
+ public static Task<bool> TranslateTo(this VisualElement view, double x, double y, uint length = 250, Easing easing = null)
+ {
+ if (view == null)
+ throw new ArgumentNullException("view");
+ easing = easing ?? Easing.Linear;
+
+ var tcs = new TaskCompletionSource<bool>();
+ var weakView = new WeakReference<VisualElement>(view);
+ Action<double> translateX = f =>
+ {
+ VisualElement v;
+ if (weakView.TryGetTarget(out v))
+ v.TranslationX = f;
+ };
+ Action<double> translateY = f =>
+ {
+ VisualElement v;
+ if (weakView.TryGetTarget(out v))
+ v.TranslationY = f;
+ };
+ new Animation { { 0, 1, new Animation(translateX, view.TranslationX, x) }, { 0, 1, new Animation(translateY, view.TranslationY, y) } }.Commit(view, "TranslateTo", 16, length, easing,
+ (f, a) => tcs.SetResult(a));
+
+ return tcs.Task;
+ }
+ }
+} \ No newline at end of file