我有一个 Bing 地图控件,我想为地图上绘制的图钉的位置设置动画。
理想情况下,我想编写这样的代码:
// 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
值。
我假设我必须实现我的 -Timeline
派生类,但到目前为止我发现的文档在这方面没有帮助,我不知道从哪里开始。
如何为没有 *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 on specified object”。
所以我想现在的问题变成了:如何为附加属性指定属性路径?
进一步更新:我可能在“SetTargetProperty”这件事上走错了路,因为这会产生依赖动画(请参阅评论中的链接)。是否有更好的方法将标记针设置为坐标目标?
更新 3:正如 Jared 指出的那样,我可以尝试动画RenderTransform
,或使用过渡来实现我的结果。我已经走了这条路,这似乎不是我的解决方案。这是我发现的:
- 使用
RepositionThemeAnimation
,看来我必须给出图钉的新像素位置。这有几个原因:首先,我知道引脚的 lat/lng 目的地,但必须计算出投影(据我所知,没有公共接口可以使用投影)。其次,投影本身可以随着地图的缩放/平移而改变。动画结束时的像素目标不能与初始像素目标相同。在我的场景中,这是一个主要问题,因为在动画发生时地图很可能正在移动。 - 使用
RepositionThemeTransition
所有奇怪的像素/投影问题都消失了。到目前为止,这是我能够看到我期望的动画的唯一方法。我只是设置了转换并设置了标签的新纬度/经度位置(通过 MapLayer.SetPosition)。但它有两个主要问题。我无法设置动画的持续时间(也无法设置缓动功能)。最重要的是,当引脚到达最终位置时,我看不到任何执行代码的方法。