程式功能 :
模擬一個 CandyBox (糖果盒),裡面放了 100 顆糖果,然後由 13 個 kid (小孩) 隨意抓取,每次抓取的糖果數量為 5 ~ 10 顆不等 (以亂數決定),每個小孩抓取的次數不限,直到糖果盒裡面的糖果被取完為止,最後再以文字的方式將各個數據結果呈現在螢幕上。
◎此範例主要是模擬多個執行緒共同取用一個固定值的程式架構示範,並沒有穿插精彩的圖片動畫作為輔助說明。
2013-04-24
2013-02-25
動態物件的產生與捕捉
有段時間沒有 PO 文了 ~ 漫長的學習過程常會有望不到終點的感覺,能持續支撐下去的原因大概就是那股澆不熄的熱情吧 ! 不知您是否與我一樣 ? ^_^
如果要開發動態遊戲類別的 Apps,勢必要運用不少動態圖片,雖然 ImageView 元件已經內建了一些特效,使用起來也很方便,但是 ~ 若程式於執行期間需在極短的時序中處理較多圖片時,在速度與互動的表現上可能會不如預期,因此還是建議您使用 SurfaceView 類別比較妥當。
如果要開發動態遊戲類別的 Apps,勢必要運用不少動態圖片,雖然 ImageView 元件已經內建了一些特效,使用起來也很方便,但是 ~ 若程式於執行期間需在極短的時序中處理較多圖片時,在速度與互動的表現上可能會不如預期,因此還是建議您使用 SurfaceView 類別比較妥當。
2012-09-28
Android 小程式 : Activity 之間的資料傳遞
當應用程式需要將資料由一個 Activity 傳送給另一個 Activity 時,該怎麼做呢 ? 我藉由下面這個『定點 PO 圖』的小程式來示範並稍微解說一下。假設這個專案 (Project) 的名稱為 : Practice2
程式功能 :
在主畫面的兩個 EditText 欄位中分別輸入座標值 X 與 Y,按『執行』鈕後,將預設的小圖示顯示在指定的座標位置上。
程式功能 :
在主畫面的兩個 EditText 欄位中分別輸入座標值 X 與 Y,按『執行』鈕後,將預設的小圖示顯示在指定的座標位置上。
2012-09-14
Android 小程式 : 模擬物件的生命週期
這是格友 LAI 在 模擬拖曳小圖示的 Android 程式 這篇中所提出的一個問題 :
『想請問~ 如果我要在觸控一點座標時,顯示一張小圖 然後過幾秒消失
我該怎麼修改程式??』
剛好為我提供了一個練習的機會 ^_^
時間已晚,加上最近又很忙 ~ 我先把程式碼 po 上,有興趣者請自行 copy 程式碼。詳細的解說就待我有空時再來補上。
『想請問~ 如果我要在觸控一點座標時,顯示一張小圖 然後過幾秒消失
我該怎麼修改程式??』
剛好為我提供了一個練習的機會 ^_^
時間已晚,加上最近又很忙 ~ 我先把程式碼 po 上,有興趣者請自行 copy 程式碼。詳細的解說就待我有空時再來補上。
2012-07-02
2012-06-27
spider-web 白色(藍色?)蜘蛛網 XD
幾天前在遮雨棚下方發現一個直徑約 40 公分的蜘蛛網,好幾次見它殘破不堪,破損原因也可能是捕到獵物所致,隔天它便完好如初,編織者又安穩地盤踞網中央,等待獵物上門。直到泰利颱風來襲 ...
2012-06-24
Android 小程式 : 幾何圖形
突然心血來潮~寫了一個小程式來繪製幾何圖形,靈感來自之前筆記裡的一道習題~記得以前上數學課的時候,我老是在打瞌睡,所以數學成績常常不及格 XD
如今透過電腦程式的運算,才發現幾何圖形如此的美麗 ^_^
不聊過去的事了~來欣賞美圖吧!
如今透過電腦程式的運算,才發現幾何圖形如此的美麗 ^_^
不聊過去的事了~來欣賞美圖吧!
2012-05-09
模擬拖曳小圖示的 Android 程式
這是我自己出給自己做的練習題之一 ! 此程式只是一個小功能的試作, 並不是一個完整的應用程式, 會把程式碼貼出來僅是提供給有興趣者做參考而已.
主要功能 :
可以用滑鼠隨意拖曳螢幕上的小圖示; 若是在手機上, 則可以用手指拖曳.
操作方式 : (以模擬器為例)
以滑鼠左鍵按住小圖示不放, 再移動滑鼠軌跡拖曳小圖示, 放開滑鼠左鍵後, 小圖示則會停留在新的位置上.
程式技巧重點 :
當按住小圖示的任何一個座標位置時, 程式會即時記下被按住的座標點位置, 即使在拖曳的過程中, 圖示本身不斷變動的座標仍會與被按住的座標點保持相對的距離, 讓整個拖曳過程極為流暢自然 ! 我刻意在螢幕上標出各變數的值, 方便在拖曳時觀察各變數的數值變化.
螢幕上的各變數值解說 :
Tx 與 Ty : 當你按下小圖示時, 對應於整個螢幕的實際座標.
takerect(Left,Top) : 小圖示的左上角對應於整個螢幕的實際座標.
chk : 小圖示被按住的時候為 true, 否則為 false.
tempX,Y : 小圖示左上角座標值 與 被按住的座標點 兩者間的差距數值; 其實就是 tempX = Tx - takerect(Left), tempY = Ty - takerect(Top)
程式碼如下 :
// 主程式
public class practise1 extends Activity {
/** Called when the activity is first created. */
TakeView takeView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
takeView = new TakeView(this);
setContentView(takeView);
}
}
===========================================
// 另一個類別
public class TakeView extends SurfaceView implements SurfaceHolder.Callback {
SurfaceHolder holder;
Bitmap takebp;
Paint paint;
Rect takerect; //矩形容器
int x,y;
ShowThread st;
int touchX=0,touchY=0;
boolean chk = false;
int tempwidth=0;
int tempheight=0;
//constructor
public TakeView(practise1 context) {
super(context);
// TODO Auto-generated constructor stub
getHolder().addCallback(this);
takebp = BitmapFactory.decodeResource(getResources(), R.drawable.icon);
//指定矩形容器的大小等於圖片takebp的大小
takerect = new Rect(x,y,takebp.getWidth(),takebp.getHeight());
holder = getHolder();
st = new ShowThread();
paint = new Paint();
paint.setColor(Color.WHITE);
paint.setTextSize(20);
}
public void DoDraw(Canvas canvas) {
canvas.drawColor(Color.BLACK);
canvas.drawBitmap(takebp, x, y, null);
canvas.drawText("Tx = " + touchX + " Ty = " + touchY ,20, 100, paint);
canvas.drawText("takerect(Left,Top):" + takerect.left + "," + takerect.top , 20, 150, paint);
canvas.drawText("chk : " + chk, 20, 200, paint);
canvas.drawText("tempX,Y : " + tempwidth + "," + tempheight, 10, 250, paint);
}
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN &&
takerect.contains((int)event.getX(),(int)event.getY())) {
touchX = (int)event.getX();
touchY = (int)event.getY();
tempwidth = touchX - x;
tempheight = touchY -y;
chk = true;
}
else if ( (event.getAction() == MotionEvent.ACTION_MOVE) && chk) {
touchX = (int)event.getX();
touchY = (int)event.getY();
//讓點擊的座標成為圖片的中心點
//takebp.getWidth()/2;
//takebp.getHeight()/2;
x = touchX - tempwidth;
y = touchY - tempheight;
takerect.offsetTo(x, y);
}
else if (event.getAction() == MotionEvent.ACTION_UP) {
chk = false;
}
return true;
}
public class ShowThread extends Thread {
Canvas canvas;
boolean flag = false;
int span = 20;
//constructor
public ShowThread() {
flag = true;
}
public void run() {
while(flag) {
try {
synchronized(holder) {
canvas = holder.lockCanvas();
DoDraw(canvas);
holder.unlockCanvasAndPost(canvas);
Thread.sleep(span);
}
} catch (Exception e) { e.printStackTrace(); }
}
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
st.start();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
st.interrupt();
}
}
主要功能 :
可以用滑鼠隨意拖曳螢幕上的小圖示; 若是在手機上, 則可以用手指拖曳.
操作方式 : (以模擬器為例)
以滑鼠左鍵按住小圖示不放, 再移動滑鼠軌跡拖曳小圖示, 放開滑鼠左鍵後, 小圖示則會停留在新的位置上.
程式技巧重點 :
當按住小圖示的任何一個座標位置時, 程式會即時記下被按住的座標點位置, 即使在拖曳的過程中, 圖示本身不斷變動的座標仍會與被按住的座標點保持相對的距離, 讓整個拖曳過程極為流暢自然 ! 我刻意在螢幕上標出各變數的值, 方便在拖曳時觀察各變數的數值變化.
螢幕上的各變數值解說 :
Tx 與 Ty : 當你按下小圖示時, 對應於整個螢幕的實際座標.
takerect(Left,Top) : 小圖示的左上角對應於整個螢幕的實際座標.
chk : 小圖示被按住的時候為 true, 否則為 false.
tempX,Y : 小圖示左上角座標值 與 被按住的座標點 兩者間的差距數值; 其實就是 tempX = Tx - takerect(Left), tempY = Ty - takerect(Top)
| [ 拖曳功能 ] 常被普遍運用在視窗作業環境中 |
程式碼如下 :
// 主程式
public class practise1 extends Activity {
/** Called when the activity is first created. */
TakeView takeView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
takeView = new TakeView(this);
setContentView(takeView);
}
}
===========================================
// 另一個類別
public class TakeView extends SurfaceView implements SurfaceHolder.Callback {
SurfaceHolder holder;
Bitmap takebp;
Paint paint;
Rect takerect; //矩形容器
int x,y;
ShowThread st;
int touchX=0,touchY=0;
boolean chk = false;
int tempwidth=0;
int tempheight=0;
//constructor
public TakeView(practise1 context) {
super(context);
// TODO Auto-generated constructor stub
getHolder().addCallback(this);
takebp = BitmapFactory.decodeResource(getResources(), R.drawable.icon);
//指定矩形容器的大小等於圖片takebp的大小
takerect = new Rect(x,y,takebp.getWidth(),takebp.getHeight());
holder = getHolder();
st = new ShowThread();
paint = new Paint();
paint.setColor(Color.WHITE);
paint.setTextSize(20);
}
public void DoDraw(Canvas canvas) {
canvas.drawColor(Color.BLACK);
canvas.drawBitmap(takebp, x, y, null);
canvas.drawText("Tx = " + touchX + " Ty = " + touchY ,20, 100, paint);
canvas.drawText("takerect(Left,Top):" + takerect.left + "," + takerect.top , 20, 150, paint);
canvas.drawText("chk : " + chk, 20, 200, paint);
canvas.drawText("tempX,Y : " + tempwidth + "," + tempheight, 10, 250, paint);
}
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN &&
takerect.contains((int)event.getX(),(int)event.getY())) {
touchX = (int)event.getX();
touchY = (int)event.getY();
tempwidth = touchX - x;
tempheight = touchY -y;
chk = true;
}
else if ( (event.getAction() == MotionEvent.ACTION_MOVE) && chk) {
touchX = (int)event.getX();
touchY = (int)event.getY();
//讓點擊的座標成為圖片的中心點
//takebp.getWidth()/2;
//takebp.getHeight()/2;
x = touchX - tempwidth;
y = touchY - tempheight;
takerect.offsetTo(x, y);
}
else if (event.getAction() == MotionEvent.ACTION_UP) {
chk = false;
}
return true;
}
public class ShowThread extends Thread {
Canvas canvas;
boolean flag = false;
int span = 20;
//constructor
public ShowThread() {
flag = true;
}
public void run() {
while(flag) {
try {
synchronized(holder) {
canvas = holder.lockCanvas();
DoDraw(canvas);
holder.unlockCanvasAndPost(canvas);
Thread.sleep(span);
}
} catch (Exception e) { e.printStackTrace(); }
}
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
st.start();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
st.interrupt();
}
}
2012-03-01
Android 小程式 : 亂數與氣泡排序法
這一次我要挑戰用 Android 模擬器來完成以下的功能 :
以亂數產生10 組號碼 (0 ~ 99), 然後利用氣泡排序法以及降幕方式排列將結果顯示出來 !
運作原理 :
亂數產生的部分我使用 Math.random() 內建函數, 它會產生 0.0 ~ 0.1 的值, 由於其型態為 double, 我將它轉換型態成為 int 後, 讓它以整數型態呈現, 按下 [ 開始 ] 按鈕後產生 10 組亂數, 並同時進行排序, 程式中我用氣泡排序法, 讓數值由小到大排列.
程式碼如下 :
import ... (略)
public class RndAndSort extends Activity {
/** Called when the activity is first created. */
int[] sort = new int[10];
int rnd;
String st,temp;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final TextView textView1=(TextView)findViewById(R.id.textView1);
final TextView textView2=(TextView)findViewById(R.id.textView2);
final Button button1=(Button)findViewById(R.id.button1);
button1.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
st = ""; temp = "";
for (int i=0; i<10; i++) {
rnd = (int)(Math.random() * 100);
sort[i] = rnd;
temp = String.valueOf(rnd);
st += (temp + ", ");
}
textView1.setText(st);
for (int i=0; i<9; i++)
for (int j=i+1; j<10; j++)
// 改變下式中的大、小於符號可變更排列順序
// < 由大到小, > 為小到大排列
if(sort[i]>sort[j])
{
int tempNum;
tempNum=sort[i];
sort[i]=sort[j];
sort[j]=tempNum;
}
st = "";
for (int i=0; i<10; i++)
st += (String.valueOf(sort[i]) + ", ");
textView2.setText(st);
}
});
}
}
以亂數產生10 組號碼 (0 ~ 99), 然後利用氣泡排序法以及降幕方式排列將結果顯示出來 !
運作原理 :
亂數產生的部分我使用 Math.random() 內建函數, 它會產生 0.0 ~ 0.1 的值, 由於其型態為 double, 我將它轉換型態成為 int 後, 讓它以整數型態呈現, 按下 [ 開始 ] 按鈕後產生 10 組亂數, 並同時進行排序, 程式中我用氣泡排序法, 讓數值由小到大排列.
![]() |
| 第一次執行的畫面 |
![]() |
| 按下開始鈕後的執行畫面 |
程式碼如下 :
import ... (略)
public class RndAndSort extends Activity {
/** Called when the activity is first created. */
int[] sort = new int[10];
int rnd;
String st,temp;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final TextView textView1=(TextView)findViewById(R.id.textView1);
final TextView textView2=(TextView)findViewById(R.id.textView2);
final Button button1=(Button)findViewById(R.id.button1);
button1.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
st = ""; temp = "";
for (int i=0; i<10; i++) {
rnd = (int)(Math.random() * 100);
sort[i] = rnd;
temp = String.valueOf(rnd);
st += (temp + ", ");
}
textView1.setText(st);
for (int i=0; i<9; i++)
for (int j=i+1; j<10; j++)
// 改變下式中的大、小於符號可變更排列順序
// < 由大到小, > 為小到大排列
if(sort[i]>sort[j])
{
int tempNum;
tempNum=sort[i];
sort[i]=sort[j];
sort[j]=tempNum;
}
st = "";
for (int i=0; i<10; i++)
st += (String.valueOf(sort[i]) + ", ");
textView2.setText(st);
}
});
}
}
2012-02-28
Android 小程式 : 十進位數轉成十六進位
這次我用 Android 模擬器寫了一個 10 進位轉換成 16 進位的小程式.
先介紹何謂十六進位, 即 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
十進位數值從 10 到 15 的數值相對於十六進位的 A ~ F
A = 10; B = 11; C = 12; D = 13; E = 14; F = 15
運作原理 :
將輸入的十進位數值在迴圈中反覆進行除以 16 的動作, 並取其餘數放入字串陣列 ba [] 中, 最後再將陣列中的元素倒置過來顯示就可得到答案囉 !
程式碼如下 :
import ... (此處略)
public class BtoD extends Activity {
/** Called when the activity is first created. */
int num,i;
String[] ba = new String[64];
String su;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final EditText editText1 = (EditText)findViewById(R.id.editText1);
final TextView textView3 = (TextView)findViewById(R.id.textView3);
final Button button1= (Button)findViewById(R.id.button1);
button1.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
i = 0; su = "";
num = Integer.parseInt(editText1.getText().toString());
while ( num > 15 )
{
int temp = num % 16;
checkNum(temp);
i++;
num = num / 16;
}
checkNum(num);
for ( int j = i; j >= 0; j-- )
su += ba[j];
textView3.setText(su);
}
});
}
// 此函式檢查 10 ~ 15 所對應的 16 進位表示法
private void checkNum(int cn) {
if ( cn > 9 )
{
if (cn == 10) ba[i] = "A";
else if (cn == 11) ba[i] = "B";
else if (cn == 12) ba[i] = "C";
else if (cn == 13) ba[i] = "D";
else if (cn == 14) ba[i] = "E";
else if (cn == 15) ba[i] = "F";
}
else
ba[i] = String.valueOf(cn);
}
}
我在程式中設置了一個 checkNum() 函式, 用來判斷十進位數值 10 ~ 15 所對應的 A ~ F 字母 .^_^.
先介紹何謂十六進位, 即 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
十進位數值從 10 到 15 的數值相對於十六進位的 A ~ F
A = 10; B = 11; C = 12; D = 13; E = 14; F = 15
運作原理 :
將輸入的十進位數值在迴圈中反覆進行除以 16 的動作, 並取其餘數放入字串陣列 ba [] 中, 最後再將陣列中的元素倒置過來顯示就可得到答案囉 !
5629 轉成十六進位得出 15FD
65535 轉成十六進位得出 FFFF
搞程式設計的人對 65535 應該很熟才對 ^_^
程式碼如下 :
import ... (此處略)
public class BtoD extends Activity {
/** Called when the activity is first created. */
int num,i;
String[] ba = new String[64];
String su;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final EditText editText1 = (EditText)findViewById(R.id.editText1);
final TextView textView3 = (TextView)findViewById(R.id.textView3);
final Button button1= (Button)findViewById(R.id.button1);
button1.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
i = 0; su = "";
num = Integer.parseInt(editText1.getText().toString());
while ( num > 15 )
{
int temp = num % 16;
checkNum(temp);
i++;
num = num / 16;
}
checkNum(num);
for ( int j = i; j >= 0; j-- )
su += ba[j];
textView3.setText(su);
}
});
}
// 此函式檢查 10 ~ 15 所對應的 16 進位表示法
private void checkNum(int cn) {
if ( cn > 9 )
{
if (cn == 10) ba[i] = "A";
else if (cn == 11) ba[i] = "B";
else if (cn == 12) ba[i] = "C";
else if (cn == 13) ba[i] = "D";
else if (cn == 14) ba[i] = "E";
else if (cn == 15) ba[i] = "F";
}
else
ba[i] = String.valueOf(cn);
}
}
我在程式中設置了一個 checkNum() 函式, 用來判斷十進位數值 10 ~ 15 所對應的 A ~ F 字母 .^_^.
Android 小程式 : 十進位數轉成二進位
我用 Android 模擬器做了一個 10 進位數值轉換成 2 進位的小程式 :
運作原理 :
程式中, 我將輸入的 10 進位數值以迴圈方式不斷用 2 去除, 每除一次所得的餘數 (為 0 或 1) 依序存入陣列中, 最後再用迴圈把陣列內容以倒置的方式取出, 便可得出答案.
程式碼如下 :
package a.b.c;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class BtoD extends Activity {
/** Called when the activity is first created. */
int s,i;
int[] ba = new int[64];
String su;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final EditText editText1 = (EditText)findViewById(R.id.editText1);
final TextView textView3 = (TextView)findViewById(R.id.textView3);
final Button button1= (Button)findViewById(R.id.button1);
button1.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
i = 0; su = "";
s = Integer.parseInt(editText1.getText().toString());
while (s > 1)
{
ba[i] = s % 2;
i++ ;
s = s/2;
}
if(s==1 || s==0)
ba[i] = s;
for(int j=i;j>=0;j--)
su += String.valueOf(ba[j]);
textView3.setText(su);
}
});
}
}
整個程式功能過於簡單 ~ 若上傳到 Android Market 會 ... 被笑啊 ! 我只把它當做練習而已 .^_^.
運作原理 :
程式中, 我將輸入的 10 進位數值以迴圈方式不斷用 2 去除, 每除一次所得的餘數 (為 0 或 1) 依序存入陣列中, 最後再用迴圈把陣列內容以倒置的方式取出, 便可得出答案.
程式碼如下 :
package a.b.c;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class BtoD extends Activity {
/** Called when the activity is first created. */
int s,i;
int[] ba = new int[64];
String su;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final EditText editText1 = (EditText)findViewById(R.id.editText1);
final TextView textView3 = (TextView)findViewById(R.id.textView3);
final Button button1= (Button)findViewById(R.id.button1);
button1.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
i = 0; su = "";
s = Integer.parseInt(editText1.getText().toString());
while (s > 1)
{
ba[i] = s % 2;
i++ ;
s = s/2;
}
if(s==1 || s==0)
ba[i] = s;
for(int j=i;j>=0;j--)
su += String.valueOf(ba[j]);
textView3.setText(su);
}
});
}
}
整個程式功能過於簡單 ~ 若上傳到 Android Market 會 ... 被笑啊 ! 我只把它當做練習而已 .^_^.
訂閱:
文章 (Atom)


