private VisibleVehiclesDelta UpdateVisibleVehicles(VehiclesViewPortUpdate update) { var visibleVehiclesNew = new Dictionary <string, VehicleViewModel>(); foreach (var keyValuePair in _vehicles) { if (update.VisibleRegion.ContainsPoint(keyValuePair.Value.LocationAnimated)) { visibleVehiclesNew.Add(keyValuePair.Key, keyValuePair.Value); } } MvxTrace.Trace("{0} visible vehicles, {1} current vehicles are visible", visibleVehiclesNew.Count, _visibleVehicles.Count); var vehiclesToRemove = new List <VehicleViewModel>(); foreach (var keyValuePair in _visibleVehicles) { if (visibleVehiclesNew.ContainsKey(keyValuePair.Key)) { visibleVehiclesNew.Remove(keyValuePair.Key); } else { vehiclesToRemove.Add(keyValuePair.Value); } } var animateMovement = this.IsAnimationEnabled(update.Zoom); MvxTrace.Trace("{0} vehicles should be removed, {1} added", vehiclesToRemove.Count, visibleVehiclesNew.Count); foreach (var vm in vehiclesToRemove) { _visibleVehicles.Remove(vm.VehicleId); this.ViewDispatcher.RequestMainThreadAction(() => { vm.IsInView = false; vm.AnimateMovement = false; }); } foreach (var vm in visibleVehiclesNew.Values) { _visibleVehicles[vm.VehicleId] = vm; this.ViewDispatcher.RequestMainThreadAction(() => { vm.IsInView = true; vm.AnimateMovement = animateMovement; }); } return(new VisibleVehiclesDelta(visibleVehiclesNew.Values.ToList(), vehiclesToRemove)); }
private void UpdateVehiclesInTheViewPort(VehiclesViewPortUpdate update) { MvxTrace.Trace("Updating vehicles in the viewport... "); try { this.UpdateVehicles(update.VehicleUpdates); var mapUpdate = this.UpdateVisibleVehicles(update); if (mapUpdate.HasUpdates) { this.ViewDispatcher.RequestMainThreadAction(() => { this.ViewportUpdate.OnNext(mapUpdate); }); } } catch (Exception ex) { Insights.Report(ex, Insights.Severity.Error); } }