【问题标题】:Why does calling leaflet's setZoom twice results on the second being ignored?为什么调用传单的 setZoom 两次导致第二次被忽略?
【发布时间】:2013-03-28 00:10:39
【问题描述】:

要重现此问题,您可以转到 http://leafletjs.com/ 并在 javascript 控制台中编写以下内容:

> map.getZoom()
15
> map.setZoom(10);map.setZoom(1);
Object
> map.getZoom()
10

我期待最终的 getZoom 返回1。为什么会这样? 该问题可能与缩放动画有关。如果在动画结束之前调用了 setZoom,它将被忽略。

我正在将传单与 emberjs 集成,并希望允许通过外部更改进行缩放更改。如果用户快速更改缩放,则效果不理想。

【问题讨论】:

    标签: javascript leaflet


    【解决方案1】:

    L.Map.setZoom 调用了L.Map.setView 调用了L.Map._animateZoomIfClose。 如果map._animatingZoom 为真,那么任何缩放都将停止。 map._animatingZoom 像寻找缩放动画一样工作:

    1. 检查L.Map._animateZoomIfClose 如果true 停止缩放,否则调用L.Map._animateZoom
    2. L.Map._animateZoom 处设置为true 并开始css 转换。
    3. 在 css 转换结束时设置为 false L.Map._onZoomTransitionEnd

    为什么是这样?我认为是因为很难打破 css 过渡工作。

    因此,如果您要禁用任何 css 转换和转换,您的代码必须能够正常工作。您还可以添加自己的扩展:如果map._animatingZoom === true 然后将您的操作放入数组中,当map._catchTransitionEnd 调用处理此并将您的操作从数组和处理中转移:

    if (L.DomUtil.TRANSITION) {
        L.Map.addInitHook(function () {
            L.DomEvent.on(this._mapPane, L.DomUtil.TRANSITION_END, function () {
                var zoom = this._zoomActions.shift();
                if (zoom !== undefined) {
                    this.setZoom(zoom);
                }
            }, this);
        });
    }
    
    L.Map.include(!L.DomUtil.TRANSITION ? {} : {
        _zoomActions: [],
        queueZoom: function (zoom) {
            if (map._animatingZoom) {
                this._zoomActions.push(zoom);
            } else {
                this.setZoom(zoom);
            }
        }
    });
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-13
    • 2021-11-25
    • 2015-12-24
    相关资源
    最近更新 更多