完成一個 Android App - Puzzle,類似拼圖,但是不太像。

一開始先載入 Lena 的圖片~
Puzzle_Lena_orig

再對圖片作切割~
Puzzle_Lena_blocks

一格一格的格子可以弄亂~ 可以手動點選,也可以點選按鈕,以亂數自動弄亂~
Puzzle_Lena_disarrange_2

再弄亂~
Puzzle_Lena_disarrange_1

完成這個遊戲的目標,就是移動格子,把圖片恢復成未弄亂之前的狀態。




以下介紹在寫這個 App 會需要的技巧及面臨到的問題。



如何載入 Bitmap 圖片?

利用 BitmapFactory.decodeResource() 來 decode .bmp 圖片,接著再呼 Canvas.drawBitmap(),將此 bmp 畫到 Canvas 上,最後呼叫 ImageView.setImageDrawable()。

Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.lena);
Bitmap puzzleBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.RGB_565);
Canvas canvas = new Canvas(puzzleBitmap);
canvas.drawBitmap(bitmap, 0, 0, null);
imageView.setImageDrawable(new BitmapDrawable(getResources(), bitmap));




如何取得亂數?

利用 Random class。

Random rand = new Random();
int x = rand.nextInt(n); // x 為 0 ~ n-1 的亂數




如何讓 app 固定為直立模式,不會跟著手機旋轉?

在 AndroidManifest.xml 中,為該 Activity 加入 "portrait" 的屬性。

<activity
...
android:screenOrientation="portrait">




getLocationOnScreen() 或 getLocationInWindow() 無法成功?

程度不夠好,所以花了很久的時間作白工,才搞清楚,UI 相關的位置,不能在 onCreate() 或 onResume() 中呼叫,因為此時 layout 尚未真得被放置。

解決方式是不要在 onCreate() 或 onResume() 中呼叫,在其它 function 中呼叫,就會回傳正確的值。




自行定義了一個 class,以 array 的方式宣告變數後,發生 error: on a null object reference ?

這是因為 Object 在物件宣告後,尚未實體化,只有得到三個位址空間而已,所以不能直接使用。

解決方式是加上實體化的程式碼,完整如下:

MyClass[] myClass = new MyClass[3]
for(int i=0;i<3;i++) {
    myClass [i] = new MyClass();
}



這邊插播,如果是 C++ 的話,程式碼是長這樣子的:
AClass *classArrayPointer = new AClass[7];   // 宣告,且實體化
…
delete [] classArrayPointer;   // 需手動釋放記憶體



讀取 /sdcard 檔案,過到 System.err: java.io.FileNotFoundException: /storage/emulated/0/xxx.txt: open failed: EACCES (Permission denied)

Permission denied,權限不足。

在 AndroidManifest.xml 增加讀取外部儲存裝置(sdcard)的權限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

arrow
arrow
    全站熱搜

    silverwind1982 發表在 痞客邦 留言(0) 人氣()