我正在寫一個Xamarin.Forms PCL應用程序,以支持我的應用程序的iOS和Android操作系統。如何使用Xamarin.Forms和GoogleMaps/GeoLocation
在根項目中,我有一個包含ViewList和一個映射(來自Xamarin.Forms.Maps)的視圖。
我瞭解到我必須爲每個平臺使用CustomRenderer來添加自定義行爲。我試圖通過GPS添加一個LocationManager/GeoLocation來識別用戶位置,並用一個pin/marker顯示他的位置。除此之外,我還從幾個人的根項目中獲得位置信息,這些信息也必須顯示在地圖中。
我是否必須使用接口導出功能或使用適當的自定義地圖渲染器?
我不知道要做到這一點,Xamarin.Forms網站上的示例和Stackoverflow中的研究都沒有給出提示。
下面是一些代碼,我至今(摘錄):
using System;
using Awesome;
using Xamarin.Forms;
using Xamarin.Forms.Maps;
using System.Collections.ObjectModel;
using System.Collections.Generic;
using Plugin.Geolocator;
using System.Threading.Tasks;
namespace KiLa
{
public class KidsFinder : ContentPage, ITabPage
{
public string TabIcon => FontAwesome.FAMapMarker;
public string SelectedTabIcon => FontAwesome.FAMapMarker;
private Boolean _showKidsList;
private ListView _listView;
public ObservableCollection<KidsViewModel> kidsList = new ObservableCollection<KidsViewModel>();
public KidsFinder()
{
Title = "KidsFinder";
// Define listView
// Any near/identified kids? Mockup
// TODO: get real data
Boolean kidsPresent = true;
// Initial height of map
double mapHeight = 300.0;
// coordinates of Beuth Hochschule, Haus Gauss
double latitude = 52.543100;
double longitude = 13.351450;
// Show/hide kidsList (listView)
//Boolean showKidsList = false;
_showKidsList = false;
// Define toggleButton
Button toggleButton = new Button();
toggleButton.Text = "Verstecke Liste";
toggleButton.Clicked += new EventHandler(OnClickEvent);
if(kidsPresent == true)
{
toggleButton.IsVisible = true;
mapHeight = 200.0;
_showKidsList = true;
} else
{
toggleButton.IsVisible = false;
mapHeight = 300.0;
_showKidsList = false;
}
// Mockup some kids
Position pos1 = new Position(latitude + 0.002, longitude + 0.002);
Position pos2 = new Position (latitude - 0.002, longitude - 0.002);
kidsList.Add(new KidsViewModel{Name="Tim", ActualPositon=pos1, DistanceToEducator=5.4});
kidsList.Add(new KidsViewModel{Name="Sabine", ActualPositon=pos2, DistanceToEducator=20.4});
_listView = new ListView();
_listView.ItemsSource = kidsList;
//listView.VerticalOptions = LayoutOptions.FillAndExpand;
_listView.ItemTemplate = new DataTemplate (typeof(KidsCustomCell));
_listView.RowHeight = 50;
if (_showKidsList == false) {
_listView.IsVisible = false;
} else {
_listView.IsVisible = true;
}
// Define mapView
var kidsMap = new KidsMap();
kidsMap.MapType = MapType.Street;
kidsMap.WidthRequest = 960;
kidsMap.HeightRequest = mapHeight;
kidsMap.MoveToRegion(MapSpan.FromCenterAndRadius(new Position(latitude,longitude), Distance.FromMiles(0.3)));
// Set label of pins with kids names,
foreach (KidsViewModel kvm in kidsList) {
Pin pin = new Pin() {
Label = kvm.Name,
Position = kvm.ActualPositon
};
kidsMap.Pins.Add(pin);
}
謝謝您的回答。你說的URL我已經試過了。但是我的代碼無法獲取用戶設備的當前位置。當我運行代碼時,代碼'_currentLocation = _locationManager.GetLastKnownLocation(_locationProvider);' 引發一個空指針。如果沒有最後的已知位置,我如何獲得當前位置? 「OnLocationChanged」只會在用戶改變他的位置時被調用,但不會獲得他的第一個位置(在初始化時)。 – Pille
更新:看起來,「OnLocationChanged」永遠不會被調用,儘管我將「RequestUpdate」的距離改爲0米。 – Pille