2014-03-24 32 views
6

我正在創建一個應用程序,可以在用戶控件下執行繪圖等操作,讓我們保存它。我試圖做到這一點的方式是使用畫布繪製的自定義位圖,然後保存生成的位圖。Canvas.setBitmap UnsupportedException(位圖)

一切都按預期工作,直到調用Canvas.setBitmap(Bitmap)。

我收到以下錯誤消息。這是拋出異常

03-24 13:47:50.741: E/AndroidRuntime(27888): FATAL EXCEPTION: main 
03-24 13:47:50.741: E/AndroidRuntime(27888): Process: example.imageeditor, PID: 27888 
03-24 13:47:50.741: E/AndroidRuntime(27888): java.lang.UnsupportedOperationException 
03-24 13:47:50.741: E/AndroidRuntime(27888): at android.view.HardwareCanvas.setBitmap(HardwareCanvas.java:39) 

代碼:

protected void onDraw(Canvas canvas) { 
    mResultImage=Bitmap.createBitmap(width,height,mOriginalImage.getConfig()); 
    canvas.setBitmap(mResultImage); 
    canvas.save(); 

    if(mOriginalImage!=null) 
     canvas.drawBitmap(mOriginalImage, width, height, paint); 
    else 
     canvas.drawText("Image loading...", width/2f-20, height/2, paint); 

    canvas.drawText(text, x, y-20, paint); 

    canvas.restore(); 
    super.onDraw(canvas); 
} 

的android.view.HardwareCanvas甚至沒有在Android上的參考。但是我能夠找到關於它的一些信息。 看來它的setBitmap(Bitmap)還沒有被寫入,沒關係。

我的問題是爲什麼onDraw(Canvas)返回一個HardwareCanvas類?它甚至不是Canvas的超級類。

紅利問題:任何方式?

回答

5

如果你想繪製一個位圖,你應該創建一個新的Canvas將位圖傳遞給它。你不應該被允許改變你的視圖應該被繪製的畫布的目標。 因此,只需使用位圖創建一個新畫布,然後在onDraw方法中在畫布上繪製所得到的位圖。

+0

那麼這回答我的獎金問題。但是,如果我們不應該使用它,爲什麼我們有這種方法呢?此外,它不會被廢棄,也不會在參考文獻中有任何警告。 無論如何,謝謝你的答案。 – torque203

+0

如果您嘗試修改自己創建的畫布,該方法應該完全可以。嘗試想象你在那裏想要做什麼。您具有視圖的畫布,這是您的視圖用於在屏幕上呈現自己的畫布,並且您正試圖使該畫布在位圖上繪製。這將打破應該在同一個畫布上繪製的所有其他視圖。很清楚,它不能正常工作? –

+0

在閱讀文檔並確定setBitmap設置了Canvas的內部繪圖緩衝區之後,我也遇到了UnsupportedOperationException,您可以使用它。事實並非如此,您必須創建一個額外的Canvas,但文檔中沒有足夠的警告。 – comodoro