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