Canvas.setBitmap(Bitmap)引发UnsupportedException异常

8
我正在创建一个应用程序,可以在用户控制下进行绘图等操作,并让他们保存。我尝试实现这一点的方式是使用自定义位图,在其上绘制画布,然后保存生成的位图。
一切都按预期工作,直到调用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在安卓文档中甚至都没有被提及。但是我找到了一些关于它的信息。

看起来它的setBitmap(Bitmap)方法还没有被编写,这没问题。

我的问题是为什么onDraw(Canvas)返回一个HardwareCanvas类?它甚至不是Canvas的父类。

额外问题:有什么解决方法吗?

1个回答

7
如果您想在位图上绘制,应该创建一个新的Canvas并将位图传递给它。您不应该被允许更改画布的目标,即您的视图应该绘制在其上的画布。因此,只需使用位图创建新的画布,然后在onDraw方法中绘制生成的位图即可。

1
这回答了我的奖励问题。但是如果我们不应该使用它,为什么会有这个方法呢?此外,在参考文献中它既没有被弃用也没有任何警告。 无论如何,感谢您的答案。 - Gent Ahmeti
如果您尝试修改自己创建的画布,那么该方法应该完全可行。试着想象一下您正在尝试做什么。您拥有视图的画布,这是视图用于在屏幕上呈现自身的画布,并且您正在尝试使该画布绘制到位图上。这将破坏所有其他应该在同一画布上绘制的视图。很明显,它不能正常工作,对吧? - Pasquale Anatriello
1
我也遇到了UnsupportedOperationException,阅读文档后确定setBitmap设置了Canvas的内部绘图缓冲区,然后您可以使用它。但实际上并非如此,您必须创建额外的Canvas,但文档中没有足够的警告。 - comodoro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接