Ol3中Map事件全解析

本文将粗略对ol3 基本地图事件进行研究。


地图点击事件

singleclick:地图单击事件。
dblclick:地图双击事件。
click:地图点击事件。

测试

    map.on('singleclick',function(e){console.log('地图被单击了!');});map.on('dblclick',function(e){console.log('地图被双击了!');});map.on('click',function(e){console.log('地图被点击了!');});

第一步,双击了地图。第二部,单击了地图。

打印结果如上。

总结

1 地图双击,实际上是连续click地图2下。所以click触发了两次,dblclick事件触发了一次。
2 地图单击,实际是click地图1下。所以click触发一次,singleclick事件触发一次。
3 无论单击,还是双击事件,必定先触发click事件。只不过双击触发两次,单击触发一次。

鼠标事件

pointerdrag:鼠标拖拽事件。
pointermove:鼠标移动事件。

测试

map.on('pointerdrag',function(e){console.log('鼠标拖拽了!');});map.on('pointermove',function(e){console.log('鼠标移动了!');});

在地图上光标移动,然后按下鼠标左键,拖动地图。

总结

实际操作中,pointermove很像是mousemove事件,但他们之间并不是一回事。在移动触屏设备中,pointermove是当地图panned之后触发,性质相当于web页面上moveend之后的意思。
pointerdrag是鼠标按下pan地图时触发。在拖拽地图时,pointermove事件也会触发。部分功能类似一般地图的’moving’事件。

地图渲染事件

postcompose:地图渲染中。
precompose:准备渲染,未渲染。
postrender:渲染全部结束。

//进行渲染map.on('postcompose',function(e){console.log('postcompose!');});//渲染全部完成map.on('postrender',function(e){console.log('postrender!');});//准备渲染,未开始渲染map.on('precompose',function(e){console.log('precompose!');});

地图初始化,进行渲染,查看渲染流程如下:

整个地图渲染流程是 precompose>postcompose>postrender。
分别对应渲染前,渲染中,渲染结束事件。

地图移动事件

moveend:地图移动结束发生,没什么好说的。

复杂的change事件

change:layerGroup :地图图层增删时触发。
change:size :地图窗口发生变化就会触发,与我们常用的窗口resize接近。
change:target :地图绑定的div发生更改时触发,如map.setTartget方法就会触发该事件。
change:view :地图view对象发生变化触发。
propertychange: Map对象中任意的property值改变时触发。
change:博主也懂。

     map.on('change:size',function(e){console.log('size改变!');});map.on('change:view',function(e){console.log('view改变!');});map.on('change:target',function(e){console.log('target改变!');});map.on('propertychange',function(e){console.log('property改变!');});map.setTarget('map1');var view =new ol.View({center: mapcenter,zoom: 5});map.setView(view);

实验是我new了一个正常的map地图,监听如上事件,然后setTarget,再setView。结果如下:

解析:size是在地图窗口发生变化时触发,如网页的最大化最小化就会触发。在setTarget时,由于地图窗口绑定了别的div,也触发了size改变事件。

总结

1 当target发生改变时,会触发change:size,change:target,propeyterchange事件。
2 当地图div大小发生变化会更改时,触发size,propeyterchange事件。
3 当地图view发生改变时,触发view,propeyterchange事件。
4 layergroup没测试,同理推论当地图图层改变时,触发change:layergroup,propeyterchange事件。
综述:Map对象任意对象发生改变,都会触发propeyterchange事件。target事件触发,也会触发size事件。

事件拓展

Map中提供了一些列事件,Map是由View组成的,View事件如下:


一般地图api中,我们会发现moving,moveend,zoom,zoomend事件,但是查看api我么只发现了moveend事件,难道ol3的事件当真是看了点皮毛就到处喷的自以为专家的初学者所描述的那样不成熟或不能用吗?
下面我们抛砖引玉,讨论如何结合Map和View事件实现3的这些事件。

var view=map.getView();var zoom=view.getZoom();view.on('change:resolution',function(e){console.log('zoom了');});view.on('change:center',function(e){console.log('moveing了');});map.on('moveend',function(e){console.log('moveend了');if(view.getZoom()!==zoom)console.log('zomeend了,change:zoom了');});

先移动了地图,再缩放了地图。
效果如下图:

总结:移动时,一直触发moving事件。移动结束触发moveend事件。
缩放时,触发了zoom事件,缩放触发moveend事件(地图范围改变了),根据moveend判断zoom改变,自定义实现zoom改变或者结束事件。
大家再也不用担心ol3事件了!

