-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathAnimationHelper.cs
More file actions
106 lines (84 loc) · 4.43 KB
/
AnimationHelper.cs
File metadata and controls
106 lines (84 loc) · 4.43 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
using System.Numerics;
using Microsoft.UI.Composition;
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Hosting;
namespace NoteUI;
internal static class AnimationHelper
{
// ── Fade + slide up (note cards appearing) ───────────────────
public static void FadeSlideIn(UIElement element, int delayMs = 0, int durationMs = 250)
{
var visual = ElementCompositionPreview.GetElementVisual(element);
var compositor = visual.Compositor;
visual.Opacity = 0f;
visual.Offset = new Vector3(0, 12, 0);
var fadeAnim = compositor.CreateScalarKeyFrameAnimation();
fadeAnim.InsertKeyFrame(0f, 0f);
fadeAnim.InsertKeyFrame(1f, 1f, compositor.CreateCubicBezierEasingFunction(
new Vector2(0.1f, 0.9f), new Vector2(0.2f, 1f)));
fadeAnim.Duration = TimeSpan.FromMilliseconds(durationMs);
fadeAnim.DelayTime = TimeSpan.FromMilliseconds(delayMs);
var slideAnim = compositor.CreateVector3KeyFrameAnimation();
slideAnim.InsertKeyFrame(0f, new Vector3(0, 12, 0));
slideAnim.InsertKeyFrame(1f, Vector3.Zero, compositor.CreateCubicBezierEasingFunction(
new Vector2(0.1f, 0.9f), new Vector2(0.2f, 1f)));
slideAnim.Duration = TimeSpan.FromMilliseconds(durationMs);
slideAnim.DelayTime = TimeSpan.FromMilliseconds(delayMs);
visual.StartAnimation("Opacity", fadeAnim);
visual.StartAnimation("Offset", slideAnim);
}
// ── Fade out then collapse ───────────────────────────────────
public static void FadeOut(UIElement element, int durationMs = 150, Action? onComplete = null)
{
var visual = ElementCompositionPreview.GetElementVisual(element);
var compositor = visual.Compositor;
var fadeAnim = compositor.CreateScalarKeyFrameAnimation();
fadeAnim.InsertKeyFrame(0f, 1f);
fadeAnim.InsertKeyFrame(1f, 0f, compositor.CreateCubicBezierEasingFunction(
new Vector2(0.4f, 0f), new Vector2(1f, 1f)));
fadeAnim.Duration = TimeSpan.FromMilliseconds(durationMs);
var batch = compositor.CreateScopedBatch(CompositionBatchTypes.Animation);
visual.StartAnimation("Opacity", fadeAnim);
batch.End();
if (onComplete != null)
{
batch.Completed += (_, _) =>
{
element.DispatcherQueue.TryEnqueue(() => onComplete());
};
}
}
// ── Fade in (restore) ────────────────────────────────────────
public static void FadeIn(UIElement element, int durationMs = 200, int delayMs = 0)
{
var visual = ElementCompositionPreview.GetElementVisual(element);
var compositor = visual.Compositor;
visual.Opacity = 0f;
var fadeAnim = compositor.CreateScalarKeyFrameAnimation();
fadeAnim.InsertKeyFrame(0f, 0f);
fadeAnim.InsertKeyFrame(1f, 1f, compositor.CreateCubicBezierEasingFunction(
new Vector2(0.1f, 0.9f), new Vector2(0.2f, 1f)));
fadeAnim.Duration = TimeSpan.FromMilliseconds(durationMs);
fadeAnim.DelayTime = TimeSpan.FromMilliseconds(delayMs);
visual.StartAnimation("Opacity", fadeAnim);
}
// ── Scale pop (pin toggle, button feedback) ──────────────────
public static void ScalePop(UIElement element, int durationMs = 200)
{
var visual = ElementCompositionPreview.GetElementVisual(element);
var compositor = visual.Compositor;
// Set center point for scale
var fe = element as FrameworkElement;
var w = fe != null ? (float)fe.ActualWidth / 2f : 0f;
var h = fe != null ? (float)fe.ActualHeight / 2f : 0f;
visual.CenterPoint = new Vector3(w, h, 0);
var scaleAnim = compositor.CreateVector3KeyFrameAnimation();
scaleAnim.InsertKeyFrame(0f, Vector3.One);
scaleAnim.InsertKeyFrame(0.4f, new Vector3(1.05f, 1.05f, 1f), compositor.CreateCubicBezierEasingFunction(
new Vector2(0.2f, 0.8f), new Vector2(0.2f, 1f)));
scaleAnim.InsertKeyFrame(1f, Vector3.One, compositor.CreateCubicBezierEasingFunction(
new Vector2(0.2f, 0.8f), new Vector2(0.2f, 1f)));
scaleAnim.Duration = TimeSpan.FromMilliseconds(durationMs);
visual.StartAnimation("Scale", scaleAnim);
}
}