Android 使用PorterDuff.Mode.XOR自定义透明遮罩

深入理解Android绘图中的PorterDuffXfermode 深入理解Android绘图中的PorterDuffXfermode前言概要示例一(不设置Xfermode)插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 前言 本人现在是一名大三... 阅读详情

    在业务开发中很多场景都会遇到遮罩。今天使用 PorterDuffXfermode 的XOR模式来绘制一个中间透明的遮罩。

先上一张图看看效果

分析一下:

1:后面的背景是黑色

2:中间还有一个不规则的透明部分 使中间透明就需要使用到 PorterDuff.Mode.XOR

3:还有一个边框

以上如何实现的呢?下面上代码

一:首先继承View

class MaskView @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0
) : View(context, attrs, defStyleAttr) {




}

二:初始化需要的参数

    // 视图宽高
    private var viewWith: Int = 0
    private var viewHeight: Int = 0

    // 画笔:默认画笔  背景画笔  前景(透明部分)画笔  边框画笔
    private lateinit var defaultPaint: Paint
    private lateinit var bgPaint: Paint
    private lateinit var fgPaint: Paint
    private lateinit var borderPaint: Paint

    // 路径
    private lateinit var fgPath: Path
    private lateinit var borderPath: Path

    // 前景上边线的margin值
    private var fgMargin = 100f

    // kotlin 初始化方法
    init {
        initPaint()
    }

    /**
     *  初始化画笔
     */
    private fun initPaint() {
        defaultPaint = Paint(Paint.ANTI_ALIAS_FLAG)
        // 黑色背景画笔
        bgPaint = Paint(defaultPaint).apply {
            color = Color.BLACK
        }
        // 透明区域画笔
        fgPaint = Paint(defaultPaint).apply {
            xfermode = PorterDuffXfermode(PorterDuff.Mode.XOR)
        }
        // 边框画笔
        borderPaint = Paint(defaultPaint).apply {
            color = Color.parseColor("#00BECC")
            style = Paint.Style.STROKE
            strokeWidth = 10f
        }
    }

三:获取视图的宽高

    /**
     *  测量
     */
    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec)
        val w = MeasureSpec.getSize(widthMeasureSpec)
        val h = MeasureSpec.getSize(heightMeasureSpec)
        resetViewSize(w, h)
    }

    /**
     *  大小发生改变
     */
    override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
        super.onSizeChanged(w, h, oldw, oldh)
        resetViewSize(w, h)
    }

    /**
     *  重新设定视图大小
     */
    private fun resetViewSize(w: Int, h: Int) {
        // 设置该view的大小
        setMeasuredDimension(viewWith, viewHeight)

        // 宽高保存为全局变量
        viewWith = w
        viewHeight = h

        // 获取前景的path路径
        fgPath = getPath(true)
        borderPath = getPath(false)

        // 重新绘制Canvas
        invalidate()
    }

四:获取路径

    /**
     *  获取绘制的Path路径
     *  @param isWinding 是否全填充
     */
    private fun getPath(isWinding: Boolean) = Path().apply {
        reset()
        // 第一条线起点
        moveTo(fgMargin, 10f)

        // 第一条线的终点 (顶部)
        lineTo(viewWith - fgMargin, 10f)

        // 第二条线的结束点 (右边向中部走)
        lineTo(viewWith.toFloat() - 10f, viewHeight / 2f)

        // 第三条线 (右边中部向下走)
        lineTo(viewWith - fgMargin, viewHeight.toFloat() - 10f)

        // 第四条线 (底部)
        lineTo(fgMargin, viewHeight.toFloat() - 10f)

        // 第五条线 (左边底部)
        lineTo(10f, viewHeight / 2f)

        // 最后一条回到起点
        lineTo(fgMargin, 10f)

        // 闭合
        close()

        // 如果是背景那就全填充
        if (isWinding) {
            fillType = Path.FillType.WINDING
        }
    }

说明

  这是path 绘制的路径,isWinding 来判断是否填充,因为使用了XOR模式的Paint 所以绘制出来就是透明的,边框也是用的是这个路径所以边框不需要填充   

 五:绘制

    override fun onDraw(canvas: Canvas?) {
        super.onDraw(canvas)
        // 保存之前的图层 !!!很重要
        canvas?.saveLayer(0f, 0f, viewWith.toFloat(), viewHeight.toFloat(), defaultPaint)
        // 绘制背景
        canvas?.drawRect(0f, 0f, viewWith.toFloat(), viewHeight.toFloat(), bgPaint)
        // 绘制前景(透明区域) 因为用到了XOR模式所以绘制的区域会变成透明的
        canvas?.drawPath(fgPath, fgPaint)
        // 保存图层
        canvas?.saveLayer(0f, 0f, viewWith.toFloat(), viewHeight.toFloat(), defaultPaint)
        // 绘制边框
        canvas?.drawPath(borderPath, borderPaint)
    }

 注意:记得保存图层!

