在Android的Google Maps v2上动态添加标记

3

如何根据地图所显示的区域动态添加标记?

我有很多标记,或者说我的标记需要很多性能才能呈现出来,因为它们是自定义的。我现在实现了只有在“相机更改”被触发时才绘制40个标记。这样,每当摄像机位置改变时,就会重新渲染40个新的标记。

我读到了关于Runnable和Handler的东西,还有其他选项吗?有人知道哪个选项是最好的,以便UI线程不会被阻塞吗?


你看过AsyncTasks或Loaders吗? - chris-tulip
1
@CTulip Google Maps Android API v2 必须在 UI 线程上使用。 - MaciejGórski
2个回答

13
我建议使用适用于Google Maps Android API v2的聚类库之一。 Android Maps Extensions除了聚类外,还可以为您完成很多工作。该API与官方Google库非常相似。 如果您根本不想使用聚类,仍然可以通过以下方式实现您的目标:
map.setClustering(new ClusteringSettings()
    .enabled(false)
    .addMarkersDynamically(true)); // I didn't change the API to match your title ;)

Clusterkraf主要关注动态聚类。

截至撰写本文,Android Maps Utils尚未将聚类合并到主分支中,但您可以查看clustering branch

如果您想自己编写代码,我可以建议以下方法:


我几天前甚至通过问题跟踪器向您询问了一些事情 ;) 我的问题是我正在使用新的Android Studio,并需要通过gradle包含库;) 现在我可以手动完成它,但如果我只需在gradle文件中添加一两行代码即可自动管理依赖项,那将非常好...直接添加库并将其检入版本控制系统并不是一个好的做法...但现在我认为我必须这样做 :) - DieselPower
嗨,Maciej,我成功地将你的库导入到一个Android Studio项目中;) 但是有一个问题,什么位置最适合添加标记?我添加了标记(没有使用你的库),取决于可见区域(始终从本地数据库获取),并限制为40个标记...我应该一次读取所有数据库条目,让你的库完成其余工作吗?还是现在也只显示可见的标记? - DieselPower
@DieselPower 我计划尽早添加gradle支持。至于加载,最好将处理留给库。如果您使用的超过几百个,建议使用addMarkersDynamically以获得更好的用户体验。 - MaciejGórski
只是想补充一下:依赖项 { 编译 'com.androidmapsextensions:android-maps-extensions:2.2.0' 编译 'com.google.android.gms:play-services-maps:8.1.0' } - jasonflaherty
如果您正在从Google Maps迁移,为了利用“动态添加标记”功能,您是否需要更新Marker和MarkerOptions逻辑,还是只需指定即可? - AlexVPerl
1
@AlexVPerl 当使用addMarkersDynamically时,您只需通过GoogleMap.addMarker添加所有标记,但AME仅在必要时(它们将出现在用户屏幕上)才会真正添加它们。当然,MarkerMarkerOption必须来自AME包,而不是Maps Android API。 - MaciejGórski

-1
googleMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
            @Override
            public void onMapClick(LatLng latLng) {
                MarkerOptions marker = new MarkerOptions().position(
                        latLng)
                        .title("Hello Maps ");
                marker.icon(BitmapDescriptorFactory
                        .defaultMarker(BitmapDescriptorFactory.HUE_AZURE));
                googleMap.addMarker(marker);
            }
        });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接