2011年9月20日 星期二

龍山寺



今天讓妹妹的媽媽放個假
爸爸要帶妹妹到處去走走

爸爸:妹妹爸爸帶你出去玩
妹妹:去哪裡
爸爸:我們去龍山寺
妹妹:什麼是龍山寺
爸爸:就是拜拜的地方阿
妹妹:好,出發
坐上捷運 妹妹開始想要去玩車上的拉環
妹妹:爸爸 我要吊單槓
爸爸:不可以

今天很乖 沒有吵鬧 只是一直望著頭上那拉不到的吊環

坐到了中正紀念堂 換車到西門再到龍山寺
妹妹一路上充滿著好奇
出了捷運 看到7-11 門口的紐蛋機

妹妹:爸爸 摳摳給我 我要Kitty的
爸爸:我們先去買水 換摳摳再來

買了瓶水 也投了個Kitty印章扭蛋 我們很開心的往前走
龍山寺好多人 帶著妹妹 我們用手拜拜
妹妹:爸爸 坐坐
坐在龍山寺的階梯旁 妹妹迫不及待的從他的背包
把扭蛋拿出來打開來玩
看著 他聚精會神的玩著印章
爸爸:妹妹 我們再去後面看看 好不好
妹妹:好

爸爸:妹妹我們今天去哪裡玩
妹妹:是龍山寺567 爸爸 我要洗手
帶著妹妹去廁所 他還是可以在水龍頭前 完了起來

廟口水池裡 有好多魚
妹妹就這樣在水池旁興奮的 看著


爸爸:妹妹 天快黑了 快下雨了 我們回家找媽媽好不好
妹妹:好 爸爸背

2011年8月31日 星期三

使用變數new物件,未清除的結果

在Flash裡,當我們使用AS來產生一個新的物件
通常都會用使用一個變數來把物件new出來,
並在這物件上加入監聽事件

var myBtn:Button=new Button()  
myBtn.addEventListener(MouseEvent.CLICK,someThingToDo);
這個已宣告的變數myBtn,已經指向了這個被產生出來的物件
如果在之後的程式做了以下動作可能會發生的狀況如下

1.在未移除原先產生物件的狀況下,若再使用同樣變數再產生物件
myBtn=new Button()
myBtn.addEventListener(MouseEvent.CLICK,doAnothingThing);
則只是把變數指到新的物件,原先的物件並不會被清除掉
畫面上會有多個物件同時並存
若還有監聽事件,則當Click任一物件時都會同時觸發所有被監聽的事件

2.若將變數設定成null再重新產生物件
myBtn=null;  
myBtnButton=new Button();
畫面上還是會保有多個物件
只是每個物件被click時只會觸發最後設定的那個listener
而非多個listener被觸發

2011年8月22日 星期一

使用Chrome Debug Flash

一.在Chrome上安裝debug player
1.安裝debugPlayer
http://www.adobe.com/support/flashplayer/downloads.html

2.打開Chrome輸入 about:plugins
找到flash 按停用,再按右上方詳細資料
找到路徑非 Chrome的那個按啟用

3.開啟網頁

http://kb2.adobe.com/cps/155/tn_15507.html

確認使用的player版本

二.下載Vizzy
使用Vizzy可以不受browser限制,查看trace訊息

下載

2011年7月19日 星期二

在Android內實現Callback

寫JavaScript一定對CallBack的使用相當熟悉,但是當你要寫Java或Android
卻發現沒辦法把function當作參數傳給另一個function當CallBack用
因為在Java內並沒有function pointer,所以就有點麻煩
這時候可以用類似Observer的方式來做
簡單來說就是,既然無法丟一個function進去
那你可以把要執行的function放到一個物件內
把物件當參數丟進去就可以了

作法
一.建立公用的Observer Interface
利用Interface將允許使用的method定義出來

public interface IObserver{
    public abstract void success(Object data);
    public abstrcat void fail(String msg);
    public abstract void exception(String msg)
}

二.建立要使用的observer Class
把要做的工作在這這Class內實做出來
當然你也可以把這Class建立主(main)程式內,
這樣可以更方便

public class MyObserver implements IObserver{
    @override
    public abstract void success(Object data){
        ...
    };
    @override
    public abstrcat void fail(String msg){
        ...
    };
    @override
    public abstract void exception(String msg){
        ...
    }    
}

