为了简化问题,我将引用Google Maps Utils library demo project - custom marker clustering activity
(链接是直接到代码) 第 69 行的评论说明了一切: //注意:该方法在 UI 线程上运行。不要在这里花费太多时间(如本例所示)。
我的项目有一些较重的渲染,并且在操作 map 时会产生一些滞后。我尝试将代码移至 AsyncTask,但随后它仅呈现默认标记。
我尝试将代码移至 onClusterRendered(),但 map 响应速度更慢。 我想我可以为我的集群预渲染很多可能性,但这感觉不是最好的方法
我正在尝试找出正确的方法来使此操作顺利进行。代码会更好
最佳答案
老问题,但我遇到同样的问题时来到这里。
我认为问题在于 onBeforeClusterRendered
的 markerOptions
参数是一个局部变量,在渲染期间/之后被丢弃。
相反,保留对 cluster
参数的引用允许您在加载图标后调用 getMarker(cluster)
,这将返回标记(如果它仍然存在)或null
。然后您可以使用marker.setIcon(...)
。
为了避免暂时看到默认标记,您可以隐藏该标记,直到加载图标为止。
这对我来说效果很好,并且在加载图标时保持 map /UI 响应。
@Override
protected void onBeforeClusterRendered(Cluster<Person> cluster, MarkerOptions markerOptions) {
// Hide default marker, load icon on background thread and unhide.
markerOptions.visible(false);
new LoadClusterMarkersAsync(cluster).execute();
}
private class LoadClusterMarkersAsync extends AsyncTask<Void, Void, Void> {
private Cluster<Person> cluster;
public LoadClusterMarkersAsync(Cluster<Person> cluster) {
super();
this.cluster = cluster;
}
@Override
protected Void doInBackground(Void... v) {
// Load icon...
return null;
}
@Override
protected void onPostExecute(Void v) {
super.onPostExecute(v);
Marker marker = getMarker(cluster);
if (marker != null) {
marker.setIcon(...);
marker.setVisible(true);
}
}
}
关于android - 谷歌地图实用程序中集群的背景渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23640827/