Android中Xfermode简单用法

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

首先参考了这篇博文给的灵感:
详解Paint的setXfermode(Xfermode xfermode)
其次呢,在写这篇博文的时候呢也避免不了抱怨啊。网上其他的关于Xfermode介绍的大部分都是google官方文档中属性的含义,都很雷同估计都是翻译过来的。

贴上google官方ApiDemo中Graphics中Xfermode截图:
这里写图片描述

纠结了2天终于弄出来的

最令人气愤是你看着其他人博客然后想做google官方属性的出的效果,但是愣是没有做出来效果,我这暴脾气,非要弄出来。于是乎有了这篇博文。

下面会给大家介绍最简单直接的做法,为了方便大伙看明白,简单有效才是王道!!

下面真正是正文了啊:大伙注意了。
对于官方文档的xfermode我们只是看到两个类似层的图片
其实和photoshop中的图层一样;
一个是原始图层,另一个是遮罩层;
我把整个View的画布设置为绿色了,为了方便大家观看效果

canvas.drawColor(Color.GREEN);//画布设为绿色

先上效果图吧,嘿嘿苍老师的头像。

苍老师,哈哈

看完正确运行出来的效果,那么给大家看看错误运行出来的效果:
是我的苍老师,也是大家的苍老师
苍老师出错了

下面告诉大伙正确的操作:

//将绘制操作保存到新的图层(离屏缓存)
canvas.saveLayer(0,0,300,300, null,Canvas.ALL_SAVE_FLAG);
方法:
public int saveLayer(float left, float top, float right, float bottom, Paint paint, int saveFlags)

大伙不要小看这个方法,我们必须设置将绘制操作保存到新的图层,不然就会出现苍老师头像显示不正常的情况
当然最后还要还原画布

// 还原画布
canvas.restoreToCount(sc);

canvas顾名思义是画布。所有的绘制操作都发生在这张画布上,当然当我们要使用多个图片叠加等的情况我们就要使用“层”了,就如百度地图或是高德地图,他们在地图上面添加新的事物,如线路,兴趣点的时候都是用到了层Layer。
当然Canvas给我们提供了层支持;这些Layer是按照栈结构来管理的,后进先出的顺序显示;
当Layer入栈的时候,那么后续的drawXXXX操作都发生在这个Layer层上面。而Layer退栈时,就会把本层绘制的图像“绘制”到上层或是Canvas上,在复制Layer到Canvas上时,可以指定Layer的透明度(Layer),这是在创建Layer时指定的:
public int saveLayerAlpha(RectF bounds, int alpha, int saveFlags)
我们这篇就不说明saveLayerAplha了。大伙可以自己使用

那么说这么多,有人看博文肯定说代码呢,稍等,客官马上就来咯:
当然Xfermode网上很多文章都写了相关属性介绍的含义,当然我做这个的时候是按照官方给出图片做的效果。意思呢,可以意会。如果我说了,大伙又迷糊了。哈哈哈哈,这也是我的风格。

那么我所有的操作都在onDraw()函数体里面写了啊。至于性能方面不是我这篇文章所讨论的。可以不用在onDraw里面new对象操作,可以提高性能啥的。
当然自定义view避免不了,先测量下啦。为了简单直接这样:

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int width=MeasureSpec.getSize(widthMeasureSpec);
int height=MeasureSpec.getSize(heightMeasureSpec);
setMeasuredDimension(width,height);
}

最后贴上onDraw里面的代码,全部在这了:

