Android Xfermode

Android自定义控件开发入门与实战(11)Xfermode 参数介绍:opColor:一个十六进制的AARRGGBB形式的颜色值tolerance:表示容差,这个概念我们后面再西江mode:取值为Mode.TARGET和Mode.AVOID。前者表示将指定颜色替换掉,后者表示将Mode.TARGET的相反区域颜色替换掉。示例一 替换颜色:这里以Mode.TARGET为例,来替换一些颜色。先准备一个控件并将它初始化,将paint设置为红色,表示之后他将用红色去取代别的颜色。 阅读详情

最近需要做类似于QQ裁剪头像的功能:

以前的我,肯定会糊里糊涂的copy网上的资料完事!!这样完全学不到东西,所以这次认真点,学习里面的“精髓”,虽然不难!

好了,这里会接触到Canvas的Xfermode与Layer的东西,在自定义View中可以实现很复杂的效果。

Xfermode

先稍微了解一下关于Xfermode,Xfermode称为图像混合模式,可以将不同的图像进行混合处理。

Xfermode有三个子类:AvoidXfermode, PixelXorXfermode和PorterDuffXfermode,由于AvoidXfermode, PixelXorXfermode都已经被标注为过时了,所以这次主要研究的是仍然在使用的PorterDuffXfermode。

PorterDuffXfermode混合的效果可以有:

效果说明:

  • CLEAR:清除图像
  • SRC:只显示源图像
  • DST:只显示目标图像
  • SRC_OVER:将源图像放在目标图像上方
  • DST_OVER:将目标图像放在源图像上方
  • SRC_IN:只在源图像和目标图像相交的地方绘制【源图像】
  • DST_IN:只在源图像和目标图像相交的地方绘制【目标图像】,绘制效果受到源图像对应地方透明度影响
  • SRC_OUT:只在源图像和目标图像不相交的地方绘制【源图像】,相交的地方根据目标图像的对应地方的alpha进行过滤,目标图像完全不透明则完全过滤,完全透明则不过滤
  • DST_OUT:只在源图像和目标图像不相交的地方绘制【目标图像】,在相交的地方根据源图像的alpha进行过滤,源图像完全不透明则完全过滤,完全透明则不过滤
  • SRC_ATOP:在源图像和目标图像相交的地方绘制【源图像】,在不相交的地方绘制【目标图像】,相交处的效果受到源图像和目标图像alpha的影响
  • DST_ATOP:在源图像和目标图像相交的地方绘制【目标图像】,在不相交的地方绘制【源图像】,相交处的效果受到源图像和目标图像alpha的影响
  • XOR:在源图像和目标图像相交的地方之外绘制它们,在相交的地方受到对应alpha和色值影响,如果完全不透明则相交处完全不绘制
  • DARKEN:变暗,较深的颜色覆盖较浅的颜色,若两者深浅程度相同则混合
  • LIGHTEN:变亮,与DARKEN相反,DARKEN和LIGHTEN生成的图像结果与Android对颜色值深浅的定义有关
  • MULTIPLY:正片叠底,源图像素颜色值乘以目标图像素颜色值除以255得到混合后图像像素颜色值
  • SCREEN:滤色,色调均和,保留两个图层中较白的部分,较暗的部分被遮盖

关于Xfermode的了解先到这个。

使用Xfermode

先简单写一个自定义的View,熟悉一下Canvas:

public class Preview extends View {

    private Paint paint;

    public Preview(Context context) {
        this(context, null);
    }

    public Preview(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public Preview(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        paint = new Paint();
        paint.setAntiAlias(true);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        // 画透明层
        // 注意:一定要先设置颜色,然后再设置透明度才会起效果
        paint.setColor(Color.BLACK);
        // 透明度 0(完全透明)- 255(完全不透明)
        paint.setAlpha(150);
        canvas.drawRect(0, 0, getWidth(), getHeight(), paint);
        // 画圆圈
        int radius = getWidth() / 3;
        paint.setColor(Color.WHITE);
        paint.setAlpha(255);
        paint.setStrokeWidth(3);
        paint.setStyle(Paint.Style.STROKE);
        canvas.drawCircle(getWidth() / 2, getHeight() / 2, radius + 3, paint);
    }

}

布局文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <View
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@android:color/holo_orange_light"
        />