需要源码点击这里

代码很简单,希望可以帮助到你。

Android高亮新手引导蒙层实现 市面上的 APP 大多都有这个功能,我们这次做的新手高亮引导蒙层有什么特殊之处呢? 最基础的蒙层就是盖在页面的上方大概位置,不能精确定位。也不会随着 view 的变化蒙层的高亮区域和 tips 指示区域跟随底部 view 的位置变化而变化,也不能进行点击事件透传。一般都是点击蒙层后蒙层消失然后需要再次点击 view 我们这次开发的蒙层具备哪些功能,和解决了哪些技术难点,和市面上大多数蒙层博客有什么异同呢。 1 : 蒙层的高亮区域跟随底部目标 view ( 以下简称 targetView ) 我们的 AP.. 阅读详情

相关推荐

PorterDuff.Mode及Xfermode详解

在android SDK Paint类中有一个很重要的方法setXfermode(源码如上),这个方法用于设置图像的过渡模式,所谓过渡是指图像的饱和度、颜色值等参数的计算结果的图像表现。在SDK中Xfermode有三个子类:AvoidXfermode, PixelXorXfermode和PorterDuffXfermode,前两个类在API 16被遗弃了,而且不是本文的主题内容,所以这里不作介

wuyou1336的博客 1856

Android自定义View系列:PorterDuff.Mode

文章目录1 PorterDuff.Mode的作用和背景2 PorterDuff.Mode的颜色策略2.1 Alpha合成2.1.1 1 PorterDuff.Mode的作用和背景 PorterDuff.Mode 是用来指定两个图像共同绘制时的颜色策略的。它是一个枚举,不同的Mode可以指定不同的策略。颜色策略的意思,就是说把源图像绘制到目标图像处时应该怎样确定二者结合后的颜色。 PorterDuf...

Vincent的博客 5093

android遮罩Xfermode的学习

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

z8z87878的博客 2286

PorterDuffXfermode之PorterDuff.Mode.XOR入门学习

package com.loaderman.customviewdemo.view; import android.content.Context; import android.graphics.*; import android.util.AttributeSet; import android.view.View; public class PorterDuffXf...

weixin_30407613的博客 261

Android图形混合模式Xfermode详解与实战应用

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

weixin_33845881的博客 364

Android自定义遮罩视图:深入掌握PorterDuff.Mode.XOR实战应用

简单说,每个定义了一个规则:“当我(源)画到你(目标)身上时,我的哪些部分该显示?你的哪些部分该保留?Android SDK 把这整套理论封装成了一个枚举类:这句话的意思是:“只保留我和你重叠的地方,而且只显示我自己的内容。听起来有点绕?别急,我们马上就要揭开它的数学面纱了。现在,我们来动手做一个完整的,支持动态遮罩、可逆擦除、高效缓存。回顾全文,我们走过了一条从理论到实践的完整路径:从PorterDuff 的数学基础出发,理解了 Alpha 混合的本质;

weixin_34163588的博客 347

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

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

gitblog_01038的博客 907

基于MediaPipe的智能俯卧撑计数与姿势矫正系统

在现代健身和体能训练中,俯卧撑是最基础也是最有效的自重训练动作之一。然而,许多人在进行俯卧撑训练时常常存在姿势不正确、计数不准确等问题。本文将介绍如何利用计算机视觉和姿态估计技术,开发一个智能的俯卧撑计数与姿势矫正系统。

qq_36224726的博客 916

Android图形混合技术:Xfermode与PorterDuff混合模式详解

图形混合是计算机图形学中的基础概念,指通过特定算法将多个图形源合成为单一图像的技术。其核心原理基于Porter-Duff混合算法,该算法定义了12种基础混合操作。在Android开发中,通过Xfermode类实现这一技术,特别适用于需要精细控制图像合成的场景。PorterDuff.Mode枚举提供了16种混合模式,包括SRC_OVER、SRC_IN等常用模式,能够实现圆形头像、图片遮罩等UI效果。合理使用Xfermode可以显著提升应用视觉效果,但需注意硬件加速兼容性问题。掌握这些图形混合技术,开发者能够实

weixin_34268310的博客 415

YOLOv8模型INT8量化实战:解决sigmoid输出归零的坑(附代码修改)

