Xamain.Forms 用戶界面——控件——Map

地圖

在Xamarin.Forms中添加地圖

PDF用於離線使用
示例代碼:
相關樣品:

讓我們知道你對此的感受

最後更新:2016年4月

Xamarin.Forms在每個平臺上使用原生地圖API。

Xamarin.Forms.Maps在每個平臺上使用原生地圖API。這爲用戶提供了一種快速,熟悉的地圖體驗,但意味着需要一些配置步驟來遵守每個平臺特定的API要求。一旦配置,該Map控件就像通用代碼中的任何其他Xamarin.Forms元素一樣工作。

地圖控件已在MapsSample示例中使用,如下所示。

MobileCRM示例中的地圖

通過創建地圖自定義渲染器可以進一步增強地圖功能。

地圖初始化

當將地圖添加到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文件中:NSLocationAlwaysUsageDescriptionNSLocationWhenInUseUsageDescription。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文件:

iOS 8的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上顯示爲灰色框。

請記住使用密鑰庫 文件生成另一個密鑰,該文件用於簽署上傳到Google Play商店的任何應用程序的發行版本。您爲開發和調試生成的關鍵點將無法正常工作,並且從Google Play下載的應用程序將顯示地圖顯示。如果應用程序的“ 包名稱”更改,還要記住重新生成密鑰 。

您還需要通過右鍵單擊Android項目並選擇選項>構建> Android應用程序並勾選以下內容來啓用適當的權限 :

  • AccessCoarseLocation
  • AccessFineLocation
  • AccessLocationExtraCommands
  • AccessMockLocation
  • AccessNetworkState
  • AccessWifiState
  • Internet

其中一些顯示如下:

Android所需的權限

最後兩個是必需的,因爲應用程序需要網絡連接才能下載地圖數據。閱讀有關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>

MapRegionPins可以在代碼使用來設置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可以用於在幾行代碼中使用引腳標記渲染地圖。使用自定義渲染器可以進一步增強地圖。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章