Android 理解PorterDuffXfermode叠加模式

Android图形混合模式Xfermode详解与实战应用 图形混合模式是计算机图形学中的基础概念,通过数学运算实现多个图层的像素级合成。在Android开发中,Xfermode作为核心混合机制,基于经典的Porter-Duff算法提供16种混合模式,包括SRC_OVER、SRC_IN等常用操作。这种技术不仅能实现圆形头像遮罩、刮刮卡等常见UI效果,还能通过多层混合实现专业图像滤镜。从工程实践角度看,合理使用ARGB_8888配置、离屏渲染优化和硬件加速控制能显著提升性能。掌握Xfermode原理对开发高性能自定义视图和复杂动画效果具有重要意义,特别是在电商APP的 阅读详情
关于PorterDuffXfermode的讲解在网上有很多相关的教程,以下只是针对我自己在使用过程中遇到的问题做补充说明:


以上所有格子应该看做一张图片(包括图片的大小)

src需要是一张图片,才能体现周边的透明度
怎么理解这句话呢?
如果在View的Canvas上绘制src,比如drawCircle(xxx),所代表的区域仅仅是圆形的区域或圆环的区域,此刻的相互影响部分也只有这部分圆形区域
而一张内部包含圆形,其他为透明的图片的影响区域是这个图片的整个矩形区域

如图:黑色边框表示影响区域
 
Bitmap


drawCircle


比如设置SRCIN模式


因为只影响红色框内的区域,所以其他位置不发生改变



-------------------------------------------------------------
代码实例:

2张图片的叠加(如果是dst直接在View的canvas上绘制的话,透明部分会变成黑色)
private void init() {
paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setStyle(Paint.Style.FILL);

//初始化2张大小一样的图片,因为只有一样大的图片src才会影响dst的整个区域
dst = Bitmap.createBitmap(250, 250, Bitmap.Config.ARGB_8888);
src = Bitmap.createBitmap(250, 250, Bitmap.Config.ARGB_8888);

initSrc();
initDst();
}

private void initDst() {
Canvas canvas = new Canvas(dst);
paint.setColor(Color.TRANSPARENT);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
canvas.drawPaint(paint);//清空Bitmap内容
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC));
paint.setColor(Color.YELLOW);
canvas.drawCircle(100, 100, 100, paint);//绘制黄色的圆
}

private void initSrc() {
Canvas canvas = new Canvas(src);
paint.setColor(Color.TRANSPARENT);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
canvas.drawPaint(paint);//清空Bitmap内容
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC));
paint.setColor(Color.BLUE);
canvas.drawRect(100, 100, 250, 250, paint);//绘制蓝色的矩形
}

@Override
protected void onDraw(Canvas canvas) {
//初始化一张dst图片(黄色的圆)
initDst();
//初始化一张src图片(蓝色的矩形)
initSrc();

//在dst图片的基础上绘制src图片
Canvas c = new Canvas(dst);
paint.setXfermode(xmode);
c.drawBitmap(src, 0, 0, paint);

//将最终结果图绘制到canvas
paint.setXfermode(null);
canvas.drawBitmap(dst, 0, 0, paint);
}

-----------------------------------------------------------------------

绘制带透明的Bitmap
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OVER));
canvas.drawBitmap(src, 0, 0,paint);


深入AutoSar诊断协议栈:当ECU报故障时,FiM模块是如何悄悄“阉割”功能的? 本文深入解析AutoSar诊断协议栈中FiM模块的工作原理,揭示ECU报故障时如何通过Inhibition Counter和位运算技术实现功能静默降级。探讨FiM在故障处理链中的关键角色,包括功能权限仲裁、降级策略执行和系统安全兜底,并分享实战调试技巧与进阶应用案例。 阅读详情

相关推荐

SECS/GSM 测试工具 SecsExpress 的配置与实战应用

本文详细介绍了半导体设备通讯测试工具SecsExpress的配置与实战应用。作为专业的SECS/GSM协议调试工具,它能模拟Host与设备端进行双向测试,帮助工程师快速部署、验证通讯链路,并高效排查与RMS系统或真实设备间的联调问题,是提升半导体工厂设备集成与维护效率的利器。

yhn456789的博客 299

Android 图形混合模式PorterDuffXfermode模式介绍

一、PorterDuffXfermode模式介绍PorterDuffXfermode是设置两个图层的交集区域的显示方式,分为目标图像(先画的图片)和源图像(后画的图片),图解如下:简单说目标图像是底片,源图像是封面先看一下官方的样图两个图形一圆一方通过设置不同的模式会产生不同的组合效果,在API中Android为我们提供了18种(比上图多了两种ADD和OVERLAY)模式: ADD:       ...

0729Liang 4321

从GitHub到海浪模拟:手把手教你配置WAVEWATCHⅢ 6.07.0的完整开发与测试环境

