2010年11月30日星期二

Mobile User Interface Design

大家好,我是奶綠茶
分享幾個覺得不錯的 UI 設計網站。
http://developer.android.com/guide/practices/ui_guidelines/icon_design.html#templatespack
http://speckyboy.com/2010/05/10/android-app-developers-gui-kits-icons-fonts-and-tools/
http://mobile.tutsplus.com/
http://www.webdesignshock.com/freebies/free-photoshop-android-interface-gui/
http://designmoo.com/resource/call-to-action-buttons/
http://dribbble.com/julien
http://tapfancy.com/
enjoy it!

2010年11月29日星期一

Remote Device Controller in AIR for Android

大家好,我是奶綠茶
最近在研究 Android
一直在想什麼的功能, 一定要用 Adobe AIR 來寫
後來在 flashrealtime 網站上看到這一篇教學, 覺得很有趣, 就自已來實作一個

把自已之前練習的 PV3D 紙飛機 Game 加上 P2P 的程式
而 Android 端的程式是直接用 flashrealtime 提供的原始碼
方法是使用 FP10.1 的 P2P技術
只要二端是在同一個網域, 不需使用 FMS 也可以連線。
參考文章:
http://www.flashrealtime.com/game-remote-device-controller/
轉載請註明出處

2010年11月26日星期五

米蘭創意種子(實習生)招募中!!

原文:http://medialand.com.tw/blog/article.asp?id=1295


實習不只為了學分,更為了灌溉自己
這次的實習生招募,不限於寒暑假,希望是更深入的培育

米蘭期待找到這樣的種子↓
數位向陽性;
內含許多有趣的idea成分;
對新事物能產生一連串化學變化;
並有努力想成長茁壯的積極熱血。


1.實習需求

創意企劃實習 1~2名

內容說明: 
米蘭的創意企劃工作範疇,著重在創意發展,也講究細節規劃
如果你很積極,你可以學習到
如何發展一個網路廣告或病毒影片的腳本
如何規劃一個網站或網路活動的玩法、單元內容、頁面文案撰寫、動線思考…
如何思考一個數位行銷的創意
甚至 更多!!

評估依據 
創意 (30%):作品的策略思考、創意概念、文案與畫面的整體表現
認知 (30%):平常對於網路生態、廣告傳播的觀察和了解
熱忱 (30% ) :對創意與數位的熱忱
反應能力(10%):臨場表現和清楚的表達能力

聯絡與收件窗口:Carol 電話:27390000轉131
carol@mail.medialand.com.tw 
信件主旨:[應徵米蘭創意種子-企劃實習,我是<<你的姓名>>]

設計實習 1~2名

內容說明: 
米蘭設計師工作範疇,著重在設計執行及視覺創意表現
如果你很積極,你可以學習到
如何完成一個高質感與創意兼具的作品
如何執行一個完整專案從創意發想、動線思考、單元頁面到完成上線
如何整合設計資源做最有效的發揮
甚至 更多!!

評估依據 
技術 (30%) :軟體熟悉度及呈現的質感
創意 (30%) :個人作品呈現的方式與內容
熱忱 (30% ):對於設計的用心與堅持
表現度(10% ): 臨場表現,應對之間表現的談吐及態度

聯絡與收件窗口:Cheney  電話:27390000轉162
cheney@mail.medialand.com.tw 
信件主旨:[應徵米蘭創意種子-設計實習,我是<<你的姓名>>]

2.報名期間: 11/25(四)~01/17(一) 24:00止
3.面試期間: 01/18(二)~01/26(三),錄取通知:1/27(四)
4.實習時間: 02/14 Start,預計至6月底結束,每周至少來三天
5.應徵文件:參與應徵者請務必提供以下內容
A.個人基本資料 
姓名、生日、聯絡方式、學經歷、待修學分list、並附上近期清晰照片乙張
B.我的網路履歷表 
i.使用網路的年資
ii.使用或造訪過哪些網站,其中最喜歡哪個網站?為什麼?
iii.你的個人平台連結與介紹 (例如:Blog、Plurk、twitter、FunP、facebook、flickr、delicious、黑米…)
iv.你在虛擬的網路中,有哪些傲人的身分或成績?
(例如:線上遊戲團長或幹部、巴哈姆特Lv3等級以上、噗浪的Karma超高、擔任過批踢踢小天使或版主、在youtube或blog上的作品曾經被廣為傳閱…)
C.個人作品集(或作品網站、部落格)
D.我的熱情宣言

i. 你所認知的米蘭,以及想來米蘭實習的原因
ii. 你最喜歡米蘭的作品及原因

