顯示具有 Flash 標籤的文章。 顯示所有文章
顯示具有 Flash 標籤的文章。 顯示所有文章

2009年10月17日 星期六

Flash Loader 載入外部 swf 時 stage=null 的問題

剛剛寫as的時候發生一個問題,由於被載入的swf裡頭有運用stage作場景控制,故被主頁載入時出現 TypeError: Error #1009: Cannot access a property or method of a null object reference.

原因在於被載入的swf在主頁尚未將它加入至場景上時就呼叫了建構子,因此,我們可以運用以下的方法解決:

public function Page05DocumentClass()
{
    if (stage){
        initApp();
    } else {
        addEventListener(Event.ADDED_TO_STAGE, initApp);
    }
}
        
private function initApp(evt:Event=null):void
{
    stage.scaleMode = StageScaleMode.NO_SCALE;
    stage.align = StageAlign.TOP_LEFT;
}

先判斷stage是否存在,如不存在則以stage.ADDED_TO_STAGE作為啟動的依據。
但...這感覺是bug...

2009年5月26日 星期二

Web標準可能讓Flash過氣 ... 嗎?

早上起床看到一篇文章 Opera:Web標準可能讓Flash過氣,大致上是敘述Opera的執行長說下一版HTML網路程式設計語言推出後,可能讓Adobe公司(奧多比)的Flash技術顯得多餘。

當然不可否認的 HTML 5.0 的確新增了許多讓人心動的功能,如:

‧ 本機儲存(Local storage),在個人的電腦上儲存資料的技術。此功能可讓你在離線狀態下使用網頁電子郵件,儲存瀏覽器擴充套件的個人設定。

‧ 影像支援(Video support),讓影片更容易嵌入網頁,並且更容易與Flash等影像技術整合。

‧ 網路工作者(Web workers),此功能讓瀏覽器在背景執行繁雜的處理任務,讓複雜的網路程式完成任務,又能避免造成使用者介面變得太笨重。

另外還有一些標籤更詳細的定義等...不過不要忘記,就算功能再如何增加,還是在處理Client端的事情,而目前flash真正有用的部份在於與Server端溝通,並“動態“的顯示資訊,像是 swfUpload 就是個很好的例子。

反而Sam較為擔心的是 Flex,推出時非常轟動,但目前感覺慢慢在衰退,Sam之前使用的一些感想如下:

1. 檔案笨重: 把所有套件一起編譯,又不好將不同頁面分成數個swf批次載入,導致有些用戶端載入非常久。

2. Flex 能辦到的事,Flash 也做的到。

3. 組件還是一樣不好用。

4. 排版採用類似 Java 的方式,沒錯你可能想吸引 Java 開發者,但 Flash 開發者會慢慢遠離你...

5. 自己定義的語言標準 ... 恩 ... 不與置評。

其實論網路服務實用性 Flex 很低,而被取代性很高。

哪些 Flex 所謂的應用程式拖移功能,事件等動態方式目前 javascript 做不到?而且就使用者而言,原生性的(使用html + javascript)永遠比要安裝外掛 (Flash, java, silverlight)好,尤其是現在 js 引擎速度那麼快!

總之Flash不容易被淘汰,它仍是設計師最快最好呈現的工具,只是以往用Flash開發應用程式的大概得考慮一下換個方式走以後的路。

2009年2月26日 星期四

Flash的鳥問題

這幾天用Flash做事老是碰到一堆鳥問題, 首先是前一版本編輯的class拿來cs4使用會有“The name of this class conflicts with the name of another class that was loaded”, 表示類別名稱有衝突, google一下之後, 把系統時間用NTPClock校正再重新除錯就沒問題, 這部份還好...。

昨天重灌了cs3, 為什麼呢?因為cs4 bug實在太多了, 例如像是MovieClip裡有很多文字欄位, 整個編輯的速度就會慢到不像話, 但換回去之後麻煩才大, 首先把原本的fla存成cs3格式, 打開cs3後相當順暢, Ctrl + Enter compile過程也很順利, 放到網站上, 咦...怎麼某一部份的元件就是無法addChild上去?原本還以為程式寫錯, 但是本機執行一切正常, 網路上就會有問題, 找到今天才想到會不會是版本, 開啟cs4重新編譯放上去後...正常= =, 差點跌到在座位前。

然後之前flp的檔案cs4也沒有了, 硬是要用AIR作一個檔案管理的組件放在cs4中, 又不好操作。所以最後還是換回cs3比較保險。

感覺Adobe也開始和微軟一樣想靠軟體亂改版賺錢...大公司的詬病!總是想把使用者榨乾

2009年1月6日 星期二

在ActionScript based應用程式中管理記憶體

Sam目前的對於Flash應用程式的作法都是"骨肉分離", 也就是畫面與程式徹底分開, 全部的動作均是由程式控制。 當然這麼作必須搭配各種事件的處理, 所以當使用者反覆開啟彈出視窗時, 偵聽事件的新增與移除就變得非常重要(因為關係到記憶體的消耗)。

