zoukankan      html  css  js  c++  java
  • WPF MatrixTransform 的平滑动画代码

    注:此代码摘自:《Smooth animation using MatrixTransform?》

      由于MatrixAnimationUsingKeyFrames和DiscreteMatrixKeyFrame动画帧不会进行插值计算,因些,使用此方式只能产生生硬的帧切换效果。下面代码是通过自定义的LinearMatrixAnimation类,来达到平滑切换的效果。

    using System.Windows;
    using System.Windows.Media;
    using System.Windows.Media.Animation;
    namespace MapControl
    {
        public class LinearMatrixAnimation : AnimationTimeline
        {
            public Matrix? From
            {
                set { SetValue(FromProperty, value);}
                get { return (Matrix)GetValue(FromProperty); }
            }
            public static DependencyProperty FromProperty = DependencyProperty.Register("From", typeof(Matrix?), typeof(LinearMatrixAnimation), new PropertyMetadata(null));
            public Matrix? To
            {
                set { SetValue(ToProperty, value); }
                get { return (Matrix)GetValue(ToProperty); }
            }
            public static DependencyProperty ToProperty = DependencyProperty.Register("To", typeof(Matrix?), typeof(LinearMatrixAnimation), new PropertyMetadata(null));
            public LinearMatrixAnimation()
            {            
            }
            public LinearMatrixAnimation(Matrix from, Matrix to, Duration duration)
            {
                Duration = duration;
                From = from;
                To = to;
            }
            public override object GetCurrentValue(object defaultOriginValue, object defaultDestinationValue, AnimationClock animationClock)
            {
                if (animationClock.CurrentProgress == null)
                {
                    return null;
                }
                double progress = animationClock.CurrentProgress.Value;
                Matrix from = From ?? (Matrix)defaultOriginValue;
                if (To.HasValue)
                {
                    Matrix to = To.Value;
                    Matrix newMatrix = new Matrix(((to.M11 - from.M11) * progress)+from.M11, 0, 0, ((to.M22 - from.M22) * progress)+from.M22,
                                                  ((to.OffsetX - from.OffsetX) * progress) + from.OffsetX, ((to.OffsetY - from.OffsetY) * progress)+ from.OffsetY);
                    return newMatrix;
                }
                return Matrix.Identity;
            }
            protected override System.Windows.Freezable CreateInstanceCore()
            {
                return new LinearMatrixAnimation();
            }
            public override System.Type  TargetPropertyType
            {
                get { return typeof(Matrix); }
            }
        }
    }

    转载的   可用

  • 相关阅读:
    [ Scala ]关于scala环境搭建过程中,sbt编译中maven下载失败的解决方案(改成阿里的maven仓库)
    复习笔记:一个简单的动态代理实现
    复习笔记:一个简单的反射工厂Demo
    定时器Timer如何终止运行的问题
    Python RESTful接口开发02
    python 内置模块 logging的使用
    Django项目数据处理的流程是怎样的
    Django-Redis:在Django中使用redis作为缓存
    Python RESTful 接口开发01
    teamview
  • 原文地址:https://www.cnblogs.com/makubexsoft/p/2793915.html
Copyright © 2011-2022 走看看