本文详细介绍了YOLOv8模型INT8量化过程中遇到的sigmoid输出归零问题及其解决方案。通过修改模型导出代码、优化ONNX量化流程,并提供完整的部署优化技巧,帮助开发者在边缘计算设备上实现高效的模型推理。文章还包含量化效果验证和常见问题排查方法,助力开发者快速解决实际部署中的难题。

vvv99的博客 252

戴维南和诺顿定理到底怎么选?一个实际维修案例讲透两种等效电路用法

本文通过工业电源模块维修案例,详细解析戴维南和诺顿定理在实际电路分析中的选择策略。针对电压敏感型故障、电流分配问题及功率传输异常,提供三大黄金法则,帮助工程师高效选择等效电路方法,提升故障排查效率。特别强调诺顿定理在电流分析中的优势。

weixin_31854867的博客 357

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

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

gitblog_00150的博客 1026

Windows下ArduPilot SITL仿真环境搭建与QGC地面站联调全攻略

软件在环仿真(SITL)是无人机开发中的关键一环,它通过将飞控固件运行在PC上,用数学模型模拟传感器数据,实现无硬件依赖的飞行逻辑验证。这项技术不仅降低了试错成本,更为地面站开发、自动化测试和任务规划提供了安全可控的试验场。在工程实践中,MAVLink协议作为飞控与地面站之间的通信桥梁,贯穿仿真、遥测与指令控制全程。结合QGroundControl(QGC)这一主流地面站,开发者可以直观地观察飞行状态、规划航点并记录日志。本文以Windows原生环境为例,详细介绍ArduPilot SITL的搭建流程、MA

weixin_31858171的博客 317

android 图片遮盖,Android setXfermode 遮罩 实现圆形图片

参考Android学习笔记(四):android画图之paint之setXfermodeAndroid之遮罩功能的实现Android自定义圆形图片Android 完美实现图片圆角和圆形(对实现进行分析)一、概念我们知道 在正常的情况下,在已有的图像上绘图将会在其上面添加一层新的形状。 如果新的Paint是完全不透明的,那么它将完全遮挡住下面的Paint.而setXfermode就可以来解决这个问题...

weixin_30030437的博客 608

STM32L151C8T6低功耗实战:RTC闹钟唤醒停机模式的配置与优化

本文详细介绍了如何在STM32L151C8T6微控制器上配置与优化RTC闹钟唤醒停机模式,以实现极致的低功耗设计。文章从核心原理出发,结合STM32CubeMX配置实战,深入讲解了进入停机模式前的关键准备工作、唤醒后的系统恢复流程,并分享了将功耗降至个位数微安级的深度优化技巧与常见问题解决方案。

weixin_29166013的博客 301

【实战解析】SAP EWM与PP深度集成:从后台配置到前台物料流转的全链路设计

本文深入解析SAP EWM与PP深度集成的全链路设计,涵盖后台配置与前台物料流转的实战应用。通过两种集成模式(DPI与API)的选择策略、十二个关键后台配置步骤详解,以及PMR生成、PSA补货等前台演示,帮助企业实现生产计划与物料供应的高效协同,显著提升生产效率和库存周转率。

weixin_30723433的博客 421

Windows 11 瘦身指南:移除 140+ 预装应用并关闭遥测,把系统选择权拿回自己手里