三.主程式應用
public class myApp{
    ....
    public void run(int status,IObserver observer){
        .....
        if(status==1){
            observer.success(data)
        }else if(status==2){
            observer.fail()
        }else{
            observer.exception("exception");
        }
    };
}

2011年7月18日 星期一

網頁上swf z-index操作

當在網頁上,同時存在多個swf檔案,若需要指定某一個強制在最上層
不受其他物件遮蔽,以下注意事項
一.wmode的影響
用來嵌入flash用的embed tag上的wmode值會決定swf在網頁上的顯示方式
1.當embed tag沒有設定wmode
  預設值為Window
  如果去偵測wmode值
  在FF與Chrome測到$("embed").attr("wmode")=false
  在IE則會得到$("embed").attr("wmode")='window'
2.設定wmode='opaque'
  才能讓swf所在的div可以依照HTML上做z-index排列,
  需設定
  embed tag attribute wmode='opaque'

二.動態改變wmode
要讓所有的Browser都可以動態改變wmode屬性值
若只是透過$("embed").attr("wmode","opaque")
是不可行的,
需要透過寫入整個innerHTML或outerHTML讓瀏覽器
重新顯示swf才會得到正確的顯示狀態
$("embed").each(function(i) {               
    embedTag = $(this).attr("outerHTML");        
    if ((embedTag != null) && (embedTag.length > 0)) {
        if (!$(this).attr('wmode') 11 $(this).attr('wmode')=="Window"){
            embedTag = embedTag.replace(">"," wmode='opaque'>");
            $(this).attr("outerHTML", embedTag);
        }        
    }       
});

三.設定swf的顯示位置
只需要改變swf所在div的z-index值,
即可調整其上下位置
$("#flashContainer").css("z-index",1000)

戀歌 - 義大醫院


這幾天剛搬好家,客廳比以前大上很多
以後 應該待在客廳裡看電視的機會應該會多一些
上網買了台 多媒體播放器,
測試著透國無線網路播放電腦裡的影片檔
一面陪著妹妹玩 一面讓電視播著最好的時光
聽著電視傳來 文夏的戀歌
又讓記憶突然又回到
老爸在醫院的那段時間

老爸住在義大醫院的隔離病房
與一般三人健保房比起來,空間大很多
因為隔離,沒辦法離開房間,只能透過窗戶 看著外面
對於習慣在山上到處走騎車跑步的他
我知道他身體的痛 還有失去自由的那份難過

老爸想聽歌
大弟買了個小小的放音機
放在床邊 反覆的播放著 這些 台語老歌
在山上 老爸是坐在戶外的躺椅上
看著遠方的風景
這時候的他
只是躺在病床上 看著天花板
在音樂裡找到與過去生活連結的一部分
這個小小的收音機
就這樣跟著我爸 在醫院間來來回回

2011年7月13日 星期三

自訂ListView Item

在ListView,要用自訂item樣式,
通常在Android內,我們需要以ListView顯示資料列表
列表內item的樣式可以直接使用android內建的item樣式
例如R.android.layout.simple_list_item_1
但如果希望使用自行設計的item樣式,可以透過自訂Adpater來做
以下是設計流程

1.設計Item layout XML
要顯示的itemㄝ,以一個layout xml檔案設計所要呈現的樣式

 <?xml version="1.0" encoding="utf-8"?>  
      <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
           android:layout_width="fill_parent"   
           android:layout_height="wrap_content"  
           android:orientation="horizontal">  
           <ImageView android:id="@+id/item_img"  
                android:layout_width="60dp"   
                android:layout_height="60dp"/>                 
           <TextView   
                android:layout_width="wrap_content" android:layout_height="wrap_content"            
                android:id="@+id/item_title" />  
      </LinearLayout>       
