2019独角兽企业重金招聘Python工程师标准>>>

setXfermode

设置两张图片相交时的模式

我们知道 在正常的情况下,在已有的图像上绘图将会在其上面添加一层新的形状。 如果新的Paint是完全不透明的,那么它将完全遮挡住下面的Paint;

而setXfermode就可以来解决这个问题

一般来说 用法是这样的

Canvas canvas = new Canvas(bitmap1);paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));canvas.drawBitmap(mask, 0f, 0f, paint);      

就是在图片bitmap1上面绘制图片mask时 处理两者相交时候显示的问题

canvas原有的图片 可以理解为背景 就是dst 
新画上去的图片 可以理解为前景 就是src

Mode的值 如下图

  PorterDuff.Mode.CLEAR 清除画布上图像 
       PorterDuff.Mode.SRC 显示上层图像 
       PorterDuff.Mode.DST 显示下层图像 
       PorterDuff.Mode.SRC_OVER上下层图像都显示,上层居上显示 
       PorterDuff.Mode.DST_OVER 上下层都显示,下层居上显示 
       PorterDuff.Mode.SRC_IN 取两层图像交集部门,只显示上层图像 
       PorterDuff.Mode.DST_IN 取两层图像交集部门,只显示下层图像 
       PorterDuff.Mode.SRC_OUT 取上层图像非交集部门 
       PorterDuff.Mode.DST_OUT 取下层图像非交集部门 
       PorterDuff.Mode.SRC_ATOP 取下层图像非交集部门与上层图像交集部门 
       PorterDuff.Mode.DST_ATOP 取上层图像非交集部门与下层图像交集部门 
       PorterDuff.Mode.XOR 取两层图像的非交集部门

画图示例(画圆角矩形轨迹 常用语市面上流行的poker倒计时):

package com.k.gameview;import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff.Mode;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Region;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;public class GameView1 extends View implements Runnable {/* 声明Paint对象 */private Paint mPaint = null;public GameView1(Context context) {super(context);/* 构建对象 */mPaint = new Paint();/* 开启线程 */new Thread(this).start();}float arc;public void onDraw(Canvas canvas) {super.onDraw(canvas);if(arc>360)arc=0;/* 设置画布的颜色 */canvas.drawColor(Color.BLACK);/* 设置取消锯齿效果 */mPaint.setAntiAlias(true);mPaint.setAlpha(255);if(arc>200){mPaint.setColor(Color.YELLOW);}else{mPaint.setColor(Color.GREEN);}mPaint.setStyle(Paint.Style.STROKE);mPaint.setStrokeWidth(5);RectF rf = new RectF(10, 10, 90, 140);canvas.drawRoundRect(rf, 10, 10, mPaint);mPaint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));mPaint.setAlpha(0);mPaint.setStyle(Paint.Style.FILL);canvas.drawArc(new RectF(-100, -75, 200, 225), 240, arc, true, mPaint);arc+=2.5;}// 触笔事件public boolean onTouchEvent(MotionEvent event) {return true;}// 按键按下事件public boolean onKeyDown(int keyCode, KeyEvent event) {return true;}// 按键弹起事件public boolean onKeyUp(int keyCode, KeyEvent event) {return false;}public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event) {return true;}public void run() {while (!Thread.currentThread().isInterrupted()) {try {Thread.sleep(100);} catch (InterruptedException e) {Thread.currentThread().interrupt();}// 使用postInvalidate可以直接在线程中更新界面
            postInvalidate();}}
}

  

注注:部分内容来源网络

转载于:https://my.oschina.net/yolinfeng/blog/408091

