Клуб API Карт

Вопрос по StepwisePane

Пост в архиве.

Хочу прикрутить FlashCanvas для недобраузера.

Делаю контрол, который будет лежать поверх всей видимой области карты (+ немного больше, чтобы не перерисовывать полностью при каждом движении), отслеживать движение карты и отрисовывать канвас.

для гугла все как-то просто получилось. если интересно - откройте http://maps.1cs.su/dev/index.html?mode=6 . Канвас - с пролупрозрачной подложкой для наглядности.

для недобраузера показываем FlashCanvas (от ie7), для продвинутых рисуем в HTML5.

с ymaps посложнее. 

 

// создаем pane
this.pane = new ymaps.pane.movable.StepwisePane(this.map,  {className: 'ymaps-nolan-canvases', zIndex: 200});
// вешаем обработчик события
map.events.add('boundschange', function(evt) {
                    self._draw.call(self);
                });
// создаем канвасик
 this.layout = document.createElement('canvas');
$(this.layout).
         css( {'position' :'absolute',  zIndex : 200}).
         appendTo(this.pane.getElement());
// отрисовка
_draw: function() {
  var bounds = this.pane.getViewport(),
        c1 = this.pane.fromClientPixels(bounds[0]),
        c2 = this.pane.fromClientPixels(bounds[1]),
        zoom = this.pane.getZoom(),
        width = bounds[1][0] - bounds[0][0],
        height = bounds[1][1] - bounds[0][1];
$(this.layout).css( { left: bounds[0][0] + 'px',
        top: bounds[0][1] + 'px',
        width : width+'px',
        heigth:  height +'px'
 });
this.layout.width = width;
this.layout.heigth =  height;
this.controller.model.renderMapCanvas(this.layout, globalBounds, zoom);

 

канвас отрисовывается правильно. если поводить мышкой, то хотспоты на месте, pane.getViewport() отдает вроде бы правильные координаты, но вот размер и положение самой "сковороды" для меня загадка. 

что же все-таки такое pane.getViewport() ?

спасибо за ответ.

14 комментариев

и сразу еще вопрос. как остлеживать touch-евенты? 

Пока вам никто не ответил, предлагаю посмотреть презентацию и видео доклада «API 2.0 для touch-устройств» Сергея Константинова, руководителя группы разработки алгоритмов API Яндекс.Карт. Возможно, будет полезно или хотя бы интересно :-)
Дмитрий Сухоносов
28 января 2016, 04:26

для 1.0 я делал дополнительный layout в виде canvas - отслеживать все события там было очень просто, возможно на 2.0 тоже будет удобнее использовать слой, а не контрол

Sergey Konstantinov
28 января 2016, 04:26

Не понял из текста в чем состоит проблема. Можно подробнее, а лучше с ссылкой на страницу? На вид вроде бы всё правильно.

сори, вот http://maps.1cs.su/dev/index.html?mode=5

канвас голубенький )

Sergey Konstantinov
28 января 2016, 04:26
Вы перерисовываете canvas по boundschange. Это неправильно, нужно перерисовывать по viewportchange/zoomchange от своего pane.
Sergey Konstantinov
28 января 2016, 04:26

Про тач-события: одиночные тачи транслируются в mouse(down|move|up), множественные - в multitouch(start|move|end)

то есть получить событие touchstart не получится?

Sergey Konstantinov
28 января 2016, 04:26
А вам нужно отличать его от mousedown?

хм... наверное можно обойтись и click.

viewport это размер видимой области с добавлением неких маржинов(256 во все стороны) - те он может не совпадать с границами карты.

И задается он в локальных пикселях пейна.

Позиционировать твой канвасик надо именно в них.

Но вообще - fromClientPixels ты и забыл.

 

я ничего не понял (((

как позиционировать канвас?

 

также как ты это делаешь сейчас.

Вопрос в размерах.

упс... была ошибка в названии переменной o_O

все работает, спасибо