C# 如何将图像TranslateRanform一步一步地应用于图像(跳过几个像素)
我目前正在我的应用程序中通过代码对图像使用TranslateTransform,它工作正常 但是我想让图像一步一步地移动,比如说每次移动10或20个像素。有没有办法做到这一点。这是为了给这场运动增添复古气息 我在想一些类似TranslateTransform的东西C# 如何将图像TranslateRanform一步一步地应用于图像(跳过几个像素),c#,rendertransform,C#,Rendertransform,我目前正在我的应用程序中通过代码对图像使用TranslateTransform,它工作正常 但是我想让图像一步一步地移动,比如说每次移动10或20个像素。有没有办法做到这一点。这是为了给这场运动增添复古气息 我在想一些类似TranslateTransform的东西 Duration durationX = new TimeSpan(0, 0, 0, 0, 600); Duration durationY = new TimeSpan(0, 0, 0
Duration durationX = new TimeSpan(0, 0, 0, 0, 600);
Duration durationY = new TimeSpan(0, 0, 0, 0, 400);
DoubleAnimation moveX = new DoubleAnimation();
moveX.Duration = durationX;
moveX.To = ((ImgCanvasCoordinates[cardSource][0] - ImgCanvasCoordinates[cardTarget][0]) * -1);
DoubleAnimation moveY = new DoubleAnimation();
moveY.Duration = durationY;
moveY.To = ((ImgCanvasCoordinates[cardSource][1] - ImgCanvasCoordinates[cardTarget][1]) * -1);
Storyboard story1 = new Storyboard();
story1.Children.Add(moveX);
story1.Children.Add(moveY);
Storyboard.SetTarget(moveX, imgGhost);
Storyboard.SetTarget(moveY, imgGhost);
Storyboard.SetTargetProperty(moveX, "(Image.RenderTransform).(TranslateTransform.X)");
Storyboard.SetTargetProperty(moveY, "(Image.RenderTransform).(TranslateTransform.Y)");
story1.Begin();
您可以使用自定义的EasingFunction
来实现这一点
通过编写EasingFunction
,您可以完全控制动画的移动。我编写了一个StepEasingFunction
,如下所示:
public class StepEasingFunction : EasingFunctionBase
{
public double NormalizedStep { get; set; }
protected override Freezable CreateInstanceCore()
{
return new StepEasingFunction {NormalizedStep = NormalizedStep};
}
protected override double EaseInCore(double normalizedTime)
{
var stepIndex = Math.Round(normalizedTime / NormalizedStep);
return NormalizedStep * stepIndex;
}
}
然后,只需为动画添加一个EasingFunction:
moveX.EasingFunction = new StepEasingFunction {NormalizedStep = 0.2};
moveY.EasingFunction = new StepEasingFunction {NormalizedStep = 0.2};
那么,如何计算NormalizedStep
属性的值呢
您说过希望每一步移动10个像素,因此请计算步长总计数,并使用1/stepTotalCount
计算最终的NormalizedStep
属性。
您可以使用自定义的EasingFunction
来实现这一点
通过编写EasingFunction
,您可以完全控制动画的移动。我编写了一个StepEasingFunction
,如下所示:
public class StepEasingFunction : EasingFunctionBase
{
public double NormalizedStep { get; set; }
protected override Freezable CreateInstanceCore()
{
return new StepEasingFunction {NormalizedStep = NormalizedStep};
}
protected override double EaseInCore(double normalizedTime)
{
var stepIndex = Math.Round(normalizedTime / NormalizedStep);
return NormalizedStep * stepIndex;
}
}
然后,只需为动画添加一个EasingFunction:
moveX.EasingFunction = new StepEasingFunction {NormalizedStep = 0.2};
moveY.EasingFunction = new StepEasingFunction {NormalizedStep = 0.2};
那么,如何计算NormalizedStep
属性的值呢
您说过希望每个步骤移动10个像素,因此请计算步骤总数并使用
1/stepTotalCount
计算最终的NormalizedStep
属性。谢谢,这正是我想要的!我在添加类StepEasingFunction后收到此消息:EasingFunction Base不包含接受0个参数的构造函数。不幸的是,我不知道如何在我的WPF代码中实现EasyFunction。我在EaseInCore和CreateInstanceCore上遇到错误:找不到合适的方法进行重写,在Freezable上:Freezable在名称空间中不存在。我错误地设置了WPF标记而不是UWP。这就是为什么我不能使用代码的原因。非常好的回答WPF编码器。UWP需要改进…不幸的是,不可能在UWP中扩展自定义的EasingFunction。也就是说,我们必须编写许多助手代码来实现这种行为。如果应该这样做,我们可以开始一个新的UWP问题来收集更多的解决方案。看:谢谢,正是我想要的!我在添加类StepEasingFunction后收到此消息:EasingFunction Base不包含接受0个参数的构造函数。不幸的是,我不知道如何在我的WPF代码中实现EasyFunction。我在EaseInCore和CreateInstanceCore上遇到错误:找不到合适的方法进行重写,在Freezable上:Freezable在名称空间中不存在。我错误地设置了WPF标记而不是UWP。这就是为什么我不能使用代码的原因。非常好的回答WPF编码器。UWP需要改进…不幸的是,不可能在UWP中扩展自定义的EasingFunction。也就是说,我们必须编写许多助手代码来实现这种行为。如果应该这样做,我们可以开始一个新的UWP问题来收集更多的解决方案。见: