首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Adobe Illustrator到Flash Builder 4.6

Adobe Illustrator到Flash Builder 4.6
EN

Stack Overflow用户
提问于 2013-04-11 07:14:28
回答 2查看 869关注 0票数 1

我有一张.ai格式的美国地图。我想在我的flex应用程序中使用它。

问题是地图是在州线上切片的,我想在应用程序中操作州。

说明:在我的应用程序中,我希望能够点击一个州来突出显示它,然后将所有其他州从场景中剔除,然后再将所有州带回来,以创建整个国家。就像拼图一样。

我将FXG文件从Adobe Illustrator导入到Flash Builder4中的Flex应用程序中,但我不能一次操作每个状态!

真的很感谢你的帮助!干杯

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-18 02:51:55

我最终将fxg转换为MXML...

我使用以下代码来完成此操作:

FXG to MXML Converter

我更改了

d:用户标签

转换为属性ID,并且运行得非常好!

票数 1
EN

Stack Overflow用户

发布于 2013-04-11 19:22:00

有一个FxgParser库,但是如果状态名称在.fxg文件中被标记为d:userLabel属性,那么它似乎不会输出状态名称。不过,您可以修改源代码以修复此问题。

以下是如何::

编辑fxgparser.parser.Path.as,然后在类的顶部添加此命名空间:

代码语言:javascript
复制
public static const aab:Namespace = new Namespace("aab", "http://ns.adobe.com/fxg/2008/dt");

然后在parse()方法的末尾添加以下内容:

代码语言:javascript
复制
target.name = data.currentXml.@aab::userLabel;

正如Illustrator所示,CS6似乎添加了userLabel属性,而不是id或其他属性,而FxgParser默认情况下会忽略这一点。

代码将非常类似于上面的代码:

代码语言:javascript
复制
package  {

    import flash.display.*;
    import flash.events.*;
    import flash.geom.Point;
    import flash.net.*;
    import flash.utils.Dictionary;

    import com.greensock.*;
    import fxgparser.FxgDisplay;

    [SWF(width='1368', height='936', backgroundColor='#ffffff', frameRate='30')]
    public class FXGTest extends Sprite{

        private var states:Sprite;//container holding each state Shape
        private var positions:Dictionary = new Dictionary();//original position to restore states to

        public function FXGTest() {
            addEventListener(Event.ADDED_TO_STAGE,init);
        }
        private function init(e:Event):void{
            new URLLoader(new URLRequest("usa-wikipedia.fxg")).addEventListener(Event.COMPLETE,fxgLoaded);
        }
        private function fxgLoaded(e:Event):void{
            //trace(e.target.data);
            var map:FxgDisplay = addChild(new FxgDisplay( new XML(e.target.data) )) as FxgDisplay;
            trace(listChildren(map));
            //map.item.item.item.*
            states = Sprite(Sprite(Sprite(map.getChildAt(0)).getChildAt(0)).getChildAt(0));
            for(var i:int = 0 ; i < states.numChildren; i++){
                var s:DisplayObject = DisplayObject(states.getChildAt(i));//can't add mouse listeners because the states are Shape instances
                positions[s.name] = new Point(s.x,s.y);//store the positions in a hash to get the state position by name
            }
            stage.addEventListener(MouseEvent.CLICK,handleClick);
        }
        private function handleClick(e:MouseEvent):void{
            if(e.target is Stage) restore();
            else blast(getObjectsUnderPoint(new Point(mouseX,mouseY))[0].name);//named shapes are stored in a sprite so use getObjetsUnderPoint
        }
        private function blast(name:String):void{
            var blastRadius:Number = stage.stageWidth+stage.stageHeight;//or some other number
            var c:DisplayObject = states.getChildByName(name);//selected
            for(var i:int = 0 ; i < states.numChildren; i++){
                var s:DisplayObject = states.getChildAt(i);
                if(s != c){//everything else goes except this
                    var angle:Number = Math.atan2(s.y-c.y,s.x-c.x);//direction relative to the clicked state
                    var x:Number = s.x + (Math.cos(angle) * blastRadius);//get a position offset from the clicked state (blast centre) 
                    var y:Number = s.y + (Math.sin(angle) * blastRadius);//outwards at a random angle
                    TweenLite.to(s,1+Math.random() * 2,{x:x,y:y});//tween with different speeds for a bit of depth
                }
            }
        }
        private function restore():void{
            for(var i:int = 0 ; i < states.numChildren; i++){
                var s:DisplayObject = DisplayObject(states.getChildAt(i));
                TweenLite.to(s,.5+Math.random() * .5,{x:positions[s.name].x,y:positions[s.name].y});//tween states back into the original positions
            }
        }
        private function listChildren(d:DisplayObjectContainer):String{
            var result = 'parent: '+d.name+'\n\t';
            for(var i:int = 0 ; i < d.numChildren; i++){
                var c:DisplayObject = d.getChildAt(i);
                result += '\tchild: '+c.name+'\n';
                if(c is DisplayObjectContainer) result += listChildren(DisplayObjectContainer(c));
            }
            return result;
        }


    }

}

