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);

    }

}

このクラスをレイアウトの子ビューとして使用します。EclipseではGraphical viewすべて問題なく、すべてのビューが表示されますが、エミュレーターではクラス ( DrawingPanel) がその下にある他のビューを非表示にします。この行を削除すると:

canvas.setBitmap(toDisk);

すべてのビューが再び表示されます。そしてもう1つの奇妙なこと:その行を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 に送信するためのビットマップを設定します。以前のコマンドをビットマップに描画しません。そのためには、次のようにします。

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 に答える