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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值