使用案例:
- 引导页的蒙层遮罩
- 刮刮卡效果
PorterDuff.Mode有16种
public enum Mode {
CLEAR (0),
SRC (1),
DST (2),
SRC_OVER (3),
DST_OVER (4),
SRC_IN (5),
DST_IN (6),
SRC_OUT (7),
DST_OUT (8),
SRC_ATOP (9),
DST_ATOP (10),
XOR (11),
DARKEN (16),
LIGHTEN (17),
MULTIPLY (13),
SCREEN (14),
ADD (12),
OVERLAY (15);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
/*
* 将绘制操作保存到新的图层(更官方的说法应该是离屏缓存)
* layer保存大小需要包含绘制的des和src区域,不然会展示不完整
*/
int size = 400;
int sc = canvas.saveLayer(0, 0, size, size, null, Canvas.ALL_SAVE_FLAG);
// 先绘制des
mPaint.setColor(Color.YELLOW);
canvas.drawCircle(1f / 3 * size, 1f / 3 * size, 1f / 3 * size, mPaint);
//设置混合模式
mPaint.setXfermode(porterDuffXfermode);
// 再绘制src
mPaint.setColor(Color.BLUE);
canvas.drawRect(1f / 3 * size, 1f / 3 * size, size, size, mPaint);
// 还原混合模式
mPaint.setXfermode(null);
// 还原画布
canvas.restoreToCount(sc);
}