gpt4 book ai didi

wpf - 使用 MatrixTransform 平滑动画?

转载 作者:行者123 更新时间:2023-12-04 23:10:27 24 4
gpt4 key购买 nike

我正在尝试做一个矩阵动画​​,我同时缩放和转置 Canvas 。我发现的唯一方法是使用 MatrixTransform 和 MatrixAnimationUsingKeyFrames。由于似乎没有内置矩阵的任何插值(仅用于路径/旋转),因此似乎唯一的选择是尝试构建插值和 DiscreteMatrixKeyFrame 自己。

我做了一个基本的实现,但它并不完全顺利,我不确定这是否是最好的方法以及如何处理帧率等。有人有改进的建议吗?这是代码:

        MatrixAnimationUsingKeyFrames anim = new MatrixAnimationUsingKeyFrames();
int duration = 1;
anim.KeyFrames = Interpolate(new Point(0, 0), centerPoint, 1, factor,100,duration);
this.matrixTransform.BeginAnimation(MatrixTransform.MatrixProperty, anim,HandoffBehavior.Compose);


public MatrixKeyFrameCollection Interpolate(Point startPoint, Point endPoint, double startScale, double endScale, double framerate,double duration)
{
MatrixKeyFrameCollection keyframes = new MatrixKeyFrameCollection();

double steps = duration * framerate;
double milliSeconds = 1000 / framerate;
double timeCounter = 0;



double diffX = Math.Abs(startPoint.X- endPoint.X);
double xStep = diffX / steps;

double diffY = Math.Abs(startPoint.Y - endPoint.Y);
double yStep = diffY / steps;

double diffScale= Math.Abs(startScale- endScale);
double scaleStep = diffScale / steps;


if (endPoint.Y < startPoint.Y)
{
yStep = -yStep;
}

if (endPoint.X < startPoint.X)
{
xStep = -xStep;
}


if (endScale < startScale)
{
scaleStep = -scaleStep;
}


Point currentPoint = new Point();
double currentScale = startScale;

for (int i = 0; i < steps; i++)
{
keyframes.Add(new DiscreteMatrixKeyFrame(new Matrix(currentScale, 0, 0, currentScale, currentPoint.X, currentPoint.Y), KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(timeCounter))));
currentPoint.X += xStep;
currentPoint.Y += yStep;
currentScale += scaleStep;
timeCounter += milliSeconds;

}

keyframes.Add(new DiscreteMatrixKeyFrame(new Matrix(endScale, 0, 0, endScale, endPoint.X, endPoint.Y), KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(0))));

return keyframes;

}

最佳答案

尝试这个!只要您不旋转/剪切,它就可以解决问题。

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); }
}
}
}

关于wpf - 使用 MatrixTransform 平滑动画?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1988421/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com