算是校友的Tom兄在
MapEasy的Google Group中提问“
能否在放大缩小事件中动态添加MapType?”,并给出了自己用来实现此功能的代码片段,但是无法达到想要的效果。下面根据Tom兄的代码进行分析,并给出一种实现方式,希望给其他需要的朋友一个借鉴。
Tom兄代码(声明:下面代码的相关权益完全归Tom Xu所有): 1 /**
2 * 地图放大
3 */
4 this.zoomin = function() {
5 var level = this.model.getZoom().getLevel();
6 if (level < MapModel.maxZoomLevel) {
7 this.model.setZoom(new Zoom(level + 1));
8 // if(level+1 == SatelliteLevel)
9 // {
10 // if(MapModel.mapTypes.length == 1)
11 // {
12 // MapModel.mapTypes.push(new YTSMapType());
13 // }
14 // }
15 // else
16 // {
17 // if(MapModel.mapTypes.length == 2)
18 // {
19 // MapModel.mapTypes.pop();
20 // }
21 // }
22 }
23 }
Tom兄原帖: 当前只有一个基本的继承自MapType的地图类型,还有一个地图类型想在第一个地图放大到第N级时动态添加, 到其他级就删除,使用了下列代码,但不起作用,不知是不行还是需要配备其他操作? 在Tom兄的代码中把地图放大的方法做了扩展,加入了判断现在缩放的级别是否和设定好的级别一致,如果一致则添加一个地图类型,否则把地图类型弹出。在此过程中加入了容错,判断现在mapTypes数组中地图类型个数是否正确。
Tom兄的想法完全是正确的,在zoomin方法中直接设置maptype也是很优雅的实现方式,避免了修改mapeasy核心类,但是却忽略了一个很重要的步骤。我在一种更普遍的情况下(当大于一个给定级别时不显示,小于这个给定级别时候显示)给出我修改后的代码,并做一些说明。
1 /**
2 * 地图放大
3 */
4 this.zoomin = function() {
5 var level = this.model.getZoom().getLevel();
6 if (level < MapModel.maxZoomLevel) {
7 //SatelliteLevel表示临界级别,判断只在通过这个级别的时候通知监听器修改了maptype,从而
8减少不必要的操作
9 if(level+1 == SatelliteLevel){
10 //当只有一个地图类型时,其实放大操作不涉及
11 if(MapModel.mapTypes.length == 1){
12 MapModel.mapTypes.push(new Edushi2DMapType());
13 //当有两个地图类型时,缩小操作不涉及
14 }else if(MapModel.mapTypes.length == 2){
15 this.model.setCurrentMapType(MapModel.mapTypes.length-2);
16 MapModel.mapTypes.pop();
17 }
18 //注意,在这里以command方式通知监听器修改了maptype,并设置了当前的地图类型。
19 command.exec("maptype",new Array(this.model.getId(), this.model.currentMapType));
20 }
21 this.model.setZoom(new Zoom(level + 1));
22 }
23
24}
缩小操作类似。中间那段可以重构出来给放大和缩小方法共用。
因为为了不侵犯核心类,所以当通知监听器修改地图类型和设置了新的缩放级别时候会重复的画地图。解决的方法是对核心类进行简单修改,或者直接侵入修改对象属性(不是调用setXXX(),getXXX())。
大家可以仔细琢磨MapEasy中的两种监听者的方式,一种是地图模型本身继承监听类,实现监听,完成自身的方法修改某些属性的监听功能;另一种即为非常有用的command方式的监听者,可以在Action中加入监听,从而在外部调用监听方法。
监听器几乎是MapEasy完成绝大多数用户交互的灵魂,请大家务必精读相关代码!
posted on 2007-02-06 16:53
cresposhi 阅读(2475)
评论(6) 编辑 收藏