Mau*_*riF 5 performance android google-maps
我还没有找到关于如何在Android上使用这种技术的任何完整解释,所以我决定创建一个Q&A线程.
如果您的应用必须在Google地图上显示大量标记,并且群集它们不足以阻止您的应用运行速度过慢,那么您最好的选择之一就是使用此视口标记管理技术.您可以在此处阅读理论解释:https://developers.google.com/maps/articles/toomanymarkers
我在下面写了一个简短的指南......
1°---在创建地图的活动中,您必须设置OnCameraChangeListener并获取屏幕边界,如下所示:
mMap.setOnCameraChangeListener(new OnCameraChangeListener() {
@Override
public void onCameraChange(CameraPosition arg0) {
LatLngBounds bounds = mapa.getProjection().getVisibleRegion().latLngBounds;
}
Run Code Online (Sandbox Code Playgroud)
2°---此步骤可能会根据您获取标记数据的方式而有所不同.基本上,您需要做的是计算每个标记的纬度和长度是否在屏幕边界内.我将通过从标记表中两个不同的DOUBLE clomuns中存储纬度和经度的SQLite数据库中获取数据来向您展示如何操作.
mMap.setOnCameraChangeListener(new OnCameraChangeListener() {
@Override
public void onCameraChange(CameraPosition arg0) {
LatLngBounds bounds = mMap.getProjection().getVisibleRegion().latLngBounds;
LatLng northeast = bounds.northeast;
String boundLat = String.valueOf(northeast.latitude);
String boundLong = String.valueOf(northeast.longitude);
LatLng southwest = bounds.southwest;
String boundLat2 = String.valueOf(southwest.latitude);
String boundLong2 = String.valueOf(southwest.longitude);
//Remove all markers from map
mMap.clear(); // or if your a using cluster manager:
//mClusterManager.clearItems();
String[] fields = new String[] { "name", "latitude", "longitude" };
String[] args = new String[] {boundLat, boundLong, boundLat2, boundLong2,};
Cursor markers = dataBase.query("markers", fields, "latitude<=? AND longitude<=? AND latitude>=? AND longitude>=?");
if (markers.moveToFirst()) {
do {
mMap.addMarker(new MarkerOptions()
.position(new LatLng(marker.getDouble(1), marker.getDouble(2)))
.title(marker.getString(0)) );
// or if you are using cluster manager create and add the items as you normaly do.
} while (c.moveToNext());
//if using cluster manager add :
//mClusterManager.cluster();
}
}
});
Run Code Online (Sandbox Code Playgroud)
这个想法是很容易的,只需要记住,你的标记lat和隆基必须比屏幕的东北位置比西南角小,大,或者仅使用LatLngBounds.contains功能.
编辑:
为了避免InfoWindow在单击屏幕中心尚未显示的标记时关闭,您可以更改标记单击侦听器默认操作,删除相机移动.
map.setOnMarkerClickListener(new OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker arg0) {
arg0.showInfoWindow();
return true; //must be true, if not, it will execute the default code after yours
}
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1873 次 |
| 最近记录: |