Filter -> MaskFilter遮罩滤镜详解
MaskFilter
- 作用对象:
MaskFilter
主要用于Paint
的外观效果,给用Paint
绘制的内容添加模糊或者浮雕效果 - 应用效果:
MaskFilter
处理位图的遮罩效果,影响绘制的边缘或整体形状- 主要用于模糊处理、浮雕效果等,通过影响绘制对象的边缘来实现
- 常用子类:
BlurMaskFilter
:实现模糊效果,可以设置不同的模糊样式(NORMAL、SOLID、OUTER、INNER)
EmbossMaskFilter
:创建浮雕效果,通过设置光源方向、环境光强度等来实现
BlurMaskFilter
模糊遮罩滤镜
Java
源码
public class BlurMaskFilter extends MaskFilter {public enum Blur {/*** Blur inside and outside the original border.*/NORMAL(0),/*** Draw solid inside the border, blur outside.*/SOLID(1),/*** Draw nothing inside the border, blur outside.*/OUTER(2),/*** Blur inside the border, draw nothing outside.*/INNER(3);Blur(int value) {native_int = value;}final int native_int;}/*** Create a blur maskfilter.** @param radius The radius to extend the blur from the original mask. Must be > 0.* @param style The Blur to use* @return The new blur maskfilter*/public BlurMaskFilter(float radius, Blur style) {native_instance = nativeConstructor(radius, style.native_int);}private static native long nativeConstructor(float radius, int style);
}
- 构造函数详解
radius
(模糊半径)- 类型:
float
- 作用:指定模糊的强度。值越大,模糊效果越明显。
- 描述:模糊半径决定了模糊的范围,单位通常是像素。较小的值会产生轻微的模糊,而较大的值会导致显著的模糊效果。
- 类型:
style
(模糊样式):- 类型:BlurMaskFilter.Blur
- 作用:决定模糊的应用方式,即模糊效果的样式。
- 可用值:
Blur.NORMAL
:- 描述:模糊内外边框+绘制内容。适用于需要整体柔和模糊效果的场景
Blur.SOLID
:- 描述:模糊内外边框+不模糊绘制内容。适用于增强物体的边缘
Blur.OUTER
:- 描述:只模糊外边框+不模糊内边框+内边框内的绘制内容透明显示。适用于突出物体本身
Blur.INNER
:- 描述:只模糊内边框+不模糊外边框+外边框外的绘制内容透明显示。适用于创建内嵌阴影或凹陷效果
XML
文件
<?xml version="1.0" encoding="utf-8"?>
<com.example.myapplication.MyViewxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent" />
- 自定义
View
代码
class MyView @JvmOverloads constructor(context: Context,attrs: AttributeSet? = null,defStyleAttr: Int = 0
) : View(context, attrs, defStyleAttr) {private val mDrawPaint: Paint = Paint().apply {isDither = trueisAntiAlias = trueisFilterBitmap = truecolor = Color.BLUE}private val radius = 100fprivate val spacing = 500foverride fun onDraw(canvas: Canvas) {super.onDraw(canvas)// Draw circle with NORMAL blurmDrawPaint.maskFilter = BlurMaskFilter(20f, BlurMaskFilter.Blur.NORMAL)canvas.drawCircle(spacing, spacing, radius, mDrawPaint)// Draw circle with SOLID blurmDrawPaint.maskFilter = BlurMaskFilter(20f, BlurMaskFilter.Blur.SOLID)canvas.drawCircle(spacing , spacing * 2, radius, mDrawPaint)// Draw circle with OUTER blurmDrawPaint.maskFilter = BlurMaskFilter(20f, BlurMaskFilter.Blur.OUTER)canvas.drawCircle(spacing , spacing * 3, radius, mDrawPaint)// Draw circle with INNER blurmDrawPaint.maskFilter = BlurMaskFilter(20f, BlurMaskFilter.Blur.INNER)canvas.drawCircle(spacing , spacing * 4, radius, mDrawPaint)}
}
- 效果图
EmbossMaskFilter
浮雕遮罩滤镜
Java
源码
public class EmbossMaskFilter extends MaskFilter {/*** Create an emboss maskfilter** @deprecated This subclass is not supported and should not be instantiated.** @param direction array of 3 scalars [x, y, z] specifying the direction of the light source* @param ambient 0...1 amount of ambient light* @param specular coefficient for specular highlights (e.g. 8)* @param blurRadius amount to blur before applying lighting (e.g. 3)* @return the emboss maskfilter*/@Deprecatedpublic EmbossMaskFilter(float[] direction, float ambient, float specular, float blurRadius) {if (direction.length < 3) {throw new ArrayIndexOutOfBoundsException();}native_instance = nativeConstructor(direction, ambient, specular, blurRadius);}private static native long nativeConstructor(float[] direction, float ambient, float specular, float blurRadius);
}
- 构造函数详解
direction
(光源方向):- 类型:
float[]
- 作用:指定光源的方向。
- 描述:这是一个长度为
3
的数组,分别表示光源在x、y、z
轴上的方向分量。正常情况下,这些值不需要是单位向量,但它们定义了光源的相对方向。根据光源的方向,浮雕的阴影和高光效果会有所不同
- 类型:
ambient
(环境光):- 类型:
float
- 作用:定义环境光的强度
- 范围:通常在
0
到1
之间 - 描述:环境光影响整个浮雕效果的亮度。值越大,整体效果越亮,越小则越暗
- 类型:
specular
(高光反射系数):- 类型:
float
- 作用:定义高光的反射强度
- 描述:高光反射系数影响浮雕效果中高光部分的亮度。较高的值会使高光更明显,较低的值则使高光不明显
- 类型:
- blurRadius(模糊半径):
- 类型:
float
- 作用:定义浮雕效果的模糊半径
- 描述:模糊半径决定了浮雕边缘的模糊程度。较小的值会使浮雕边缘更锐利,而较大的值会使边缘更加柔和
- 类型:
XML
文件
<?xml version="1.0" encoding="utf-8"?>
<com.example.myapplication.MyViewxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent" />
- 自定义
View
代码
class MyView @JvmOverloads constructor(context: Context,attrs: AttributeSet? = null,defStyleAttr: Int = 0
) : View(context, attrs, defStyleAttr) {private var mPaint: Paint = Paint().apply {isAntiAlias = truecolor = Color.RED // 用红色以更好地展示浮雕效果}private var embossFilter: EmbossMaskFilter? = nullinit {// 设置浮雕效果的参数val direction = floatArrayOf(1f, 0f, 0f) // 从上方垂直照射光源val ambient = 0.6f // 较低的环境光val specular = 5f // 较高的高光反射val blurRadius = 50f // 适中的模糊半径embossFilter = EmbossMaskFilter(direction, ambient, specular, blurRadius)mPaint.maskFilter = embossFiltersetLayerType(LAYER_TYPE_SOFTWARE, mPaint)}override fun onDraw(canvas: Canvas) {super.onDraw(canvas)canvas.drawColor(Color.DKGRAY) // 设置深灰色背景以增加对比度// 设置椭圆的矩形边界val left = 100fval top = 100fval right = width - 100fval bottom = height - 100f// 绘制椭圆canvas.drawOval(left, top, right, bottom, mPaint)}
}
- 效果图
-
相关文章:

Filter -> MaskFilter遮罩滤镜详解
MaskFilter 作用对象:MaskFilter 主要用于Paint的外观效果,给用Paint绘制的内容添加模糊或者浮雕效果应用效果: MaskFilter 处理位图的遮罩效果,影响绘制的边缘或整体形状主要用于模糊处理、浮雕效果等,通过影响绘制对…...
RK3568使用QT操作LED灯
文章目录 一、QT中操作硬件设备思路Linux 中的设备文件操作硬件设备的思路1. 打开设备文件2. 写入数据到设备3. 从设备读取数据4. 设备控制5. 异常处理在 Qt 中操作设备的典型步骤实际应用中的例子:控制 LED总结二、QT实战操作LED灯设备1. `mainwindow.h` 头文件2. `mainwindo…...

python学opencv|读取图像(五十七)使用cv2.bilateralFilter()函数实现图像像素双边滤波处理
【1】引言 前序学习过程中,已经掌握了对图像的基本滤波操作技巧,具体的图像滤波方式包括均值滤波、中值滤波和高斯滤波,相关文章链接有: python学opencv|读取图像(五十四)使用cv2.blur()函数实现图像像素…...

为何实现大语言模型的高效推理以及充分释放 AI 芯片的计算能力对于企业级落地应用来说,被认为具备显著的研究价值与重要意义?
🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ AI 芯片:为人工智能而生的 “大脑” AI 芯片,又称人工智能加速器或计算卡,是专为加速人工智能应用,特别是深度学习任务设计的专用集成电路(A…...

Android 约束布局ConstraintLayout整体链式打包居中显示
Android 用约束布局ConstraintLayout实现将多个控件视作一个整体居中显示,使用 app:layout_constraintHorizontal_chainStyle"packed"实现 chain 除了链条方向有横向和竖向区分外, chain链条上的模式有 3种 spread - 元素将被展开&#…...
在C#中,Array,List,ArrayList,Dictionary,Hashtable,SortList,Stack的区别
Array Array你可以理解为是所有数组的大哥 普通数组 : 特点是长度固定, 只能存储相同类型的数据 static void Main(string[] args){//声明int[] ints;string[] strings;People[] peoples;//默认值 //int 类型是 0//string 类型是 nullint[] ints1 { 1, 2, 3 };string[] …...

微服务知识——微服务架构的演进过程
文章目录 初始架构:单机架构第一次演进:Tomcat与数据库分开部署第二次演进:引入本地缓存和分布式缓存第三次演进:引入反向代理实现负载均衡第四次演进:数据库读写分离第五次演进:数据库按业务分库第六次演进…...
Chrome 浏览器:互联网时代的浏览利器
Chrome 浏览器:互联网时代的浏览利器 引言 在互联网时代,浏览器已经成为我们日常生活中不可或缺的工具。作为全球最受欢迎的浏览器之一,Chrome 浏览器凭借其出色的性能、丰富的扩展程序和简洁的界面,赢得了广大用户的喜爱。本文…...
深入浅出 NRM:加速你的 npm 包管理之旅
文章目录 前言一、NRM 是什么?二、为什么需要 NRM?三、NRM 的优势四、NRM 的安装与使用4.1 安装 NRM4.2 查看可用的 npm 源4.3 切换 npm 源4.4 测试 npm 源速度4.5 添加自定义 npm 源4.6 删除 npm 源 五、NRM 的进阶使用六、总结 前言 作为一名 JavaScr…...

Linux——基础命令1
$:普通用户 #:超级用户 cd 切换目录 cd 目录 (进入目录) cd ../ (返回上一级目录) cd ~ (切换到当前用户的家目录) cd - (返回上次目录) pwd 输出当前目录…...
nuxt3中使用useFetch请求刷新不返回数据或返回html结构问题解决-完整nuxt3useFetchtch请求封装
前言 如果使用nuxt3写项目,可以查看nuxt3实战:完整的 nuxt3 vue3 项目创建与useFetch请求封装,此篇内容有详细步骤 但在此篇内容中useFetch请求在页面有多个请求的情况下,或者放在客户端渲染情境下是失败的,所以在此篇…...

Kubernetes 中 BGP 与二层网络的较量:究竟孰轻孰重?
如果你曾搭建过Kubernetes集群,就会知道网络配置是一个很容易让人深陷其中的领域。在负载均衡器、服务通告和IP管理之间,你要同时应对许多变动的因素。对于许多配置而言,使用二层(L2)网络就完全能满足需求。但边界网关协议(BGP)—— 支撑互联网运行的技术 —— 也逐渐出…...
C中静态库和动态库的使用
2.使用尖括号包括 如果要使用尖括号包括头文件,有两种方法 1.将头文件移动到标准头文件目录,linux为/usr/local/include.windows下为C:\MinGW\include 2.编译时指定头文件目录,gcc -I/头文件目录 … 编译时-I参数就是用于指定头文件目录 3.静态库 将文件编译为静态库,可以…...
Debian 安装 Nextcloud 使用 MariaDB 数据库 + Caddy + PHP-FPM
前言 之前通过 docker在ubuntu上安装Nextcloud,但是现在我使用PVE安装Debian虚拟机,不想通过docker安装了。下面开始折腾。 安装过程 步骤 1:更新系统并安装必要的软件 sudo apt update && sudo apt upgrade -y sudo apt install…...

【FPGA】 MIPS 12条整数指令 【3】
实现乘除 修改框架 EX:实现带符号乘除法和无符号乘除法 HiLo寄存器:用于存放乘法和除法的运算结果。Hi、Lo为32bit寄存器。电路描述与实现RegFile思想一致 仿真 代码 DataMem.v include "define.v"; module DataMem(input wire clk,input…...

Mac 部署Ollama + OpenWebUI完全指南
文章目录 💻 环境说明🛠️ Ollama安装配置1. 安装[Ollama](https://github.com/ollama/ollama)2. 启动Ollama3. 模型存储位置4. 配置 Ollama 🌐 OpenWebUI部署1. 安装Docker2. 部署[OpenWebUI](https://www.openwebui.com/)(可视化…...

蓝桥杯小白打卡第二天
789. 数的范围 题目描述 给定一个按照升序排列的长度为 n n n 的整数数组,以及 q q q 个查询。 对于每个查询,返回一个元素 k k k 的起始位置和终止位置(位置从 0 0 0 开始计数)。 如果数组中不存在该元素,则返…...
Docker Compose:容器编排的利器
Docker Compose:容器编排的利器 引言 随着容器技术的普及,Docker成为了当今最受欢迎的容器编排工具之一。Docker Compose作为Docker生态系统中的一部分,允许用户以声明式的方式定义和运行多容器Docker应用。本文将深入探讨Docker Compose的基本概念、工作原理、使用场景以…...
springboot项目的单元测试
文章目录 依赖编写单测代码一些注意点 依赖 依赖包含了 JUnit、Mockito、Spring Test 等常用的测试工具 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><…...

JVM图文入门
往期推荐 【已解决】redisCache注解失效,没写cacheConfig_com.howbuy.cachemanagement.client.redisclient#incr-CSDN博客 【已解决】OSS配置问题_keyuewenhua.oss-cn-beijing.aliyuncs-CSDN博客 【排坑】云服务器docker部署前后端分离项目域名解析OSS-CSDN博客 微服…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...

Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill
视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案
在大数据时代,海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构,在处理大规模数据抓取任务时展现出强大的能力。然而,随着业务规模的不断扩大和数据抓取需求的日益复杂,传统…...

pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)
目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 (1)输入单引号 (2)万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...

《Docker》架构
文章目录 架构模式单机架构应用数据分离架构应用服务器集群架构读写分离/主从分离架构冷热分离架构垂直分库架构微服务架构容器编排架构什么是容器,docker,镜像,k8s 架构模式 单机架构 单机架构其实就是应用服务器和单机服务器都部署在同一…...