2

我正在尝试构建一个绘画应用程序。申请分为3个部分:

  1. 最初,应用程序具有白色背景,用户可以使用不同的画笔大小和不同的颜色在画布上绘画
  2. 用户可以将画布图像保存到 sd 卡
  3. 用户可以从 sd 卡上传图像并再次在图像上绘画

第 1 点和第 2 点工作正常,我可以在白色背景上绘画。但是第 3 点,当我从画廊上传任何图像并尝试在图像上绘画时,之前绘制的路径会消失,只显示新路径。

代码 :

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()时也没有保存以前的路径。
还有一点非常重要:Never Never!在迭代中调用 createBitmap() 方法。它会消耗大量内存,并会导致outOfMemory异常。您的问题的解决方案是:

  • 在自定义视图的构造函数中从任何流(SD 卡、可绘制等)或空位图创建位图(应该是可变的),然后创建画布并使用相同的位图进行绘制。在您的 touch_up() 方法中,在此画布上绘制路径。在 onDraw() 中,您应该将此位图用作画布的指定位图(作为参数传递,此处无需创建新的画布)进行绘制。

在这里,您可以按照此链接访问 android api 演示代码。

于 2012-09-01T21:00:10.277 回答