ПортерДафф и Путь

В моем проекте у меня есть растровое изображение, заполняющее весь экран. На этом растровом изображении я рисую путь с помощью

android.graphics.Canvas.drawPath(Path path, Paint paint)

краска устанавливается для обводки и заполнения содержимого контура. Чего бы я добился, так это стереть часть битампа, пересекающую путь. Мне удалось получить такое же поведение, используя другое растровое изображение вместо пути и используя правила duff портера. Есть ли шанс сделать то же самое с путем?

    mPaintPath.setARGB(100, 100, 100, 100);// (100, 100, 100, 100)
    mPaintPath.setStyle(Paint.Style.FILL_AND_STROKE);
    mPaintPath.setAntiAlias(true);
    mPath.moveTo(x0, y0));
    mPath.lineTo(x1, y1);
    mPath.lineTo(x2, y2);
    mPath.lineTo(x3, y3);
    mPath.lineTo(x0, y0);
    mPath.close();
    c.drawPath(mPath, mPaintPath);

person Blackbelt    schedule 14.11.2011    source источник


Ответы (1)


Конечно, просто нарисуйте путь к закадровому буферу, чтобы вы могли использовать его в качестве маски при рисовании растрового изображения, примерно так:

// Create an offscreen buffer
int layer = c.saveLayer(0, 0, width, height, null,
        Canvas.HAS_ALPHA_LAYER_SAVE_FLAG | Canvas.FULL_COLOR_LAYER_SAVE_FLAG);

// Setup a paint object for the path
mPaintPath.setARGB(255, 255, 255, 255);
mPaintPath.setStyle(Paint.Style.FILL_AND_STROKE);
mPaintPath.setAntiAlias(true);

// Draw the path onto the offscreen buffer
mPath.moveTo(x0, y0);
mPath.lineTo(x1, y1);
mPath.lineTo(x2, y2);
mPath.lineTo(x3, y3);
mPath.lineTo(x0, y0);
mPath.close();
c.drawPath(mPath, mPaintPath);

// Draw a bitmap on the offscreen buffer and use the path that's already
// there as a mask
mBitmapPaint.setXfermode(new PorterDuffXfermode(Mode.SRC_OUT));
c.drawBitmap(mBitmap, 0, 0, mBitmapPaint);

// Composit the offscreen buffer (a masked bitmap) to the canvas
c.restoreToCount(layer);

Если вы можете противостоять алиасингу, есть более простой способ: просто настройте путь отсечения (обратите внимание на использование Region.Op.DIFFERENCE, которое приводит к отсечению внутренней части пути, а не всего за пределами пути):

// Setup a clip path
mPath.moveTo(x0, y0);
mPath.lineTo(x1, y1);
mPath.lineTo(x2, y2);
mPath.lineTo(x3, y3);
mPath.lineTo(x0, y0);
mPath.close();
c.clipPath(mPath, Op.DIFFERENCE);

// Draw the bitmap using the path clip
c.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
person Martin Nordholts    schedule 28.11.2011
comment
о, я вижу .. значит, правила портердаффа применяются только к растровому изображению? - person Blackbelt; 06.03.2012
comment
Да, операции Портера-Даффа основаны на пикселях. - person Martin Nordholts; 07.03.2012
comment
отлично! вы спасли мой день, если не вызывать cavas.saveLayer, цвет фона пользовательского представления будет черным. - person Jishi Chen; 08.08.2014