检测swf的大小。的Flex / AS3

时间:2009-12-17 15:24:15

标签: flex actionscript-3 flash swfobject swfloader

我正在创建一个有兴趣点的地图。 (POI)当用户将鼠标悬停在POI上时,信息气泡会弹出到屏幕上并加载swf。我目前有3个问题。我的第四个问题是这是周一21日!所以任何帮助都将不胜感激!

  1. 我无法检测到swf的大小,因此我的信息块的大小会自动调整为swf的大小。

  2. 当我鼠标悬停在我的swf文件上时,它会消失。

  3. 我很想让我的swf文件自己弹出一层,而不是在我的主要flex文件的舞台上...但我不知道如何做到这一点。

  4. 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();
    }
    }
    }
    }
    

    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(); } } } }

    我希望你们更熟练的程序员可以帮助我。我是flex和as3

    的新手

    编辑:此文件中没有javascript。所有这些都是AS3。 Edit2:这是我在http://cjbutchershop.com/temp/adtypes/mapTest.swf

    上测试的临时网站

3 个答案:

答案 0 :(得分:1)

您可以通过以下方式获取应用程序的大小:

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

当您将鼠标悬停在信息气泡上时,文字会消失;你可能想重新考虑你的方法。我没有加载外部swf,而是通过向我的标记对象(扩展Sprite)添加/删除子对象(如TextField)来响应适当的鼠标事件,为适度的地图实现了信息气泡。

答案 1 :(得分:0)

我自己是Flex的新手,但我在学习的同时尝试了一些例子。 基本上我建议使用父窗口(在地图上)的MouseOver事件上的PopUpManager类在新的弹出窗口中打开气泡。 并在TitleWindow组件中显示弹出窗口,同时点击标题窗口组件上的关闭事件。这样你就会回到同一页面。希望这会有所帮助。

在此处发布代码

< ? xml version =“1.0”encoding =“utf-8”? >
< mx:应用程序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>

PopUP上显示的组件代码
&LT; ? xml version =“1.0”encoding =“utf-8”? &GT;
&LT; mx:TitleWindow xmlns:mx =“http://www.adobe.com/2006/mxml”         showCloseButton = “真”         的styleName = “noPadding”         creationComplete = “INIT();”          close =“titleWindow_close(event);”&gt;
        &LT; ![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>

&LT; / mx:TitleWindow&gt;

答案 2 :(得分:0)

“所以你试图从信息泡泡swf中获取应用程序大小?为什么信息泡泡在一个单独的swf?如果你有信息泡泡源代码,我建议将它添加到你的地图应用程序中并直接实例化info bubble object。 - elevine 2小时前“

我有三种不同类型的infoBubbles(仅显示静态气泡)。我的一些信息泡泡有移动的内容。我不是在寻找泡沫中外部swf的应用程序大小,我正在寻找物理尺寸。填充气泡的外部swf的高度和宽度。如果我知道高度和宽度,我可以让infobubble匹配高度和宽度。现在我将信息气泡硬编码到当前信息气泡的大小;但是,我将有不同大小的信息气泡swf文件。