C# 如何将图像TranslateRanform一步一步地应用于图像(跳过几个像素)

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

我目前正在我的应用程序中通过代码对图像使用TranslateTransform,它工作正常

但是我想让图像一步一步地移动,比如说每次移动10或20个像素。有没有办法做到这一点。这是为了给这场运动增添复古气息

我在想一些类似TranslateTransform的东西

            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问题来收集更多的解决方案。见: