1

I'm creating a map that has points of interest. (POI) When a user mouses over the POI an info bubble pops onto the screen and it loads an swf. I currently have 3 problems. My 4th problem is that this is due Monday 21st! so any help would be greatly appreciated!

  1. I can't detect the size of the swf so that my infobubble will size itself to the size of the swf.

  2. When I mouse over my swf file, it disappears.

  3. I would love to have the my swf file pop up in a layer on its own instead of being on the stage of my main flex file...but i have no clue how to do this.

package com.modestmaps
{
import flash.display.Graphics;
import flash.display.Loader;
import flash.display.Shape;
import flash.display.Sprite;
import flash.filters.BlurFilter;
import flash.geom.Matrix;
import flash.geom.Rectangle;
import flash.net.URLRequest;
import flash.text.TextField;

public class InfoBubble extends Sprite
{
public var textField:TextField;
public var background:Shape;
public var shadow:Shape;

public function InfoBubble(text:String)
{
//I name the instance of my POI marker on my map to the url link of my swf file. So whatever marker i click on the correct url will
this.name = urlLink;

this.mouseEnabled = true;
this.mouseChildren = false;

//this creates a shadow behind my infobubble
shadow = new Shape();
shadow.filters = [ new BlurFilter(16, 16) ];
shadow.transform.matrix = new Matrix(1, 0, -0.5, 0.5, 0, 0);
addChild(shadow);

background = new Shape();
addChild(background);

textField = new TextField();
textField.selectable = true;
textField.multiline = true;
textField.wordWrap = true;
//textField.text = urlLink;


textField.width = textField.textWidth+300;
textField.height = textField.textHeight+288;
//addChild(textField);

var request:URLRequest = new URLRequest(urlLink);
var loader:Loader = new Loader();
loader.load(request);
addChild(loader);

//marker clips are positioned with (0,0) at the given location
//current measurements of swf file w432 h288
//if i could dynamically determine the size of the loaded swf file its position would be automatically calculated

loader.y = -288 - 37;
loader.x = -8;


//marker clips are positioned with (0,0) at the given location
textField.y = -textField.height - 35;
textField.x = -10;

//currently my rectangle's size is determined by the textField size. I don't even use the textfield. I want the rectangle to be drawn using the dimensions of the swf file instead.
var rect:Rectangle = textField.getRect(this);

// get your graph paper ready, here's a "speech bubble"
background.graphics.beginFill(0x12345);
shadow.graphics.beginFill(0x000000);

for each (var g:Graphics in [ background.graphics, shadow.graphics ] ) {
g.moveTo(rect.left, rect.top);
g.lineTo(rect.right, rect.top);
g.lineTo(rect.right, rect.bottom);
g.lineTo(rect.left+15, rect.bottom);
g.lineTo(rect.left+10, rect.bottom+15);
g.lineTo(rect.left+5, rect.bottom);
g.lineTo(rect.left, rect.bottom);
g.lineTo(rect.left, rect.top);
g.endFill();
}
}
}
}

I hope you more skilled coders can help me out. I'm new to flex and as3

Edit: There is no javascript in this file. All of it is AS3. Edit2: This is the temporary site I am testing it on http://cjbutchershop.com/temp/adtypes/mapTest.swf

Phil
  • 11
  • 3

3 Answers3

1

You can get the size of your application by doing:

var width:int = Application.application.width;
var height:int = Application.application.height;

With regards to the text disappearing when you hover over the info bubble; you might want to reconsider your approach. Rather than loading an external swf, I have implemented info bubbles for modest maps by adding/removing child objects (like a TextField) to my marker object (which extends Sprite) in response to the appropriate mouse events.

Eric Levine
  • 13,536
  • 5
  • 49
  • 49
  • To clarify, if your swf is disappearing then something external to it might be the issue (like a JavaScript script being loaded into the web page). Can you post the HTML of the page containing your Flex application? – Eric Levine Dec 17 '09 at 15:47
  • I'm testing it out here: http://cjbutchershop.com/temp/adtypes/mapTest.swf obviously a work in progress as I haven't formatted my map controls – Phil Dec 17 '09 at 16:23
  • The swf disappearing issue is not occurring. What are the steps to reproduce it? – Eric Levine Dec 17 '09 at 16:34
  • if you mouseover the POI marker, the bubble appears until you mouseout. If you click the POI marker, the bubble stays on the screen until you either mouse over another marker or click another marker...i want to add a close button but that will come later. click on a POI marker and then move the mouse onto the bubble – Phil Dec 17 '09 at 17:01
  • got it! I figured it out. now my only problem is how do i determine the size of the swfobject? – Phil Dec 17 '09 at 18:17
  • What do you mean by swfobject? Application.application.width & width will give you the size of your Flex application. Do you need something different? – Eric Levine Dec 17 '09 at 18:30
  • My flex application runs the map...but the infobubble that pops up is populated by an external swf file. So that I can properly size my infobubble without hard coding it, i need to be able to get the height and width of the external swf file. – Phil Dec 17 '09 at 18:48
  • So you are trying to get the application size from within the info bubble swf? Why is the info bubble in a separate swf? If you have the info bubble source code, I suggest adding it into your map application and directly instantiate the info bubble object. – Eric Levine Dec 18 '09 at 00:33
0

I am new to Flex myself, but i have done something similar while trying out an example while learning. Basically what i suggest is Open the bubble in a new popup window using the PopUpManager class on MouseOver event on the parent window (on your map). And show the popup in a TitleWindow Component,also tap the close event on Title window component.That way you will come back to the same page.Hope this helps.

Posting code here

< ? xml version="1.0" encoding="utf-8" ? >
< mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical">

<mx:Script>
    <![CDATA[
        import mx.events.ListEvent;
        import mx.controls.Alert;
        import mx.managers.PopUpManager;
        import mx.rpc.events.ResultEvent;
        import mx.collections.ArrayCollection;

       [Bindable]
       public var photoFeed:ArrayCollection;

        public function searchFlickr():void {
            photoService.cancel();
            var params:Object = new Object();
                params.format = 'rss_200_enc';
                params.tags = srchTxtId.text;               
            photoService.send(params);
        }

        public function resultHandler(event:ResultEvent):void {
            photoFeed = event.result.rss.channel.item as ArrayCollection;
        }

        public function openPanel(levent:ListEvent):void {
            var panelCmpObj:panelcomp = new panelcomp();    
               panelCmpObj.source = levent.itemRenderer.data.content.url;           
            PopUpManager.addPopUp(panelCmpObj,this,true);
        }
        public function test():void {
            Alert.show('testtest');
            }           

    ]]>
</mx:Script>

<mx:HTTPService id="photoService" url="http://api.flickr.com/services/feeds/photos_public.gne" result="resultHandler(event)"/>

<mx:HBox width="362" height="24">
    <mx:TextInput id="srchTxtId"/>
    <mx:Button label="Search for pics" id="srchBtnId" click="searchFlickr()"/>
</mx:HBox>
<mx:TileList id="imgTileList" dataProvider="{photoFeed}" width="100%" height="100%" itemClick="openPanel(event)">   
<mx:itemRenderer>
    <mx:Component>
      <mx:VBox width="125" height="125"
            paddingBottom="5"
            paddingLeft="5"
            paddingTop="5"
            paddingRight="5">
            <mx:Image width="75" height="75" source="{data.thumbnail.url}"/>
      </mx:VBox>
    </mx:Component>
</mx:itemRenderer>
</mx:TileList>

CODE FOR THE COMPONENT shown on PopUP
< ? xml version="1.0" encoding="utf-8" ? >
< mx:TitleWindow xmlns:mx="http://www.adobe.com/2006/mxml" showCloseButton="true" styleName="noPadding" creationComplete="init();" close="titleWindow_close(event);" >
< ![CDATA[ import mx.managers.IFocusManagerComponent; import mx.controls.Alert; import mx.core.IFlexDisplayObject; import mx.events.CloseEvent; import mx.managers.PopUpManager;

        [Bindable]
        public var source:String;

        private function init():void {
            PopUpManager.centerPopUp(this);
        }

        private function titleWindow_close(evt:CloseEvent):void {
            PopUpManager.removePopUp(evt.target as IFlexDisplayObject);
        }
    ]] >
< /mx:Script>

< mx:Image width="379" height="261" id="imgId" source="{source}"/>
   <mx:ControlBar horizontalAlign="right" width="100%">
</ mx:ControlBar>

< /mx:TitleWindow >

Rajat
  • 1,095
  • 1
  • 13
  • 20
0

"So you are trying to get the application size from within the info bubble swf? Why is the info bubble in a separate swf? If you have the info bubble source code, I suggest adding it into your map application and directly instantiate the info bubble object. – elevine 2 hours ago"

I have three different type of infoBubbles (only static bubble is shown). Some of my info bubbles have moving content. I am not looking for the application size of the external swf in the bubble, i am looking for the physical size. The height and width of the external swf that is populating the bubble. If I knew the height and width, I can have the infobubble match the height and width. Right now I have the info bubble hardcoded to the size of the current info bubble; however, i will have different sizes of info bubbles swf files.

Phil
  • 261
  • 2
  • 7
  • 20