2012-03-26 164 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); 

创建一个空的位图,只是对任何其他位图我想

相关问题