2015-05-14 4 views
0

Я создаю приложение, в котором я пытаюсь переместить значок велосипеда, когда пользователь путешествует по его пути. Я получаю новое местоположение пользователя, подписываясь на событие с измененной позицией класса 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; 
      } 
     } 

ответ

1

У вас есть несколько проблем здесь. Обновленное местоположение не сможет сообщить вам путь, по которому пользователь совершил переход от A к B, поэтому анимационные кривые и т. Д. Будут сложными.

Первоначально я предлагаю вам изменить свой MovementThreshold на 0, чтобы вы получили как можно больше обновлений, чтобы дать вам самую высокую степень детализации, это должно свести к минимуму любую ошибку, которую вы увидите для путешествий по искривленному пути, особенно при более высоких уровнях масштабирования ,

Что касается оживляющего между «старым» и «новым» местах, есть отличный блог статья здесь:

Bring your maps to life: Creating animations with Bing Maps

Это охватывает все виды канцелярской кнопки анимации, которые вы должны быть в состоянии использовать в вашем проект.

+0

Спасибо Гэри за ответ. Я обновил свой код в соответствии с приведенной вами статьей. Теперь у меня есть эффект анимации для перемещения pushpin вдоль пути. Другая вещь подменыша заключается в том, что мне нужно показать, что эта кнопка автомобиля включена. Любая идея, как я могу это достичь? Я хочу сказать, что мне, возможно, придется вычислить ориентацию кнопки в соответствии с созданным маршрутом. –

+0

Если я правильно вас понимаю, вы хотите повернуть значок, который вы используете, чтобы он показывал направление движения? Если это так, вы хотите использовать формулу, как показано здесь: http://stackoverflow.com/questions/2042599/direction-between-2-latitude-longitude-points-in-c-sharp, которая даст вам заголовок между старым и новым местоположениями, которые вы можете использовать для поворота пиктограммы –

+0

Теперь он отлично работает. Благодаря.. –

Смежные вопросы