并非所有mapbox.com的服务在中国提供
Android 地图 SDK
并非所有mapbox.com的服务在中国提供
翻译:郭文密
Maps SDK 提供了多种监听地图事件 Events 的方式。 下面列出了 SDK 提供的大多数侦听器。 但是,您有时也会在其他概述文档中找到不同于这些的其他监听器。
可以通过MapboxMap
对象设置点击(轻拍)事件,并在每次事件发生时触发回调。 在这两种情况下,回调都会提供一个描述用户点击在地图上的位置LatLng
。 要添加onClick
监听器到地图,请在应用程序代码中插入以下代码段:
mapboxMap.addOnMapClickListener(new MapboxMap.OnMapClickListener() { @Override public boolean onMapClick(@NonNull LatLng point) { Toast.makeText(MainActivity.this, String.format("User clicked at: %s", point.toString()), Toast.LENGTH_LONG).show(); return true; }});
mapboxMap.addOnMapClickListener { point -> Toast.makeText(this, String.format("User clicked at: %s", point.toString()), Toast.LENGTH_LONG).show() true}
当需要知道用户手势发生在屏幕上的位置时,可以将LatLng
的点转换为屏幕像素。 MapboxMap对象提供了地图的Projection
,这允许您使用mapboxMap.getProjection().toScreenLocation(<LatLng>);
将LatLng
坐标转换成屏幕像素。 当已经获得以像素为单位的屏幕位置并且需要将其转换为相应的LatLng
对象时,可以使用相反的转换方法。
在LatLng
和像素坐标之间转换的常见用例是,当为了某种目的查询地图图层或源,例如,用来确定用户是否点击了POI。 您可以在查询地图要素文档中阅读有关如何执行此操作的更多信息。
地图 Camera 是在地图平面上的俯视视图。 在几乎所有情况下,您都将与Camera互动以调整地图的起始缩放和目标位置。 用户还可以通过在地图上做出手势来操纵相机,例如捏拉用以缩放,两个手指移动来倾斜地图,以及单手指移动来调整位置)。
Map SDK 提供了一些 Camera 变化监听器,它们可以报告任何或特定的 Camera 移动。SDK 提供了不同的 Camera 监听器用来确定 Camera 移动是由用户手势、内置 API 动画还是开发人员控制的移动引起的。 以下代码段显示了各种可用的 Camera 监听器:
mapboxMap.addOnCameraMoveStartedListener(new MapboxMap.OnCameraMoveStartedListener() { private final String[] REASONS = {"REASON_API_GESTURE", "REASON_DEVELOPER_ANIMATION", "REASON_API_ANIMATION"}; @Override public void onCameraMoveStarted(int reason) { Toast.makeText(SimpleMapViewActivity.this, String.format("OnCameraMoveStarted: %s", REASONS[reason - 1]), Toast.LENGTH_LONG).show(); }}); mapboxMap.addOnCameraMoveListener(new MapboxMap.OnCameraMoveListener() { @Override public void onCameraMove() { Toast.makeText(MainActivity.this, "onCameraMove", Toast.LENGTH_LONG).show(); }}); mapboxMap.addOnCameraMoveCancelListener(new MapboxMap.OnCameraMoveCanceledListener() { @Override public void onCameraMoveCanceled() { Toast.makeText(MainActivity.this, "onCameraMoveCanceled", Toast.LENGTH_LONG).show(); }}); mapboxMap.addOnCameraIdleListener(new MapboxMap.OnCameraIdleListener() { @Override public void onCameraIdle() { Toast.makeText(MainActivity.this, "onCameraIdle", Toast.LENGTH_LONG).show(); }});
mapboxMap.addOnCameraMoveStartedListener(object : MapboxMap.OnCameraMoveStartedListener { private val REASONS = arrayOf("REASON_API_GESTURE", "REASON_DEVELOPER_ANIMATION", "REASON_API_ANIMATION") override fun onCameraMoveStarted(reason: Int) { Toast.makeText(this@SimpleMapViewActivity, String.format("OnCameraMoveStarted: %s", REASONS[reason - 1]), Toast.LENGTH_LONG).show() } }) mapboxMap.addOnCameraMoveListener { Toast.makeText(this@SimpleMapViewActivity, "onCameraMove", Toast.LENGTH_LONG).show() } mapboxMap.addOnCameraMoveCancelListener { Toast.makeText(this@SimpleMapViewActivity, "onCameraMoveCanceled", Toast.LENGTH_LONG).show() } mapboxMap.addOnCameraIdleListener { Toast.makeText(this@SimpleMapViewActivity, "onCameraIdle", Toast.LENGTH_LONG).show() }
除了 Camera 变化监听器之外,MapboxMap
对象还允许您监听用户何时移动或拖拽地图。当用户在屏幕上拖动一根手指时会导致相机位置改变,此时就会触发移动事件。用户的类似动作,但是以更大的动量做手势时,将会调用onFling
回调。当用户执行特定手势时,仅有这些事件的其中之一会被触发一次。
mapboxMap.addOnMoveListener(new MapboxMap.OnMoveListener() { @Override public void onMoveBegin(MoveGestureDetector detector) { } @Override public void onMove(MoveGestureDetector detector) { } @Override public void onMoveEnd(MoveGestureDetector detector) { }}); mapboxMap.addOnFlingListener(new MapboxMap.OnFlingListener() { @Override public void onFling() { Toast.makeText(MainActivity.this, "onFling", Toast.LENGTH_LONG).show(); }});
mapboxMap.addOnMoveListener(object : MapboxMap.OnMoveListener { override fun onMoveBegin(detector: MoveGestureDetector) { } override fun onMove(detector: MoveGestureDetector) { } override fun onMoveEnd(detector: MoveGestureDetector) { }}) mapboxMap.addOnFlingListener { Toast.makeText(this@MainActivity, "onFling", Toast.LENGTH_LONG).show() }
Maps SDK 提供了一个方便的监听器用于捕获用户何时点击标记。 默认情况下,所有标记都有一个onMarkerClick
事件监听器用来显示和隐藏信息窗口。 您可以覆盖此默认事件监听器,并使用setOnMarkerClickListener
方法设置自己的事件监听器。
要显示带有被单击标记的标题的toast消息,请使用setOnMarkerClickListener
监听 click 事件,最后调用 Toast.makeText()。 为了避免同时显示 Toast 消息和信息窗口,请在末尾返回 true:
mapboxMap.setOnMarkerClickListener(new MapboxMap.OnMarkerClickListener() { @Override public boolean onMarkerClick(@NonNull Marker marker) { Toast.makeText(MainActivity.this, marker.getTitle(), Toast.LENGTH_LONG).show(); return true; }});
mapboxMap.setOnMarkerClickListener { marker -> Toast.makeText(MainActivity.this, marker.getTitle(), Toast.LENGTH_LONG).show(); }
在类似的情况下,信息窗口提供了几个侦听器用于在信息窗口被单击、长单击或被关闭时得到通知。
mapboxMap.setOnInfoWindowLongClickListener(new MapboxMap.OnInfoWindowLongClickListener() { @Override public void onInfoWindowLongClick(@NonNull Marker marker) { }}); mapboxMap.setOnInfoWindowCloseListener(new MapboxMap.OnInfoWindowCloseListener() { @Override public void onInfoWindowClose(@NonNull Marker marker) { }}); mapboxMap.setOnInfoWindowClickListener(new MapboxMap.OnInfoWindowClickListener() { @Override public boolean onInfoWindowClick(@NonNull Marker marker) { return false; }});
mapboxMap.onInfoWindowLongClickListener = MapboxMap.OnInfoWindowLongClickListener { } mapboxMap.onInfoWindowCloseListener = MapboxMap.OnInfoWindowCloseListener { } mapboxMap.onInfoWindowClickListener = MapboxMap.OnInfoWindowClickListener { false}
在构建和更改地图时,MapView
会经历一系列生命周期事件。 Maps SDK提供了许多不同的更改监听器接口,以通知何时发生了特定的地图事件。
不是将监听器添加到MapboxMap
对象,而是将每个监听器添加到MapView
对象。 例如OnDidFinishRenderingMapListener
和addOnDidFinishLoadingMapListener
。
mapView.addOnDidFinishRenderingMapListener(new MapView.OnDidFinishRenderingMapListener() { @Override public void onDidFinishRenderingMap(boolean fully) { // The map has finished rendering }});
mapView.addOnDidFinishRenderingMapListener { // The map has finished rendering }
您还可以实现特定的更改事件接口并覆盖其方法。 然后,当新的地图更改发生时,接口回调将被调用。
接下来,按照事件在MapView
生命周期中发生的顺序列出了这些监听器。
地图改变事件监听器 | 描述 |
---|---|
OnCameraWillChangeListener | 当显示的地图区域将要无动画更改时,触发此事件。 |
OnCameraDidChangeListener | 当显示的地图区域完成无动画更改时,会触发此事件。 |
OnWillStartLoadingMapListener | 地图即将开始加载新的地图样式时,触发此事件。 |
OnWillStartRenderingMapListener | 即将开始渲染地图时,触发此事件。 |
addOnWillStartRenderingFrameListener | 地图即将开始渲染框架时,触发此事件。 |
OnDidFinishRenderingFrameListener | 地图完成渲染框架时,触发此事件。 |
OnCameraWillChangeListener | 当显示的地图区域将要无动画更改时,触发此事件。 |
OnCameraDidChangeListener | 当显示的地图区域完成无动画更改时,触发此事件。 |
OnDidFinishLoadingStyleListener | 样式加载完成时,触发此事件。 |
OnDidFinishRenderingFrameListener | 框架渲染完成时,触发此事件。 |
OnSourceChangedListener | 当源发生变化时触发。 |
addOnWillStartRenderingFrameListener | 地图即将开始渲染框架时触发此事件。 |
OnDidFinishRenderingFrameListener | 框架渲染完成时,触发此事件。 |
OnDidFinishLoadingMapListener | 地图成功加载新的地图样式时触发。 |
addOnWillStartRenderingFrameListener | 地图将开始渲染框架时触发此事件。 |
OnDidFinishRenderingMapListener | 地图渲染完成时,触发此事件。 |
不属于标准 MapView
生命周期的其他更改事件:
地图改变事件监听器 | 描述 |
---|---|
OnCameraIsChangingListener | 每当显示的地图区域发生变化时,都会触发此事件。 |
OnCameraDidChangeListener | 当显示的地图区域将要以动画方式更改时,触发此事件。 |
OnDidFailLoadingMapListener | 当地图无法加载新的地图样式时,将触发此事件。 |
任何地图更改事件接口也都可以从 MapView
对象中删除。
addOnDidFinishLoadingStyleListener()
is useful if you're using runtime styling to change the Mapbox map style in real time. Here's how you'd use the constant: 如果您正在使用运行时样式实时更改Mapbox地图样式,addOnDidFinishLoadingStyleListener()
方法是很有用的。如何使用常量如下所示:
mapView.addOnDidFinishLoadingStyleListener(new MapView.OnDidFinishLoadingStyleListener() { @Override public void onDidFinishLoadingStyle() { // The map is now ready for other changes }});
mapView.addOnDidFinishLoadingStyleListener { // The map is now ready for other changes }