当前位置: 首页 > 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博客 微服…...

Angular报错:cann‘t bind to ngClass since it is‘t a known property of div

遇到的错误&#xff1a; Cant bind to ngClass since it isnt a known property of div这个错误是 Angular 中 最常见的模板编译错误之一&#xff0c;通常出现在你试图使用 ngClass 指令&#xff0c;但 Angular 没有识别它的情况下。 ✅ 错误的根本原因 Angular 不知道 ngCla…...

idea json生成实体类

在IntelliJ IDEA中&#xff0c;可以通过安装GsonFormat或GsonFormatPlus插件快速生成Java实体类‌。具体操作流程包括安装插件、创建空类后使用快捷键调出生成界面&#xff0c;输入JSON数据即可自动生成对应字段和结构。‌‌ 一、操作流程与工具选择‌ ‌1、插件安装‌ 在ID…...

从零开始的云计算——番外实战,iptables防火墙项目

目录 一网络规划 二项目要求 三环境准备 1防火墙设置 2PC1设置 3PC2设置 4服务器S1设置 四环境检测 1内网链接 2外网连接 五防火墙配置及测试 1内部网络中的pc1采用SNAT访问外部互联网&#xff0c;但是无法ping到内部网关。 ​编辑​编辑 2内部网络服务器s1通过DN…...

QT 5.9.2+VTK8.0实现等高线绘制

项目下载链接&#xff1a;QT5.9.2VTK8.0实现等高线绘制资源-CSDN文库 示例如下&#xff1a; 主要代码如下&#xff1a; #include "vtkRenderer.h" #include "vtkRenderWindow.h" #include "vtkRenderWindowInteractor.h" #include "vtkPo…...

【C语言预处理详解(下)】--#和##运算符,命名约定,命令行定义 ,#undef,条件编译,头文件的包含,嵌套文件包含,其他预处理指令

目录 五.#和##运算符 5.1--#运算符 5.2--##运算符 六.命名约定&#xff0c;#undef&#xff0c;命令行定义 6.1--命名约定 6.2--#undef 6.3--命名行定义 七.条件编译 常见的条件编译指令&#xff1a; 1.普通的条件编译&#xff1a; 2.多个分支的条件编译(可以利用条…...

深度学习题目1

梯度下降法的正确步骤是什么&#xff1f; a.计算预测值和真实值之间的误差 b.重复迭代&#xff0c;直至得到网络权重的最佳值 c.把输入传入网络&#xff0c;得到输出值 d.用随机值初始化权重和偏差 e.对每一个产生误差的神经元&#xff0c;调整相应的&#xff08;权重&#xff…...

windows编程实现文件拷贝

项目源码链接&#xff1a; 实现文件拷贝功能&#xff08;限制5GB大小&#xff09; 81c57de 周不才/cpp_linux study - Gitee.com 知识准备&#xff1a; 1.句柄 句柄是一个用于标识和引用系统资源&#xff08;如文件、窗口、进程、线程、位图等&#xff09;的值。它不是资…...

命名管道实现本地通信

目录 命名管道实现通信 命名管道通信头文件 创建命名管道mkfifo 删除命名管道unlink 构造函数 以读方式打开命名管道 以写方式打开命名管道 读操作 写操作 析构函数 服务端 客户端 运行结果 命名管道实现通信 命名管道通信头文件 #pragma#include <iostream> #include &l…...

Kafka 如何保证顺序消费

在消息队列的应用场景中&#xff0c;保证消息的顺序消费对于一些业务至关重要&#xff0c;例如金融交易中的订单处理、电商系统的库存变更等。Kafka 作为高性能的分布式消息队列系统&#xff0c;通过巧妙的设计和配置&#xff0c;能够实现消息的顺序消费。接下来&#xff0c;我…...

CentOS在vmware局域网内搭建DHCP服务器【踩坑记录】

1. 重新设置环境 配置dhcp服务踩了不少坑&#xff0c;这里重头搭建记录一下&#xff1a; 1.1 centos 网卡还原 如果之前搭了乱七八糟的环境&#xff0c;导致NAT模式也没法上网&#xff0c;这里重新还原 我们需要在NAT模式下联网&#xff0c;下载DHCP服务 先把centos的网卡还…...