AS使用小技巧(二)

  1. 【精确获取某行的索引值】   
  2. 在 x 和 y 参数指定的位置返回从零开始的行索引值   
  3. TextField.getLineIndexAtPoint(x:Number, y:Number): int   
  4. field.getLineIndexAtPoint(mouseX, mouseY);  //返回鼠标位置上的该行的索引值   
  5.   
  6. 【获取指定索引值处的字符所在行的行索引值】   
  7. TextField.getLineIndexOfChar(charIndex: int ): int   
  8.   
  9. 【获取指定行的字符数】   
  10. TextField.getLineLength(lineIndex: int ): int   
  11.   
  12. 【获取指定索引值处的行所包含的字符】   
  13. TextField.getLineText(lineIndex: int ):String   
  14.   
  15. 【获取指定行索引所在行的第一个字符的索引值】   
  16. TextField.getLineOffset(lineIndex: int ): int   
  17.   
  18. 【获取指定文本行的度量信息】   
  19. TextField.getLineMetrics(lineIndex: int ):TextLineMetrics   
  20. TextLineMetrics类包含文本字段中某行文本的文本位置和度量值的相关信息,帮助文档里有深入的图解.   
  21.   
  22. 【获取指定索引处的字符所在段落内的第一个字符索引值】   
  23. 如果给定一个字符索引,则返回同一段落中第一个字符的索引   
  24. TextField.getFirstCharInParagraph(charIndex: int ): int   
  25.   
  26. 【获取指定索引处的字符所在段落内的字符数】   
  27. TextField.getParagraphLength(charIndex: int ): int   
  28.   
  29. 【替换所选文字】   
  30. TextField.replaceSelectedText(value:String): void   
  31. 可以使用此方法插入和删除文本而不破坏其余文本的字符和段落格式.   
  32.   
  33. 【替换指定范围的文本】   
  34. TextField.replaceText(beginIndex: int , endIndex: int , newText:String): void   
  35. 注意: 如果对文本字段应用了样式表,则该方法不起作用   
  36.   
  37. 【Timer计时器的使用】   
  38. var timer:Timer =  new  Timer(delay:Number, repeatCount: int  =  0 );   
  39. timer.addEventListener(TimerEvent.TIMER, onTimer);   
  40. timer.start();   
  41. private  function onTimer(event:TimerEvent): void  {   
  42.      //code   
  43. }   
  44.   
  45. 【以指定方向和速度移动元件】   
  46. speed: 目标速度   
  47. radians: speed与x轴的夹角,弧度   
  48. vx = Math.cos(radians) * speed;   
  49. vy = Math.sin(radians) * speed;   
  50.   
  51. 【缓动动画算法】   
  52. targetX,targetY: 目标坐标;   
  53. easingSpeed: 每次移动分数,范围 01 ;   
  54. var vx:Number = (targetX - sprite.x) * easingSpeed;   
  55. var vy:Number = (targetY - sprite.y) * easingSpeed;   
  56. sprite.x += vx;   
  57. sprite.y += vy;   
  58. 注意: 在非常逼近目标点时,往往找出通往目标点的距离,如果其值少于特定值,就应该停止该缓动.   
  59.   
  60. 【模拟弹簧往复运动算法】   
  61. 五个变量: targetX(目标点的x坐标),sprite.X(物体的x坐标),vx(水平速度),ax(水平加速度),k(弹簧强度)   
  62. 已知: targetX(目标点的x坐标),k(弹簧强度)   
  63. var ax:Number = (targetX - sprite.x) * k;   
  64. vx += ax;   
  65. sprite.x += vx;   
  66. 注意: 这里只是水平方向的情形,也可以推广到垂直方向以及水平垂直一起来的情形   
  67.   
  68. 【模拟单摆运动】   
  69. 四个变量: sprite.x(物体的x坐标),centerX(中心位置的x坐标),angle(弧度),radius(摆动的振幅,也就是摆动的范围)   
  70. sprite.x = centerX + Math.sin(angle) * radius;   
  71. angle +=  0.05 ;   
  72.   
  73. 【模拟阻尼运动】   
  74. 六个变量: targetX(目标点的x坐标),sprite.X(物体的x坐标),vx(水平速度),ax(水平加速度),k(弹簧强度),damp(阻尼系数)   
  75. 已知: targetX(目标点的x坐标),k(弹簧强度)   
  76. var ax:Number = (targetX - sprite.x) * k;   
  77. vx += ax;   
  78. sprite.x += vx;   
  79. vx *= damp;  //无阻力情况下的弹簧往复运动只缺少此句   
  80. 注意: 这里只是水平方向的情形,也可以推广到垂直方向以及水平垂直一起来的情形.   
  81. 这种原理可以推广到其它属性,如scaleX:   
  82. scaleVel += (targetScale - sprite.scaleX) * k;   
  83. sprite.scaleX += scaleVel;   
  84. scaleVel *= damp;   
  85.   
  86. 【计算两点间的角度】   
  87. Math.atan2(y:Number, x:Number):Number   
  88. y: 两点间的垂直距离   
  89. x: 两点间的水平距离   
  90. 返回一个以弧度为单位的角度,返回值介于正PI和负PI之间.   
  91.   
  92. 【让物体指着鼠标(跟随眼睛)】   
  93. var dx:Number = mouseX - sprite.x;   
  94. var dy:Number = mouseY - sprite.y;   
  95. var radians:Number = Math.atan2(dy, dx);   
  96. sprite.rotation = radians *  180  / Math.PI;   
  97.   
  98. 【联结字符串时需要注意的地方】   
  99. var result:String =  2  +  6  +  "a" ;   
  100. trace(result);  //输出: 8a   
  101. var result:String =  "a"  +  2  +  6 ;   
  102. trace(result);  //输出: a26   
  103. var result:String =  "a"  + ( 2  +  6 );   
  104. trace(result);  //输出: a8   
  105.   
  106. 【查找匹配的字符串】   
  107. 使用String.indexOf(val:String, startIndex:Number =  0 ): int   
  108. 返回指定子字符串的第一个匹配项的索引,没有匹配就返回- 1   
  109. 查找所有匹配的字符串:   
  110. var index: int  = - 1 ;   
  111. while ((index = myString.indexOf( "val" , index +  1 )) != - 1 ) {   
  112.     trace( "结果:"  + index);   
  113. }   
  114. 使用String.lastIndexOf(val:String, startIndex:Number =  0x7FFFFFFF ): int   
  115. 返回指定子字符串的最后一个匹配项的位置,没有匹配就返回- 1   
  116. var index: int  = myString.length;   
  117. while ((index = myString.lastIndexOf( "val" , index -  1 )) != - 1 ) {   
  118.     trace( "结果:"  + index);   
  119. }   
  120. 注意: indexOf()和lastIndexOf()方法都是区分大小写的.想把大小写都查找出来的话,可以结合String.toLowerCase()和String.toUpperCase()方法先把字符串一起转为小写或大写再进行查找.   
  121.   
  122. 【提取子字符串】   
  123. String.substr(startIndex:Number =  0 , len:Number =  0x7fffffff ):String   
  124. String.substring(startIndex:Number =  0 , endIndex:Number =  0x7fffffff ):String   
  125. String.slice(startIndex:Number =  0 , endIndex:Number =  0x7fffffff ):String   
  126. substr()第一个参数可以是负值,表示索引值是从字符串尾端算过来,- 1 是最后一个字符;   
  127. substring()和slice()差别在于substring()只接受正索引值,而把负值作为 0 处理.另外,如果endIndex小于startIndex,substring()方法在执行前,会自动将其调换过来,总是使用两个参数中较小的值作为起始索引.   
  128. slice()方法可接受startIndex和endIndex为负值,而把负值表示为从字符串的尾端算回来,如果endIndex小于startIndex,slice()方法会返回空字符串.   
  129.   
  130. 【以指定模式拆分字符串】   
  131. String.split(delimiter:*, limit:Number =  0x7fffffff ):Array   
  132.   
  133. 【替换指定的字符串】   
  134. 使用String.replace(pattern:*, repl:Object):String   
  135. 可以这样来替换所有指定的字符串: myString.split( "a" ).join( "b" );   
  136.   
  137. 【按单词或单个字母逆转字符串】   
  138. 1 . 把字符串切割使用String.split()方法成一个数组:对单词而言,以空格作为分界符,对字母而言,以空字符( "" )作为分界符;   
  139. 2 . 使用Array.reverse()方法对数组进行逆转;   
  140. 3 . 使用Array.join()方法重新组合为字符串:对单词而言,以空格( " " )作为联结符,对字母而言,以空字符( "" )作为联结符;   
  141.   
  142. 【使用SharedObject及捕获异常】   
  143. var so:SharedObject = SharedObject.getLocal( "so" );   
  144. so.data.userName =  "Youthoy" ;   
  145. try  {   
  146.     var flushResult:String = so.flush( 500  *  1024 );  //请求500KB容量   
  147.      //如果flush()没成功执行,就替netStatus加个事件处理函数以确认用户是同意还是拒绝,否则只检验结果.   
  148.      if (flushResult == SharedObjectFlushStatus.PENDING) {   
  149.          //替netStatus加个事件处理函数,使得我们可以检验用户是否同意以足够磁盘容量储存共享对象.当netStatus事件发生时,执行onStatus函数.   
  150.         so.addEventListener(NetStatusEvent.NET_STATUS, onStatus);   
  151.     } else   if (flushResult == SharedObjectFlushStatus.FLUSHED) {   
  152.          //成功储存.把数据成功储存后你想执行的程序放在这里.   
  153.     }   
  154. } catch (e:Error) {   
  155.      //这里表示用户把本地储存设置为"拒绝".如果储存数据很重要,你会想在此警告用户.   
  156.      //此外,如果你想让用户可修改其设定值,可以用下面语句打开Player的"设置"对话框的本地储存页面.   
  157.     Security.showSettings(SecurityPanel.LOCAL_STORAGE);   
  158. }   
  159. //定义onStatus函数以处理共享对象的状态事件.flush()返回"pending"时,引发提示,而用户做了选择后所引发的事件.   
  160. function onStatus(event:NetStatusEvent): void  {   
  161.      if (event.info.code ==  "SharedObject.Flush.Success" ){   
  162.          //如果event.info.code内容是"SharedObject.Flush.Success",表示用户同意.把用户同意后你想执行的程序放在这里.   
  163.     } else   if (event.info.code ==  "SharedObject.Flush.Failed" ){   
  164.          //如果event.info.code内容是"SharedObject.Flush.Failed",表示用户同意.把用户拒绝后你想执行的程序放在这里.   
  165.     }   
  166.      //现在,移除事件监听器,因为我们只需监听一次.   
  167.     so.removeEventListener(NetStatusEvent.NET_STATUS, onStatus);   
  168. }   
  169.   
  170. 【向LSO储存对象时需要注意】   
  171. LSO使用二进制的AMF(Action Message Format)对一个对象进行编码.当你在LSO储存类对象时,该对象会编码成包含内容属性的普通对象.于是,当你试着从共享对象里读取该对象时,无法被读成某类的对象,因为没有类型数据.要克服这个限制,使用flash.net.registerClassAlias()方法.   
  172. 任何影片中,只要从共享对象读取出自定义对象数据,自定义类就必须注册别名,而且调用registerClassAlias()方法时必须在SharedObject.getLocal()方法被调用之前.   
  173.   
  174. 【要相同域名内的两个影片可以存取相同LSO】   
  175. 首先LSO是储存在以下目录下:   
  176. C:\Documents and Settings\[user name]\Application Data\Macromedia\Flash Player\#SharedObjects   
  177. 例如,如果来自于http: //www.riahome.cn/youthoy的影片movie.swf写入名为example的LSO,则数据会储存在以下位置:   
  178. C:\Documents and Settings\[user name]\Application Data\Macromedia\Flash Player\#SharedObjects\[random directory name]\riahome.cn\youthoy\movie.swf\example.sol   
  179. 如果在这个movie.swf里的代码是这样的: var example:SharedObject = SharedObject.getLocal( "example""/" ); 也就是使用了选用的本地路径参数,则LSO会储存在以下路径,注意到与以上路径少了 "youthoy\movie.swf" :   
  180. C:\Documents and Settings\[user name]\Application Data\Macromedia\Flash Player\#SharedObjects\[random directory name]\riahome.cn\example.sol   
  181. 以此方法建立的LSO,可以由相同域的其它Flash影片用以下程序来读取:   
  182. var example:SharedObject = SharedObject.getLocal( "example""/" );   
  183. 再看一个例子:   
  184. 有两个Flash影片movieOne.swf和movieTwo.swf都位于同一域(http: //www.riahome.cn)内,但是,movieOne.swf位于http://www.riahome.cn/youthoy/firstGroup,而movieTwo.swf位于http://www.riahome.cn/youthoy/secondGroup.在这情况里,movieOne.swf可以用下列任何本地路径建立和读取LSO:   
  185. /   
  186. /youthoy   
  187. /youthoy/firstGroup   
  188. 而movieTwo.swf可以用下列任何本地路径建立和读取LSO:   
  189. /   
  190. /youthoy   
  191. /youthoy/secondGroup   
  192. 因此,如果你想要两个影片都可以读取相同LSO,当你调用getLocal()方法时,必须指定影片共享的两个本地路径之一(/或/youthoy).   
  193.   
  194. 【URLLoader.dataFormat的三种类型】   
  195. URLLoader.dataFormat的可选值是:   
  196. flash.net.URLLoaderDataFormat.BINARY   
  197. flash.net.URLLoaderDataFormat.TEXT   
  198. flash.net.URLLoaderDataFormat.VARIABLES   
  199. 当dataFormat是BINARY时,URLLoader.data属性就是flash.utils.ByteArray类型;   
  200. 当dataFormat是TEXT时,URLLoader.data属性就是String类型;   
  201. 当dataFormat是VARIABLES时,uRLLoader.data属性就是Object类型.   
  202.   
  203. 【在XML内使用动态数据】   
  204. 把变量放在大括号({和})内:   
  205. var userName:String =  "Youthoy" ;   
  206. var myXML:XML = <person><userName>{userName}</userName></person>;   
  207.   
  208. 【新增一个节点元素】   
  209. //例子一:   
  210. var example:XML = <person/>;   
  211. example.father = <father/>;  //内容属性和元素名称不一定要相同,也可以: example.abc = <father/>,但会以元素名称为准,即会建立一个<father/>元素   
  212. trace(example);   
  213. /*  
  214. 输出:  
  215. <person>  
  216.   <father/>  
  217. </person>  
  218. */   
  219. //例子二:   
  220. var example:XML = <person/>;   
  221. example.father =  ""//建立一个<father/>元素   
  222. trace(example.toString());   
  223. /*  
  224. 输出:  
  225. <person>  
  226.   <father/>  
  227. </person>  
  228. */   
  229. //例子三:   
  230. var example:XML = <person/>;   
  231. var id: int  =  10 ;   
  232. example[ "user"  + id] =  "" ;   
  233. trace(example);   
  234. /*  
  235. 输出:  
  236. <person>  
  237.   <user10/>  
  238. </person>  
  239. 注意: 有些情况必须使用第三种情况.例如,元素节点名称内含连字符("-")是完全合法的,但在ActionScript里会得到编译器错误:  
  240. example.some-element = ""; //产生编译器错误  
  241. 正确的写法是:  
  242. example["some-element"] = "";  
  243. */   
  244.   
  245. 【新增属性】   
  246. var example:XML = <person/>;   
  247. example.element =  "" ;   
  248. example.element. @name  =  "Youthoy" ;   
  249. example.element.@[ "bad-variable-name" ] =  "yes" ;   
  250. example.element. @other  = [ "riahome.cn" , undefined,  true44null ];   
  251. var id: int  =  44 ;   
  252. example.element.@[ "user"  + id] =  "love" ;   
  253. trace(example);   
  254. /*  
  255. 输出:  
  256. <person>  
  257.   <element name="Youthoy" bad-variable-name="yes" other="riahome.cn,,true,44," user44="love"/>  
  258. </person>  
  259. */   
  260.   
  261. 【向XML插入文字元素和节点元素】   
  262. //在指定元素前和后插入,在最前端和尾端插入   
  263. var example:XML = <person/>;   
  264. example.two =  "" ;   
  265. example.insertChildBefore(example.two, <one/>);  //在two节点前插入one节点   
  266. example.insertChildBefore(example.two,  "在two节点前插入文字" );   
  267. example.insertChildAfter(example.two, <three/>);  //在two节点后插入three节点   
  268. example.prependChild(<start/>);  //在最顶端插入start节点   
  269. example.appendChild(<end/>);  //在尾端插入end节点   
  270. example.start =  "start内容"//向节点增加内容   
  271. trace(example);   
  272. /*  
  273. 输出:  
  274. <person>  
  275.   <start>start内容</start>  
  276.   <one/>  
  277.   在two节点前插入文字  
  278.   <two/>  
  279.   <three/>  
  280.   <end/>  
  281. </person>  
  282. */   
  283.   
  284. 【把XML实例的内容属性转换为任何可以转换成字符串的内容】   
  285. //先把等号右边转为可以转换的字符串   
  286. var example:XML = <person/>;   
  287. example.one =  "one" ;   
  288. example.two =  new  URLLoader();   
  289. example.three =  new  Sprite();   
  290. example.four =  new  Boolean;  //Boolean对象的值初始化为false   
  291. example.five =  new  Number();   
  292. example.six =  new  String();   
  293. example.seven = {a: "Youthoy" , b: true , c:undefined};   
  294. example.eight = [ "three" , undefined,  true44null ];   
  295. /*  
  296. 输出:  
  297. <person>  
  298.   <one>one</one>  
  299.   <two>[object URLLoader]</two>  
  300.   <three>[object Sprite]</three>  
  301.   <four>false</four>  
  302.   <five>0</five>  
  303.   <six/>  
  304.   <seven>[object Object]</seven>  
  305.   <eight>three,,true,44,</eight>  
  306. </person>  
  307. */   
  308.   
  309. 【对XML属性层层递归的算法】   
  310. var example:XML = <menu>   
  311.                     <menuitem label= "File" >   
  312.                       <menuitem label= "New" />   
  313.                       <menuitem label= "Save" />   
  314.                     </menuitem>   
  315.                     <menuitem label= "Help" >   
  316.                       <menuitem label= "About" />   
  317.                     </menuitem>   
  318.                   </menu>;   
  319. walk(example);   
  320. function walk(node:XML): void  {   
  321. for  each(var element:XML in node.elements()) {   
  322.     trace(element. @label );   
  323.     walk(element);   
  324. }   
  325.   
  326. 【读取文字节点及其值】   
  327. var example:XML = <menu>   
  328.                     My name is Youthoy.   
  329.                     <myName>Youthoy</myName>   
  330.                   </menu>;   
  331. example.text();  //输出: My name is Youthoy.   
  332. example.myName.toXMLString();  //输出: <myName>Youthoy</myName>   
  333. //以下三行都输出: Youthoy   
  334. example.myName.toString();   
  335. example.myName.text();   
  336. example.myName;   
  337.   
  338. 【递归元素属性时读取属性名与其值】   
  339. var example:XML = <person name= "Youthoy"  age= "21" />;   
  340.      for  each(var i:XML in example.attributes()) {   
  341.     trace(i.name() +  "="  + i);   
  342. }   
  343. /*  
  344. 输出:  
  345. name=Youthoy  
  346. age=21  
  347. */   
  348. 另类方法:   
  349. var example:XML = <person name= "Youthoy"  age= "21" />;   
  350. trace(example.@*[ 1 ]);  //输出: 21   
  351.   
  352. 【不论层级地访问整个XML中指定的节点或属性】   
  353. 使用后代存取器运算符..   
  354. 例子 1 (对于节点元素):   
  355. var example:XML = <a>   
  356.                     <z>I am z.</z>   
  357.                     <b>   
  358.                      <c></c>   
  359.                      <z>I am z.</z>   
  360.                    </b>   
  361.                  </a>;   
  362. trace(example..z.text());  //输出: I am z.I am z.   
  363. 例子 2 (对于属性):   
  364. var example:XML = <person>   
  365.                     <a>   
  366.                       <item name= "Youthoy"  age= "21" />   
  367.                     </a>   
  368.                     <item name= "Jimpa"  age= "21" />   
  369.                   </person>   
  370. trace(example.. @name );  //输出: YouthoyJimpa   
  371.   
  372. 【删除节点元素,文字节点以及属性】   
  373. 使用delete对单一项进行删除,要删除整个XMLList可以使用 for 循环以倒序形式进行删除,以避免迭代时需要改变数组索引问题.   
  374.   
  375. 【搜索XML的高级应用】   
  376. 使用术语过滤.(condition),可结合正则表达式来使用.   
  377. 例子:   
  378. var example:XML = <foodgroup>   
  379. <fruits>   
  380.   <fruit color= "red" >Apple</fruit>   
  381.     <fruit color= "orange" >Orange</fruit>   
  382.     <fruit color= "green" >Pear</fruit>   
  383.     <fruit color= "red" >Watermelon</fruit>   
  384.   </fruits>   
  385.   <vegetables>   
  386.     <vegetable color= "red" >Tomato</vegetable>   
  387.     <vegetable color= "brown" >Potato</vegetable>   
  388.     <vegetable color= "green" >Broccoli</vegetable>   
  389.   </vegetables>   
  390. </foodgroup>;   
  391. trace(example..*.(hasOwnProperty( "@color" ) &&  @color  ==  "red" ));   
  392. /*  
  393. hasOwnProperty所做的检测是确保元素具有color属性,然后,有的话,就测试color属性之值是否为red.只有当条件的计算结果为true时,该元素才会加入EX4运算式所返回的XMLList.  
  394. 输出  
  395. <fruit color="red">Apple</fruit>  
  396. <fruit color="red">Watermelon</fruit>  
  397. <vegetable color="red">Tomato</vegetable>  
  398. */   
  399.   
  400. 【CDATA(Character Data)标签】   
  401. <![CDATA[]]>,必须大写.如果<![CDATA[[]]]>这样的话,它会告诉你语法错误的.   
  402.   
  403. 【一些名词】   
  404. RPC:   
  405. 全称: Remote Procedure Call,台湾的朋友称其为: 远端程序呼叫   
  406. SOAP:   
  407. 全称: Simple Object Access Protocol,台湾的朋友称其为: 简单物体存取协定   
  408. WSDL:   
  409. 全称: Web Service Description Language,台湾的朋友称其为: web service描述语言
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值