2.自訂Adapter
透過自行設計的Adapter將資料與item xml結合顯示
1.extends BaseAdapter
2.在建構子內設定希望傳入的各項資料欄位
public MyAdapter(Context context,String[] title,String[] img){
  inflater = LayoutInflater.from(context);
  item_title=title;
  item_img=img;
}
3.在Adapter內改寫getView()
透過getView取得的position當index
再由建構子取得的資料array內得到各item所要顯示的資料
將這item資料帶到view內
@Override
public View getView(int position, View convertView, ViewGroup parent) {
   //--將item xml轉成view物件,並取得item內各項元件的view 
   convertView = inflater.inflate(R.layout.list_item,null);
   TextView title_view=(TextView)convertView.findViewById(R.id.item_title); 
   title_view.setText(item_title[position].toString());  

   ImageView img_view=(ImageView)convertView.findViewById(R.id.item_img);
   Drawable drawable = LoadImageFromWeb(item_img[position]);
   img_view.setImageDrawable(drawable);  

   return convertView;  
}
4.顯示ListView
要顯示ListVIew的Activity可以直接繼承ListActivity
繼承自ListActivity即已包含了一個list view在裡面
public class PushActivity extends ListActivity {
   @Override
   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);        
      //---set List View---- 
      ListView lv=getListView();       
      LayoutInflater inflater=(LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);       
      //--Add Data--------------------
      String[] songData=getResources().getStringArray(R.array.songdata_holder);
      String[] songImg=getResources().getStringArray(R.array.songimg_holder);
      MyAdapter adapter = new MyAdapter(this,songData,songImg);        
      setListAdapter(adapter);
    } 
}

2011年6月8日 星期三

HTML5 WebSocket Support

以下是各瀏覽器對HTML5 WebSocket的支援
 
作業系統 Browser WebSocket
Windows 7 Chrome11 true

FireFox4.01 false

IE9 false

Safari 5.05 true
Ubuntu11 Chrome11 true

FireFox4.01 false
IOS4.2
true
Android2.3
true

2011年5月30日 星期一

HTML 5 Audio Format Support

以下是測試HTML5在不同作業系統與不同瀏覽器下,對於Audio格式支援比較表


作業系統
Browser multi source ogg mp3 html5(m3u8) m3u8
Windows 7 Chrome 11.0 true true true false false

Firefox 4.01 true true false false false

IE9.0 true false true false false

Safari 5.05 true false true false false
Ubuntu Chrome 11.0 true true false false false

Firefox 4.01 true true false false false
Mac 10.6.7 Safari 5.04 true false true false false
Android2.2 版本2.2 false false false false false
Android2.3 版本2.3.3 true true true false false
Android3.0 版本3.0 true true true false false
Iphone4.0
true false true true true

2011年5月10日 星期二

jQuery Template

一.資料架構

使用json物件或一般物件
var arrayObj=[
    {},{},{},{}
]
var dataObj={
    "prop1":"xx","prop2":"xx2",..
}


二.Template 內如何套用資料
當資料為Array就會反覆的將Array內物件反覆的套用tmpl
若當資料為一個物件,則會當成只有一個物件的Array,
只會套用tmpl一次

$("#樣板id").tmpl(要帶入的資料)
例
var data=[{"myname":"test1"},{"myname":"test2"}];
$("#my_tmpl_1").tmpl(data);

三. Template內資料讀取

資料來源分為兩個部份,一個是載入的資料,一種是自訂的變數
當透過tmpl帶入資料時同時可自訂變數
1.帶入資料並自訂變數與method
    $("#my_tmpl_1").tmpl(data,{
        getResult: function () {
                return "xxx";
            },
        title: "my title"
    });
2.取得由帶入資料取得的內容
    1.${變數名稱}
    2.透過tmplItem取得
        ${$item.data.變數名稱}
        ($item.data代表著整個tmplItem內的資料)
3.取得由自訂變數來取得的內容
    都需要透過$item來取得
    ${$item.變數名稱}
    
    呼叫執行自訂的method
    ${$item.methodName(param)}
4.在tmpl內在任何地方要參考到傳進來的資料都可用
    ${$data.變數名稱}來取得
    若是在{{if}}內或是{{each}}內要用到要用到
    則用$data.變數名稱即可
    
    例 {{if $data.author=="ozzyqq"}}
5.對帶入的資料變數加入固定字串
    例
    <li><a href="#" id=${"submenu_"+id}>${title}</a></li>    
    不可用 id="submenu_"+${id}
6.將自訂屬性資料加入tmpl內
    <div class="greenbar">${title+"-"+$item.nowIndex}</div>    


四.取得由樣板產生的tmplItem應用

