2014-03-24 7 views
6

Ich erstelle eine App, die Zeichnungen und dergleichen unter den Benutzern Kontrolle und lassen Sie sie speichern. Ich versuche dies zu erreichen, indem ich ein benutzerdefiniertes Bitmap verwende, auf dem das Canvas gezeichnet wird, und dann die resultierende Bitmap speichern.UnsupportedException von Canvas.setBitmap (Bitmap)

Alles funktioniert wie erwartet, bis Canvas.setBitmap (Bitmap) aufgerufen wird.

Ich bekomme den folgenden Fehler.

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) 

-Code, der die Ausnahme wirft:

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); 
} 

Die android.view.HardwareCanvas ist nicht einmal auf der Referenz von Android. Aber ich konnte einige Informationen darüber finden. Es scheint, dass es SetBitmap (Bitmap) ist noch nicht geschrieben, und das ist in Ordnung.

Meine Frage ist, warum die OnDraw (Canvas) eine HardwareCanvas-Klasse zurückgibt? Es ist nicht einmal eine super Klasse für Canvas.

Bonus Frage: Irgendwo in der Nähe?

Antwort

5

Wenn Sie auf einer Bitmap zeichnen möchten, sollten Sie ein neues Canvas erstellen, das die Bitmap an sie übergibt. Sie sollten das Ziel der Arbeitsfläche, auf der Ihre Ansicht gezeichnet werden soll, nicht ändern dürfen. Erstellen Sie einfach eine neue Zeichenfläche mit der Bitmap und zeichnen Sie dann die resultierende Bitmap auf der Zeichenfläche in der onDraw-Methode.

+0

Nun, das beantwortet meine Bonusfrage. Aber warum haben wir diese Methode, wenn wir sie nicht benutzen sollen? Es ist auch nicht veraltet und enthält keine Warnungen in der Referenz. Wie auch immer, danke für die Antwort. – torque203

+0

Diese Methode sollte völlig in Ordnung sein, wenn Sie versuchen, ein von Ihnen selbst erstelltes Zeichenfeld zu ändern. Versuchen Sie sich vorzustellen, was Sie dort versuchen wollen. Sie verfügen über die Zeichenfläche der Ansicht, bei der es sich um die Zeichenfläche handelt, mit der sie sich auf dem Bildschirm darstellen, und Sie versuchen, diese Zeichenfläche stattdessen auf einer Bitmap zu zeichnen. Das würde alle anderen Ansichten zerstören, die auf der gleichen Leinwand gezeichnet werden sollen. Ziemlich klar, es könnte nicht funktionieren, oder? –

+0

Ich habe auch die UnsupportedOperationException ausgeführt, nachdem ich die Dokumentation gelesen und festgestellt habe, dass setBitmap den internen Zeichenpuffer des Canvas-Bereichs festlegt, mit dem Sie dann arbeiten können. Es ist nicht so und Sie müssen einen zusätzlichen Canvas erstellen, aber es gibt keine ausreichende Warnung im Dokument. – comodoro