惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Troy Hunt's Blog
P
Proofpoint News Feed
V
Vulnerabilities – Threatpost
C
Cybersecurity and Infrastructure Security Agency CISA
K
Kaspersky official blog
Cyberwarzone
Cyberwarzone
T
Tor Project blog
Cisco Talos Blog
Cisco Talos Blog
S
Securelist
L
Lohrmann on Cybersecurity
Security Latest
Security Latest
T
Threatpost
H
Heimdal Security Blog
W
WeLiveSecurity
A
Arctic Wolf
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
G
GRAHAM CLULEY
IT之家
IT之家
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
TaoSecurity Blog
TaoSecurity Blog
A
About on SuperTechFans
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
N
News and Events Feed by Topic
Hacker News - Newest:
Hacker News - Newest: "LLM"
Last Week in AI
Last Week in AI
T
The Blog of Author Tim Ferriss
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Microsoft Azure Blog
Microsoft Azure Blog
Hugging Face - Blog
Hugging Face - Blog
Google DeepMind News
Google DeepMind News
量子位
Stack Overflow Blog
Stack Overflow Blog
Know Your Adversary
Know Your Adversary
B
Blog RSS Feed
阮一峰的网络日志
阮一峰的网络日志
WordPress大学
WordPress大学
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
AI
AI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 司徒正美
Apple Machine Learning Research
Apple Machine Learning Research
GbyAI
GbyAI
Vercel News
Vercel News
C
Cyber Attacks, Cyber Crime and Cyber Security
Latest news
Latest news
D
Darknet – Hacking Tools, Hacker News & Cyber Security
大猫的无限游戏
大猫的无限游戏
Forbes - Security
Forbes - Security

博客园 - 浪子

LINQ TO Reflection(反射) 你真的懂HTML吗-从"最新闪存"说起 LINQ TO SQLite实践指南 [TDD]由SearchCriteriaBinder看Test Driven与Test First [OpenSource] ScriptLoader V5:不一样的体验,客户端分布式缓存平台 [OpenSource] ScriptLoader V4:与组件系统共舞,让分享更清晰 [OpenSource]ScriptLoaderV2:彻底改变你的编程习惯 [OpenSource]ScriptLoader: 轻松管理你的js 类库 关于Windows Mobile 6 Professional Emulator中的一个串口设置小问题. 文件被数字签名策略拒绝(File was rejected by digital signature policy) [开源第一波]SmartScript Ajax中动态执行返回到innerHTML中的js [Silverlight探秘]深入探索Silverlight与Javascript的交互 [Silverlight探秘]利用Silverlight调用Javascript的方法 [Silverlight探秘]利用Javascript调用silverlight的方法 encodeURI/decodeURI与UrlEncode/UrlDecode,噩梦在继续 技术人,什么才是你的成功? [Flash FileUpload]用flash.net.FileReference实现ASP.NET无刷新文件上传 [SmartScript]js类库管理不再发愁
[MapEasy]浅析ListenerSupport
浪子 · 2007-03-30 · via 博客园 - 浪子

[MapEasy]浅析ListenerSupport?

-Written by 浪子@cnblogs.com  (07-03-30)

摘要:

      昨天在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、浪子语

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