12条有用的Flex代码、Flex程序开发心得小结

1.复制内容到系统剪贴板
System.setClipboard(strContent);


2.复制一个ArrayCollection

   //dummy solution( well, it works )
   var bar:ArrayCollection = new ArrayCollection();
   for each ( var i:Object in ac ){
       bar.addItem( i );
   }
   // fantastic ! //
   var bar:ListCollectionView = new ListCollectionView( ListCollectionView( ac ).list );


3.打开一个新浏览器窗口
navigateToURL(new URLRequest('http://ntt.cc'), '_blank');


4.刷新浏览器
navigateToURL(new URLRequest("javascript:location.reload();"),"_self")


5.关闭浏览器
navigateToURL(new URLRequest("javascript:window.close()"),"_self");


6.设置Alert 窗口的背景为透明
Alert
    {
    modalTransparency:0.0;  
    modalTransparencyBlur:0;
    }


7.取随机颜色

lbl.setStyle('color', 0xffffff*Math.random());


8.清除子串左侧空格

public function LTrim(s : String):String
    {
      var i : Number = 0;
      while(s.charCodeAt(i) == 32 || s.charCodeAt(i) == 13 || s.charCodeAt(i) == 10 || s.charCodeAt(i) == 9)
      {
        i++;
      }
      return s.substring(i,s.length);
    }


9.清除字串右侧空格
public function RTrim(s : String):String
    {
      var i : Number = s.length - 1;
      while(s.charCodeAt(i) == 32 || s.charCodeAt(i) == 13 || s.charCodeAt(i) == 10 ||s.charCodeAt(i) == 9)
      {
        i--;
      }
      return s.substring(0,i+1);
    }


10.清除字串左右的空格
public function Trim(s : String):String
    {
      return LTrim(RTrim(s));
    }


11.获取数据类型

getQualifiedClassName(data)


12.生成随机字符串.
private function GenerateCheckCode():String
   {
       //init
       var ran:Number;
       var number:Number;
       var code:String;
       var checkCode:String ="";
       //get 4 radom
      for(var i:int=0; i<4; i++)
      {
          ran=Math.random();
          number =Math.round(ran*10000);            //get result like 0.1234
          if(number % 2 == 0)
            code = String.fromCharCode(48+(number % 10));        //0's ASCII code is 48
          else
            code = String.fromCharCode(65+(number % 26)) ;        // A's ASCII code is 65
          checkCode += code;
      }
      return checkCode;
  }

 

 

一 、System.setClipboard("给系统剪切板赋值 "); 用于给系统的剪切板赋值。
二、var objectid =  ExternalInterface.objectID; //在 Internet Explorer 中返回 object 标签的 id 属性,或者在 Netscape 中返回 embed 标签的 name 属性。
三、如果要创建一个自定义组件,你需要重写 UIComponent 类的某些方法,最少需要重写如下方法(按先后顺序):构造函数 , createChildren(), commitProperties(), measure(), layoutChrome(), updateDisplayList() 。
四、改变输出swf的尺度,背景颜色或帧频
在”Navigator”窗框里右键你的项目>选中”Properties”>选中”ActionScript Compiler”>在”Additional compiler arguments”里输入你所需要的命令
如想改变背景颜色,请输入: -default-background-color 0xffffff
五、是数字但不是有效数字问题
var quantity:Number = 15 - “rabbits”;
trace(typeof quantity); //显示: “number” , 但它是NaN (not a number)
trace(quantity is Number); //true
trace(quantity != NaN); //false
//使用isNaN()函数检测:
isNaN(quantity); //true
//检测变量是否内含有效数字:
!isNaN(quantity); //false
六、Timer类注意事项
不要认为Timer可以极其准确;使用Timer时间间隔不要低于10毫秒.
七、for…in与for each…in的区别
与for…in循环不同的是,for each…in循环中的迭代变量包含属性所保存的值,而不包含属性的名称(或主键,索引)
八、隐藏Flash Player的右键菜单
stage.showDefaultContextMenu = false;
九、让其它域的.swf访问本域的.swf
在本域的.swf文件里加上:flash.system.Security.allowDomain()
或 者使用安全策略文件”crossdomain.xml”.在Flash 8以前,这个文件必须放在.swf所在域的根目录,现在,你可以使用flash.system.Security.loadPolicyFile(),指定安全策略文件所在的位置.拒绝任何域的做法是在<cross-domain-policy>标签内什么也不填,安全策略文件也支持通用字符 “*”:
<?xml version=”1.0″?>
<!– http://www.mydomain.com/crossdomain.xml –>
<cross-domain-policy>
<allow-access-from domain=”www.riahome.cn” />
<allow-access-from domain=”*.Y-boy.cn” />
<allow-access-from domain=”210.38.196.48″ />
<allow-access-from domain=”*” />
</cross-domain-policy>
十、把数字取至最近的小数点位,即指定精确度
1. 决定你要取的数字的小数点位数:例如,如果你想把90.337取成90.34,就表示你要取到两位小数点位,也就是说你想取至最近的0.01;
2. 让输入值除以步骤1所选的数字(此例为0.01);
3. 使用Math.round()把步骤2所计得的值取成最近的整数;
4. 把步骤3所得的结果乘以步骤2用于除法的那个值.
例如,要把90.337取成两个小数点位数,可以使用:
trace(Math.round(90.337/0.01)*0.01); //输出:90.34

