Android 带有自定义标记的地图(标记上的文字)

Android Maps with Custom Marker (text on the marker)

我以前从未在地图上工作过 api。我想实现如下图所示的地图。我正在从 Web 服务获取数据,使用它我可以获得要显示在标记上的事件计数。 基本功能是,一旦用户放大,地图标记就会展开,因此标记很重要。

我的问题是:

  1. 有没有办法像这样自定义标记。
  2. 如何处理放大、缩小事件中的标记计数。

请帮忙。提前致谢。

您不需要做任何事情来计算标记并显示它在图片中的样子。 Google 有一个名为 Google Maps Android API utility library

的库

你需要的那个叫

Marker clustering — handles the display of a large number of points. video

Android-Maps-Utils 具有标记聚类实用程序。以下是步骤:

  1. 在你的build.gradle中添加compile 'com.google.maps.android:android-maps-utils:0.4.3'

  2. 在您的清单中添加以下权限

    <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" />
    
  3. 创建一个 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;
    }
    
  4. 在您的 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