|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
J2EE比较成熟一点,一些比较出名的企业应用软件都是基于J2EE的。以后的发展就不好说了。不过net网页编程比较烦,学.net的话,微软把很多工具都封装好了,学起来可能容易一点。择要:绝对以往的界面编程框架来讲,WPF引进了良多冲动民气的特征。对动画的笼统就是这些特征之一。但这其实不意味着WPF的动画框架就已很完善了。WPF使用Storyboard暗示动画,经由过程在Storyboard中静态改动依附属性的值,从而完成响应的动画效果。可是Storyboard有其自己的范围。其范围之一就是难以暗示动画序列。本文对这个成绩举行了切磋,在会商了Storyboard范围的同时,给出了一个动画序列框架的开端完成。实行证实,这个框架在原本的动画基本上引进了序列的机制,能够更好地暗示动画。在此基本上,完整能够对该框架举行扩大,使得其成为通用性的框架,在WPF/Silverlight中失掉普遍的使用。
“飞刀,又见飞刀……”–引自古龙同名小说
“动画,又见动画……”–引自作者的呓语
0.背景
好吧,我不能不说,固然打仗不久,但我真的迷上WPF了。与以往的界面框架比拟,WPF的确改动了良多,从逻辑树到依附属性,从路由事务到模板……,这些功效极年夜地丰厚了界面开辟的办法。但在一切的这些特征中,最令我魂牵梦萦的,仍是动画。
是的,就是动画。WPF对动画举行了笼统,将动画与依附属性绑在了一同。同时供应了Storyboard,如许,我们就能够很简单地震态修正依附属性值,从而完成动画。动画完成变得简单了,带来的优点就是我们能够消费较少的事情量在程序中引进更丰厚的动画,使得程序变得更酷——这是不问可知的。乃至能够说,没有动画,WPF炫丽的界面就会相形见绌。而擅长利用动画也是WPF程序计划者不成或缺的才能之一。
恰是基于如许的背景,我在说呓语被妻子打醒后,决意仔细研讨一下动画。试实在现一些动画效果。
1.成绩形貌
在完成了几个基础的动画效果以后,我碰到了一个成绩:Storyboard不善于暗示动画序列。所谓动画序列呢,额……就是动画构成序列啦。就是我先播放一个动画,比及前一个动画播放终了后再播放下一个动画,依此类推。
动画序列很有效。好比在视图转换的过程当中,我们但愿完成以下的动画:将以后的视图变小,变小到必定水平后从屏幕中移除,从而显露前面的动画。这实质上是一个动画序列,包括了两个动画。第一个动画减藐视图尺寸,第二个动画移除削减尺寸后的视图。两个动画顺次实行。还能够用动画序列完成良多功效,只需我们的设想力够丰厚就能够。
用Storyboard也能够完成动画序列。在Storyboard中界说动画时,能够为一些动画(好比DoubleAnimation)指定入手下手工夫。只需确保后一个动画的入手下手工夫是前一个动画的停止工夫,就可以完成这个功效了。但这类完成体例有其本身的缺点——代码庞大,方便于保护。以是我说Storyboard不善于暗示动画序列。为了给人人一个实践的感觉,让我们看一个例子:
假定今朝有一个按钮,单击按钮时,我们但愿按钮起首变宽;变更完成后再变高;以后宽与高一致减少;最初宽与高一致扩展一点。
这是一个典范的动画序列。为了用Storyboard完成这个功效,我们能够在XAML中引进以下的界说(能够在所附代码的OriginalMethod项目中找到相干的代码):
个中的“_btn”是动画将要实行的按钮。
不论你晕不晕,归正我看到下面的代码是晕了。这段代码十分欠好,缘故原由以下:
l起首,在设置每一个动画的BeginTime时,很简单设置毛病(现实上,作者在写这段代码时,就呈现了设置毛病,招致动画效果不切合预期);
l其次,这段代码没有条理感,一眼看上往,很丢脸分明这段代码实践上界说了4段动画;
l第三,这段代码难以修正:假如我们但愿改动某段动画延续的工夫,那末它前面一切的动画所延续的工夫都必要产生变更;并且,假如我们但愿改动动画的按次,那末响应的每一个动画的BeginTime大概都要产生改动。当引进的动画段落对照多时,这类体例很简单引进毛病。
恰是因为上述缘故原由,我得出了“Storyboard”不善于暗示动画这个结论。
2.动画序列的暗示框架
为懂得决上述成绩,我计划并开端完成了一个动画序列。挪用动画序列的代码所示(能够在本文所附代码中找到完成的示例):
这个代码完成了上述4段的动画。从代码中能够看出,利用动画序列,我们能够:
l免去BeginTime的设置,削减堕落的大概性;
l代码加倍易读:从代码中能够一览无余地看到个中包括的动画段数和动画的实行按次;
l代码便于修正:对每一个独自动画的调剂,只需在响应的Storyboard中修正便可;对动画按次的调剂,则只必要调剂Storyboard的按次便可,无需别的的操纵;
l新的类能够与XAML之间较好的集成。
3.动画序列框架的完成
这一部分会商这个框架的完成办法。
为了完成序列的功效,我起首界说了一个序列类StoryboardChain,并在个中引进了属性:
用于包括Storyboard序列。
这个类同时包括了一个Begin办法,用于挪用动画。这个办法的次要代码以下:
代码会遍历现有的Storyboard汇合,经由过程ElementIndexer.SetPos为每个Storyboard引进一个附加属性,这个附加属性用于暗示以后动画实行终了后,下一个动画的ID。关于汇合中的最初一个动画,这个值为-1,暗示没有后续必要实行的内容了。在此基本上,为每一个Storyboard的Completed事务联系关系一个句柄OnCurrentFinished。以后动画实行终了后,体系会挪用这个函数,实行下一个动画。这些都设置终了后,挪用第一个Storyboard的Begin办法,入手下手全部动画序列的实行。
OnCurrentFinished则次要用于挪用下一个动画,其次要代码以下所示:
这就将全部动画串起来了。
最初,我们必要为该类增加一个特征声明:
如许,在XAML中声明的Storyboard将被置于Animates中。
OK,半途而废!。如今就能够测试一下这个序列了。测试的代码也包括在附带的源码中。
4.小结
在发明Storyboard暗示动画序列差强者意后,为了可以用更丰厚中央法暗示动画,我完成了一个“动画序列”的基本框架:完成了基础的动画序列的功效。与仅仅接纳Storyboard暗示动画序列比拟,利用这个框架能够也出更容易懂,更便于保护的代码。
之以是说这个框架是一个“基本框架”,由于它另有良多能够改善的中央,好比:
lStoryboardChain中只包括了Begin办法,在实践利用中,大概必要中止动画的办法;
l从下面的代码中能够看到,StoryboardChain中的每一个Storyboard均必要设定TargetName,假如这些称号不异,能够思索在StoryboardChain中举行设置,而不是针对每一个Storyboard设置;
lStoryboardChain今朝不克不及把持动画实行的整体工夫:动画实行的整体工夫是由每一个Storyboard实行的工夫乞降失掉的,能够思索引进相似Grid的机制,利用“1*”等体例在Storyboard中设置一个绝对实行工夫,然后在StoryboardChain中引进整体工夫把持;
lStoryboardChain中动画的实行按次就是个中Storyboard声明的按次,能够模仿Panel中的体例,设置每一个Storyboard的ZIndex,用ZIndex调剂动画的实行按次
l……
限于篇幅,这里就不合错误这些改善举行逐一的会商了。所要申明的是,这些改善绝对对照复杂。完整能够在现有的框架基本上完成。
WPF胸无点墨,作者程度无限,在发明Storyboard不善于暗示动画序列后也查阅了一些材料。因为没有找到好的体例,才本人完成了这个类。假如人人有更好的办理计划,还请不惜见教!
TransTest
byLiWei
我也不知道,我原来理解的,NET就是C++编程,只是与net网页编程相对,呵呵。以为.ET就是高级C++编程。 |
|