SlidingAnimation.cs 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. using System;
  2. using System.Numerics;
  3. using Avalonia.Animation;
  4. using Avalonia.Controls;
  5. using Avalonia.Rendering.Composition;
  6. using Avalonia.Rendering.Composition.Animations;
  7. namespace Avalonia.Xaml.Interactions.Custom;
  8. /// <summary>
  9. ///
  10. /// </summary>
  11. public static class SlidingAnimation
  12. {
  13. /// <summary>
  14. ///
  15. /// </summary>
  16. /// <param name="element"></param>
  17. /// <param name="milliseconds"></param>
  18. public static void SetLeft(Control element, double milliseconds)
  19. {
  20. element.Loaded += (_, _) =>
  21. {
  22. Apply(element, -element.Bounds.Width, 0, TimeSpan.FromMilliseconds(milliseconds));
  23. };
  24. }
  25. /// <summary>
  26. ///
  27. /// </summary>
  28. /// <param name="element"></param>
  29. /// <param name="milliseconds"></param>
  30. public static void SetRight(Control element, double milliseconds)
  31. {
  32. element.Loaded += (_, _) =>
  33. {
  34. Apply(element, 2 * element.Bounds.Width, 0, TimeSpan.FromMilliseconds(milliseconds));
  35. };
  36. }
  37. /// <summary>
  38. ///
  39. /// </summary>
  40. /// <param name="element"></param>
  41. /// <param name="milliseconds"></param>
  42. public static void SetTop(Control element, double milliseconds)
  43. {
  44. element.Loaded += (_, _) =>
  45. {
  46. Apply(element, 0, -element.Bounds.Height, TimeSpan.FromMilliseconds(milliseconds));
  47. };
  48. }
  49. /// <summary>
  50. ///
  51. /// </summary>
  52. /// <param name="element"></param>
  53. /// <param name="milliseconds"></param>
  54. public static void SetBottom(Control element, double milliseconds)
  55. {
  56. element.Loaded += (_, _) =>
  57. {
  58. Apply(element, 0, 2 * element.Bounds.Height, TimeSpan.FromMilliseconds(milliseconds));
  59. };
  60. }
  61. /// <summary>
  62. ///
  63. /// </summary>
  64. /// <param name="visual"></param>
  65. /// <param name="offsetX"></param>
  66. /// <param name="offsetY"></param>
  67. /// <param name="duration"></param>
  68. private static void Apply(Visual visual, double offsetX, double offsetY, TimeSpan duration)
  69. {
  70. var compositionVisual = ElementComposition.GetElementVisual(visual);
  71. if (compositionVisual is null)
  72. {
  73. return;
  74. }
  75. var compositor = compositionVisual.Compositor;
  76. var offsetAnimation = compositor.CreateVector3KeyFrameAnimation();
  77. offsetAnimation.InsertKeyFrame(0.0f, new Vector3((float)offsetX, (float)offsetY, 0));
  78. offsetAnimation.InsertKeyFrame(1.0f, new Vector3(0, 0, 0));
  79. offsetAnimation.Direction = PlaybackDirection.Normal;
  80. offsetAnimation.Duration = duration;
  81. offsetAnimation.IterationBehavior = AnimationIterationBehavior.Count;
  82. offsetAnimation.IterationCount = 1;
  83. compositionVisual.StartAnimation("Offset", offsetAnimation);
  84. }
  85. }