2

ペイントアプリケーションを構築しようとしています。アプリケーションは 3 つの部分に分かれています。

  1. 最初、アプリケーションの背景は白で、ユーザーはさまざまなブラシ サイズとさまざまな色を使用してキャンバスにペイントできます。
  2. ユーザーはキャンバス画像をSDカードに保存できます
  3. ユーザーはSDカードから画像をアップロードし、画像に再度ペイントできます

ポイント1と2は正常に機能しており、白い背景にペイントできます. しかし、ポイント 3、Gallery から画像をアップロードして画像にペイントしようとすると、以前にペイントしたパスが消えて、新しいパスのみが表示されます。

コード:

onDraw(Canvas canvas){
  mBitmap = Bitmap.createBitmap(320, 480, Bitmap.Config.ARGB_8888);
  mCanvas = new Canvas(mBitmap);
  mPath = new Path();
  mBitmapPaint = new Paint(Paint.DITHER_FLAG);
  canvas.drawColor(Color.WHITE);
  canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
  canvas.drawPath(mPath, mPaint);
}

onTouch - >

case MotionEvent.ACTION_DOWN:

                mPath.reset();
                mPath.moveTo(x, y);
                mX = x;
                mY = y;
                invalidate();
                break;
            case MotionEvent.ACTION_MOVE:
                float dx = Math.abs(x - mX);
                float dy = Math.abs(y - mY);
                if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {
                    mPath.quadTo(mX, mY, (x + mX) / 2, (y + mY) / 2);
                    mX = x;
                    mY = y;
                }
                invalidate();
                break;
            case MotionEvent.ACTION_UP:
                mPath.lineTo(mX, mY);
                mCanvas.drawPath(mPath, mPaint);
                mPath.reset();
                break;

mBitmap = BitmapFactory.decodeFile(filePath); -----this is from sd card
4

1 に答える 1

0

アプリが以前に描画されたパスを保持し、新しいパスも描画しているとは確信していません。この理由は、 onDraw() メソッドが呼び出されるたびに、新しいビットマップと描画パスを作成し、mpath.reset()を呼び出すときに以前のパスを保存していないためです。
もう 1 つポイントがありますが、これは非常に重要です。反復で createBitmap() メソッドを呼び出します。大量のメモリを消費し、outOfMemory例外が発生します。あなたの問題の解決策は次のとおりです。

  • 任意のストリーム (SD カード、ドローアブルなど) からビットマップ (変更可能) を作成するか、カスタム ビューのコンストラクターで空のビットマップを作成してから、キャンバスを作成し、同じビットマップを使用して描画します。touch_up() メソッドで、このキャンバスにパスを描画します。onDraw() では、このビットマップをキャンバスの指定されたビットマップとして使用する必要があります (パラメーターとして渡されます。ここで新しいキャンバスを作成する必要はありません)。

ここでは、このリンクをたどって Android API デモ コードを参照できます。

于 2012-09-01T21:00:10.277 に答える