十一、把数字取成一个整数的最接近倍数值
例1,这样会把92.5取成5的最近倍数值:
trace(Math.round(92.5/5)*5); //输出:95
例2,这样会把92.5取成10的最近倍数值:
trace(Math.round(92.5/10)*10); //输出:90

十二、在指定数值范围内获得随机数
//可取范围:[min, max]
private function randRange(min:Number, max:Number):Number {
var randomNum:Number = Math.floor(Math.random() * (max - min + 1)) + min;
return randomNum;
}
十三、把数组转成字符串
使用String.join()方法:
var myArr:Array = new Array(”one”, “two”, “three”);
var myStr:String = myArr.join(” and “);
trace(myArr); //输出: one,two,three
trace(myStr); //输出: one and two and three

十四、在数组中获取最小或最大值
var scores:Array = [10, 4, 15, 8];
scores.sort(Array.NUMERIC);
trace(”Minimum: ” + scores[0]);
trace(”Maximum: ” + scores[scores.length - 1]);

十五、使用for … in语句读取关联数组元素
var myObject:Object = new Object();
myObject.name = “YoungBoy”;
myObject.age = 20;
for(var i:String in myObject) {
trace(i + “: ” + myObject);
}
//输出: name: YoungBoy
//       age: 20
注意: for … in循环不会显示对象所有的内建属性.例如,循环会显示执行期间新增的特殊属性,但是,不会列出内建对象的方法,即使都是储存在对象属性内。

十六、过滤文字输入
TextField.restrict = “此处为可输入的内容”;
field.restrict = “^此处为禁止输入的内容”;
restrict属性支持一些类似正则表达式的样式:
field.restrict = “a-zA-z”; //只允许大小字母
field.restrict = “a-zA-z “; //只允许字母和空格
field.restrict = “0-9″; //只允许数字
field.restrict = “^abcdefg”; //除了小写字母abcdefg不允许外,其它都允许
field.restrict = “^a-z”; //所有小写字母都不允许,但是,其它内容都允许,包括大写字母
field.restrict = “0-9^5″; //只允许数字,但5例外
让restrict字符包含具有特殊意义的字母(例如-和^):
field.restrict = “0-9\\-”; //允许数字和破折号
field.restrict = “0-9\\^”; //允许数字和^
field.restrict = “0-9\\\\”; //允许数字和反斜杠
你也可以使用Unicode转义序列,指定允许的内容.例如:
field.restrict = “^\u001A”;
注意:ActionScript有区分大小写的,如果restrict属性设为abc,允许字母的大写形式(A,B和C)输入时会变成小写对待形式(a,b和c),反之亦然.restrict属性只影响用户可以输入的内容,脚本可将任何文本放入文本字段中.

十七、SystemManager
SystemManager 是Flex应用的主控者, 它控制着应用窗口, Application实例, 弹出窗口, cursors, 并管理着ApplicationDomain中的类. SystemManager是FlashPlayer实例化的第一个类, 它存储了主应用窗口的大小和位置信息, 保存其子组件比如:浮动弹出窗口和模态窗口的痕迹. 通过SystemManager可以获得内嵌字体,样式和document对象.
自定义的可视化组件(UIComponent的子类)只有在调用过addChild()后, 才会有一个SystemManager赋给他们, 之前是Null. 所以在自定义可视化组件的构造函数中不要使用SystemManager。

十八、Flex Application 初始化顺序
通常, Application对象创建时, 发生如下事件:
1. 实例化Application对象
2. 初始化Application.systemManager
3. Application在初始化过程之前, 派发预初始化事件.
4. 调用createChild(). 此时, 所有应用组件被创建, 所有组件的createChild()被调用.
5. Application派发初始化事件, 表明所有的组件初始化完毕.
6. 派发creationComplete事件
7. Application对象添加到显示列表中
8. 派发applicationComplete事件
Flash 包含的是一个时间线上的多个帧, 而Flex的SWF只包含2个帧. SystemManager, Preloader, DownloadProgressBar和少量工具类都在第一帧, 剩下的包括应用代码/ 内嵌资源全都在第二帧中. 当Flash Player下载下载SWF时, 只要接收到第一帧内足够的数据, 就会实例化SystemManager, 由它来创建Preloader, 然后创建DownloadProgressBar, 这两个对象会察看剩余字节的传输过程. 当第一帧的所有字节传输完毕后, SystemManager发送enterFrame到第二帧, 然后是其他事件. 最后Application对象派发applicationComplete事件。

