天天看點

WPF與緩動(二) 正弦與餘弦緩動

原文:

WPF與緩動(二) 正弦與餘弦緩動

                                                                           WPF與緩動(二) 正弦與餘弦緩動

                                                                                                          周銀輝

如果要比二次緩動(請參見

WPF與緩動(一) N次緩動

)更平緩, 可以使用正弦或餘弦緩動.

WPF與緩動(二) 正弦與餘弦緩動

如果我們用曲線上點的斜率表示速度,可以發現,由0到PI/2,速度逐漸減小,從PI/2到PI速度逐漸增加.

我們可以總結出如下公式

WPF與緩動(二) 正弦與餘弦緩動

其中位置的改變量相當于Animation中的To與From的內插補點, t/t(總)相當于animationClock.CurrentProgress.Value, b實際就是From值

參考如下代碼:

WPF與緩動(二) 正弦與餘弦緩動

using System;

WPF與緩動(二) 正弦與餘弦緩動

using System.Collections.Generic;

WPF與緩動(二) 正弦與餘弦緩動

using System.Text;

WPF與緩動(二) 正弦與餘弦緩動

using System.Windows.Media.Animation;

WPF與緩動(二) 正弦與餘弦緩動

using System.Windows;

WPF與緩動(二) 正弦與餘弦緩動
WPF與緩動(二) 正弦與餘弦緩動

namespace EaseMoveDemo

WPF與緩動(二) 正弦與餘弦緩動
WPF與緩動(二) 正弦與餘弦緩動
WPF與緩動(二) 正弦與餘弦緩動

{

WPF與緩動(二) 正弦與餘弦緩動

    public class EaseMoveAnimation : DoubleAnimationBase

WPF與緩動(二) 正弦與餘弦緩動
WPF與緩動(二) 正弦與餘弦緩動
WPF與緩動(二) 正弦與餘弦緩動
WPF與緩動(二) 正弦與餘弦緩動
WPF與緩動(二) 正弦與餘弦緩動

        public static readonly DependencyProperty FromProperty = DependencyProperty.Register(

WPF與緩動(二) 正弦與餘弦緩動

            "From", typeof(double?), typeof(EaseMoveAnimation), new PropertyMetadata(null));

WPF與緩動(二) 正弦與餘弦緩動
WPF與緩動(二) 正弦與餘弦緩動

        public static readonly DependencyProperty ToProperty = DependencyProperty.Register(

WPF與緩動(二) 正弦與餘弦緩動

            "To", typeof(double?), typeof(EaseMoveAnimation), new PropertyMetadata(null));

WPF與緩動(二) 正弦與餘弦緩動
WPF與緩動(二) 正弦與餘弦緩動

        public double? From

WPF與緩動(二) 正弦與餘弦緩動
WPF與緩動(二) 正弦與餘弦緩動
WPF與緩動(二) 正弦與餘弦緩動
WPF與緩動(二) 正弦與餘弦緩動

            get

WPF與緩動(二) 正弦與餘弦緩動
WPF與緩動(二) 正弦與餘弦緩動
WPF與緩動(二) 正弦與餘弦緩動
WPF與緩動(二) 正弦與餘弦緩動

                return (double?)this.GetValue(EaseMoveAnimation.FromProperty);

WPF與緩動(二) 正弦與餘弦緩動

            }

WPF與緩動(二) 正弦與餘弦緩動

            set

WPF與緩動(二) 正弦與餘弦緩動
WPF與緩動(二) 正弦與餘弦緩動
WPF與緩動(二) 正弦與餘弦緩動
WPF與緩動(二) 正弦與餘弦緩動

                this.SetValue(EaseMoveAnimation.FromProperty, value);

WPF與緩動(二) 正弦與餘弦緩動
WPF與緩動(二) 正弦與餘弦緩動

        }

WPF與緩動(二) 正弦與餘弦緩動
WPF與緩動(二) 正弦與餘弦緩動

        public double? To

WPF與緩動(二) 正弦與餘弦緩動
WPF與緩動(二) 正弦與餘弦緩動
WPF與緩動(二) 正弦與餘弦緩動
WPF與緩動(二) 正弦與餘弦緩動
WPF與緩動(二) 正弦與餘弦緩動
WPF與緩動(二) 正弦與餘弦緩動
WPF與緩動(二) 正弦與餘弦緩動
WPF與緩動(二) 正弦與餘弦緩動

                return (double?)this.GetValue(EaseMoveAnimation.ToProperty);

WPF與緩動(二) 正弦與餘弦緩動
WPF與緩動(二) 正弦與餘弦緩動
WPF與緩動(二) 正弦與餘弦緩動
WPF與緩動(二) 正弦與餘弦緩動
WPF與緩動(二) 正弦與餘弦緩動
WPF與緩動(二) 正弦與餘弦緩動

                this.SetValue(EaseMoveAnimation.ToProperty, value);

WPF與緩動(二) 正弦與餘弦緩動
WPF與緩動(二) 正弦與餘弦緩動
WPF與緩動(二) 正弦與餘弦緩動
WPF與緩動(二) 正弦與餘弦緩動

        //正餘弦緩動

WPF與緩動(二) 正弦與餘弦緩動

        protected override double GetCurrentValueCore(double defaultOriginValue, double defaultDestinationValue, AnimationClock animationClock)

WPF與緩動(二) 正弦與餘弦緩動
WPF與緩動(二) 正弦與餘弦緩動
WPF與緩動(二) 正弦與餘弦緩動
WPF與緩動(二) 正弦與餘弦緩動

            double from = (this.From==null?defaultDestinationValue:(double)this.From);

WPF與緩動(二) 正弦與餘弦緩動

            double to = (this.To==null?defaultOriginValue:(double)this.To);

WPF與緩動(二) 正弦與餘弦緩動

            double delta = to - from;

WPF與緩動(二) 正弦與餘弦緩動
WPF與緩動(二) 正弦與餘弦緩動

            //加速

WPF與緩動(二) 正弦與餘弦緩動

            //return delta * (1 - Math.Cos(Math.PI / 2 * animationClock.CurrentProgress.Value)) + from;

WPF與緩動(二) 正弦與餘弦緩動
WPF與緩動(二) 正弦與餘弦緩動

            //減速

WPF與緩動(二) 正弦與餘弦緩動

            //return delta * Math.Sin(Math.PI / 2 * animationClock.CurrentProgress.Value) + from;

WPF與緩動(二) 正弦與餘弦緩動
WPF與緩動(二) 正弦與餘弦緩動

            //先加速,後減速

WPF與緩動(二) 正弦與餘弦緩動

            return delta/2 * (1 - Math.Cos(Math.PI * animationClock.CurrentProgress.Value)) + from;

WPF與緩動(二) 正弦與餘弦緩動
WPF與緩動(二) 正弦與餘弦緩動
WPF與緩動(二) 正弦與餘弦緩動
WPF與緩動(二) 正弦與餘弦緩動
WPF與緩動(二) 正弦與餘弦緩動

        protected override System.Windows.Freezable CreateInstanceCore()

WPF與緩動(二) 正弦與餘弦緩動
WPF與緩動(二) 正弦與餘弦緩動
WPF與緩動(二) 正弦與餘弦緩動
WPF與緩動(二) 正弦與餘弦緩動

            return new EaseMoveAnimation();

WPF與緩動(二) 正弦與餘弦緩動
WPF與緩動(二) 正弦與餘弦緩動

    }

WPF與緩動(二) 正弦與餘弦緩動

}

WPF與緩動(二) 正弦與餘弦緩動
源代碼下載下傳