利用PorterDuffXfermode,绘制组合图形,过程我分成了4个步骤(onDraw方法里面):

1、通过canvas.saveLayout()先绘制一个背景图层(这里位置大小很重要,应该根据覆盖层来定义)(如果没有背景层,产生效果可能和预期不太一样)

2、canvas.drawXXX()画底部图形Dst;

4、paint.setXfermode()设置图形相交模式

5、canvas.drawBitmap(maskBm, x, y, paint)画覆盖图形

下面是圆形与矩形SRC_OUT模式下重叠后效果图:

上图实现代码:

package com.example.d_customprogressbar.widget;import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.PorterDuff.Mode;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.View;public class PorterDuffXferView extends View{private Paint mPaint;private Paint mPaint2;private Rect rect;private Bitmap maskBm;//遮罩层public PorterDuffXferView(Context context, AttributeSet attrs) {super(context, attrs);mPaint = new Paint();mPaint.setColor(Color.YELLOW);mPaint.setAntiAlias(true);mPaint.setStyle(Style.FILL);mPaint2 = new Paint();mPaint2.setColor(Color.BLUE);mPaint2.setAntiAlias(true);mPaint2.setStyle(Style.FILL);//绘制遮罩层rect = new Rect(0,0, 250, 100);maskBm = Bitmap.createBitmap(250, 100, Config.ARGB_8888);Canvas canvas = new Canvas(maskBm);canvas.drawRect(rect, mPaint2);
//      canvas.saveLayer(0,0, 250, 100,  null,
//              Canvas.MATRIX_SAVE_FLAG | Canvas.CLIP_SAVE_FLAG
//              | Canvas.HAS_ALPHA_LAYER_SAVE_FLAG
//              | Canvas.FULL_COLOR_LAYER_SAVE_FLAG
//              | Canvas.CLIP_TO_LAYER_SAVE_FLAG);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);//绘制背景图层(这里位置大小很重要,应该根据覆盖层来定义)(如果要实现SRC-OUT效果:那么左上点与覆盖层一样)int sc= canvas.saveLayer(100,100, 500, 500,  null,Canvas.MATRIX_SAVE_FLAG | Canvas.CLIP_SAVE_FLAG  | Canvas.HAS_ALPHA_LAYER_SAVE_FLAG  | Canvas.FULL_COLOR_LAYER_SAVE_FLAG  | Canvas.CLIP_TO_LAYER_SAVE_FLAG);//画圆-DSTcanvas.drawCircle(100, 100, 100, mPaint);//设置图形相交模式mPaint.setXfermode(new PorterDuffXfermode(Mode.SRC_OUT));  //画覆盖层(蓝色矩形)SRCcanvas.drawBitmap(maskBm, 100f, 100f, mPaint);  //      mPaint.setXfermode(null);
//      canvas.restoreToCount(sc);}}

效果分析:

如果把背景层代码注释,覆盖层就变黑了,如下图:

总结:用PorterDuffXfermode时,一定要先saveLayout()绘制背景层

Demo:http://download.csdn.net/detail/u013372185/9560935

【Android】PorterDuffXfermode使用(通过消除背景层与重叠部分绘制组合图形)相关推荐

  1. android PorterDuffXfermode ,PorterDuff.Mode 使用 以及Porter-Duff规则详解

    android PorterDuffXfermode ,PorterDuff.Mode 使用 以及Porter-Duff规则详解 1.下面的Xfermode子类可以改变这种行为: AvoidXferm ...

  2. 干货 | 详解如何用深度学习消除背景,实现抠图

    微信公众号 关键字全网搜索最新排名 [机器学习算法]:排名第一 [机器学习]:排名第一 [Python]:排名第三 [算法]:排名第四 这篇文章介绍了作者 Gidi Sheperber 在 green ...

  3. Android游戏开发指南一背景地图

    1.孤岛使用三张背景层,一张大的静态的图,一个中间的tilemap,和前景tilemap 2.32X32 tiles, means that 120 tiles should be draw in o ...

  4. android 动态修改 selector,Android Selector 按下修改背景和文本颜色的实现代码

    1,selector 按下修改背景和文本颜色 [1]点击改变字体颜色 - android:state_pressed(按压状态) [2]selector状态选择器(bg_btn_two (存放 res ...

  5. 【Android 性能优化】布局渲染优化 ( 过渡绘制 | 背景设置产生的过度绘制 | Android 系统的渲染优化 | 自定义布局渲染优化 )

    文章目录 一. 背景设置产生的过度绘制 二. Android 系统的渲染优化 1. 透明组件数据传递 2. GPU 存储机制 3. Android 7.0 之后的优化机制 三. 自定义布局渲染优化 一 ...

  6. android黑色半透明dialog背景,Android开发中Dialog半透明背景消失

    近日,遇到一个Dialog半透明背景消失的问题,背景需求是自定义Dialog实现警告提示框: // 初始化警告弹出框 alertDialog = new EmpAlertView(context, U ...

  7. android 弹出PopupWindow后背景逐渐变暗

    今天,简单讲讲android在弹出  PopupWindow后如何使背景逐渐变暗. 我之前做的效果是在PopupWindow弹出时立即将背景变暗,这个也很简单. 在PopupWindow弹出时,将 ...

  8. android selector点击修改颜色,Android Selector 按下修改背景和文本颜色的实现代码

    1,selector 按下修改背景和文本颜色 [1]点击改变字体颜色 - android:state_pressed(按压状态) [2]selector状态选择器(bg_btn_two (存放 res ...

  9. Android BackgroundViewPager:类似桌面背景壁纸随手指滑动

     Android BackgroundViewPager:类似桌面背景壁纸随手指滑动 Android BackgroundViewPager要实现的功能和Android桌面极为类似,即,假设用户的 ...

最新文章

  1. 你必须非常努力,才能看起来毫不费力
  2. win7设置java环境变量_win7下JAVA环境变量配置方法
  3. 最最基本的Git入门 -- 本地仓库操作
  4. 神经网络-预测财产损失
  5. 人人都是架构师: 约束和原则
  6. ubuntu 创建github公钥
  7. 使用深度学习解决拍照文档复杂背景二值化问题
  8. python3精要(27)-*与**解包
  9. RMI(Remote Method Invocation,远程方法调用)
  10. 单片机声明数组可变长度c语言keil,单片机用byte定义数组keil编译警告 missing';'before...
  11. amazon s3_在Amazon S3上托管静态网站
  12. J2SE J2EE J2ME名字的来历
  13. Java 两个日期间的天数计算
  14. 博士最惨能惨到什么程度?
  15. 数据治理系列8:数据价值管理
  16. 第七章--图--基本概念
  17. 你真的会用C语言的fscanf_s吗
  18. 简历之精通 熟练 掌握 熟悉 了解
  19. 使用火焰传感器和Arduino开发板搭建火灾报警系统
  20. 代谢组学简介-百趣代谢组学资讯

热门文章

  1. bootstrap获取下拉框数据_bootstrap动态调用select下拉框的实现方法
  2. Maven 常用的jar包依赖
  3. C++代码实现atanx,atan2x,acosx,asinx,sinx,cosx,tanx三角函数、开方函数sqrtND()
  4. 【算法】_010_冒泡排序
  5. 琼斯是计算体心立方弹性模量_大学免费查题的软件,超好用的搜答案神器在这里?...
  6. BIOM格式文件_微生物组数据通用数据格式
  7. 正版加密光盘如何复制?我来教给你方法 加密光盘问题解决
  8. 利用火狐浏览器抓取京东Cookie教程
  9. OdooERP中国财务本地化的免费开源存货核算解决方案
  10. 腾讯AI Lab招聘基础研究实习生