    <com.johan.magiceye.Preview
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</RelativeLayout>

效果如图:

OK,我们初步写了一个View,画了一个透明层,然后画了一个圆圈,接下来,我们需要把圆圈的透明层去掉。根据Xfermode的混合效果,我们需要的是SRC_OUT模式,我们修改一下onDraw()方法里面的代码:

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    // 画透明层 0 - 255
    paint.setColor(Color.BLACK);
    paint.setAlpha(150);
    canvas.drawRect(0, 0, getWidth(), getHeight(), paint);
    // 画圆圈
    int radius = getWidth() / 3;
    paint.setColor(Color.WHITE);
    paint.setAlpha(255);
    paint.setStrokeWidth(3);
    paint.setStyle(Paint.Style.STROKE);
    canvas.drawCircle(getWidth() / 2, getHeight() / 2, radius + 3, paint);
    // 去掉圆圈内的透明层
    paint.setStyle(Paint.Style.FILL);
    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT));
    canvas.drawCircle(getWidth() / 2, getHeight() / 2, radius, paint);
    paint.setXfermode(null);
}

效果如图:

如图,圆圈的透明层是去掉了,可是为什么会变成黑色呢??这里,你可能就开始懵逼了,为什么会这样呢??

这里我们就要来了解一下Canvas的Layer了。

Canvas是支持图层Layer渲染技术的,Canvas默认就有一个图层Layer,一般情况下,我们使用Canvas的drawXXX方法,都是在这层默认的Layer上面进行的。

所以我们使用SRC_OUT混合模式后,效果其实就是从src(源图像:整个透明层)中抠掉dest(目标图像:实心圆),显示黑色是因为默认Layer背景为黑色(猜测)。

既然Canvas支持多图层,那我们就新建一个图层(新建的图层背景为透明),然后再去drawXXX。

在Canvas中,使用saveLayer方法可以新建一个图层,使用restoreToCount方法把新图层的东西绘制到底部图层(这里是默认图层Layer)上。

好了,我们再来改一下onDraw()方法的代码:

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        // 新建图层
        int saveCount = canvas.saveLayer(0, 0, getWidth(), getHeight(), null, Canvas.ALL_SAVE_FLAG);
        // 画透明层 0 - 255
        paint.setColor(Color.BLACK);
        paint.setAlpha(150);
        canvas.drawRect(0, 0, getWidth(), getHeight(), paint);
        // 画圆圈
        int radius = getWidth() / 3;
        paint.setColor(Color.WHITE);
        paint.setAlpha(255);
        paint.setStrokeWidth(3);
        paint.setStyle(Paint.Style.STROKE);
        canvas.drawCircle(getWidth() / 2, getHeight() / 2, radius + 3, paint);
        // 去掉圆圈内的透明层
        paint.setStyle(Paint.Style.FILL);
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT));
        canvas.drawCircle(getWidth() / 2, getHeight() / 2, radius, paint);
        paint.setXfermode(null);
        // 恢复图层
        canvas.restoreToCount(saveCount);
    }

效果如图:

这样就实现了仿QQ头像裁剪的预览图了!

参考

Android Paint Xfermode 学习小结
Android中Canvas绘图之PorterDuffXfermode使用及工作原理详解

Android进阶——Xfermode图像混合模式 一、GPU硬件加速 GPU英文全称Graphic Processing Unit,中文翻译为“图形处理器”。与CPU不同,GPU是专门为处理图形任务而产生的芯片。 在GPU出现之前,CPU一直负责着所有的运算工作,CPU的架构是有利于X86指令集的串行架构,CPU从设计思路上适合尽可能快的完成一个任务。但当面对类似多媒体、图形图像处理类型的任务时,就显得力不从心。因为在多媒体计算中通常要求更高的运... 阅读详情

相关推荐

Android-高级-UI-进阶之路(四)-Paint-渲染-滤镜-xfermode-使用

文章所有资料全部已经打包整理好,另外小编手头上整理了大量Android架构师全套学习资料,Android核心高级技术PDF文档+全套高级学习资料+视频+2021 BAT 大厂面试真题解析资料展示:网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。需要这份系统化学习资料的朋友,可以戳这里获取一个人可以走的很快,但一群人才能走的更远!

2401_84519907的博客 775

android Xfermode

1 概述xfermode主要指图像的混合模式,在android中,paint可以设置不同的xfermode来达到不同的效果。 Xfermode有三个子类:AvoidXfermode,PixelXorXfermode,PorterDuffXfermode; 由于前面两个都已经被废弃,并且并不支持硬件加速,所以这里主要讲解PorterDuffXfermode。2 PorterDuffXfermode

文涛的专栏 2597

android遮罩Xfermode的学习

没有绝对的实力,就看运气吧。 先看看效果吧 根据官方APIDemo给出的Xfermode例子我们可以看到下图展示那样 但是,说实话,看到这张图,我是懵逼的,我们应该去自己试一试来加深下自己的理解,所以我画了下,得到的结果如下,仅供参考!最好自己试一试我先画的正方形,后画的圆 // paint.setXfermode(new PorterDuffXfermode(PorterDuff

