Map类扩展方法之DoubleClickZoom
# 概述
Map.DoubleClickZoom
就是实现鼠标左键双击+shift
控制地图实现缩放
# 源码分析
# 源码实现
Map.DoubleClickZoom
源码实现如下:
Map.mergeOptions({
doubleClickZoom: true,
});
export var DoubleClickZoom = Handler.extend({
addHooks: function () {
this._map.on("dblclick", this._onDoubleClick, this);
},
removeHooks: function () {
this._map.off("dblclick", this._onDoubleClick, this);
},
_onDoubleClick: function (e) {
var map = this._map,
oldZoom = map.getZoom(),
delta = map.options.zoomDelta,
zoom = e.originalEvent.shiftKey ? oldZoom - delta : oldZoom + delta;
if (map.options.doubleClickZoom === "center") {
map.setZoom(zoom);
} else {
map.setZoomAround(e.containerPoint, zoom);
}
},
});
Map.addInitHook("addHandler", "doubleClickZoom", DoubleClickZoom);
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 源码详细分析
Map.DoubleClickZoom
是基于事件处理器Handle
基类实现的,其中就是定义了三个方法:钩子函数(addHooks
/removeHooks
)和_onDoubleClick
方法
# 钩子函数
addHooks
和removeHooks
是Handle
基类中的固定写法,分别在enable
和disable
中调用,用于添加和移除事件处理器。
在Map.DoubleClickZoom
钩子函数中,对map
实例注册(或解绑)的是双击dblclick
事件,回调是_onDoubleClick
方法
# _onDoubleClick
方法
_onDoubleClick
方法是Map.DoubleClickZoom
的核心方法,用于处理双击事件,接受一个e
参数,该参数是鼠标事件对象。
在_onDoubleClick
方法中,首先获取当前地图实例map
和缩放级别oldZoom
,然后获取缩放增量delta
(默认为1
)和缩放级别zoom
。
如果按下了shift
键,则缩放级别为oldZoom - delta
,缩小地图,否则缩放级别为oldZoom + delta
,放大地图。
如果map.options.doubleClickZoom
为center
,则调用map.setZoom(zoom)
方法将地图缩放到指定的缩放级别。
否则,调用map.setZoomAround(e.containerPoint, zoom)
方法将地图缩放到指定的缩放级别,并以鼠标点击的容器点为中心。
# 总结
Map.DoubleClickZoom
是通过继承Handler
类,实现了双击缩放的核心交互逻辑,通过Map.mergeOption
设置默认开启双击缩放处理器,再调用Map.addInitHook
方法将处理器添加到Map
实例中,从而实现地图初始化时执行DoubleClickZoom
的enable
方法。