本文详细指导如何在Ubuntu系统中配置WAVEWATCHⅢ 6.07.0的开发与测试环境,涵盖虚拟机设置、依赖安装、源码编译及案例验证的全流程。通过步骤化教程,帮助科研人员快速搭建高效的海浪模拟平台,提升海洋数值模拟的研究效率。

weixin_42568801的博客 326

Android 叠加布局

由于FrameLayout的特性是子视图按照添加的顺序从下至上显示,所以底部视图(background)会先显示,然后再显示顶部视图(overlay),从而实现叠加的效果。等约束属性,我们实现了顶部视图叠加在底部视图之上,并与底部视图四边对齐的效果。以上是三种常见的在Android中实现叠加布局的方法,你可以根据自己的实际需求选择合适的布局容器进行布局。当涉及Android布局时,FrameLayout是一种非常常用的布局管理器,它允许子视图堆叠在一起,并通过Z轴来控制它们的显示顺序。

牛肉胡辣汤 2185

Halcon Camera-calibration 相关算子(一)

Halcon Camera-calibration 相关算子介绍

qq_44744164的博客 1367

基于 Qt C++ 的 2D 动画制作工具

你可以修改它的中心坐标 (X, Y)、宽度 (W)、高度 (H),或点击 "选择颜色" 按钮改变其填充色。* **图形视图 (`QGraphicsView` 和 `QGraphicsScene`)**: 用于显示和编辑当前帧的内容。

寒寒豆豆软件公司的博客 117

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

利用PorterDuffXfermode,绘制组合图形,过程我分成了4个步骤(onDraw方法里面):      1、通过canvas.saveLayout()先绘制一个背景图层(这里位置大小很重要,应该根据覆盖层来定义)(如果没有背景层,产生效果可能和预期不太一样)      2、canvas.drawXXX()画底部图形Dst;      4、paint.setXfermode()设置图

止水 4530

【阿里AgentScope框架】多框架组合:AgentScope加LangChain,让你的开发效率直线上升

本文以一个例子来看下AgentScope框架和LangChain如何实现融合使用,真的超级简单,一看就懂。这是一种思路,为多种框架的融合使用提供借鉴。

同学小张的博客 3474

android图片特效处理之图片叠加

这篇将讲到图片特效处理的图片叠加效果。跟前面一样是对像素点进行处理,可参照前面的android图像处理系列之七--图片涂鸦,水印-图片叠加和android图像处理系列之六--给图片添加边框(下)-图片叠加两篇文章,此篇所讲的与之前有一点区别。叠加原理是两张图片的像素点按透明度叠加,不会进行颜色过滤。叠加图片可以是JPG格式,跟前在一样,最好是放大assets目录。下面看效果图: += 代码:

落日小屋 1万+

OPENSSL使用方法

预备知识KEY 通常指私钥。CSR 是 Certificate Signing Request 的缩写,即证书签名请求,这不是证书,只是包含申请证书的基本信息。生成证书时要把这个提交给权威的证书颁发机构,颁发机构审核通过之后,再根据这些申请信息生成相应的证书。CRT 即 certificate的缩写,即证书。 X.509 是一种证书格式。对X.509证书来说,认证者总是CA或由CA指定的人,一份...

zxm8513优快云博客 1216

YOLO26全网首发:CVPR2026 FAA| 解决YOLO Neck跨尺度方向冲突--- FAAFusion频域对齐融合模块 | 暴力涨点篇

本文改进:FAAFusion引入YOLO neck ,代替nn.Upsample和Concat

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 644

Android Bitmap 透明度(Picture 透明度)

Android可透过 Paint 物件,来设定Bitmap透明度. Java 程式范例 : public class helloWorld extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceS

大江的专栏 7201

Intellij IDEA 使用教程(一)Jdk安装和配置

一.JDK下载 这里下载的是Java SE 8u181 64位版本。可以根据自己电脑配置来选择不同版本。 官网下载JDK 二.安装JDK 双击运行jdk-8u181-windows-x64.exe安装程序 选择安装目录,然后点击下一步 等待安装 安装JRE,就是java的运行环境,可以安装在java目录下 等待安装 安装完成。点击关闭。 三.java环境变量配置 关于环境变量的配置,...

岁月不饶人,我亦未曾饶过岁月 4060

PorterDuffXfermode与圆角图片

在项目开发中,我们常用到这样的功能:显示圆角图片。这个是咋做的呢?我们来瞅瞅其中一种实现方式

谷哥的小弟 577

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

android 画布叠加,Android自定义图形,图形的拼接、叠加、相容

