Laggy storyboard动画windows手机8.1

时间:2014-09-05 13:44:43

标签: xaml windows-phone-8 windows-phone storyboard windows-phone-8.1

我在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在动画应该开始并且实际显示动画的一半时会滞后。这就像动画开始但屏幕尚未赶上。我尝试使用和不使用调度程序运行动画希望有一些其他效果,但没有。任何提示我如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

如果你摆脱了1秒到90度的东西会发生什么,而是输入10个独立的10个关键帧?我只是想看看1秒是否太快,电话无法响应。


我认为它不会预先计算/预先渲染你的过渡。因此,每当你进行如此巨大的90度转弯时,每次计算都需要一段时间。将其限制为几个KeyFrame而不是一个,消除/缩小了计算所需的时间,从而非常快速地显示动画。