4

我有一个 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)。但它有两个主要问题。我无法设置动画的持续时间(也无法设置缓动功能)。最重要的是,当引脚到达最终位置时,我看不到任何执行代码的方法。
4

2 回答 2

1

好的,伙计,您的问题与 Bing 地图无关。它与无法动画的依赖属性有关,除非您指定它们可以。方法如下:http ://blog.jerrynixon.com/2012/06/windows-8-animated-pie-slice.html

查尔斯网站的另一个答案中的链接不是最新的。

于 2012-10-18T16:12:39.193 回答
1

附加属性可以设置动画,但您必须将它们的名称括在括号中。在此处查看示例:

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

于 2012-08-01T22:31:06.003 回答