zoukankan      html  css  js  c++  java
  • WPF与缓动(二) 正弦与余弦缓动

                                                                               WPF与缓动(二) 正弦与余弦缓动
                                                                                                              周银辉

    如果要比二次缓动(请参见WPF与缓动(一) N次缓动)更平缓, 可以使用正弦或余弦缓动.
    sin.jpg
    如果我们用曲线上点的斜率表示速度,可以发现,由0到PI/2,速度逐渐减小,从PI/2到PI速度逐渐增加.
    我们可以总结出如下公式
    formula4.PNG
    其中位置的改变量相当于Animation中的To与From的差值, t/t(总)相当于animationClock.CurrentProgress.Value, b实际就是From值

    参考如下代码:

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Windows.Media.Animation;
    using System.Windows;

    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
                
    {
                    
    return (double?)this.GetValue(EaseMoveAnimation.FromProperty);
                }

                
    set
                
    {
                    
    this.SetValue(EaseMoveAnimation.FromProperty, value);
                }

            }


            
    public double? To
            
    {
                
    get
                
    {
                    
    return (double?)this.GetValue(EaseMoveAnimation.ToProperty);
                }

                
    set
                
    {
                    
    this.SetValue(EaseMoveAnimation.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;

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

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

                
    //先加速,后减速
                return delta/2 * (1 - Math.Cos(Math.PI * animationClock.CurrentProgress.Value)) + from;
                
            }



            
    protected override System.Windows.Freezable CreateInstanceCore()
            
    {
                
    return new EaseMoveAnimation();
            }

        }

    }

    源代码下载


  • 相关阅读:
    switch多分枝语句
    自动扫描判断数组奇偶 直接在控制台输入
    if else语句
    1231作业
    字符集和字符编码
    12.28作业
    置顶广告
    图片库
    js实现隔行换色及其鼠标滑过变色
    【转载】display:inline-block兼容ie6/7的写法
  • 原文地址:https://www.cnblogs.com/zhouyinhui/p/750200.html
Copyright © 2011-2022 走看看