首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

WPF 緩動函數實作系列(二):正弦/餘弦緩動 - 最平滑的自然動態

     編輯:關於.NET

正弦餘弦緩動特性

正弦/餘弦曲線在 $[0, \pi/2]$ 區間單調且二階導數連續,對應速度變化最平緩,無突變感,最接近自然界運動(如擺錘、彈簧振動)。比二次緩動更柔和。

正弦餘弦緩動曲線 正弦餘弦公式

核心實作碼

using System;
using System.Windows;
using System.Windows.Media.Animation;

namespace EaseMoveDemo
{
    public class EaseMoveAnimation : DoubleAnimationBase
    {
        public static readonly DependencyProperty FromProperty =
            DependencyProperty.Register("From", typeof(double?), typeof(EaseMoveAnimation), new PropertyMetadata(null));
        public static readonly DependencyProperty ToProperty =
            DependencyProperty.Register("To", typeof(double?), typeof(EaseMoveAnimation), new PropertyMetadata(null));

        public double? From { get => (double?)GetValue(FromProperty); set => SetValue(FromProperty, value); }
        public double? To { get => (double?)GetValue(ToProperty); set => SetValue(ToProperty, value); }

        // 正餘弦緩動
        protected override double GetCurrentValueCore(
            double defaultOriginValue, 
            double defaultDestinationValue, 
            AnimationClock animationClock)
        {
            double from = (this.From == null ? defaultDestinationValue : (double)this.From);
            double to = (this.To == null ? defaultOriginValue : (double)this.To);
            double delta = to - from;

            // 加速 (Ease In) - 餘弦
            // return delta * (1 - Math.Cos(Math.PI / 2 * animationClock.CurrentProgress.Value)) + from;

            // 減速 (Ease Out) - 正弦
            // return delta * Math.Sin(Math.PI / 2 * animationClock.CurrentProgress.Value) + from;

            // 先加速後減速 (Ease InOut) - 餘弦完整半週期
            return delta / 2 * (1 - Math.Cos(Math.PI * animationClock.CurrentProgress.Value)) + from;
        }

        protected override Freezable CreateInstanceCore() => new EaseMoveAnimation();
    }
}

數學對應關係

模式公式曲線段速度特徵
Ease In$1 - \cos(\frac{\pi}{2}t)$餘弦 $[0, \pi/2]$從 0 增至最大
Ease Out$\sin(\frac{\pi}{2}t)$正弦 $[0, \pi/2]$從最大降至 0
Ease InOut$\frac{1}{2}(1 - \cos(\pi t))$餘弦 $[0, \pi]$對稱平滑增減

結語

正弦/餘弦緩動以三角函數固有的平滑特性,提供最自然、無機械感的動畫體驗。程式碼簡潔、數學直觀,是 WPF 自訂動畫的首選基礎緩動函數。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved