为什么canvas.setBitmap()隐藏了Parent中的其他视图?

时间:2013-03-05 18:22:51

标签: android canvas ondraw

我有这个扩展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以及其下方的其他观点将不可见。我怎么解决这个问题? 我的目的是保存用户在画布上绘制的内容。

1 个答案:

答案 0 :(得分:3)

你误解了setBitmap。它为您设置一个位图,以便将新的绘图命令发送到屏幕的INSTEAD。它不会将先前的命令绘制到位图。要做到这一点,你想要这样做:

Canvas diskCanvas = new Canvas(toDisk);
//Send all draw commands to this canvas
screenCanvas.drawBitmap(toDisk, new Matrix(), new Paint());

请注意,这只会将位图保存到内存中。要保存到磁盘,您需要将其保存到文件中。不要在onDraw中这样做,这是一个缓慢的操作。