调用 onMapMoved() 时识别事件 (rotate/zoom/tilt/drag) - Nutiteq
Identify the event(rotate/zoom/tilt/drag) when onMapMoved() is Called - Nutiteq
我正在使用 nutiteq SDK 加载地图 mbtiles。
我得到了缩放/ rotate/tilt/drag 发生时触发的事件。但根据文档,所有这些都在一个听众之下。
示例代码:
public class MyMapEventListener extends MapEventListener {
private final MapView mapView;
private final LocalVectorDataSource vectorDataSource;
public MyMapEventListener(MapView mapView, LocalVectorDataSource vectorDataSource) {
this.mapView = mapView;
this.vectorDataSource = vectorDataSource;
}
@Override
public void onMapMoved() {
// super.onMapMoved();
Toast.makeText(mapView.getContext(),(int)mapView.getZoom()+"",Toast.LENGTH_SHORT).show();
}
当调用 onMapMoved()
方法时,我如何确定正在发生的事件 (rotate/zoom/tilt/drag)?
您可以获取并记住上一个 MapView
状态,并与新状态进行比较 - 如果更改了缩放,则它是缩放等。准备好一个手势可以包含多个事件(可以缩放和旋转相同的事件运动,例如)。
但是您为什么需要这些事件呢?通常应用程序不需要它,也许有更好的方法来实现相同的应用程序功能。
I want to show area labels on the map based on the zoom level
好的,这是一个不同的问题,正如我所怀疑的那样:) 有一些方法可以在不监听地图事件的情况下进行基于缩放级别的对象显示,因此显示控制会自动为您完成。您的地图视图甚至可以倾斜,然后您对整个地图区域没有相同的缩放级别,并且基于侦听器的技巧的性能在任何情况下都会很糟糕。
因此,正确的解决方案是使用不同的图层,并通过以下方式限制每个图层的缩放。请注意,您可以对两个层使用相同的数据源(可能在那里有 LocalVectorDataSource
)。
// 1. Initialize a local vector data source and layer
LocalVectorDataSource vectorDataSource = new LocalVectorDataSource(proj);
// Initialize a vector layer with the previous data source
VectorLayer vectorLayer = new VectorLayer(vectorDataSource);
// Add the previous vector layer to the map
mapView.getLayers().add(vectorLayer);
// Set visible zoom range for the vector layer
vectorLayer.setVisibleZoomRange(new MapRange(10, 24));
// Now add the text to the vectorDataSource:
// Create text style
TextStyleBuilder textStyleBuilder = new TextStyleBuilder();
textStyleBuilder.setColor(new Color(0xFFFF0000));
textStyleBuilder.setOrientationMode(BillboardOrientation.BILLBOARD_ORIENTATION_FACE_CAMERA);
// Add text
Text textpopup1 = new Text(proj.fromWgs84(new MapPos(24.653302, 59.422269)),
textStyleBuilder.buildStyle(),
"My text");
vectorDataSource.add(textpopup1);
我正在使用 nutiteq SDK 加载地图 mbtiles。
我得到了缩放/ rotate/tilt/drag 发生时触发的事件。但根据文档,所有这些都在一个听众之下。
示例代码:
public class MyMapEventListener extends MapEventListener {
private final MapView mapView;
private final LocalVectorDataSource vectorDataSource;
public MyMapEventListener(MapView mapView, LocalVectorDataSource vectorDataSource) {
this.mapView = mapView;
this.vectorDataSource = vectorDataSource;
}
@Override
public void onMapMoved() {
// super.onMapMoved();
Toast.makeText(mapView.getContext(),(int)mapView.getZoom()+"",Toast.LENGTH_SHORT).show();
}
当调用 onMapMoved()
方法时,我如何确定正在发生的事件 (rotate/zoom/tilt/drag)?
您可以获取并记住上一个 MapView
状态,并与新状态进行比较 - 如果更改了缩放,则它是缩放等。准备好一个手势可以包含多个事件(可以缩放和旋转相同的事件运动,例如)。
但是您为什么需要这些事件呢?通常应用程序不需要它,也许有更好的方法来实现相同的应用程序功能。
I want to show area labels on the map based on the zoom level
好的,这是一个不同的问题,正如我所怀疑的那样:) 有一些方法可以在不监听地图事件的情况下进行基于缩放级别的对象显示,因此显示控制会自动为您完成。您的地图视图甚至可以倾斜,然后您对整个地图区域没有相同的缩放级别,并且基于侦听器的技巧的性能在任何情况下都会很糟糕。
因此,正确的解决方案是使用不同的图层,并通过以下方式限制每个图层的缩放。请注意,您可以对两个层使用相同的数据源(可能在那里有 LocalVectorDataSource
)。
// 1. Initialize a local vector data source and layer
LocalVectorDataSource vectorDataSource = new LocalVectorDataSource(proj);
// Initialize a vector layer with the previous data source
VectorLayer vectorLayer = new VectorLayer(vectorDataSource);
// Add the previous vector layer to the map
mapView.getLayers().add(vectorLayer);
// Set visible zoom range for the vector layer
vectorLayer.setVisibleZoomRange(new MapRange(10, 24));
// Now add the text to the vectorDataSource:
// Create text style
TextStyleBuilder textStyleBuilder = new TextStyleBuilder();
textStyleBuilder.setColor(new Color(0xFFFF0000));
textStyleBuilder.setOrientationMode(BillboardOrientation.BILLBOARD_ORIENTATION_FACE_CAMERA);
// Add text
Text textpopup1 = new Text(proj.fromWgs84(new MapPos(24.653302, 59.422269)),
textStyleBuilder.buildStyle(),
"My text");
vectorDataSource.add(textpopup1);