z8z87878的博客 2286

Android自定义控件入门到精通--Xfermode

文章目录XfermodePorterDuff.Mode示例一:轨迹截图示例二:绘画板示例三:图片上色动画(进度演示?)Xfermode的脏区及解决办法示例四:刮刮卡效果 Xfermode Xfermode在Android高版本中只保留了一个实现类PorterDuffXfermode,在Android24及以下低版本中,你还可以看到另外两个实现类AvoidXfermode,PixelXorXfermode,高版本已移除了,这里就不展开讲了,其中AvoidXfermode可以用于做选区和选区填充,非常强大,但

Jhone_csdn的专栏 785

脆弱的冗余:链路聚合(LACP)中单条链路故障引发的网络震荡

show etherchannel summary# 查看聚合组中所有端口的标志位,健康状态应为 ‘P’ (Port-channel) 或 ‘SU’(Stand-up)。本次故障的核心教训是:网络系统对“部分故障”的容忍度和自愈能力,远比应对“完全故障”要重要和复杂得多。3.加强监控:部署网管系统,监控聚合端口的包错误计数、LACP状态变化频率,并设置阈值告警。标签: #链路聚合 #LACP故障 #网络冗余 #排障案例 #网络高可用性。修复链路:更换光模块、清洁光纤接口、检查物理线路。

danyth的博客 1983

STM32 HAL 硬件IIC驱动BNO085:从移植到姿态解算全流程解析(附源码)

本文详细解析了STM32 HAL库下硬件IIC驱动BNO085 IMU传感器的全流程,包括CubeMX配置、驱动移植、传感器初始化、Q格式数据处理及四元数转欧拉角解算。提供了完整的源码实现和常见问题解决方案,帮助开发者快速掌握高精度姿态测量技术。

palm99的专栏 1047

android中Xfermode的使用

