地圖
在Xamarin.Forms中添加地圖
Xamarin.Forms在每個平臺上使用原生地圖API。
Xamarin.Forms.Maps在每個平臺上使用原生地圖API。這爲用戶提供了一種快速,熟悉的地圖體驗,但意味着需要一些配置步驟來遵守每個平臺特定的API要求。一旦配置,該Map
控件就像通用代碼中的任何其他Xamarin.Forms元素一樣工作。
- 地圖初始化 -
Map
啓動時需要額外的初始化代碼。 - 平臺配置 - 每個平臺需要一些配置才能使地圖工作。
- 在C#中使用地圖 - 使用C#顯示地圖和引腳。
- 在XAML中使用地圖 - 使用XAML顯示地圖。
地圖控件已在MapsSample示例中使用,如下所示。
通過創建地圖自定義渲染器可以進一步增強地圖功能。
地圖初始化
當將地圖添加到Xamarin.Forms應用程序時,Xamarin.Forms.Maps是一個單獨的NuGet包,您應該添加到解決方案中的每個項目。在Android上,這也依賴於GooglePlayServices(另一個NuGet),當您添加Xamarin.Forms.Maps時,它會自動下載。
安裝NuGet軟件包後,Xamarin.Forms.Forms.Init
方法調用後,每個應用程序項目都需要一些初始化代碼 。對於iOS使用以下代碼:
Xamarin.FormsMaps.Init();
在Android上,您必須傳遞與以下相同的參數Forms.Init
:
Xamarin.FormsMaps.Init(this, bundle);
對於Windows運行時(WinRT)和通用Windows平臺(UWP),使用以下代碼:
Xamarin.FormsMaps.Init("INSERT_AUTHENTICATION_TOKEN_HERE");
在以下每個平臺的文件中添加此調用:
- iOS - AppDelegate.cs文件,在
FinishedLaunching
方法中。 - Android - MainActivity.cs文件,在
OnCreate
方法中。 - WinRT和UWP - MainPage.xaml.cs文件,在
MainPage
構造函數中。
一旦添加了NuGet軟件包,並在每個應用程序中調用了初始化方法,Xamarin.Forms.Maps
就可以在普通PCL或共享項目代碼中使用API。
平臺配置
在地圖顯示之前,需要在某些平臺上執行其他配置步驟。
iOS版
在iOS 7上,只要打了FormsMaps.Init()
電話,地圖控件就“正常工作” 。
對於iOS 8,需要將兩個鍵添加到Info.plist文件中:NSLocationAlwaysUsageDescription
和NSLocationWhenInUseUsageDescription
。XML表示如下所示
- 您應該更新string
值以反映應用程序如何使用位置信息:
<key>NSLocationAlwaysUsageDescription</key>
<string>Can we use your location</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>We are using your location</string>
該Info.plist中的條目也可以添加源視圖,而編輯的Info.plist文件:
Android的
要 在Android上使用Google Maps API v2,您必須生成API密鑰並將其添加到您的Android項目中。按照Xamarin文檔中的說明獲取Google Maps API v2密鑰。按照這些說明,將API密鑰粘貼到 Properties / AndroidManifest.xml文件中(查看源代碼並查找/更新以下元素):
<meta-data android:name="com.google.android.maps.v2.API_KEY"
android:value="AbCdEfGhIjKlMnOpQrStUvWValueGoesHere" />
沒有有效的API密鑰,地圖控件將在Android上顯示爲灰色框。
您還需要通過右鍵單擊Android項目並選擇選項>構建> Android應用程序並勾選以下內容來啓用適當的權限 :
AccessCoarseLocation
AccessFineLocation
AccessLocationExtraCommands
AccessMockLocation
AccessNetworkState
AccessWifiState
Internet
其中一些顯示如下:
最後兩個是必需的,因爲應用程序需要網絡連接才能下載地圖數據。閱讀有關Android 權限的 詳細信息。
Windows運行時和通用Windows平臺
要在Windows運行系統和通用Windows平臺上使用地圖,您必須生成授權令牌。有關詳細信息,請參閱在MSDN上請求映射身份驗證密鑰。
然後在FormsMaps.Init("AUTHORIZATION_TOKEN")
方法調用中指定身份驗證令牌,以便使用Bing Maps驗證應用程序。
使用地圖
看到MapPage.cs的MobileCRM樣品中的如何映射控制可以在代碼中使用的示例。一個簡單的MapPage
類可能看起來像這樣
- 注意MapSpan
創建一個新的定位地圖的視圖:
public class MapPage : ContentPage {
public MapPage() {
var map = new Map(
MapSpan.FromCenterAndRadius(
new Position(37,-122), Distance.FromMiles(0.3))) {
IsShowingUser = true,
HeightRequest = 100,
WidthRequest = 960,
VerticalOptions = LayoutOptions.FillAndExpand
};
var stack = new StackLayout { Spacing = 0 };
stack.Children.Add(map);
Content = stack;
}
}
地圖類型
也可以通過設置MapType
屬性來更改地圖內容,以顯示正常的街道地圖(默認),衛星圖像或兩者的組合。
map.MapType == MapType.Street;
有效MapType
值爲:
- 混合動力
- 衛星
- 街(默認)
地圖區域和MapSpan
如上面的代碼片段所示,向MapSpan
地圖構造函數提供實例會在映射加載時設置地圖的初始視圖(中心點和縮放級別)。的MoveToRegion
在地圖類方法然後可以用於改變地圖的位置或縮放級別。創建新MapSpan
實例有兩種方法:
- MapSpan.FromCenterAndRadius() - 從a創建跨度
Position
並指定a的 靜態方法Distance
。 - 新的MapSpan() - 使用
Position
緯度和經度的展開的構造函數 。
要更改地圖的縮放級別而不更改位置,請MapSpan
使用VisibleRegion.Center
地圖控件的屬性中的當前位置創建新的位置。ASlider
可以用於控制這樣的地圖縮放(但是直接在地圖控件中縮放當前無法更新滑塊的值):
var slider = new Slider (1, 18, 1);
slider.ValueChanged += (sender, e) => {
var zoomLevel = e.NewValue; // between 1 and 18
var latlongdegrees = 360 / (Math.Pow(2, zoomLevel));
map.MoveToRegion(new MapSpan (map.VisibleRegion.Center, latlongdegrees, latlongdegrees));
};
地圖引腳
位置可以在地圖上用Pin
對象標記。
var position = new Position(37,-122); // Latitude, Longitude
var pin = new Pin {
Type = PinType.Place,
Position = position,
Label = "custom pin",
Address = "custom detail info"
};
map.Pins.Add(pin);
PinType
可以設置爲以下值之一,這可能會影響渲染引腳的方式(取決於平臺):
- 通用
- 地點
- SavedPin
- 搜索結果
使用Xaml
地圖也可以放置在Xaml佈局中,如此片段所示。
<?xml version="1.0" encoding="UTF-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:maps="clr-namespace:Xamarin.Forms.Maps;assembly=Xamarin.Forms.Maps"
x:Class="MapDemo.MapPage">
<StackLayout VerticalOptions="StartAndExpand" Padding="30">
<maps:Map WidthRequest="320" HeightRequest="200"
x:Name="MyMap"
IsShowingUser="true"
MapType="Hybrid"
/>
</StackLayout>
</ContentPage>
的MapRegion
和Pins
可以在代碼使用來設置MyMap
參考(或任何地圖被命名)。請注意,需要額外的xmlns
命名空間定義來引用Xamarin.Forms.Maps控件。
MyMap.MoveToRegion(
MapSpan.FromCenterAndRadius(
new Position(37,-122), Distance.FromMiles(1)));
概要
Xamarin.Forms.Maps是一個單獨的NuGet,必須添加到Xamarin.Forms解決方案中的每個項目中。需要附加的初始化代碼,以及iOS,Android,WinRT和UWP的一些配置步驟。
一旦配置,Maps API可以用於在幾行代碼中使用引腳標記渲染地圖。使用自定義渲染器可以進一步增強地圖。