本次的實習期間屬於學期中實習,也請報名者先考量課業loading喔 ^^

2010年11月16日星期二

FlashAS3 Countdown

大家好,我是奶綠茶
Countdown在 flash 的專案裡,應該也是很常出現的吧
所以我就把他包裝成一個 class , 方便使用
預設是抓取 client 端的時間
如果想要以伺服器時間為主的話
也只要使用 URLLoader 透過伺服器程式回傳時間
再更新我所寫的 Countdown類別可以。


Countdown.as
/**
 * @author milkmidi
 * @see http://milkmidi.blogspot.com
 * @version 1.0.1
 * @date created 2010/11/16/
 */
package milkmidi.utils { 
 import flash.events.Event;
 import flash.events.EventDispatcher;
 import flash.events.TimerEvent;
 import flash.utils.Timer;
 
 [Event(name = "countDownComplete" , type = "milkmidi.utils.Countdown")]
 [Event(name = "countDownUpdate"  , type = "milkmidi.utils.Countdown")]
 public class Countdown extends EventDispatcher {  
  public static const COUNTDOWN_COMPLETE :String = "countDownComplete";
  public static const COUNTDOWN_UPDATE :String = "countDownUpdate";
  private static const SEC :uint = 1000;
  private static const MIN :uint = SEC * 60;
  private static const HOUR :uint = MIN * 60;
  private static const DAY :uint = HOUR * 24;
  
  private var _endYear :uint;
  private var _endMonth :uint;
  private var _endDay  :uint;
  private var _endHour :uint;
  private var _endMin  :uint;
  private var _endDate :Date;
  //   
  private var _year :int;
  private var _month :int;
  private var _day :int;
  private var _hour :int;
  private var _min :int;
  private var _sec :int;
  private var _timer :Timer = new Timer(1000);
  private var _today :Date;
  
  /**
   * 
   * @param pYear
   * @param pMonth
   * @param pDay
   * @param pHour
   * @param pMin
   */
  public function Countdown( pYear:uint, pMonth:uint , pDay:uint , pHour:uint = 0, pMin:uint = 0  ) {   
   _endYear  = pYear ;
   _endMonth = pMonth - 1;   
   _endDay   = pDay;
   _endHour  = pHour;
   _endMin   = pMin;   
   _endDate = new Date(_endYear, _endMonth , _endDay, _endHour , _endMin);    
   _timer.addEventListener(TimerEvent.TIMER , timerHandler);
  }   
  /**
   * 
   * @param pYear
   * @param pMonth
   * @param pDay
   * @param pHour
   * @param pMin
   */
  public function setNewDate(pYear:uint, pMonth:uint , pDay:uint , pHour:uint = 0, pMin:uint = 0):void {   
   _today = new Date(pYear , pMonth - 1 , pDay , pHour , pMin);
  }
  public function start():void {   
   _timer.start();
   timerHandler(null);
  }
  public function stop():void {
   _timer.stop();     
  }
  private function timerHandler(e:TimerEvent):void {     
   var _todayDate:Date;
   if (_today == null) 
    _todayDate = new Date();
   else 
    _todayDate = new Date(_today.getTime() + _timer.currentCount * 1000);     
   
   
   
   var differ  :Number = _endDate.getTime() - _todayDate.getTime();     
   _day  = Math.floor(differ / DAY);
   differ -= _day * DAY;
   _hour  = Math.floor(differ / HOUR);
   differ -= _hour * HOUR;
   _min  = Math.floor(differ / MIN);
   differ -= _min * MIN;
   _sec = Math.floor(differ / SEC);
   
   
   if (_day < 0) {
    stop();
    _year = _month = _day = _hour = _min = _sec = 0;
    dispatchEvent(new Event(COUNTDOWN_COMPLETE));            
   }else {
    dispatchEvent(new Event(COUNTDOWN_UPDATE));
   }   
  }
  public function destroy():void {     
   stop();
   _timer = null;
  }
  public function get year() :uint { return _year; }  
  public function get sec() :uint { return _sec;  }  
  public function get min() :uint { return _min;  }  
  public function get hour() :uint { return _hour;  }  
  public function get day() :uint { return _day;  }  
  public function get month() :uint { return _month;  }
  override public function toString():String {
   return "year:" + year + " month:" + month + " day:" + day + " hour:" + hour + " min:" + min + " sec:" + sec;
  }
 }
}
測試:
/**
 * @mxmlc -o deploy/CountdownDemo.swf -default-size 800 600 -optimize=true -default-frame-rate=36 -default-background-color=0xffffff -debug=false
 * @author milkmidi
 * @see http://milkmidi.blogspot.com
 * @version 1.0.1
 * @date created 2010/11/16/
 */
