简体   繁体   English

这里 JavaScript API 3.0 - 如何实现可拖动标记

[英]Here JavaScript API 3.0 - How to implement a draggable marker

I would like to implement a draggable marker with the recently released JavaScript API 3.0.我想用最近发布的 JavaScript API 3.0 实现一个可拖动的标记。

Using the old API it was quite easy.使用旧的 API 很容易。 After setting the draggable attribute to true you were able to move the marker on the map around.将 draggable 属性设置为 true 后,您可以在地图上移动标记。

The migration guide for the new API 3.0 located [here][1] states that after enabling events on map objects and setting the 'draggable' property to 'true' the corresponding events have to be implemented.位于 [此处][1] 的新 API 3.0 迁移指南指出,在地图对象上启用事件并将“draggable”属性设置为“true”后,必须实现相应的事件。

marker.addEventListener('dragstart', function() {
//handle drag start here
});
marker.addEventListener('drag', function() {
//handle drag here
});
marker.addEventListener('dragend', function() {
//handle drag end here
});

I'm not sure how to implement this dragging functionality in the corresponding events though.不过,我不确定如何在相应的事件中实现这种拖动功能。 For sure the new location has to be calculated, but what would it look like so that the marker is moved according to the mouse position?当然必须计算新位置,但是根据鼠标位置移动标记会是什么样子? The following code snippet needs to be extended somehow ...以下代码片段需要以某种方式扩展......

marker.addEventListener('drag', function(evt) {
  var coord = map.screenToGeo(evt.currentPointer.viewportX,
            evt.currentPointer.viewportY);
  evt.target.setPosition( coord );
});

Thanks for your help, Seppal感谢您的帮助,塞帕尔

evt [1]: http://developer.here.com/documentation/download/maps_js_html5_nlp/3.0.5/Maps%20API%20for%20JavaScript%20v3.0.5%20Migration%20Guide.pdf "here" evt [1]: http : //developer.here.com/documentation/download/maps_js_html5_nlp/3.0.5/Maps%20API%20for%20JavaScript%20v3.0.5%20Migration%20Guide.pdf “这里”

A working example of creating draggable markers in the HERE Maps API for JavaScript 3.0 can be found in the Find the nearest marker example.可以在查找最近的标记示例中找到在HERE Maps API for JavaScript 3.0中创建可拖动标记的工作示例。 There are three parts to setting it up.设置它分为三个部分。

  • Firstly set marker.draggable = true so it can receive drag events首先设置marker.draggable = true以便它可以接收drag事件

    marker = new H.map.Marker(...); marker.draggable = true; map.addObject(marker);
  • Secondly disable the default draggability of the underlying map ( ie the instance of H.mapevents.Behavior ) when starting to drag a marker object:其次在开始拖动标记对象时禁用底层地图(H.mapevents.Behavior的实例)的H.mapevents.Behavior拖动能力:

     map.addEventListener('dragstart', function(ev) { var target = ev.target; if (target instanceof H.map.Marker) { behavior.disable(); } }, false); map.addEventListener('dragend', function(ev) { var target = ev.target; if (target instanceof mapsjs.map.Marker) { behavior.enable(); } }, false);
  • Thirdly listener to the drag event, and update the marker using setPosition()第三个监听drag事件,并使用setPosition()更新标记

    map.addEventListener('drag', function(ev) { var target = ev.target, pointer = ev.currentPointer; if (target instanceof mapsjs.map.Marker) { target.setPosition(map.screenToGeo(pointer.viewportX, pointer.viewportY)); } }, false);

The code above wouldn't work with draggable DOM markers so the final changes are:上面的代码不适用于可拖动的 DOM 标记,因此最终更改是:

map.addEventListener('dragstart', function(ev) {
  var target = ev.target;
  if (target instanceof H.map.Marker || target instanceof H.map.DomMarker) {
    behavior.disable();
  }
}, false);

map.addEventListener('dragend', function(ev) {
  var target = ev.target;
  if (target instanceof H.map.Marker || target instanceof H.map.DomMarker) {
    behavior.enable();
  }
}, false);

map.addEventListener('drag', function(ev) {
  var target = ev.target,
      pointer = ev.currentPointer;
  if (target instanceof H.map.Marker || target instanceof H.map.DomMarker) {
    target.setPosition(map.screenToGeo(pointer.viewportX, pointer.viewportY));
  }
}, false);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM