Android-实现View模糊效果

news2025/1/12 7:02:50

首先,关于在Android上绘图的一句话

在最基本的层面上,Android 上的可视元素(如按钮、文本和其他 UI 或自定义元素)通常是通过调用 Canvas API 绘制的,如 drawLine()()、drawText()、drawBitmap() 等drawText()。除非在自定义视图中绘制对象,否则代码可能不会直接调用这些方法,但在绘制应用程序中的 UI 组件时会代表您调用这些方法。

这些绘图命令中的大多数都向渲染系统提供三条信息。您可以将这些视为绘制的内容、位置和方式信息,操作本身的位置(要绘制的“基元”),对象的放置位置(位置和大小)在哪里,以及绘图属性集如何。正是这些属性让我们今天感到担忧,因为这就是模糊的用武之地。

绘图属性由Paint 对象提供,该对象具有可由调用方(您的应用程序或代表您的 UI 系统)更改的默认属性。大多数 Paint API 都相对简单明了,比如 setColor() 表示应该绘制基元的颜色,setColor() 表示对象是应该填充还是“setStyle()描边”(用于对象的轮廓),以及我不会在这里讨论的名副其实的大量文本属性。

还可以将更强大和更复杂的属性分配给 Paint 对象。其中包括ColorFilter子类(如我个人最喜欢的ColorMatrixColorFilter,它应该获得最长和最重复的ClassRerepeatitiveNameEver的奖项),用于更改基元和着色器的颜色。ColorFilter着色器包括各种渐变对象和位图,并提供源颜色,绘图操作从中采样以提供所绘制几何图形的结果颜色。例如,使用着色器可以填充线性或圆形渐变的矩形,或者使用位图中的值来填充或描边该矩形。(PS:Android 13 中有一个新的“着色器”API,它允许你超越这些效果;请继续关注本系列的下一篇文章以获取更多信息)。

渲染效果

RenderEffect 将RenderEffect一个或多个着色器捆绑在一起,并将它们应用于整体视图或 RenderNode(视图的底层渲染机制),通过让渲染器将这些RenderEffect效果应用于整个ViewViews来简化操作。View您可以使用单个渲染效果或将多个渲染效果链接在一起以应用多个RenderEffect。

在 API 级别 31 中引入 RenderEffect 时,它提供了将现有属性效果(如 ColorFilter 、Bitmap和Shader)收集到效果中以及将它们链接的方法,工厂方法如下:

static RenderEffect createBitmapEffect(Bitmap bitmap)
static RenderEffect createColorFilterEffect(ColorFilter colorFilter)
static RenderEffect createShaderEffect(Shader shader)
static RenderEffect createChainEffect(RenderEffect outer,
                                      RenderEffect inner)

RenderEffect也在此过程中引入了一种全新的绘图效果:Blur.

Blurred Vision

除了封装现有 Paint 属性的对象之外,RenderEffect 还引入了一种新的效果,可以轻松模糊 View 或 RenderNode 内容:

static RenderEffect createBlurEffect(float radiusX, float radiusY,
                                     Shader.TileMode edgeTreatment)
static RenderEffect createBlurEffect(float radiusX, float radiusY,
                                     RenderEffect inputEffect,
                                     Shader.TileMode edgeTreatment)

使用这些方法,您现在可以轻松地在View上创建模糊效果(或者,使用上面的第二个重载,另一个 RenderEffect),以便在渲染时模糊整个内容。可以将其视为通过过滤器发送视图的原始内容,该过滤器在此过程中模糊了视图。这基本上就是正在发生的事情,尽管它实现此目的的实际方法是将内容渲染到屏幕外,应用模糊,然后将模糊的结果复制到原始目的地。

radius参数确定模糊的大小(源输入中每个像素之外在每个方向上组合的像素数),而TileMode确定模糊边缘发生的情况。最后一个参数是必需的,因为模糊对正在计算的像素之外的像素起作用,因此它需要知道当这些其他像素位于输入内容之外时该怎么做。

创建模糊后,您可以通过调用以下命令将其设置为View:

View.setRenderEffect(renderEffect RenderEffect);

也可以在 RenderNode 上设置它:

RenderNode.setRenderEffect(renderEffect RenderEffect)

Demo

单击其中一张图片会放大它并显示该照片的标题。如果我们能模糊背景,这样当我们试图专注于前景图片及其标题时,其余图片就不会产生太多的视觉噪音,那不是很好吗?

我在应用程序中添加了一个 SeekBar 以允许动态更改模糊。这不是我在完成的应用程序中需要的东西(只需选择一个有效的模糊并坚持下去;用户不会想要修改这种东西,所以保持 UI 简单)。但我想最初使用它来处理不同的模糊,并展示如何使用不同的参数重新创建它们。seekBar 传入一个介于 0 到 50 之间的值(SeekBar UI 组件上的最小/最大值)。

seekBar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener{
    override fun onProgressChanged(seekBar: SeekBar, progress: Int,
                                   fromUser: Boolean) {
        updateEffect(progress.toFloat())
    }
    // start/stop overrides stubbed out...
})

updateEffect() 使用模糊半径的progress值(我对 x 和 y 使用相同的值)。重要说明:值 0 用于指示应删除模糊,这是通过将 RenderEffect 设置为 null 来完成的。事实证明,要求 0 半径模糊(数学上等同于不模糊)会崩溃。0 显然不是系统在请求模糊效果时期望的值。这是很少记录的(我们正在修复它...),所以我想你可能想知道,以防你在家里尝试这个。我知道我想知道当我的初始代码在尝试处理该值时崩溃时发生了什么。

fun updateEffect(progress: Float) {
    if (progress > 0) {
        val blur = RenderEffect.createBlurEffect(
            progress, progress, Shader.TileMode.CLAMP)
        pictureGrid.setRenderEffect(blur)
    } else {
        pictureGrid.setRenderEffect(null)
    }
}

 updateEffect() 使用半径的progress值创建渲染效果(或将其清空以将其删除),然后将其设置在图片布局模糊:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/75002.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从《100道光芒》到《可爱冠军的诞生》:湖南广电打响“参与式”电商突围战

每年的双11,都是各电商平台秀肌肉的比拼时刻。 在这场看不见硝烟的战场上,已经逐步分化成两大阵营:阿里、京东为首的货架电商,抖音为主的兴趣电商。在“人货场”偏向“人”的形势下,它们无一例外都在全力布局吸引“人…

Apache APISIX 玩转 Tongsuo 国密插件

文|罗泽轩Apache APISIX PMC本文通过解读国密的相关内容与标准,呈现了当下国内技术环境中对于国密功能支持的现状。并从 API 网关 Apache APISIX 的角度,带来有关国密的探索与功能呈现。本文 3446 字 阅读 11 分钟1. 什么是国密 顾名思义&…

元素的显示与隐藏

元素的显示与隐藏 本质:让一个元素在页面中隐藏或者显示出来 1、display属性 源代码 display属性用于设置一个元素应如何显示 display: none; 隐藏对象 display: block; block除了转换为块元素之外&#xff0c…

软件测试基础理论体系学习5-静态测试的理解

5-静态测试的理解1 介绍2 静态测试技术2.1 代码检查2.1.1 代码走查2.1.2 编码风格与规范2.1.3 审查2.1.3.1 代码审查和代码走查2.1.3.2 代码审查清单2.2 静态结构分析2.3 代码质量度量1 介绍 静态测试包括包括代码检查、静态结构分析、代码质量度量等。它可以由人工进行&#…

友芝友生物冲刺港交所上市:极其依赖单一供应商,周鹏飞为董事长

12月9日,Wuhan YZY Biopharma Co.,LTD.(武汉友芝友生物制药股份有限公司,下称“友芝友生物”)向港交所提交上市申请材料,计划在港交所主板上市,中信建投国际为其独家保荐人。 此前,贝多财经曾在…

Spark零基础入门实战(六)使用IntelliJ IDEA创建Scala项目

IntelliJ IDEA(简称IDEA)是一款支持Java、Scala和Groovy等语言的开发工具,主要用于企业应用、移动应用和Web应用的开发。IDEA在业界被公认为是很好的Java开发工具,尤其是智能代码助手、代码自动提示、重构、J2EE支持等功能非常强大。 在IDEA中安装Scala插件 在IDEA中安装…

【Keras计算机视觉OCR】文字识别算法中DenseNet、LSTM、CTC、Attention的讲解(图文解释 超详细)

觉得有帮助麻烦点赞关注收藏~~~ 一、OCR文字识别的概念 利用计算机自动识别字符的技术,是模式识别应用的一个重要领域。人们在生产和生活中,要处理大量的文字、报表和文本。为了减轻人们的劳动,提高处理效率,从上世纪50年代起就开…

GPR学术报告学习-刘四新 主持

钱荣毅 道路空洞 1 设备 天线矩阵 不能完全覆盖调查区域, 存在差异: 难以发现动态发育特征, 数据采集难以实现3D 全覆盖, 高频上探测深度浅, 通道间存在差异。 数据需要校准。。。主要A-SCAN的地面抖动矫正。 异常区…

【EmonCMS】开源数据处理平台安装教程

EmonCMS 安装教程1.EmonCMS平台介绍:2. EmonCMS安装2.1在 Ubuntu中安装2.2.在树莓派中安装3.安装完毕Emoncms是作为该项目的一部分开发的开源web应用程序,用于处理、记录和可视化能源、温度和其他环境数据。Emoncms从OpenEnergyMonitor监控硬件接收数据&…

VS Code 上已有200万+ Java 开发者!

大家好,我们很高兴与大家分享一个好消息,现在 Visual Studio Code 上已有超过200万 Java 开发者,这要来自于长期社区以及用户的支持,所以谢谢你们! 对于11月的更新,我们为您带来了全新的代码编辑功能&…

运行 Jmeter 文件生成 HTML 测试报告,我选择 ANT 工具

概述 ant 是一个将软件编译、测试、部署等步骤联系在一起加以自动化的一个工具,大多用于 Java 环境中的软件开发。 在与 Jmeter 生成的 jmx 文件配合使用中,ant 会完成jmx计划的执行和生成jtl文件,并将jtl文件转化为html页面进行查看。 还可…

类加载器和反射

1.通过全限定名:包名类名(类名可能会重复,所以要加包名),然后用流拷贝到内存中,并在内存中创建一个class对象用来存储这个class文件的成员信息 类加载过程http://t.csdn.cn/FDnaa 在验证之前会把该类中引…

CRM的开发

开发步骤1.首页的开发2.由首页跳转到登陆页面3.用户登录4.记住密码实现5.安全退出6.登录验证7.创建市场活动8.分页查询市场活动9.删除市场活动10.修改市场活动11.批量导出市场活动12.导入市场活动13.查看市场活动明细14.添加市场活动备注15.删除市场活动备注16.修改市场活动备注…

分分钟搭建出nginx的https服务

nginx添加https协议一、https是什么?二、创建步骤1.安装nginx2.创建证书三、验证四、浏览器访问在windows安装证书总结nginx 192.168.122.50一、https是什么? HTTPS (全称:Hypertext Transfer Protocol Secure )&…

分布式文件存储系统Minio,tuling,fox,p3 5:27

MinIO | 高性能,对Kubernetes友好的对象存储 一 分布式文件系统应用场景 fastDFS 缺点: 部署麻烦。因为文件名是自动生成的,所以如果要处理文件的话,还要经过额外的编码。Minio介绍 应用场景 互联网海量非结构化数据的存储需求…

Spring常见注解

普通CURD框架结构 1、controller 控制器(注入服务)用于标注控制层,相当于struts中的action层 2、service 服务(注入dao)用于标注服务层,主要用来进行业务的逻辑处理 3、repository/Mapper(实…

25.前端笔记-CSS-溢出的文字省略号展示

1、单行文本溢出显示省略号 满足条件: (1)先强制一行内显示文本 white-space:nowrap;/*默认不写,或值是normal自动换行*/) (2)超出的部分隐藏 overflow:hidden; (3)文字用省略号代…

ESPnet-SE 开源工具介绍

下面是我们整理的钱彦旻教授、张王优、李晨达在第二届SH语音技术研讨会和第七届Kaldi技术交流会的报告内容,如果有误,欢迎指正。 基本情况 今天我们主要是围绕ESPnet-SE这个工具做一个简单的介绍,我会大概讲一下ESPnet-SE的情况,…

一文了解宏内核和微内核

【推荐阅读】 纯干货,linux内存管理——内存管理架构(建议收藏) 轻松学会linux下查看内存频率,内核函数,cpu频率 一文了解Linux内核的Oops 一篇长文叙述Linux内核虚拟地址空间的基本概括 需要多久才能看完linux内核源码? 内核是操…

微信小程序第五篇:页面弹出效果及共享元素动画

系列文章传送门: 微信小程序第一篇:自定义组件详解 微信小程序第二篇:七种主流通信方法详解 微信小程序第三篇:获取页面节点信息 微信小程序第四篇:生成图片并保存到手机相册 目录 一、page-caontainer 实现假页弹出 …