[MapEasy]浅析ListenerSupport

简介:

摘要:

      昨天在cresposhi关于昨天下午MapEasy QQ群中出现问题的说明里面看到了某些朋友对ListenerSupport的疑问.昨天刚好也爬完了代码,趁睡觉前对照cresposhi的MapEasy UML类图,稍微看了源代码,略有所得,暂且抛砖引玉,希望有更多的人可以理解并加入MapEasy团队,个人觉得GIS的前途无可限量.

 

1、什么是ListenerSupport?

      个人认为这个类的名字有点名不符实。因为这个类的作用是集合所有的Listener对象,并按不同的事件类型进行区分,比如drap,click等等。所以你可以直观的理解为这是个ListenerList。

      对象的收集涉及到新增(addListener、addFirstListener),删除(removeListener)这些基本操作。但是如果仅仅只有这些操作那并没有太大的意义。所以ListenerSupport还有自己的行为:触发listener集合中相关的listener的PropertyChange事件(firePropertyChange)。

     这样来说ListenerSupport更应该理解为Map的事件发布订阅中心,主管着map的所有动态变化。

2、MapEasy的运作流程(ListenerSupport如何起作用)?

    首先,先了解ListenerSupport对listener的存储形式。

    this.listeners是个数组的数组,每一个成员数组存放着相同类型的所有listener对象。比如:

    this.listeners["drap"]收集所有有关drap的listener对象.

    那么收集这些对象有什么用呢?是为了当指定事件发生之后,可以通知所有的监听对象,好让他们做出相应的动态变化.

    举个具体的例子来说明:

         1、理解Commond是ListenerSupport的一个代理类,通过exce方法来调用listenerSupport的fire事件。

2、查看底下的DragAction实例.

 
    
function DragAction(mapModel) {
    
    BaseAction.apply(this, new Array(mapModel));
    //~ Method
    /**
     * 构造函数
     */
    {
        // 注册 Command 对象的监听器
        command.addListener("drag", this);
    }
    this.propertyChange = function(param, newValue) {
        if (newValue != null && newValue[0] == this.model.getId()) {
            if (param == "drag") {
                var offset = newValue[1];
                if (offset.x != 0 && offset.y != 0) {
                    var centerCoord = this.model.getViewerCenterCoord();
                    newX = centerCoord.x - offset.x * MapModel.bound.getWidth() / (this.model.getZoom().getBorderTilesNum() * MapModel.tileSize);
                    newY = centerCoord.y + offset.y * MapModel.bound.getHeight() / (this.model.getZoom().getBorderTilesNum() * MapModel.tileSize);
                    var newCoord = new Coordinate(newX, newY);
                    if (!newCoord.same(centerCoord)) {
                        this.model.setViewerCenterCoord(newCoord);
                    }
                }
            }
        }
    }
}

    在构造函数里面,将本身的监听对象加入到了监听集合的drag分类里面(command.addListener("drag", this);),这个时候只要map触发drap事件,则listenerSupport会负责触发它集合里面的所有率属于drag类别的监听者,从而触发他们的propertChange事件,让他们根据参数newValue做出drag动作(即上述代码中的动作).

 

3、浪子语

      其实觉得关于这个问题并没有需要讨论的地方,只要自己稍微看看代码就可以明白其意图,不过看到有朋友有一定的困惑,而又在我力所能及的范围,所以罗嗦罗嗦的胡乱阐述一下。

分类: MapEasy, GIS技术


本文转自浪子博客园博客,原文链接:http://www.cnblogs.com/walkingboy/archive/2007/03/30/MapEasy_ListenerSupport.html,如需转载请自行联系原作者
相关文章
深入了解ln命令:创建硬链接和符号链接的实用指南
深入了解ln命令:创建硬链接和符号链接的实用指南
358 0
六、ArkTS 常用组件-按钮(Button)/切换按钮(Toggle)/文本输出(TextInput)
`Button` 组件是 HarmonyOS 应用开发中的基本组件之一,主要用于响应用户的点击操作。它支持两种使用方式:不包含子组件和包含子组件。不包含子组件时,`Button` 通过 `label` 属性设置按钮上的文字,同时提供 `options` 参数来配置按钮类型和点击效果;包含子组件的方式则允许更灵活的内容展示,如图片或复杂布局,此时无需设置 `label`。此外,`Button` 组件还提供了设置背景颜色、边框圆角等样式的方法,以及绑定点击事件的功能,使开发者能够轻松实现丰富的交互体验。
96 0
六、ArkTS 常用组件-按钮(Button)/切换按钮(Toggle)/文本输出(TextInput)
在RocketMQ中,消息的读写与生产者消费者的数量以及Broker数量都有关
在RocketMQ中,消息的读写与生产者消费者的数量以及Broker数量都有关
305 1
通过顶顶通呼叫中心中间件玩转FreeSWITCH媒体流
怎么获取FreeSWITCH的媒体流是一个老生常谈的问题了,最常见的方法media_bug 很多人需要直接获取原始的声音流,然后自己处理,其实FreeSWITCH也是支持的,只是知道的极少,FreeSWITCH原生支持 unicast 通过udp 把声音流推送到一个UDP端口,和播放网络的声音流。 fs实现的unicast,有一个缺陷如果启动了unicast 就没办法调用playback等放音函数了。
526 0
checking for spandsp >= 3.0... configure: error: no usable spandsp; please install spandsp3 devel pa
checking for spandsp >= 3.0... configure: error: no usable spandsp; please install spandsp3 devel pa
1033 0
如何使用阿里云搭建个人网站
域名申请 首次搭建 个人小站,建议购买域名和服务器到知名商家,我推荐大家到阿里云上。因为阿里云绑定了个人淘宝账号,登录,支付,还有其他各种产品。 输入你想要的域名,查询没有被其他人注册后,你可以加入购物车或直接使用淘宝账号登录购买。
5267 0
【Android】如何实现页面的跳转
此笔记是承上启下的,关于为页面添加响应的内容请详看【Android】如何为组件添加响应 要实现两个页面间的跳转,肯定要有两个界面,这里展示如何创建一个空的Activity文件
823 0