package  {  
 import flash.display.Sprite;
 import flash.events.Event;
 import flash.text.TextField;
 import milkmidi.utils.Countdown;
 public class CountdownDemo extends Sprite {  
  
  private var _tf:TextField;
  private var _cd:Countdown;
  public function CountdownDemo()  {   
   
   addChild(_tf = new TextField);
   _tf.width = 300;
   
   
   //預設是使用 client 端的時間
   _cd = new Countdown(2010, 12, 31);
   _cd.addEventListener(Countdown.COUNTDOWN_UPDATE , _countDownUpDateHandler);
   _cd.addEventListener(Countdown.COUNTDOWN_COMPLETE , _countDownCompleteHandler);
   _cd.start();
   
   // 從伺服器抓到正確的時間後, 把時間填寫入函式,即可更新
   //_cd.setNewDate(年,月,日,時,分)
  }  
  
  private function _countDownCompleteHandler(e:Event):void {
   _tf.text = "Happy new year";
  }
  
  private function _countDownUpDateHandler(e:Event):void {
   _tf.text = _cd.toString();
  }   
  
 }
}
轉載請註明出處 http://milkmidi.blogspot.com/2010/11/flashas3-countdown.html

2010年11月2日星期二

android開發心得1

大家好,我是奶綠茶
來筆記一下 android(Java) 的程式開發和 flash 之間的差別
宣告:
Java:類別當作宣告字(同C#)
String a = "字串";
AS3:使用var加上:類別的方式
var a:String = "字串";

function 宣告:
Java:回傳的型別寫在前方(同C#)
public void testFun(){
}
AS3:回傳的型別使用:型別
public function testFun():void{
}

Overloading:多載, 同以有一樣的函式名稱, 只要引數個數不同,或是引數型態不同
Java:支援(同C#)
public void testFun(){}
public void testFun(String pName){}
AS3:不支援

override:覆寫, 子類別繼承父類別, 但可改寫父類別的方法, 回傳值和引數必需皆相同
Java:支援
子類別直接寫和父類別一樣的方法即可
AS3:需加入 override 的關鍵字
function protected override testFun():void{
}

package:套件包(這個好難翻成中文)
Java:在類別的最上方輸入, 使用分號結速
package milkmidi.android;
public class xxxx(){}
AS3:在類別的最上方輸入, 使用大括號包住下方 class
package milkmidi.android{
public class xxxx(){}
}

繼承: 使用 extends 關鍵字
Java和AS3皆相同
Java和AS3皆是單一繼承
Java支援 private class, 所以可以 class 再寫一個 class
AS3不支援 private class, 最多能在 package 外寫一個 internal 的class

修飾字:private,protected,internal,public
Java和AS3皆相同

Set,Get:
Java:只能使用function來擴充
private String name;
public String getName(){return name;}
public void setName(String pName){name = pName;}
AS3:
private var _name:String;
public function set name(pName):void{ _name = pName;}
public function get name():String {return _name}

interface:介面
Java:支援 static 的介面
AS3:不支援(誤, 應為)

Focus1921 提到...
在Interface的部分,「AS3不支援」應該明確指出不支援static,但支援一般的介面 : )


常數宣告:
Java:使用 final
private final String TAG = "milkmidi";
AS3:使用 const
private const TAG:String = "milkmidi";

目前想到這些,有心得再來補上,
如有錯誤,麻煩跟我說,感謝

android開發心得2

大家好,我是奶綠茶
研究了一陣子的 Android 開發,寫點心得來記錄一下,不然一直忘東忘西的
在使用 eclipse 開發時
會很自然的切換到 xml 來編輯 layout 或是 resource
如果此時按下 run
會產生 xxx.out.xml的錯誤, 天呀, 這什麼問題
這個問題困擾我好久, Google了一下發現
在 eclipse 中編輯 xml 檔案, 會預設用 xsl 來轉換(我也不清楚什麼是 xsl 待好心人幫我解惑)

決法1:
要執行時, 把焦點由 xml 移開到專案
在 Project->Clean 清除目前的編譯
刪除多餘的 xxx.out.xml
再重新 run 一次

超麻煩, 還好有 google , 找到另一個方法,一次決解他
決法2:
http://www.cnblogs.com/chunhui588/archive/2010/06/26/Android-debug-main-out-xml-parsing-error.html

這樣就清爽多了.