如何使按钮点击累积?
How to make a button click cumulative?
我的地图缩放按钮有一个监听器:
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.5s 用户正在单击 second/third/etc。 time 和 onClick 方法正在获取中间相机位置。因此,缩放行为在不同情况下会有所不同。
因为不想把动画时长设置为0,所以一直在想可以做一个变量来保存这个点击次数(上面的代码中有注释),但是并不是正确的方式,所以我卡住了
您在地图框架中是否有停止当前动画(例如移动)的选项?
如果你有那么就在点击方法的开头调用它
如果不是那么恕我直言,这是引入一些变量 lastClicked = System.currentTimeMillis()
并在 onClick
开头检查 if (System.currentTimeMillis() - lastClicked < 500) return
的正确解决方案
我觉得你的做法是对的。只需进行一些更改
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)
}
}
}
我的地图缩放按钮有一个监听器:
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.5s 用户正在单击 second/third/etc。 time 和 onClick 方法正在获取中间相机位置。因此,缩放行为在不同情况下会有所不同。
因为不想把动画时长设置为0,所以一直在想可以做一个变量来保存这个点击次数(上面的代码中有注释),但是并不是正确的方式,所以我卡住了
您在地图框架中是否有停止当前动画(例如移动)的选项?
如果你有那么就在点击方法的开头调用它
如果不是那么恕我直言,这是引入一些变量 lastClicked = System.currentTimeMillis()
并在 onClick
if (System.currentTimeMillis() - lastClicked < 500) return
的正确解决方案
我觉得你的做法是对的。只需进行一些更改
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)
}
}
}