你也可以下载上面的类,修改后的fxgparser库和状态fxg并查看运行中的演示here或者你可以使用SVG而不是FXG.The同样的开发者也有一个SvgParser库,你可以这样得到:

代码语言:javascript
复制
svn export http://www.libspark.org/svn/as3/SvgParser

您可以轻松地将.ai文件另存为.svg文件。下面是一个使用US map from wikipedia的简单示例

代码语言:javascript
复制
package  {
    import flash.display.*;
    import flash.events.*;
    import flash.geom.Point;
    import flash.net.*;
    import flash.utils.Dictionary;

    import svgparser.SvgDisplay;
    import com.greensock.*;

    [SWF(width='1368', height='936', backgroundColor='#ffffff', frameRate='30')]
    public class SVGTest extends Sprite {

        private var states:Sprite;//container holding each state Shape
        private var positions:Dictionary = new Dictionary();//original position to restore states to

        public function SVGTest() {
            addEventListener(Event.ADDED_TO_STAGE,init);//make sure we have the stage ready
        }
        private function init(e:Event):void{
            removeEventListener(Event.ADDED_TO_STAGE,init);//stage ready, load the svg
            new URLLoader(new URLRequest("http://upload.wikimedia.org/wikipedia/commons/3/32/Blank_US_Map.svg")).addEventListener(Event.COMPLETE,svgLoaded);
        }
        private function svgLoaded(e:Event):void{//svg loaded
            var map:SvgDisplay = addChild(new SvgDisplay( new XML(e.target.data) )) as SvgDisplay;//use the parser
            trace(listChildren(map));//quick debug of the maps display list
            states = Sprite(map.getChildAt(0));//we want to access the main container
            for(var i:int = 0 ; i < states.numChildren; i++){
                var s:DisplayObject = DisplayObject(states.getChildAt(i));//can't add mouse listeners because the states are Shape instances
                positions[s.name] = new Point(s.x,s.y);//store the positions in a hash to get the state position by name
            }
            stage.addEventListener(MouseEvent.CLICK,handleClick);
        }
        private function handleClick(e:MouseEvent):void{
            if(e.target is Stage) restore();
            else blast(getObjectsUnderPoint(new Point(mouseX,mouseY))[0].name);//named shapes are stored in a sprite so use getObjetsUnderPoint
        }
        private function blast(name:String):void{
            var blastRadius:Number = stage.stageWidth+stage.stageHeight;//or some other number
            for(var i:int = 0 ; i < states.numChildren; i++){
                var s:DisplayObject = states.getChildAt(i);
                if(s.name != name){//everything else goes except this
                    var angle:Number = Math.random() * Math.PI * 2;//pick a random angle
                    var x:Number = s.x + Math.cos(angle) * blastRadius;//get a position offset from the clicked state (blast centre) 
                    var y:Number = s.y + Math.sin(angle) * blastRadius;//outwards at a random angle
                    TweenLite.to(s,1+Math.random() * 2,{x:x,y:y});//tween with different speeds for a bit of depth
                }
            }
        }
        private function restore():void{
            for(var i:int = 0 ; i < states.numChildren; i++){
                var s:DisplayObject = DisplayObject(states.getChildAt(i));
                TweenLite.to(s,.5+Math.random() * .5,{x:positions[s.name].x,y:positions[s.name].y});//tween states back into the original positions
            }
        }
        private function listChildren(d:DisplayObjectContainer):String{//recursively traverse a display list and list children names
            var result = 'parent: '+d.name+'\n\t';
            for(var i:int = 0 ; i < d.numChildren; i++){
                var c:DisplayObject = d.getChildAt(i);
                result += '\tchild: '+c.name+'\n';
                if(c is DisplayObjectContainer) result += listChildren(DisplayObjectContainer(c));
            }
            return result;
        }

    }

}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15938148

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档