2011年1月14日 星期五

位元移動與RGB

大家好,我是奶綠茶
什麼是位元的移動運算呢?
在 flash 裡,使用的符號是: >>(二個大於, 位元向右移) , <<(二個小於, 位元向左移) 簡單來說明一下這個東西有什麼優缺點。 例: 8 >> 1
這句的意思是說,8 的二進位數位, 向右移一個位元
8 (十進位) 的 二進位數值即是:1000
簡單對照一下:
左邊是十進位, 右邊是二進位
1 = 1
2 = 10
3 = 11
4 = 100
5 = 101
6 = 110
7 = 111
8 = 1000

所以 1000 , 向右移一個位元, 即是踢掉最右邊的那個值, 得到 100
就等於 4(十進位)
好理解的方法,就是 8 除以 2
那 8 >> 2 呢
就是右移二個位元, 踢掉最右邊的二個值, 得到 10
就等於 2(十進位)
好理解的方法,就是 8 除以 2 ,再除以2

反之:<< (左移), 即是位元最右邊補 0 那有什麼優缺點呢? 1. 位元的移動是運算速度最快的, 如果你想取一個數位的一半的話 速度快到慢依序為: 值 >> 1
值 * 0.5
值 / 2
2. 直接得到整數
在 flash 裡, 元件的座標出現小數點的話, 會容易會糊糊的
如果此時想要得到某個數值的一半且是整數的話,就用 位元移動的算法吧

缺點
1. 運算優先權的順序
先乘除, 後加減, 這是不變的定律
但位元移動的優先權是最低的,所以是 先乘除, 後加減, 再做位元移動的運算
例:
8 >> 1 + 1 = 2
8 * 0.5 +1 = 5
8 / 2 +1 = 5
結果是不同的。

取RGB數值
大家好,我是奶綠茶
有個色碼為:var color:uint = 0x1199FF;
0x 指的是 16 進位, 一般都是用在色碼上
現在想取出這個色碼的 R, G , B值
當然不能用 String 來抓
這時候就要上位元移動和數位邏輯來製作。
一樣要先把 16 進位轉成 2 進位
偷懶一下,開啟小算盤, 就有轉換的功能了
2 進位為:
100011001100111111111(共24個位元)
所以我們可以知道一個色碼, 佔了 8 個位元
取出 R :就是把右邊的 16 個通通踢掉
var r:uint = color >> 16;
簡單吧

取出 G :因為 G 色碼是在正中間,
所以要先踢掉右邊的 8 位元
var g:uint = color >> 8;
再把另外的左邊 8 個位元通通變成 0
這時可以用 & (and)
and 指的就是, 如果二個數值為真, 結果才為真。
所以只要 & 八個元位 , 其他左邊的就通通變成 0 了
g = g & 0xff;(0xff就是一個色碼, 佔了 8 個位元, 前面有提到)
這樣就得到 g 色碼

取出 B :不用踢右邊, 只要把左邊不要的變成 0
var b:uint = color & 0xff
這樣就完美啦
如果出現了 alpha
色碼就多了一組, 佔了 32 位元
即是 ARGB
例:ff11aaff
用一樣的方法即可把他分離
包裝成 function , 方便以後使用
function getRGB(pColor:uint):Object{
return {r:pColor >> 16 , g:(pColor >> 8) & 0xff , b:pColor & 0xff};
}

轉載請註明出處 http://milkmidi.blogspot.com/2011/01/rgb.html

2011年1月4日 星期二

FlashAS3 亂數不重複的方法

大家好,我是奶綠茶
亂數不重複的方法我想在很多時候都用的到
今天就來分享一下在 flash AS3 裡如何寫呢
假設要取 0 - 9 亂數不重複的3個數字
奶小茶我使用的方法是
1.先建立 0 - 9 的 Array 共 10 個元素
2.亂數排序(參考下方的 shuffle)
3.每次取出 Array 的第一個元素(或最後一個元素, 反正都已經亂排了), 並移除
4.重複第三個Step, 就完成啦。


var _array:Array = []
for (var i:int = pMin; i < 10; i++) {
    _array.push(i);
}
_array = shuffle(_array);

