<?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:esri="http://www.esri.com/2008/ags" xmlns:mx="library://ns.adobe.com/flex/mx"> <!-- ArcGIS API for FLEX 3.0 --> <!-- Adobe SDK 4.6 --> <s:layout> <s:VerticalLayout paddingBottom="20" paddingLeft="20" paddingRight="20" paddingTop="20"/> </s:layout> <fx:Script> <![CDATA[ import com.esri.ags.Graphic; import com.esri.ags.events.DrawEvent; import com.esri.ags.events.ZoomEvent; import com.esri.ags.geometry.Extent; import com.esri.ags.geometry.Geometry; import com.esri.ags.symbols.SimpleFillSymbol; import com.esri.ags.symbols.SimpleLineSymbol; import mx.collections.ArrayCollection; import mx.controls.Alert; import mx.core.UIComponent; import mx.events.CloseEvent; import mx.graphics.codec.PNGEncoder; private const FILE_NAME:String = "screen.png"; private var mapExtent:Extent; private var bitmapData:BitmapData; private var logoBitmapData:BitmapData; /** * Save as png clicked */ protected function onSaveAsPng(event:MouseEvent):void { trace("Save button clicked"); var printableExtent:Extent = getDrawnExtent(); var readyToPrint:Boolean = true; if (printableExtent) { mapExtent = map.extent; map.extent = printableExtent; map.addEventListener(ZoomEvent.ZOOM_END, onMapZoomEnd); } else { saveMapImage(); } } /** * Map zoom endend */ protected function onMapZoomEnd(event:ZoomEvent):void { trace("Map zoom ended") map.removeEventListener(ZoomEvent.ZOOM_END, onMapZoomEnd); // user action needed (mouse click or key press) to call FileReference.save() method Alert.show("Do you really want to print?", "Ready to print", Alert.YES | Alert.NO, null, onAlertClose); } /** * Confirmation dialog close handler */ protected function onAlertClose(event:CloseEvent):void { trace("Confirmation dialog closed"); if (event.detail == Alert.YES) { saveMapImage(); } else { // restore map state showComponents(); } } /** * @private */ private function saveMapImage():void { trace("Image export started"); var fileReference:FileReference = new FileReference(); hideComponents(); // add listeners to show zoom slider after execution fileReference.addEventListener(Event.COMPLETE, fileSaveComplete); fileReference.addEventListener(Event.CANCEL, fileSaveCancel); try { var mapComponent:UIComponent = map as UIComponent; var exportData:BitmapData = getBitmapData(mapComponent); if (exportData) { // encode to PNG format var pngEncoder:PNGEncoder = new PNGEncoder(); var byteArray:ByteArray = pngEncoder.encode(exportData); // open dialog box fileReference.save(byteArray, FILE_NAME); exportData = null; bitmapData = null; } } catch (ioError:IllegalOperationError) { trace(ioError.getStackTrace()); } catch (error:Error) { trace(error.getStackTrace()); } } /** * get bitmap data from IBitmapDrawable component */ private function getBitmapData(uiComponent:UIComponent):BitmapData { try { // map image size var mapWidth:Number = uiComponent.width; var mapHeigth:Number = uiComponent.height; // get flash map bitmap data bitmapData = new BitmapData(mapWidth, mapHeigth); var matrix:Matrix = new Matrix(); bitmapData.draw(uiComponent, matrix); // logo image size var logoWidth:Number = logo.width; var logoHeigth:Number = logo.height; // get logo bitmap data logoBitmapData = new BitmapData(logoWidth, logoHeigth); logoBitmapData.draw(logo, matrix); // calculate logo left-top position on map var logoX:Number = mapWidth - logoWidth - 10; var logoY:Number = 10; var point:Point = new Point(logoX, logoY); var mult:uint = 0x100; // 100% (256) RGBA channels multipliers bitmapData.merge(logoBitmapData, logoBitmapData.rect, point, mult, mult, mult, mult); } catch (error:Error) { trace(error.getStackTrace()); } return bitmapData; } /** * Hide crosshair, logo, scalebar ... */ private function hideComponents():void { // TODO: complete code // force UIComponent update/redraw map.validateNow(); } /** * Restore hidden map components: crosshair, logo, scalebar ... * Restore map extent. */ private function showComponents():void { // TODO: complete code // restore map extent map.extent = mapExtent; mapExtent = null; } /** * @return extent of drawn graphic */ private function getDrawnExtent():Extent { var graphicProvider:ArrayCollection = graphicsLayer.graphicProvider as ArrayCollection; if (graphicProvider && graphicProvider.length > 0) { var graphic:Graphic = graphicProvider.getItemAt(0) as Graphic; var geometry:Geometry = graphic.geometry; graphicsLayer.clear(); return geometry.extent; } else { trace("Graphics provider is empty"); return null; } } /** * Draw button clicked */ protected function onActivateDrawTool(event:MouseEvent):void { trace("Draw button clicked"); graphicsLayer.clear(); drawTool.activate(DrawTool.EXTENT); drawTool.fillSymbol = new SimpleFillSymbol(SimpleFillSymbol.STYLE_NULL, 0, 0, new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID, 0, 1, 2)); } /** * Drawing ended */ protected function onDrawEnd(event:DrawEvent):void { trace("Drawing ended"); drawTool.deactivate(); } /** * File upload/download canceled by user */ protected function fileSaveCancel(event:Event):void { showComponents(); } /** * File upload/download completed */ protected function fileSaveComplete(event:Event):void { showComponents(); } ]]> </fx:Script> <fx:Declarations> <esri:DrawTool id="drawTool" drawEnd="onDrawEnd(event)" graphicsLayer="{graphicsLayer}" map="{map}"/> </fx:Declarations> <s:HGroup width="100%"> <mx:Image id="logo" source="http://edn.esri.com/common/style/images/esriLogoSm.gif" /> <s:Button label="Save as PNG" click="onSaveAsPng(event)" /> <s:Button label="Draw printable Extent" click="onActivateDrawTool(event)" /> </s:HGroup> <esri:Map id="map"> <esri:ArcGISTiledMapServiceLayer url="http://server.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer"/> <esri:GraphicsLayer id="graphicsLayer" /> </esri:Map> </s:Application>
Les membres connectés peuvent publier, suivre les mises à jour, et plus encore. Nouveau ici ? Inscrivez-vous gratuitement.
Find useful guides, FAQs, and documents to help you navigate and make the most of Esri Community.