地图
在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可以用于在几行代码中使用引脚标记渲染地图。使用自定义渲染器可以进一步增强地图。