當頁面上的DOM物件是由tmpl所產生的,則可透過這些dom物件
取得tmplItem,做更多的應用
1.取得tmplItme
    透過$(dom物件).tmplItem()取得tmplItem
    注意,該DOm物件一定必需要是透過tmpl所產生的才有效
2.取得tmplItem的dom物件
    tmplItem.nodes
3.取得tmplItme的資料
    tmplItem.data
4.加入或修改變數
    也可對套用的資料做修改或額外新增變數進去
    例    $.tmplItem(this).data.newVar=xxx;
4.更新
    只要改變tmplItem.data值再執行
    tmplItem.update();
    畫面就自動更新成新的值顯示的頁面
    
在樣板外,是透過$(dom物件).tmplItem()
來取得tmplItem的參考
而在樣板內則是以$item參考到tmplItem    


五.{{if}} {{else}} 內的變數
{{if 變數名稱}}
{{if this.變數名稱}}

Example:比對外部值
{{each items}}
    <option value=${id} {{if id==$('#folder02Select').val()}} selected='selected'{{/if}}>
        ${title}
    </option>
{{/each}}    

六.在tmpl內使用{{html 變數名稱}}
通常在tmpl內使用${變數名稱}所取得的值會經過編碼
若要取得的值不經過編碼則要用{{html 變數名稱}}
七 {{each 變數名稱}} {{/each}}

在樣板內,將array型的變數資料丟給each處理,可以
將array內每筆資料都再撈出來處理
在each內,
$index代表該筆資料的index....用${$index}顯示
$value代表該筆資料的內容...用$($value.變數名稱)來取得該筆資料內的變數值
例:
{{each 變數名稱}}
    <li>${$index}+"__"+${$value.資料內的變數名稱}}</li>
{{/each}}


八 多層次的each使用

若不同層有相同的prop name可用this來區分
{{each items}}
    <div class="btn_bg">
        <div class="first">${title}
            {{if this.items}}
                <ul class="link">
                    {{each items}}
                        <li><a href="#">${title}</a></li>                          
                    {{/each}} 
                </ul>                    
            {{/if}}
        </div>
    </div>
{{/each}} 


九.樣板中套用樣板
{{tmpl(資料變數名稱) "#樣板id名稱"}}
十.對物件套用不同樣板流程

1.將jQuery物件轉成準備套tmpl的tmplItem    
    selectedItem = $.tmplItem(jQuery物件);
2.指定tmplItem要使用的tmpl
    selectedItem.tmpl = detailTemplate;        
3.更新
    selectedItem.update();

注意    
無論是套用不同樣板,或是更新樣板tmplItem的data後
使用update()更新畫面
如果所產生的DOM物件有些屬性,是經由外部的js所設定
在update後這些屬性都會消失

jQuery Memo

jQuery Memo
1.外部html帶入時
若使用innerHTML 取到的是root node下的內容
outerHTML則會包含Root Node
2.網頁設定編碼為utf-8
HTML檔案本身需以utf-8儲存
載入外部JSON檔案時,也需以utf-8格式儲存
才不會造成亂碼發生
3.取得json物件的所有屬性
若物件為array
items:[
    {xxx},{xxx},{xxx}...
]
可以使用length取得array長度,並進而取得所有資料
若物件非array
items:{
    "title":xxx,
    "name":xxx,...
}
則可用for(prop in obj)方式取得 prop名稱
for(prop in items){
    alert(prop+"="+items[prop])
}

4.對大量物件binding listener

當要對大量的物件設定監聽的事件與要觸發的function,可以使用delegate
$(xx).delegate(指定處理物件,指定觸發事件,執行處理的function);
$("#mytable").delegate("td", "hover", function () {      
    $(this).xxxx
})
指定處理物件值可以是tag name如"td"
可以對class如".myclass"    

5.對物件設定監聽程式

當要對物件設定如Click...等監聽,一定要在物件已經產生的狀態下設定
才會有效,如果在物件尚未產生之前就要把監聽設定好
則需透過livequery plugin來做
例
$(".myclass").livequery("click",function(){})

6.jQuery與DOM物件互轉

1.在jQuery的操作,絕大部分回傳都會是一個jQuery包裹物件
  要將jQuery物件轉成DOM物件,$("'#"+containerID+"'")[0]
2.DOM轉jQuery物件
    用$(dom物件)包裹後即為jQuery物件
