鸿蒙OS创新实践:动态声控话筒开发指南

news/2024/12/27 10:25:07/文章来源:https://www.cnblogs.com/wangerdan115/p/18634936

前言

在鸿蒙OS的生态中,开发者们不断探索和创新,以期为用户带来更丰富的交互体验。最近,我萌生了一个想法:制作一个能够随着声音动态变化的话筒组件。尽管网络上缺乏现成的参考案例,但我决定亲自动手,将这一创意变为现实。本文将深入解析这一开发过程,分享我的实战经验和技术细节。

一、前期准备

在开始之前,我们需要准备两张图片,它们将作为话筒动态效果的基础。将这些图片放置在项目的entry/ets目录下,并在代码中进行相应的配置。


最后效果:

代码示例:

private img: ImageBitmap = new ImageBitmap("image/img.png");
private img2: ImageBitmap = new ImageBitmap("image/img_1.png");

二、理解绘制所需类

为了实现动态效果,我们需要了解并使用一些关键的类和对象。这些类将帮助我们在Canvas上进行绘制和效果处理。

RenderingContextSettings:用于配置CanvasRenderingContext2D对象,包括是否开启抗锯齿功能。

private settings: RenderingContextSettings = new RenderingContextSettings(true);

CanvasRenderingContext2D:用于创建绘图上下文,通过它我们可以在Canvas中绘制图形。

private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings);

OffscreenCanvas:一个离屏画布,允许我们在不影响主线程的情况下进行绘制操作。

private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600);

三、制定话筒显示效果规则

话筒的动态效果将根据声音的强度变化。我们定义了五个级别,从0到5,分别代表声音的不同强度。为了模拟这一效果,我们编写了一个函数来随机生成声音等级。

模拟声音等级函数:

generateRandomNumberUpToFive(): number {const randomInt = Math.floor(Math.random() * 5); // 0, 1, 2, 3, 4// 有1/5的概率返回5if (Math.random() < 0.2) {return 5;}return randomInt;
}

为了实现动态效果,我们使用一个定时器每隔一段时间更新声音等级,并在组件初始化时开始这一过程。

组件初始化:

@State @Watch('draw') level: number = 3;aboutToAppear(): void {setInterval(() => {this.level = this.generateRandomNumberUpToFive();}, 300);
}

四、关键代码

在实现动态效果时,我们需要先清除之前的绘制效果,然后根据声音等级绘制话筒的动态层效果。最终,将这些效果叠加在一起,展示出最终的动态效果。

绘制逻辑:

draw() {this.context.clearRect(0, 0, 192, 192);let offContext = this.offCanvas.getContext("2d", this.settings);offContext.drawImage(this.img2, 0, 0, 192, 192);let h = this.level * 192 / 5;let imagedata = offContext.getImageData(0, h, 192, 192);offContext.drawImage(this.img, 0, 0, 192, 192);offContext.putImageData(imagedata, 0, h);let image = this.offCanvas.transferToImageBitmap();this.context.transferFromImageBitmap(image);
}

五、整体代码效果

将上述代码整合到一个组件中,确保在组件初始化时绘制背景,并在需要时更新动态效果。

完整组件代码:

@Component
struct CanvasExample1 {private settings: RenderingContextSettings = new RenderingContextSettings(true);private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings);private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600);private img: ImageBitmap = new ImageBitmap("image/img.png");private img2: ImageBitmap = new ImageBitmap("image/img_1.png");@State @Watch('draw') level: number = 3;draw() {this.context.clearRect(0, 0, 192, 192);let offContext = this.offCanvas.getContext("2d", this.settings);offContext.drawImage(this.img2, 0, 0, 192, 192);let h = this.level * 192 / 5;let imagedata = offContext.getImageData(0, h, 192, 192);offContext.drawImage(this.img, 0, 0, 192, 192);offContext.putImageData(imagedata, 0, h);let image = this.offCanvas.transferToImageBitmap();this.context.transferFromImageBitmap(image);}generateRandomNumberUpToFive(): number {const randomInt = Math.floor(Math.random() * 5); // 0, 1, 2, 3, 4if (Math.random() < 0.2) {return 5;}return randomInt;}aboutToAppear(): void {setInterval(() => {this.level = this.generateRandomNumberUpToFive();}, 300);}build() {Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {Canvas(this.context).width('100%').height('100%').onReady(() => {let offContext = this.offCanvas.getContext("2d", this.settings);offContext.drawImage(this.img, 0, 0, 192, 192);});}.width('100%').height('100%');}
}

