图形绘制中的PorterDuffXfermode

简介:

1、概述

Android图形渲染中 会使用到图像混合模式 

[java]  view plain  copy
  1. <span style="font-size:18px;">setXfermode(Xfermode xfermode)</span>  

Xfermode有三个子类

AvoidXfermode, PixelXorXfermode,这俩个均已经被淘汰
只剩 【PorterDuffXfermode】,这个模式是由俩个大牛Tomas Proter和Tom Duff名字来命名的,PorterDuffXfermode模式能为android图形渲染做啥呢,先来张经典图片

咋看有点晕,先解释一下

1.PorterDuff.Mode.CLEAR   :所绘制不会提交到画布上。
2.PorterDuff.Mode.SRC :  显示上层绘制图片
3.PorterDuff.Mode.DST : 显示下层绘制图片
4.PorterDuff.Mode.SRC_OVER :  正常绘制显示,上下层绘制叠盖。
5.PorterDuff.Mode.DST_OVER : 上下层都显示。下层居上显示。
6.PorterDuff.Mode.SRC_IN :  取两层绘制交集。显示上层。
7.PorterDuff.Mode.DST_IN :取两层绘制交集。显示下层。
8.PorterDuff.Mode.SRC_OUT :取上层绘制非交集部分。
9.PorterDuff.Mode.DST_OUT : 取下层绘制非交集部分。
10.PorterDuff.Mode.SRC_ATOP :取下层非交集部分与上层交集部分
11.PorterDuff.Mode.DST_ATOP : 取上层非交集部分与下层交集部分
12.PorterDuff.Mode.XOR : 异或:去除两图层交集部分
13.PorterDuff.Mode.DARKEN :取两图层全部区域,交集部分颜色加深
14.PorterDuff.Mode.LIGHTEN : 取两图层全部,点亮交集部分颜色
15.PorterDuff.Mode.MULTIPLY : 取两图层交集部分叠加后颜色
16.PorterDuff.Mode.SCREEN : 取两图层全部区域,交集部分变为透明色

后来还新增了俩种模式 ADD和OVERLAY

17.PorterDuff.Mode.ADD 饱和度叠加


18.PorterDuff.Mode.OVERLAY: 直接叠加


2、示例代码、

下面听过俩个例子来熟悉一下使用

首先来定义一个获取屏幕宽和高的工具代码

[java]  view plain  copy
  1. <span style="font-size:18px;">public class ScreenMeasureUtil {  
  2.     //同时获取宽高  
  3.     public static int[] getScreenHW(Activity activity) {  
  4.         DisplayMetrics metrics = new DisplayMetrics();  
  5.         activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);  
  6.         int Height = metrics.heightPixels;  
  7.         int Width = metrics.widthPixels;  
  8.         int HW[] = new int[]{Height, Width};  
  9.     }  
  10.       
  11. }</span>  


 橡皮擦效果

自定义一个eraser的view,然后在之布局文件中引入这个控件即可 EraserView.Java,注释很详细,这里使用了DST_IN模式(使用dst_out效果一样)

