簡單鬧鈴widget的製作

簡單鬧鈴widget的製作

作者:malin  (2007-02-26 17:55:01)
如果你還不知道Yahoo! Widget,那我建議你先看一看http://cn.widget.yahoo.com/中的介紹.如果你想運行widget工具的話,需要先安裝Widget engine.
以下是摘自Yahoo!的網頁http://cn.widget.yahoo.com/download.htm
什麼是Widget Engine?
「Yahoo!Widget Engine」是一種JavaScript應用程序平臺,必須先安裝才能使用各式各樣的Widget工具。

什麼是Widget工具?
「Yahoo!Widget工具」是一種迷你應用程序,可在計算機桌面上通過Yahoo!Widget Engine運行。Widget的功能包羅萬象,例如:查看氣象、閱讀實時新聞、進行網頁資訊搜索,或玩玩小遊戲。Widget工具通常位在計算機桌面上,看起來像是張小圖片或小動畫,和一般的應用程序不同。

一製作前的準備知識
Yahoo! Widget讓我們拒絕單調, 擁有超酷的桌面.如果你想開發一個widget, 其實也很簡單.只需要瞭解下面的內容就可以了:
1. 圖形圖像的製作和處理
2. Html或者xml的語法
3. JavaScript程序設計

如果你以前有過網頁製作的經驗,那對你來說,widget的製作沒有任何門檻.只不過把以前的html的網頁換成了按照widget的類似xml的語法描述的kon文件.對於一個widget來說,它的源程序由三種文件組成:一是圖片文件,還有就是描述這些圖片以及一些圖元的佈局的kon文件,第三就是實現我們的邏輯和功能的JavaScript的js文件.
註釋: .kon
包含 Widget工具的主要代碼。當用戶雙擊 Widget 時 Yahoo!Widget Engine 會首先找到這個文件,讀取其中的內容。 .kon 包含了初始圖片的位置,程序代碼 (XML 或 eXtensible Markup Language),以及偏好設置等項目。有時候,尤其是在比較複雜的 Widget工具中,JavaScript 會保存在 .js 文件中。

kon的基礎知識
其實kon其實就是一個xml文件,描述的方式都是標準的xml的格式的.下面是一些實際的例子:
文件頭定義了xml的版本和編碼
<?xml version="1.0" encoding="utf-8"?>
接下來就是一個widget的定義.
<widget name="MyAlarmClock" version="3.0" minimumVersion="3.0">


在一個widget中可以有多個窗口,可以定義多個window對象

<widget name="MyAlarmClock" version="3.0" minimumVersion="3.0">
<window name="win1">

</window>
<window name="win2">

</window>
</widget>

另外,image對象既可以直接作爲widget中的元素也可以做個window中的元素
<window name="winMain" visible="1" shadow="1">
<image name="imgBg">
<src>Resources/background.png</src>
<hOffset>0</hOffset>
<vOffset>0</vOffset>
<opacity>200</opacity>
</image>
...
</window>
其中src定義的是image的源文件的位置.通常放在Resources目錄下. hOffset定義的是在父節點winMain中的水平位置.如果我們想爲圖片添加鼠標移上就變樣子的效果,那我們就需要爲image加入三個子元素:
<image name="imgName">

<onMouseEnter> imgName _onMouseEnter();</onMouseEnter>
<onMouseExit> imgName _onMouseUp();</onMouseExit>
<onMouseDown> imgName onMouseDown();</onMouseDown>
<onMouseUp> imgName _onMouseUp();</onMouseUp>
</image>
在onMouseEnter, onMouseUp, onMouseDown和onMouseUp時的響應函數中,將該image的src值重新設置一下.如: imgName.src=”new.jpg”;

textarea是文本輸入框對象,可以按照下面的方式定義,至於其中的各個參數的意義,可以參考Yahoo! Widget的參考手冊.
<textarea name="txtTime">
<hOffset>105</hOffset>
<vOffset>60</vOffset>
<lines>1</lines>
<alignment>center</alignment>
<size>14</size>
<bgOpacity>0</bgOpacity>
<editable>true</editable>
<scrollbar>false</scrollbar>
<onKeyPress>txtTime_onKeyPress();</onKeyPress>
</textarea>

這裏要特別提出的是在上面的這個textarea的描述中有一句 txtTime_onKeyPress(); ,這句是定義它在收到鍵盤事件的時候的響應函數爲txtTime_onKeyPress.這個函數的定義是在js文件中.

2.widget的界面效果和素材
首先展示一下鬧鈴的界面:

其中,使用到的圖片如下:


