December 19th, 2009
常用的Embeded font 寫法,從Adobe手冊抄來的:
重點是: 用同一個Font Family Name 但是Embed不同的Font Face, 這樣可處理大部分的字型問題,不然,常常會有字形粗體時跑回Arial, Tahoma 的情況。
@font-face {
src:url("../assets/MyriadWebPro.ttf");
fontFamily: myFont;
advancedAntiAliasing: true;
}
@font-face {
/* Note the different filename for boldface. */
src:url("../assets/MyriadWebPro-Bold.ttf");
fontFamily: myFont; /* Notice that this is the same alias. */
fontWeight: bold;
advancedAntiAliasing: true;
}
@font-face {
/* Note the different filename for italic face. */
src:url("../assets/MyriadWebPro-Italic.ttf");
fontFamily: myFont; /* Notice that this is the same alias. */
fontStyle: italic;
advancedAntiAliasing: true;
}
Tags: embeded font, flex
Posted in 一缽千家飯 孤身萬里遊 | No Comments »
November 13th, 2009
這也是從Adobe TV的MAX2009 session 聽來的,完整版請到adobe.tv看。
- Ctrl+3 : 顯示快速command列表, 可以type-and-search執行所有的eclipse command
- Ctrl + I : 自動縮排的妙用: 由別的文字檔貼過來的文字,全選後按下此快速鍵會自動排列。文字游標(I-Beam)移到任何地方按下此快速鍵,自動移到應該要去的地方,省得你按一堆tab和space
- Ctrl+Shift+T:是open type, 這個大家都知道,但是奧妙在type-search的地方,可以打camel case string 作為搜尋;甚至可以用wildcard search. 舉例來說,想打開AdvancedDataGrid, 不用打Adv…去找,可打ADG就好( AdvancedDataGrid )。用wildcard search: 打 *skin 會列出所有 XXXskin相關的classes
- Code assist : Alt+. (預設) 可以重複按,會自動filter分類,本來是顯示所有的屬性,每一次會顯示各類別: property, style, event
Tags: flash builder
Posted in Actionscript | No Comments »
November 10th, 2009
Google 真的太威了…
安裝說明:
http://code.google.com/apis/analytics/docs/tracking/flashTrackingSetupFlex.html#getTheLibrary
取得library:
http://code.google.com/p/gaforflash/
注意:
GA tracking 的結果,不是及時的!
測試不是能夠直接看到結果的,必須等待幾個小時再到Google Analytics網站看報告。
Tags: actionscript, google
Posted in Actionscript | No Comments »
November 10th, 2009
本篇文章來自MAX2009的session:
How Not to code FLEX
演講者主要說明何謂壞程式碼(bad code),但也說壞程式碼不一定不好,只要你確定能盡快回來改正他。那何謂壞程式碼?
- Container 元件的誤用:Container元件諸如Box, Canvas, Tile等等,他們的原本目的都是: 排列裡面的子元件。因此只要你不是拿來排版或甚至沒有給予它任何的子元件,就違背原本用意了。
例子:
<mx:TextInput/>
<mx:VBox backgroundImage="blah.png" borderStyle="solid"/> <!-- 你看, 沒有小孩的容器元件-->
- ListBase 元件的誤用: List, TileList, DataGrid 都是用來針對列表物件的選取、排序、renderer回收而生,因此,當你想要製作的元件並不需要這些功能,就不該採用List來處理。
- local model binding: 避免直接將值給UI元件,盡量用local model binding來處理。(按:此方法還可避免元件初始化延遲所帶來的問題)
ex:
<mx:script>
//這樣是不好的
function test():void
{
myLabel.text = "hello";
}
</mx:script>
<mx:Label id="myLabel"/>
<mx:Script>
//用local model binding.
[Bindable]
private var helloText:String = "hello";
</mx:Script>
<mx:Label id="myLabel" text="{helloText}"/>
-
別把local view event 交由非常上層的元件處理。(按:這裡必須搭配cairngorm microframework 來解釋 )
元件與元件之間的訊息傳遞,如果能在local就解決,便盡量不要拋到上層的command-frontcontroller 去處理然後又繞回來”原本的元件”。以後維護會很辛苦。
-
不適當的容器元件使用方法:
如果你發現你的容器元件裡面只有一個子元件(child),那可能有問題。
-
Two dots and you are out.
兩個參照你就出局囉!
如果你的程式碼需要進入非常多的子元件,那就有問題了。如下:
var hey
:String = myBox.thisBox.thatBox.rightLabel.
text;
這是一個本質上的問題,應該要封裝這些子元件,若其他元件需要存取裡面的值,應該要透過Event(帶資料出來) 來幫你。
-
自以為的聰明寫法並不好。
這種情況會發生在複雜的binding寫法,像是:
<mx:Button id="btn" enabled="{ isCheck && ( firstBtn.enabled & !secondBtn.enabled) && (thirdBtn.enabled|| feelGood) }"/>
應該要用function 去處理這些binding 邏輯:
<mx:Script>
private function getEnabled( a:Boolea , b:Boolea , c:Boolean , d:Boolean , e:Boolean ):Boolean
{
//邏輯應該在這裡描述啦:
return a && (b&&!c) &&(d||e);
}
</mx:Script>
<mx:Button id="btn" enabled="{ getEnabled(isCheck,firstBtn.enabled,secondBtn.enabled,thirdBtn.enabled,feeGood) }"/>
Tags: actionscript, flex
Posted in Actionscript | No Comments »
November 8th, 2009
感謝小巧帶我去看煙火。坐在野餐墊上戰了七八場富饒之城後,我們順利地等到煙火。
特別喜愛像金色大煙火。沒有多餘的顏色,只有金與黑,如同一管巨大的毛筆沾著金粉墨水,緩緩地在天空黑布上抹下,不知怎麼如此均勻,彷彿盛開的花瓣,對稱的大圓。後來漸漸地垂下,像是金色的雨水沾著窗戶慢慢流下,而我們在窗沿邊拼命讚嘆,就像小孩兒第一次看見彩虹。
煙火是種表演藝術,一波又一波的花樣,前後呼應,剛剛流瀉而下的金雨,下一刻恍若退至幕前,另一道五彩煙花炸裂,一幅金葉藍花倏忽盛開。花開花落,數秒驟逝。
除了煙火本身之外,第一次體會到直接的輿論力量,後排的人們齊心吶喊請前排的民眾坐下,風行草偃,大家都能一望無際。感謝大家的公德心和同理心。
Posted in 一缽千家飯 孤身萬里遊 | No Comments »
September 11th, 2009
因應 XP 開發手法的趨勢,Adobe也推出FlexUnit: Unit test framework。但我個人覺得,Flex主要是關連到UI的,而UI的測試,光靠FlexUnit不夠的,用人測最直接。然而,通常你找不到那個人。
下載地點:Adobe open source project: Flex unit
何謂Unit Test? 簡單地來說:就每個Method當成一個unit(單位),測試之。在XP的開發過程中,是測試導向開發,什麼是”測試導向”? 就是:每次要寫新功能的時候,不是先寫功能的運作方法,而是先寫『測試該功能的程式』,換言之,我們要以”通過測試”為方向,去開發新功能的程式。因此,我們的開發流程往往是: 先寫空白的功能程式,譬如一個空的方法: getSomeResult(),然後先寫測試碼(test case),像是: testGetSomeResult() 然後寫上我們”預期的”測試結果,立刻跑一次test runner,當然,不會過關,立刻回頭撰寫getSomeResult()內容,讓它正確通過test case,那麼getSomeResult()即開發完成 。(見下方的步驟)
這樣的好處,除了確保開發出來的功能可以通過測試;往後的重構(refactor)或是需求變更,都可以再次把unit test 列出來跑一次,確保原來的功能沒有毀掉。
使用步驟:
- 建立TestRunner
- 寫TestCase/TestSuite並加入TestRunner
- 跑TestRunner
- 看結果,修改原始碼,回到(2)
例子:
//這是要被測試的class method
public class MyApp
{
public function getSomeResult
( input
:Number ):Number
{
//這裡放入真正的邏輯...
return input
/10;
}
}
//這是測試code( Test Case 不會用在真的主程式裡 ) : MyTestCase.as
private var classToTestRef:MyApp;
public function testGetSomeResult():void
{
classToTestRef = new MyApp();
/*assertEquals : 意思是兩個參數的值結果應該要一樣,
如果不一樣test 就失敗(fail),你會在TestRunner看到
底下這個例子會過!
*/
assertEquals( 100 , classToTestRef.getSomeResult( 1000 ) );
//這個不會過
assertEquals( 2, classToTestRef.getSomeResult( 1000 ) );
//還有許多assertXXX可以用,請見官方文件
}
特別要強調的是,針對Event處理的測試要怎麼寫? 因為Event發出的時間往往有時間差,並不即時。FlexUnit體貼地加上了一個addAsync() 的方法,幫助我們測試event listeners。寫法如下:
addAsync
( eventListener
:Function/*放置assertion的listener*/ , timeout
:int /*過了多少時間(ms)就算失敗?*/);
public function testVeryComplexCalulation
():void
{
//用addAsync() 把test case 延遲檢查:
instanceToTest.
addEventListener( Event.
COMPLETE ,
addAsync
( onComplete ,
1000 /*設定:1秒沒發生就算測試失敗*/) );
instanceToTest.run
();
}
//在 event listener 裡面才寫 assertions:
private function onComplete
( event
:Event ):void
{
assertNotNull
( instanceToTest.result
);
}
Tags: actionscript, unit test
Posted in Actionscript | No Comments »
August 13th, 2009
這三者的關係,可以用一個情境來解釋:
總機先生,電話機,通話內容。
總機先生是 Listener
電話是 EventDispatcher
通話內容是 Event
通話內容必須透過電話傳達出去,出去之後就由總機先生立刻接聽;此外,一通電話內容可以讓無限個總機接聽(想像把電話機設定成擴音模式)。這個模式的作用在於,讓總機先生在『適當的時間』,做『適當的事』,比如說,一接到找老闆的電話,就要先問:『您是哪位?』此時『一接到電話』就是Event 透過EventDispatcher 發出來了,又正好總機監聽著電話狀態,所以總機立刻根據電話內容(event),做了特定的事情(問:您是哪位?)。再舉個例子,像是接到愛慕的A氏,就回答:『哈囉你好嗎?』 這兩種回達都是一個Listener ,根據不同的事件,定義不同的listener。
Listener 在 AS3.0 的世界,規定要寫成:
function functionName( event:Event ):void
要監聽某個電話就要寫成:
myPhone.addEventListener( eventType , myListener );
其中eventType是個字串,代表事件的類別(老闆打的還是同事打的),myListener 就是呼應的動作。要特別強調的是,在AS的世界裡,當一個Event被dispatch出來之後,對應的listener幾乎『沒有時差』就發動,因此我們常遇到UIComponent繪製畫面不如預期,這時可在listener之中利用 callLater 來針對UIComponent操作,利用callLater的延遲是比較正統的作法。
Posted in Actionscript | No Comments »
July 26th, 2009
當兩者糾纏在一起的時候,如果由AIR呼叫Javascript 會掛掉的話,可先試著用setTimeout,通常都可以解決。因為HTML DOM需要時間初始化,Javascript 才能被呼叫。
像是 setTimeout( domWindow.myJsFunction , 1000 );
Tags: AIR, javascript
Posted in Adobe AIR | No Comments »
July 23rd, 2009
DragManagerImpl#endDrag();
見:DragManagerImpl.as
由於原本的DragManager實作了IDragManager,裡面並沒有公開endDrag()此signature,因此你必須轉型之後才能呼叫這個方法。
Tags: dragManager
Posted in Actionscript | No Comments »