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 可能很多人看了一些就放弃了,今天我就个人理解,举简单的我们生活中的例子,让大家更容易理解这是个什么东西。其实并不是你们想象的那么难,你只要懂三步就够了。...不要把Xfermode 想的这么难,我把Xfermode 理解成中学时 学的“集合” ,我们知道“集合”是处理 数据的。例如: 集合 A={1,2,3,4},集合B={3,4,5,6}。...那么 Xfermode 我个人理解就是图形集合,就是图形A,图形B 之间可以取,交集,并集,补集。...既然是各类我们要使用就要创建对象,如下: PorterDuffXfermode xfermode = new PorterDuffXfermode(PorterDuff.Mode.SRC_IN); 这里就是我们的...再往下看 我们的画笔调用了: paint.setXfermode(xfermode); 这个方法,所以 如果我们再绘制图形的画,再用到的 画笔 就和我们之前 绘制的图形 不一样了。
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
后面会附上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”。
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
在上一篇实现了简单的画板功能, 这篇实现橡皮擦功能,首先分析一下应该如何实现, 在Andriod有个图像混合(Xfermode)概念,利用这个概念我们就可以实现橡皮擦功能。 ?...一、Xfermode Paint有一个方法setXfermode(Xfermode),这个方法设置图像的混合模式。...setModel(@EditMode model:Long){ mMode = model when(model){ EDIT_MODE_PEN - { //画线 mPaint.xfermode...= null } EDIT_MODE_ERASER - { mPaint.xfermode = PorterDuffXfermode(PorterDuff.Mode.CLEAR)...= null } EDIT_MODE_ERASER - { mPaint.xfermode = PorterDuffXfermode(PorterDuff.Mode.CLEAR) } } } } 三、
---- 圆形头像在实际开发中实际很常见,一般来说,主要有两种实现方式: 第一种: 使用 Paint 的 Xfermode 实战 第二种方法: 使用 BitmapShader 实现 第一种: 使用 Paint...的 Xfermode 实战 ?...paint); } return bitmap; } 以上代码来自鸿洋大神的博客 Android Xfermode...mBitmapPaint.setShader(mBitmapShader); } 以上代码来自鸿洋大神的 Android BitmapShader 实战 实现圆形、圆角图片 ---- 参考博客: Android Xfermode
所以这里我就想到使用Xfermode,没错,你看到发散的云,其实又是另一张图片: ? 哈哈哈哈,这张图片一贴出来,你是不是想笑。原来看起来很炫的效果,真实这么搞笑。...我只需要让两个图片使用Xfermode搞基一番,并且在过程中让这个View逐渐透明,遮罩图片逐渐放大即可。 当然,有了思路变成很简单,其实还是有些坑的,说说遇到的坑。...关于Xfermode小伙伴们用到过的可能了解,他有坑,非常大的坑。。经常发现与Demo图出不来一样的效果。...这里再来重复下Xfermode坑如何避免。 最终大总结,如果想让PorterDuffXferMode按照预期Demo(或者效果图)的效果图像实现,必须满足以下条件: 1、关闭硬件加速。...同时第一个View设置gone来避免过度绘制,第二个View绘制的实际上是两个bitmap,并且开启硬离屏缓存来实现Xfermode的正确效果。 ?
bitmapCanvas.setBitmap(bitmap) bitmapCanvas.drawRect(srcRect, paint) paint.xfermode..., 0f, 0f, paint) paint.xfermode = null it.restoreToCount(saveCount)...在 xfermode的场景下,其实可以不调用 savelayer,直接在view初始化的时候开启硬件加速就可以实现同样的效果,并且这也是比较推荐的做法。
boolean filter); * 如果该项设置为true,则图像在动画进行中会滤掉对Bitmap图像的优化操作,加快显示 * 速度,本设置项依赖于dither和xfermode...float width); * 当画笔样式为STROKE或FILL_OR_STROKE时,设置笔刷的粗细度 * * setXfermode(Xfermode...xfermode); * 设置图形重叠时的处理方式,如合并,取交集或并集,经常用来制作橡皮的擦除效果 * *<span style="color
setFilterBitmap(boolean filter); * 如果该项设置为true,则图像在动画进行中会滤掉对Bitmap图像的优化操作,加快显示 * 速度,本设置项依赖于dither和xfermode...setStrokeWidth(float width); * 当画笔样式为STROKE或FILL_OR_STROKE时,设置笔刷的粗细度 * * setXfermode(Xfermode...xfermode); * 设置图形重叠时的处理方式,如合并,取交集或并集,经常用来制作橡皮的擦除效果 * * 2.文本绘制 * setFakeBoldText
领取专属 10元无门槛券
手把手带您无忧上云