一台新装的 Windows 11 机器,用上几个月后开机变慢、通知栏时不时弹出陌生推送——这类「系统臃肿」问题,用 Win11Debloat 做一轮 Windows 11 清理,通常十分钟以内就能收尾。它不需要安装,也不常驻后台,跑完即退出。 [![Win11Debloat 主界面:Windows 11 预装应用移除与遥测清理选项清单](https://raw.gitcode.com/GitHu

gitblog_00052的博客 1101

第7章: MMU notifier在AMD GPU驱动中的应用

AMD GPU驱动利用MMU Interval Notifier机制实现共享虚拟内存(SVM)和异构内存管理(HMM)。通过分析AMDGPU内存架构(VRAM、GTT、Userptr)和Buffer Object设计,重点探讨了Userptr零拷贝机制如何依赖MMU notifier保持CPU/GPU内存一致性。HMM框架进一步实现统一地址空间和透明页面迁移,AMDGPU通过amdgpu_hmm.c实现两种invalidate回调(GFX和HSA模式),处理不同场景下的内存失效同步问题。

图形/计算GPU的驱动与虚拟化技术分享园地 2470

Paint API之—— Xfermode与PorterDuff详解(一)

本文详细介绍了 Android 中 Paint 的 Xfermode 属性及其 PorterDuff 实现,重点讲解图像混合的核心原理和常见应用场景。Xfermode 通过控制源图像(SRC)和目标图像(DST)的混合模式,可实现图像叠加、裁剪、遮罩等效果。文章系统解析了 PorterDuff 的 18 种混合模式(如 SRC_IN、MULTIPLY 等)的工作原理,并提供了圆形头像裁剪的完整代码示例,演示如何通过 SRC_IN 模式结合 Canvas 实现这一常见功能。全文兼顾理论解析与实践指导,适合开发

likuoelie的博客 1143

行测测评——矩阵、圆形、环形三角图形数列推理解题技巧

写在前面:各大公司的测评做的让人眼花缭乱,很多题型都是第一次见,比如逻辑关系、信息推理,最难的要属找规律的数字推理了。根据B站UP主刘文超老师的课程,记录一下解题技巧。感谢UP主的无私奉献,原地址连接:https://www.bilibili.com/video/BV1it411M7o2?t=528&p=7 解题技巧: 从图形的上下、左右、交叉 角度进行尝试求解 基本法则是“加、减、乘、除、倍数、次方”六种形态。 一、有心数阵 解题技巧:周边数字通过某种运算得到中间数字 1.周边数..

涵盖了计算机专业基础知识、数学建模相关实践、复杂网络论文研究、LeetCode算法刷题经验、C语言开发经验、前端Vue、React框架开发实战相关知识 8643

假人有限元模型

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

Android 颜色渲染 PorterDuff及Xfermode详解

之前已经讲过了除ComposeShader之外Shader的全部子类, 在讲ComposeShader(组合渲染)之前,  由于构造ComposeShader需要 PorterDuffXfermode或者PorterDuff.Mode作为参数,所以在此先详细地了解下这两个类的作用,这对之后的绘图会有很大的帮助: 在讲具体的使用之前补充一点知识,这就是 ProterDuff的由来: 相信大多

进击的小黑哥 1246

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

刮刮卡 java代码_Android刮刮卡效果实现代码

本文实例为大家分享了Android刮刮卡效果,供大家参考,具体内容如下android实现底层一张图片,上层一个遮罩层,触摸滑动按手指滑动路径实现去除遮罩效果,类似于抽奖的刮刮卡一样,不多说先上张效果图:直接上代码:XfermodeView.java/*** Created by 57 on 2016-4-21.*/public class XfermodeView extends View{pri...

weixin_29069131的博客 748

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

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

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

关于Xfermode的介绍和用处(遮罩图层,圆形图片)

1.关于Xfermode类 从上面看出Xfermode有三个子类:AvoidXfermode,PixelXorXfermode,PoterDuffXfermode。它们分别表示: AvoidXfermode:在绘图时,要么绘制在最顶层,要么绘制在除最顶层以外的地方。 PixelXorXfermode:这种转换不遵循自左乘的约定,因此这种模式总返回不透明的颜色(alpha=255),由

wangjiang 2671

android设置图片点击效果,Android 一张图片使用tint(着色)实现selector点击效果

Android项目开发过程中经常会遇到按钮、图片点击效果的实现,不管背景是颜色还是图片一般常用做法都是用selector实现,类似下面的代码:这样的做法虽然也可以,但难免有些麻烦,drawable目录下要新建很多xml文件,如果是图片点击效果,可能还需要在项目中添加两种状态的图片。所以今天给大家介绍用tint着色来实现点击效果,简单理解tint就是在原有的图片或者颜色上面覆盖一层颜色,类似遮罩,但...

weixin_30789297的博客 1244

自定义控件三部曲之绘图篇(十二)——Paint之setXfermode(三)

前言:几乎忘了昨日的种种 开始又敢作梦 系列文章: Android自定义控件三部曲文章索引:http://blog.csdn.net/harvic880925/article/details/50995268 一篇给大家讲解了有关setXfermode的几种模式,还剩最后一系列DST模式没讲,这篇文章就给大家讲讲这个模式的用法及实战 一、DST相关模式 在讲完了SR...

启舰 1万+

android_maskable_layout 自定义属性全解析:mask、porterduffxfermode与anti_aliasing终极指南

android_maskable_layout 是一款专为 Android 开发者打造的**蒙版布局库**,它继承了 FrameLayout,能让你用一行 XML 轻松对任意 View / ViewGroup 进行遮罩裁剪。本文聚焦它最核心的三大自定义属性——**mask(蒙版形状)**、**porterduffxfermode(图像混合模式)**与 **anti_aliasing(抗锯齿)**,

gitblog_07247的博客 1002
上一篇: Room数据库添加字段遇到的问题记录
下一篇: FragmentContainerView+BottomNavigationView使用无法点击
爱吃西瓜J
博客等级 码龄9年 6粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值