理想情况下,我想写这样的代码:
// Image myPin = some Image on the map layer; var sb = new Storyboard(); var duration = DurationHelper.FromTimeSpan(System.TimeSpan.FromMilliseconds(1000)); sb.Duration = duration; LocationAnimation ani = new LocationAnimation(); ani.To = new Location(33.3,11.1); // destination lat,lng ani.Duration = duration; sb.Children.Add(ani); Storyboard.SetTarget(ani,myPin); Storyboard.SetTargetProperty(ani,"MapLayer.Position"); Resources.Add("moveMyPin",sb); sb.Begin();
当然框架中没有LocationAnimation类.有几个类似的:PointAnimation使用Point类型,而DoubleAnimation使用单个double值.
我假设我必须实现我的时间轴派生类,但到目前为止我找到的文档在这方面没有帮助,我不知道从哪里开始.
如何为没有* Animation类准备好的属性设置动画?我错过了什么吗?
更新:我想我可以做点什么
// let aniX and aniY be two DoubleAnimation objects StoryBoard.SetTargetProperty(aniX,"(MapLayer.Position).Latitude") StoryBoard.SetTargetProperty(aniY,"(MapLayer.Position).Longitude")
但现在我有另一个问题,因为我没有看到如何动画附加属性,并总是得到一个例外,如“无法解析指定对象上的TargetProperty(MapLayer.Position).Latitude”.
进一步更新:我可能在“SetTargetProperty”事情上处于错误的领先地位,因为这将产生一个依赖动画(参见评论中的链接).有没有更好的方法将标记引脚设置为坐标目标?
更新3:正如Jared指出的那样,我可以尝试为RenderTransform设置动画,或者使用转换来实现我的结果.我已经走了这条路,似乎不是我的解决方案.这是我发现的:
>使用RepositionThemeAnimation,似乎我必须给出引脚的新像素位置.这有几个原因是有问题的:首先,我知道引脚的lat / lng目的地,但是必须计算出投影(据我所知,没有用于投影的公共接口).其次,投影本身可以随着地图缩放/平移而改变.动画结束时的像素目的地不能与初始像素目的地相同.在我的场景中,这是一个主要问题,因为在动画发生时,地图很可能正在移动.
>使用RepositionThemeTransition所有奇怪的像素/投影问题都消失了.到目前为止,这是我能够看到我预期的动画的唯一方法.我只是设置过渡并设置标签的新lat / lng位置(通过MapLayer.SetPosition).但它有两个主要问题.我无法设置动画的持续时间(也不是缓动函数).最重要的是,当引脚到达其最终位置时,我看不到执行代码的方法.
解决方法
http://www.charlespetzold.com/blog/2007/09/080231.html
但是,我认为这仅适用于设置整个值(位置),可能不适用于子属性(纬度和经度).
我想知道你是否可以提供更多关于你要做什么的信息.这是一个临时动画吗?也就是说你想要引脚在入口或出发时动画?如果是这样,你可以在RenderTransform X和Y上做一个动画.您实际上不会更改引脚的位置,但您可以使用RenderTransform临时更改其绘制位置.
更好的是,您可能能够摆脱现在构建到框架中的免费动画.你甚至不需要故事板来使用它们,你只需将它们设置在元素上就像这样:
<Button Content="Transitioning Button"> <Button.Transitions> <TransitionCollection> <EntranceThemeTransition/> </TransitionCollection> </Button.Transitions> </Button>
有关动画库的更多示例以及许多动画的视频预览,请参阅:
http://msdn.microsoft.com/en-us/library/windows/apps/xaml/hh452703.aspx