画布上的图像曲线的边缘在android上变形

时间:2015-07-11 03:04:06

标签: android canvas drawing paint

如图所示,当我用曲线路径创建图像时(使用PorterDuffXfermode),它看起来很扭曲。黑色轮廓使用相同的路径绘制,但图像在边缘之外达到峰值,从而产生扭曲的外观。我在下面列出了我的代码(android:hardwareAccelerated =“true”也已设置)。 如何删除失真并将图像对齐黑色轮廓。

enter image description here

********************* create image ******************************
// translatedFigure is the curvy figure
// sourcePicture is the image drawn as curvy figure

Canvas gfx = new Canvas(image);
gfx.drawPath(translatedFigure, fillStrokePaint);

// use new PorterDuffXfermode(android.graphics.PorterDuff.Mode.SRC_IN)

gfx.drawBitmap(sourcePicture, 100, 100, porterDuffPaint);

gfx.drawBitmap(image, 0, 0,embossPaint); // emboss

gfx.drawPath(translatedFigure, outlinePen); // draw black outline

****************************Draw image on Canvas****************************
    canvasPaint.setFlags(Paint.FILTER_BITMAP_FLAG | Paint.ANTI_ALIAS_FLAG);

    canvas.scale(mScaleFactor, mScaleFactor);
    canvas.translate(mPosX, mPosY);

    super.onDraw(canvas);
    canvas.drawBitmap(bigImageSizeOfScreen, mPosX, mPosY, canvasPaint);
    canvas.restore(); 
********************************************************


public void createPaint() {
        // for outline
        outlinePen = new Paint(Color.BLACK);
        outlinePen.setFlags(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);
        outlinePen.setStyle(Paint.Style.STROKE);
        outlinePen.setAntiAlias(true);
        outlinePen.setDither(true);
        outlinePen.setStrokeJoin(Paint.Join.ROUND);
        outlinePen.setStrokeCap(Paint.Cap.ROUND);
        outlinePen.setStrokeWidth(1);


        fillStrokePaint = new Paint(Color.WHITE);
        fillStrokePaint.setFlags(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);
        fillStrokePaint.setAntiAlias(true);
        fillStrokePaint.setDither(true);
        fillStrokePaint.setStrokeJoin(Paint.Join.ROUND);
        fillStrokePaint.setStrokeCap(Paint.Cap.ROUND);
        fillStrokePaint.setStyle(Paint.Style.FILL);

        porterDuffPaint = new Paint();
        porterDuffPaint.setXfermode(new PorterDuffXfermode(
                android.graphics.PorterDuff.Mode.SRC_IN));


        embossPaint = new Paint(Color.RED);
        embossPaint.setFlags(Paint.FILTER_BITMAP_FLAG | Paint.ANTI_ALIAS_FLAG
                | Paint.DITHER_FLAG);
        embossPaint.setStyle(Paint.Style.FILL_AND_STROKE);
        embossPaint.setStrokeJoin(Paint.Join.ROUND);
        embossPaint.setStrokeCap(Paint.Cap.ROUND);

        EmbossMaskFilter mEmboss = new EmbossMaskFilter(
                new float[]{1, 1, 1}, 0.4f, 6, 3.5f);
        embossPaint.setMaskFilter(mEmboss);
    }

0 个答案:

没有答案