Changeset 594

Show
Ignore:
Timestamp:
07/07/08 15:34:21 (5 months ago)
Author:
allens
Message:

- made a bunch of TileGrid setters only recalculate the matrix if values change
- tweaked some tween stuff in TweenMap? (namely, pan/zoom durations) and added zoomInAbout() and zoomOutAbout()

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/tom-tweenlite/lib/com/modestmaps/core/TileGrid.as

    r586 r594  
    910910                        return _panX; 
    911911                } 
     912 
    912913                public function set panX(n:Number):void 
    913914                { 
    914                         var origin:Point = startPan || new Point(_panX,_panY); 
    915                         _panX = n; 
    916                         calculateMatrix(); 
    917                         dispatchEvent(new MapEvent(MapEvent.PANNED, new Point(-(origin.x-_panX)*_scale, -(origin.y-_panY)*_scale))); 
    918                 } 
     915                    if (n != panX) 
     916                    { 
     917                        var origin:Point = startPan || new Point(_panX, _panY); 
     918                        _panX = n; 
     919                        calculateMatrix(); 
     920                        dispatchEvent(new MapEvent(MapEvent.PANNED, new Point(-(origin.x - _panX) * _scale, -(origin.y - _panY) * _scale))); 
     921                } 
     922                } 
     923 
    919924                public function get panY():Number 
    920925                { 
     
    923928                public function set panY(n:Number):void 
    924929                { 
    925                         var origin:Point = startPan || new Point(_panX,_panY); 
    926                         _panY = n; 
    927                         calculateMatrix(); 
    928                         dispatchEvent(new MapEvent(MapEvent.PANNED, new Point(-(origin.x-_panX)*_scale, -(origin.y-_panY)*_scale))); 
     930                    if (n != panY) 
     931                    { 
     932                        var origin:Point = startPan || new Point(_panX, _panY); 
     933                        _panY = n; 
     934                        calculateMatrix(); 
     935                        dispatchEvent(new MapEvent(MapEvent.PANNED, new Point(-(origin.x - _panX) * _scale, -(origin.y - _panY) * _scale))); 
     936                    } 
    929937                } 
    930938 
     
    936944                public function set zoomLevel(n:Number):void 
    937945                { 
    938                         _scale = Math.pow(2, n);                                                 
    939                         calculateMatrix(); 
    940                         var zoomEvent:MapEvent = new MapEvent(MapEvent.ZOOMED_BY); 
    941                 zoomEvent.zoomDelta = zoomLevel-startZoom; 
    942                 zoomEvent.zoomLevel = zoomLevel; 
    943                 dispatchEvent(zoomEvent); 
     946                    if (zoomLevel != n) 
     947                    { 
     948                        _scale = Math.pow(2, n);                                                 
     949                        calculateMatrix(); 
     950                        var zoomEvent:MapEvent = new MapEvent(MapEvent.ZOOMED_BY); 
     951                zoomEvent.zoomDelta = zoomLevel-startZoom; 
     952                zoomEvent.zoomLevel = zoomLevel; 
     953                dispatchEvent(zoomEvent); 
     954            } 
    944955                } 
    945956 
     
    948959                        return _scale; 
    949960                } 
     961 
    950962                public function set scale(n:Number):void 
    951963                { 
    952                         var old:Number = zoomLevel; 
    953                         _scale = n; 
    954                         calculateMatrix();       
    955                         prepareForZooming(); 
    956                         var zoomEvent:MapEvent = new MapEvent(MapEvent.ZOOMED_BY); 
    957                 zoomEvent.zoomDelta = zoomLevel-old; 
    958                 zoomEvent.zoomLevel = zoomLevel; 
    959                 dispatchEvent(zoomEvent); 
    960                         doneZooming(); 
     964                    if (scale != n) 
     965                    { 
     966                        var old:Number = zoomLevel; 
     967                        _scale = n; 
     968                        calculateMatrix();       
     969                        prepareForZooming(); 
     970                        var zoomEvent:MapEvent = new MapEvent(MapEvent.ZOOMED_BY); 
     971                zoomEvent.zoomDelta = zoomLevel-old; 
     972                zoomEvent.zoomLevel = zoomLevel; 
     973                dispatchEvent(zoomEvent); 
     974                        doneZooming(); 
     975                    } 
    961976                } 
    962977                                 
    963978                public function resizeTo(p:Point):void 
    964979                { 
    965                         mapWidth = p.x; 
    966                         mapHeight = p.y; 
    967                 scrollRect = new Rectangle(0,0,mapWidth,mapHeight); 
    968                         calculateMatrix(); 
    969                         // force this but only for onResize 
    970                         onRender(); 
     980                    if (mapWidth != p.x || mapHeight != p.y) 
     981                    { 
     982                        mapWidth = p.x; 
     983                        mapHeight = p.y; 
     984                scrollRect = new Rectangle(0, 0, mapWidth, mapHeight); 
     985                        calculateMatrix(); 
     986                        // force this but only for onResize 
     987                        onRender(); 
     988                    } 
    971989                } 
    972990                 
  • branches/tom-tweenlite/lib/com/modestmaps/TweenMap.as

    r588 r594  
    131131                } 
    132132 
     133        public function panAndZoomOut(location:Location, targetPoint:Point=null):void 
     134        { 
     135            // remember where we are so we can zoom *from* here 
     136            var startX:Number = grid.panX; 
     137            var startY:Number = grid.panY; 
     138            var startZoom:Number = grid.zoomLevel; 
     139 
     140            // zoom first so that the calculation for location is correct 
     141            grid.prepareForZooming(); 
     142            grid.zoomLevel = Math.min(grid.maxZoom, Math.ceil(grid.zoomLevel - 1.0));  
     143                     
     144            // figure out the pan 
     145            var p:Point = locationPoint(location,this); 
     146            if (!targetPoint) targetPoint = new Point(mapWidth/2, mapHeight/2); 
     147            var pan:Point = targetPoint.subtract(p); 
     148 
     149            // now apply the pan 
     150            grid.prepareForPanning(); 
     151            grid.panX += (pan.x / grid.scale); 
     152            grid.panY += (pan.y / grid.scale); 
     153             
     154            // now reset and tween here instead          
     155            TweenLite.from(grid, panAndZoomDuration, { panY: startY, panX: startX, onComplete: grid.donePanning, ease: panEase });           
     156            TweenLite.from(grid, panAndZoomDuration, { zoomLevel: startZoom, onComplete: grid.doneZooming, ease: zoomEase, overwrite: false }); 
     157        } 
     158 
     159        public function zoomInAbout(targetPoint:Point, duration:Number=-1):void 
     160        { 
     161            zoomByAbout(1, targetPoint, duration); 
     162        } 
     163 
     164        public function zoomOutAbout(targetPoint:Point, duration:Number=-1):void 
     165        { 
     166            zoomByAbout(-1, targetPoint, duration); 
     167        } 
     168         
     169        public function zoomByAbout(zoomDelta:int, targetPoint:Point, duration:Number=-1):void 
     170        { 
     171            if (duration < 0) duration = panAndZoomDuration; 
     172             
     173            var location:Location = pointLocation(targetPoint); 
     174             
     175            var startX:Number = grid.panX; 
     176            var startY:Number = grid.panY; 
     177            var startZoom:Number = grid.zoomLevel; 
     178             
     179            var zoomed:Boolean = false; 
     180            var targetZoom:int = Math.max(grid.minZoom, Math.min(grid.maxZoom, grid.zoomLevel + zoomDelta)); 
     181            if (grid.zoomLevel != targetZoom) 
     182            { 
     183                grid.zoomLevel = targetZoom; 
     184                zoomed = true; 
     185            } 
     186             
     187            // now find the current position of the requested location: 
     188            var p:Point = locationPoint(location); 
     189             
     190            // now find the pan offset from the target point to the current center 
     191            var pan:Point = targetPoint.subtract(p); 
     192             
     193            // and move! 
     194            if (zoomed) grid.prepareForZooming(); 
     195            grid.prepareForPanning(); 
     196 
     197            grid.panX += (pan.x / grid.scale); 
     198            grid.panY += (pan.y / grid.scale); 
     199 
     200            if (duration > 0) 
     201            { 
     202                if (zoomed) 
     203                    TweenLite.from(grid, duration, {zoomLevel: startZoom, 
     204                                                    onComplete: grid.doneZooming, 
     205                                                    ease: zoomEase}); 
     206                TweenLite.from(grid, duration, {panX: startX, 
     207                                                panY: startY, 
     208                                                onComplete: grid.donePanning, 
     209                                                ease: panEase, 
     210                                                overwrite: false});  
     211            } 
     212            else 
     213            { 
     214                if (zoomed) grid.doneZooming(); 
     215                grid.donePanning(); 
     216            } 
     217        } 
     218 
    133219        /** EXPERIMENTAL! */ 
    134         public function tweenExtent(extent:MapExtent, duration:Number=1.0):void 
    135         { 
     220        public function tweenExtent(extent:MapExtent, duration:Number=-1):void 
     221        { 
     222            if (duration < 0) duration = panAndZoomDuration; 
    136223            var position:MapPosition = extentPosition(extent); 
    137224 
    138225            var sc:Number = Math.pow(2, position.coord.zoom); 
    139226 
    140             // figure out where in the world we are          
     227            // figure out where in the world we are 
    141228            var tx:Number = -TileGrid.TILE_WIDTH * position.coord.column / sc; 
    142229            var ty:Number = -TileGrid.TILE_HEIGHT * position.coord.row / sc; 
     
    149236            grid.prepareForPanning(); 
    150237 
    151             TweenLite.to(grid, 1.0, { zoomLevel: position.coord.zoom, ease: linearEaseOut }); 
    152             TweenLite.to(grid, 1.0, { panY: ty, panX: tx, ease: exponentialEaseOut, overwrite: false, onComplete: onDoneTweeningExtent }); 
     238            TweenLite.to(grid, duration, {zoomLevel: position.coord.zoom, 
     239                                          ease: linearEaseOut}); 
     240            TweenLite.to(grid, duration, {panY: ty, 
     241                                          panX: tx, 
     242                                          ease: exponentialEaseOut, 
     243                                          overwrite: false, 
     244                                          onComplete: onDoneTweeningExtent}); 
    153245        } 
    154246 
     
    172264                override public function panTo(location:Location, forceAnimate:Boolean=false):void 
    173265                { 
    174                         var p:Point = locationPoint(location,grid); 
    175                         if (forceAnimate || (p.x >= 0 && p.x <= mapWidth && p.y >= 0 && p.y <= mapHeight)) { 
    176                         var centerPoint:Point = new Point(mapWidth/2, mapHeight/2); 
     266                        var p:Point = locationPoint(location, grid); 
     267 
     268                        if (forceAnimate || (p.x >= 0 && p.x <= mapWidth && p.y >= 0 && p.y <= mapHeight)) 
     269                        { 
     270                        var centerPoint:Point = new Point(mapWidth / 2, mapHeight / 2); 
    177271                        var pan:Point = centerPoint.subtract(p); 
    178272                        pan.x /= grid.scale; 
    179273                        pan.y /= grid.scale; 
     274 
    180275                        // grid.prepareForPanning(); 
    181                         TweenLite.to(grid, panDuration, { panY: grid.panY+pan.y, panX: grid.panX+pan.x, ease: panEase, onStart: grid.prepareForPanning, onComplete: grid.donePanning }); 
    182                 } 
    183                         else { 
     276                        TweenLite.to(grid, panDuration, {panY: grid.panY + pan.y, 
     277                                                         panX: grid.panX + pan.x, 
     278                                                         ease: panEase, 
     279                                                         onStart: grid.prepareForPanning, 
     280                                                         onComplete: grid.donePanning}); 
     281                } 
     282                        else 
     283                        { 
    184284                                setCenter(location); 
    185285                        } 
     
    192292                 * @see com.modestmaps.Map#panTo 
    193293                 */ 
    194                 public function tweenTo(location:Location, duration:Number, easing:Function):void 
     294                public function tweenTo(location:Location, duration:Number, easing:Function=null):void 
    195295                { 
    196296                var pan:Point = new Point(mapWidth/2, mapHeight/2).subtract(locationPoint(location,grid)); 
     
    198298                pan.y /= grid.scale; 
    199299                // grid.prepareForPanning(); 
    200                 TweenLite.to(grid, duration, { panY: grid.panY+pan.y, panX: grid.panX+pan.x, ease: easing, onStart: grid.prepareForPanning, onComplete: grid.donePanning }); 
     300                TweenLite.to(grid, duration, {panY: grid.panY + pan.y, 
     301                                              panX: grid.panX + pan.x, 
     302                                              ease: easing, 
     303                                              onStart: grid.prepareForPanning, 
     304                                              onComplete: grid.donePanning}); 
    201305                } 
    202306                 
     
    205309            override protected function zoomBy(dir:int):void 
    206310            { 
    207                 if (!grid.panning) { 
    208                         var target:Number = dir < 0 ? Math.floor(grid.zoomLevel+dir) : Math.ceil(grid.zoomLevel+dir); 
    209                         target = Math.min(Math.max(grid.minZoom, target), grid.maxZoom); 
    210                         // grid.prepareForZooming(); 
    211                         TweenLite.to(grid, zoomDuration, { zoomLevel: target, onStart: grid.prepareForZooming, onComplete: grid.doneZooming, ease: zoomEase }); 
     311                if (!grid.panning) 
     312                { 
     313                        var target:Number = (dir < 0) ? Math.floor(grid.zoomLevel + dir) : Math.ceil(grid.zoomLevel + dir); 
     314                        target = Math.max(grid.minZoom, Math.min(grid.maxZoom, target)); 
     315 
     316                        TweenLite.to(grid, zoomDuration, {zoomLevel: target, 
     317                                                          onStart: grid.prepareForZooming, 
     318                                                          onComplete: grid.doneZooming, 
     319                                                          ease: zoomEase }); 
    212320                    } 
    213321            }