Google Maps utils中群集的背景渲染

问题描述 投票:3回答:1

为简化问题,我将参考Google Maps Utils library demo project - custom marker clustering activity

(链接直接指向代码)第69行的注释说明了一切://注意:此方法在UI线程上运行。不要在这里花太多时间(例如在此示例中)。

我的项目的渲染有些沉重,并且在处理地图时会产生一些滞后。我尝试将代码移至AsyncTask,但随后仅呈现默认标记。

我尝试将代码移至onClusterRendered(),但地图响应速度甚至更慢。我想我可以将很多可能性预渲染到群集中,但这并不像是最好的方法

我正在尝试找出正确的方法来使此过程顺利进行。代码会更好]

android google-maps google-maps-markers google-maps-android-api-2
1个回答
0
投票

旧问题,但遇到同样问题时我来到这里。

我认为问题是onBeforeClusterRenderedmarkerOptions参数是在渲染期间/之后被丢弃的局部变量。

相反,只要引用cluster参数,您就可以在加载图标后调用getMarker(cluster),这将返回标记(如果仍然存在)或null。然后您可以使用marker.setIcon(...)

为了避免暂时看到默认标记,您可以隐藏标记,直到图标被加载。

这对我来说很好,并且在加载图标时使地图/ 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);
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.