(一)FlexViewer之整体框架解析

文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/。

1.FlexViewer简介

FlexViewer框架为Esri提供的可以高效开发基于WEB的地理信息应用系统的一种完全免费的应用程序框架。目前有两种版本,一种是针对非开发人员的版 本,即编译后的发布(release)版本;一种是供开发人员在源框架的基础上,通过修改代码和配置文件等,来实现定制业务。

这里我要跟大家一起探讨的是面向开发人员的FlexViewer版本。

2.FlexViewer框架的组成

当我们从网上下载到FlexViewer的源码,通过eclipse加载后便可以看到该框架的组成结构了。

 

 可以看到,有四个子目录和三个文件。

2.1 index.mxml文件

此文件为整个框架的入口,当系统初始化时首先加载此文件。

2.2 com文件夹

此文件夹下的内容至关重要,配置文件的获取和解析,地图的初始化和加载,widget的加载以及事件机制等都与这个文件夹有关系。此为该文件夹下的文件组织:

 

下面以表格的形式给出各模块的功能:

文件名

作用

AppEvent.as

定义了用于在消息总线(EventBus)中使用的消息类

BaseWidget.as

定义了Widget的基类,所有自定义的Widget均需继承该类

ConfigData.as

定义了系统在初始化时将config.xml文件中的配置项加载内存后,用于管理这些配置项的类型

IBaseWidget.as

定义了接口BaseWidget,同时类BaseWidget实现了该接口

IInfowindowTemplate.as

定义了接口InfowindowTemplate,所有自定义的InfoWindowTemplate均需实现该接口,同时自定义模板用于InfoWindow的窗口定义中。

IWidgetContainer.as

定义了接口IWidgetContainer,所有自定义的WidgetContainer均需实现该接口。WidgetContainer是用于管理Widget的一个可视化容易。

IWidgetTemplate.as

定义了接口IWidgetTemplate,所有自定义的WidgetTemplate均需实现该接口,同时自定义模板用于Widget的窗口定义中。

ViewerContainer.mxml

定义了可视化容器ViewerContainer,该容器是Flex Viewer中构件树的根

ConfigManager.as

定义了类configmanager,该类负责从config文件中加载兵解析全部配置信息,然后将这些信息存储于数据结构configData,最后通过触发事件AppEvent.CONFIG_LOADED将configData发布给其它组件使用

DataManager.as

定义了类DataManager,负责管理与维护系统内部的公共数据,使得系统中的各组件、Widget均能将公共数据发布到DataManager中或从其中获取其它组件发布的数据。

EventBus.as

继承了EventDispatcher接口,并使用单例模式向整个提供中的所有组件提供统一的消息注册和发布功能,从而使得各组件之间的完全做到低耦合、高内聚的效果

MapManager.mxml

负责根据config文件中的配置信息初始化地图控件、底图、optlayer,以及optlayer所对应的InfoWindowWidget,并提供对事件SET_MAP_NAVIGATION(设置地图浏览工具)、BASEMAP_SWITCH(设置底图切换)、SET_MAP_ACTION(设置绘图工具)、SHOW_INFOWINDOW(显示InfoWindow)、MAP_RESIZE(改变地图控件大小)、DATA_OPT_LAYERS(请求OptLayersTable)、MAP_LAYER_VISIBLE(设置指定图层可见性)等的响应。

ScriptingManager.as

保留类,暂无特别用途

SecurityManager.as

保留类,暂无特别用途

UIManager.as

负责根据config文件中style的配置信息定义一套系统的UI样式表

WidgetManager.as

负责根据config文件的配置自动初始化Widget Container,及其包含的Widget控件,同时提供对事件WIDGET_RUN(打开Widget)、DATA_CREATE_INFOWIDGET(创建OptLayer对应的InfoWindow)、WIDGET_FOCUS(设置Widget获得焦点)、WIDGET_STATE_CHANGED(关闭Widget事件响应)的响应。

2.3 popups文件夹

此文件夹的内容是在FlexViewer2.3版本后才出现的,在此文件夹中可以通过XML的方式来配置弹出框的显示方式。以下是其配置的格式:

 

以下是Esri官方中的一个配置的例子:

           