3.在jQuery使用each取得所有物件
    each內的this是一個DOM物件,需要$(this)包裝過
    才會變成jQuery物件

7.index

當selector取得一堆的子node要對特定子node操作    
1.透過index取得第幾個物件
    $(".left_box :eq("+_index+")")
2.取得目前物件的index值
    例如有一堆li 由以下可以知道自己是在第幾個
    $(".left_box li").index($(this))

2011年4月30日 星期六

StreetVoice

今天出門筆電裡沒放任何mp3檔案
還好最近SV播放超順
聽了一整個下午 沒有任何斷線與LAG
果然上了雲端後 好用多了

修澤的音樂真的很棒

2011年4月6日 星期三

清明節

今年的清明 我跟小弟去掃墓
大弟就在醫院照顧老爸

一樣是早上七點出門
上了高速公路 往旗山的方向

往年 在清明前 老爸就會先開車來墓園打掃 除草
大家習慣看到就是個乾乾淨淨的園地
今年老爸住院了
家族裡的叔叔伯伯 還有我們這一輩的堂兄弟們
大家都要戴上手套 除草 整理
就像是小時候 曾祖父的墓地還在鳳山那時
每到清明掃墓 大家都會拿著鐮刀 清理墳上的雜草

忙了一身的汗水 祭拜祖先和土地公
坐下來 好久不見的堂兄弟們 聊起工作聊起生活
叔叔伯伯們問起老爸狀況
狀況好轉 也讓他們比較放心一些

一邊用石頭壓著各色的墳墓紙
一邊把蛤蜊殼丟在墳上
算算已經好幾年沒在清明節回來掃墓了
明年此時
應該老爸就可以跟我們坐在這
一起
祭祖 聊天

2011年3月29日 星期二

家屬休息區

在每個加護病房旁會有個家屬休息區
隔了許多上下鋪的木床
每張床都有一個編號,對應的是在加護病房內病患的編號
當休息區電話響起,
代表的是加護病房內要聯絡哪個病患的家屬

2531 這是老爸的編號
休息區的溫度感覺比其他樓層冷了許多
也許是剛好這幾天寒流來的緣故
裡面總有股化不開 讓人開朗不起來的氣氛
也許是因為在這裡的每個人
都有個正在加護病房努力求生的家人

躺在小小的木板床上,伸手就可以觸碰到上鋪的木板
彷彿回到 新兵訓練中心的生活
拉上小布簾 把自己關在小空間內
打開電腦 繼續著還沒寫完的程式
即使很疲累 但 似乎 精神還更能集中一些
回到程式碼裡 也暫時讓自己跳脫當下的氣氛

2011年3月26日 星期六

治療室

治療室總是開著明亮的電燈
還有一堆的儀器
以往走過 還會好奇的看著 躺在床上
插滿各式管子的病患
今天 床上躺著的 是我老爸

看著儀器上的數據 跳呀跳著
不時發出 警示聲
老爸已經打了鎮定劑 暫時得到休息
偶爾看他睜開眼開始掙扎 用力咬著嘴裡的呼吸管
我們只能在旁摸著他的頭 不斷說話 安撫著他的情緒
然後睡著
一整個夜 就這樣反反覆覆 反反覆覆
我和大弟 兩個人輪流到病房短暫休息睡覺
一天 兩天 我們也不知道什麼時候可以回家好好睡個覺

過了一天 一夜 不再需要靠打鎮定劑 讓老爸睡著
偶爾他想說話 卻無法表達
我們只能用張白紙 寫上許多隻字片語
讓他用手指 表達可能他想說的話

原來灌食就是這樣
把牛奶倒進一條 由鼻子直通到胃的塑膠管
心跳似乎越來越慢 最怕心衰竭的狀況發生
開刀前在治療室的三個日夜
像是完全沒有止境的三天

2011年3月24日 星期四

難過

一早老媽就打電話來 要我早點到醫院
看到老爸疲累的樣子
媽說 爸因為喘的厲害 一整夜都沒睡了
算起來 老爸已經好幾天沒有睡覺了
這幾天 似乎 病情 有些急速惡化
中午 一樣買了飯
老爸吃了幾口 就沒辦法再吃下去
"推我出去 走走吧 到比較有風的地方"
"好"
推出病房區域 一樣繞著電梯走道
似乎在找哪裡是比較有風的地方
可是 其實我都感覺不到
"就這裡吧 停下來休息一下"
我們停在靠右側電梯 旁的走道上

