canvas.setBitmap(位图)在模拟器中工作,但在手机上不起作用

时间:2012-03-26 21:57:19

标签: android bitmap android-canvas

我想写一个白板应用程序。我有一个开始渲染位图(绘图页面),然后将该位图复制到surfaceView。它在模拟器中运行得很好,但是当我在我的三星Galaxy Ace上运行时,它意外地关闭了。这段代码:

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()方法会导致错误。

2 个答案:

答案 0 :(得分:0)

从资源加载的位图是不可变的。您需要传递一个BitmapFactory.Options,告诉BitmapFactory您希望生成的位图是不可变的。

答案 1 :(得分:0)

罗曼盖伊是对的。在手机上,位图被加载为不可变,但在模拟器和另一部手机上,它被加载为可变(与文档相反!)。在11之前的API上设置选项inMutable是不可能的,所以在我的例子中,简单的解决方案是使用

创建一个空位图
    mo_paper = Bitmap.createBitmap(paperWidth, paperHeight, Bitmap.Config.ARGB_8888);   

只需绘制我想要的其他位图