【问题标题】:How to make a button click cumulative?如何使按钮点击累积?
【发布时间】:2021-04-22 10:13:14
【问题描述】:

我的地图缩放按钮有一个监听器:

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 方法正在获取中间相机位置。因此,缩放的行为在不同的情况下会有所不同。

因为我不想将动画持续时间设置为零,所以我一直在想我可以做一个变量来保存这个点击计数(在上面的代码中有注释),但这不是正确的方法,所以我卡住了

【问题讨论】:

    标签: android kotlin yandex-mapkit


    【解决方案1】:

    我认为你的方法是正确的。只需进行一些更改

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

    【讨论】:

      【解决方案2】:

      您在地图框架中是否有任何选项可以停止当前动画(例如移动)?

      如果你在点击方法开始时调用它

      如果不是,那么恕我直言,这是引入一些变量lastClicked = System.currentTimeMillis() 并在onClick 开头检查if (System.currentTimeMillis() - lastClicked < 500) return 的正确解决方案

      【讨论】:

      • 我想这个解决方案会有点忽略多次点击,比如如果我点击三下它只会缩放一次,但我需要它一致地缩放三倍:(
      • 好吧,作为替代方案,您可以累积点击次数,而最后一次 onClick 中调用的相同代码/方法)。请注意,当用户单击 10 次时,这可能会导致用户体验不佳,并且必须等待 5 秒才能完成缩放
      • 也许您可以为move 方法保存创建的Animation 对象并取消它?
      猜你喜欢
      • 2022-01-17
      • 2016-07-10
      • 1970-01-01
      • 1970-01-01
      • 2020-05-11
      • 1970-01-01
      • 2019-09-21
      • 2017-08-08
      • 1970-01-01
      相关资源
      最近更新 更多