關(guān)于Flex及AS3的百多條小小知識
更新時(shí)間:2008年03月13日 22:32:49 作者:
Flex及AS3小知識,非常值得看
【當(dāng)文本字段受到選取或取消選取時(shí)給予響應(yīng)】
獲得焦點(diǎn)時(shí): FocusEvent.FOCUS_IN
失去焦點(diǎn)時(shí): FocusEvent.FOCUS_OUT
通過鍵盤(Tab鍵)把焦點(diǎn)移除時(shí): FocusEvent.KEY_FOCUS_CHANGE
通過鼠標(biāo)把焦點(diǎn)移除時(shí): FocusEvent.MOUSE_FOCUS_CHANGE
FocusEvent類有一個relatedObject屬性.就FOCUS_IN事件而言,relatedObject屬性是剛才擁有焦點(diǎn)的對象的引用 地址;對于FOCUS_OUT,KEY_FOCUS_CHANGE以及MOUSE_FOCUS_CHANGE事件,relatedObject屬性是剛接 收到焦點(diǎn)的對象的引用地址.
FOCUS_IN和FOCUS_OUT事件都是在焦點(diǎn)改變后發(fā)生的,所以兩者都是不可取消的事件.對于KEY_FOCUS_CHANGE和MOUSE_FOCUS_CHANGE事件,可以使用FocusEvent.preventDefault()方法取消默認(rèn)行為:
field.addEventListener(FocusEvent.KEY_FOCUS_CHANGE, onKeyFocus);
private function onKeyFocus(event:FocusEvent):void {
if(field.text == "") {
event.preventDefault(); //當(dāng)field沒有任何文字前,不允許使用Tab鍵把焦點(diǎn)移除
}
//event.relatedObject就是剛才擁有焦點(diǎn)的對象的引用地址,即下一個獲得焦點(diǎn)的對象的引用地址
}
【響應(yīng)用戶的輸入行為】
field.addEventListener(TextEvent.TEXT_INPUT, onTextInput);
private function onTextInput(event:TextEvent):void {
if(event.text == "a" && field.length == 0) {
event.preventDefault(); //TEXT_INPUT是可以取消的事件.TextEvent有一個text屬性,內(nèi)含用戶所輸入的的字符.此例子確保用戶輸入的第一個字母不是"a"
}
}
【把超鏈接加入文字】
打開網(wǎng)頁:
例子1:
var css:StyleSheet = new StyleSheet();
css.parseCSS("a{color:#0000FF;} a:hover{text-decoration:underline;}");
field.styleSheet = css;
field.htmlText = "<a ;
例子2:
field.text = "Link text";
var formatter:TextFormat = new TextFormat();
formatter.url = "http://www.riahome.cn";
formatter.target = "_blank";
field.setTextFormat(formatter);
打開Email:
field.text = "Link text";
var formatter:TextFormat = new TextFormat();
formatter.url = "mailto:y_boy@126.com";
field.setTextFormat(formatter);
使用event協(xié)議,打開ActionScript方法:
field.htmlText = "<a href='event:http://www.riahome.cn'>www.RIAHome.cn</a>";
field.addEventListener(TextEvent.LINK, onClickHyperlink);
private function onClickHyperlink(event:TextEvent):void {
trace(event.text); //輸出: http://www.riahome.cn
}
【精確獲取某字符的索引值】
在 x 和 y 參數(shù)指定的位置返回從零開始的字符索引值
TextField.getCharIndexAtPoint(x:Number, y:Number):int
例子:
field.getCharIndexAtPoint(mouseX, mouseY); //返回鼠標(biāo)位置上的該字符的索引值
【精確獲取某字符的邊框區(qū)域】
TextField.getCharBoundaries(charIndex:int):Rectangle
通過讀取Rectangle的x,y,width以及height等屬性來確定該字符的邊框區(qū)域范圍.
【精確獲取某行的索引值】
在 x 和 y 參數(shù)指定的位置返回從零開始的行索引值
TextField.getLineIndexAtPoint(x:Number, y:Number):int
field.getLineIndexAtPoint(mouseX, mouseY); //返回鼠標(biāo)位置上的該行的索引值
【獲取指定索引值處的字符所在行的行索引值】
TextField.getLineIndexOfChar(charIndex:int):int
【獲取指定行的字符數(shù)】
TextField.getLineLength(lineIndex:int):int
【獲取指定索引值處的行所包含的字符】
TextField.getLineText(lineIndex:int):String
【獲取指定行索引所在行的第一個字符的索引值】
TextField.getLineOffset(lineIndex:int):int
【獲取指定文本行的度量信息】
TextField.getLineMetrics(lineIndex:int):TextLineMetrics
TextLineMetrics類包含文本字段中某行文本的文本位置和度量值的相關(guān)信息,幫助文檔里有深入的圖解.
【獲取指定索引處的字符所在段落內(nèi)的第一個字符索引值】
如果給定一個字符索引,則返回同一段落中第一個字符的索引
TextField.getFirstCharInParagraph(charIndex:int):int
【獲取指定索引處的字符所在段落內(nèi)的字符數(shù)】
TextField.getParagraphLength(charIndex:int):int
【替換所選文字】
TextField.replaceSelectedText(value:String):void
可以使用此方法插入和刪除文本而不破壞其余文本的字符和段落格式.
【替換指定范圍的文本】
TextField.replaceText(beginIndex:int, endIndex:int, newText:String):void
注意: 如果對文本字段應(yīng)用了樣式表,則該方法不起作用
【Timer計(jì)時(shí)器的使用】
var timer:Timer = new Timer(delay:Number, repeatCount:int = 0);
timer.addEventListener(TimerEvent.TIMER, onTimer);
timer.start();
private function onTimer(event:TimerEvent):void {
//code
}
【以指定方向和速度移動元件】
speed: 目標(biāo)速度
radians: speed與x軸的夾角,弧度
vx = Math.cos(radians) * speed;
vy = Math.sin(radians) * speed;
【緩動動畫算法】
targetX,targetY: 目標(biāo)坐標(biāo);
easingSpeed: 每次移動分?jǐn)?shù),范圍0到1;
var vx:Number = (targetX - sprite.x) * easingSpeed;
var vy:Number = (targetY - sprite.y) * easingSpeed;
sprite.x += vx;
sprite.y += vy;
注意: 在非常逼近目標(biāo)點(diǎn)時(shí),往往找出通往目標(biāo)點(diǎn)的距離,如果其值少于特定值,就應(yīng)該停止該緩動.
【模擬彈簧往復(fù)運(yùn)動算法】
五個變量: targetX(目標(biāo)點(diǎn)的x坐標(biāo)),sprite.X(物體的x坐標(biāo)),vx(水平速度),ax(水平加速度),k(彈簧強(qiáng)度)
已知: targetX(目標(biāo)點(diǎn)的x坐標(biāo)),k(彈簧強(qiáng)度)
var ax:Number = (targetX - sprite.x) * k;
vx += ax;
sprite.x += vx;
注意: 這里只是水平方向的情形,也可以推廣到垂直方向以及水平垂直一起來的情形
【模擬單擺運(yùn)動】
四個變量: sprite.x(物體的x坐標(biāo)),centerX(中心位置的x坐標(biāo)),angle(弧度),radius(擺動的振幅,也就是擺動的范圍)
sprite.x = centerX + Math.sin(angle) * radius;
angle += 0.05;
【模擬阻尼運(yùn)動】
六個變量: targetX(目標(biāo)點(diǎn)的x坐標(biāo)),sprite.X(物體的x坐標(biāo)),vx(水平速度),ax(水平加速度),k(彈簧強(qiáng)度),damp(阻尼系數(shù))
已知: targetX(目標(biāo)點(diǎn)的x坐標(biāo)),k(彈簧強(qiáng)度)
var ax:Number = (targetX - sprite.x) * k;
vx += ax;
sprite.x += vx;
vx *= damp; //無阻力情況下的彈簧往復(fù)運(yùn)動只缺少此句
注意: 這里只是水平方向的情形,也可以推廣到垂直方向以及水平垂直一起來的情形.
這種原理可以推廣到其它屬性,如scaleX:
scaleVel += (targetScale - sprite.scaleX) * k;
sprite.scaleX += scaleVel;
scaleVel *= damp;
【計(jì)算兩點(diǎn)間的角度】
Math.atan2(y:Number, x:Number):Number
y: 兩點(diǎn)間的垂直距離
x: 兩點(diǎn)間的水平距離
返回一個以弧度為單位的角度,返回值介于正PI和負(fù)PI之間.
【讓物體指著鼠標(biāo)(跟隨眼睛)】
var dx:Number = mouseX - sprite.x;
var dy:Number = mouseY - sprite.y;
var radians:Number = Math.atan2(dy, dx);
sprite.rotation = radians * 180 / Math.PI;
【聯(lián)結(jié)字符串時(shí)需要注意的地方】
var result:String = 2 + 6 + "a";
trace(result); //輸出: 8a
var result:String = "a" + 2 + 6;
trace(result); //輸出: a26
var result:String = "a" + (2 + 6);
trace(result); //輸出: a8
【查找匹配的字符串】
使用String.indexOf(val:String, startIndex:Number = 0):int
返回指定子字符串的第一個匹配項(xiàng)的索引,沒有匹配就返回-1
查找所有匹配的字符串:
var index:int = -1;
while((index = myString.indexOf("val", index + 1)) != -1) {
trace("結(jié)果:" + index);
}
使用String.lastIndexOf(val:String, startIndex:Number = 0x7FFFFFFF):int
返回指定子字符串的最后一個匹配項(xiàng)的位置,沒有匹配就返回-1
var index:int = myString.length;
while((index = myString.lastIndexOf("val", index - 1)) != -1) {
trace("結(jié)果:" + index);
}
注意: indexOf()和lastIndexOf()方法都是區(qū)分大小寫的.想把大小寫都查找出來的話,可以結(jié)合String.toLowerCase()和String.toUpperCase()方法先把字符串一起轉(zhuǎn)為小寫或大寫再進(jìn)行查找.
【提取子字符串】
String.substr(startIndex:Number = 0, len:Number = 0x7fffffff):String
String.substring(startIndex:Number = 0, endIndex:Number = 0x7fffffff):String
String.slice(startIndex:Number = 0, endIndex:Number = 0x7fffffff):String
substr()第一個參數(shù)可以是負(fù)值,表示索引值是從字符串尾端算過來,-1是最后一個字符;
substring()和slice()差別在于substring()只接受正索引值,而把負(fù)值作為0處理.另外,如果endIndex小于startIndex,substring()方法在執(zhí)行前,會自動將其調(diào)換過來,總是使用兩個參數(shù)中較小的值作為起始索引.
slice()方法可接受startIndex和endIndex為負(fù)值,而把負(fù)值表示為從字符串的尾端算回來,如果endIndex小于startIndex,slice()方法會返回空字符串.
【以指定模式拆分字符串】
String.split(delimiter:*, limit:Number = 0x7fffffff):Array
【替換指定的字符串】
使用String.replace(pattern:*, repl:Object):String
可以這樣來替換所有指定的字符串: myString.split("a").join("b");
【按單詞或單個字母逆轉(zhuǎn)字符串】
1. 把字符串切割使用String.split()方法成一個數(shù)組:對單詞而言,以空格作為分界符,對字母而言,以空字符("")作為分界符;
2. 使用Array.reverse()方法對數(shù)組進(jìn)行逆轉(zhuǎn);
3. 使用Array.join()方法重新組合為字符串:對單詞而言,以空格(" ")作為聯(lián)結(jié)符,對字母而言,以空字符("")作為聯(lián)結(jié)符;
【使用SharedObject及捕獲異常】
var so:SharedObject = SharedObject.getLocal("so");
so.data.userName = "Youthoy";
try {
var flushResult:String = so.flush(500 * 1024); //請求500KB容量
//如果flush()沒成功執(zhí)行,就替netStatus加個事件處理函數(shù)以確認(rèn)用戶是同意還是拒絕,否則只檢驗(yàn)結(jié)果.
if(flushResult == SharedObjectFlushStatus.PENDING) {
//替netStatus加個事件處理函數(shù),使得我們可以檢驗(yàn)用戶是否同意以足夠磁盤容量儲存共享對象.當(dāng)netStatus事件發(fā)生時(shí),執(zhí)行onStatus函數(shù).
so.addEventListener(NetStatusEvent.NET_STATUS, onStatus);
}else if(flushResult == SharedObjectFlushStatus.FLUSHED) {
//成功儲存.把數(shù)據(jù)成功儲存后你想執(zhí)行的程序放在這里.
}
}catch(e:Error) {
//這里表示用戶把本地儲存設(shè)置為"拒絕".如果儲存數(shù)據(jù)很重要,你會想在此警告用戶.
//此外,如果你想讓用戶可修改其設(shè)定值,可以用下面語句打開Player的"設(shè)置"對話框的本地儲存頁面.
Security.showSettings(SecurityPanel.LOCAL_STORAGE);
}
//定義onStatus函數(shù)以處理共享對象的狀態(tài)事件.flush()返回"pending"時(shí),引發(fā)提示,而用戶做了選擇后所引發(fā)的事件.
function onStatus(event:NetStatusEvent):void {
if(event.info.code == "SharedObject.Flush.Success"){
//如果event.info.code內(nèi)容是"SharedObject.Flush.Success",表示用戶同意.把用戶同意后你想執(zhí)行的程序放在這里.
}else if(event.info.code == "SharedObject.Flush.Failed"){
//如果event.info.code內(nèi)容是"SharedObject.Flush.Failed",表示用戶同意.把用戶拒絕后你想執(zhí)行的程序放在這里.
}
//現(xiàn)在,移除事件監(jiān)聽器,因?yàn)槲覀冎恍璞O(jiān)聽一次.
so.removeEventListener(NetStatusEvent.NET_STATUS, onStatus);
}
【向LSO儲存對象時(shí)需要注意】
LSO使用二進(jìn)制的AMF(Action Message Format)對一個對象進(jìn)行編碼.當(dāng)你在LSO儲存類對象時(shí),該對象會編碼成包含內(nèi)容屬性的普通對象.于是,當(dāng)你試著從共享對象里讀取該對象時(shí),無法被 讀成某類的對象,因?yàn)闆]有類型數(shù)據(jù).要克服這個限制,使用flash.net.registerClassAlias()方法.
任何影片中,只要從共享對象讀取出自定義對象數(shù)據(jù),自定義類就必須注冊別名,而且調(diào)用registerClassAlias()方法時(shí)必須在SharedObject.getLocal()方法被調(diào)用之前.
【要相同域名內(nèi)的兩個影片可以存取相同LSO】
首先LSO是儲存在以下目錄下:
C:\Documents and Settings\[user name]\Application Data\Macromedia\Flash Player\#SharedObjects
例如,如果來自于http://www.riahome.cn/youthoy的影片movie.swf寫入名為example的LSO,則數(shù)據(jù)會儲存在以下位置:
C:\Documents and Settings\[user name]\Application Data\Macromedia\Flash Player\#SharedObjects\[random directory name]\riahome.cn\youthoy\movie.swf\example.sol
如果在這個movie.swf里的代碼是這樣的: var example:SharedObject = SharedObject.getLocal("example", "/"); 也就是使用了選用的本地路徑參數(shù),則LSO會儲存在以下路徑,注意到與以上路徑少了"youthoy\movie.swf":
C:\Documents and Settings\[user name]\Application Data\Macromedia\Flash Player\#SharedObjects\[random directory name]\riahome.cn\example.sol
以此方法建立的LSO,可以由相同域的其它Flash影片用以下程序來讀取:
var example:SharedObject = SharedObject.getLocal("example", "/");
再看一個例子:
有兩個Flash影片movieOne.swf和movieTwo.swf都位于同一域(http://www.riahome.cn)內(nèi),但是, movieOne.swf位于http://www.riahome.cn/youthoy/firstGroup,而movieTwo.swf位于 http://www.riahome.cn/youthoy/secondGroup.在這情況里,movieOne.swf可以用下列任何本地路徑建 立和讀取LSO:
/
/youthoy
/youthoy/firstGroup
而movieTwo.swf可以用下列任何本地路徑建立和讀取LSO:
/
/youthoy
/youthoy/secondGroup
因此,如果你想要兩個影片都可以讀取相同LSO,當(dāng)你調(diào)用getLocal()方法時(shí),必須指定影片共享的兩個本地路徑之一(/或/youthoy).
【URLLoader.dataFormat的三種類型】
URLLoader.dataFormat的可選值是:
flash.net.URLLoaderDataFormat.BINARY
flash.net.URLLoaderDataFormat.TEXT
flash.net.URLLoaderDataFormat.VARIABLES
當(dāng)dataFormat是BINARY時(shí),URLLoader.data屬性就是flash.utils.ByteArray類型;
當(dāng)dataFormat是TEXT時(shí),URLLoader.data屬性就是String類型;
當(dāng)dataFormat是VARIABLES時(shí),uRLLoader.data屬性就是Object類型.
【在XML內(nèi)使用動態(tài)數(shù)據(jù)】
把變量放在大括號({和})內(nèi):
var userName:String = "Youthoy";
var myXML:XML = <person><userName>{userName}</userName></person>;
【新增一個節(jié)點(diǎn)元素】
//例子一:
var example:XML = <person/>;
example.father = <father/>; //內(nèi)容屬性和元素名稱不一定要相同,也可以: example.abc = <father/>,但會以元素名稱為準(zhǔn),即會建立一個<father/>元素
trace(example);
/*
輸出:
<person>
<father/>
</person>
*/
//例子二:
var example:XML = <person/>;
example.father = ""; //建立一個<father/>元素
trace(example.toString());
/*
輸出:
<person>
<father/>
</person>
*/
//例子三:
var example:XML = <person/>;
var id:int = 10;
example["user" + id] = "";
trace(example);
/*
輸出:
<person>
<user10/>
</person>
注意: 有些情況必須使用第三種情況.例如,元素節(jié)點(diǎn)名稱內(nèi)含連字符("-")是完全合法的,但在ActionScript里會得到編譯器錯誤:
example.some-element = ""; //產(chǎn)生編譯器錯誤
正確的寫法是:
example["some-element"] = "";
*/
【新增屬性】
var example:XML = <person/>;
example.element = "";
example.element.@name = "Youthoy";
example.element.@["bad-variable-name"] = "yes";
example.element.@other = ["riahome.cn", undefined, true, 44, null];
var id:int = 44;
example.element.@["user" + id] = "love";
trace(example);
/*
輸出:
<person>
<element name="Youthoy" bad-variable-name="yes" other="riahome.cn,,true,44," user44="love"/>
</person>
*/
【向XML插入文字元素和節(jié)點(diǎn)元素】
//在指定元素前和后插入,在最前端和尾端插入
var example:XML = <person/>;
example.two = "";
example.insertChildBefore(example.two, <one/>); //在two節(jié)點(diǎn)前插入one節(jié)點(diǎn)
example.insertChildBefore(example.two, "在two節(jié)點(diǎn)前插入文字");
example.insertChildAfter(example.two, <three/>); //在two節(jié)點(diǎn)后插入three節(jié)點(diǎn)
example.prependChild(<start/>); //在最頂端插入start節(jié)點(diǎn)
example.appendChild(<end/>); //在尾端插入end節(jié)點(diǎn)
example.start = "start內(nèi)容"; //向節(jié)點(diǎn)增加內(nèi)容
trace(example);
/*
輸出:
<person>
<start>start內(nèi)容</start>
<one/>
在two節(jié)點(diǎn)前插入文字
<two/>
<three/>
<end/>
</person>
*/
【把XML實(shí)例的內(nèi)容屬性轉(zhuǎn)換為任何可以轉(zhuǎn)換成字符串的內(nèi)容】
//先把等號右邊轉(zhuǎn)為可以轉(zhuǎn)換的字符串
var example:XML = <person/>;
example.one = "one";
example.two = new URLLoader();
example.three = new Sprite();
example.four = new Boolean; //Boolean對象的值初始化為false
example.five = new Number();
example.six = new String();
example.seven = {a:"Youthoy", b:true, c:undefined};
example.eight = ["three", undefined, true, 44, null];
/*
輸出:
<person>
<one>one</one>
<two>[object URLLoader]</two>
<three>[object Sprite]</three>
<four>false</four>
<five>0</five>
<six/>
<seven>[object Object]</seven>
<eight>three,,true,44,</eight>
</person>
*/
【對XML屬性層層遞歸的算法】
var example:XML = <menu>
<menuitem label="File">
<menuitem label="New"/>
<menuitem label="Save"/>
</menuitem>
<menuitem label="Help">
<menuitem label="About"/>
</menuitem>
</menu>;
walk(example);
function walk(node:XML):void {
for each(var element:XML in node.elements()) {
trace(element.@label);
walk(element);
}
【讀取文字節(jié)點(diǎn)及其值】
var example:XML = <menu>
My name is Youthoy.
<myName>Youthoy</myName>
</menu>;
example.text(); //輸出: My name is Youthoy.
example.myName.toXMLString(); //輸出: <myName>Youthoy</myName>
//以下三行都輸出: Youthoy
example.myName.toString();
example.myName.text();
example.myName;
【遞歸元素屬性時(shí)讀取屬性名與其值】
var example:XML = <person name="Youthoy" age="21"/>;
for each(var i:XML in example.attributes()) {
trace(i.name() + "=" + i);
}
/*
輸出:
name=Youthoy
age=21
*/
另類方法:
var example:XML = <person name="Youthoy" age="21"/>;
trace(example.@*[1]); //輸出: 21
【不論層級地訪問整個XML中指定的節(jié)點(diǎn)或?qū)傩浴?
使用后代存取器運(yùn)算符..
例子1(對于節(jié)點(diǎn)元素):
var example:XML = <a>
<z>I am z.</z>
<b>
<c></c>
<z>I am z.</z>
</b>
</a>;
trace(example..z.text()); //輸出: I am z.I am z.
例子2(對于屬性):
var example:XML = <person>
<a>
<item name="Youthoy" age="21"/>
</a>
<item name="Jimpa" age="21"/>
</person>
trace(example..@name); //輸出: YouthoyJimpa
【刪除節(jié)點(diǎn)元素,文字節(jié)點(diǎn)以及屬性】
使用delete對單一項(xiàng)進(jìn)行刪除,要刪除整個XMLList可以使用for循環(huán)以倒序形式進(jìn)行刪除,以避免迭代時(shí)需要改變數(shù)組索引問題.
【搜索XML的高級應(yīng)用】
使用術(shù)語過濾.(condition),可結(jié)合正則表達(dá)式來使用.
例子:
var example:XML = <foodgroup>
<fruits>
<fruit color="red">Apple</fruit>
<fruit color="orange">Orange</fruit>
<fruit color="green">Pear</fruit>
<fruit color="red">Watermelon</fruit>
</fruits>
<vegetables>
<vegetable color="red">Tomato</vegetable>
<vegetable color="brown">Potato</vegetable>
<vegetable color="green">Broccoli</vegetable>
</vegetables>
</foodgroup>;
trace(example..*.(hasOwnProperty("@color") && @color == "red"));
/*
hasOwnProperty所做的檢測是確保元素具有color屬性,然后,有的話,就測試color屬性之值是否為red.只有當(dāng)條件的計(jì)算結(jié)果為true時(shí),該元素才會加入EX4運(yùn)算式所返回的XMLList.
輸出
<fruit color="red">Apple</fruit>
<fruit color="red">Watermelon</fruit>
<vegetable color="red">Tomato</vegetable>
*/
【CDATA(Character Data)標(biāo)簽】
<![CDATA[]]>,必須大寫.如果<![CDATA[[]]]>這樣的話,它會告訴你語法錯誤的.
【一些名詞】
RPC:
全稱: Remote Procedure Call,臺灣的朋友稱其為: 遠(yuǎn)端程序呼叫
SOAP:
全稱: Simple Object Access Protocol,臺灣的朋友稱其為: 簡單物體存取協(xié)定
WSDL:
全稱: Web Service Description Language,臺灣的朋友稱其為: web service描述語言
相關(guān)文章
讓Flex Builder 3.0與Eclipse3.4整合起來
Flex Builder 3.0 For Eclipse 3.3 安裝方法2009-02-02Flex Gumbo 通過textJustify樣式設(shè)置TextBox文字對齊的例子
接下來的例子演示了Flex Gumbo中如何通過textJustify樣式,設(shè)置TextBox文字對齊。2009-06-06Macromedia Flex 制作計(jì)算器源碼和制作步驟
Macromedia Flex 制作計(jì)算器源碼和制作步驟...2007-02-02