Android学习笔记(四):android画图之paint之setXfermode相关推荐

  1. Android学习笔记:Android基础知识点(不断更新中)

    1.Android学习笔记:OkHttp 2.Android学习笔记:更新UI的方法(UI线程和非UI线程) 3.Android学习笔记:Volley 4.Android学习笔记:Handler 5. ...

  2. Android学习笔记(Android Studio)3-3(ProgressBar ProgressDialog)(加载进度条、转圈圈)UI组件之弹出组件

    Android学习笔记3-3 推荐新手向学习视频:B站https://www.bilibili.com/video/av38409964点我传送 3-3 ProgressBar & Progr ...

  3. Android学习笔记四十Preference使用

    Preference直译为偏好,博友建议翻译为首选项.一些配置数据,一些我们上次点击选择的内容,我们希望在下次应用调起的时候依旧有效,无须用户再一次进行配置或选择.Android提供preferenc ...

  4. Pro Android学习笔记 四八 ActionBar 1 Home图标区

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! Acti ...

  5. Android 学习笔记四:创建工具栏按钮

    原文:http://blog.csdn.net/lihongxun945/article/details/48951199 前面我们已经可以在一个Activity中添加一些按钮之类的组件.由于手机的屏 ...

  6. [Android学习笔记四] 自定义Android组件之组合方式创建密码框组件

    Android中所有控件(也称组件)都继承自adnroid.view.View类,android.view.ViewGroup是View类的重要子类,绝大多书的布局类就继承自ViewGroup类. 参 ...

  7. Android学习笔记之Android Studio添加新的Activity

    1.创建Android项目工程:AndroidTest 创建过程可参考网上诸多教程. 2.添加新的Activity,步骤如下 a. 在layout文件夹上右键,New-Activity-相应Activ ...

  8. Android学习笔记之android:collapseColumns,android:shrinkColumns和stretchColumn

    TableLayout是一个使用复杂的布局,最简单的用法就仅仅是拖拉控件做出个界面,但实际上,会经常在代码里使用TableLayout,例如做出表格的效果.本文主要介绍TableLayout的基本使用 ...

  9. Android学习笔记之 android:collapseColumns ,android:shrinkColumns 和stretchColumns

    TableLayout是一个使用复杂的布局,最简单的用法就仅仅是拖拉控件做出个界面,但实际上,会经常在代码里使用TableLayout,例如做出表格的效果.本文主要介绍TableLayout的基本使用 ...

最新文章

  1. 在树莓派中开发 opencv 大型程序
  2. 升级pip后出错:无法导入名称“ main”
  3. HTML基础标签入门
  4. ASP.NET Core Razor 标签助手 - ASP.NET Core 基础教程 - 简单教程,简单编程
  5. VisualStudio代码样式-我最喜欢的一种风格
  6. 揭秘TensorFlow:Google开源到底开的是什么?
  7. 关于Infobright的一个小TIPS
  8. php 数组区删除重复的,php – 从数组中删除重复的项目
  9. matlab中now函数_now()方法以及JavaScript中的示例
  10. Windows底层窗口的实现———学习笔记
  11. 利用OpenIPMI监控服务器温度
  12. 请自行检查是否安装VC9运行库??
  13. STM32中RTC唤醒停止模式
  14. 计算机基础知识表格斜线,怎么在excel中画斜线-制作好看的Excel表格必备技能:3秒制作斜线表头,简单到没朋友...
  15. 外媒分析:为何说苹果一定没造车!
  16. spring的工作原理介绍
  17. c语言中cap捕捉函数,CAP理论的理解
  18. Vortex: 一种基于RISC-V指令集自定义扩展的开源GPGPU架构
  19. 产品版本、软件版本、文档版本定义
  20. ESP01 连接OneNet平台

热门文章

  1. Java 里面 final 与 static
  2. fetchrow_array()与fetchrow_arrayref()与fetchrow_hashref()的使用方法
  3. 2019web前端全新面试题库 一
  4. PowerDesigner模型分类
  5. MySQL如何用一条SQL将一张表里的数据插入到另一张表
  6. union all查询统计总数量
  7. python基础===字符串的制表,换行基础操作
  8. Jenkins构建jmeter进行接口测试的一些配置
  9. 在SQL中用正则表达式替换html标签
  10. Powershell 查询SQL数据库资料