2.4 widgets文件夹

此为模块部分。FlexViewer框架可以将其理解为一个插件式框架,在src文件下已经定义了插件引擎、通信机制、数据存储、配置读取四个很重要的部分。而widgets便是我们的独立插件部分,在Flex中称其为module部分。如所有的插件系统一样,插件必须继承了某些接口,即实现了固定协议的,才能被容器加载。在FlexViewer中,IbaseWidget和IwidgetTemplate是每一个自定义widget需要继承实现的两个接口。

2.5 assets文件夹

该目录为资源文件目录,主要用于管理工程中的图片文件,工程中的其它文件可以通过相对路径的方式来访问其中的图片资源。

2.6 config.xml文件

此文件为配置文件,地图的配置,widget的配置和其他需要使用的配置等都在这里。

2.7 defaults.css文件

为整个系统的样式表。

3.框架启动流程

3.1 实例化——加载组件

我们直接从index.xml中便能看出来整个框架启动时的流程了。现在我先给出index.xml的内容:

 

可以看到,实例化的过程是:

 

以上初始化流程图中,将viewerContainer的初始化放在最后,是因为虽然viewerContaner是最先调入内存中开始初始化的,但是却是在将它的属性都实例化完了,才调用的它的构建器,所以图中默认将其放在最后初始化了。

但是实例化完后,系统的启动却只是等于把最核心的模块装载了,而这些模块将在接下来一系列的消息触发中,完成对框架的填充。

3.2消息触发——通过配置填充框架

我首先给出实例化后触发的消息机制流程图:

 

下面,我将代码中与此消息机制相关的流程也给大家展现出来。

3.2.1ViewerContainer实例化化完后触发读配置事件

 

 

3.2.2 configManager读取完配置后触发配置读完事件

ConfigManager中监听了ViewerContainer初始完成的事件。

 

此时,ConfigManger开始请求配置文件。

 

当把cofig.xml中的配置读完后,会触发配置读完事件。

 

3.2.3 WidgetManger、MapManager、DataManager等监听配置读完事件并做出反应

这些组件中均写有对AppEvent.CONFIG_LOADED事件的监听,所以在配置文件读取完后,这几个组件均将做出相关响应。

4.解析核心组件的主要功能

先给出FlexViewer的架构图:

 

 

4.1configManger——读取配置

 

其中加载的配置文件如果没特殊修改,将使用默认的地址:

 

如果要修改,可以在ViewerContainer里面找到相关属性后修改。

在函数configService_resultHandler中对config文件中的配置做出解析。在源码中,里面对geoserverURL等做了解析,并且均放入了configData.as中。但是这个并不是固定的,在自己修改和扩充框架时,可以更具需要在config中添加需要的配置,并且解析后放入其他的自定义文件里。此组件还能将widget相关配置读完,存入到configData的对应的属性中:

 

 

4.2dataManager——实现数据共享

我们查看dataManager的代码,首先就会发现此类是一个继承于EventDispatcher的类,不难推测出这个类肯定与消息机制有关系,但是到底有什么作用呢?

     

阅读这个类中的方法,便能猜出其作用了,这个类便是为了存储消息,分发消息,共享消息用的。举个例子,FlexViewer是模块式框架,一个Widget只有当被调用时才会实例化,于是,当widgetA已经发出了几个消息后,widgetB才被调用从而实例化,此时widgetB该如何获得它错过的widgetA中的消息呢。DataManger便能解决这个难题。

 

4.3mapManager——地图加载和配置

在mapManager中有这样几个方法:

 

这些方法中可以将配置文件中配置好的基础地图和操作地图等实例化。并且这几个方法均需要调用一个共同的函数:addLayerToMap(layerObject:Object)。所以对不同类型的地图的实例化,便是在这里进行控制的。如果自己扩展了一些自定义地图类型,便需要在这个函数中加上对自定义的地图类型的支持。

4.4widgetManager——将插件与宿主关联起来

这其中有loadContainer和loadControl方法,便是对插件容器和具体插件的加载。

4.5uiManager——对UI的控制

这个类主要是实现对框架样式的控制。其样式的配置均是在config.xml中进行。

5.总结

