我有这个扩展View
的课程:
public class DrawingPanel extends View {
private Bitmap toDisk;
private int w;
private int h;
public DrawingPanel(Context context, AttributeSet attrs) {
super(context, attrs);
System.out.println("Drawing");
p0 = new Paint();
p0.setStyle(Style.STROKE);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
...
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
this.w = w;
this.h = h;
toDisk = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
super.onSizeChanged(w, h, oldw, oldh);
}
@Override
public void onDraw(Canvas canvas) {
canvas.drawColor(Color.WHITE);
canvas.drawPath(path0, p0);
canvas.setBitmap(toDisk);
}
}
我在布局中将此类用作子视图。在Eclipse的Graphical view
中,一切正常,所有视图都可见,但在模拟器中,我的类(DrawingPanel
)隐藏了其下面的其他视图。当我删除这一行时:
canvas.setBitmap(toDisk);
所有观看次数都会再次显示。另一个奇怪的事情是:当我将这一行放在onDraw
方法的第一行时:
@Override
public void onDraw(Canvas canvas) {
canvas.setBitmap(toDisk);
canvas.drawColor(Color.WHITE);
canvas.drawPath(path0, p0);
}
我的DrawingPanel
以及其下方的其他观点将不可见。我怎么解决这个问题?
我的目的是保存用户在画布上绘制的内容。
答案 0 :(得分:3)
你误解了setBitmap。它为您设置一个位图,以便将新的绘图命令发送到屏幕的INSTEAD。它不会将先前的命令绘制到位图。要做到这一点,你想要这样做:
Canvas diskCanvas = new Canvas(toDisk);
//Send all draw commands to this canvas
screenCanvas.drawBitmap(toDisk, new Matrix(), new Paint());
请注意,这只会将位图保存到内存中。要保存到磁盘,您需要将其保存到文件中。不要在onDraw中这样做,这是一个缓慢的操作。