Подтвердить что ты не робот

Карты Google Отключить панорамирование пользователей во всех событиях

В моем приложении Google Maps у меня есть следующий метод, который следует за движущимся маркером. Когда это происходит, я хочу разрешить масштабирование всех обычных методов (dblclick, dblleftclick, mousewheel и touch events), и я хочу отключить панорамирование любого типа. Проблема в том, что при масштабировании с помощью мыши и dblclick карта становится подмеченной в положение мыши. Я могу полностью отключить все, но я хочу разрешить масштабирование. Я решил проблему mousewheel, используя плагин jquery mousewheel и используя дельту для изменения масштаба.

Есть ли какой-нибудь простой способ сделать это или мне нужно написать прослушиватель для всех событий касания и мыши?

ИЗМЕНИТЬ

Я уже отключил двойной клик, масштабирование и перетаскивание мышью, но я хочу, чтобы функция двойного щелчка все еще была там. Я также хочу, чтобы события касались там, но я хочу, чтобы они увеличивали масштаб от центра, а не от того, где произошло событие. Реальная проблема заключается в том, чтобы реплицировать события, которые уже обрабатываются google, но немного изменить функциональность

var options = {
    disableDoubleClickZoom: true,
    draggable: false,
    scrollwheel: false,
    panControl: false
};

this.map = new google.maps.Map(document.getElementById('map'), options);

Мое идеальное решение было бы, если бы существовала опция disableDoubleClickPan и disableScrollwheelPan или draggable, которая предотвращает все перетаскивания любого типа

ИЗМЕНИТЬ

Это для всех устройств, настольных и мобильных.

4b9b3361

Ответ 1

Я закончил с комбинацией вариантов. Во-первых, мне пришлось переопределить события на рабочем столе, которые привели к достижению моего достигнутого результата (касание, двойной щелчок, двойной щелчок левой кнопкой мыши и колесико мыши).

На сенсорном экране я остановил все обновления маркеров, когда было более двух касаний. это означало, что любое событие пинча не прыгало, когда работает зум.

На обычном веб-настольном устройстве я отключил события масштабирования и двойного щелчка на карте и переписал свои собственные обработчики событий.

Чтобы отличить между ними, я проверил событие ontouchstart в объекте window.

function setDraggable(draggable) {
    if ("ontouchend" in document) {
        return;
    }
    var options = {
        draggable: draggable, 
        panControl: draggable, 
        scrollwheel: draggable 
    };
    this.map.setOptions(options);
},

События zoom_changed или idle, где на самом деле не вариант по нескольким причинам:

  • Событие idle вызывается только тогда, когда карта неактивна, и с количеством анимации, которую я делал, это никогда не вызывалось.
  • Анимация на каждом шаге повторно размещала карту на последующих маркерах, поэтому событие zoom_changed вызывало бы обратный вызов перед кадром анимации.
  • из-за количества анимации идея не панорамирования в центр заключается в уменьшении кадров анимации и повышении производительности.

Ответ 2

Вот как я это сделал:

var options = {
    draggable: false,
    scrollwheel: false,
    panControl: false,
    maxZoom: Zoom,
    minZoom: Zoom,
    zoom: Zoom,
    center: latlng,
    mapTypeId: google.maps.MapTypeId.ROADMAP
};

Как вы можете видеть, установка maxZoom и minZoom в одно и то же значение помогает блокировать событие двойного щелчка пользователя.

Ответ 3

Хотя можно утверждать, что двойной щелчок по карте или масштабирование колес на карте не обязательно учитывает местоположение мыши (потому что вы действуете на объекте карты, а не на карте на карте) zoom всегда зависит от местоположения, потому что вы физически растягиваете или сквоируете карту вокруг местоположения. Чтобы изменить это поведение, было бы явно неинтуитивным.

В этом случае вы должны прослушивать zoom_changed или idle, а затем панорамировать карту до последнего, чтобы пользователь мог видеть, что происходит.

Вы даже можете использовать эти события для обработки поведения по умолчанию двойного щелчка или мыши, чтобы было очевидно, что вы меняете уровень контроля, который обычно имеет пользователь.