以编程方式更改群集管理器的项目图标

时间:2018-03-24 17:48:17

标签: android google-maps

在我的地图上,我使用Marker Cluster Utility对标记进行分组。首次放置在地图上的所有标记都具有相同的图标,然后,当我靠近其中一个标记移动时,其图标必须更改。我已经阅读了有关此问题的其他讨论,但据我所知,我需要删除标记并使用新图标再次生成标记。

我的标记属于一个集群,因此我应该从集群中删除标记,生成一个新标记并将其添加到集群管理器对象中。

问题是集群管理器对象附有一个渲染器,它还定义了标记的图标,它将使用与删除标记相同的图标。

一些代码:

渲染器类

class VenueMarkerRender(private val context: Context, map: GoogleMap, clusterManager: ClusterManager<Venue>)
    : DefaultClusterRenderer<Venue>(context, map, clusterManager) {

    override fun onBeforeClusterItemRendered(item: Venue?, markerOptions: MarkerOptions?) {
        super.onBeforeClusterItemRendered(item, markerOptions)

        markerOptions!!.icon(bitmapDescriptorFromVector(context, R.drawable.ic_map_black))
    }

    override fun onBeforeClusterRendered(cluster: Cluster<Venue>?, markerOptions: MarkerOptions?) {
        super.onBeforeClusterRendered(cluster, markerOptions)

        markerOptions!!.icon(bitmapDescriptorFromVector(context, R.drawable.ic_home_black_24dp))
    }

    override fun shouldRenderAsCluster(cluster: Cluster<Venue>?): Boolean {
        return cluster!!.size > 1
    }

    /**
     * Takes a vector image and make it available to use as a marker's icon
     */
    private fun bitmapDescriptorFromVector(context: Context, @DrawableRes vectorDrawableResourceId: Int): BitmapDescriptor {
        // ...

        return BitmapDescriptorFactory.fromBitmap(bitmap)
    }
}

场地类

class Venue : ClusterItem {
    private var mPosition:   LatLng
    private var mTitle:      String? = null
    private var mSnippet:    String? = null

    constructor(lat: Double, lng: Double, title: String, snippet: String) {
        mPosition = LatLng(lat, lng)
        mTitle = title
        mSnippet = snippet
    }

    override fun getPosition(): LatLng {
        return mPosition
    }

    override fun getTitle(): String {
        return mTitle!!
    }

    override fun getSnippet(): String? {
        return mSnippet
    }
}

最后如何创建集群管理器以及如何将场地添加到其中

mClusterManager = ClusterManager(this, map)
val renderer = VenueMarkerRender(this, map, mClusterManager!!)
mClusterManager!!.renderer = renderer

// other code

for (i in 0 until markers.length()) {
    val marker = JSONObject(markers.getJSONObject(i).toString())

    val venue = Venue(
            marker.getDouble("lat"),
            marker.getDouble("lng"),
            marker.getString("title"),
            marker.getString("snippet"),
    )

    mClusterManager!!.addItem(venue)
}

mClusterManager!!.cluster()

是否可以使用自己的图标生成新的Venue对象并将其添加到集群管理器对象中?或者有更好的方法来获得我需要的东西吗?

1 个答案:

答案 0 :(得分:0)

我刚刚找到了解决方案,我希望这会帮助其他人。

我已将渲染器声明为类属性,以使其在活动中的所有位置都可用

private var renderer: VenueMarkerRender? = null

之前它是设置Cluster Manager的方法中的私有变量。然后它被初始化,如前面的消息所示

renderer = VenueMarkerRender(this, map, mClusterManager!!)

现在,当我接近它时更改标记,每次位置更改时调用此方法就足够了

private fun markerProximity() {
    // get the venues' list from the cluster
    val venues = mClusterManager!!.algorithm.items

    // if the cluster was not empty
    if (venues.isNotEmpty()) {
        // initialize the array which will contain the distance
        val distance: FloatArray = floatArrayOf(0f,0f,0f)

        // loop through all the venues
        for (venue:Venue in venues) {
            // get the distance in meters between the current position and the venue location
            Location.distanceBetween(
                    venue.position.latitude,
                    venue.position.longitude,
                    lastLocation.latitude,
                    lastLocation.longitude,
                    distance)

            // if closer than 3 meters
            if ( distance[0] < 3 ) {
                // change this marker's icon
                renderer!!.getMarker(venue)
                          .setIcon(BitmapDescriptorFactory
                          .fromResource(R.drawable.my_location))
            }
        }
    }
}