代码如下:
// 初始一下
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPaint.setColor(Color.RED);
mPaint.setStyle(Paint.Style.FILL);
mRectF.left = 0;
mRectF.top = 0;
mRectF.right = getWidth();
mRectF.bottom = getHeight();
// 先做了离屏缓存
int count = canvas.saveLayer(mRectF,null,Canvas.ALL_SAVE_FLAG);
canvas.drawRect(mRectF,mPaint); // 画了红色一个正方形
mXfermode = new PorterDuffXfermode(PorterDuff.Mode.DST_IN);
mPaint.setXfermode(mXfermode); // 设置 xfermode 为 DST_IN
canvas.drawCircle(dp2Px(100),dp2Px(100),dp2Px(100),mPaint);//画了一个圆形与正方形相切
canvas.restoreToCount(count); // 恢复画布的状态
预想的结果: 因为使用了 DST_IN 的模式进行裁切,所以应该显示下层交集,于是应该显示一个红色的圆。 实际显示:红色正方形。
尝试将 MODE 改为:PorterDuff.Mode.DST_OUT,显示效果与预期是一致的,显示的是去除了中心圆的正方形。
我去 github 看了很多前辈的实现思路,发现也是类似的代码,但是我写出来却不能达到预期的效果,很是苦恼,烦请各位大佬帮我看一下。
同时:对于这种实现方式,我还有一个疑问,PorterDuffXfermode 原理是将颜色混合,那么如果我们画了一个圆,paint 应该只能对这个圆范围内的颜色进行处理?为什么还能处理圆以外的像素呢?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.