Android:无法在从SD卡上传的图像上进行画布绘画

时间:2012-09-01 19:01:38

标签: android android-canvas ontouchevent

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

  1. 最初,应用程序具有白色背景,用户可以使用不同的画笔大小和不同颜色在画布上绘画
  2. 用户可以将画布图像保存到SD卡
  3. 用户可以从SD卡上传图像并再次在图像上绘画
  4. 第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
    

1 个答案:

答案 0 :(得分:0)

我不确定您的应用是保留以前绘制的路径还是绘制新路径。原因是每次调用onDraw()方法时,你都在创建一个新的位图和绘图路径,而你也没有保存以前的路径,因为你正在调用 mpath.reset()
还有一点,这非常重要:永远不要!在迭代中调用createBitmap()方法。它消耗大量内存并导致 outOfMemory 异常。 你问题的解决方案是:

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

在这里,您可以按照link来访问android api演示代码。