我在Windows Phone 8.1应用程序中使用故事板动画,我偶尔会遇到严重的滞后问题。 (Lumia 930) 哦,我想我可以添加一个通用的应用程序模板。
首先是动画代码:
<Page.Resources>
<local:SimpleMathConverter x:Key="SimpleMathConverter"/>
<Storyboard x:Name="ImageViewShowAnimation">
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Projection).(PlaneProjection.RotationY)" Storyboard.TargetName="GameImageView">
<EasingDoubleKeyFrame KeyTime="0" Value="90"/>
<EasingDoubleKeyFrame KeyTime="0:0:1" Value="0"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
<Storyboard x:Name="ImageViewHideAnimation">
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Projection).(PlaneProjection.RotationY)" Storyboard.TargetName="GameImageView">
<EasingDoubleKeyFrame KeyTime="0" Value="0"/>
<EasingDoubleKeyFrame KeyTime="0:0:1" Value="90"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
<Storyboard x:Name="ResultViewShowAnimation">
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Projection).(PlaneProjection.RotationY)" Storyboard.TargetName="GameResutView">
<EasingDoubleKeyFrame KeyTime="0" Value="-90"/>
<EasingDoubleKeyFrame KeyTime="0:0:1" Value="0"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
<Storyboard x:Name="ResultViewHideAnimation">
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Projection).(PlaneProjection.RotationY)" Storyboard.TargetName="GameResutView">
<EasingDoubleKeyFrame KeyTime="0" Value="0"/>
<EasingDoubleKeyFrame KeyTime="0:0:1" Value="-90"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</Page.Resources>
然后是事件处理背后的代码
public GamePage()
{
ImageViewHideAnimation.Completed += (sender, o) => ResultViewShowAnimation.Begin();
ResultViewHideAnimation.Completed += (sender, o) => ImageViewShowAnimation.Begin();
}
和调用动画的按钮
private async void ChangeState()
{
CoreDispatcher dispatcher = CoreWindow.GetForCurrentThread().Dispatcher;
switch (state)
{
case GameState.ImageView:
await dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => ImageViewHideAnimation.Begin());
state = GameState.ResultView;
break;
case GameState.ResultView:
await dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => ResultViewHideAnimation.Begin());
state = GameState.ImageView;
break;
default:
throw new ArgumentOutOfRangeException();
}
}
这个动画实际上做的是假装你翻转一张卡并在另一边显示内容,当你点击再次旋转按钮时它会反转显示初始内容的卡片。 问题是,有时候,我会说4/10在动画应该开始并且实际显示动画的一半时会滞后。这就像动画开始但屏幕尚未赶上。我尝试使用和不使用调度程序运行动画希望有一些其他效果,但没有。任何提示我如何解决这个问题?
答案 0 :(得分:1)
如果你摆脱了1秒到90度的东西会发生什么,而是输入10个独立的10个关键帧?我只是想看看1秒是否太快,电话无法响应。
我认为它不会预先计算/预先渲染你的过渡。因此,每当你进行如此巨大的90度转弯时,每次计算都需要一段时间。将其限制为几个KeyFrame而不是一个,消除/缩小了计算所需的时间,从而非常快速地显示动画。