资讯详情

Android——Paint.setXfermode(Xfermode xf)相关

一、参数Xfermode有三种子类:

AvoidXfermode

PixelXfermode

PorterDuffXfermode

找不到前两种,所以介绍最后一种:PorterDuffXfermode

二、PorterDuffXfermode它是一种图形混合模式,其中列举了18种混合模式:

(其中Sa = src alpha 源图像透明度,Sc = src color 源图像颜色,Da = destination alpha 目标图像透明度,Dc = destination color 目标图像颜色)

  1. CLEAR /** [0, 0] */

    因为所有像素点都显示空白alpha和color都是0

  2. SRC /** [Sa, Sc] */

    只保留源图像color和alpha

  3. DST /** [Da, Dc] */

    只保留目标图像color和alpha

  4. SRC_OVER /** [Sa (1 - Sa)*Da, Rc = Sc (1 - Sa)*Dc] */

    绘制源图像,在源图像素点的其他地方绘制目标图像、源颜色和源图像

  5. DST_OVER /** [Sa (1 - Sa)*Da, Rc = Dc (1 - Da)*Sc] */

    绘制源图像,在源图像素点的其他地方绘制目标图像、目标颜色和目标图像的其他用源颜色

  6. SRC_IN /** [Sa * Da, Sc * Da] */

    绘制源图像与目标图像的交集,用源图像的颜色受目标图像透明度的影响

  7. DST_IN /** [Sa * Da, Sa * Dc] */

    绘制源图像与目标图像的交集,受源图像透明度的影响

  8. SRC_OUT (7) /** [Sa * (1 - Da), Sc * (1 - Da)] */

    在没有目标图像的地方绘制源图像,用源图像的颜色,颜色的透明度与目标图像的透明度相反

  9. DST_OUT (8) /** [Da * (1 - Sa), Dc * (1 - Sa)] */

    在没有源图像的地方绘制目标图像,用目标图像颜色,颜色的透明度与源图像的透明度相反

  10. SRC_ATOP (9) /** [Da, Sc * Da (1 - Sa) * Dc] */

    目标图像(相交部分)的正常绘制受目标透明度影响,目标颜色部分与源图透明度相反

  11. DST_ATOP (10) /** [Sa, Sa * Dc Sc * (1 - Da)] */

    源图像的正常绘制受源图像透明度的影响,源图像的颜色部分与目标图像的透明度相反

  12. XOR (11) /** [Sa Da - 2 * Sa * Da, Sc * (1 - Da) (1 - Sa) * Dc] */

    正常绘制两幅图片不相交的部分(相交部分)源图像的颜色部分与目标图片的透明度相反,目标颜色部分与源图片的透明度相反

  13. DARKEN /** [Sa Da - Sa*Da , Sc*(1 - Da) Dc*(1 - Sa) min(Sc, Dc)] */

    画图像(相交部分,先如XOR相交部分显示)最后混合一层较暗的颜色(不完全不透明时,按上述公式叠加一层较暗的颜色,完全不透明时显示黑色)

  14. LIGHTEN /** [Sa Da - Sa*Da , Sc*(1 - Da) Dc*(1 - Sa) max(Sc, Dc)] */

    画图像(相交部分,先如XOR相交部分显示)最后混合一层明亮的图像(不完全不透明时,按上述公式叠加一层明亮的颜色,完全不透明时显示白色)

  15. MULTIPLY /** [Sa * Da, Sc * Dc] */

    绘制两幅图的交叉部分,颜色是两幅图的叠加,eg:蓝 红=紫

  16. SCREEN /** [Sa Da - Sa * Da, Sc Dc - Sc * Dc] */

    绘制两张图片,重叠部分保留白色一侧(感觉像白色一侧,下面显示黑色)

  17. ADD /** Saturate(S D) */

    饱和度叠加

  18. OVERLAY

叠加。像素是进行的 Multiply (正片叠底)混合 Screen (屏幕)混合取决于底色,但保留底色的亮度细节和阴影;

三、使用方法:

  1. 首先绘制目标图像

  2. 设置Xfermode,选择上述18中的一种

  3. 绘制源图像,会根据setXfermode绘制最终图像的属性。

    @Override     protected void onDraw(Canvas canvas) {         super.onDraw(canvas);         canvas.drawColor(Color.WHITE);         int saveCount = canvas.saveLayer(0,0,1200,1300,mPaint);///画一个白色的底部         mPaint.setColor(Color.YELLOW);         canvas.drawCircle(200,200,200,mPaint);///绘制目标图像:黄色圆         mPaint.setXfermode(porterDuffXfermode1);//设置模式         mPaint.setColor(Color.BLUE);         canvas.drawRect(rect,mPaint);//画源图像:蓝色矩形,画后会显示叠加后的样子         mPaint.setXfermode(null);///置空模式         canvas.restoreToCount(saveCount);      }

参考链接:Android Paint之 setXfermode PorterDuffXfermode 讲解_GAStudio的博客-CSDN博客_android porterduffxfermode

标签: avul5da1风速变送器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台