2012-03-26 167 views
2

我想寫一個白板應用程序。我有一個開始渲染位圖(繪圖頁),然後將該位圖複製到surfaceView。它在模擬器中完美工作,但是當我在Samsung Galaxy Ace上運行它時,它意外關閉。此代碼:canvas.setBitmap(位圖)在模擬器中工作,但不在電話上

public void surfaceCreated(SurfaceHolder holder) { 
Log.d(TAG, "Create surface");   
mo_paper = BitmapFactory.decodeResource(getResources(), R.drawable.paper); 
Log.d(TAG, "Created paper");    
mo_easel = new Canvas();  
Log.d(TAG, "Created easel");    
mo_easel.setBitmap(mo_paper); 
Log.d(TAG, "Set easel");    
mo_matrix = new Matrix(); 
Log.d(TAG, "Assets loaded");    
mainThread.setRunning(true); 
mainThread.start(); 
Log.d(TAG, "Threads started");   
} 

輸出「創建畫架」而非「設置畫架」,所以它出現在.setBitmap()方法導致錯誤。

+0

畫有什麼錯誤完全在ddms/logcat中? – Peterdk 2012-03-26 21:59:37

+0

另外,位圖有多大(以像素爲單位)? – antlersoft 2012-03-26 22:00:16

+0

@Peterdk - logcat只是炸彈。我不明白如何使用DDMS! ;) – 2012-03-27 09:04:35

回答

0

從資源加載的位圖是不可變的。您需要傳遞一個BitmapFactory.Options來告訴BitmapFactory您希望得到的位圖是不可變的。

+0

好吧。我已經追蹤了一遍,發現在模擬器中,位圖被加載爲可變的,但在手機上卻不是。該應用程序也適用於HTC Desire-Z,因此它似乎是操作系統的差異。我應該說我在手機和模擬器API級別10上運行2.3.3。 但是,我找不到如何將位圖設置爲inMutable ...檢查文檔,我發現inMutable是API 11以上版本。谷歌搜索建議我需要編寫一個方法來轉換位圖,像這樣 - http://sudarnimalan.blogspot.co.uk/2011/09/android-convert-immutable-bitmap-into.html – 2012-03-27 09:09:59

+0

「*產生的位圖是不可變*「應該是」*產生的位圖是* **可變**「? – 2014-09-07 09:31:47

0

羅曼蓋伊是對的。在手機上,位圖被加載爲不可變,但在模擬器和另一部手機中,它被加載爲可變(與文檔相反!)。設置選項inMutable是不可能在11日之前的API,所以在我的情況下,簡單的解決辦法是用

mo_paper = Bitmap.createBitmap(paperWidth, paperHeight, Bitmap.Config.ARGB_8888); 

創建一個空的位圖,只是對任何其他位圖我想

相關問題