我想将画布转换为图像并将其保存在设备上。但是当我将位图设置为画布时,我得到错误java.lang.UnsupportedOperationException
。
我的完整代码:
public class SingleTouchEventView extends View {
private Paint paint = new Paint();
private Path path = new Path();
public SingleTouchEventView(Context context, AttributeSet attrs) {
super(context, attrs);
paint.setAntiAlias(true);
paint.setStrokeWidth(6f);
paint.setColor(Color.WHITE);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeJoin(Paint.Join.BEVEL);
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawPath(path, paint);
canvas.drawCircle(50, 50, 3, paint);
Bitmap bitmap = Bitmap.createBitmap(canvas.getWidth(), canvas.getHeight(), Bitmap.Config.ARGB_8888);
canvas.setBitmap(bitmap);
try {
File file = new File(Environment.getExternalStorageDirectory() + "/image.jpg");
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, new FileOutputStream(file));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
也许有人可以帮我解决这个问题?
答案 0 :(得分:6)
这不是你如何绘制位图。您不使用绘制到屏幕的画布。您创建第二个画布,将要绘制的位图作为参数传递给构造函数。然后,该画布的任何绘制命令都将绘制位图。然后将该位图绘制到屏幕上。像这样:
Canvas myCanvas = new Canvas(myBitmap);
myCanvas.drawLine();
myCanvas.drawCircle();
//Insert all the rest of the drawing commands here
screenCanvas.drawBitmap(myBitmap, 0, 0);
我也不会把它写入onDraw中的文件系统 - 如果你这样做,我会期望绘图性能受到严重影响。单独的函数调用可以做到这一点。如果你在变量中保留myBitmap
,你可以随时压缩它以写出最后一次绘制到磁盘。