老爸望著窗外的遠方
彷彿要把他心裡許許多多的話 都讓我記清楚
如果可以 想回山上去看看 但這可能不是個能達成的願望
想著和老媽在山上是何等的幸福
最擔心的是老媽 以後的生活
說起了他對我們兄弟的一點一滴
還有那許許多多 以前我所不了解的事
他很疲累的說著 一面要我給他水
但他真的累了

站在他身後 我只有蹲下忍住眼淚發出的聲音
"我們回房間吧"
他真的累了

推回病房 老爸坐在病床上
氧氣罩開到最大 似乎也無法讓他可以好好的呼吸
老爸說
"也許過不了這一夜了 晚上你們兄弟都一起來"

我把緊急鈴 按了又按
焦急的等待護士與醫師的到來

接下來老爸被推進了治療室 綁上了手腳
嘴巴與鼻子插了管 再也無法說話
開始了他最痛苦的幾天幾夜

這是 2011/3/24 下午四點

2011年3月17日 星期四

陽光 午後

聽說又有另一波冷氣團
不過在高雄 還是一樣是有陽光的好天氣
老爸今天下午狀況不錯
不想躺在病床

借了輪椅 戴好口罩
慢慢推著他離開病房

長庚病房外 除了看電視的交誼廳外 其實沒甚空間
繞著八樓 中央電梯旁繞了幾圈

找個靠牆的位置 可以透過窗戶看向遠方
還有明亮的陽光

回到病房 拿個小椅子 還有今天的報紙
和老爸坐在窗邊 看著報紙上
昨天世界發生的大小事
這一刻的陽光
讓我跟老爸都有種幸福的感覺

2011年3月14日 星期一

老爸 這次你要撐過去

凌晨一點多
坐客運回到高雄老家
看著放在桌上 老爸的手術同意書
即使現在的我非常疲累
還是無法就這樣睡著

閉上眼 過往的一幕幕
就這樣 在眼前 在腦海 翻來覆去

記得那個我在台北度過很難過的一夜
隔天請了假
坐高鐵 轉火車 再轉客運
去屏東萬巒找我老爸
"爸,不要來載我,我自己走路進去就可以了"

下了屏東客運,我往山的那一頭走去
這一路的旅途,就是這樣靜靜的走
走在筆直沒有人車的產業道路上

遠遠看到熟悉的車開了過來,
老爸還是不放心的開了車來找我

上了車,一陣沉默,老爸問了問
我看著窗外,眼淚慢慢掉了下來
這是 第一次在老爸面前哭了出來
他只是跟我說 "沒關係的 沒關係的"

回到山上的家 老爸問了問我要不要喝咖啡
看他燒著水,熟練的煮著他自己種的咖啡
坐在椅子上 這裡遠望可以看到高雄的大樓
在徐徐的微風中 我們就這樣靜靜的坐著

"明天早上一起去爬山吧"
"好"
隔天天還沒亮,老爸拿了個木杖,一瓶水給我
"多帶件衣服,到山頂上把汗溼的衣服換掉才不會感冒"
"好"

這是條老爸很熟悉的登山步道
跟著他的腳步
一面走一面跟我說遠處的山是哪裡哪裡
走到山頂的目的地,在平台上坐著
天才開始矇矇亮了起來

老爸 這次你可一定要撐過去啊
我還想再載你一起回山上去的

2011年3月8日 星期二

鍋貼

長時間沒有進食,老爸一直沒有什麼食慾
偶爾他想到要吃什麼,我們就很開心的買來
希望他可以吃多一些,讓身體有更足夠的營養與體力

大弟每天下班 整理好 就會帶著晚餐來醫院
跟我還有老爸一起吃飯
每天的這個時候 一面陪老爸說說話
我們兄弟也有時間談些家裡的大小事
還有老爸現在的醫療狀況

準備三餐這件事
除了老媽來時,會在家煮好帶過來
大多時候,我只是固定的在地下室餐廳買魚湯 買飯,

大弟總會試著買各種不一樣的食物
看看是不是有老爸會喜歡吃的東西

有一段時間老爸喜歡吃大弟買來的鍋貼

