如何逐个像素地移动图像?

时间:2015-10-21 09:36:47

标签: c# image win-universal-app

所以我有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)
    {


    }

2 个答案:

答案 0 :(得分:2)

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

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。然后我们将它们分组到一个故事板中,并启动它:

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

答案 1 :(得分:1)

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

首先你应该创建DoubleAnimationC类

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类

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

希望它有所帮助!