Xfermode有三个实现类:AvoidXfermode, PixelXorXfermode以及PorterDuffXfermode。...AvoidXfermode AvoidXfermode xfermode will draw the src everywhere except on top of the opColor or,...count = canvas.saveLayer paint.setXfermode() canvas.drawXXX canvas.restoreLayer() 实际效果测试以及mode含义 往上很多对于Xfermode...0.5f, 0.5f, width / 2, height / 2); canvas.drawBitmap(mDst, 0, 0, p); p.setXfermode(xfermode
Xfermode的作用是将绘制的图形的像素和Canvas上对应位置的像素按照一定的规则进行混合,形成新的像素,再更新到Canvas中形成最终的图形,使用的时候都是通过Paint.setXfermode...Xfermode.png 混合模式分类 SRC类----优先显示的是源图片 SRC [Sa, Sc] ---- 处理图片相交区域时,总是显示的是原图片 SRC_IN [Sa * Da, Sc * Da
首先准备两张图片 查看原图才能看清 Xfermode中SRC_IN模式是利用目标图片的透明度对原图片的透明度进行处理,目标图片透明度越低,相应的原图的透明度也越低 private Bitmap...Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); //使用Xfermode...onDraw(Canvas canvas) { canvas.drawBitmap(bitmapDst,0,0,mPaint); //后画SRC的图片 Xfermode...xfermode = new PorterDuffXfermode(PorterDuff.Mode.SRC_IN); mPaint.setXfermode(xfermode);...canvas.drawBitmap(bitmapSrc,0,0,mPaint); mPaint.setXfermode(null); } 项目地址:https://gitee.com/aruba/Xfermode.git
后面会附上Xfermode.java的核心代码,这里说明下。...矩形和圆分别是两个独立的Bitmap,上图演示了选取Xfermode的子类PorterDuffXfermode作为“Xfermode("transfer-modes" in the drawing pipeline...When an Xfermode is assigned to an Paint, then objects drawn with that paint have the xfermode applied...Xfermode表示要在“绘制管线中使用的颜色传递模式”。...这样就得到了“Xfermode中的Dst Bitmap”。
dstCanvas.drawPath(path,pathPaint); canvas.drawBitmap(bitmapDst, 0, 0, mPaint); Xfermode...xfermode = new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT); mPaint.setXfermode(xfermode);...mPaint.setXfermode(null); canvas.restoreToCount(layerId); } 项目地址:https://gitee.com/aruba/Xfermode.git
reference/kotlin/android/graphics/ComposeShader ComposeShader 组合渲染 需要设置 dst 和 src 两个渲染 , 还有两个渲染的组合模式 , 可以设置 Xfermode...mode: Xfermode) // The mode that combines the colors from the two shaders.
//在原图下方画目标图 canvas.drawBitmap(bitmapDst, 0, bitmapSrc.getHeight(), mPaint); Xfermode...xfermode = new PorterDuffXfermode(PorterDuff.Mode.SRC_IN); mPaint.setXfermode(xfermode);...canvas.drawBitmap(bitmapSrc, matrix, mPaint); mPaint.setXfermode(null); } 项目地址:https://gitee.com/aruba/Xfermode.git
自己绘过图的筒靴一定见过或者用过mPaint.setXfermode(Xfermode xfermode),它是干什么的呢?...3 Xfermode的意义你知道吗? 在上面的两张图中,CoorChice已经向筒靴们展示了使用Xfermode来混合简单的图形所达到的效果。...如果合理的使用Xfermode去将一些简单的图形进行混合,同样可以获得你所期望的复杂图形。在CoorChice的这篇文章【从未如此惊艳!...当然,这些并不能发挥Xfermode的真正威力。如果你使用它对一些图片进行混合,你会看到Xfermode到底能做什么不可思议的事!...你看,Xfermode就是如此的强大,通过合理的组合,能合成图片。 再一看张CoorChice用图片合成的各种效果: ? 哇!这鱼飞起来啦!
canvasDst.drawPath(path,mPathPaint); canvas.drawBitmap(bitmapDst,0,0, mPaint); Xfermode...xfermode = new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT); mPaint.setXfermode(xfermode);...canvas.drawBitmap(bitmapSrc, 0, 0, mPaint); mPaint.setXfermode(null); } 项目地址:https://gitee.com/aruba/Xfermode.git
-90, sweepAngle, true, paint);// 记得设置为 null 不然会没有效果paint.setXfermode(null); 根据当前的进度绘制相对应的弧,并且结束的时候将 Xfermode...public Xfermode setXfermode(Xfermode xfermode) { long xfermodeNative = 0; if (xfermode !...= null) xfermodeNative = xfermode.native_instance; native_setXfermode(mNativePaint, xfermodeNative...); mXfermode = xfermode; return xfermode;。
xfermode); 橡皮擦,这是个好方法啊,看看。...可以通过修改Paint的Xfermode来影响在Canvas已有的图像上面绘制新的颜色的方式。 在正常的情况下,在已有的图像上绘图将会在其上面添加一层新的形状。...下面的Xfermode子类可以改变这种行为: 1)AvoidXfermode 指定了一个颜色和容差,强制Paint避免在它上面绘图(或者只在它上面绘图)。...代码异常简单: Xfermode xFermode = new PorterDuffXfermode(PorterDuff.Mode.CLEAR);paint.setXfermode(xFermode)...; 这是使用的最后一个子类,关于16条Porter-Duff规则,如下: private static final Xfermode[] sModes = { new PorterDuffXfermode
当使用PorterDuffXfermode时,需要将将其作为参数传给Paint.setXfermode(Xfermode xfermode)方法,这样在用该画笔paint进行绘图时,Android就会使用传入的...PorterDuffXfermode,如果不想再使用Xfermode,那么可以执行Paint.setXfermode(null)。...5.在绘制完成后,我们调用paint.setXfermode(null)将画笔去除Xfermode。 具体分析一下白色矩形出现的原因。...一般我们在调用canvas.drawXXX()方法时都会传入一个画笔Paint对象,Android在绘图时会先检查该画笔Paint对象有没有设置Xfermode,如果没有设置Xfermode,那么直接将绘制的图形覆盖...Canvas对应位置原有的像素;如果设置了Xfermode,那么会按照Xfermode具体的规则来更新Canvas中对应位置的像素颜色。
实现方法是结合贝塞尔曲线和Xfermode,核心是利用path的offset()方法,不断偏移path /** * 水波纹进度条 */ public class BezierProgressView...width, height; float centerX, centerY; //背景圆的缓冲 private Bitmap roundBitmap; //需要和水波纹做Xfermode...Canvas(roundBitmap); roundCanvas.drawCircle(centerX, centerY, radius, roundPaint); //画Xfermode...context.getResources().getDisplayMetrics().density; return (int) (size * scale + 0.5f); } } 去掉Xfermode
所以这里我就想到使用Xfermode,没错,你看到发散的云,其实又是另一张图片: ? 哈哈哈哈,这张图片一贴出来,你是不是想笑。原来看起来很炫的效果,真实这么搞笑。...我只需要让两个图片使用Xfermode搞基一番,并且在过程中让这个View逐渐透明,遮罩图片逐渐放大即可。 当然,有了思路变成很简单,其实还是有些坑的,说说遇到的坑。...关于Xfermode小伙伴们用到过的可能了解,他有坑,非常大的坑。。经常发现与Demo图出不来一样的效果。...这里再来重复下Xfermode坑如何避免。 最终大总结,如果想让PorterDuffXferMode按照预期Demo(或者效果图)的效果图像实现,必须满足以下条件: 1、关闭硬件加速。...同时第一个View设置gone来避免过度绘制,第二个View绘制的实际上是两个bitmap,并且开启硬离屏缓存来实现Xfermode的正确效果。 ?
setFilterBitmap(boolean filter); * 如果该项设置为true,则图像在动画进行中会滤掉对Bitmap图像的优化操作,加快显示 * 速度,本设置项依赖于dither和xfermode...setStrokeWidth(float width); * 当画笔样式为STROKE或FILL_OR_STROKE时,设置笔刷的粗细度 * * setXfermode(Xfermode...xfermode); * 设置图形重叠时的处理方式,如合并,取交集或并集,经常用来制作橡皮的擦除效果 * * 2.文本绘制 * setFakeBoldText
boolean filter); * 如果该项设置为true,则图像在动画进行中会滤掉对Bitmap图像的优化操作,加快显示 * 速度,本设置项依赖于dither和xfermode...float width); * 当画笔样式为STROKE或FILL_OR_STROKE时,设置笔刷的粗细度 * * setXfermode(Xfermode...xfermode); * 设置图形重叠时的处理方式,如合并,取交集或并集,经常用来制作橡皮的擦除效果 * *<span style="color
. // 混合裁剪模式 private val xfermode = PorterDuffXfermode(PorterDuff.Mode.SRC_ATOP)...) // 【2.2】取消裁剪模式 ripplePaint.xfermode = null // 【1.2】将图层绘制到canvas上...这篇文章作者也遇到了相同的问题,经过的他实验发现: PorterDuffXfermode 颜色混合中的 SRC 层是在设置xfermode 之前 整个canvas 中的 非透明像素点。...于是这里新建了一个新的 全透明的 图层,由于 canvas.drawPath(clipPath, normalPaint) 绘制的是一个带有圆角的矩形,设置了 xfermode 模式为 SRC_ATOP...先绘制底部 SRC (圆角矩形),然后设置水波纹画笔的 xfermode ,接着绘制 DST (水波纹),最后取消混合模式。 这样,一个带圆角的水波纹就实现了。
Xfermode 设置橡皮擦的Paint的Xfermode模式为Mode.Clear。...Xfermode xfermode = new PorterDuffXfermode(PorterDuff.Mode.CLEAR); eraserPaint.setXfermode(xfermode);...import android.graphics.PorterDuff; import android.graphics.PorterDuffXfermode; import android.graphics.Xfermode...); eraserPaint.setStrokeWidth(20); eraserPaint.setColor(Color.TRANSPARENT); Xfermode...xfermode = new PorterDuffXfermode(PorterDuff.Mode.CLEAR); eraserPaint.setXfermode(xfermode);
bitmapCanvas.setBitmap(bitmap) bitmapCanvas.drawRect(srcRect, paint) paint.xfermode..., 0f, 0f, paint) paint.xfermode = null it.restoreToCount(saveCount)...在 xfermode的场景下,其实可以不调用 savelayer,直接在view初始化的时候开启硬件加速就可以实现同样的效果,并且这也是比较推荐的做法。
cleanTarget() transferAct() self.connection.quit() if name == 'main': ftp = FtpTools() xfermode...= 'download' if len(sys.argv) > 1: xfermode = sys.argv.pop(1) # get+del 2nd arg if xfermode ==...download': ftp.configTransfer() ftp.run(cleanTarget=ftp.cleanLocals, transferAct=ftp.downloadDir) elif xfermode