@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawColor(Color.GREEN);//设画布绿色
canvas.translate(20,20);//移动画布
// 原始图片
Bitmap src = BitmapFactory.decodeResource(getResources(), R.mipmap.cangcang);
// 图片的遮罩
Bitmap mask=Bitmap.createBitmap(300, 300, src.getConfig());
Canvas cc=new Canvas(mask);
cc.drawCircle(150,150,150,mPaint);
/*
* 离屏缓存
* Layer层的宽和高要设定好,不然会出现有些部位不再层里面,你的操作是不对这些部位起作用的
*/
int sc = canvas.saveLayer(0,0,300,300, null, Canvas.ALL_SAVE_FLAG);
// 先绘制dis目标图
canvas.drawBitmap(src, 0, 0, mPaint);
// 设置混合模式 (只在源图像和目标图像相交的地方绘制目标图像)
mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
// 再绘制src源图
canvas.drawBitmap(mask, 0, 0, mPaint);
// 还原混合模式
mPaint.setXfermode(null);
// 还原画布
canvas.restoreToCount(sc);
}

那么其他的xfermode属性大家可以自己尝试。前提是Layer的宽度和高度大家要控制好,其他都大同小异。

Android 通过笔刷Xfermode实现简单抠图 废话不说多说先上码: public class CutoutView extends ImageView { private Paint mPaint; private Path path; private float startX, startY, stopX, stopY; private Bitmap maskBitmap; private Lis 阅读详情

相关推荐

setXfermode讲解

Android Paint之 setXfermode PorterDuffXfermode 讲解!

sex 无需下载_elipse FTP插件 - Sexftp 支持FTP上传、下载、比较等功能

Sexftp简介Sexftp是FTP上传与下载的eclipse插件,集成在ECLIPSE中,方便开发人员进行FTP相关操作,省去来回切换工具及选择目录的麻烦。Sexftp支持上传、下载等基本操作;同时可以直接eclipse中查看或编辑服务器端的文件并自动上传回服务器;支持本地文件与服务器文件的内容比较、目录比较;支持服务器视图与本地视图灵活切换与定位,支持项目浏览器(Package Explore...

weixin_34233539的博客 1万+

STM32F103C8T6用官方bootloader实现IAP升级操作方法

在使用STM32F103C8T6单片机IAP功能时,可以自己写bootloader程序,也可以使用官方bootloader文件。下面说一下使用官方bootloader的使用方法。 首先下载官方bootloader文件 目前使用的是这个版本,打开文件夹,选择适合自己编译器的工程。 目前使用的是keil,所以打开MDK-ARM文件夹 打开IAP工程 打开后根据自己的单片机型号,对工程进行简单的修...

HXYDJ的博客 1万+

Android基础入门教程——8.3.4 Paint API之—— Xfermode与PorterDuff详解(一)

不知道标题这两个玩意你熟不熟悉啦,如果自己实现过圆角或者圆形图片,相信对这两个名词 并不模式,一时半伙没想起来?没关系,下面这个图你可曾见过? PS:网上都说在:\samples\android-XX\legacy\ApiDemos\src\com\example\android\apis\graphics 下能找到这个图片- -,然而并没有,不知道是不是因为我的sample是android-22的,只在这

Coder-Pig的猪栏 3万+

RM3100应用笔记驱动程序SPI接口

PNI磁传感器套件RM3100磁传感器套件由2个Sen-XY-f(pn13104)地磁传感器,1个Sen-Z-f(pn13101)地磁传感器和MagI2C(pn13156)控制芯片组成,能够实现三维空间的磁场大小测量。

AIoT技术栈的博客 4923

DeepSeek的训练与优化流程

DeepSeek的训练体系不仅追求极致的计算效率,更注重将物理规律、人类知识、安全伦理深度融入训练过程,其"效率-安全-可解释性"三角平衡的设计理念,为行业提供了重要参考范式。

m0_56896669的博客 1433

Xfermode原理与案例

Xfermode原理与案例 目录: Xfermode的基本原理 Xfermode的多种模式 Xfermode的使用案例 Xfermode的基本原理 Xfermode是什么? 在Android绘制中,通过使用Xfermode将绘制的图形的像素和Canvas上对应位置的像素按照一定的规则进行混合,形成新的像素,再更新到Canvas中形成最终的图形。 像素组成的4元素:ARGB 我们一个像素的颜色都是由四个分量组成,即ARGB,A表示的是我们Alpha值,RGB表示的是颜色 S表示的是源像素,源像素的

NYC的博客 1331

深度学习与神经网络有什么区别

人工神经网络(ArtificialNeuralNetwork,即ANN)是从信息处理角度对人脑神经元网络进行抽象,是20世纪80年代以来人工智能领域兴起的研究热点,其本质是一种运算模型,由大量的节点(或称神经元)之间相互联接构成,在模式识别、智能机器人、自动控制、生物、医学、经济等领域已成功地解决了许多现代计算机难以解决的实际问题,表现出了良好的智能特性。...

super67269的博客 8486

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

转载请标明出处:http://blog.youkuaiyun.com/lmj623565791/article/details/42094215,本文出自:【张鸿洋的博客】 1、概述 其实这篇本来准备Android BitmapShader 实战 实现圆形、圆角图片放到一篇里面,结果由于篇幅原因就独立出来了~在很久以前也写过一个利用Xfermode 实现圆形、圆角图片的,但是那个继承的是View,其实继承Im...

modabobo 370

RAGFlow系列(06):从0.20.0版本升级到最新版的完整指南

本文提供了从RAGFlow 0.20.0版本升级到最新版的完整指南。升级前务必进行数据、配置和状态的三层备份,尤其是智能体配置因版本间存在不兼容风险。指南详细说明了如何优雅停止服务、拉取新代码、检查并调整配置文件(如端口、环境变量),以及最终部署验证的步骤,确保升级过程平滑安全。

weixin_29243279的博客 464

从养虾到退坑:OpenClaw 卸载不留残留,一步到位

文章摘要: 本文提供OpenClaw软件的完整卸载指南,适用于Windows、macOS和Linux系统。内容包含卸载前的数据备份步骤(配置文件、日志、插件列表),以及详细的卸载脚本。Windows版通过批处理文件删除程序文件、注册表项和环境变量;macOS/Linux版则提供shell脚本,涵盖服务停止、软件包卸载、配置清理等步骤。特别强调要删除所有用户数据(包括多用户环境),确保系统无残留。文末建议重启计算机以使更改生效,实现"一步到位"的彻底卸载。

一键难忘的博客 298

gfnxdgkjfjgkhfjhejfrejwkrfwweqweqw

http://t.163.com/event/info/eventId/-8733158572876176528 http://t.163.com/event/info/eventId/5762427465076043046 http://t.163.com/event/info/eventId/1347334166652557891 http://t.163.com/event/info/

u013134664的专栏 2656

在Windows10上安装WSL2

WSL2是微软提供的Windows子系统,允许在Windows 10和11上运行Linux环境,提供更好的性能和兼容性。安装WSL2需要启用WSL功能、更新系统、安装WSL2内核,并设置为默认版本。之后,可以通过Microsoft Store安装Linux发行版,并使用WSL命令启动和管理它们。

howard2005的专栏 5935

Android Xfermode

Canvas.saveLayer在Canvas.save的基础上,额外自动分配了一个bitmap,使得saveLayer之后的所有绘制都在这个新分配的bitmap上完成。26 //在圆形的canvas上画矩形,先画圆形,圆形是dest,后画矩形,矩形是src。46 //采用saveLayer,让后续canvas的绘制在自动创建的bitmap上。27 //采用saveLayer,让后续canvas的绘制在自动创建的bitmap上。

csdn635406113的博客 362

OpenAI Error: 403 Country, region, or territory not supported [Python]

从OpenAI的API服务中获取数据时,由于你所在的国家、地区或领土不被支持,因此请求被拒绝了

suiusoar 5659

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

android中Xfermode的使用

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

SpringQi 2441

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Android绘图基础之xfermode & layer

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

crazy_jack 2105

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

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

Android Xfermode 学习笔记

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

aiqu5512的博客 177

Android 自定义 View 进阶 - Xfermode

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

Star的博客 656

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
上一篇: android怎么获取自身apk大小?
下一篇: Android资源解析之mipmap
Halifax ‎
博客等级 码龄14年 4272粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Halifax ‎

交个朋友

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值