注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

分享,态度 ·~~

—— 十年太长,五年;如果可以回到五年前,你最想对那时候的自己说什么?

 
 
 

日志

 
 

Windows8中Metro Style App动画无效的问题  

2012-04-25 12:59:21|  分类: Windows 8 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

Windows8中,Metro Style App 为动画优化了很多,把动画元素分成了独立动画和依赖动画 ,即独立于UI线程的动画和依赖UI线程的动画 ,由于官方没有文档说明,这里只能把个人推测交流下,若有错误请各位矫正 : )

在这里需要引出一个可能大家都不是很关注的线程----构图线程. 在原来SL4.0 or WP7.0 时代 所有动画属性全部放在UI线程上处理,在某些情况下可能会造成UI阻塞,处于这点MS在SL5.0 和WP7.1在UI线程基础上 加入一个新的动画线程 构图线程(Composition Thread) 负责处理 透明度,和变换的动画 充分利用GPU性能减少UI线程压力

 构图线程处理与 P:System.Windows.UIElement.RenderTransform 和 P:System.Windows.UIElement.Projection属性关联的简单动画。以下列表显示构图线程通常处理的动画。
        T:System.Windows.Media.ScaleTransform
        T:System.Windows.Media.TranslateTransform
        T:System.Windows.Media.RotateTransform
        T:System.Windows.Media.PlaneProjection 
        From MSDN

基于上述,我们可以大胆假设 ,这个独立线程就是构图线程或者和构图线程相似功能的线程,主旨意在提高动画效率,减少UI线程压力

为了证明这一点不如我们尝试一下,假设当我们视图修改UI元素的Width时,我们可能这样写

     Storyboard bord = new Storyboard();
            DoubleAnimation dbl = new DoubleAnimation();
            dbl.To = 100;
            dbl.Duration = DurationHelper.FromTimeSpan(TimeSpan.FromMilliseconds(300));
            Storyboard.SetTarget(dbl, myRectangle);
            Storyboard.SetTargetProperty(dbl, "(Rectangle.Width)");
            bord.Children.Add(dbl);
            bord.Begin();

在以前是OK 没有问题的,但是在  Metro Style App中会发现这段代码无法生效, 再让我们看下这段代码运行于哪个线程

     Storyboard bord = new Storyboard();
            DoubleAnimation dbl = new DoubleAnimation();
            dbl.To = 100;
            dbl.Duration = DurationHelper.FromTimeSpan(TimeSpan.FromMilliseconds(300));
            Storyboard.SetTarget(dbl, myRectangle);

     var UiState= dbl.EnableDependentAnimation;

     Storyboard.SetTargetProperty(dbl, "(Rectangle.Width)");
            bord.Children.Add(dbl);
            bord.Begin();

关于EnableDependentAnimation,如果为Ture则表明动画是运行于UI线程动画,False 则不可以用于UI线程动画,断点的结果 果然为False。为了保证我们的动画打到预期效果在此可以设置:

     dbl.EnableDependentAnimation=true;

这样就可以达到效果。关于独立和依赖的动画更多信息可以看这里:http://channel9.msdn.com/Events/BUILD/BUILD2011/APP-494T

【感谢 trigged 提供的信息 http://www.cnblogs.com/trigged/archive/2012/03/31/2427508.html

 

==========================================================================

MSDN 关于DoubleAnimation.EnableDependentAnimation property:

Gets or sets a value that declares whether animated properties that are considered dependent animations should be permitted to use this animation declaration.

public bool EnableDependentAnimation { get; set; }

<DoubleAnimation EnableDependentAnimation="bool" />

True if the animation can be used for a dependent animation case. False if the animation cannot be used for a dependent animation case.

 

==========================================================================

这里还有一个问题,Storyboard事实上还有一个方法设置SetTargetName,例如"Storyboard.SetTargetName(da, "testGrid");",这个时候就会throw一个an"Cannot resolve TargetName testGrid。需要改用SetTarget,原因是:

In case of programmatically created storyboard SetTargetName wouldn't work because storyboard doesn't know where to look for target name. SetTarget exists precisely for that reason, so you can specify your target directly. SetTarget is also a little bit faster since it avoids visual tree traversal.

【本文地址 http://zwkufo.blog.163.com/blog/static/258825120123250414831/

  评论这张
 
阅读(1358)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017