Android 配對記憶遊戲 解說
完整範例 在此
範例0:畫面佈局(Layout)
圖形
程式圖示: AndroidManifest.xml 中 application 的 android:icon="@drawable/icon" 為程式的圖示
程式所需要的圖示:將所需要的圖示,複製到 res/drawable 目錄下 (不同解析度)
畫面佈局(Layout) res/layout/main.xml
包含有 TextView(未來更改為Chronometer) 與 TableLayout
- TableLayout: 表格式佈局
- 包含 TableRow
- 使用 ImageButton 顯示圖形與接受 mouse click
- TableLayout ViewGroup.removeAllViews() remove all child views from the ViewGroup
- 編輯 layout/main.xml, 加入 Layouts 中的 TableLayout, 與 Images & Media 的 ImageButton
自行建立步驟
- 將程式圖形與所需要的圖形複製到 res/drawable 目錄下
- 將 res/layout/main.xml 布置widget: TextView(未來更改為Chronometer) 與 TableLayout
- 在 TableLayout內設定4個TableRow, 每個TableRow內再放4個ImageButton、並選擇適當的圖形
範例1:使用程式建立畫面佈局(Layout)
使用 Java 的 Collections(ArrayList, List) 與 Generics 來儲存陣列
程式邏輯
載入 Resources 內的圖形檔 (Drawable);使用 getResources().getDrawable
取得xml的widget;使用 findViewById
佈局畫面
移除目前所有的Views; 使用 removeAllViews
產生 rowCount 列的 TableRow
每個 TableRow 產生 columeCount 個 ImageButton
每個 ImageButton 放置背景圖形 setBackgroundDrawable
每個 ImageButton 設定唯一的編號 setId
範例2:洗牌與碼表計時
加入洗牌動作,顯示所有的圖片來確認洗牌OK
- 顯示格式:chronometer.setFormat() %s "MM:SS" or "H:MM:SS"
- 經過的時間:chronometer.setBase()
- 開始:chronometer.start()
- 停止:chronometer.stop()
範例:現在時間(Digital Clock):使用 多執行緒
使用 Java Runnable 建立 Thread, 0.1秒喚醒一次
Android架構的UI Widget 無法直接在Thread中更改,Thread中需要送給Handler Message(sendMessage). 由Handler 來處理
Handler 中實作 handleMessage , 更新Widget 狀態
範例:現在時間(Digital Clock):使用 TimerTask
若要定時執行,用TimerTask代替 多執行緒 降低複雜度
使用 scheduleAtFixedRate 來設定執行Delay時間與頻率
範例3:洗牌與碼表計時
加入Class來存放圖形的位置與參考(Reference)
實作 OnClickListener 來處理Button的Click
取得代號
算出位置
翻牌(顯示圖形),判斷是否配對並作適當處理
翻牌(顯示圖形)程式邏輯
顯示該位置的圖形
假如為第1張牌
則將該張牌的位置與圖形存放於 firstCard
否則
假如此張牌與第1張牌相同的位置,則return
否則
則將該張牌的位置與圖形存放於 secondCard
設定 TimerTask 傳送 Message 給 Handler 處理
暫停短暫時間 0.5秒
Handler 將牌再翻面
範例4:洗牌與碼表計時
上述範例中Handler 除了將牌再翻面外,加入判斷兩張牌是否相同,並作適當處理
Toast 顯示短暫訊息後,自動關閉
假如兩張牌相同
將兩張牌設定為 disable, 防止再度被Click
使用 Toast顯示「配對成功!」短暫訊息
配對成功數目加1
假如全部配對完成
建立 Dialog,來恭喜使用者
否則
將兩張牌翻面為面朝下
使用 Toast顯示「配對錯誤」短暫訊息
將 firstCard 與 secondCard 復原為為選取狀態
完整範例:加上Menu選單
範例檔案直接下載點 配對記憶遊戲 下載後解壓縮
Menu 建立: onCreateOptionsMenu()
Menu 被Clcik: onOptionsItemSelected()
程式結束 this.finish()