Ol3中Map事件全解析相关推荐

  1. IAR中map文件全解析

    推荐 分享一个大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到人工智能的队伍中来!http://www.captainbed.net/strongerhuang 推荐在我的公 ...

  2. Java中的泛型全解析(二)

    Java中的泛型全解析(一) 泛型中的约束和局限性 现在我们有泛型类 不能用基本类型实例化类型参数 运行时类型查询只适用于原始类型 泛型类的静态上下文中类型变量失效 不能在静态域或方法中引用类型变量. ...

  3. Java中的泛型全解析(一)

    为什么我们需要泛型? 通过两段代码我们就可以知道为何我们需要泛型 实际开发中,经常有数值类型求和的需求,例如实现int类型的加法, 有时候还需要实现long类型的求和, 如果还需要double类型的求 ...

  4. IAR分析内存重要的神器 - map文件全解析

    " 对于使用RTOS进行项目开发的朋友可能会有这样的疑惑,我创建的任务到底需要多大的堆栈空间才够呢? 其实,除了使用RTOS开发,就是使用裸机进行开发的朋友同样也会遇到类似的问题,有些地方需 ...

  5. apollo配置中心源码全解析

    文章目录 前言 源码解析 与springboot集成 远程配置的加载 长轮询监听配置更改 服务端长轮询机制 通过客户端发布配置 总结 前言 紧接前文nacos配置中心,本文继续讲目前比较火热的动态配置 ...

  6. Keil综合(03)map文件全解析

    相关标题:Keil map文件 内存分布文件 0.写在前面 相信有较大项目开发经验的朋友都曾遇到内存溢出的问题,那么大家都是如何分析这类问题的呢?大家遇到HardFault_Handler 有对map ...

  7. android中的动画全解析

    Android为我们提供了2中动画 一: Tween Animation 渐变动画 通过对特定对象做图像的变换,例如: 平移, 缩放,旋转, 淡入淡出 等. 二: Frame Animation 帧动 ...

  8. java8 中的 Collectors 全解析

    1. 前言 相关的文章中提到了 Collectors .相信很多同学对这个比较感兴趣,那我们今天就来研究一下 Collectors . 2. Collectors 的作用 Collectors 是 J ...

  9. 史上最全的集合框架讲解 ----- Java 集合框架(3)---- Map 相关类最全解析

    引言 好了,步入正题,上篇文章Java 集合框架(2)---- List 相关类解析中我们一起看了一下 List 接口的相关具体类(ArrayList.LinkedList-.),这篇开始我们开始探索 ...

最新文章

  1. Android之修改app名字客户需要升级需要注意的问题
  2. 为Jersey 2.19创建共享库以与Weblogic 12.1.3一起使用
  3. mysql双机热备 配置文件,MYSQL 双机热备配置手册()
  4. 一颗接一颗的飞鸽传书
  5. Skywalking-03:Skywalking本地调试
  6. 删除顺序表中指定值的所有元素(C++,vector)
  7. 学习 | Spring Cloud Config 从入门到精通
  8. 5_python基础—条件语句(三目运算符)
  9. 机器学习(1)---数据预处理
  10. bat批处理更改文件后缀/挑出两个文件夹下不同名的文件
  11. 关于AAARR模型,还停留在理论却不会用?附实例讲解
  12. Floppy Zip Disk Rescue注册码分析
  13. 启动另一个Activity、Service、应用程序
  14. powershell局域网内同步文件夹,文件脚本
  15. DEVC++下载与环境配置,手把手教程
  16. 论文 | 科研软件 —— SPSS Statistics V26.0安装及注册教程
  17. 身份证上传尺寸太大如何缩小?改照片尺寸的简单方法
  18. 【无线电】无线电频谱和波段划分
  19. 群晖 重启 mysql_群晖nas修改MariaDB配置文件
  20. 2020年8月4日王者服务器维修,2020年8月4日小鸡正确的答案

热门文章

  1. 人人都是极客半月刊:第 3 期
  2. vc.60写c语言,悟空问答如何用VC60编写简单的APP
  3. Oracle Net Services 配置失败。退出代码是1 参数responsefile = Oracle Net Configuration Assistant 在给定位置找不到响应文件。
  4. 用Jplayer做的一个带动画的播放器
  5. EI会议论文的格式要求
  6. java-net-php-python-jsp学生社团信息演示录像2019计算机毕业设计程序
  7. python网络安全协议_如果你不遵守Python中TCP和UDP等网络编程协议!那么你会自食其果...
  8. 如何给Word重新排页码
  9. Android NFC详解(高级)
  10. 中国大陆手机号码如何注册谷歌账号?解决手机收不到验证码