| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274 | (function (global, factory) {	typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :	typeof define === 'function' && define.amd ? define(factory) :	(global.FlashMarker = factory());}(this, (function () { 'use strict';/** * @author https://github.com/chengquan223 * @Date 2017-02-27 * */function CanvasLayer(options) {    this.options = options || {};    this.paneName = this.options.paneName || 'labelPane';    this.zIndex = this.options.zIndex || 0;    this._map = options.map;    this._lastDrawTime = null;    this.show();}CanvasLayer.prototype = new BMap.Overlay();CanvasLayer.prototype.initialize = function (map) {    this._map = map;    var canvas = this.canvas = document.createElement('canvas');    var ctx = this.ctx = this.canvas.getContext('2d');    canvas.style.cssText = 'position:absolute;' + 'left:0;' + 'top:0;' + 'z-index:' + this.zIndex + ';';    this.adjustSize();    this.adjustRatio(ctx);    map.getPanes()[this.paneName].appendChild(canvas);    var that = this;    map.addEventListener('resize', function () {        that.adjustSize();        that._draw();    });    return this.canvas;};CanvasLayer.prototype.adjustSize = function () {    var size = this._map.getSize();    var canvas = this.canvas;    canvas.width = size.width;    canvas.height = size.height;    canvas.style.width = canvas.width + 'px';    canvas.style.height = canvas.height + 'px';};CanvasLayer.prototype.adjustRatio = function (ctx) {    var backingStore = ctx.backingStorePixelRatio || ctx.webkitBackingStorePixelRatio || ctx.mozBackingStorePixelRatio || ctx.msBackingStorePixelRatio || ctx.oBackingStorePixelRatio || ctx.backingStorePixelRatio || 1;    var pixelRatio = (window.devicePixelRatio || 1) / backingStore;    var canvasWidth = ctx.canvas.width;    var canvasHeight = ctx.canvas.height;    ctx.canvas.width = canvasWidth * pixelRatio;    ctx.canvas.height = canvasHeight * pixelRatio;    ctx.canvas.style.width = canvasWidth + 'px';    ctx.canvas.style.height = canvasHeight + 'px';    // console.log(ctx.canvas.height, canvasHeight);    ctx.scale(pixelRatio, pixelRatio);};CanvasLayer.prototype.draw = function () {    var self = this;    var args = arguments;    clearTimeout(self.timeoutID);    self.timeoutID = setTimeout(function () {        self._draw();    }, 15);};CanvasLayer.prototype._draw = function () {    var map = this._map;    var size = map.getSize();    var center = map.getCenter();    if (center) {        var pixel = map.pointToOverlayPixel(center);        this.canvas.style.left = pixel.x - size.width / 2 + 'px';        this.canvas.style.top = pixel.y - size.height / 2 + 'px';        this.dispatchEvent('draw');        this.options.update && this.options.update.call(this);    }};CanvasLayer.prototype.getContainer = function () {    return this.canvas;};CanvasLayer.prototype.show = function () {    if (!this.canvas) {        this._map.addOverlay(this);    }    this.canvas.style.display = 'block';};CanvasLayer.prototype.hide = function () {    this.canvas.style.display = 'none';    //this._map.removeOverlay(this);};CanvasLayer.prototype.setZIndex = function (zIndex) {    this.canvas.style.zIndex = zIndex;};CanvasLayer.prototype.getZIndex = function () {    return this.zIndex;};var global = typeof window === 'undefined' ? {} : window;var requestAnimationFrame = global.requestAnimationFrame || global.mozRequestAnimationFrame || global.webkitRequestAnimationFrame || global.msRequestAnimationFrame || function (callback) {    return global.setTimeout(callback, 1000 / 60);};function Marker(opts) {    this.city = opts.name;    this.location = new BMap.Point(opts.lnglat[0], opts.lnglat[1]);    this.color = opts.color;    this.type = opts.type || 'circle';    this.speed = opts.speed || 0.15;    this.size = 0;    this.max = opts.max || 20;}Marker.prototype.draw = function (context) {    context.save();    context.beginPath();    switch (this.type) {        case 'circle':            this._drawCircle(context);            break;        case 'ellipse':            this._drawEllipse(context);            break;        default:            break;    }    context.closePath();    context.restore();    this.size += this.speed;    if (this.size > this.max) {        this.size = 2;    }};Marker.prototype._drawCircle = function (context) {    var pixel = this.pixel || map.pointToPixel(this.location);    context.strokeStyle = this.color;    context.moveTo(pixel.x + pixel.size, pixel.y);    context.arc(pixel.x, pixel.y, this.size+1, 0, Math.PI * 2);    context.stroke();    context.beginPath()    context.fillStyle = this.color;    context.arc(pixel.x, pixel.y, 2, 0, Math.PI * 2);    context.fill(); };Marker.prototype._drawEllipse = function (context) {    var pixel = this.pixel || map.pointToPixel(this.location);    var x = pixel.x,        y = pixel.y,        w = this.size,        h = this.size / 2,        kappa = 0.5522848,    // control point offset horizontal    ox = w / 2 * kappa,    // control point offset vertical    oy = h / 2 * kappa,    // x-start    xs = x - w / 2,    // y-start    ys = y - h / 2,    // x-end    xe = x + w / 2,    // y-end    ye = y + h / 2;    context.strokeStyle = this.color;    context.moveTo(xs, y);    context.bezierCurveTo(xs, y - oy, x - ox, ys, x, ys);    context.bezierCurveTo(x + ox, ys, xe, y - oy, xe, y);    context.bezierCurveTo(xe, y + oy, x + ox, ye, x, ye);    context.bezierCurveTo(x - ox, ye, xs, y + oy, xs, y);    context.stroke();};function FlashMarker(map, dataSet) {    var animationLayer = null,        width = map.getSize().width,        height = map.getSize().height,        animationFlag = true,        markers = [];    var addMarker = function addMarker() {        if (markers.length > 0) return;        markers = [];        for (var i = 0; i < dataSet.length; i++) {            markers.push(new Marker(dataSet[i]));        }    };    //上层canvas渲染,动画效果    var render = function render() {        var animationCtx = animationLayer.canvas.getContext('2d');        if (!animationCtx) {            return;        }        if (!animationFlag) {            animationCtx.clearRect(0, 0, width, height);            return;        }        addMarker();        animationCtx.fillStyle = 'rgba(0,0,0,.85)';        var prev = animationCtx.globalCompositeOperation;        animationCtx.globalCompositeOperation = 'destination-in';        animationCtx.fillRect(0, 0, width, height);        animationCtx.globalCompositeOperation = prev;        for (var i = 0; i < markers.length; i++) {            var marker = markers[i];            marker.draw(animationCtx);        }    };    //鼠标事件    var mouseInteract = function mouseInteract() {        map.addEventListener('movestart', function () {            animationFlag = false;        });        map.addEventListener('moveend', function () {            animationFlag = true;            markers = []; //解决拖动后多余的小圆点bug,没想明白,暂时这样        });        map.addEventListener('zoomstart', function () {            animationFlag = false;        });        map.addEventListener('zoomend', function () {            animationFlag = true;            markers = [];        });    };    //初始化    var init = function init() {        animationLayer = new CanvasLayer({            map: map,            update: render        });        mouseInteract();        (function drawFrame() {            requestAnimationFrame(drawFrame);            render();        })();    };    init();}return FlashMarker;})));
 |