Я создаю приложение, в котором я пытаюсь переместить значок велосипеда, когда пользователь путешествует по его пути. Я получаю новое местоположение пользователя, подписываясь на событие с измененной позицией класса Geolocator. Я каждый раз устанавливаю кнопку в этом новом месте. Но проблема в том, что pushpin не движется по этому пути, как с анимацией, но внезапно выходит в новое место. Есть ли способ анимировать кнопку для перемещения по пути с использованием начальной и конечной точки. Это также должно включать сценарий, например, поворот по искривленному пути.Windows Phone make pushpin icon move on map между начальным и конечным местоположением
Текущий код:
XAML:
<maps:Map x:Name="myMap" ZoomLevel="16">
<toolkit:MapExtensions.Children>
<toolkit:UserLocationMarker x:Name="UserLocationMarker" />
<!--<toolkit:Pushpin x:Name="MyPushpin" Content="My Position"></toolkit:Pushpin>-->
</toolkit:MapExtensions.Children>
</maps:Map>
C#:
Geolocator geolocator = new Geolocator();
this.geolocator.MovementThreshold = 0;
RouteQuery MyQuery = null;
GeocodeQuery Mygeocodequery = null;
async void MainPage_Loaded(object sender, RoutedEventArgs e)
{
geolocator.PositionChanged += geolocator_PositionChanged;
Geoposition geoposition = await geolocator.GetGeopositionAsync();
myMap.Center = geoposition.Coordinate.ToGeoCoordinate();
}
void geolocator_PositionChanged(Geolocator sender, PositionChangedEventArgs args)
{
Dispatcher.BeginInvoke(() =>
{
UserLocationMarker marker = (UserLocationMarker)this.FindName("UserLocationMarker");
marker.GeoCoordinate = new GeoCoordinate(args.Position.Coordinate.Latitude, args.Position.Coordinate.Longitude);
});
}
private void MovePinOnPath(bool isGeodesic)
{
ClearMap();
Pushpin marker = (Pushpin)this.FindName("MyPushpin");
marker.GeoCoordinate = path[0];
currentAnimation = new Animations.PathAnimation(path, (coord, pathIdx, frameIdx) =>
{
marker.GeoCoordinate = coord;
}, isGeodesic, 10000);
currentAnimation.Play();
}
private void ClearMap()
{
if (currentAnimation != null)
{
currentAnimation.Stop();
currentAnimation = null;
}
}
private void Button_Click(object sender, RoutedEventArgs e)
{
MovePinOnPath(true);
}
private void btnSearch_Click(object sender, RoutedEventArgs e)
{
if(!string.IsNullOrWhiteSpace(txtSearchPlace.Text))
{
Mygeocodequery = new GeocodeQuery();
Mygeocodequery.SearchTerm = txtSearchPlace.Text;
Mygeocodequery.GeoCoordinate = new GeoCoordinate(myMap.Center.Latitude, myMap.Center.Longitude);
Mygeocodequery.QueryCompleted += Mygeocodequery_QueryCompleted;
Mygeocodequery.QueryAsync();
}
}
private void Mygeocodequery_QueryCompleted(object sender, QueryCompletedEventArgs<IList<MapLocation>> e)
{
if (e.Error == null
&& e.Result.Count > 0)
{
MyQuery = new RouteQuery();
path.Add(e.Result[0].GeoCoordinate);
MyQuery.Waypoints = path;
MyQuery.QueryCompleted += MyQuery_QueryCompleted;
MyQuery.QueryAsync();
Mygeocodequery.Dispose();
}
}
private void MyQuery_QueryCompleted(object sender, QueryCompletedEventArgs<Route> e)
{
if (e.Error == null)
{
Route MyRoute = e.Result;
MapRoute MyMapRoute = new MapRoute(MyRoute);
myMap.AddRoute(MyMapRoute);
MyQuery.Dispose();
path = e.Result.Geometry.ToList();
btnPlay.IsEnabled = true;
}
}
Спасибо Гэри за ответ. Я обновил свой код в соответствии с приведенной вами статьей. Теперь у меня есть эффект анимации для перемещения pushpin вдоль пути. Другая вещь подменыша заключается в том, что мне нужно показать, что эта кнопка автомобиля включена. Любая идея, как я могу это достичь? Я хочу сказать, что мне, возможно, придется вычислить ориентацию кнопки в соответствии с созданным маршрутом. –
Если я правильно вас понимаю, вы хотите повернуть значок, который вы используете, чтобы он показывал направление движения? Если это так, вы хотите использовать формулу, как показано здесь: http://stackoverflow.com/questions/2042599/direction-between-2-latitude-longitude-points-in-c-sharp, которая даст вам заголовок между старым и новым местоположениями, которые вы можете использовать для поворота пиктограммы –
Теперь он отлично работает. Благодаря.. –