赞
踩
通过使用离屛绘制,把要绘制的内容单独绘制在缓冲层,保证Xfermode的使用不会出现错误的结果。
离屏缓冲的两种方式:
//Canvas.saveLayer可以做离屏缓冲,在绘制之前保存当前图层,绘制之后恢复
int saveId = canvas.saveLayer(0, 0, mWidth, mHeight, mUpPaint, Canvas.ALL_SAVE_FLAG);
//绘制圆形
canvas.drawBitmap(circelBitmap, 0, 0, mUpPaint);
//设置Xfermode
mUpPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));
//绘制方形
canvas.drawBitmap(rectBitmap, 0, 0, mUpPaint);
//清除Xfermode
mUpPaint.setXfermode(null);
//方式1、恢复之前的图层
canvas.restoreToCount(saveId);
//方式2、恢复之前的图层
canvas.restore();
//使用一个Bitmap来缓冲
setLayerType(LAYER_TYPE_SOFTWARE, null);
//使用GPU来缓冲
setLayerType(LAYER_TYPE_HARDWARE, null);
//绘制不会提交到画布上 new PorterDuffXfermode(PorterDuff.Mode.CLEAR), //显示上层绘制的图像 new PorterDuffXfermode(PorterDuff.Mode.SRC), //显示下层绘制的图像 new PorterDuffXfermode(PorterDuff.Mode.DST), //正常绘制显示,上下层绘制叠盖 new PorterDuffXfermode(PorterDuff.Mode.SRC_OVER), //上下层都显示,下层居上显示 new PorterDuffXfermode(PorterDuff.Mode.DST_OVER), //取两层绘制交集,显示上层 new PorterDuffXfermode(PorterDuff.Mode.SRC_IN), //取两层绘制交集,显示下层 new PorterDuffXfermode(PorterDuff.Mode.DST_IN), //取上层绘制非交集部分,交集部分变透明 new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT), //取下层绘制非交集部分,交集部分变透明 new PorterDuffXfermode(PorterDuff.Mode.DST_OUT), //取上层交集部分与下层非交集部分 new PorterDuffXfermode(PorterDuff.Mode.SRC_ATOP), //取下层交集部分与上层非交集部分 new PorterDuffXfermode(PorterDuff.Mode.DST_ATOP), //取出两个图层交集部分 new PorterDuffXfermode(PorterDuff.Mode.XOR), //取两图层全部区域,交集部分颜色加深 new PorterDuffXfermode(PorterDuff.Mode.DARKEN), //取两图层全部区域,交集部分颜色点量 new PorterDuffXfermode(PorterDuff.Mode.LIGHTEN), //取两图层交集部分,颜色叠加 new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY), //取两图层全部区域,交集部分滤色 new PorterDuffXfermode(PorterDuff.Mode.SCREEN), //取两图层全部区域,交集部分饱和度相加 new PorterDuffXfermode(PorterDuff.Mode.ADD), //取两图层全部区域,交集部分叠加 new PorterDuffXfermode(PorterDuff.Mode.OVERLAY)
对应效果:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。