0

我有这个扩展的类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);

    }

}

我将此类用作布局中的子视图。在Graphical viewEclipse 中,一切正常,所有视图都是可见的,但在模拟器中,我的类 ( DrawingPanel) 隐藏了它下面的其他视图。当我删除这一行时:

canvas.setBitmap(toDisk);

所有视图将再次可见。还有一件奇怪的事情:当我把那行放在这样的onDraw方法的第一行时:

@Override
    public void onDraw(Canvas canvas) {
                canvas.setBitmap(toDisk);
        canvas.drawColor(Color.WHITE);
        canvas.drawPath(path0, p0);
    }

DrawingPanel和它下面的其他视图将是不可见的。我怎么解决这个问题? 我的目的是保存用户在画布上绘制的内容。

4

1 回答 1

3

你误解了 setBitmap。它为您设置一个位图,以便将新的绘图命令发送到 INSTEAD OF the screen。它不会将先前的命令绘制到位图上。为此,您需要这样做:

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

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

于 2013-03-05T18:30:48.777 回答