Browse Source

优化贴边隐藏动画

liufei 3 years ago
parent
commit
c3e46bc751
1 changed files with 151 additions and 69 deletions
  1. 151 69
      Util/MarginHide.cs

+ 151 - 69
Util/MarginHide.cs

@@ -4,8 +4,8 @@ using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 
-using System.Drawing; //添加引用
-using System.Windows.Forms;//添加引用
+using System.Drawing;
+using System.Windows.Forms;
 using MouseEventArgs = System.Windows.Input.MouseEventArgs;
 using System.Windows;
 using System.Windows.Media.Animation;
@@ -14,32 +14,40 @@ using System.Windows.Media;
 namespace GeekDesk.Util
 {
 
-    enum HidePosition
+    enum HideType
     {
-        TOP = 1,
-        LEFT = 2,
-        RIGHT = 3
+        TOP_SHOW = 1,
+        LEFT_SHOW = 2,
+        RIGHT_SHOW = 3,
+        TOP_HIDE = 4,
+        LEFT_HIDE = 5,
+        RIGHT_HIDE = 6
     }
 
     public class MarginHide
     {
-        readonly Window window;//定义使用该方法的窗体
+        private static Window window;//定义使用该方法的窗体
 
-        private readonly int hideTime = 80;
+        private static readonly int hideTime = 200;
+        private static readonly int fadeHideTime = 180;
+        private static readonly int fadeShowTime = 200;
+        private static readonly int taskTime = 250;
 
-        private readonly int taskTime = 200;
+        private static double showMarginWidth = 1;
 
-        private double showMarginWidth = 1;
+        public static bool IS_RUN = false;
+        public static bool IS_HIDE = false;
 
-#pragma warning disable CS0414 // 字段“MarginHide.isHide”已被赋值,但从未使用过它的值
-        private bool isHide;
-#pragma warning restore CS0414 // 字段“MarginHide.isHide”已被赋值,但从未使用过它的值
+        private static Timer timer = null;
 
-        public Timer timer;
-        //构造函数,传入将要匹配的窗体      
-        public MarginHide(Window window)
+        public static void ReadyHide(Window window)
         {
-            this.window = window;
+            MarginHide.window = window;
+            if (timer != null) return;
+            timer = new Timer();//添加timer计时器,隐藏功能
+            timer.Interval = taskTime;
+            timer.Tick += HideWindow;
+            timer.Start();
         }
 
 
@@ -47,7 +55,7 @@ namespace GeekDesk.Util
         /// 窗体是否贴边
         /// </summary>
         /// <returns></returns>
-        public bool IsMargin()
+        public static bool IsMargin()
         {
             double screenLeft = SystemParameters.VirtualScreenLeft;
             double screenTop = SystemParameters.VirtualScreenTop;
@@ -64,12 +72,12 @@ namespace GeekDesk.Util
                 || windowLeft + windowWidth + Math.Abs(screenLeft) >= screenWidth);
         }
 
-   
+
 
         #region 窗体贴边隐藏功能
-        private void TimerDealy(object o, EventArgs e)
+        private static void HideWindow(object o, EventArgs e)
         {
-            if (window.Visibility != Visibility.Visible) return;
+            if (window.Visibility != Visibility.Visible || !IS_RUN) return;
 
             double screenLeft = SystemParameters.VirtualScreenLeft;
             double screenTop = SystemParameters.VirtualScreenTop;
@@ -87,47 +95,59 @@ namespace GeekDesk.Util
             double mouseY = p.Y;
 
             //鼠标不在窗口上
-            if (mouseX < windowLeft || mouseX > windowLeft + windowWidth
-                || mouseY < windowTop || mouseY > windowTop + windowHeight)
+            if ((mouseX < windowLeft || mouseX > windowLeft + windowWidth
+                || mouseY < windowTop || mouseY > windowTop + windowHeight) && !IS_HIDE)
             {
                 //上方隐藏条件
                 if (windowTop <= screenTop)
                 {
-                    HideAnimation(windowTop, screenTop - windowHeight + showMarginWidth, Window.TopProperty);
-                    isHide = true;
+                    IS_HIDE = true;
+                    FadeAnimation(1, 0);
+                    HideAnimation(windowTop, screenTop - windowHeight + showMarginWidth, Window.TopProperty, HideType.TOP_HIDE);
                     return;
                 }
                 //左侧隐藏条件
                 if (windowLeft <= screenLeft)
                 {
-                    HideAnimation(windowLeft, screenLeft - windowWidth + showMarginWidth, Window.LeftProperty);
+                    IS_HIDE = true;
+                    FadeAnimation(1, 0);
+                    HideAnimation(windowLeft, screenLeft - windowWidth + showMarginWidth, Window.LeftProperty, HideType.LEFT_HIDE);
                     return;
                 }
                 //右侧隐藏条件
                 if (windowLeft + windowWidth + Math.Abs(screenLeft) >= screenWidth)
                 {
-                    HideAnimation(windowLeft, screenWidth - Math.Abs(screenLeft) - showMarginWidth, Window.LeftProperty);
+                    IS_HIDE = true;
+                    FadeAnimation(1, 0);
+                    HideAnimation(windowLeft, screenWidth - Math.Abs(screenLeft) - showMarginWidth, Window.LeftProperty, HideType.RIGHT_HIDE);
                     return;
                 }
-            } else if (mouseX >= windowLeft && mouseX <= windowLeft + windowWidth 
-                && mouseY >= windowTop && mouseY <= windowTop + windowHeight)
+            }
+            else if (mouseX >= windowLeft && mouseX <= windowLeft + windowWidth
+              && mouseY >= windowTop && mouseY <= windowTop + windowHeight && IS_HIDE)
             {
                 //上方显示
                 if (windowTop <= screenTop - showMarginWidth)
                 {
-                    HideAnimation(windowTop, screenTop, Window.TopProperty);
+                    IS_HIDE = false;
+                    HideAnimation(windowTop, screenTop, Window.TopProperty, HideType.TOP_SHOW);
+                    FadeAnimation(0, 1);
                     return;
                 }
                 //左侧显示
                 if (windowLeft <= screenLeft - showMarginWidth)
                 {
-                    HideAnimation(windowLeft, screenLeft, Window.LeftProperty);
+                    IS_HIDE = false;
+                    HideAnimation(windowLeft, screenLeft, Window.LeftProperty, HideType.LEFT_SHOW);
+                    FadeAnimation(0, 1);
                     return;
                 }
                 //右侧显示
                 if (windowLeft + Math.Abs(screenLeft) == screenWidth - showMarginWidth)
                 {
-                    HideAnimation(windowLeft, screenWidth - Math.Abs(screenLeft) - windowWidth, Window.LeftProperty);
+                    IS_HIDE = false;
+                    HideAnimation(windowLeft, screenWidth - Math.Abs(screenLeft) - windowWidth, Window.LeftProperty, HideType.RIGHT_SHOW);
+                    FadeAnimation(0, 1);
                     return;
                 }
             }
@@ -136,58 +156,83 @@ namespace GeekDesk.Util
         #endregion 
 
 
-        public void TimerSet()
+        public static void StartHide()
         {
-            if (timer != null) return;
-            timer = new Timer();//添加timer计时器,隐藏功能
-            #region 计时器设置,隐藏功能
-            timer.Interval = taskTime;
-            timer.Tick += TimerDealy;
-            timer.Start();
-            #endregion
+            IS_RUN = true;
         }
 
-        public void TimerStop()
+        public static void StopHide()
         {
-            timer.Stop();
-            timer.Dispose();
-            timer = null;
+            IS_RUN = false;
             //功能关闭 如果界面是隐藏状态  那么要显示界面 ↓
+            if (IS_HIDE)
+            {
+                double screenLeft = SystemParameters.VirtualScreenLeft;
+                double screenTop = SystemParameters.VirtualScreenTop;
+                double screenWidth = SystemParameters.VirtualScreenWidth;
 
-            double screenLeft = SystemParameters.VirtualScreenLeft;
-            double screenTop = SystemParameters.VirtualScreenTop;
-            double screenWidth = SystemParameters.VirtualScreenWidth;
+                double windowWidth = window.Width;
 
-            double windowWidth = window.Width;
+                double windowTop = window.Top;
+                double windowLeft = window.Left;
 
-            double windowTop = window.Top;
-            double windowLeft = window.Left;
-
-            //左侧显示
-            if (windowLeft <= screenLeft - showMarginWidth)
-            {
-                HideAnimation(windowLeft, screenLeft, Window.LeftProperty);
-                return;
-            }
+                //左侧显示
+                if (windowLeft <= screenLeft - showMarginWidth)
+                {
+                    IS_HIDE = false;
+                    FadeAnimation(0, 1);
+                    HideAnimation(windowLeft, screenLeft, Window.LeftProperty, HideType.LEFT_SHOW);
+                    return;
+                }
 
-            //上方显示
-            if (windowTop <= screenTop - showMarginWidth)
-            {
-                HideAnimation(windowTop, screenTop, Window.TopProperty);
-                return;
-            }
+                //上方显示
+                if (windowTop <= screenTop - showMarginWidth)
+                {
+                    IS_HIDE = false;
+                    FadeAnimation(0, 1);
+                    HideAnimation(windowTop, screenTop, Window.TopProperty, HideType.TOP_SHOW);
+                    return;
+                }
 
-            //右侧显示
-            if (windowLeft + Math.Abs(screenLeft) == screenWidth - showMarginWidth)
-            {
-                HideAnimation(windowLeft, screenWidth - Math.Abs(screenLeft) - windowWidth, Window.LeftProperty);
-                return;
+                //右侧显示
+                if (windowLeft + Math.Abs(screenLeft) == screenWidth - showMarginWidth)
+                {
+                    IS_HIDE = false;
+                    FadeAnimation(0, 1);
+                    HideAnimation(windowLeft, screenWidth - Math.Abs(screenLeft) - windowWidth, Window.LeftProperty, HideType.RIGHT_SHOW);
+                    return;
+                }
             }
         }
 
 
-        private void HideAnimation(double from, double to, DependencyProperty property)
+        private static void HideAnimation(double from, double to, DependencyProperty property, HideType hideType)
         {
+
+            double toTemp = to;
+            double leftT = window.Width / 4 * 3;
+            double topT = window.Height / 4 * 3;
+            switch (hideType)
+            {
+                case HideType.LEFT_HIDE:
+                    to += leftT;
+                    break;
+                case HideType.LEFT_SHOW:
+                    to -= leftT;
+                    break;
+                case HideType.RIGHT_HIDE:
+                    to -= leftT;
+                    break;
+                case HideType.RIGHT_SHOW:
+                    to += leftT;
+                    break;
+                case HideType.TOP_HIDE:
+                    to += topT;
+                    break;
+                case HideType.TOP_SHOW:
+                    to -= topT;
+                    break;
+            }
             DoubleAnimation da = new DoubleAnimation
             {
                 From = from,
@@ -196,11 +241,48 @@ namespace GeekDesk.Util
             };
             da.Completed += (s, e) =>
             {
+                if ("Top".Equals(property.Name))
+                {
+                    window.Top = toTemp;
+                }
+                else
+                {
+                    window.Left = toTemp;
+                }
                 window.BeginAnimation(property, null);
             };
+
             Timeline.SetDesiredFrameRate(da, 60);
             window.BeginAnimation(property, da);
         }
+
+        private static void FadeAnimation(double from, double to)
+        {
+            double time;
+            if (to == 0D)
+            {
+                time = fadeHideTime;
+            }
+            else
+            {
+                time = fadeShowTime;
+            }
+            DoubleAnimation opacityAnimation = new DoubleAnimation
+            {
+                From = from,
+                To = to,
+                Duration = new Duration(TimeSpan.FromMilliseconds(time))
+            };
+            opacityAnimation.Completed += (s, e) =>
+            {
+                //window.Opacity = to;
+                window.BeginAnimation(Window.OpacityProperty, null);
+            };
+            Timeline.SetDesiredFrameRate(opacityAnimation, 60);
+            window.BeginAnimation(Window.OpacityProperty, opacityAnimation);
+        }
+
+
     }
 }