??? 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?}?
?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級時動態(tài)添加, 到其他級就刪除,使用了下列代碼,但不起作用,不知是不行還是需要配備其他操作?
??? 在Tom兄的代碼中把地圖放大的方法做了擴展,加入了判斷現(xiàn)在縮放的級別是否和設定好的級別一致,如果一致則添加一個地圖類型,否則把地圖類型彈出。在此過程中加入了容錯,判斷現(xiàn)在mapTypes數(shù)組中地圖類型個數(shù)是否正確。
??? Tom兄的想法完全是正確的,在zoomin方法中直接設置maptype也是很優(yōu)雅的實現(xiàn)方式,避免了修改mapeasy核心類,但是卻忽略了一個很重要的步驟。我在一種更普遍的情況下(當大于一個給定級別時不顯示,小于這個給定級別時候顯示)給出我修改后的代碼,并做一些說明。
?1?/**
?2??*?地圖放大
?3??*/
?4?this.zoomin?=?function()?{
?5?????????var?level?=?this.model.getZoom().getLevel();
?6?????????if?(level?<?MapModel.maxZoomLevel)?{
?7???????????? //SatelliteLevel表示臨界級別,判斷只在通過這個級別的時候通知監(jiān)聽器修改了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方式通知監(jiān)聽器修改了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}?
?2??*?地圖放大
?3??*/
?4?this.zoomin?=?function()?{
?5?????????var?level?=?this.model.getZoom().getLevel();
?6?????????if?(level?<?MapModel.maxZoomLevel)?{
?7???????????? //SatelliteLevel表示臨界級別,判斷只在通過這個級別的時候通知監(jiān)聽器修改了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方式通知監(jiān)聽器修改了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}?
??? 縮小操作類似。中間那段可以重構出來給放大和縮小方法共用。
??? 因為為了不侵犯核心類,所以當通知監(jiān)聽器修改地圖類型和設置了新的縮放級別時候會重復的畫地圖。解決的方法是對核心類進行簡單修改,或者直接侵入修改對象屬性(不是調(diào)用setXXX(),getXXX())。
??? 大家可以仔細琢磨MapEasy中的兩種監(jiān)聽者的方式,一種是地圖模型本身繼承監(jiān)聽類,實現(xiàn)監(jiān)聽,完成自身的方法修改某些屬性的監(jiān)聽功能;另一種即為非常有用的command方式的監(jiān)聽者,可以在Action中加入監(jiān)聽,從而在外部調(diào)用監(jiān)聽方法。
??? 監(jiān)聽器幾乎是MapEasy完成絕大多數(shù)用戶交互的靈魂,請大家務必精讀相關代碼!