Essential Actionscript 3.0作者Colin Moock說:

當一個Sprite物件被 removeChild掉了,參照也移除了,裡頭的Listener並不會立刻停止監聽/執行,除非它被GC收走(並無法預期GC何時會來),如果這個Sprite一直都有其他物件或變數參照到,那該Listener永遠不會消失,裡頭的程式也會不斷地執行!! 這是很糟糕的問題,所以他建議對於每個類別,都要記得規劃類似: destroy(); kill(); dispose(); deactivate();等函式:清除物件裡頭的物件資料,以便幫助GC來收取記憶體。

另外如果你想用System.gc();的話, 它是For Flash Player debugger version only. 對於一般的FlashPlayer無效

所以記得每次事件處理程式加上weak reference: addEventListener(eventType, listener, false, 0, true); 也記得要常常對不必要的listener寫: removeEventListener(type, listener);

weak reference Listener Example:

someObj.addEventListener("eventName", myFunct, false, 0, true);
addEventListener("eventName", function(evt) { ...code... }, false, 0, true);

Ticore大哥的blog有介紹錯誤使用weak reference的例子: http://ticore.blogspot.com/2006/12/as3-weakly-referenced-listener.html

基本上如果將weak reference listener的function獨立出來管理的話則在移除該listener時也要一併處理function所在的物件, 設置為null或remove等...。

另外Grant Skinner在他的blog中提到一種強制執行GC的方式:

try {
  new LocalConnection().connect('foo');
  new LocalConnection().connect('foo');
} catch (e:*) {}

這個方式為使用LocalConnection重複連結兩次則絕對會throw Error出來, 而Grabage Collection則會在出錯時強制執行一次, 以清除記憶體中無效的變數與物件來減少資源耗用

不過他也有說明:

“Again, this should only be used as a development aid. It should never be used in production code!”
意思是這種投機的方法只能用在develope階段, 絕對不要用在產品上。因為try catch耗用的效能實在很可怕。

2008年12月30日 星期二

RIA 設計小技巧 (使用自訂事件)

如果你目前在寫一些ActionScript3.0 based RIA的程式, 但是你卻是寫在影格上或是視窗間要溝通時設計成互相知道對方的話, 你應該要學起來下面的做法, 基本上這已經是標準動作了。

首先創建ModelLocator, 它的作用等於所有事件的轉運站, 所以內部採用Singleton模式, 外部調用時使用static方法getInstance(), 尚未創建則創建並返回, 若已經存在則返回該物件。

package {
    import flash.events.EventDispatcher;

    public class ModelLocator extends EventDispatcher {

        private static var _instance:ModelLocator;

        public function ModelLocator() {
        }

        public static function getInstance():ModelLocator {
            if (! _instance) {
                _instance = new ModelLocator();
            }
            return _instance;
        }
    }
}

再來是自訂事件CustomEvent, 它繼承Event使用type字串作為旗標, 第二個參數為varargs, 可以定義符合自己需求的data.

package {
    import flash.events.Event;

    public class CustomEvent extends Event {

        public var data:* ="default data";// default data  
        public var msg:* ="default msg";// default message  
        
        // EventType, data, message  
        public function CustomEvent(type:String, ... args) {
            super(type, true, true);
            if (args) {
                if (args[0]!=undefined) {
                    this.data=args[0];
                }// if( args[1] != undefined ) this.msg = args[1];  
                // 以此類推  
            }
        }
    }
}

使用方式為:

發送:

model.dispatchEvent( new CustomEvent("RECEIVE_OK", "you've send a message") );

接收:

var model:ModelLocator = ModelLocator.getInstance();  
model.addEventListener("RECEIVE_OK", onReceiveOK);  
function onReceiveOK(evt:CustomEvent):void  
{  
    trace(evt.data);  
}

用完一樣要適時的removeEventListener, 否則會造成資源浪費。

2008年12月26日 星期五

ECMA宣布停止ECMAScript 4

全文引用自http://medialand.com.tw/blog/article.asp?id=782

今天早上看到的新聞,ECMA宣布暫時放棄ECMAScript 4規範而採用ECMAScript 3.1。「ECMAScript規範」這個東西雖然目前為止對我們大都數人來說沒有什麼感覺,但是有可能會對於未來一兩年內網路發展造成不太可預期的影響。

先解釋一下ECMAScript規範是啥東西。

ECMAScript是一種程式語言的標準,由ECMA這個機構所制定,跟我們切身最有關係的就是JavaScript以及Flash ActionScript,這兩種都是遵守ECMAScript規範來實作的程式語言,早期原本只有JavaScript 去鳥EMCA,當初大家也都以為JavaScript只會在網頁上來個跑馬燈或下雪花,後來ActionScript加入ECMA家族而且JavaScript轉職成Ajax之後,ECMAScript嚴然成為Web上火熱的標準規範,去年推出的AS3甚至標榜完全遵守ECMAScript 4。 Adobe的動作不止如此,它們提供了名為Tamarin的ECMAScript VM給Mozilla,用意在提升網頁執行ECMAScript時的效能,預計FireFox 4之後Tamarin就會內建到FireFox裡。如果這個計劃屬實,到時用FireFox跑頁面時,不管是Flash或Ajax都可以比現在更順暢許多。

