﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Pursuit-文章分类-FLEX</title><link>http://www.blogjava.net/Pursuit/category/47954.html</link><description /><language>zh-cn</language><lastBuildDate>Sun, 06 Mar 2011 21:25:41 GMT</lastBuildDate><pubDate>Sun, 06 Mar 2011 21:25:41 GMT</pubDate><ttl>60</ttl><item><title>Flex 居中放大缩小</title><link>http://www.blogjava.net/Pursuit/articles/345419.html</link><dc:creator>Pursuit</dc:creator><author>Pursuit</author><pubDate>Tue, 01 Mar 2011 08:11:00 GMT</pubDate><guid>http://www.blogjava.net/Pursuit/articles/345419.html</guid><wfw:comment>http://www.blogjava.net/Pursuit/comments/345419.html</wfw:comment><comments>http://www.blogjava.net/Pursuit/articles/345419.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Pursuit/comments/commentRss/345419.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Pursuit/services/trackbacks/345419.html</trackback:ping><description><![CDATA[<p>最近在用FLEX做拓扑图的放大缩小功能时发现，采用放大缩小画布的方法，但是默认的是以原点（0,0），而不是以中心点放大缩小。后来参考了BirdEye（<a href="http://birdeye.googlecode.com/svn/trunk/ravis/RaVisExamples/example-binaries/RaVisExplorer.html">http://birdeye.googlecode.com/svn/trunk/ravis/RaVisExamples/example-binaries/RaVisExplorer.html</a>）的原代码，采用整体移动画布上所有对象到中心点的方法来实现居中放大缩小。<br />
目前有些产品采用原点放大缩小,如Twaver。<br />
<br />
参考部分源代码：<br />
public class VisualGraph extends Canvas implements IVisualGraph {<br />
</p>
<p>/**<br />
&nbsp;&nbsp; * @inheritDoc<br />
&nbsp;&nbsp; * */<br />
&nbsp;&nbsp;public function get scale():Number {<br />
&nbsp;&nbsp;&nbsp;return _scale;<br />
&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;/**<br />
&nbsp;&nbsp; * @inheritDoc<br />
&nbsp;&nbsp; * */<br />
&nbsp;&nbsp;public override function get scaleY():Number<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;var curScale:Number;<br />
&nbsp;&nbsp;&nbsp;curScale = super.scaleY;<br />
&nbsp;&nbsp;&nbsp;var parentComp:DisplayObject = this.parent;<br />
&nbsp;&nbsp;&nbsp;while(parentComp &amp;&amp; !(parentComp is VisualGraph))<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;curScale *= parentComp.scaleY;<br />
&nbsp;&nbsp;&nbsp;&nbsp;parentComp = parentComp.parent;<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;return curScale;<br />
&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;/**<br />
&nbsp;&nbsp; * @inheritDoc<br />
&nbsp;&nbsp; * */&nbsp;&nbsp;<br />
&nbsp;&nbsp;public override function get scaleX():Number<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;var curScale:Number;<br />
&nbsp;&nbsp;&nbsp;curScale = super.scaleX;<br />
&nbsp;&nbsp;&nbsp;var parentComp:DisplayObject = this.parent;<br />
&nbsp;&nbsp;&nbsp;while(parentComp &amp;&amp; !(parentComp is VisualGraph))<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;curScale *= parentComp.scaleX;<br />
&nbsp;&nbsp;&nbsp;&nbsp;parentComp = parentComp.parent;<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;return curScale;<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;/**设置画布缩放比例<br />
&nbsp;&nbsp; * @private<br />
&nbsp;&nbsp; * */<br />
&nbsp;&nbsp;public function set scale(s:Number):void {<br />
&nbsp;&nbsp;&nbsp;/* get the current value */<br />
&nbsp;&nbsp;&nbsp;const s0:Number = _canvas.scaleX;<br />
&nbsp;&nbsp;&nbsp;/* set the new value */<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;/* Fix Scaling problem (Scrollbar shouldn't scale with graph)*/&nbsp;<br />
&nbsp;&nbsp;&nbsp;//scaleX = s;<br />
&nbsp;&nbsp;&nbsp;//scaleY = s;<br />
&nbsp;&nbsp;&nbsp;_canvas.scaleX = s;<br />
&nbsp;&nbsp;&nbsp;_canvas.scaleY = s;<br />
&nbsp;&nbsp;&nbsp;/* scroll to the center */<br />
&nbsp;&nbsp;&nbsp;scroll(center.x * (1 - s / s0) / s, center.y * (1 - s / s0) / s,false);&nbsp;&nbsp;//实现居中方法<br />
&nbsp;&nbsp;&nbsp;/* redraw the edges */<br />
&nbsp;&nbsp;&nbsp;refresh();<br />
&nbsp;&nbsp;&nbsp;/* remember the set value, this is probably unnecesary<br />
&nbsp;&nbsp;&nbsp; * since the getter could just return the value of scaleX<br />
&nbsp;&nbsp;&nbsp; * but anyway */<br />
&nbsp;&nbsp;&nbsp;_scale = s;<br />
&nbsp;&nbsp;}<br />
&nbsp;/**<br />
&nbsp;&nbsp; * @inheritDoc<br />
&nbsp;&nbsp; * */<br />
&nbsp;&nbsp;public function scroll(deltaX:Number, deltaY:Number, reset:Boolean):void {<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;var i:uint;<br />
&nbsp;&nbsp;&nbsp;var children:Array;<br />
&nbsp;&nbsp;&nbsp;var view:UIComponent;<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;children = _canvas.getChildren();<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;/* we walk through all children of the canvas, which<br />
&nbsp;&nbsp;&nbsp; * are not the drawing surface and which are UIComponents<br />
&nbsp;&nbsp;&nbsp; * (they should be all node views) and move them according<br />
&nbsp;&nbsp;&nbsp; * to the scroll offset */<br />
&nbsp;&nbsp;&nbsp;for each(view in children) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;if(view != _drawingSurface) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//LogUtil.debug(_LOG, "scrolling view of:"+(view as IDataRenderer).data.id);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view.x += deltaX;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view.y += deltaY;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;if(reset) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;_origin = new Point(0,0);<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;/* adjust the current origin of the canvas<br />
&nbsp;&nbsp;&nbsp; * (not 100% sure if this is a good idea but seems<br />
&nbsp;&nbsp;&nbsp; * to work) XXX */<br />
&nbsp;&nbsp;&nbsp;_origin.offset(deltaX,deltaY);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* we have to force the edges to redraw so they match the nodes*/<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _forceUpdateEdges = true;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; invalidateDisplayList();<br />
&nbsp;&nbsp;&nbsp;//LogUtil.debug(_LOG, "Setting new origin to:"+_origin.toString());<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;<br />
}</p>
<img src ="http://www.blogjava.net/Pursuit/aggbug/345419.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Pursuit/" target="_blank">Pursuit</a> 2011-03-01 16:11 <a href="http://www.blogjava.net/Pursuit/articles/345419.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于Flex安全沙箱问题的解决</title><link>http://www.blogjava.net/Pursuit/articles/345413.html</link><dc:creator>Pursuit</dc:creator><author>Pursuit</author><pubDate>Tue, 01 Mar 2011 06:41:00 GMT</pubDate><guid>http://www.blogjava.net/Pursuit/articles/345413.html</guid><wfw:comment>http://www.blogjava.net/Pursuit/comments/345413.html</wfw:comment><comments>http://www.blogjava.net/Pursuit/articles/345413.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Pursuit/comments/commentRss/345413.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Pursuit/services/trackbacks/345413.html</trackback:ping><description><![CDATA[<p>最近遇到了flex 的安全沙箱问题，找了很多资料发现不是都是和我，我的程序需要socket连接，而大多数讲的都是跨域文件读取的。我先把两种方法都总结出来：</p>
<p><strong>跨域文件读取</strong></p>
<p>方法一：在目标服务器上布署crossdomain.xml文件(我用的此方法很管用，放上就没问题了) 需要远程服务根目录定义有crossdomain.xml文件，如下：</p>
<p>&lt;?xml version="1.0" encoding="UTF-8" ?&gt; &lt;cross-domain-policy&gt;&nbsp;&nbsp;&nbsp;&nbsp; &lt;allow-access-from domain="*"/&gt; &lt;/cross-domain-policy&gt;</p>
<p>方法二：使用代理，把Flex要访问的远程文件通过asp, php, jsp等脚本读取到本地，然后再由Flex去访问；</p>
<p>方法三：使用Adobe flash player 9 打开程序后，点击菜单栏中文件-&gt;创建播放器...即生成exe文件，运行exe文件即可突破安全限制；</p>
<p>方法四：&nbsp;&nbsp;&nbsp;&nbsp; 1、找到这个文件夹：c:\Documents and Settings\&lt;UserName&gt;\Application&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Data\Macromedia\Flash Player\#Security&nbsp;&nbsp;&nbsp;&nbsp; 2、在其下建立一个名为"FlashPlayerTrust"的文件夹&nbsp;&nbsp;&nbsp;&nbsp; 3、在"FlashPlayerTrust"文件夹下新建一TXT文件，内容如下：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c:\&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d:\&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e:\&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f:\&nbsp;&nbsp;&nbsp;&nbsp; 4、将该txt文件命名为:"myTrustFiles.cfg"&nbsp;&nbsp;&nbsp;&nbsp; 再打开你硬盘里的SWF文件,就不会出现那个烦人的安全设置提示窗口了!</p>
<p>方法五： 用HttpService它默认是有Proxy的，需要配置flex-config.xml，里面有一段： &lt;http-service-proxy&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;whitelist&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/whitelist&gt; &lt;/http-service-proxy&gt; </p>
<p>这个是白名单，一般情况下是注释掉的，也就是默认只有本地的http://{localserver}/*和https://{localserver}/*可以访问。其他的需要在flex-config.xml里的自行修改成需要的就可以了。 </p>
<p>访问本地自然不会跨域，不过你肯定访问局域网其他机器了，所以是依照白名单规则，属于跨域</p>
<p><strong>Socket沙箱问题（已验证）</strong></p>
<p>在Flex中使用Socket进行通信时,也会受到Flash9的新安全策略的困扰. 解决方法不能像在Web服务器中布置一个crossdomain.xml来解决,或是在服务器上专门开启843端口来提供安全策略. 有一种方法就是在接收到客户端的连接后,向其发送 安全策略.</p>
<p>比如我是用JAVA来开发, 客户端的Flex会先搜索同域,及服务器的843口,看是否能得到安全策略,这时候Socket是先建立好的,可以在接收到Socket ,即Accept事件发生是,马上向其发送 策略串,否则客户端就会因为安全策略不过关,于断开, 如果成功获取策略,则客户端将断掉先前的那次Socket, 再真正进行程序中你要求的Socket连接请求.</p>
<p>下面看看我找的例子吧！</p>
<p>public void run() { <br />
ServerSocket ss; <br />
String ip = ""; <br />
try { <br />
ip = InetAddress.getLocalHost().getHostAddress(); <br />
} catch (UnknownHostException e1) { <br />
e1.printStackTrace(); <br />
} <br />
String xml = "&lt;cross-domain-policy&gt;&lt;site-control permitted-cross-domain-policies=\"all\"/&gt;"; <br />
xml = xml + "&lt;allow-access-from domain=\"" + ip + "\" to-ports=\"1234\" /&gt;"; <br />
xml = xml + "&lt;/cross-domain-policy&gt;"; </p>
<p>try { <br />
ss = new ServerSocket(port); <br />
while (!cancle) { <br />
Socket s = ss.accept(); </p>
<p>BufferedReader br = new BufferedReader(new InputStreamReader(s <br />
.getInputStream(), "UTF-8")); <br />
PrintWriter pw = new PrintWriter(s.getOutputStream()); <br />
char[] by = new char[22]; <br />
br.read(by, 0, 22); <br />
String head = new String(by); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //判断是不是第一求请求连接的安全验证，当客户端连socket时,as3会自动向服务端发送&lt;policy-file-request/&gt;这个字符串请求返回策略文件，所以当服务器收到这个串后给client返回就好了。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //如果是返回xML信息 <br />
if (head.equals("&lt;policy-file-request/&gt;")) { <br />
System.out.println("连接服务器"); <br />
pw.print(xml + "\0"); <br />
pw.flush(); <br />
br.close(); <br />
pw.close(); <br />
} else { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //你自己的正常请求处理逻辑 <br />
} </p>
<p>} <br />
ss.close(); <br />
} catch (IOException e) { <br />
e.printStackTrace(); <br />
} <br />
} </p>
 <img src ="http://www.blogjava.net/Pursuit/aggbug/345413.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Pursuit/" target="_blank">Pursuit</a> 2011-03-01 14:41 <a href="http://www.blogjava.net/Pursuit/articles/345413.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>