Android 带有自定义标记的地图(标记上的文字)
Android Maps with Custom Marker (text on the marker)
我以前从未在地图上工作过 api。我想实现如下图所示的地图。我正在从 Web 服务获取数据,使用它我可以获得要显示在标记上的事件计数。
基本功能是,一旦用户放大,地图标记就会展开,因此标记很重要。
我的问题是:
- 有没有办法像这样自定义标记。
- 如何处理放大、缩小事件中的标记计数。
请帮忙。提前致谢。
您不需要做任何事情来计算标记并显示它在图片中的样子。
Google 有一个名为 Google Maps Android API utility library
的库
你需要的那个叫
Marker clustering — handles the display of a large number of points. video
Android-Maps-Utils 具有标记聚类实用程序。以下是步骤:
在你的build.gradle中添加compile 'com.google.maps.android:android-maps-utils:0.4.3'
。
在您的清单中添加以下权限
<uses-permission android:name="your.package.permission.MAPS_RECEIVE"/>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
创建一个 class,它将标记的位置作为 LatLng 对象。
public class MarkerItem 实现 ClusterItem {
private final LatLng mPosition;
public MarkerItem (double lat, double lon) {
mPosition = new LatLng(lat, lon);
}
@Override
public LatLng getPosition() {
return mPosition;
}
在您的 Activity/Fragment
中添加 ClusterManager
public class MainActivity 扩展 FragmentActivity 实现 OnMapReadyCallback {
private GoogleMap mGoogleMap;
// Declare a variable for the cluster manager.
ClusterManager<MarkerItem> mClusterManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SupportMapFragment supportMapFragment =
(SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
supportMapFragment.getMapAsync(this);
}
@Override
public void onMapReady(GoogleMap googleMap) {
mGoogleMap = googleMap;
setUpClusterer();
}
private void setUpClusterer() {
// Position the map.
mGoogleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(51.503186, -0.126446), 10));
// Initialize the manager with the context and the map.
// (Activity extends context, so we can pass 'this' in the constructor.)
mClusterManager = new ClusterManager<>(this, mGoogleMap);
// Point the map's listeners at the listeners implemented by the cluster
// manager.
mGoogleMap.setOnCameraChangeListener(mClusterManager);
mGoogleMap.setOnMarkerClickListener(mClusterManager);
// Add cluster items (markers) to the cluster manager.
addItems();
}
/**
* Generate dummy coordinates
*/
private void addItems() {
// Set some lat/lng coordinates to start with.
double lat = 51.5145160;
double lng = -0.1270060;
// Add ten cluster items in close proximity, for purposes of this example.
for (int i = 0; i < 10; i++) {
double offset = i / 60d;
lat = lat + offset;
lng = lng + offset;
MarkerItem offsetItem = new MarkerItem(lat, lng);
mClusterManager.addItem(offsetItem);
}
}
这个库自动处理聚类部分。
希望对您有所帮助!
更多详情:请关注this link
我以前从未在地图上工作过 api。我想实现如下图所示的地图。我正在从 Web 服务获取数据,使用它我可以获得要显示在标记上的事件计数。 基本功能是,一旦用户放大,地图标记就会展开,因此标记很重要。
我的问题是:
- 有没有办法像这样自定义标记。
- 如何处理放大、缩小事件中的标记计数。
请帮忙。提前致谢。
您不需要做任何事情来计算标记并显示它在图片中的样子。 Google 有一个名为 Google Maps Android API utility library
的库你需要的那个叫
Marker clustering — handles the display of a large number of points. video
Android-Maps-Utils 具有标记聚类实用程序。以下是步骤:
在你的build.gradle中添加
compile 'com.google.maps.android:android-maps-utils:0.4.3'
。在您的清单中添加以下权限
<uses-permission android:name="your.package.permission.MAPS_RECEIVE"/> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
创建一个 class,它将标记的位置作为 LatLng 对象。
public class MarkerItem 实现 ClusterItem {
private final LatLng mPosition; public MarkerItem (double lat, double lon) { mPosition = new LatLng(lat, lon); } @Override public LatLng getPosition() { return mPosition; }
在您的 Activity/Fragment
中添加 ClusterManagerpublic class MainActivity 扩展 FragmentActivity 实现 OnMapReadyCallback {
private GoogleMap mGoogleMap; // Declare a variable for the cluster manager. ClusterManager<MarkerItem> mClusterManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); SupportMapFragment supportMapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map); supportMapFragment.getMapAsync(this); } @Override public void onMapReady(GoogleMap googleMap) { mGoogleMap = googleMap; setUpClusterer(); } private void setUpClusterer() { // Position the map. mGoogleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(51.503186, -0.126446), 10)); // Initialize the manager with the context and the map. // (Activity extends context, so we can pass 'this' in the constructor.) mClusterManager = new ClusterManager<>(this, mGoogleMap); // Point the map's listeners at the listeners implemented by the cluster // manager. mGoogleMap.setOnCameraChangeListener(mClusterManager); mGoogleMap.setOnMarkerClickListener(mClusterManager); // Add cluster items (markers) to the cluster manager. addItems(); } /** * Generate dummy coordinates */ private void addItems() { // Set some lat/lng coordinates to start with. double lat = 51.5145160; double lng = -0.1270060; // Add ten cluster items in close proximity, for purposes of this example. for (int i = 0; i < 10; i++) { double offset = i / 60d; lat = lat + offset; lng = lng + offset; MarkerItem offsetItem = new MarkerItem(lat, lng); mClusterManager.addItem(offsetItem); } }
这个库自动处理聚类部分。
希望对您有所帮助!
更多详情:请关注this link