AirMapView

一种视图抽象,提供具有各种底层地图提供商的地图用户界面
1,806
作者Eric Petzel

如今,许多 Android 应用都需要某种形式的交互式地图作为其用户界面的一部分。Google 通过 Google Play 服务提供了原生软件包和体验来满足此需求,但问题仍然是如何为没有 Play 服务的设备创建交互式地图。

在一些国家,大多数设备都是不带 Google Play 服务销售的。不预装 Google Play 服务的设备制造商在全球范围内正越来越受欢迎。为了使我们的应用程序提供真正国际化的体验,我们不能忽略地图这样重要的功能。并且因为我们知道其他公司也有同样的问题,所以我们创建并开源了 AirMapView。

AirMapView 是一种视图抽象,它能够为有和没有 Google Play 服务的设备提供交互式地图。拥有 Google Play 服务的设备将使用 Google Maps V2,而没有 Google Play 服务的设备将使用基于 Web 的 Google Maps 实现。所有这些都作为一个单一的 API 提供,其设计遵循大多数开发者习惯使用的 Google Maps V2 的 API。

AirMapView 默认会选择设备上可用的最佳地图提供商。默认情况下,如果可用,它将使用原生的 Google Maps V2,如果 Google Play 服务不可用,则回退到 WebView 解决方案。API 的设计对用户完全透明,因此开发人员可以使用当前用于 Google Maps 的相同 API 来获得回退功能。

原生 GoogleMap 作为 AirMapView 内部的片段实现,提供与直接使用 Google Maps V2 完全相同的功能。将现有的 GoogleMap 实现移植到 AirMapView 就像简单地将对 GoogleMap 的调用替换为对 AirMapView 的调用,并为 OnCameraChanged 等操作实现正确的回调类一样简单。API 的设计是可插拔的,因此开发人员可以为特定设备添加自己的提供商,例如亚马逊 Kindle Fire 设备的 Amazon Maps。

回退的 webview 地图在 Android WebView 内显示 Google 地图,并使用 javascript bridge 回调来允许与地图进行动态交互。由于它是 webview 而不是原生代码,因此它的性能不如原生 GoogleMap,但在 Airbnb 应用的实验中,它的性能只略微差一些。

使用 Javascript Bridge,我们能够在 web 地图中实现相同的 API,因此一旦为原生地图实现了 AirMapView,就不需要更改客户端代码来支持 web 地图。

web 地图允许设置位置、居中、添加标记、拖动、点击地图以及 GoogleMap 目前支持的其他常用操作。

我们构建 AirMapView 的方式使得我们能够轻松地在未来添加额外的地图提供商,例如 Amazon Maps V2、百度地图、Mapbox 等。

链接