WPF教程

WPF MatrixTransform 的平滑动画代码html教程

时间:2013-6-20 1:11:18  作者:WPF之家  来源:http://www.wpf123.com  查看:547  评论:0
内容摘要:    注:此代码摘自:《Smooth animation using MatrixTransform?》  由于MatrixAnimationUsingKeyFrames和DiscreteMatrixKeyFrame动画帧不会进行插值计算,因些,使用此方式只能产生生硬的帧切换效...
  

  注:此代码摘自:《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); }
        }
    }
}

本文来自oyi319的博客,原文地址:http://blog.csdn.net/oyi319/archive/2011/06/24/6566199.aspx


标签:content= 

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。本文出自“wpf之家”,请务必保留此出处:http://www.wpf123.com

相关评论
Copyright © 2009-2014 WPF之家(http://www.wpf123.com/) All rights reserved
 Powered by WPF之家
鄂ICP备13006396号