android onPolygonClick检测不同的多边形

disho6za  于 2023-03-28  发布在  Android
关注(0)|答案(1)|浏览(173)

我在我的Android项目中使用Kotlin。MapView是在片段中。
当用户选择多边形时,我会改变其笔划颜色。问题是有时onPolygonClick方法会检测到不同的多边形。你可以在这个GIF中看到它:https://gyazo.com/167aed90529031df01c07d7f583f790e

onPolygonClick方法:

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

首先,我从服务器获取六边形,然后在Map上绘制它。这是在获取数据后调用的方法,用于将多边形添加到Map:

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()
}
ss2ws0br

ss2ws0br1#

我没有弄清楚为什么MapView检测不同的多边形,但我想出了一个解决办法。
如果你有和我一样的问题,只需将你的多边形选项clickable设置为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
    }

相关问题