完成一個 Android App - Puzzle,類似拼圖,但是不太像。
一開始先載入 Lena 的圖片~
再對圖片作切割~
一格一格的格子可以弄亂~ 可以手動點選,也可以點選按鈕,以亂數自動弄亂~
再弄亂~
完成這個遊戲的目標,就是移動格子,把圖片恢復成未弄亂之前的狀態。
以下介紹在寫這個 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
這邊插播,如果是 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"/>
留言列表