輔助功能*
Jonathan Duran

Jonathan Duran

Adobe 

出版日期:
2006 年 3 月 20
用户级别:
中/高級
產品:
Devices

在 Flash Lite 2 中載入、剖析和本端儲存 XML

我最喜的兩項 Flash Lite 2 新功能是載入和剖析 XML 以及將資料本端儲存在裝置上。 在本文中, 我將告訴您如何建立一個可載入 XML 更新並將它們儲存在 Flash Lite 共用物件中的簡單 Flash Lite 應用程式(請參見圖 1)。

在模擬器上執行的 Quote 和 Citation 應用程式

圖 1.在模擬器上執行的 Quote 和 Citation 應用程式

系統需求

為進行本教學課程, 您需要安裝下列軟體和檔案:

Flash Professional 8

Flash Lite 2 Update for Flash Professional 8

從支援中心下載此更新程式*

範例檔案:

必須具備的知識

在閱讀本文章之前, 您應已熟悉 Macromedia Flash 8 製作環境和行動電話模擬器。 有關如何開始使用 Flash Lite 和使用 Flash 8 製作行動內容, 請參閱 Flash 8 的行動內容功能網頁以及 Flash Lite 開發人員中心

若要使用本文章中的原始碼和資料, 您將需要 Flash 8 Professional 和 Flash Lite 2 Update for Flash Professional 8。您可在 Flash 8 行動電話模擬器中執行這些檔案。 但是, 若要體驗實際的應用程式效能和使用者互動, 您還需要支援 Flash Lite 2 播放器的裝置。

XML

首先讓我們看一下 XML, 以大致瞭解介面需要什麼。 我建立了一個包含 quote 及其 citation 的簡單 XML 檔案。

<review>
    <review_item citation="Citation here">
        Quote here.
    </review_item>
</review>

如您所見, 其中包含一個名為 review 的根節點以及包含資料的 review_item。 quote 是節點的文字資料;citation 則是屬性。

介面

設定範例檔的第一個步驟是建立介面。 在時間軸中, 影片片段分割為兩個應用程式狀態: 顯示 XML 資料的預設狀態(請參見圖 2)以及當 XML 資料在更新時的「等待畫面」狀態(請參見圖 3)。

預設狀態及其內容

圖 2.預設狀態及其內容

等待畫面及其內容

圖 3.等待畫面及其內容

載入的 XML 檔案包含兩部份的資料: quote 及其 citation。 我將兩個動態文字欄位置於畫格 1 的舞台, 以顯示資料。 畫格 1 上的唯一其他元素是背景圖片以及快捷鍵上的靜態文字, 以指出「更新 (Update)」和「結束 (Quit)」。 等待畫面狀態僅包含靜態圖片和文字。

程式碼

現在, 讓我們來看一下剖析 XML 和儲存資料的程式碼。 範例的所有程式碼位於主時間軸第一個畫格。 等待畫面不包含程式碼, 只用來提供 Flash 內容一些時間剖析更新的 XML 並將資料指派至文字欄位。 我發現在處理速度較慢的裝置上, 嘗試載入、剖析和更新畫格中的 XML 資料時會造成無法及時設定變數。

畫格 1 中程式碼的第一部份會將 SWF 設為執行全螢幕並使用快捷鍵, 並定義快捷鍵的行為:

// set content to full screen and initialize soft keys for use
fscommand2("fullscreen", true);
fscommand2("SetSoftKeys", "Left", "Right");

// ===== Set listener for soft keys =====
globalKeyListener = new Object();
globalKeyListener.onKeyDown = function() {
    if(Key.getCode() == ExtendedKey.SOFT2) {
        // actions for right soft key
        fscommand2("quit");
    } else if (Key.getCode() == ExtendedKey.SOFT1){
        // actions for left soft key
        checkForUpdateXML();
    }
}
// Add the handler for the soft keys
Key.addListener(globalKeyListener);

若要在 Flash Lite 2 中使用快捷鍵, 就需要使用聆聽器。 在上述程式碼中, 快捷鍵的聆聽器是名為 globalKeyListener 的物件, 並且附加了名為 onKeyDown 的函數。 此為 Flash 中 Key 物件的特定事件, 我已將它擴充, 加入了 "SOFT1" 和 "SOFT2" 以便聆聽快捷鍵。 這兩個快捷鍵可讓使用者更新其 quote 或結束應用程式。 如果選擇更新, 就會呼叫 checkForUpdateXML() 函數;我稍後將會進一步說明。

接下來的程式碼會建立多個函數以處理本端儲存體並始初化 Flash Lite 共用物件:

// ===== Setup and initialize the SharedObject =====
var soReady:Boolean = false; // flag for SharedObject readiness

// Handler function for when the SharedObject is initialized
function soInitHandler(instance:SharedObject) {
    soReady = true;
    if(so_reviews.data.firstRun == undefined){
        initialXML();
    } else {
        getSOdata();
    }
}
// Function to write data to the SharedObject
function setSOdata(){
    if (soReady){
        so_reviews.data.review = reviewData.toString();
        so_reviews.data.citation = citationData.toString();
        so_reviews.data.firstRun = true;
        so_reviews.flush();
        trace(so_reviews.getSize());
        trace("First time app is run - default data saved");
    } else {
        trace("ERROR: SharedObject not ready. No data written.");
    }
}
// Function to display the data from the SharedObject
function getSOdata(){
    if (soReady){
        citation_txt.text = so_reviews.data.citation;
        review_txt.text = so_reviews.data.review;
        trace("Not first time app was run - SharedObject data displayed");
    } else {
        review_txt.text = "Data not available.";
    }
}
// Add the handler for initialization then create the SharedObject
SharedObject.addListener("reviews", soInitHandler);
var so_reviews:SharedObject = SharedObject.getLocal("reviews");

