2013年8月12日 星期一

[Android] 虛擬鍵的隱藏與低可見度

以下的API LEVEL需求為14以上

低可見度
this.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE);
隱藏
this.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);

在這裡要注意的是,這些動作都是一次性的
當事件觸發虛擬鍵導致虛擬鍵的狀態被設定為顯示的時候
如果不再去設定它的狀態,他將會一直維持

同場加映:三秒中自動將虛擬鍵低可見化

private Handler myHandler = new Handler();

private Runnable runTimerStop = new Runnable() {
        @Override
        public void run() {
            hideNavigation();
        }
};

private void hideNavigation() {
        if (Build.VERSION.SDK_INT > 13)
                this.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE);
}

//在dispatchKeyEvent中增加下列
myHandler.removeCallbacks(runTimerStop);
myHandler.postDelayed(runTimerStop, 3000);

2013年3月10日 星期日

[Cocos2d-x] 關於 CCTextureCache

這個東西是用來管理Texture的快取

最近發現同事常常在使用一張圖片後
馬上就下了 CCTextureCache::shareTextureCache()->removeTextureForKey

感覺起來好像沒有什麼錯,用了一張圖之後就把他從快取移出

但這個部份有個很大的問題
當我們使用 removeTextureForKey的時候他會做兩件事情
第一件是從管理列表中移除這個Texture資料
第二件是"嘗試"移除 Texture

關鍵就在於他去移除 Texture的時候,那個Texture是有人在使用的
所以他不會真的去移除它,但是他卻從我們管理的清單中被移除了
隨然Texture有AutoRelease的機制,但卻無法掌握他什麼時候才會被釋放
也無法掌握現在到底用了多少資源在什麼地方上

結論就是要移除Texture的話,請先移除使用它的物件
然後使用 removeUnuseTexture

ps.  removeUnuseTexture 算是蠻吃資源與時間 請審慎評估使用時機

2012年11月7日 星期三

[Android] Notification

Notification是指畫面上方資訊列的訊息提示

//先取出Notification管理員
NotificationManager notificationManager =
(NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
//產生一個Notification
 Notification notification= new Notificatio( R.deawable.icon, "This is Message", System.currentTimeMills());
//建立Intent
Intent intent = new Intent(context,ActivityName.class);
//建立PendingIntent
 PendingIntent pendingIntent = PendingIntent.getActivity(context,0,intent ,0);

//設定 Notification內容
 notification.setLatestEventInfo(context,"This is Title","This is Message",pendingIntent);
//發送 Notification
 notificationManager.notify(0,notification);

2012年6月5日 星期二

[ActionScript3] get 與 set

AS3跟JAVA真的很像,當然get跟set的用法也類似
但還是有一些地方不同

get與set主要的用途是滿足封裝的概念
讓人無法知道以及隨意變更被封裝的函式與變數
get是用來取值,set是用來給值

 參考下面程式碼
public class Main extends Sprite 
{
  
 private var number:int=0; 
 public function Main():void 
 {

 }

 public function set Number(x:int):void
 {
  number = x;
 }

 public function get Number():int
 {
  return number;
 } 

}

由於number的private屬性,所以無法直接存取,需要使用其他方法來完成
而AS3中get跟set最大的特點就是
只用這兩個關鍵字的函式會被當成實體而不是函式

使用的方式直接如同一邊變數下去使用就可以了
var test:Main=new Main;

test.Number=100; //將number設成100
trace(test.Number); //取出number的值並印出

2012年6月3日 星期日

[ActionScript3] enum in AS3

在ActionScript3裡面沒有enum這個東西可以直接用
不過可以透過宣告靜態(static)與常數(const)來達成我們要的效果

下面舉一個水果盤的列舉集合來作例子
public class SYNBOL_DEFINE
{
        static public const SYM_BLUE_7  :uint = 0; // 藍 7
        static public const SYM_RED_7  :uint = 1; // 紅 7
        static public const SYM_BAR_3  :uint = 2; // BAR 3
        static public const SYM_BAR_2  :uint = 3; // BAR 2
        static public const SYM_BAR_1  :uint = 4; // BAR 1
        static public const SYM_MELON  :uint = 5; // 西瓜
        static public const SYM_BELL  :uint = 6; // 葡萄
        static public const SYM_MANGO  :uint = 7; // 芒果
        static public const SYM_ORANGE  :uint = 8; // 橘子
        static public const SYM_CHERRY  :uint = 9; // 櫻桃
        static public const SYM_I  :uint = 10; // i 寶寶
        static public const SYM_G  :uint = 11; // G
        static public const SYM_JOKER  :uint = 12; // Joker
}

當宣告static代表這個物件是屬於類別而不是實體
所以在使用的時候要使用類別名稱而不是實體名稱
var simple:SYNBOL_DEFINE=new SYNBOL_DEFINE;

simple.SYM_BLUE_7;          // 會產生錯誤
SYNBOL_DEFINE.SYM_BLUE_7    //正確用法


而宣告const的代表他是常數,是無法被變更的

2012年6月2日 星期六

[C/C++] 列舉(enum)


列舉主要的應用是在增加程式的可讀性
尤其是大型多人專案
 

以下舉個小例子來說明:

今天我們寫了一個ShowWeapon的函式

public void ShowWeapon(int x)
{
  cout << "your weapon is"
  switch(x)
  {
    case:1
      cout << "Axe";
      break;
    case:2
      cout << "Staff";
       break;
    case:3
      cout << "Dagger";
      break;
  }
}

當我們使用
ShowWeapon(1);    // point "your weapon is Axe"
給他1它會印出Axe 2就是Staff 3就是Dagger

在寫程式的當下會很爽
但是等你過幾天回來或是這個程式給別人維護的時候就會很不爽了

天殺的,誰知道你的代入值1,2,3是什麼意思

這個時候我們在前面加上enum的話會變成

enum Weapon : int
{
  Axe = 1,
  Staff = 2,
  Dagger = 3
}

public void ShowWeapon(int x)
{
  cout << "your weapon is"
  switch(x)
  {
    case:1
      cout << "Axe";
      break;
    case:2
      cout << "Staff";
       break;
    case:3
      cout << "Dagger";
      break;
  }
}

原本的ShowWeapon就可以這麼用
ShowWeapon(Weapon:Axe);     // point "your weapon is Axe"
ShowWeapon(Weapon:Staff);   // point "your weapon is Staff"
ShowWeapon(Weapon:Dagger);  // point "your weapon is Dagger"

可以讓自己也讓後面維護的人清楚這個位置的代入值要填入些什麼
也可以約束填入的內容才不會發生未預期到的錯誤

以上面的例子來說,如果沒有使用enum的話,很可能會出現4,5,6這類超出原本預期的數值
而使用enum後,把所有可以填的數值都規範在enum結構裡了