使用Paint绘画的时候,需要对Paint设置渲染效果. 不同的渲染效果可以实现不同的叠加或者清除效果, PorterDuff.Mode为枚举类,一共有16个枚举值:
1.PorterDuff.Mode.CLEAR
所绘制不会提交到画布上。
2.PorterDuff.Mode.SRC
显示上层绘制图片
3.PorterDuff.Mode.DST
显示下层绘制图片
4.PorterDuff.Mode.SRC_OVER
正常绘制显示,上下层绘制叠盖。
5.PorterDuff.Mode.DST_OVER
上下层都显示。下层居上显示。
6.PorterDuff.Mode.SRC_IN
取两层绘制交集。显示上层。
7.PorterDuff.Mode.DST_IN
取两层绘制交集。显示下层。
8.PorterDuff.Mode.SRC_OUT
取上层绘制非交集部分。
9.PorterDuff.Mode.DST_OUT
取下层绘制非交集部分。
10.PorterDuff.Mode.SRC_ATOP
取下层非交集部分与上层交集部分
11.PorterDuff.Mode.DST_ATOP
取上层非交集部分与下层交集部分
12.PorterDuff.Mode.XOR
异或:去除两图层交集部分
13.PorterDuff.Mode.DARKEN
取两图层全部区域,交集部分颜色加深
14.PorterDuff.Mode.LIGHTEN
取两图层全部,点亮交集部分颜色
15.PorterDuff.Mode.MULTIPLY
取两图层交集部分叠加后颜色
16.PorterDuff.Mode.SCREEN
取两图层全部区域,交集部分变为透明色
以下是不同组合的测试结果
测试代码如下, mSrcPaint 画了一个圆, mDstPaint画了一个矩形, 然后是调节不同的渲染效果所得的图形结果
private void draw(Context context) {
WindowManager manager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
width = manager.getDefaultDisplay().getWidth();
height = manager.getDefaultDisplay().getHeight();
mBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
mCanvas = new Canvas(mBitmap);
Rect rect = new Rect();
rect.set(200, 500, 600, 950);
mCanvas.drawCircle(600, 500, 300, mSrcPaint);
mCanvas.drawRect(rect, mDstPaint);
}
private void initSrcPaint() {
mSrcPaint = new Paint();
mSrcPaint.setAntiAlias(true);
mSrcPaint.setDither(true);
mSrcPaint.setColor(Color.BLUE);
mSrcPaint.setStyle(Paint.Style.FILL);
mSrcPaint.setStrokeJoin(Paint.Join.ROUND);
mSrcPaint.setStrokeCap(Paint.Cap.ROUND);
mSrcPaint.setStrokeWidth(20);
mSrcPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC));
}
private void initDstPaint() {
mDstPaint = new Paint();
mDstPaint.setAntiAlias(true);
mDstPaint.setDither(true);
mDstPaint.setColor(Color.YELLOW);
mDstPaint.setStyle(Paint.Style.FILL);
mDstPaint.setStrokeJoin(Paint.Join.ROUND);
mDstPaint.setStrokeCap(Paint.Cap.ROUND);
mDstPaint.setStrokeWidth(20);
mDstPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OVER));
}
PorterDuff.Mode.SRC
如果只是绘画圆形得到的结果是, 除了自己绘画的图像之外, 会把背景bitmap填充黑色
同时如果绘画矩形, 设置以下三个效果和上图一样
PorterDuff.Mode.DST_OUT, PorterDuff.Mode.DST, PorterDuff.Mode.DST_IN
如果设置PorterDuff.Mode.DST_OVER 和PorterDuff.Mode.DST_ATOP
效果是下图
PorterDuff.Mode.SRC_OVER
绘画圆形的结果是
对矩形画笔设置以下渲染效果结果和上图一样
PorterDuff.Mode.DST, PorterDuff.Mode.DST_IN
如果设置PorterDuff.Mode.DST_OVER 和PorterDuff.Mode.DST_ATOP
PorterDuff.Mode.OVERLAY效果如下
矩形也被绘制出来,只是现实在圆形的下面
如果设置PorterDuff.Mode.DST_OUT,
效果如下:
矩形是透明的, 并且圆形相交的部分也被透明了, 这效果常常被当橡皮擦使用
PorterDuff.Mode.CLEAR 也可以实现这个效果
PorterDuff.Mode.DARKEN的效果如下
保留双方图片, 相交加深色
PorterDuff.Mode.MULTIPLY的效果如下:
保留src的图片, 对dst和src相交的部分加深
PorterDuff.Mode.ADD,
PorterDuff.Mode.LIGHTEN,
PorterDuff.Mode.SCREEN的效果如下:
保留双方图形, 相交部分颜色减轻
PorterDuff.Mode.XOR的效果如下:
保留双方图形, 相交部分变透明
PorterDuff.Mode.SRC_IN
效果图如下
什么也没有显示出来.
对矩形画笔设置以下效果结果和上图一样:
PorterDuff.Mode.DST
PorterDuff.Mode.DST_IN
PorterDuff.Mode.DST_OUT
orterDuff.Mode.MULTIPLY
剩下的全部是以下效果
PorterDuff.Mode.SRC_ATOP
选择此效果的画笔不会显示出来
PorterDuff.Mode.DST
PorterDuff.Mode.DST_IN
PorterDuff.Mode.DST_OUT
PorterDuff.Mode.MULTIPLY
PorterDuff.Mode.CLEAR
都是一样的效果.
剩下的渲染效果都可以讲矩形绘出
- PorterDuff.Mode.SRC_OUT
这样的渲染模式下, 背景色加深, 没有任何图形
无论dst使用何种渲染效果都没有任何图形出现