总结

通过本文的详细解析,我们不仅实现了一个动态声控话筒组件,还深入了解了鸿蒙OS中的绘图API和动态效果实现方法。希望这篇文章能够为其他开发者提供灵感和指导,共同推动鸿蒙生态的创新与发展。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为云电脑怎么搭建平台,云电脑搭建的设置方法

在全球化的今天,远程连接已经成为了企业和个人不可或缺的一部分。它不仅能够帮助企业实现全球化的业务布局,拓展市场空间,还能够为个人提供更多的发展机会和自由,让我们能够更好地适应快速变化的社会环境。这次给大家介绍云电脑搭建的设置方法?云电脑搭建的设置方法? 设置…

如何解决WDCP控制面板无法登录的问题?

您好,关于您提到的WDCP控制面板无法登录的问题,以下是详细的排查和解决方案:检查服务器状态:首先,确认服务器是否处于正常运行状态。使用SSH或远程桌面工具登录到服务器,查看服务器的启动日志和系统状态。 如果服务器处于只读模式,可能是由于磁盘故障或其他系统问题导致…

《DNK210使用指南 -CanMV版 V1.0》第四十七章 MNIST实验

第四十七章 MNIST实验 1)实验平台:正点原子DNK210开发板 2)章节摘自【正点原子】DNK210使用指南 - CanMV版 V1.0 3)购买链接:https://detail.tmall.com/item.htm?&id=782801398750 4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/k210/ATK-…

如何高效地创建和管理CMS中的模块与栏目?

在CMS中创建和管理模块及栏目是网站结构规划的重要组成部分,直接影响到用户体验和SEO表现。为了实现高效的管理和组织,以下是几个实用的建议: 一、清晰定义网站架构 在开始创建模块和栏目之前,首先要对网站的整体架构有一个清晰的认识。确定好每个页面的功能定位,比如首页…

安装CMS程序需要注意哪些事项?

安装CMS程序是将下载好的内容管理系统部署到服务器上的关键步骤。为了确保安装过程顺利无误,以下几点是你应该特别注意的: 首先,确保服务器环境符合CMS的要求。不同的CMS对服务器有不同的要求,比如PHP版本、MySQL数据库版本等。通常这些信息可以在CMS的官方文档中找到。如果…

如何处理云服务器IP变更及后续调整?

您好,关于您提到的云服务器IP变更问题,以下是详细的处理步骤和注意事项:确认新IP地址:首先,我们需要确认新的IP地址。根据您的描述,新IP为127.0.0.1(实际情况下,这通常是一个本地回环地址,用于测试或内部通信,而非公网IP)。请确保您收到的是正确的公网IP地址,并在需…

如何在Windows上正确启用PHP的mbstring扩展?

1. 确保 php_mbstring.dll 文件存在 首先,你需要确认你的PHP安装目录中确实包含了php_mbstring.dll文件。通常情况下,这个文件位于PHP安装目录下的ext文件夹中。如果你没有找到这个文件,可能是因为你下载的PHP版本默认没有包含这个扩展。此时,你可以考虑重新下载一个完整的…

六边形图片展示

六边形图片展示 html代码展示<div class="boxF"><div class="boxS"><div class="boxT" :style="{background:url(+ $global.picCodePolice(item.faceImg) +)}"></div></div> </div>相关的css展示…

网站被挂木马,如何紧急处理并加强防护?

您好!当您的网站被挂木马时,需要立即采取一系列措施来清理木马文件,并防止未来的攻击。以下是详细的处理步骤和建议:立即停止传播有害信息:根据国家相关法律规定,网站主办者有责任确保网站不传播有害信息。一旦发现有害信息,必须在24小时内清除所有有害内容,并采取必要…

【GreatSQL优化器-08】statistics和index dives

【GreatSQL优化器-08】statistics和index dives 一、statistics和index_dives介绍 GreatSQL的优化器对于查询条件带有范围的情况,需要根据 mm tree 来估计该范围内大概有多少行,然后以此来计算cost。对于等号条件,给出了两种方法来估计对应行数--Statistics和index dives,前…

AS计划与AP排程如何革新供应链决策

过去大批量生产模式对计划排产、齐套配送、成本核算要求不高,人工计算和简单的MRP运算就已经满足生产计划需要。然而随着市场个性化需求的递增,市场的生产模式已经变为多品种、小批量、非标订单模式,这对企业的快速交付能力发起了挑战。maiAPS高级计划排程能解决企业哪些痛点…