动动小手学鸿蒙 HarmonyOS APP(03)电子木鱼

前言


想象一下,当你身心疲惫的时候,拿出随身电子木鱼,轻轻一敲,那清脆的木鱼声立刻会穿透你的心灵,让你瞬间感到轻松愉快。

自动挡的开启,更是让你的双手得到解放,你可以在敲打木鱼的同时做其他事情,比如刷刷抖音、看看微博,让你的生活更加丰富多彩。

随身电子木鱼不仅是你解压的好帮手,还是你积累功德的得力助手。

每一次敲击木鱼,都是在积累功德。而在这个过程中,你可以感受到来自木鱼的声音和动画特效的双重愉悦。

总之,随身电子木鱼是一款集解压、积攒功德、娱乐于一体的神器。它轻便小巧,方便携带,是你日常生活中的最佳伴侣!

本篇的大致内容如下

  1. 效果展示
  2. 知识点分解
  3. 具体实现
  4. 最后总结

本例使用开发环境

Hamony OS 3.1.0(API 9)

IDE: DevEco Studio 4.0 Release

一. 效果展示

二. 知识点分解

1. 定时器使用

使用定时器的serInterval实现开启自动挡。

开启自动挡后,通过启动一个定时器来自动定时执行一次敲击。

将敲击抽成一个方法,供手动点击木鱼和自动挡执行敲击使用。

2. 动画效果

敲击方法中,将在木鱼上方的'功德+1'文本进行一个向上移动叠加变大的动画

这里用到的是显示动画

animateTo(value: AnimateParam, event: () => void): void

提供全局animateTo显式动画接口来指定由于闭包代码导致的状态变化插入过渡动效。

3. 声音播放

通过系统提供的声音播放方法来播放木鱼敲击声。

这里使用的是AVPlayer方法,根据官方文档,AVPlayer比较适合用于播放完整的音乐。

但是更适合播放短音频的SoundPool目前在API 9中并没有支持。

SoundPool模块首批接口从API version 10开始支持。

这里我们就凑合一下,简单了解下AVPlayer:

使用AVPlayer可以实现端到端播放原始媒体资源。 播放的全流程包含:创建AVPlayer,设置播放资源,设置播放参数(音量/倍速/焦点模式),播放控制(播放/暂停/跳转/停止),重置,销毁资源。

在进行应用开发的过程中,开发者可以通过AVPlayer的state属性主动获取当前状态或使用on('stateChange')方法监听状态变化。如果应用在音频播放器处于错误状态时执行操作,系统可能会抛出异常或生成其他未定义的行为。

状态的详细说明请参考AVPlayerState。当播放处于prepared / playing / paused / completed状态时,播放引擎处于工作状态,这需要占用系统较多的运行内存。当客户端暂时不使用播放器时,调用reset()或release()回收内存资源,做好资源利用。

简单讲,本例中使用AVPlayer播放木鱼敲击声分如下几步:

创建实例createAVPlayer() => 设置业务需要的监听事件 => 设置资源 => 准备播放 => 音频播控 => 退出播放

三. 具体实现

定时器

ts 复制代码
this.intervalID = setInterval(() => {
  this.knock();
}, this.speed);

单次敲木鱼方法

ts 复制代码
private knock() {
  this.totalGongDe++;
  // 点击后先中断上次播放,再重新放
  this.avPlayer.stop(() => {
    this.avPlayer.prepare(() => {
      this.avPlayer.play();
    });
  });

  this.showGongDe = false;
  animateTo({ duration: this.speed }, () => {
    this.showGongDe = true;
  })
}

功德+1 文字动效

ts 复制代码
if (this.showGongDe) {
  Text('功德+1')
    .fontSize(28)
    .fontWeight(FontWeight.Bold)
    .fontColor(Color.White)
    .margin({ top: 150 })
    .textAlign(TextAlign.Center)
    .width('100%')
    .transition({ type: TransitionType.All, translate: { y: 100 } , scale: { x: 0, y: 0 }})
}

播放音乐AVPlayer初始化以及释放

ts 复制代码
aboutToAppear() {
  // 初始化音乐播放用动avPlayer
  this.avPlayerFdSrcInit();
}

aboutToDisappear() {
  this.avPlayer.release();
  clearInterval(this.intervalID);
}

async avPlayerFdSrcInit() {
  // 创建avPlayer实例对象
  this.avPlayer = await media.createAVPlayer();
  // 通过UIAbilityContext的resourceManager成员的getRawFd接口获取媒体资源播放地址
  // 返回类型为{fd,offset,length},fd为HAP包fd地址,offset为媒体资源偏移量,length为播放长度
  let context = getContext(this) as common.UIAbilityContext;
  let fileDescriptor = await context.resourceManager.getRawFd('dong.mp3');
  // 为fdSrc赋值触发initialized状态机上报
  this.avPlayer.fdSrc = fileDescriptor;
}

四. 最后总结

大家可以下载代码尝试增加一些新功能,比如敲击速度设置,木鱼样式替换,音效选择等。来丰富用户的体验。

github.com/kainbro/MuY...

通过本例可以熟悉这些知识:显示动画音乐播放定时器等常用开发知识。

祝大家在增加功德的同时快速掌握鸿蒙开发技巧!

相关推荐
一笑的小酒馆4 小时前
Android CameraX适配Android15
android
hnlgzb4 小时前
安卓app开发,如何快速上手kotlin和compose的开发?
android·开发语言·kotlin
alexhilton4 小时前
Jetpack Compose 2025年12月版本新增功能
android·kotlin·android jetpack
思成不止于此4 小时前
【MySQL 零基础入门】DQL 核心语法(二):表条件查询与分组查询篇
android·数据库·笔记·学习·mysql
遇到困难睡大觉哈哈9 小时前
HarmonyOS —— Remote Communication Kit 拦截器(Interceptor)高阶定制能力笔记
笔记·华为·harmonyos
安卓理事人9 小时前
安卓图表MpAndroidChart使用
android
遇到困难睡大觉哈哈10 小时前
HarmonyOS —— Remote Communication Kit 定制处理行为(ProcessingConfiguration)速记笔记
笔记·华为·harmonyos
氤氲息10 小时前
鸿蒙 ArkTs 的WebView如何与JS交互
javascript·交互·harmonyos
遇到困难睡大觉哈哈10 小时前
HarmonyOS支付接入证书准备与生成指南
华为·harmonyos