十九、FLEX 与 JSP 传递中文的问题
情况分析:Flex默认使用的都是utf-8编码,包括Get、Post等方法。而Tomcat服务器端接收request对象默认是ISO_8859_1编码。
1.FLEX to JSP:
情况一:MXML源代码文件中写入中文字符
    Flex使用 System.useCodepage = true; //即使用本地操作系统编码(GBK)设置Flex的处理编码。Jsp中用依然用ISO_8859_1编码来处理,并转化为GBK。这样Jsp可以正确解释Flex传递的中文字符。这个时候可以认为Flex对mxml源代码文件进行编译时候,源代码中的中文字符已经混乱了,所以要加上 System.useCodepage = true;,按GBK编码将中文字符从Flex发送到Tomcat。同时Tomcat中Jsp应该按GBK重新编码。(如下,categoryID 在FLEX 中赋值为中文字符)
String categoryID = request.getParameter("categoryID");
String strOut = new String(categoryID.getBytes("ISO8859-1"), "GBK");
情况二:FLEX 运行时由输入框输入中文字符
       输入框输入的中文字符是一定为utf-8编码的,所以Flex中System.useCodepage = false; 或者不设置,就默认utf-8编码格式传递数据,而Tomcat中Jsp使用下面语句按utf-8来重新编码。
String categoryID = request.getParameter("categoryID");
String strOut = new String(categoryID.getBytes("ISO8859-1"), "utf-8");
2.JSP to FLEX:
情况一:FLEX 接收 JSP 页面的中文参数
Jsp页面用页面指令<%@ page contentType="text/html;charset=utf-8"%>设置,返回结果是utf-8编码,Flex接收后成功解释并正确显示。
情况二:将MXML文件中的<mx:application>标签内容复制到JSP页面中,
(页面中含有中文字符)
    Jsp页面使用指令<%@ page contentType="text/html;charset=gb2312/gbk"%>设置即可。

二十、在Flex中添加右键菜单及页面跳转
var myContextMenu : ContextMenu = new ContextMenu();
var GoUrl : ContextMenuItem = new ContextMenuItem("欢迎您!");
GoUrl.addEventListener(ContextMenuEvent.MENU_ITEM_Select,GoUrlClick);
myContextMenu.customItems.push(GoUrl);
myContextMenu.hideBuiltInItems();
this.contextMenu = myContextMenu;

private function GoUrlClick(event:ContextMenuEvent):void {
       navigateToURL(new URLRequest("http:// dragonfly.autodesk.com"),"_blank");
}

 

 

1、避免容器的多级嵌套,减少相对尺寸、相对定位的使用。
在使用百分比来给容器内的元件定尺寸,一旦容器中的任何一个元件的位置和尺寸变化,都会引发容器对所有子级的重定位动作。如果嵌套的级别很深,这个计算量会很大。

2、尽量使用轻量级的容器
Canvas是体积最小的容器,它只支持绝对定位。很多时候,都可以使用它来代替HBOx和VBox。另外,Canvas也是我们编写自定义容器性质组件的一个首选。它具有容器的基本功能,利于扩展。

3、避免使用大体积的组件,比如DataGrid、AdvancedDataGrid
大个子组件的功能强大,但开销也是非常大的。由于功能的复杂性,使得皮肤、样式、itemRenderer的实现都格外复杂。

4、处理数据时多用分页的方式
在使用数据类型控件时,尽量减少数据一次的显示量。比如TileList,它会把数据一次性全部创建,不管是不是需要显示,这样很浪费资源。 ViewStack 、TabNavigator等在处理元件时,并不是一次创建,只要元件在第一次被显示时才创建,这样,就避免的不必要的开销。

5、setStyle和styleName
Flex 组件的皮肤都是可视化元件,组件在自身初始化时,会使用当前的样式比如styleName完成所有皮肤元件的绘制。如果我们在运行期间通过setStyle修改了组件的样式,组件的尺寸、位置就会作相应调整。联系到第一条,如果组件位于一个层级很深的容器中,也会有一个大的计算量。


你可能感兴趣的:(12条有用的Flex代码、Flex程序开发心得小结)