如何逐像素移动图像?

How to move an image pixel by pixel?

所以我有 2 个 Image 我希望第一个 Image 移动到另一个 Image 我有两个 X,Y 坐标,如果我应该怎么做想让它一个像素一个像素地朝目标 Image 移动吗?

切记,我正在使用 Windows-Universal 我已经尝试过 DoubleAnimation 但是我在这方面的知识真的很糟糕,我不知道从哪里开始。 Image 有时必须沿对角线(横向)移动,而不是向右移动然后向上移动。

我应该怎么做?

这是我目前拥有的:

    private void MoveToTarget_Start()
    {
        moveToTimer = new DispatcherTimer();
        moveToTimer.Tick += MoveToTarget_Tick;
        moveToTimer.Interval = new TimeSpan(0, 0, 0, 0, 1);
        moveToTimer.Start();
    }

    void MoveToTarget_Tick(object sender, object e)
    {


    }

老实说,最好的办法是使用 DoubleAnimation 和 Storyboard classes。 我会将背景设置为 Canvas 然后您可以通过 Canvas.SetLeft 和 Canvas.SetTop 属性为其设置动画。

首先你应该创建 DoubleAnimationC class

DoubleAnimation da = new DoubleAnimation()
{
  SpeedRatio = 3.0,
  AutoReverse = false,
  From = 0 
  To = 100
  BeginTime = TimeSpan.FromSeconds(x),
};


Storyboard.SetTarget((Timeline)doubleAnimation, YOUR IMAGE);
Storyboard.SetTargetProperty(doubleAnimation, new PropertyPath("(Canvas.Top)"));

当然可以根据需要更改这些属性,现在我们必须创建 StoryBoard class,它将包含我们的动画

Storyboard sb = new Storyboard();
sb.Children.Add(da);
sb.Start();

希望对您有所帮助!

首先,您需要知道需要移动多少个像素。为此,我们可以尝试检索每个元素的绝对位置并进行比较(可能有更直接的方法,我只是不知道如何):

private Point GetAbsolutePosition(UIElement element)
{
   var ttv = element.TransformToVisual(Window.Current.Content);
   return ttv.TransformPoint(new Point(0, 0));
}

(取自this answer

从那里,我们检索每个元素的点并计算差异:

var position1 = GetAbsolutePosition(Image1);
var position2 = GetAbsolutePosition(Image2);

var offsetX = position2.X - position1.X;
var offsetY = position2.Y - position1.Y;

现在,我们现在需要在每个轴上移动多少像素。我们为元素添加 TranslateTransform(最好事先直接从 XAML 中添加):

var translateTransform = new TranslateTransform();
image1.RenderTransform = translateTransform;

最后,我们创建动画,并定位 TranslateTransform。然后我们将它们分组到 Storyboard 中,然后启动它:

var animationX = new DoubleAnimation()
{
    From = 0,
    To = offsetX,
    Duration = TimeSpan.FromSeconds(2)
};

var animationY = new DoubleAnimation()
{
    From = 0,
    To = offsetY,
    Duration = TimeSpan.FromSeconds(2)
};

Storyboard.SetTarget(animationX, translateTransform);
Storyboard.SetTargetProperty(animationX, "X");

Storyboard.SetTarget(animationY, translateTransform);
Storyboard.SetTargetProperty(animationY, "Y");

var storyboard = new Storyboard();

storyboard.Children.Add(animationX);
storyboard.Children.Add(animationY);

storyboard.Begin();