Как отобразить пользовательское информационное окно на карте

Мне нужно отображать настраиваемое информационное окно, когда я нажимаю на булавку.

Булавка находится прямо на слое.

Когда я создаю карту, я получаю стиль по URL-адресу:

        mapView?.getMapAsync { map ->
            map.setStyle(Style.Builder().fromUrl("mapbox://styles/my-style")) {
                onMapReady(map)
            }
        }

Затем я определяю этот слой:

    fun onMapReady(mapboxMap: MapboxMap) {
        this.mapboxMap = mapboxMap
        val layer = mapboxMap.style?.getLayer("my-layer")
        layer?.setProperties(visibility(Property.VISIBLE))
        mapboxMap.addOnMapClickListener(this@InfoWindowSymbolLayerActivity)
    }

OnMapClick метод:

    override fun onMapClick(point: LatLng): Boolean {
        return mapboxMap?.projection?.toScreenLocation(point)?.let { handleClickIcon(it) }!!
    }

HandleClickIcon метод:

fun handleClickIcon(screenPoint: PointF): Boolean {
        val features = mapboxMap?.queryRenderedFeatures(screenPoint, MARKER_LAYER_ID)

        val inflater = LayoutInflater.from(this)
        val bubbleLayout = inflater.inflate(R.layout.pin_info, null) as BubbleLayout

        val type = features?.get(0)?.getStringProperty(type)
        bubbleLayout.tvDefectType.text = type?.let { formatType(it) }

        val username = features?.get(0)?.getStringProperty(username)
        bubbleLayout.tvDefectInfo.text = username?.let { formatDefectInfo(it) }

        val measureSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)
        bubbleLayout.measure(measureSpec, measureSpec)

        val measuredWidth = bubbleLayout.measuredWidth.toFloat()

        bubbleLayout.arrowPosition = measuredWidth / 2 - 5

        val bitmap = SymbolGenerator.generate(bubbleLayout)

        type?.let { mapboxMap?.style?.addImage(it, bitmap) }

        mapboxMap?.let {
            it.getStyle { style ->
                setUpInfoWindowLayer(style)
            }
        }
        return true
    }

В примере Mapbox используется пользовательский GeoJson: https://docs.mapbox.com/android/maps/examples/symbol-layer-info-window/.

Но мне нужно отображать информационное окно над таким булавкой при нажатии


person Natex    schedule 28.01.2020    source источник
comment
Итак, у вас есть метод onMarkerClick (docs.mapbox.com/android/api/map-sdk/5.0.2/com/mapbox/mapboxsdk/). Информационное окно не обязательно размещать в режиме просмотра карты, просто создайте свое собственное выше и покажите при необходимости.   -  person Ikazuchi    schedule 28.01.2020
comment
onMarkerClick не срабатывает, когда я нажимаю на карту @Ikazuchi   -  person Natex    schedule 28.01.2020


Ответы (1)


Если слой уже находится в вашем стиле, вам не нужно устанавливать его видимость с помощью layer?.setProperties(visibility(Property.VISIBLE)). Это уже будет видно.

Я бы подписался на https://docs.mapbox.com/android/maps/examples/symbol-layer-info-window/ от:

person langsmith    schedule 06.02.2020