以上我大致将FlexViewer框架的构造以及其初始化时的消息机制,并且对核心的组件进行了大致的介绍。利用Flexviewer框架可以快速的开发出效果很不错的前端来。这里我给出一个项目实例的截图,此项目便是在FlexViewer的基础上修改、扩展、开发出来的。在以后的章节里,我会跟大家分享如何扩展Map类、如何自制Widget、以及跟例子相关的对config.xml文件的配置。相信通过对实例的探索,大家会对FlexViewer框架有更深的了解。

 

 

                         -----欢迎转载,但保留版权,请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/

                                                                           如果您觉得本文确实帮助了您,可以微信扫一扫,进行小额的打赏和鼓励,谢谢 ^_^

                                  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/460991.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

三阶魔方复原操作方法

在女票的指导下,我花了一个晚上学习如何复原三阶魔方,虽然是知其然不知其所以然,但好歹也能把魔方复原了。下面都是一些傻瓜式的操作,里面涉及的理论我不清楚。魔方总共分三层,下面是每层复原方法。 第一层 1、先以“…

Phaser开源2d引擎 javascript/html5游戏框架

功能特点(Features) 易维护代码(Easy Asset Loading) Phaser可以加载图片,音频文件,数据文件,文本文件和自动解析精灵图和纹理地图集数据(出口纹理封隔器或Flash CS6&#xf…

8大排序算法图文讲解转

本文链接:http://www.cricode.com/3212.html 作者:快课网——Jay13 转载请务必保留作者出处,谢谢! 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大…

Immutable Collections(3)Immutable List实现原理(中)变化中的不变

Immutable Collections(3)Immutable List实现原理(中)变化中的不变 文/玄魂 前言 在上一篇文章&#xff08;Immutable Collections&#xff08;2&#xff09;ImmutableList<T>实现原理.&#xff08;上&#xff09;&#xff09;,分析了&#xff09;ImmutableList<T>…

大话Fragment管理

大话Fragment管理 上一个项目遇到了一个Activity 管理30个Fragment的情况&#xff0c;刚开始的时候真的管理的焦头烂额&#xff0c;但是后来不停的研究api文档&#xff0c;渐渐的明白了android的Fragment管理 体系。下面用…

第一季4:Hi3518E_SDK_Vx.x.x.x的SDK目录结构

一、Hi3518E_SDK_V1.0.3.0.tgz的位置 “Hi3518E_SDK_V1.0.3.0.tgz”位于“Hi3518E V200R001C01SPC030”中&#xff0c;其目录包含关系如下。 Hi3518E_SDK_V1.0.3.0.tgz 解压后内部文件组织如下。 二、执行SDK展开脚本sdk.unpack后的目录关系 将Hi3518E_SDK_V1.0.3.0.tgz拷贝到…

第一季6:海思方案中uboot、kernel和rootfs的烧写方法

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 一、概述 因为所用的板子默认从SPI Flash启动&#xff0c;因此本文主要讲如何“使用tftp&#xff0c;烧写映像文件&#xff08;uboot、kernel、rootfs&#xff09;到SPI Flash”。另外海思还提供了“…

Java Web笔记之Struts2.1 +Hibernate3.3 +Spring3.0

2019独角兽企业重金招聘Python工程师标准>>> 1、Struts2 1.1、了解Struts2 Struts2是基于MVC设计模式的Java Web框架技术之一&#xff0c;按照MVC设计思想把Java Web应用程序分为&#xff1a; 控制器层&#xff0c;包括核心控制器FilterDispatcher和业务控制器Actio…

高地址和低地址、高字节与低字节、大小端模式的转换、存储顺序

以下内容源于网络资源的学习与整理&#xff0c;如有侵权请告知删除。 一、高地址和低地址 二、高字节低字节 如int a16777220&#xff0c;化为十六进制是0x01 00 00 04&#xff0c;则04属于低字节&#xff0c;01属于高字节。 三、大小端模式 &#xff08;1&#xff09;如果a在内…

漫谈数据挖掘从入门到进阶

入门&#xff1a;数据挖掘入门的书籍&#xff0c;中文的大体有这些&#xff1a;Jiawei Han的《数据挖掘概念与技术》Ian H. Witten / Eibe Frank的《数据挖掘 实用机器学习技术》Tom Mitchell的《机器学习》TOBY SEGARAN的《集体智慧编程》Anand Rajaraman的《大数据》Pang-Nin…

(转)Asp.Net生命周期系列一

原文地址&#xff1a;http://www.cnblogs.com/skm-blog/archive/2013/07/07/3176713.html Asp.Net生命周期对于初级甚至中级程序员来说&#xff0c;一直都是一个难题&#xff0c;很多程序员不了解生命周期&#xff0c;导致使用Asp.Net做开发感觉很不灵活&#xff0c;感觉太多东…

与TCP有关的面试内容

以下内容源于网络资料的学习与整理。 参考博客 TCP/IP四层模型 - BlueTzar - 博客园&#xff08;OSI参考模型和TCP模型的详解&#xff0c;包括格式&#xff09; TCP/IP协议-为什么说TCP是可靠连接_shuaixio的博客-CSDN博客&#xff08;为什么可靠及优缺点&#xff09; 两张动图…

JUnit4概述

JUnit4是JUnit框架有史以来的最大改进&#xff0c;其主要目标便是利用Java5的Annotation特性简化测试用例的编写。先简单解释一下什么是Annotation&#xff0c;这个单词一般是翻译成元数据。元数据是什么&#xff1f;元数据就是描述数据的数据。也就是说&#xff0c;这个东西在…

正则表达式30分钟入门教程(转)

分享到一键分享QQ空间新浪微博百度云收藏人人网腾讯微博百度相册开心网腾讯朋友百度贴吧豆瓣网搜狐微博百度新首页QQ好友和讯微博更多...百度分享首页 | 正则表达式30分钟入门教程 | 常用正则表达式| 正则表达式速查表 | 正则表达式测试工具 | 正则表达式 | 正则练习器在线版 正…

进程、线程简介

以下内容源于网络资源的学习整理&#xff0c;如有侵权&#xff0c;请告知删除。 参考博客 http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html&#xff08;通俗理解&#xff09; https://blog.csdn.net/chen_geng/article/details/51613445&#xff08;表格…

使用keil建立标准STM32工程模版(图文详细版!)

1. 模板工程的创建(超级详细版&#xff0c;使用的是keil 4.5版本) 1.1创建工程目录 良好的工程结构能让文件的管理更科学&#xff0c;让开发更容易更方便&#xff0c;希望大家养成良好的习惯&#xff0c;使用具有合理结构的工程目录&#xff0c;当你着手于较大的软件项目时&a…

android模拟机新闻APP,DavidTGNewsProject

DavidTGNewsProject##【Android】最新主流新闻app功能实现。仿网易,搜狐等新闻客户端(原创作品&#xff0c;转载请说明出处)先给大家看一下效果图&#xff1a;这个项目总体来说虽然不是特别难&#xff0c;但是确实非常常用的功能。是业余时间自己写的一个小项目。以前我们写的时…

轻操作动作休闲单机游戏《狂斩三国2》评测

游戏类别&#xff1a;动作休闲单机游戏时隔一年&#xff0c;曾在国内和台湾手游市 场获得top1佳绩的《狂斩三国》再度归来&#xff01;其策略加动作的独特玩法在当时颠覆了玩家们对三国游戏的阵营认知。比传统策略更简单明快&#xff0c;比传统动作无脑砍更 具思考乐趣&#xf…

物联网简介

以下内容源于朱有鹏老师课程的学习整理&#xff0c;如有侵权&#xff0c;请告知删除。 本文档提供下载&#xff1a;提取码1111——物联网简介 1、什么是物联网 1.1.物联网的概念和发展历程 1.1.1、认识物联网 &#xff08;1&#xff09;百度百科中物联网定义 &#xff08;…

Mysql语句与应用

2019独角兽企业重金招聘Python工程师标准>>> 1。正则表达式 搜索多个关键词&#xff0c;“或”, 等同 %上海% | %内蒙古% SELECT * FROM analysis_result WHERE result REGEXP 上海|内蒙古 LIMIT 1; "且" SELECT * FROM analysis_result WHERE id 1 AND …