直接上Xfermode子类:AvoidXfermode 指定了一个颜色和容差,强制Paint避免在它上面绘图(或者只在它上面绘图)。PixelXorXfermode 当覆盖已有的颜色时,应用一个简单的像素XOR操作。PorterDuffXfermode 这是一个非常强大的转换模式,使用它,可以使用图像合成的16条Porter-Duff规则的任意一条来控制Paint如何与已有的Canvas图像...

weixin_29363945的博客 655

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Android PorterDuffXfermode简介

本文转载自:https://www.cnblogs.com/libertycode/p/6290497.html 一、Xfermode Xfermode国外有大神称之为过渡模式,这种翻译比较贴切但恐怕不易理解,大家也可以直接称之为图像混合模式,因为所谓的“过渡”其实就是图像混合的一种,这个方法跟setColorFilter蛮相似的。查看API文档发现Xfermode有三个子类:AvoidXfe...

Robin Hu的专栏 1850

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

PorterDuffXfermode

通过PorterDuffXfermode设置圆角/圆形图片: 效果图: /** * 圆或圆角图片 * @param bitmap * @param drawcircle 是否绘制圆 * @return */ public Bitmap toRoundBitmap(Bitmap bitmap,boolean drawcircle

Mr.Hu 6021

PorterDuffXfermode使用

PorterDuffXfermode使用

Stronger熊 2107

PorterDuffXfermode的用法

android.graphics.Paint public Xfermode setXfermode (Xfermode xfermode) Set or clear the xfermode object. Pass null to clear any previous xfermode.  As a convenience, the parameter passed is also re

heng615975867的专栏 706

Android PorterDuffXfermode 的几种模式及效果

原图 目标图 sourceImage destinationImage 操作 Paint paint = new Paint();   canvas.drawBitmap(destinationImage, 0, 0, paint);   PorterDuff.Mode mod...

MrZhangNo1的博客 418

Android制作圆形的头像---最明确的PorterDuffXfermode的学习文档

查看了很多的博客,就是想弄清楚怎样利用PorterDuffXfermode制作圆形的头像效果,但是很多的博客根本没有实现这样效果,有些博客虽然实现效果,但是很难理解使用PorterDuffXfermode流程,经过一段时间研究,总结出以下步骤: 1.单独为每个bitmap都创建一个Canvas画布 2.使用PorterDuffXfermode进行叠加的时候,要从具有底图的画布上进行绘制上层图像...

yuezheyue123的博客 292

深入源码:android_maskable_layout 如何用dispatchDraw与Bitmap实现布局遮罩?

想把 Android 布局裁剪成圆形头像、星形徽章、气泡形状……`android_maskable_layout` 就是为此而生的轻量级开源库。它提供的 `MaskableFrameLayout` 容器,只需几行 XML 配置就能给任意子 View 加上遮罩效果,还支持逐帧动画遮罩和多达 18 种 PorterDuff 混合模式。本文将从零拆解它用 dispatchDraw 与 Bitmap 实现

gitblog_00150的博客 1026

android PorterDuffXfermode

android.graphics.Paint public Xfermode setXfermode (Xfermode xfermode) Set or clear the xfermode object. Pass null to clear any previous xfermode.  As a convenience, the parameter passed is also re

legend12300的专栏 584

一文看懂android_maskable_layout的18种PorterDuff混合模式:图文效果对照大全

android_maskable_layout 是一款轻量级的 Android 开源遮罩布局库,它基于 FrameLayout 封装,让开发者可以像给照片贴贴纸一样,把任意 View 或 ViewGroup 裁剪成圆形、星形甚至不断变化的动画形状。实现这一切的核心机制,正是 Android 图形系统里的 PorterDuff 混合模式(PorterDuff 混合模式)。本文将带你一文看懂库中内置的

gitblog_01038的博客 907

PorterDuffXfermode图片重叠过渡模式

原文  http://blog.youkuaiyun.com/panda1234lee/article/details/8722386 图像合成,是将两幅退昂放在一起的动作,它使得我们能够同时看到两幅图像的特征。 我们可以首先在Canvas对象上绘制一个位图对象,然后再相同的Canvas对象上绘制第二个位图对象的方式来实现合成。不过这里在绘制第二幅图像的时候,需要在Paint对象上指定

jbfandroid123的专栏 633

Android canvas详解(不断更行ing)

Canvas在Android里是一个重要的类,主要功能显而易见,用于绘图,说这个类重要,除了基本的绘图功能,主要原因在于每一个控件都离不开它,尤其是当我们自定义一个控件时在onDraw方法里,主要利用canvas这个类去处理,而这个类方法众多,能实现的功能也很多,今天开始不间断更新相关内容,大家也一起讨论下: step  1:旋转 也就是涉及到canvas.rotate相关的方法

GIS小生的记录 1200
上一篇: Android 关于路径Path的那些效果
下一篇: Android OpenGL_ES2.0 ViewPort 显示在屏幕的哪块区域?
fz_dev
博客等级 码龄10年 0粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值