当前位置:   article > 正文

Paint(画笔)setXfermode的设置PorterDuffXfermode特效模式_final paint paint = new paint(paint.anti_alias_fla

final paint paint = new paint(paint.anti_alias_flag);

一、为什么只说PorterDuffXfermode?

Paint的setXfermode(Xfermode xfermode)方法设置的是两个图像重叠时候的混合显示模式

参数中Xfermode只有一个PorterDufferXfermode还一直使用,其他的都被废弃了!

二、图形混合模式 PorterDuffXfermode类

该类有且只有一个含参的构造方法PorterDuffXfermode(PorterDuff.Mode mode)

这个参数PorterDuff.Mode就表示一种混合模式,而PorterDuffXfermode表示这种图形混合模式的显示.

这些模式显示用下面这张比较俗套的图可以展示:

在API中Android为我们提供了18种(比上图多了两种ADD和OVERLAY)模式;

需要说一下上图中的绘制顺序是:

先画的是 黄色圆形】,后画的是 蓝色矩形】

所产生的混合效果,下面我们使用代码演示一下效果

三、代码展示PorterDuffXfermode类所有情形

先声明一下图层的融合要先保证背景是透明,不能有其他的颜色;所以最好要先使用saveLayer之后才会有效果

saveLayer方法相当于创建了一个透明的图层,在它上面进行图像的融合,正好可以!但必须是图层相同宽高的部分。

废话不多说,直接上代码了

  1. public class PorterDuffXfermodeView extends View {
  2. private final Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
  3. //定义图像间的混合显示模式
  4. //填入模式构建一个PorterDuffermode对象
  5. private final PorterDuffXfermode mXfermode = new PorterDuffXfermode(PorterDuff.Mode.SRC_OVER);
  6. private final Bitmap srcBitmap;//后画的Bitmap
  7. private final Bitmap dstBitmap;//先画的Bitmap
  8. private final int mScreenW;//屏幕宽度
  9. public PorterDuffXfermodeView(Context context, AttributeSet attrs) {
  10. super(context, attrs);
  11. //计算屏幕宽高
  12. WindowManager wm = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
  13. DisplayMetrics outMetrics = new DisplayMetrics();
  14. wm.getDefaultDisplay().getMetrics(outMetrics);
  15. mScreenW = outMetrics.widthPixels;
  16. dstBitmap = makeDst(mScreenW / 3.0f, mScreenW / 3.0f);//屏幕的宽度三等分
  17. srcBitmap = makeSrc(mScreenW / 3.0f, mScreenW / 3.0f);
  18. }
  19. //先绘制一个黄色圆形
  20. private Bitmap makeDst(float w, float h) {
  21. Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);
  22. p.setColor(0xFFFECF41);//黄色
  23. Bitmap bm = Bitmap.createBitmap((int) w, (int) h, Bitmap.Config.ARGB_8888);
  24. Canvas dstCanvas = new Canvas(bm);
  25. dstCanvas.drawCircle(w / 2, h / 2, w / 5, p);
  26. return bm;
  27. }
  28. //后绘制一个蓝色矩形
  29. private Bitmap makeSrc(float w, float h) {
  30. Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);
  31. p.setColor(0xFF63A9FE);//蓝色
  32. Bitmap bm = Bitmap.createBitmap((int) w, (int) h, Bitmap.Config.ARGB_8888);
  33. Canvas srcCanvas = new Canvas(bm);
  34. srcCanvas.drawRect(w / 2, h / 2, w * 4 / 5, h * 4 / 5, p);
  35. return bm;
  36. }
  37. @Override
  38. protected void onDraw(Canvas canvas) {
  39. //显示各组画一个圆形和矩形
  40. canvas.drawBitmap(dstBitmap, 0, 0, paint); // 先画的图形 DST
  41. canvas.drawBitmap(srcBitmap, mScreenW / 3.0f, 0, paint);// 后画的图形 SRC
  42. //在另一个图层上演示DST和SRC图形混合后的效果
  43. int sc = canvas.saveLayer(0, 0, getWidth(), getHeight(), null, Canvas.ALL_SAVE_FLAG);
  44. canvas.drawBitmap(dstBitmap, mScreenW * 2 / 3.0f, 0, paint);//先绘制圆形
  45. paint.setXfermode(mXfermode); //设置Xfermode混合模式
  46. canvas.drawBitmap(srcBitmap, mScreenW * 2 / 3.0f, 0, paint);//再绘制矩形
  47. // 还原画布
  48. canvas.restoreToCount(sc);
  49. }
  50. }

我们改变代码中的PorterDuff.Mode变量验证所有的混合模式,

上面代码解释:

  • 首先屏幕宽度1/3处区域绘制第一个要显示的黄色圆形
  • 然后屏幕宽度2/3处区域显示的蓝色矩形
  • 最后在剩下区域展示他们的混合模式

运行之后的效果图(按照那张模式图来展示):

PorterDuff.Mode.Clear

PorterDuff.Mode.Src

PorterDuff.Mode.Dst

PorterDuff.Mode.SrcOver

 

 

 

 

PorterDuff.Mode.DstOver

PorterDuff.Mode.SrcIn

PorterDuff.Mode.DstIn

PorterDuff.Mode.SrcOut

 

 

 

 

PorterDuff.Mode.DstOut

PorterDuff.Mode.SrcATop

PorterDuff.Mode.DstATop

PorterDuff.Mode.Xor

 

 

 

 

PorterDuff.Mode.Darken

PorterDuff.Mode.Lighten

PorterDuff.Mode.Multiply

PorterDuff.Mode.Screen

 

 

 

 

PorterDuff.Mode.ADD

PorterDuff.Mode.OVERLY

 

 

 

 

  

以上结果在华为和小米两台手机上分别验证,大部分模式都是和效果图一样的;

上面红色字体在小米手机上显示是有问题,出不来那个效果,俺也不知道怎么回事!!!华为手机都没有问题

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/332682
推荐阅读
相关标签
  

闽ICP备14008679号