Как сделать нажатие кнопки накопительным?

У меня есть слушатель для кнопок масштабирования карты:

      class ZoomMapListener(
    mapView: MapView,
    private val zoom: Zoom
) : View.OnClickListener {

    private val localMapView = WeakReference(mapView)
    //private var clickCounter = 0

    override fun onClick(view: View?) {
        //clickCounter++
        localMapView.get()?.let {
            var cameraPosition = it.map.cameraPosition

            val zoom = if (zoom == IN) {
                cameraPosition.zoom + 1.0f
                //cameraPosition.zoom + (clickCounter * 1.0f)
            } else {
                cameraPosition.zoom - 1.0f
                //cameraPosition.zoom - (clickCounter * 1.0f)
            }

            cameraPosition = CameraPosition(
                cameraPosition.target,
                zoom,
                cameraPosition.azimuth,
                cameraPosition.tilt
            )

            it.map.move(cameraPosition, Animation(Animation.Type.SMOOTH, 0.5f), null)
        }
    }
}

Устанавливаю так:

      zoomInMapButton.setOnClickListener(ZoomMapListener(mapView, Zoom.IN))
zoomOutMapButton.setOnClickListener(ZoomMapListener(mapView, Zoom.OUT))

Но проблема в том, что если пользователь нажимает одну из этих кнопок несколько раз, карта не масштабируется должным образом из-за анимации: пользователь нажал кнопку -> положение камеры перемещается на 0,5 с -> менее чем за 0,5 с пользователь нажимает второй / третий / и т. д. time и onClick занимают промежуточное положение камеры. Из-за этого поведение масштабирования различается в разных случаях.

Поскольку я не хочу устанавливать нулевую продолжительность анимации, я подумал, что могу создать переменную для сохранения этого подсчета кликов (это прокомментировано в приведенном выше коде), но это неправильный путь, поэтому я я застрял

2 ответа

есть ли у вас какая-либо опция в каркасе карты для остановки текущей анимации (например, перемещения)?

если у вас есть, просто вызовите его в начале метода щелчка

если нет, то imho это правильное решение для введения некоторой переменной lastClicked = System.currentTimeMillis() и проверка if (System.currentTimeMillis() - lastClicked < 500) return в начале onClick

Думаю, ваш подход правильный. Просто сделай несколько изменений

      class ZoomMapListener(
    mapView: MapView,
    private val zoom: Zoom
) : View.OnClickListener {

    private val localMapView = WeakReference(mapView)
    private var clickCounter = 0

    override fun onClick(view: View?) {
        clickCounter++
        if(clickCounter>1) return
        setZoom()
    }

    setZoom() {
        localMapView.get()?.let {
            var cameraPosition = it.map.cameraPosition

            val zoom = if (zoom == IN) {
                cameraPosition.zoom + 1.0f
                //cameraPosition.zoom + (clickCounter * 1.0f)
            } else {
                cameraPosition.zoom - 1.0f
                //cameraPosition.zoom - (clickCounter * 1.0f)
            }

            cameraPosition = CameraPosition(
                cameraPosition.target,
                zoom,
                cameraPosition.azimuth,
                cameraPosition.tilt
            )

            it.map.move(cameraPosition, Animation(Animation.Type.SMOOTH, 0.5f), null)
            clickCounter--;
            Handler().postDelayed({
                if(counter>0) setZoom()
            }, 550)
        }
    }
}
Другие вопросы по тегам