Custom Interactions——自定义交互式控件


This example demonstrates creating a custom interaction by subclassingol.interaction.Pointer. Note that the built in interactionol.interaction.Translate might be a better option for moving features.
这个例子用来演示通过ol.interaction.Pointer子类来创建一个自定义交互式控件。注意内嵌的ol.interaction.Translate交互控件也许是一个移动要素的更好选择。

代码:
<!DOCTYPE html>
<html>
  <head>
    <title>Custom Interactions</title>
    <link rel="stylesheet" href="https://openlayers.org/en/v4.2.0/css/ol.css" type="text/css">
    <!-- The line below is only needed for old environments like Internet Explorer and Android 4.x -->
    <script src="https://cdn.polyfill.io/v2/polyfill.min.js?features=requestAnimationFrame,Element.prototype.classList,URL"></script>
    <script src="https://openlayers.org/en/v4.2.0/build/ol.js"></script>
  </head>
  <body>
    <div id="map" class="map"></div>
    <script>
      /**
       * Define a namespace for the application.
       * 为应用定义一个命名空间
       */
      var app = {};


      /**
       * @constructor
       * 构造函数
       * @extends {ol.interaction.Pointer}
       */
      app.Drag = function() {

        ol.interaction.Pointer.call(this, {
          handleDownEvent: app.Drag.prototype.handleDownEvent,
          handleDragEvent: app.Drag.prototype.handleDragEvent,
          handleMoveEvent: app.Drag.prototype.handleMoveEvent,
          handleUpEvent: app.Drag.prototype.handleUpEvent
        });

        /**
         * @type {ol.Pixel}
         * @private
         */
        this.coordinate_ = null;

        /**
         * @type {string|undefined}
         * @private
         */
        this.cursor_ = 'pointer';

        /**
         * @type {ol.Feature}
         * @private
         */
        this.feature_ = null;

        /**
         * @type {string|undefined}
         * @private
         */
        this.previousCursor_ = undefined;

      };
      // 从ol.interaction.Pointer继承原型构造方法
      ol.inherits(app.Drag, ol.interaction.Pointer);


      /**
       * @param {ol.MapBrowserEvent} evt Map browser event.
       * @return {boolean} `true` to start the drag sequence.
       */
      // 为原型添加handleDownEvent事件
      app.Drag.prototype.handleDownEvent = function(evt) {
        var map = evt.map;

        var feature = map.forEachFeatureAtPixel(evt.pixel,
            function(feature) {
              return feature;
            });

        if (feature) {
          this.coordinate_ = evt.coordinate;
          this.feature_ = feature;
        }

        return !!feature;
      };


      /**
       * @param {ol.MapBrowserEvent} evt Map browser event.
       */
      // 为原型添加handleDragEvent事件
app.Drag.prototype.handleDragEvent = function(evt) { var deltaX = evt.coordinate[0] - this.coordinate_[0]; var deltaY = evt.coordinate[1] - this.coordinate_[1]; var geometry = /** @type {ol.geom.SimpleGeometry} */ (this.feature_.getGeometry()); geometry.translate(deltaX, deltaY); this.coordinate_[0] = evt.coordinate[0]; this.coordinate_[1] = evt.coordinate[1]; }; /** * @param {ol.MapBrowserEvent} evt Event. */ // 为原型添加handleMoveEvent事件
app.Drag.prototype.handleMoveEvent = function(evt) { if (this.cursor_) { var map = evt.map; var feature = map.forEachFeatureAtPixel(evt.pixel, function(feature) { return feature; }); var element = evt.map.getTargetElement(); if (feature) { if (element.style.cursor != this.cursor_) { this.previousCursor_ = element.style.cursor; element.style.cursor = this.cursor_; } } else if (this.previousCursor_ !== undefined) { element.style.cursor = this.previousCursor_; this.previousCursor_ = undefined; } } }; /** * @return {boolean} `false` to stop the drag sequence. */ // 为原型添加handleUpEvent事件
app.Drag.prototype.handleUpEvent = function() { this.coordinate_ = null; this.feature_ = null; return false; }; // 创建点要素 var pointFeature = new ol.Feature(new ol.geom.Point([0, 0])); // 创建线要素 var lineFeature = new ol.Feature( new ol.geom.LineString([[-1e7, 1e6], [-1e6, 3e6]])); // 创建面要素 var polygonFeature = new ol.Feature( new ol.geom.Polygon([[[-3e6, -1e6], [-3e6, 1e6], [-1e6, 1e6], [-1e6, -1e6], [-3e6, -1e6]]])); var map = new ol.Map({ // 将自定义的Drag交互控件添加到map中
interactions: ol.interaction.defaults().extend([new app.Drag()]), layers: [ new ol.layer.Tile({ source: new ol.source.TileJSON({ url: 'https://api.tiles.mapbox.com/v3/mapbox.geography-class.json?secure' }) }), new ol.layer.Vector({ source: new ol.source.Vector({ features: [pointFeature, lineFeature, polygonFeature] }), style: new ol.style.Style({ image: new ol.style.Icon(/** @type {olx.style.IconOptions} */ ({ anchor: [0.5, 46], anchorXUnits: 'fraction', anchorYUnits: 'pixels', opacity: 0.95, src: 'https://openlayers.org/en/v4.2.0/examples/data/icon.png' })), stroke: new ol.style.Stroke({ width: 3, color: [255, 0, 0, 1] }), fill: new ol.style.Fill({ color: [0, 0, 255, 0.6] }) }) }) ], target: 'map', view: new ol.View({ center: [0, 0], zoom: 2 }) }); </script> </body></html>



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值