onPolygonClick обнаруживает разные полигоны - PullRequest
0 голосов
/ 25 марта 2020

Я использую Kotlin в моем Android проекте. MapView фрагментарно.

Когда пользователь выбирает полигон, я меняю его цвет обводки. Проблема в том, что иногда метод onPolygonClick обнаруживает разные полигоны. Вы можете увидеть это в GIF: https://gyazo.com/167aed90529031df01c07d7f583f790e

onPolygonClick метод:

override fun onPolygonClick(polygon: Polygon?) {
        polygons.forEach {
            it.strokeColor = Color.BLACK
        }
        polygon?.strokeColor = Color.WHITE
    }

Сначала я получаю шестиугольники с сервера и тогда я рисую это на карте. Этот метод вызывается после того, как данные извлекаются для добавления полигонов на карту:

private fun drawRegion(regions: Array<Kraj>) {

        //reset map
        googleMap.clear()
        polygons = ArrayList()

        setMapViewBounds(regions)
        for (region in regions) {
            val rnd = Random()
            val color = Color.argb(255, rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256))
            for (hexagon in region.hexagons) {
                val options = PolygonOptions()
                for (point in hexagon) {
                    options.add(point)
                }
                options.strokeColor(Color.BLACK)
                options.fillColor(color)
                options.strokeWidth(2.5.toFloat())
                options.clickable(true)
                val pol = googleMap.addPolygon(options)
                pol.tag = region.id
                polygons.add(pol)
            }
        }
    }

Как видите, я также сохраняю все полигоны в массив полигонов, чтобы получить доступ ко всем их в методе onPolygonClick.

Метод onMapReady:

override fun onMapReady(map: GoogleMap?) {

    map?.let {
        googleMap = it
        googleMap.setMapStyle(
            MapStyleOptions.loadRawResourceStyle(
                activity?.applicationContext, R.raw.empty_map_style
            )
        )
    }

    map?.setOnMapClickListener(this)
    map?.setOnPolygonClickListener(this)
    addObservers()
}

1 Ответ

0 голосов
/ 30 марта 2020

Я не понял, почему MapView обнаруживает другой многоугольник, но я сделал обходной путь.

Если у вас возникла такая же проблема, как у меня, просто установите для ваших параметров многоугольника кликабельное значение false (иначе onMapClick не работает, если вы нажмете на полигон), настройте onMapClickListener и определите, какой полигон был нажат:

override fun onMapClick(coords: LatLng?) {
        val polygon = polygons.first {PolyUtil.containsLocation(coords!!, it.points, true)}
        val id = polygon?.tag.let { it } as Int
        polygons.forEach {
            it.strokeColor = Color.BLACK
            val itId = it?.tag.let { it } as Int
            if (it == polygon) {
                it.strokeColor = Color.BLUE
            }
        }

        viewModel.userClickedOnPolygonWithId(id)
        polygon?.strokeColor = Color.WHITE
    }
...