动动小手学鸿蒙 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...

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

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

相关推荐
别说我什么都不会6 分钟前
【仓颉三方库】工具类——zip4cj & zlib4cj
harmonyos
东风西巷30 分钟前
Control Center安卓版:自定义控制中心,提升手机操作体验
android·智能手机·性能优化·软件需求
布拉德很帅34 分钟前
Android如何通过aspectj打造一个无侵入式动态权限申请框架
android
CYRUS_STUDIO1 小时前
Android 加壳应用运行流程 与 生命周期类处理方案
android·安全·逆向
隐-梵1 小时前
Android studio进阶开发(四)--okhttp的网络通信的使用
android·ide·okhttp·android studio
_一条咸鱼_1 小时前
Android大厂面试通关秘籍
android·面试·android jetpack
zhishishe4 小时前
2025 年免费 Word 转 PDF 转换器有哪些?
android·windows·pdf·电脑·word
Ya-Jun9 小时前
常用第三方库精讲:cached_network_image图片加载优化
android·flutter
_一条咸鱼_9 小时前
Android嵌套滑动详解
android·面试·android jetpack
高木的小天才12 小时前
鸿蒙中的并发线程间通信、线程间通信对象
前端·华为·typescript·harmonyos