Android的油漆PorterDuff.Mode.CLEAR(Android Paint Port

2019-07-29 07:10发布

我工作的应用程序,它是在画布上类似于从Android SDK中手指画演示图纸。 当我使用我的问题是PorterDuff.Mode.CLEAR 。 当绘画和画布,如果我试图抹掉的东西,它的正常工作。 但是,如果我尝试保存我的形象为PNG文件橡皮擦用黑色的笔画,我不知道为什么会出现这种情况。 下面是我在做什么的例子:

@Override
    protected void onDraw(Canvas canvas) {
        canvas.drawColor(Color.WHITE);
        canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);

        canvas.drawPath(mPath, mPaint);
    }

橡皮擦:

case ERASE_MENU_ID:
            mPaint.setXfermode(new PorterDuffXfermode(
                                                    PorterDuff.Mode.CLEAR));
            return true;

怎么我保存图像:

            Calendar currentDate = Calendar.getInstance();
            SimpleDateFormat formatter= new SimpleDateFormat("yyyyMMMddHmmss");
            String dateNow = formatter.format(currentDate.getTime());
            File dir = new File(mImagePath);
            if(!dir.exists())
                dir.mkdirs();

            File file = new File(mImagePath + "/" + dateNow +".png");

            FileOutputStream fos;
            try {
                fos = new FileOutputStream(file);
                mBitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
                fos.close();
                Toast.makeText(getApplicationContext(), "File saved at \n"+mImagePath + "/" + dateNow +".png", Toast.LENGTH_LONG).show();
            } catch (FileNotFoundException e) {
                Log.e("Panel", "FileNotFoundException", e);
            } 
            catch (IOException e) {
                Log.e("Panel", "IOEception", e);
            }
            return true;

这里是图像的一个例子:

这里是我的画布看起来像保存之前:

这里是它保存在SD卡上后的图像:

Answer 1:

与fingerpaint代码的问题是,你看到的是不是被压缩成PNG相同。 看的onDraw()。 首先,你绘制屏幕的白色。 然后添加的位图。 因为你用波特达夫清除位图的删除部分包含实际上透明的黑色像素(值00000000)。 但是,因为你有白色背景的这些像素显示为白色。

为了解决这个问题要么改变你保存代码做同样的事情作为驱动代码

 try {
                    fos = new FileOutputStream(file);
                    Bitmap saveBitmap = Bitmap.createBitmap(mBitmap);
                    Canvas c = new Canvas(saveBitmap);
                    c.drawColor(0xFFFFFFFF);
                    c.drawBitmap(mBitmap,0,0,null);
                    saveBitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
                    saveBitmap.recycle();
...

或者不使用PortDuff.Clear:

    case ERASE_MENU_ID:
        mPaint.setColor(Color.WHITE);


文章来源: Android Paint PorterDuff.Mode.CLEAR