前言
想象一下,当你身心疲惫的时候,拿出随身电子木鱼,轻轻一敲,那清脆的木鱼声立刻会穿透你的心灵,让你瞬间感到轻松愉快。
而自动挡的开启,更是让你的双手得到解放,你可以在敲打木鱼的同时做其他事情,比如刷刷抖音、看看微博,让你的生活更加丰富多彩。
随身电子木鱼不仅是你解压的好帮手,还是你积累功德的得力助手。
每一次敲击木鱼,都是在积累功德。而在这个过程中,你可以感受到来自木鱼的声音和动画特效的双重愉悦。
总之,随身电子木鱼是一款集解压、积攒功德、娱乐于一体的神器。它轻便小巧,方便携带,是你日常生活中的最佳伴侣!
本篇的大致内容如下:
- 效果展示
- 知识点分解
- 具体实现
- 最后总结
本例使用开发环境
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;
}
四. 最后总结
大家可以下载代码尝试增加一些新功能,比如敲击速度设置,木鱼样式替换,音效选择等。来丰富用户的体验。
通过本例可以熟悉这些知识:显示动画 ,音乐播放 ,定时器等常用开发知识。
祝大家在增加功德的同时快速掌握鸿蒙开发技巧!