为地图添加动画图标

一、代码

css部分

页面主题内外边距设置为零,map容器使用绝对定位,width 100占满页面。

body { margin:0; padding:0; }
#map { position:absolute; top:0; bottom:0; width:100%; }

body部分

 <div id='map'></div>

js部分

1、创建一个pulsingDot对象,后续将作为map.addImage的第二个参数。

对象参数:width,height,data(绘图数据,由context.getImageData()获得),context(canvas对象,用于绘图)。

对象方法:

        onAdd():调用一次,负责创建一个canvas对象(context)给pulsingDot。

        render():在mapbox中被循环调用,根据t参数的不同,每次调用生成的绘图数据(data)也不同。返回true,通知mapbox image被更新。

var pulsingDot = {
    // pulsingDot对象属性
    width: size,
    height: size,
    data: new Uint8Array(size * size * 4),
	
    // onAdd方法,在addImage中被调用一次,创建一个画布对象赋值给pilsingDot.context。
    onAdd: function() {
        var canvas = document.createElement('canvas');
        canvas.width = this.width;
        canvas.height = this.height;
        this.context = canvas.getContext('2d');
    },
    
    // reder方法,在addImage后被循环调用。
    render: function() {
        // t是函数变量,由于是通过当前事件生成的,每次调用时值均不同。
        var duration = 1000;
        var t = (performance.now() % duration) / duration;
		
        // 设置内圆半径,外圆半径,获取到初始化(onAdd)时创建的画布对象。
        var radius = size / 2 * 0.3;
        var outerRadius = size / 2 * 0.7 * t + radius;
        var context = this.context;
        
        // 使用t变量绘图,分外圆和内圆两部分
        // draw outer circle
        context.clearRect(0, 0, this.width, this.height);
        context.beginPath();
        context.arc(this.width / 2, this.height / 2, outerRadius, 0, Math.PI * 2);
        context.fillStyle = 'rgba(255, 200, 200,' + (1 - t) + ')';
        context.fill();

        // draw inner circle
        context.beginPath();
        context.arc(this.width / 2, this.height / 2, radius, 0, Math.PI * 2);
        context.fillStyle = 'rgba(255, 100, 100, 1)';
        context.strokeStyle = 'white';
        context.lineWidth = 2 + 4 * (1 - t);
        context.fill();
        context.stroke();
        
        // 绘制完毕后,将绘图数据通过getImageData获取,赋值给pulsingDot.data
        // update this image's data with data from the canvas
        this.data = context.getImageData(0, 0, this.width, this.height).data;
        
        // 使用该方法使地图重新绘制
        // keep the map repainting
        map.triggerRepaint();

        // return `true` to let the map know that the image was updated
        return true;
    }
};

2、主函数,将pulsingDot对象以image的形式加载到地图上。 

map.on('load', function () {
    // 将这个封装了绘制动图方法的对象pulsingDot传入,使用addImage方法加载到地图上。
    map.addImage('pulsing-dot', pulsingDot, { pixelRatio: 2 });
    // 将map渲染到地图上,使用image(pulsing-dot)和一个feature(Point)。
    map.addLayer({
        "id": "points",
        "type": "symbol",
        "source": {
            "type": "geojson",
            "data": {
                "type": "FeatureCollection",
                "features": [{
                    "type": "Feature",
                    "geometry": {
                        "type": "Point",
                        "coordinates": [0, 0]
                    }
                }]
            }
        },
        "layout": {
            "icon-image": "pulsing-dot"
        }
    });
});

二、学习总结

1、map.addLayer(layer,beforeId?)

向map中添加图层。

参数:

layer(必选) 需添加的样式图层,style规范中有详细解释。http://www.mapbox.cn/mapbox-gl-js/style-spec/#layers​​​​​​​b

beforeId(可选) 渲染在哪个图层之上。

在本案例中使用情况如下:

    map.addLayer({
		// 独一无二的Layer名字(必选)
        "id": "points",
		// one of "fill", "line", "symbol", "circle", "heatmap", "fill-extrusion", 
        "raster", "hillshade", "background"(必选)
		// fill: 带有可选的边框的填充多边形
		// circle: 一个填充的实心圆
		// symbol: 图标或文本
        "type": "symbol",
		// 源 定义该图层的描述信息 可在外部定义 使用id链接到这里 source Style规范见 
        // http://www.mapbox.cn/mapbox-gl-js/style-spec/#sources
        "source": {
			// 源的类型
            "type": "geojson",
			// 源的数据
            "data": {
                "type": "FeatureCollection",
                "features": [{
                    "type": "Feature",
                    "geometry": {
                        "type": "Point",
                        "coordinates": [0, 0]
                    }
                }]
            }
        },
		// 布局设计属性
        "layout": {
            "icon-image": "pulsing-dot"
        }
    });

2、map.addImage(id, image, option)

向map中添加image

参数:

id(必选) Image独一无二的名字

image(必选) 

image((HTMLImageElement | ImageBitmap | ImageData | {width: number, height: number, data: (Uint8Array | Uint8ClampedArray)} | StyleImageInterface))The image as an HTMLImageElement , ImageData , ImageBitmap or object with width , height , and data properties with the same format as ImageData .

