Bad performance (stuttering) with Windows Phone 7 Page Transitions
我尝试使用 Toolkit 进行页面转换,但所有动画都卡顿了。在另一个问题中,有人建议我不要使用工具包,所以我自己实现了所有动画并手动触发它们。例如导航到另一个页面:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | void list_SelectionChanged(object sender, SelectionChangedEventArgs e) { ListBox listBox = sender as ListBox; if (null == listBox) return; Data.Category item = listBox.SelectedItem as Data.Category; if (null == item) return; Uri uri = new Uri(App.MakeResourcePathTo(item.Page), UriKind.Relative); Storyboard storyboard = Application.Current.Resources["FlipForwardOut"] as Storyboard; Storyboard.SetTarget(storyboard, LayoutRoot); EventHandler completedHandler = delegate { }; completedHandler = delegate { NavigationService.Navigate(uri); storyboard.Stop(); storyboard.Completed -= completedHandler; }; storyboard.Completed += completedHandler; storyboard.Begin(); listBox.SelectedIndex = -1; } |
代码正常吗?
据我了解,不应该有其他任何东西与该代码并行运行。这正是我想要的,因为这样就不会干扰我的动画并使其变慢。
这是另一个代码片段。这显示了我如何处理后退动画。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e) { e.Cancel = true; Storyboard storyboard = Application.Current.Resources["FlipBackwardOut"] as Storyboard; Storyboard.SetTarget(storyboard, LayoutRoot); EventHandler completedHandler = delegate { }; completedHandler = delegate { storyboard.Stop(); storyboard.Completed -= completedHandler; NavigationService.GoBack(); }; storyboard.Completed += completedHandler; storyboard.Begin(); } |
该代码有什么问题,可能导致性能问题吗?
动画很简单,只有线性动画:
1 2 3 4 5 6 7 8 9 10 | <Storyboard x:Key="FlipForwardOut"> <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Projection).(PlaneProjection.RotationY)"> <LinearDoubleKeyFrame KeyTime="0" Value="0"/> <LinearDoubleKeyFrame KeyTime="0:0:0.4" Value="70"/> </DoubleAnimationUsingKeyFrames> <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)"> <LinearDoubleKeyFrame KeyTime="0" Value="1"/> <LinearDoubleKeyFrame KeyTime="0:0:0.4" Value="0.1"/> </DoubleAnimationUsingKeyFrames> </Storyboard> |
我已经认识到一件事:当我导航到全景页面时,全景页面的动画与我的页面转换动画并行运行。全景页面的内置动画让标题滑入,全景项目也滑入到位。因此,有一些平移动画与我的页面转换(基本上是旋转和不透明度)平行运行。
我能否以某种方式阻止全景图播放它自己的动画,或者将它们延迟到我的页面过渡动画完成为止?
我的页面过渡还有一个问题:当我导航到另一个页面并播放动画时,当动画完成时(LayoutRoot 已旋转到 Y=70,并且它的 opacity=0)然后原来的布局显示几毫秒(LayoutRoot 旋转 Y=0 和 opacity=1),然后导航到下一页并开始下一页上的动画。
这是为什么呢?
我希望,有人可以帮助我。
在花了这么多小时后,我感到非常沮丧。无论我尝试了什么,动画都表现不佳,它们在模拟器和设备上都卡顿了。
手机预装应用的动画动画流畅。我不明白这一点。 :(
您的动画代码看起来没问题,尽管您可能没有处理许多场景,所以您可能想看看 Kevin Marshall 的 Page Transitions Sample(我已经发现比 Toolkit 转换执行得更好)。
但是,假设您的动画代码很好,并且您在使用工具包转换时遇到了类似的卡顿,您是否在页面的构造函数中做任何事情?在构造函数中加载和/或处理视图模型或数据是很常见的,这将导致动画延迟,因为这是在 UI 线程上完成的。您应该尽可能多地进行初始化,直到您的页面被