把用餐的餐板架在病床上
鋪好報紙,給老爸準備好假牙
放幾個鍋貼在盤子上 再將魚湯倒在杯子裡
然後 我們兄弟 才坐在旁邊的椅子上
鋪上報紙 一起吃著鍋貼

病房簾幕隔起來的小區塊
我們兄弟陪著老爸 吃飯
一直到快10點 要大弟回家休息
明天還要上班

陪著大弟走出去搭電梯
陪他走到一樓

2011 三月 于高雄長庚

2011年2月17日 星期四

numChildren屬性對應子物件數量的正確性

在Flash IDE上設計好的物件,如果要利用AS取得該物件下的子物件數量
通常會是透過numChildren取得子物件數量,例如ball.numChildren

但有可能會有讀到的numChildren值,與你在Flash IDE上放置的子物件數量值不同的問題。

這情況會發生在,當在Flash IDE上設計子物件時,把多個Shape物件(也就是並未轉成Symble),放在一起(在IDE上把多個Shape放在同一個Layer上或把多個Shape放在相鄰Layer上),這時候這些相鄰的Shape,不管數量有多少,都只會被當作一個子物件計算,這時numChildren取得子物件數量就會與在IDE上放的子物件數量不同

如果Shape間有被TextField物件或其他Symble間隔開來,則numChildren可讀到正確的子物件數量,
或是將繪製的物件轉成MovieClip就可以正確讀出

2011年2月9日 星期三

今年過年

醫院
年前老爸送長庚急診,大概是過年大家都要出院回家
大弟只在急診室等了一夜,等我到醫院時 就排到了病床
我們兄弟輪替著在醫院陪著,
在回到家的這幾個晚上,我都在醫院陪著

老爸睡的不好,有時候整晚沒睡,需要靠安眠藥才能休息
有時因藥物的副作用讓他痛的無法入眠
很自然的,我的睡眠也就斷斷續續

每天一早7點老爸就會起床吃藥.
拉開窗戶的百葉窗, 這是一天的開始
白天有機會休息時,就躺在旁邊的躺椅上
也許是小睡片刻,也許是看看書,或者是看著外面的天空
想著許多許多的事 看著窗外一片美麗的藍

買彩卷
快中午,小弟就到醫院來,我也偷了個空
早點回家抱抱妹妹
帶老婆去剪頭髮,說好打電話來 我再去接他

在家跟妹妹玩,看看時間差不多了
騎著摩拖車載妹妹去找媽媽
媽媽在髮廊斜對面的彩卷行,
聽說這期有11億,當然也要跟人去碰碰運氣
買了400塊的刮刮樂,還中了700,今年的運氣還真是有點不錯
坐在彩卷行的椅子上,一家人開心的對獎,
喝著老闆請的飲料
明亮的陽光 大好的天氣
有一種幸福的感覺

除夕夜
原本該是全家團聚的時間
去年的這個時候,還聽著老爸講著似乎每年都相同的故事
老婆本來還說要聽看看老爸今年講的是否一樣
只是這個夜
只有老媽 小弟還有我一家吃著晚餐
大弟在醫院陪著老爸

簡單的吃了飯,小弟開車載著我們到醫院
今天晚上他會陪爸

醫院裡冷冷清清,大家都趕在過年前出院請假回去了
圍在爸身邊看他有點清醒的樣子
我們大家把紅包放到他上衣的口袋
爸 過年了 新年快樂

初一
習慣在大年初一跟著家人到廟裡拜拜
也感受那比較濃厚的過年氣味

鼓山亭 大火後重建 已經恢復整個廟宇的建築
只是已經失去原本古樸的外觀
遇到了八叔,問起爸的狀況,簡單的回應有好了一些

在成功路上繞了一下
才找到了 蘇府王爺廟,附近都蓋了新大樓
也大概是自己太久沒回去了,指憑著記憶要找到那在大樹旁的廟
越來越難

傍晚媽煮飯 怕妹妹在旁邊吵
騎著車到文化中心晃晃
老婆悠閒的逛著廣場上一個個的年節攤位
妹妹在廣場旁的階梯上,上上下下並玩著拔草亂撒的遊戲
一直到老婆帶著滿手的零食 一家人吃完後,才盡興的回家