通过使用Xfermode将绘制的图形的像素和Canvas上对应位置的像素按照一定的规则进行混合,形成新的像素,再更新到Canvas中形成最终的图形。 我们一个像素的颜色都是由四个分量组成,即ARGB,A表示的是我们Alpha值,RGB表示的是颜色 S表示的是源像素,源像素的值表示[Sa,Sc] Sa表示的就是源像素的Alpha值,Sc表示源像素的颜色值 D表示的是目标像素,目标像素的值表示[Da,...

SpringQi 2441

关于自制的《航空学报》latex模板(非官网模板)

《航空学报》的官网只提供了word模板,并且该期刊投稿只需要pdf版本不需要源文件。为方便latex爱好者撰写论文,提供该模板及说明给广大科研人士~

qq_37105055的博客 4692

Android绘图基础之xfermode & layer

转载请注明出处:http://blog.youkuaiyun.com/crazy1235/article/details/73835933 layer xfermode CLEAR DST SRClayerandroid的绘图机制有点类似于 [PhotoShop] 的方式!可以分成很多个图层(layer)每个图层绘制自己的内容,然后图层之间可以合并!(图片转自网络)Api 中关于图层的操作有如下几个函数: sa

crazy_jack 2105

Easymesh之拓扑模块(二)

介绍 easymesh 拓扑消息:Topo discovery、Topo notification、Topo query、Topo response

qq_53619687的博客 2152

深入解析report_timing:从基础参数到高级时序路径分析技巧

本文深入解析了静态时序分析(STA)中`report_timing`命令的核心用法与高级技巧。作为芯片设计的关键诊断工具,它能根据SDC约束精准定位时序路径问题。文章从基础参数过滤讲起,详细介绍了如何通过`-from`、`-through`、`-to`等选项定位关键路径,并深入讲解了`-input_pins`、`-nets`、`-transition_time`等高级选项如何揭示延迟细节,以及`-nworst`、`-slack_lesser_than`等过滤排序技巧,旨在帮助工程师高效解读时序报告,优化设计

h6i7j8的博客 1108

Android Xfermode 实战 实现圆形、圆角图片

跳槽季整理面试题已经成了我多年的习惯!在这里我和身边一些朋友特意整理了一份快速进阶为Android高级工程师的系统且全面的学习资料。涵盖了Android初级——Android高级架构师进阶必备的一些学习技能。附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。

2401_84121827的博客 1017

科研智能体平台搭建与实战:大模型如何驱动科研自动化

大模型技术的快速发展,正推动AI智能体从单纯对话工具向主动执行任务的科研伙伴演进。智能体的核心原理在于整合模型调用、工具使用、知识库检索与工作流编排,使其能够自主拆解目标、执行操作并迭代优化。在科研场景中,这一技术价值尤为突出:文献初筛、实验数据清洗、代码调试、结果汇总等高频重复劳动均可实现自动化,大幅释放研究者精力。从基础组件配置到多智能体协同,从平台选型到提示词调优,实际落地需要关注模型匹配、工具稳定性、记忆管理与人机校验机制。本文基于真实工程经验,系统梳理科研智能体平台的搭建路径、应用案例与高频问题排

weixin_32597009的博客 284

android Xfermode 的各种组合使用

Android API demo 中的Xfermode有点问题,正确的应该是: Paste_Image.png 通过设置Xfermode可以将两张图进行各种组合: 圆为Dst 正方形为Src Xfermode的类型有16种: private static final Xfermode[] sModes = { new PorterDuffXfermode(PorterDuff.Mode.CLEAR), new PorterDuffXfermode(PorterDuff.Mode.SRC), new Port

斯旺森swanson 253

一分钟理解 “熔断“, “限流“ 与 “降级“

熔断,本质是一种“故障隔离”机制,用于当某个依赖服务出现持续故障(如响应超时、错误率飙升)时,暂时切断对该服务的调用,避免故障扩散到整个系统,防止“雪崩效应”;待依赖服务恢复正常后,再逐步恢复调用。其核心逻辑参考了现实中的“电路保险丝”——电路过载时,保险丝熔断,切断电路,保护电器不被烧毁;故障排除后,更换保险丝,电路恢复正常。闭合状态(Closed):正常状态,请求可以正常调用依赖服务,同时监控调用的错误率、超时率等指标。打开状态(Open)

h a 6 6 6 c k 为 你解决复杂难题! 1464

3D 韩系风格漫剧人设 | GPT-Image2 人设生成【附完整提示词】

宁姚同款清冷剑系美人,极致小巧鹅蛋脸,下颌线紧致纤细流畅,下巴小巧精致收窄,小脸衬得五官格外舒展,韩式水光肌,面部精细水光高光,鼻梁高光、鼻尖高光、面中苹果肌高光、唇珠高光,红棕色长卷发偏分大波浪,垂在一侧肩前,发量蓬松。发量丰厚蓬松有体积感,不贴头皮,几缕碎发自然垂落脸侧修饰脸型,长度过胸及背,发丝柔顺丝滑卷度自然,发尾自然垂落,身穿香槟色缎面挂脖长裙,挂脖设计无袖露肩露背,上半身围裹式荡领胸口垂褶,腰部堆褶收腰,修身直筒包臀裙长度到脚踝,缎面光泽感强垂坠感好,极简剪裁。纯白色背景,3D漫剧写实厚涂风。

欢迎来到鸾姝淡月博客,专为程序员和编程爱好者打造的技术博客。我们分享编程语言趋势、开发工具、编程哲学、职业发展等,助你掌握新技术,优化技能,激发编程热情。 130

Android 自定义 View 进阶 - Xfermode

在 Android 自定义控件中,Xfermode 是一个难点也是一个重点,我们有必要掌握它。之前学习过,没有充分理解,今天重新学习了下,完成了一个高亮进度条的 ImageView 控件(逐步优化中)。 效果图: 实现代码 /** * 高亮进度的 imageview */ public class HightlightProgressImageView extends AppCompatI...

Star的博客 656

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Android Xfermode 学习笔记

一、概述 Xfermode全名transfer-mode,其作用是实现两张图叠加时的混合效果。 网上流传的关于Xfermode最出名的图来源于AndroidSDK的samples中,名叫Xfermodes.java,效果如下: 二、体验 提炼出Xfermodes.java中的核心代码,自己写了个简单粗暴的demo试试水: 1 public class Image...

aiqu5512的博客 177

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Android Canvas 图形绘制 -> Xfermode

打算 找几篇吊的 文章,跑一跑就通了 1.入门1 Paint mPaint = new Paint(); mPaint.setColor(Color.BLUE); canvas.drawCircle(300,300 , 300, mPaint); mPaint.setColor(Color.RED); Rect...

FlyPig_Vip的博客 414

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

android xfermode绘图

1、fermode:是来自transfer-modes,在画笔中设置xfermode后,画笔在使用的时候就会应用设置的像素转换模式。就类似于ps中的选取功能,留下的选取是从原选区中去除还是合并,取交还是除去,就这么回事。 2、fermode相关类之间的继承关系: 3、直接继承子类有AvoidXfermode(避免绘图或者只在上边绘制)、PixelXorfermode(与目标做x...

angel774422的博客 213
上一篇: Android OpenCV库使用
下一篇: Android FFmpeg 编译.so库
JohanMan
博客等级 码龄10年 72粉丝 131原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值