Canvas位图未保存

时间:2016-07-18 13:53:46

标签: android android-canvas

我是Android画布的新手,我无法解决我的问题, 问题是: 我在两种模式中使用canvasXreXfermode.Mode.TARGET(用于删除单一颜色的出现)和PorterDuff.Mode.CLEAR(用于擦除画布的一部分)。

一切都是独立完美的 但在我的代码中,我想以这样的方式使用它们,当我选择我想要擦除特定的颜色时,它应该擦除它,我的代码就这样做了,

但在我将模式切换到橡皮擦模式后删除该特定颜色后...使用AvoidXfermode删除的所有内容都会返回。

我在位图上做这些事情, 我的onDraw方法是:

@Override
    protected void onDraw(Canvas canvas) {

        canvas.drawBitmap(DrawBitmap, 0, 0, DrawBitmapPaint);
        if (flag != 1) {
            setDrawingCacheEnabled(true);
            for (Path p : paths) {

                canvas.drawPath(p, mPaint);
                Bitmap bitmap = getDrawingCache();
                DrawBitmap = bitmap;



                //
            }
            //canvas.setBitmap(bitmap.isMutable() ? bitmap : bitmap.copy(Bitmap.Config.ARGB_8888,true));

        } else if (flag == 1) {
            if (touchx > mCanvas.getWidth() || touchy > mCanvas.getHeight() || touchx < 0 || touchy < 0) {
                return;
            }
            for (Path p : paths) {

                color = DrawBitmap.getPixel(touchx, touchy);
                mPaint.setXfermode(new AvoidXfermode(color, 100, AvoidXfermode.Mode.TARGET));
                mPaint.setColor(Color.TRANSPARENT);
                canvas.drawPaint(mPaint);

                setDrawingCacheEnabled(true);
                Bitmap bitmap = getDrawingCache();
                DrawBitmap = bitmap;
            }



        }


    }

现在只是针对这个问题在onDraw中声明了所有内容, 以及我切换模式的代码是:

 case R.id.erase:
            mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
            mPaint.setColor(Color.TRANSPARENT);
            mPaint.setStrokeWidth(40);
            flag = 0;
            break;

 case R.id.DELETE:

            flag = 1;
            break;

我创建画布的代码是:

 DrawBitmap = BitmapFactory.decodeResource(MainActivity.this.getResources(), R.drawable.sample);
    DrawBitmap = DrawBitmap.copy(Bitmap.Config.ARGB_8888, true);
    mCanvas = new Canvas(DrawBitmap);
    mPath = new Path();
    paths.add(mPath);
    DrawBitmapPaint = new Paint(Paint.ANTI_ALIAS_FLAG);

我错了,但我不知道在哪里,任何建议都会有所帮助,提前谢谢。

1 个答案:

答案 0 :(得分:0)

Bitmap bitmap = getDrawingCache();
DrawBitmap = bitmap;

你的逻辑很复杂。我特指的是上面的代码行。您使用mCanvas位图备份了DrawBitmap。然后,您拥有canvas onDraw(),它由自己的位图支持。你需要理解的是你在DrawBitmap逗留的任何东西,或者你称之为&#34;已经保存的#34;。通过canvas绘制的任何内容在下次调用onDraw()时都会发生变化。

因此,如果您想在DrawBitmap中保存某些内容,请使用mCanvas。您想要保存用户绘图状态的那一刻,请在mCanvas中绘制它。您可以在mCanvas上绘制所有内容,在onDraw()结束时,您可以调用canvas.drawBitmap(DrawBitmap, 0, 0, DrawBitmapPaint);这样,用户完成的所有操作都会保存在每一步中。