C# UI元素';什么是动画?
我不熟悉C# UI元素';什么是动画?,c#,xaml,animation,windows-phone-8.1,C#,Xaml,Animation,Windows Phone 8.1,我不熟悉Windows Phone开发,因此我对故事板不太熟悉,不知道它们是否适合我这种情况 我有一个画布,我在上面放置了一个矩形。我希望矩形在调用其move方法时沿随机方向平滑移动(通过处理平移和拾取x和y来处理) 在游戏《突破》之前,我制作了一个简单的Java应用程序,通过在while循环中将球移动到非常靠近的位置,并暂停一定数量的while循环,以便您可以在窗口中看到球移动的动画,来处理球的移动。我想知道在这种情况下,我是否可以使用while循环来做同样的事情,因为我相信这是我计划用我的应
Windows Phone
开发,因此我对故事板不太熟悉,不知道它们是否适合我这种情况
我有一个画布
,我在上面放置了一个矩形
。我希望矩形在调用其move方法时沿随机方向平滑移动(通过处理平移和拾取x和y来处理)
在游戏《突破》之前,我制作了一个简单的Java应用程序,通过在while循环中将球移动到非常靠近的位置,并暂停一定数量的while循环,以便您可以在窗口中看到球移动的动画,来处理球的移动。我想知道在这种情况下,我是否可以使用while循环来做同样的事情,因为我相信这是我计划用我的应用程序做的最好的事情
当点击矩形时,我尝试了以下操作:
private void TestRectangle_Tapped(object sender, TappedRoutedEventArgs e)
{
int x = 1;
while (x < 50)
{
double d = Canvas.GetLeft(TestRectangle);
Canvas.SetLeft(TestRectangle, d + 1);
TestCanvas.UpdateLayout();
System.Threading.Tasks.Task.Delay(5).Wait();
x++;
}
/*
int y = 1;
while(y < 200)
{
dragTranslation.Y += 1;
TestCanvas.UpdateLayout();
System.Threading.Tasks.Task.Delay(1).Wait();
y++;
}
* */
}
private void TestRectangle\u点击(对象发送方,点击路由Deventargs e)
{
int x=1;
而(x<50)
{
double d=Canvas.GetLeft(TestRectangle);
SetLeft(TestRectangle,d+1);
TestCanvas.UpdateLayout();
System.Threading.Tasks.Task.Delay(5.Wait();
x++;
}
/*
int y=1;
而(y<200)
{
dragtransation.Y+=1;
TestCanvas.UpdateLayout();
System.Threading.Tasks.Task.Delay(1.Wait();
y++;
}
* */
}
问题是这个更新不够快,所以当矩形移动时,我没有得到一个平滑的动画,当单击它时,它几乎会跳到它的最终位置
我如何才能做到这一点,因为我最终想要使矩形在屏幕上随机移动,并与画布的边缘发生碰撞
如果我不得不使用情节提要
,有人能告诉我一个沿随机路径移动对象的例子吗(使用C#而不是XAML)。XAML和Expression Blend是创建动画的简单方法
下面是定义故事板和动画的XAML
XAML
<Page.Resources>
<Storyboard x:Name="MoveRectangleStoryboard"
Completed='MoveRectangle_Completed'>
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateX)"
Storyboard.TargetName="TestRectangle">
<EasingDoubleKeyFrame KeyTime="0"
Value="0"
x:Name='xKey1' />
<EasingDoubleKeyFrame KeyTime="0:0:2"
Value="165.423"
x:Name='xKey2' />
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateY)"
Storyboard.TargetName="TestRectangle">
<EasingDoubleKeyFrame KeyTime="0"
Value="0"
x:Name='yKey1' />
<EasingDoubleKeyFrame KeyTime="0:0:2"
Value="68.408"
x:Name='yKey2' />
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</Page.Resources>
<Canvas x:Name='MainCanvas'>
<Rectangle x:Name="TestRectangle"
Fill='Orange'
Tapped='rectangle_Tapped'
Width='60'
Height='80'
RenderTransformOrigin="0.0,0.0">
<Rectangle.RenderTransform>
<CompositeTransform />
</Rectangle.RenderTransform>
</Rectangle>
</Canvas>
代码中UIElement的Canvas.Left
和Canvas.Top
属性的直观动画如下所示:
public void MoveElement(
UIElement element, double offsetX, double offsetY, TimeSpan duration)
{
var xAnimation = new DoubleAnimation
{
To = Canvas.GetLeft(element) + offsetX,
Duration = duration,
};
var yAnimation = new DoubleAnimation
{
To = Canvas.GetTop(element) + offsetY,
Duration = duration,
};
Storyboard.SetTarget(xAnimation, element);
Storyboard.SetTargetProperty(xAnimation, "(Canvas.Left)");
Storyboard.SetTarget(yAnimation, element);
Storyboard.SetTargetProperty(yAnimation, "(Canvas.Top)");
var storyboard = new Storyboard();
storyboard.Children.Add(xAnimation);
storyboard.Children.Add(yAnimation);
storyboard.Begin();
}
private void TestRectangle_Tapped(object sender, TappedRoutedEventArgs e)
{
MoveElement(TestRectangle, 50, 50, TimeSpan.FromSeconds(0.25));
}
private void TestRectangle_Tapped(object sender, TappedRoutedEventArgs e)
{
MoveElement((UIElement)sender, 50, 50, TimeSpan.FromSeconds(0.25));
}
您可以在点击处理程序中使用它,如下所示:
public void MoveElement(
UIElement element, double offsetX, double offsetY, TimeSpan duration)
{
var xAnimation = new DoubleAnimation
{
To = Canvas.GetLeft(element) + offsetX,
Duration = duration,
};
var yAnimation = new DoubleAnimation
{
To = Canvas.GetTop(element) + offsetY,
Duration = duration,
};
Storyboard.SetTarget(xAnimation, element);
Storyboard.SetTargetProperty(xAnimation, "(Canvas.Left)");
Storyboard.SetTarget(yAnimation, element);
Storyboard.SetTargetProperty(yAnimation, "(Canvas.Top)");
var storyboard = new Storyboard();
storyboard.Children.Add(xAnimation);
storyboard.Children.Add(yAnimation);
storyboard.Begin();
}
private void TestRectangle_Tapped(object sender, TappedRoutedEventArgs e)
{
MoveElement(TestRectangle, 50, 50, TimeSpan.FromSeconds(0.25));
}
private void TestRectangle_Tapped(object sender, TappedRoutedEventArgs e)
{
MoveElement((UIElement)sender, 50, 50, TimeSpan.FromSeconds(0.25));
}
或者不命名矩形,如下所示:
public void MoveElement(
UIElement element, double offsetX, double offsetY, TimeSpan duration)
{
var xAnimation = new DoubleAnimation
{
To = Canvas.GetLeft(element) + offsetX,
Duration = duration,
};
var yAnimation = new DoubleAnimation
{
To = Canvas.GetTop(element) + offsetY,
Duration = duration,
};
Storyboard.SetTarget(xAnimation, element);
Storyboard.SetTargetProperty(xAnimation, "(Canvas.Left)");
Storyboard.SetTarget(yAnimation, element);
Storyboard.SetTargetProperty(yAnimation, "(Canvas.Top)");
var storyboard = new Storyboard();
storyboard.Children.Add(xAnimation);
storyboard.Children.Add(yAnimation);
storyboard.Begin();
}
private void TestRectangle_Tapped(object sender, TappedRoutedEventArgs e)
{
MoveElement(TestRectangle, 50, 50, TimeSpan.FromSeconds(0.25));
}
private void TestRectangle_Tapped(object sender, TappedRoutedEventArgs e)
{
MoveElement((UIElement)sender, 50, 50, TimeSpan.FromSeconds(0.25));
}
我知道你只要求C#,但我发现使用Blend生成动画很容易,然后在文本编辑器和代码编辑器中编辑结果。好的,谢谢。我有几个问题。尝试此操作时,我收到一个错误,说明找不到类型或命名空间名称DoubleAnimation,System.Windows.Media.Animation.Storyboard不包含“Children”的定义。我错过了什么?谢谢,不用客气。我想我明白了。缺少对Windows.UI.Xaml.Media.Animation的引用;我怎样才能添加到它,使它无限期地运行?我最终希望它继续移动,直到满足一个条件,并让它检查它是否反弹到画布的边界等(我假设我会检查它是否在(to=canvas.GetLeft(element)+offset?)中超出画布)?我试图将其放入一个while循环,但我的应用程序无法打开。此外,当我只希望动画继续朝其方向移动时,重复行为将重置动画(如果它撞到墙上,则更改x或y)直到满足条件?是否最好将持续时间设置为较长的时间段,因为我还计划,如果在一定时间后未满足条件,我希望“游戏结束”。如果希望动画运行直到对象“撞到墙”,则计算移动距离(和持续时间)相对于启动动画之前的当前位置。若要在动画完成时获得通知,故事板将有一个事件。请附加事件处理程序并在那里开始另一个移动。