Я не могу найти более раннюю версию OpenLayers, в которой ZoomSlider работает так, как вы описали.
Одним из обходных путей было бы установить очень малый коэффициент масштабирования вида, чтобы создать гораздо больше уровней масштабирования и задать дельта-параметры при масштабировании.Кнопки управления и взаимодействия соответственно велики, поэтому они продолжают работать при нормальных уровнях масштабирования.
например, чтобы разделить каждый нормальный уровень масштабирования на 100 уровней масштабирования:
var zoomFactorDelta = 100;
var map = new ol.Map({
target: 'map',
layers: [
new ol.layer.Tile({
source: new ol.source.OSM()
})
],
controls: ol.control.defaults({
zoomOptions: { delta: zoomFactorDelta }
}).extend([
new ol.control.ZoomSlider()
]),
interactions: ol.interaction.defaults({
zoomDelta: zoomFactorDelta
}),
keyboardEventTarget: document,
view: new ol.View({
center: ol.proj.fromLonLat( [8, 50] ),
zoomFactor: Math.pow(2,1/zoomFactorDelta),
zoom: 10 * zoomFactorDelta,
maxZoom: 20 * zoomFactorDelta
})
});
Однако, пока настройка zoomDelta работаетКак и ожидалось для масштабирования с помощью клавиатуры и двойного щелчка, оно не оказывает никакого влияния на масштабирование колесика мыши (несмотря на описание в документации «Дельта уровня масштабирования при использовании клавиатуры или масштабирования колесика мыши»), делая масштабирование колесика мыши в 100 раз медленнее, чем раньше.Альтернатива, которая поддерживает масштабирование с помощью колесика мыши с нормальной скоростью, состоит в том, чтобы переопределить функцию restinResolution представления, чтобы умножить дельта-параметр по умолчанию:
var zoomFactorDelta = 100;
var map = new ol.Map({
target: 'map',
layers: [
new ol.layer.Tile({
source: new ol.source.OSM()
})
],
controls: ol.control.defaults().extend([
new ol.control.ZoomSlider()
]),
keyboardEventTarget: document,
view: new ol.View({
center: ol.proj.fromLonLat( [8, 50] ),
zoomFactor: Math.pow(2,1/zoomFactorDelta),
zoom: 10 * zoomFactorDelta,
maxZoom: 20 * zoomFactorDelta
})
});
var view = map.getView();
var defaultConstrainResolution = view.constrainResolution.bind(view);
view.constrainResolution = function(resolution, delta, direction) {
return defaultConstrainResolution(resolution, delta*zoomFactorDelta, direction)
};
Этот обходной путь, использующий только переопределение функции constrainResolution, также работает, но может иметьпобочные эффекты в других местах:
var map = new ol.Map({
target: 'map',
layers: [
new ol.layer.Tile({
source: new ol.source.OSM()
})
],
controls: ol.control.defaults().extend([
new ol.control.ZoomSlider()
]),
keyboardEventTarget: document,
view: new ol.View({
center: ol.proj.fromLonLat( [8, 50] ),
zoom: 10
})
});
var view = map.getView();
var defaultConstrainResolution = view.constrainResolution.bind(view);
view.constrainResolution = function(resolution, delta, direction) {
return Math.abs(delta) > 0 ? defaultConstrainResolution(resolution, delta, direction)
: resolution;
};