Jinuss's blog Jinuss's blog
首页
  • 源码合集

    • Leaflet源码分析
    • Openlayers源码合集
    • vue3源码
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • 学习
  • 实用技巧
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

东流

Web、WebGIS技术博客
首页
  • 源码合集

    • Leaflet源码分析
    • Openlayers源码合集
    • vue3源码
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • 学习
  • 实用技巧
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 框架

  • core模块

  • dom模块

  • control

  • geometry

  • geo

  • layer

  • Map

    • Map类
    • Map类扩展方法之BoxZoom
    • Map类扩展方法之DoubleClickZoom
      • 概述
      • 源码分析
        • 源码实现
        • 源码详细分析
        • 钩子函数
        • _onDoubleClick方法
      • 总结
    • Map类扩展方法之Drag
    • Map类扩展方法之Keyboard
    • Map类扩展方法之ScrollWheelZoom
    • Map类扩展方法之TapHold
    • Map类扩展方法之TouchZoom
  • 《Leaflet源码》笔记
  • Map
东流
2025-04-07
目录

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);
1
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方法。

编辑 (opens new window)
上次更新: 2025/04/11, 01:38:08
Map类扩展方法之BoxZoom
Map类扩展方法之Drag

← Map类扩展方法之BoxZoom Map类扩展方法之Drag→

最近更新
01
GeoJSON
05-08
02
Circle
04-15
03
CircleMarker
04-15
更多文章>
Theme by Vdoing | Copyright © 2024-2025 东流 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式