当前位置: 首页 > news >正文

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
      • 作用:定义环境光的强度
      • 范围:通常在 01 之间
      • 描述:环境光影响整个浮雕效果的亮度。值越大,整体效果越亮,越小则越暗
    • 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 作用对象&#xff1a;MaskFilter 主要用于Paint的外观效果&#xff0c;给用Paint绘制的内容添加模糊或者浮雕效果应用效果&#xff1a; MaskFilter 处理位图的遮罩效果&#xff0c;影响绘制的边缘或整体形状主要用于模糊处理、浮雕效果等&#xff0c;通过影响绘制对…...

RK3568使用QT操作LED灯

文章目录 一、QT中操作硬件设备思路Linux 中的设备文件操作硬件设备的思路1. 打开设备文件2. 写入数据到设备3. 从设备读取数据4. 设备控制5. 异常处理在 Qt 中操作设备的典型步骤实际应用中的例子:控制 LED总结二、QT实战操作LED灯设备1. `mainwindow.h` 头文件2. `mainwindo…...

python学opencv|读取图像(五十七)使用cv2.bilateralFilter()函数实现图像像素双边滤波处理

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

为何实现大语言模型的高效推理以及充分释放 AI 芯片的计算能力对于企业级落地应用来说,被认为具备显著的研究价值与重要意义?

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ AI 芯片&#xff1a;为人工智能而生的 “大脑” AI 芯片&#xff0c;又称人工智能加速器或计算卡&#xff0c;是专为加速人工智能应用&#xff0c;特别是深度学习任务设计的专用集成电路&#xff08;A…...

Android 约束布局ConstraintLayout整体链式打包居中显示

Android 用约束布局ConstraintLayout实现将多个控件视作一个整体居中显示&#xff0c;使用 app:layout_constraintHorizontal_chainStyle"packed"实现 chain 除了链条方向有横向和竖向区分外&#xff0c; 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[] …...

微服务知识——微服务架构的演进过程

文章目录 初始架构&#xff1a;单机架构第一次演进&#xff1a;Tomcat与数据库分开部署第二次演进&#xff1a;引入本地缓存和分布式缓存第三次演进&#xff1a;引入反向代理实现负载均衡第四次演进&#xff1a;数据库读写分离第五次演进&#xff1a;数据库按业务分库第六次演进…...

Chrome 浏览器:互联网时代的浏览利器

Chrome 浏览器&#xff1a;互联网时代的浏览利器 引言 在互联网时代&#xff0c;浏览器已经成为我们日常生活中不可或缺的工具。作为全球最受欢迎的浏览器之一&#xff0c;Chrome 浏览器凭借其出色的性能、丰富的扩展程序和简洁的界面&#xff0c;赢得了广大用户的喜爱。本文…...

深入浅出 NRM:加速你的 npm 包管理之旅

文章目录 前言一、NRM 是什么&#xff1f;二、为什么需要 NRM&#xff1f;三、NRM 的优势四、NRM 的安装与使用4.1 安装 NRM4.2 查看可用的 npm 源4.3 切换 npm 源4.4 测试 npm 源速度4.5 添加自定义 npm 源4.6 删除 npm 源 五、NRM 的进阶使用六、总结 前言 作为一名 JavaScr…...

Linux——基础命令1

$&#xff1a;普通用户 #&#xff1a;超级用户 cd 切换目录 cd 目录 &#xff08;进入目录&#xff09; cd ../ &#xff08;返回上一级目录&#xff09; cd ~ &#xff08;切换到当前用户的家目录&#xff09; cd - &#xff08;返回上次目录&#xff09; pwd 输出当前目录…...

nuxt3中使用useFetch请求刷新不返回数据或返回html结构问题解决-完整nuxt3useFetchtch请求封装

前言 如果使用nuxt3写项目&#xff0c;可以查看nuxt3实战&#xff1a;完整的 nuxt3 vue3 项目创建与useFetch请求封装&#xff0c;此篇内容有详细步骤 但在此篇内容中useFetch请求在页面有多个请求的情况下&#xff0c;或者放在客户端渲染情境下是失败的&#xff0c;所以在此篇…...

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&#xff0c;但是现在我使用PVE安装Debian虚拟机&#xff0c;不想通过docker安装了。下面开始折腾。 安装过程 步骤 1&#xff1a;更新系统并安装必要的软件 sudo apt update && sudo apt upgrade -y sudo apt install…...

【FPGA】 MIPS 12条整数指令 【3】

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

Mac 部署Ollama + OpenWebUI完全指南

文章目录 &#x1f4bb; 环境说明&#x1f6e0;️ Ollama安装配置1. 安装[Ollama](https://github.com/ollama/ollama)2. 启动Ollama3. 模型存储位置4. 配置 Ollama &#x1f310; OpenWebUI部署1. 安装Docker2. 部署[OpenWebUI](https://www.openwebui.com/)&#xff08;可视化…...

蓝桥杯小白打卡第二天

789. 数的范围 题目描述 给定一个按照升序排列的长度为 n n n 的整数数组&#xff0c;以及 q q q 个查询。 对于每个查询&#xff0c;返回一个元素 k k k 的起始位置和终止位置&#xff08;位置从 0 0 0 开始计数&#xff09;。 如果数组中不存在该元素&#xff0c;则返…...

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注解失效&#xff0c;没写cacheConfig_com.howbuy.cachemanagement.client.redisclient#incr-CSDN博客 【已解决】OSS配置问题_keyuewenhua.oss-cn-beijing.aliyuncs-CSDN博客 【排坑】云服务器docker部署前后端分离项目域名解析OSS-CSDN博客 微服…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日&#xff0c;国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解&#xff0c;“超级…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...