因此。不難想像ECMA宣布否決ECMAScript 4這個消息帶給許多網路開發者有多大的反彈,ECMAScript 4的停止,表示JavaScript或ActionScript在發展的腳步上也跟著暫時止步,減緩了Ajax/Flash提供更完善Client端RIA機制的速度,完全遵守ECMAScript 4的AS3這時更是顯得尷尬。

雖然Flash仍然可以不管ECMA而繼續的朝向未來ECMAScript 4來開發下一代的ActionScript(官方人士現身說法),但是Ajax卻會遇到跨平台瀏覽器支援的最大問題。在未來Flash與Ajax聯手絕對可以組合出比較豐富Combo技的情況下,Flash與Ajax任何一方跳出ECMA規範都不是好事。

而且gskinner說的沒錯 ,沒人想再回到以前那種毫無規範大家個走個兒的那種「網路的西部時代」。

大概逛了一下,許多關心這件事的人們,有人在他的blog裡直接使用ECMAScript 4 is dead這種悲觀字眼,有人是開始擔心AS4是不是要因此又要做大調整,大多數人則很不客氣的把矛頭指向「萬惡的」微軟(感覺大家都十分懷疑是微軟從中作梗反對ECMAScript 4,但我沒找到強而有力的官方聲明就是了)。

2008年11月28日 星期五

Flash 3D 部落格文章標籤 for Blogger

原文出處: http://www.bloggerbuster.com/2008/08/blogumus-flash-animated-label-cloud-for.html

這個小套件可以將你Blog上的文章標籤以3D方式呈現, 跟隨滑鼠角度移動點選, 主要使用JavaScript and Flash animation。

你可以更改背景顏色, 字體顏色, 大小等參數, 如果觀看者不支援JavaScript與Flash, 雖然沒有動畫效果還是可以點擊。

安裝流程:

1. 先在版面配置HTML中展開小組件狀態下尋找這段程式碼。

<b:section class='sidebar' id='sidebar' preferred='yes'>

2. 在下一行貼上以下程式碼

<b:widget id='Label99' locked='false' title='Labels' type='Label'>  
<b:includable id='main'>  
<b:if cond='data:title'>  
<h2><data:title/></h2>  
</b:if>  
<div class='widget-content'>  
<script src='http://halotemplates.s3.amazonaws.com/wp-cumulus-example/swfobject.js' type='text/javascript'></script>  
<div id='flashcontent'>Blogumulus by <a href='http://www.roytanck.com/'>Roy Tanck</a> and <a href='http://www.bloggerbuster.com'>Amanda Fazani</a></div>  
<script type='text/javascript'>  
var so = new SWFObject(&quot;http://halotemplates.s3.amazonaws.com/wp-cumulus-example/tagcloud.swf&quot;, &quot;tagcloud&quot;, &quot;240&quot;, &quot;300&quot;, &quot;7&quot;, &quot;#ffffff&quot;);  
// uncomment next line to enable transparency  
//so.addParam(&quot;wmode&quot;, &quot;transparent&quot;);  
so.addVariable(&quot;tcolor&quot;, &quot;0x333333&quot;);  
so.addVariable(&quot;mode&quot;, &quot;tags&quot;);  
so.addVariable(&quot;distr&quot;, &quot;true&quot;);  
so.addVariable(&quot;tspeed&quot;, &quot;100&quot;);  
so.addVariable(&quot;tagcloud&quot;, &quot;<tags><b:loop values='data:labels' var='label'><a expr:href='data:label.url' style='12'><data:label.name/></a></b:loop></tags>&quot;);  
so.addParam(&quot;allowScriptAccess&quot;, &quot;always&quot;);  
so.write(&quot;flashcontent&quot;);  
</script>  
<b:include name='quickedit'/>  
</div>  
</b:includable>  
</b:widget>

這段程式碼中預設參數如下:

1. 寬度為 240px.
2. 高度為 300px.
3. 背景顏色為 #ffffff.
4. 文字顏色為 0x333333.
5. 文字大小為 12.

大家可以將程式碼中這些參數改成自己喜歡的樣式^^, 然後就大功告成...

2008年11月26日 星期三

flashplayer 9.0.124.0 跨網域無法存取 XMLSocket 解決

這篇文章之前已經發佈過一次(我還沒被砍掉的一百多篇中...), 現在把它補回來!
flashplayer 9.0.124.0 由於SandBox存取規則變更, 所以會先從843port開始找, 如找不到在依actionscript中指定路徑或根目錄底下尋找crossdomain.xml。
但不知為何9.0.124.0版本如果沒有置放843port服務的話, 自己並不會去尋找crossdomain.xml, 這就等於逼著大家放一個驗證policy的server在伺服器上。
這裡給大家一個java寫的範本參考, 也是我目前在線上運作的版本。

2008年11月25日 星期二