// 做三次 pop(), 取出 Array 最後的一個值, 並移掉他
_array.pop();
_array.pop();
_array.pop();
// 最後 Array 就只剩 7 個元素了。
function shuffle(pArr:Array):Array { 
 var _cloneArr :Array = pArr;
 var _l  :uint = _cloneArr.length;
 var _t  :*; 
 var _r  :int
 while(_l--){
  _r = Math.floor(Math.random() * (_l + 1));        
  _t = _cloneArr[_l];    
  _cloneArr[_l] = _cloneArr[_r];
  _cloneArr[_r] = _t;
 }
 return _cloneArr;
}
感謝 Ticore 提醒
PS. 奶綠,文章標題有錯別字 "重複" -> "重覆"
打錯字, 扣五分

米蘭數位祝大家新年快樂

三歲以上,請由兒童陪同進入。
派對內有瘋狂舉動,請衛道人士慎入。
米蘭數位提醒您〔歡樂過量,有益健康〕

http://newyear2011.medialand.com.tw/









這次專案奶小茶我主要是負責錄音的部份
使用 Flash Player 10.1 新的 Microphone, SampleData 事件來錄音
配合 ByteArray.org 提供的 WAVEncoder , 轉存成 wav 檔,然後再使用 MP3 Encoder
轉成 mp3格式
因為考量到之後在混音播放時的參數, 所以我是把原音的聲音檔存下來,之後在播放時
一樣使用 SampleData 來做混音的功能, 這次使用了加速播放和增加 delay

2011年1月1日 星期六

Android LinearLayout

大家好, 我是奶綠茶
LinearLayout:
子元素依序排成一列(或是一行), 就像是 Flex 裡的 HBox(或VBox)
我們在一個 LinearLayout (horizontal)裡,放置三個 Button , 其寬、高皆為 wrap_content
語法:
<LinearLayout
  android:orientation="horizontal"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:background="#ff0000" >        
   <Button
     android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="A_btn"          
        />
        <Button
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"         
         android:text="B_btn" 
        />
        <Button
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:text="C_btn" 
        />
</LinearLayout> 
結果:




如果現在想要讓三個 Button 能夠自動置滿整個 LinearLayout 寬度的話
可以使用 android:layout_weight 屬性, 指的就是"重要度"

layout_weight 屬性 在 LinearLyaout 和該子物件裡, 會有二種不同的結果
先看比較好瞭解的部份, layout_weight 寫在子物件裡

件條:當子物件的 layout_width="wrap_content" 時 (android:orientation="horizontal")
設定三個 Button 的 weight 值
A_btn weight = 2
B_btn weight = 1
C_btn weight = 0 (default value)

這樣指的意思就是
三個 Button 先依自已的寬度排好, 如上圖片所示
結果依剩下的空間, 來做分配
A_btn weight 為 2 , 較為重要, 所以分到剩下空間的 2/3
B_btn weight 為 1 , 分到剩下空間的 1 /3
C_btn weight 為 0 , 所以寬度不變
結論就是 weight 為大, 重要度也越大
修正一下 xml layout
<LinearLayout
  android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="#ff0000" >
        
        <Button
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_weight="2"
         android:text="A_btn"          
        />
        <Button
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_weight="1"         
         android:text="B_btn" 
        />
        <Button
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:text="C_btn" 
        />
     </LinearLayout> 
結果




第二種情況
layout_weight 寫在 LinearLayout
假設現在有二個 LinearLayout 分邊叫 R , G
<LinearLayout
 android:orientation="horizontal"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 android:background="#ff0000" >
 <Button
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_weight="2"
  android:text="A_btn"          
 />
 <Button
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_weight="1"         
  android:text="B_btn" 
 />
 <Button
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="C_btn" 
 />
</LinearLayout>  



<LinearLayout
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 android:background="#00ff00" >
 <EditText 
        android:text="abcx" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content"
        android:layout_weight="1" />
    <TextView 
        android:text="13456" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content"
        android:layout_weight="1" />
</LinearLayout> 
結果, 你會看到只有紅色的 LinearLayout
因寫他怖滿了整個 layout




加入 weight 屬性
R LinearLayout weight = 2
G LinearLayout weight = 1
結果是
畫面的 2/3 分給 weight 為1 的 G
畫面的 1/3 分給 weight 為2 的 R
剛好倒過來
結論就是 weight 越大, 比重越小
<LinearLayout
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_weight="2"
    android:background="#ff0000" >

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="2"
        android:text="A_btn"          
 />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"         
        android:text="B_btn" 
 />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="C_btn" 
        />
</LinearLayout>  
<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_weight="1"
    android:background="#00ff00" >
    <EditText 
        android:text="abcx" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content"
        android:layout_weight="1" />
    <TextView 
        android:text="13456" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content"
        android:layout_weight="1" />
</LinearLayout>