[java]  view plain  copy
  1. <span style="font-size:18px;">public class EraserView extends View {  
  2.     //屏幕宽高  
  3.     private int[] screenSize;  
  4.     private int screenH;  
  5.     private int screenW;  
  6.     //PorterDuff Mode  
  7.     private static final PorterDuff.Mode PD_MODE = PorterDuff.Mode.DST_IN;  
  8.     private static final int MIN_MOVE_DIS = 5;//最小的移动距离:如果我们手指在屏幕上的移动距离小于此值则不会绘制  
  9.     private float preTouchX, preTouchY;  
  10.     //绘图  
  11.     private Canvas mCanvas; //画布  
  12.     private Paint mPaint;//画笔  
  13.     private Path mPath;//路径  
  14.     //前后背景  
  15.     private Bitmap fgBitmap, bgBitmap;  
  16.   
  17.     public EraserView(Context context, AttributeSet attrs) {  
  18.         super(context, attrs);  
  19.         screenSize = ScreenMeasureUtil.getScreenHW((Activity) context);  
  20.         screenH = screenSize[0];  
  21.         screenW = screenSize[1];  
  22.   
  23.         initViews(context);  
  24.   
  25.   
  26.     }  
  27.   
  28.     private void initViews(Context context) {  
  29.         //实例化路径对象  
  30.         mPath = new Path();  
  31.   
  32.         //实例化画笔开启抗锯齿和抗抖动  
  33.         mPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);  
  34.         //画笔风格为描边  
  35.         mPaint.setStyle(Paint.Style.STROKE);  
  36.         //笔触类型为圆角  
  37.         mPaint.setStrokeJoin(Paint.Join.ROUND);  
  38.         //设置描边  
  39.         mPaint.setStrokeCap(Paint.Cap.ROUND);  
  40.         //设置描边宽度  
  41.         mPaint.setStrokeWidth(20);  
  42.         //设置混合模式  
  43.         mPaint.setXfermode(new PorterDuffXfermode(PD_MODE));  
  44.         //此处采用的是DST_IN模式必须要将画笔透明度设置为0  
  45.         mPaint.setARGB(12825500);  
  46.   
  47.   
  48.         //前景图片的bitmap  
  49.         fgBitmap = Bitmap.createBitmap(screenW, screenH, Bitmap.Config.ARGB_8888);  
  50.         //填充进画布  
  51.         mCanvas = new Canvas(fgBitmap);  
  52.         //绘制画布背景颜色为灰色  
  53.         mCanvas.drawColor(0xffacacac);  
  54.         //获取底面背景图片  
  55.         bgBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.bg_splash);  
  56.         //缩放bitmap至屏幕大小  
  57.         bgBitmap = Bitmap.createScaledBitmap(bgBitmap, screenW, screenH, true);  
  58.     }  
  59.   
  60.     @Override  
  61.     protected void onDraw(Canvas canvas) {  
  62.         //绘制背景  
  63.         canvas.drawBitmap(bgBitmap, 00null);  
  64.         //绘制前景  
  65.         canvas.drawBitmap(fgBitmap, 00null);  
  66.         mCanvas.drawPath(mPath, mPaint);  
  67.     }  
  68.   
  69.     @Override  
  70.     public boolean onTouchEvent(MotionEvent event) {  
  71.   
  72.         float x = event.getX();  
  73.         float y = event.getY();  
  74.         switch (event.getAction()) {  
  75.             case MotionEvent.ACTION_DOWN:  
  76.                 mPath.reset();  
  77.                 mPath.moveTo(x, y);  
  78.                 preTouchX = x;  
  79.                 preTouchY = y;  
  80.                 break;  
  81.             case MotionEvent.ACTION_MOVE:  
  82.                 float dx = Math.abs(x - preTouchX);  
  83.                 float dy = Math.abs(y - preTouchY);  
  84.                 if (dx >= MIN_MOVE_DIS || dy >= MIN_MOVE_DIS) {  
  85.                     mPath.quadTo(preTouchX, preTouchY, (x + preTouchX) / 2, (y + preTouchY) / 2);  
  86.                     preTouchX = x;  
  87.                     preTouchY = y;  
  88.                 }  
  89.                 break;  
  90.   
  91.         }  
  92.         //重绘视图  
  93.         invalidate();  
  94.         return true;  
  95.   
  96.     }  
  97. }  
  98. </span>  



转载:http://blog.csdn.net/xsf50717/article/details/49822179

目录
相关文章
|
6月前
|
前端开发 JavaScript 定位技术
threejs绘制风羽
threejs绘制风羽
85 0
|
9月前
Easyx绘制基本图形
Easyx绘制基本图形
|
10月前
|
算法 数据可视化 Windows
【Win32绘图编程,GDI绘图对象】绘图基础,位图处理,绘图消息处理,画笔,画刷,文本绘制(下)
【Win32绘图编程,GDI绘图对象】绘图基础,位图处理,绘图消息处理,画笔,画刷,文本绘制
|
10月前
|
API 图形学
【Win32绘图编程,GDI绘图对象】绘图基础,位图处理,绘图消息处理,画笔,画刷,文本绘制(上)
【Win32绘图编程,GDI绘图对象】绘图基础,位图处理,绘图消息处理,画笔,画刷,文本绘制
|
前端开发
Delphi绘图功能[1] —— 入门(绘制直线和矩形)
Delphi绘图功能[1] —— 入门(绘制直线和矩形)
344 0
Delphi绘图功能[1] —— 入门(绘制直线和矩形)
绘图
绘图
64 0
|
定位技术
Threejs使用Shapes实现不规则几何体,自定义绘图
Threejs使用Shapes实现不规则几何体,自定义绘图
771 0
Threejs使用Shapes实现不规则几何体,自定义绘图
OpenGL几种简单图形的绘制
圆、五角星、正弦函数图形的绘制
299 0
48.绘图技巧
配色推荐网址 colour.adobe.com 案例 知识在于点滴积累
636 0