赞
踩
使用方式如下
Paint.setXfermode()
通过使用离屏缓冲,把要绘制的内容单独绘制在缓冲层,保证Xfermode的使用不会出现错误的结果。
int layerId = canvas.saveLayer(0, 0, getWidth(), getHeight(), mPaint, Canvas.ALL_SAVE_FLAG);
setBackgroundColor(Color.GRAY);
//目标图
canvas.drawBitmap(createRectBitmap(mWidth, mHeight), 0, 0, mPaint);
//设置混合模式
mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
//源图,重叠区域右下角部分
canvas.drawBitmap(createCircleBitmap(mWidth, mHeight), 0, 0, mPaint);
//清除混合模式
mPaint.setXfermode(null);
canvas.restoreToCount(layerId);
直接把整个View都绘制在离屏缓冲中
setLayerType(LAYER_TYPE_HARDWARE); //使用GPU来缓冲
setLayerType(LAYER_TYPE_SOFTWARE); //使用一个Bitmap来缓冲
private static final Xfermode[] sModes = { //所绘制不会提交到画布上 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), };
使用图层混合之前,先禁止硬件加速
为什么禁止硬件加速?
因为Api14之后,图层混合它的有些API是不支持硬件加速的,而我们系统默认是将硬件加速开启的
setLayerType(View.LAYER_TYPE_SOFTWARE, null);
使用了离屏绘制后,记得调用restoreToCount
canvas.save()
和canvas.restoreToCount(sc);
是用来保存和回复Canvas的状态(Maxtrix等属性)
canvas.restoreToCount(layerId);
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。