Как сделать нажатие кнопки накопительным?
У меня есть слушатель для кнопок масштабирования карты:
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)
}
}
}