明天就要回台北了
8點多再騎車去去長庚 看看爸
今天晚上 是大弟還有他老婆在醫院看顧
和大弟 聊阿聊的 10點半多載大弟一起回家
回家路上 大弟帶我到瑞隆路上 買了好吃的豆漿燒餅
這是份暖暖的宵夜

初二
小弟開著車帶我們到高鐵站
滿滿的乘車人潮,等了會才有位子在摩斯吃早餐
要回台北了 一堆的工作等著
只希望 在南部的家人 可以 健康平安

2011年1月27日 星期四

以SWF為Skin的程式設計

預期開發功能
1.Flash主程式與視覺外觀部份分離
2.外觀部份為以Flash IDE設計輸出swf檔案,當作主程式外觀Skin
3.Skin部份,設計師可任意排列物件
4.各個Skin,允許部份元件不存在
5.在程式進行當中,可任意更換Skin

一.Skin Loader
在利用Loader載入外部swf當作skin時,因為要當作skin用的swf內必定都會有著相同的物件名稱。例如skin01.swf與skin02.swf內都會有著同為bg的物件,這時在設定loader的LoaderContext時需設定其
context.applicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain);
讓載入的物件Class屬於主體ApplicationDomain下的子系,才能讓每次載入不同swf的Class都能生效
如果使用
context.applicationDomain = ApplicationDomain.currentDomain;
會讓所有的Class都掛在主體ApplicationDomain下,這時後當重新載入新的swf時,檢查到ApplicationDomain下該物件名稱Class已經存在,則會使用原有的Class,所以新載入的swf內同名物件永遠無法載入,只會一直載入舊有的Class
就無法達到動態換Skin的作用


var loader:Loader = new Loader();
var request:URLRequest = new URLRequest(_swfPath);
var context:LoaderContext = new LoaderContext();
context.applicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain);
loader.load(request,context);

二.Skin內使用物件Class設計
在Skin內要用到的物件,在設計Class時,不要在建構子內放置物件的初始化動作
(因為產生物件時,可能還沒有實體內容載入),而是將初始化的動作放在一個如
init()的public method內,在確認物件存在的狀態再執行init()即不會出錯


public function Banner(){}
public function init():void {
    setView();
    setListener();
}
private function setView():void {}
private function setListener():void {}

三.Skin Swf在Flash IDE上的設定
1.設定一個AssetContainer,用來設計Skin Layout
通常利用loader載入swf當作library來使用物件,都是利用在物件上linkage設定Class後來取得物件使用,但若這樣在程式裡產生物件使用,Layout部份,就需要寫在程式碼裡去做排列,但這樣就無法讓視覺設計去自行設計版面排列。

可以在fla內設定一個MovieClip當作AssetContainer來用,設計師在這個Container內排列所要的物件,與所要的排列方式,
透過loader載入swf後,取得這個AssetContainer物件的Class,再由這Class內,透過getChildByName,取得所有物件,各物件即已經存在有位置大小等屬性


在Fla的library內設定AssetContainer Linkage Class

var AssetContainer:Class=loader.contentLoaderInfo.applicationDomain.getDefinition(className)  as  Class
_assetLib = new AssetContainer();
mybg=_assetLib.getChildByName("bg");
mybg.init();

2.在Linkage對物件設定Class時,建議都在Class上指向完整Clss,Base Class都是MovieClip
若有需要用到相同物件,因為Class只能指定給一個物件,若有其他需要,可以extends Class出來使用即可

3.繼承自Components的元件需更改元件Linkage Class
若元件繼承自Components,在將component拉到library內後,在components上的linkage的Class改成自訂Class name
例如自己設記一個繼承自List元件的Class MyList,在Fla內需先把List元件拉入Library內,
再修改List元件的linkage的Class為MyList

四.主程式
1.物件參考變數設定
在主程式中,用來當作物件參考的變數,在重新載入Skin後即會失效
要讓物件參考變數再度指向物件參考需透過getChilByName取得才能保證取到物件

例如
在swf內有一個 instance為book的Book物件
當重新載入skin時,這個book變數並不會自動指向新取代而來的物件
需要透過
book=app.getChildByName("book")來讓變數指到實體的物件

2.不同SKin允許部份元件不存在
可能會需要在不同的Skin中允許部份的元件不存在或不使用
在可能會因為物件不存在而造成錯誤的地方,先用
if(obj!=null)做檢查再執行