Handlers与Controls

Deadly 提交于 2020-04-05 15:46:26

本教程假设您已经阅读了Leaflet Class Theory
在leaflet中,
一个layer是跟随map移动的任何东西
与之相反,一个control是对于map容器相对静态的HTML元素(例如,缩放、全屏的按钮都是control);
一个handler是一段用来改变map操作的不可见代码

Handlers

Map Handler 是Leaflet 1.0中的一个新概念,其功能是处理来自浏览器的DOM事件(如click、dblclick或mousewheel)并改变map的状态(map状态改变一般使用setView、setZoom此类方法)。
Handler相对简单:它们只需要addHooks()方法(在map中handler是enable时addHooks就会加载)和removeHooks()方法(handler被disabled时removeHooks会触发)。handler框架:

L.CustomHandler = L.Handler.extend({
    addHooks: function() {
        L.DomEvent.on(document, 'eventname', this._doSomething, this);
    },
    removeHooks: function() {
        L.DomEvent.off(document, 'eventname', this._doSomething, this);
    },
    _doSomething: function(event) { … }
});
//用一个简单的handler来说明,当平移地图操作时,通过deviceorientation事件平移地图:

L.TiltHandler = L.Handler.extend({
    addHooks: function() {
        L.DomEvent.on(window, 'deviceorientation', this._tilt, this);
    },
    removeHooks: function() {
        L.DomEvent.off(window, 'deviceorientation', this._tilt, this);
    },
    _tilt: function(ev) {
        // Treat Gamma angle as horizontal pan (1 degree = 1 pixel) and Beta angle as vertical pan
        this._map.panBy( L.point( ev.gamma, ev.beta ) );
    }
});

一个Handler将使用map.addHandler(‘tilt’, L.TiltHandler)附加到map上-它将存储一个 L.TiltHandler实例命名为map.tilt,然而,更常见的将handler附加在map上的方法是使用addInitHook:

L.Map.addInitHook('addHandler', 'tilt', L.TiltHandler);

Handler可以被map.tilt.enable()启用,也可以被map.tilt.disable()禁掉。

根据event的类型,map handler程序可以将事件侦听器附加到文档、窗口或L.map的容器上。

你已经知道control了,在左上角的缩放控制,左下角的比例尺显示,右上角的图层切换。他们的核心是,一个L.Control是一个HTML元素在map容器里面是在静态位置上。
创建一个Control,简单继承L.Control,实现onAdd()和onRemove()即可。这些方法与L.Layer子类类似(无论何时control在map上加载移除时,这些方法将运行),除了onAdd()方法必须返回代表control的HTMLElement实例,向map中添加元素是自动完成的,删除它也是自动完成的。
用户自定义加水印的例子,只是一张图片:
 

L.Control.Watermark = L.Control.extend({
    onAdd: function(map) {
        var img = L.DomUtil.create('img');
        img.src = '../../docs/images/logo.png';
        img.style.width = '200px';
        return img;
    },
    onRemove: function(map) {
        // Nothing to do here
    }
});
L.control.watermark = function(opts) {
    return new L.Control.Watermark(opts);
}
L.control.watermark({ position: 'bottomleft' }).addTo(map);

如果自定义控件具有可单击按钮等交互式元素,请记住在onAdd()中使用L.DomEvent.on(),在onRemove()中使用L.DomEvent.off()。
如果自定义控件包含多个HTML元素(如L.Control.Zoom,它有两个按钮),您必须创建整个元素的层次结构,并返回最顶层的容器。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!