??? 算是校友的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 閱讀(2484)
評論(6) 編輯 收藏