第一行建立用來做為旗標的變數, 以檢查共用物件是否已建立並已就緒可用。 然後我建立三個函數來處理共用物件: soInitHandler(), setSOdata()getSOdata():

  • soInitHandler() 為當共用物件建立時使用的回呼函數。 它是在共用物件執行個體化後第一個執行的函數。此函數會檢查共用物件是否為初次建立。 如果是, 它就會呼叫函數 initialXML() 來剖析 XML 的預設集。 如果不是初次執行此應用程式, 就會呼叫 getSOdata() 以便使用共用物件中的既有資料。
  • setSOdata() 函數會擷取新資料並將它傳送至共用物件。 它會使用我建立的旗標檢查共用物件是否準備就緒。 如果已就緒, 就會將 XML 資料指派至共用物件的資料屬性, 然後將它清除。 我不需要在這裏明確指示清除資料, 因為當應用程式結束時應會將它儲存;我使用此函數的目的只是要確定資料會被儲存, 並展示共用物件的方法。
  • getSOdata() 函數會從共用物件的資料屬性擷取資料, 並將它指派至舞台上的文字欄位。 如果應用程式之前已執行並包含資料, 就會從 soInitHander() 呼叫本函數。

本區段中最後一部份的程式碼新增了 init 聆聽器, 然後執行個體化共用物件。

本應用程式中其他部份的程式碼會實際載入和剖析 XML:

// ===== Functions for loading and parsing the XML =====
// Function to retrieve the default set of XML data
function initialXML(){
    reviewXML = new XML();
    reviewXML.ignoreWhite = true;
    reviewXML.onLoad = function(success){
        if(success){
            reviewXML = reviewXML.firstChild;
            if(reviewXML.nodeName.toUpperCase() == "REVIEW"){
                reviewData = reviewXML.firstChild.firstChild;
                citationData = reviewXML.firstChild.attributes.citation;
                review_txt.text = reviewData;
                citation_txt.text = citationData;
            }
        } else {
            trace("connection failed");
        }
        setSOdata();
    }
    reviewXML.load("initial.xml");
}
// Function to check for updated XML data
function checkForUpdateXML(){
    updateXML = new XML();
    updateXML.ignoreWhite = true;
    updateXML.onLoad = function(success){
        if(success){
            updateXML = updateXML.firstChild;
            if(updateXML.nodeName.toUpperCase() == "REVIEW"){
                reviewData = updateXML.firstChild.firstChild;
                citationData = updateXML.firstChild.attributes.citation;
                review_txt.text = reviewData;
                citation_txt.text = citationData;
            }
        } else {
            trace("connection failed");
        }
        setSOdata();
        gotoAndPlay("waitscreen");
    }
    updateXML.load("updated.xml");
}
stop();

以下是本區段中定義的兩個函數: initialXML()checkForUpdateXML():

  • initialXML() 在應用程式中僅會被呼叫一次, 也就是在應用程式初次執行時。 本函數會從本端檔案系統載入一些預設的 XML。 它首先會建立名為 reviewXML 的全新 XML 物件, 並指示它忽略 XML 檔案中的空白空間。 然後會定義 onLoad 函數, 當 XML 資料完成載入後就會自動呼叫它。

    XML 會在這裏被剖析為 Flash 變數。 首先, 我將 firstChild (位於 reviewXML )傳送給它自己, 如此就可取得 XML 的根節點, 名為 "review"。 如果根節點名稱如我所預期, 我就會將 XML 資料和屬性指派至變數, 然後再指派至舞台上的文字欄位, 即可向使用者顯示資訊。 然後我呼叫 setSOdata() 函數將資訊儲存在共用物件中, 如此下次應用程式執行時就不需要載入它。 本函數最後會實際載入 XML 檔, 進而觸發 onLoad 處理器。

  • checkForUpdateXML() 會在使用者按下左快捷鍵時執行。 本函數類似 initialXML() 函數。 它會建立名為 updateXML 的全新 XML 物件, 並指示它忽略 XML 檔案中的空白空間。 然後會定義其 onLoad 處理器, 其作用和 initialXML()完全相同。 唯一的差別是當我呼叫 setSOdata()函數設定資料時, 也會將時間軸傳送至等待畫面狀態, 讓 Flash Lite 有時間載入 XML 並將資料清除至記憶體。 當等待畫面播放完後, 應用程式就會循環回到第一個畫格。

    我也會從不同位置載入 XML。 在實際應用程式中, 這可能會是來自網頁的某些 XML。 您可嘗試上傳 update.xml 檔案至您的網頁伺服器並使用 load 方法中的 URL, 而不使用本端相關路徑, 其效果可能差不多。 當應用程式回到第一個畫格時, 就會檢查它是否為初次執行。 當它發現不是初次執行時, 就會從共用物件擷取剛更新的 XML 資料, 並向使用者顯示此資料。

這樣就完成了! 現在您應已瞭解如何在 Flash Lite 2 中剖析某些 XML 並將它儲存至手機。

關於作者

Jonathan Duran 在 Adobe 服務已超過六年, 目前擔任 Flash 製作的資深 QE 工程師。 在此之前, Jonathan 曾擔任多種職務, 負責支援開發人員社群, 包括行動與裝置的開發人員關係、Flash 技術支援、開發人員中心編輯和 Macromedia Central 開發人員關係。 Jonathan 喜歡使用 Flash 建立行動應用程式和從事內容開發, 也喜歡在優勝美地的大自然中自助旅行、撰寫電子音樂、玩凱納斯特紙牌以及餵他的貓 Mingatsu Takahashi 吃貓薄荷。