分別是一張背景圖和三個按鈕的不同狀態(正常,鼠標移上時,鼠標按下時)的圖片.這些素材的準備工作我就不在這裏贅述.

3.代碼編寫
首先給出鬧鈴的kon文件內容:


界面方面,主要由四部分組成:一個背景圖imgBg,兩個按鈕圖imgTurn和imgChooseRing,以及一個文本輸入框.另外我們要實現鬧鈴的功能,所以需要加入一個timer對象,控制播放音樂的時間.
現在我們來逐行解析:
第1行:定義xml的版本和編碼
第2行:定義了widget的名字和使用的widget engine的版本
第3行:是否打開調試,這個選項對於我們製作和調試的時候非常有用,在製作過程中可以設置爲on,當我們發佈的時候設置爲off
第4行:定義了widget在載入的時候需要裝載的javascript源文件,也就是實現我們程序邏輯的js文件.
第6行:定義了一個timer對象,用於控制鬧鈴.初始的時候它的ticking設置爲false就說明它並不開始計時,
第8行:timer對象在onTimerFired的時候響應的函數是alarm,也就是震鈴.此事件的意思就是描述timer對象在被激發的時候的響應行數.
第11行:定義了一個window對象,其實在本程序中只是用到一個window,但是出於對以後的擴張的考慮,即使只有一個窗口的時候,也應該定義window.
第12行-17行:定義了image,實際上這個image就是窗體實際上的背景圖.
第19行-29行:定義了用於輸入鬧鐘時間的文本框,它只允許輸入一行,它的onKeyPress的響應事件是txtTime_onKeyPress();
第31行-39行:定義了”打開”/”關閉”鬧鐘的圖片按鈕,實際上就只是一個image對象,通過爲它設置不同的src,就可以達到按鈕的效果.
第31行-39行:定義了”選擇鬧鈴”的圖片按鈕,它也是一個image對象,通過爲它設置不同的src,就可以達到按鈕的效果.點擊它之後的響應事件是ChooseRing(),會彈出一個選擇文件的對話框.可以選擇硬盤上的mp3和wav文件.

下面是funcitons.js中函數的一些摘錄:
var gbAlarmOn = false; // 鬧鈴是否已打開
// 打開/關閉鬧鐘, “打開”被按下以後,會調用setAlarm函數去設置鬧鈴
function Turn() {
gbAlarmOn = !gbAlarmOn;
if (gbAlarmOn) {
imgTurn.src = 'Resources/turnoff-normal.png';
txtTime.editable = false;
txtTime.color = "#ff0000";
setAlarm();
} else {
imgTurn.src = 'Resources/turnon-normal.png';
txtTime.editable = true;
txtTime.color = "#000000";
}
};

// 設置鬧鐘,計算當前時候和文本框中事件的差,如果小於當前事件,那麼就提示出錯.
function setAlarm() {
var time = txtTime.data.split(":");

if (time.length != 2 || time[0].length 2 || time[1].length 2) {
// 時間的輸入格式不正確
alert("Error occurs when input, please input in format: /"hh:mm/".");
} else {
var now = new Date();
var AlarmHour = parseInt(time[0]);
var AlarmMinute = parseInt(time[1]);

// 計算時間
var minus = AlarmHour*60 + AlarmMinute - now.getHours() * 60 - now.getMinutes();
if (minus ':'
|| txtTime.data.length = 5)
{
txtTime.rejectKeyPress();
}
};

// "打開","關閉"的mouseEnter事件
function imgTurn_onMouseEnter() {
if (!gbAlarmOn) {//如果當前是”打開”按鈕
imgTurn.src = 'Resources/turnon-enter.png';
} else {
imgTurn.src = 'Resources/turnoff-enter.png';
}
};

// "打開","關閉"的mouseDown事件
function imgTurn_onMouseDown() {
if (!gbAlarmOn) {//如果當前是”打開”按鈕
imgTurn.src = 'Resources/turnon-down.png';
} else {
imgTurn.src = 'Resources/turnoff-down.png';
}
};

// "打開","關閉"的mouseUp事件
function imgTurn_onMouseUp() {
if (!gbAlarmOn) {//如果當前是”打開”按鈕
imgTurn.src = 'Resources/turnon-normal.png';
} else {
imgTurn.src = 'Resources/turnoff-normal.png';
}
};

目錄結構:



打包方法:


四.運行時的截圖
4.1開動鬧鈴後,文本框中文字變紅並且不可以編輯


4.2關閉鬧鈴後,文本框中文字又恢復爲黑色,並且可以編輯.


4.3選擇鈴聲
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章