options((Object | null))(default {})Options object.(可选)

本案例中,使用{width: number, height: number, data: (Uint8Array | Uint8ClampedArray)} | StyleImageInterface))},并且多了onAdd(),render()两个方法。

// 该对象由width,height,data(Uint8Array)构成
var pulsingDot = {
    width: size,
    height: size,
    data: new Uint8Array(size * size * 4),
	
    onAdd: function() {
        var canvas = document.createElement('canvas');
        canvas.width = this.width;
        canvas.height = this.height;
        this.context = canvas.getContext('2d');
    },

    render: function() {
        var duration = 1000;
        var t = (performance.now() % duration) / duration;
		
        var radius = size / 2 * 0.3;
        var outerRadius = size / 2 * 0.7 * t + radius;
        var context = this.context;

        // draw outer circle
        context.clearRect(0, 0, this.width, this.height);
        context.beginPath();
        context.arc(this.width / 2, this.height / 2, outerRadius, 0, Math.PI * 2);
        context.fillStyle = 'rgba(255, 200, 200,' + (1 - t) + ')';
        context.fill();

        // draw inner circle
        context.beginPath();
        context.arc(this.width / 2, this.height / 2, radius, 0, Math.PI * 2);
        context.fillStyle = 'rgba(255, 100, 100, 1)';
        context.strokeStyle = 'white';
        context.lineWidth = 2 + 4 * (1 - t);
        context.fill();
        context.stroke();

        // update this image's data with data from the canvas
        this.data = context.getImageData(0, 0, this.width, this.height).data;

        // keep the map repainting
        map.triggerRepaint();

        // return `true` to let the map know that the image was updated
        return true;
    }
};

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
百度地图iOS SDK v2.10.0 Sample共有23个Demo,每个Demo的说明如下: ------------------------------------------------------------------------------------- 一、 Demo名称:基本地图功能 文件名: MapViewBaseDemoViewController.mm 简介:创建一张百度地图并管理地图的生命周期 详述: (1)创建一张最简单的百度地图; (2)管理地图的生命周期,具体请参看代码部分的相关注释; ------------------------------------------------------------------------------------- 二、 Demo名称:多地图展示功能 文件名: MultiMapViewDemo.mm 简介:在一个页面中创建多个地图 详述: (1)在一个页面内创建多个相互独立的地图 (2)地图Logo位置变更,支持6个位置 ------------------------------------------------------------------------------------- 三、 Demo名称:图层展示功能 文件名: MapViewDemoViewController.mm 简介:展示普通图、卫星图、路况图和路况卫星图 详述: (1)详情请参考代码部分或官网开发指南相关章节; ------------------------------------------------------------------------------------- 四、 Demo名称:地图操作功能 文件名: MapViewControlDemoViewController.mm 简介:介绍平移和缩放地图,双指操作地图,监听地图点击事件 详述: (1)介绍地图缩放级别、旋转度和俯视度的get和set方法; (2)监听单击、双击和长按地图事件; (3)单击、双击或长按地图获取该点的经纬度坐标; (4)对地图显示内容进行截图; ------------------------------------------------------------------------------------- 五、 Demo名称:UI控制功能 文件名: MapViewUISettingDemoViewController.mm 简介:介绍开关手势功能和显示隐藏UI控件 详述: (1)地图操作开关:平移、缩放; (2)控件显示开关:显示/隐藏比例尺控件; (3)指南针位置控制:显示在地图左上角或者右上角(仅举例),开发者可据实际情况任意改变位置; (4)禁用所有手势:控制是否一并禁止所有手势。 (5)设置边界区域:给地图增加边界。地图可操作区域和控件显示,都被限制在地图设定的边界内; (6)您还可以参照开发文档控制比例尺的显示位置; ------------------------------------------------------------------------------------- 六、 Demo名称:定位功能 文件名: LocationDemoViewController.mm 简介:介绍定位图层的基本用法 详述: (1)介绍如何开始定位和停止定位; (2)默认定位的状态显示为普通态,v2.0.2版本开始提供定位的跟随态和罗盘态; (3)开发者可以自己修改icon_center_point.png和[email protected]资源修改默认的定位图标; (4)支持开发者自行定义精度圈边框和填充区域的颜色。 ------------------------------------------------------------------------------------- 七、 Demo名称:覆盖物功能 文件名: AnnotationDemoViewController.mm 简介:介绍使用SDK内置方法绘制点线面等几何图形和如何添加标注 详述: (1)内置覆盖物标签: a、使用内置方法绘制几何图形; b、通过BMKMapView的addOverlay接口添加一个覆盖物; c、开发者可以实现BMKMapViewDelegate中mapView:viewForOverlay;接口,提供要添加地图中的 标注的BMKOverlayView,开发者可以扩展此类丰富更多的功 (2)添加标注标签: a、给标注添加落下的动画效果,点击标注可弹出对话框,还可以拖拽标注; b、通过BMKMapView的addAn

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值