root/lang/actionscript/swfgmap/trunk/gyuque/gmap/GMapView.as @ 3096

Revision 3096, 6.2 kB (checked in by gyuque, 5 years ago)

lang/actionscript/swfgmap: added a handler for double click.

Line 
1package gyuque.gmap
2{
3        import flash.display.*;
4        import flash.geom.Point;
5        import flash.text.TextField;
6        import flash.text.TextFormat;
7        import flash.events.*;
8        import gyuque.gmap.googlemaps.*;
9       
10        public class GMapView extends MovieClip implements IDebugOut, IAnimationDispatcher
11        {
12                private static const GOOGLE_LOGO_URL:String = "http://www.google.com/intl/ja_jp/mapfiles/poweredby.png";
13               
14                private var txDebugOut:TextField = null;
15                private var fmtDebugOut:TextFormat;
16                private var mDrag:DragInfo = new DragInfo();
17                private var mBaseSprite:Sprite;
18                private var mSuperLayer:LayerManager;
19                private var mAnimMan:AnimationManager;
20                protected var mCurrentViewport:GMapViewport;
21               
22                public function GMapView(options:*)
23                {
24                        if (options.double_click)
25                                doubleClickEnabled = true;
26                       
27                        mBaseSprite = putBaseSprite();
28                        if (options.initial_size)
29                                clearBase(options.initial_size[0], options.initial_size[1]);
30                       
31                        mAnimMan = new AnimationManager();
32                        mSuperLayer = new LayerManager(this);
33                        mSuperLayer.doubleClickEnabled = doubleClickEnabled;
34                        addChild(mSuperLayer);
35                        mSuperLayer.animationDispatcher = this;
36
37                        if (options.debug_box)
38                        {
39                                txDebugOut = new TextField();
40                                addChild(txDebugOut);
41                               
42                                txDebugOut.selectable = false;
43                                txDebugOut.mouseEnabled = false;
44                                fmtDebugOut = new TextFormat();
45                                fmtDebugOut.size = 9;
46                                txDebugOut.y = 90;
47                                txDebugOut.height = height-90;
48                                txDebugOut.width = 600;
49                        }
50
51                        addGoogleMapLayer();
52
53                        if (options.initial_viewport)
54                        {
55                                setViewport(options.initial_viewport);
56                        }
57                        hookStdEvents();
58                }
59               
60                protected function setViewport(v:GMapViewport):void
61                {
62                        mCurrentViewport = v;
63                        fireViewportChange();
64                }
65               
66                public function setViewRotation(rad:Number):void
67                {
68                        mCurrentViewport.setNewRotation(rad);
69                        fireViewportChange();
70                }
71               
72                protected function fireViewportChange(dx:Number = 0, dy:Number = 0, dzm:int = 0, zoomAnimation:Boolean = true):void
73                {
74                        var e:GMapViewEvent = new GMapViewEvent(mCurrentViewport, GMapViewEvent.VIEWPORT_CHANGED);
75                        e.screenDX = dx;
76                        e.screenDY = dy;
77                        e.dZoom = dzm;
78                        e.zoomAnimation = zoomAnimation;
79                        dispatchEvent(e);
80                }
81               
82                protected function putBaseSprite():Sprite
83                {
84                        var s:Sprite = new Sprite();
85                        addChild(s);
86                        s.doubleClickEnabled = doubleClickEnabled;
87                       
88                        return s;
89                }
90               
91                protected function addGoogleMapLayer():Boolean
92                {
93                        var lyr:GMapSatelliteLayer = new GMapSatelliteLayer(this, mSuperLayer);
94                        lyr.debug_out = this;
95                        lyr.doubleClickEnabled = doubleClickEnabled;
96                        mSuperLayer.putLayer(0, lyr);
97                       
98                        return true;
99                }
100               
101                protected function clearBase(w:int, h:int):void
102                {
103                        var g:Graphics = mBaseSprite.graphics;
104                        g.beginFill(0xe5e0d5);
105                        g.drawRect(0,0, w, h);
106                        g.endFill();
107                }
108               
109                protected function hookStdEvents():void
110                {
111                        addEventListener(MouseEvent.MOUSE_MOVE ,  onMouseMove);
112                        addEventListener(MouseEvent.MOUSE_DOWN ,  onMouseDown);
113                        addEventListener(MouseEvent.MOUSE_UP   ,  onMouseUp);
114                        addEventListener(MouseEvent.MOUSE_OUT  ,  onMouseOut);
115                        addEventListener(MouseEvent.MOUSE_WHEEL,  onMouseWheel);
116                        addEventListener(MouseEvent.DOUBLE_CLICK, onDblClick);
117                       
118                        addEventListener(Event.ENTER_FRAME, onEnterFrame);
119                }
120               
121               
122                protected function onDblClick(e:MouseEvent):void
123                {
124                }
125
126                protected function onMouseWheel(e:MouseEvent):void
127                {
128                        zoom((e.delta > 0) ? 1 : -1, e.stageX, e.stageY);
129                }
130               
131                public function zoom(d:int, px:Number = -1, py:Number = -1, animation:Boolean = true):void
132                {
133                        var z:int = mCurrentViewport.zoom;
134                        var oldz:int = z;
135                        z += d;
136                        if (z < 0)  z = 0;
137                        if (z > 17) z = 17;
138                       
139                        var oldZ:int = mCurrentViewport.zoom;
140                        mCurrentViewport.zoom = z;
141                       
142                        if (mCurrentViewport.zoom == oldZ)
143                                return;
144                       
145                        if (px >= 0 || py >= 0) {
146                                var mv:Point = calcFixedPointZoom(px, py, (d>0) ? 2 : 0.5, mCurrentViewport);
147                                mCurrentViewport.moveByPixel(mv.x, mv.y);
148                        }
149                       
150                        fireViewportChange(mv.x, mv.y, z - oldz, animation);
151                }
152               
153                protected function calcFixedPointZoom(sx:Number, sy:Number, zoomRatio:Number, vpAfter:GMapViewport):Point
154                {
155                        sx -= vpAfter.width *0.5;
156                        sy -= vpAfter.height*0.5;
157                       
158                        var sx2:Number = sx * zoomRatio;
159                        var sy2:Number = sy * zoomRatio;
160                       
161                        var dx:Number = sx2 - sx;
162                        var dy:Number = sy2 - sy;
163               
164                        return new Point(dx, dy);
165                }
166
167                protected function onMouseOut(e:MouseEvent):void
168                {
169                        if (e.stageX < 0 || e.stageY < 0 ||
170                                e.stageX >= width || e.stageY >= height)
171                                mDrag.dragging = false;
172                }
173               
174                protected function onMouseMove(e:MouseEvent):void
175                {
176                        if (mDrag.dragging)
177                        {
178                                mDrag.update(e.stageX, e.stageY);
179                               
180                                cls();
181                                puts((mCurrentViewport.lat/0.0174533)+"  "+(mCurrentViewport.lng/0.0174533));
182                                moveByPixel(-mDrag.dx, -mDrag.dy);
183                                puts(e.stageX.toString()+","+e.stageY.toString()+"   "+mDrag.dx.toString()+","+mDrag.dy.toString());
184                        }
185                }
186               
187                protected function onMouseDown(e:MouseEvent):void
188                {
189                        mDrag.dragging = true;
190                        mDrag.update(e.stageX, e.stageY);
191                }
192               
193                protected function onMouseUp(e:MouseEvent):void
194                {
195                        mDrag.dragging = false;
196                }
197
198                protected function onEnterFrame(e:Event):void
199                {
200                        mAnimMan.next();
201                }
202               
203                public function moveByPixel(dx:Number, dy:Number):void
204                {
205                        if (mCurrentViewport)
206                        {
207                                mCurrentViewport.moveByPixel(dx, dy);
208                                fireViewportChange(dx, dy);
209                        }
210                }
211               
212                public function addAnimation(a:Animation):void
213                {
214                        mAnimMan.addAnimation(a);
215                }
216               
217                public function puts(s:String):void
218                {
219                        if (!txDebugOut)
220                                return;
221                       
222                        txDebugOut.appendText(s);
223                        txDebugOut.appendText("\r\n");
224                        txDebugOut.setTextFormat(fmtDebugOut);
225                }
226               
227                public function cls():void
228                {
229                        txDebugOut.text = "";
230                }
231               
232                public function d_outMetrics():void
233                {
234                        puts("w: "+ width.toString());
235                        puts("h: "+ height.toString());
236                }
237        }
238}
239
240class DragInfo
241{
242        public function DragInfo (){dragging=false;}
243        public var prevX:Number;
244        public var prevY:Number;
245        public var dx:Number;
246        public var dy:Number;
247        public var dragging:Boolean;
248       
249        public function update(x:Number, y:Number):void
250        {
251                dx = x - prevX;
252                dy = y - prevY;
253               
254                prevX = x;
255                prevY = y;
256        }
257}
258
Note: See TracBrowser for help on using the browser.