maplibre-gl
Version:
BSD licensed community fork of mapbox-gl, a WebGL interactive maps library
92 lines (76 loc) • 2.4 kB
text/typescript
import {TapRecognizer} from './tap_recognizer';
import type Point from '@mapbox/point-geometry';
import type Map from '../map';
export default class TapZoomHandler {
_enabled: boolean;
_active: boolean;
_zoomIn: TapRecognizer;
_zoomOut: TapRecognizer;
constructor() {
this._zoomIn = new TapRecognizer({
numTouches: 1,
numTaps: 2
});
this._zoomOut = new TapRecognizer({
numTouches: 2,
numTaps: 1
});
this.reset();
}
reset() {
this._active = false;
this._zoomIn.reset();
this._zoomOut.reset();
}
touchstart(e: TouchEvent, points: Array<Point>, mapTouches: Array<Touch>) {
this._zoomIn.touchstart(e, points, mapTouches);
this._zoomOut.touchstart(e, points, mapTouches);
}
touchmove(e: TouchEvent, points: Array<Point>, mapTouches: Array<Touch>) {
this._zoomIn.touchmove(e, points, mapTouches);
this._zoomOut.touchmove(e, points, mapTouches);
}
touchend(e: TouchEvent, points: Array<Point>, mapTouches: Array<Touch>) {
const zoomInPoint = this._zoomIn.touchend(e, points, mapTouches);
const zoomOutPoint = this._zoomOut.touchend(e, points, mapTouches);
if (zoomInPoint) {
this._active = true;
e.preventDefault();
setTimeout(() => this.reset(), 0);
return {
cameraAnimation: (map: Map) => map.easeTo({
duration: 300,
zoom: map.getZoom() + 1,
around: map.unproject(zoomInPoint)
}, {originalEvent: e})
};
} else if (zoomOutPoint) {
this._active = true;
e.preventDefault();
setTimeout(() => this.reset(), 0);
return {
cameraAnimation: (map: Map) => map.easeTo({
duration: 300,
zoom: map.getZoom() - 1,
around: map.unproject(zoomOutPoint)
}, {originalEvent: e})
};
}
}
touchcancel() {
this.reset();
}
enable() {
this._enabled = true;
}
disable() {
this._enabled = false;
this.reset();
}
isEnabled() {
return this._enabled;
}
isActive() {
return this._active;
}
}